Refactor: share nav drag and drop logic
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
@use "../shared/tree-nav" as treeNav;
|
||||
|
||||
.root {
|
||||
display: grid;
|
||||
--project-drawer-gap: var(--space-3);
|
||||
@@ -191,12 +193,9 @@
|
||||
}
|
||||
|
||||
.treeSectionLabel {
|
||||
@include text-caption;
|
||||
@include treeNav.section-label;
|
||||
margin: 0;
|
||||
padding: 0 var(--space-3);
|
||||
color: var(--color-text-subtle);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
|
||||
.treeSectionHeader {
|
||||
@@ -248,133 +247,72 @@
|
||||
}
|
||||
|
||||
.treeList {
|
||||
list-style: none;
|
||||
display: grid;
|
||||
gap: var(--space-1);
|
||||
padding: 0;
|
||||
@include treeNav.tree-list;
|
||||
}
|
||||
|
||||
.treeEmptySlot {
|
||||
min-height: calc(var(--control-size-lg) - var(--space-2));
|
||||
padding-left: calc(var(--space-3) + (var(--tree-depth, 0) * var(--space-4)));
|
||||
border-radius: var(--radius-lg);
|
||||
border: 1px dashed color-mix(in srgb, var(--color-border) 38%, transparent);
|
||||
opacity: 0.35;
|
||||
@include treeNav.empty-slot;
|
||||
}
|
||||
|
||||
.treeInputRow {
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
display: grid;
|
||||
grid-template-columns: auto minmax(0, 1fr);
|
||||
align-items: center;
|
||||
gap: var(--space-2);
|
||||
min-height: calc(var(--control-size-lg) - var(--space-2));
|
||||
padding: var(--space-2) var(--space-3);
|
||||
padding-left: calc(var(--space-3) + (var(--tree-depth, 0) * var(--space-4)));
|
||||
border: 1px solid color-mix(in srgb, var(--color-border) 42%, transparent);
|
||||
border-radius: var(--radius-lg);
|
||||
background: color-mix(in srgb, var(--color-surface) 94%, transparent);
|
||||
@include treeNav.input-row;
|
||||
}
|
||||
|
||||
.treeInput {
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
color: var(--color-text);
|
||||
font: inherit;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.treeInput::placeholder {
|
||||
color: var(--color-text-muted);
|
||||
@include treeNav.input;
|
||||
}
|
||||
|
||||
.treeItem {
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
display: grid;
|
||||
grid-template-columns: auto 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);
|
||||
padding-left: calc(var(--space-3) + (var(--tree-depth, 0) * var(--space-4)));
|
||||
border: 1px solid transparent;
|
||||
border-radius: var(--radius-lg);
|
||||
background: transparent;
|
||||
color: var(--color-text-muted);
|
||||
transition:
|
||||
background 160ms var(--easing-standard),
|
||||
color 160ms var(--easing-standard),
|
||||
border-color 160ms var(--easing-standard),
|
||||
box-shadow 160ms var(--easing-standard),
|
||||
transform 180ms var(--easing-standard);
|
||||
text-align: left;
|
||||
@include treeNav.item;
|
||||
}
|
||||
|
||||
.treeItem:hover,
|
||||
.treeItem:focus-visible {
|
||||
background: color-mix(in srgb, var(--color-surface-hover) 80%, var(--color-accent-soft) 20%);
|
||||
color: var(--color-text);
|
||||
box-shadow: inset 0 1px 0 color-mix(in srgb, white 4%, transparent);
|
||||
@include treeNav.item-hover;
|
||||
}
|
||||
|
||||
.treeItemFolder {
|
||||
color: var(--color-text);
|
||||
@include treeNav.item-folder;
|
||||
}
|
||||
|
||||
.treeItemDragging {
|
||||
opacity: 0.45;
|
||||
transform: scale(0.985);
|
||||
box-shadow: none;
|
||||
@include treeNav.item-dragging;
|
||||
}
|
||||
|
||||
.treeItemDropBefore {
|
||||
box-shadow: inset 0 2px 0 color-mix(in srgb, var(--color-accent-strong) 78%, transparent);
|
||||
@include treeNav.item-drop-before;
|
||||
}
|
||||
|
||||
.treeItemDropAfter {
|
||||
box-shadow: inset 0 -2px 0 color-mix(in srgb, var(--color-accent-strong) 78%, transparent);
|
||||
@include treeNav.item-drop-after;
|
||||
}
|
||||
|
||||
.treeItemDropInside {
|
||||
border-color: color-mix(in srgb, var(--color-accent-strong) 55%, transparent);
|
||||
background: color-mix(in srgb, var(--color-accent-soft) 36%, var(--color-surface));
|
||||
color: var(--color-text);
|
||||
box-shadow: inset 0 1px 0 color-mix(in srgb, white 4%, transparent);
|
||||
@include treeNav.item-drop-inside;
|
||||
}
|
||||
|
||||
.folderChevron {
|
||||
color: var(--color-text-muted);
|
||||
transition: transform 160ms var(--easing-standard);
|
||||
@include treeNav.folder-chevron;
|
||||
}
|
||||
|
||||
.folderChevronOpen {
|
||||
transform: rotate(90deg);
|
||||
@include treeNav.folder-chevron-open;
|
||||
}
|
||||
|
||||
.treeItemActive {
|
||||
border-color: var(--color-border);
|
||||
background: var(--color-surface);
|
||||
color: var(--color-text);
|
||||
box-shadow: inset 0 1px 0 color-mix(in srgb, white 4%, transparent);
|
||||
@include treeNav.item-active;
|
||||
}
|
||||
|
||||
.icon {
|
||||
color: inherit;
|
||||
opacity: 0.85;
|
||||
@include treeNav.icon;
|
||||
}
|
||||
|
||||
.label {
|
||||
@include text-label;
|
||||
min-width: 0;
|
||||
@include treeNav.label;
|
||||
}
|
||||
|
||||
.itemMeta {
|
||||
@include text-caption;
|
||||
color: var(--color-text-muted);
|
||||
@include treeNav.item-meta;
|
||||
}
|
||||
|
||||
@media (max-width: 720px) {
|
||||
|
||||
Reference in New Issue
Block a user