@use "../shared/tree-nav" as treeNav; .root { display: grid; --project-drawer-gap: var(--space-3); --project-drawer-top: calc(var(--space-4) + var(--control-size-lg)); --project-drawer-bottom: calc(var(--sidebar-dock-clearance, var(--shell-dock-clearance)) + var(--project-drawer-gap)); } .rootCompact { justify-items: center; } .rootDragMode { user-select: none; cursor: grabbing; } .rootDragMode .treeItem { cursor: grabbing; } .trigger { width: 100%; min-width: 0; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--space-2); min-height: calc(var(--control-size-lg) + var(--space-2)); padding: var(--space-2) var(--space-3) calc(var(--space-2) + 0.2rem); border: 1px solid color-mix(in srgb, var(--color-border-strong) 44%, transparent); border-radius: calc(var(--radius-lg) + var(--space-1)); background: color-mix(in srgb, var(--color-surface) 96%, transparent); box-shadow: var(--shadow-soft); text-align: left; position: relative; z-index: 5; transition: border-color var(--duration-fast) var(--easing-standard), background var(--duration-fast) var(--easing-standard), box-shadow var(--duration-fast) var(--easing-standard), transform 180ms var(--easing-standard); } .trigger:hover { background: var(--color-surface-hover); border-color: var(--color-border); } .triggerOpen { border-color: color-mix(in srgb, var(--color-accent-strong) 22%, var(--color-border-strong)); background: color-mix(in srgb, var(--color-accent-soft) 26%, var(--color-surface)); box-shadow: 0 10px 28px color-mix(in srgb, black 8%, transparent); } .triggerCompact { width: var(--control-size-xl); min-height: var(--control-size-xl); grid-template-columns: auto; justify-items: center; gap: 0.15rem; padding: var(--space-2) 0; border-radius: var(--radius-xl); } .triggerCompact .triggerLead { width: var(--control-size-md); height: var(--control-size-md); } .triggerCompact .triggerIcon { transform: rotate(0deg); } .triggerCompact .triggerIconOpen { transform: rotate(180deg); } .triggerLead { width: var(--control-size-md); height: var(--control-size-md); display: inline-flex; align-items: center; justify-content: center; border-radius: var(--radius-md); background: color-mix(in srgb, var(--color-accent-soft) 82%, transparent); color: var(--color-accent-strong); } .triggerCopy { min-width: 0; display: grid; gap: 0.12rem; } .eyebrow { @include text-caption; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.08em; } .value { @include text-label; } .triggerIcon { color: var(--color-text-muted); transform: rotate(-90deg); transition: transform var(--duration-fast) var(--easing-standard); } .triggerIconOpen { transform: rotate(0deg); } .scrim { position: absolute; inset: calc(var(--project-drawer-top) + var(--project-drawer-gap)) var(--space-4) var(--project-drawer-bottom) var(--space-4); z-index: 2; opacity: 0; pointer-events: none; background: color-mix(in srgb, black 8%, transparent); border-radius: var(--radius-lg); transition: opacity 260ms var(--easing-standard); } .scrimOpen { opacity: 1; pointer-events: auto; } .rootCompact .scrim, .rootCompact .drawer { left: 0; right: auto; width: min(18rem, calc(100vw - 6rem)); } .drawer { position: absolute; inset: calc(var(--project-drawer-top) + var(--project-drawer-gap)) var(--space-4) var(--project-drawer-bottom) var(--space-4); z-index: 3; display: grid; overflow: hidden; border-radius: var(--radius-lg); opacity: 0; pointer-events: none; transform: translateX(calc(-1 * (var(--space-5) + 12%))); will-change: transform, opacity; transition: opacity 240ms var(--easing-standard), transform 360ms cubic-bezier(0.16, 1, 0.3, 1); } .drawerOpen { opacity: 1; pointer-events: auto; transform: translateX(0); } .drawer::before { content: ""; position: absolute; inset: 0; border-radius: inherit; border: 1px solid color-mix(in srgb, var(--color-border-strong) 52%, transparent); background: var(--color-surface-muted); box-shadow: 14px 0 30px color-mix(in srgb, black 7%, transparent), inset -1px 0 0 color-mix(in srgb, white 4%, transparent); pointer-events: none; } .drawerBody { position: relative; z-index: 1; min-height: 0; display: grid; align-content: start; gap: var(--space-2); padding: var(--space-4); overflow-y: auto; overscroll-behavior: contain; scrollbar-width: none; } .drawerBody::-webkit-scrollbar { width: 0; } .treeSectionLabel { @include treeNav.section-label; margin: 0; padding: 0 var(--space-3); } .treeSectionHeader { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); margin-bottom: var(--space-2); padding-right: var(--space-1); } .treeControls { display: inline-flex; align-items: center; gap: var(--space-1); flex-wrap: wrap; justify-content: flex-end; } .treeControlButton { display: inline-flex; align-items: center; justify-content: center; width: calc(var(--control-size-md) - var(--space-1)); height: calc(var(--control-size-md) - var(--space-1)); @include text-caption; padding: 0; border: 1px solid color-mix(in srgb, var(--color-border) 46%, transparent); border-radius: var(--radius-pill); background: color-mix(in srgb, var(--color-surface) 95%, transparent); color: var(--color-text-muted); transition: border-color 160ms var(--easing-standard), background 160ms var(--easing-standard), color 160ms var(--easing-standard); } .treeControlButton:hover, .treeControlButton:focus-visible { border-color: color-mix(in srgb, var(--color-border-strong) 56%, transparent); background: var(--color-surface-hover); color: var(--color-text); outline: none; } .treeControlButton:disabled { opacity: 0.45; cursor: default; } .treeList { @include treeNav.tree-list; } .treeEmptySlot { @include treeNav.empty-slot; } .treeInputRow { @include treeNav.input-row; } .treeInput { @include treeNav.input; } .treeItem { @include treeNav.item; } .treeItem:hover, .treeItem:focus-visible { @include treeNav.item-hover; } .treeItemFolder { @include treeNav.item-folder; } .treeItemDragging { @include treeNav.item-dragging; } .treeItemDropBefore { @include treeNav.item-drop-before; } .treeItemDropAfter { @include treeNav.item-drop-after; } .treeItemDropInside { @include treeNav.item-drop-inside; } .folderChevron { @include treeNav.folder-chevron; } .folderChevronOpen { @include treeNav.folder-chevron-open; } .treeItemActive { @include treeNav.item-active; } .icon { @include treeNav.icon; } .label { @include treeNav.label; } .itemMeta { @include treeNav.item-meta; } @media (max-width: 720px) { .rootCompact .scrim, .rootCompact .drawer { width: min(18rem, calc(100vw - 5rem)); } }