From 7bfebce0bf2350745a99628ff61de0970cfdbc39 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Fri, 17 Jul 2026 17:23:16 +0300 Subject: [PATCH] feat(editor): scale and theme Layers panel - Add indexed visible rows, virtual scroll-to-selection, and range selection - Move Layer Tree state styling into typed Tailwind Variants slots - Enforce parsed Vue state-class theming and cover 5,000-node documents --- CHANGELOG.md | 1 + packages/vue/src/index.ts | 20 +- .../primitives/LayerTree/LayerTreeItem.vue | 1 + .../primitives/LayerTree/LayerTreeRoot.vue | 219 ++++++++++-------- .../vue/src/primitives/LayerTree/context.ts | 21 +- .../vue/src/primitives/LayerTree/index.ts | 12 +- .../vue/src/primitives/LayerTree/model.ts | 112 +++++++++ src/components/LayerTree/LayerTree.stories.ts | 41 ++++ src/components/LayerTree/LayerTree.vue | 161 +++++++++---- src/components/LayerTree/LayerTreeActions.vue | 40 +++- .../LayerTree/LayerTreeDisclosure.vue | 22 +- .../LayerTree/LayerTreeDropIndicator.vue | 45 ++-- src/components/LayerTree/LayerTreeNodeRow.vue | 46 ++-- .../LayerTree/LayerTreeRenameRow.vue | 26 ++- .../LayerTree/demo/LayerTreeThemeDemo.vue | 141 +++++++++++ src/components/LayerTree/types.ts | 1 + src/components/LayerTree/ui.ts | 20 ++ src/theme/layer-tree.ts | 92 ++++++++ tests/e2e/layers/large-tree.spec.ts | 83 ++++++- tests/engine/vue/layer-tree/model.test.ts | 101 ++++++++ tools/architecture/package.json | 5 +- .../steiger-rules/dynamic-tailwind-classes.ts | 140 +++++++++++ tools/architecture/src/steiger-rules/index.ts | 2 + .../tests/dynamic-classes.test.ts | 50 ++++ 24 files changed, 1185 insertions(+), 217 deletions(-) create mode 100644 packages/vue/src/primitives/LayerTree/model.ts create mode 100644 src/components/LayerTree/LayerTree.stories.ts create mode 100644 src/components/LayerTree/demo/LayerTreeThemeDemo.vue create mode 100644 src/components/LayerTree/ui.ts create mode 100644 src/theme/layer-tree.ts create mode 100644 tests/engine/vue/layer-tree/model.test.ts create mode 100644 tools/architecture/src/steiger-rules/dynamic-tailwind-classes.ts create mode 100644 tools/architecture/tests/dynamic-classes.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 77440eb56..1e4974f91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - Add saved per-node export settings for repeat exports. - Add Design panel controls for layer blend modes and alpha, vector, and luminance masks. - Refine Design panel foundations with 26px controls, consistently aligned action rails, shared Tailwind themes, and Storybook component states. +- Scale the Layers panel to 5,000-node documents with virtualized rows, indexed updates, scroll-to-selection, range selection, and focus-aware themed states. - Standardize Vue SDK and app override type names on the `UI` acronym, including `FontPickerUI`. - Add a headless Vue SDK NumberField with pointer scrubbing, keyboard stepping, safe arithmetic expressions, and mixed/bound states; remove the superseded ScrubInput API. - Add provider-driven BindableValue primitives for variable and token binding, including detach-on-edit, read-only, edit-variable, mixed-value, and undo-batched interactions. diff --git a/packages/vue/src/index.ts b/packages/vue/src/index.ts index 06d4a2783..68a9a1a9a 100644 --- a/packages/vue/src/index.ts +++ b/packages/vue/src/index.ts @@ -161,8 +161,24 @@ export type { GradientEditorStopSlotProps, GradientEditorStopSlots } from '#vue/primitives/GradientEditor' -export { LayerTreeRoot, LayerTreeItem, useLayerTree } from '#vue/primitives/LayerTree' -export type { LayerDragInstruction, LayerTreeContext, LayerNode } from '#vue/primitives/LayerTree' +export { + buildLayerTreeModel, + indexLayerNodes, + layerSelectionForTarget, + LayerTreeItem, + LayerTreeRoot, + patchLayerNode, + useLayerTree, + visibleLayerRows +} from '#vue/primitives/LayerTree' +export type { + LayerDragInstruction, + LayerNode, + LayerRow, + LayerSelectionMode, + LayerTreeContext, + LayerTreeVirtualizer +} from '#vue/primitives/LayerTree' export { LayoutControlsRoot, useLayoutControlsContext } from '#vue/primitives/LayoutControls' export type { LayoutControlsContext, diff --git a/packages/vue/src/primitives/LayerTree/LayerTreeItem.vue b/packages/vue/src/primitives/LayerTree/LayerTreeItem.vue index 58af65a29..13ee4a11a 100644 --- a/packages/vue/src/primitives/LayerTree/LayerTreeItem.vue +++ b/packages/vue/src/primitives/LayerTree/LayerTreeItem.vue @@ -74,6 +74,7 @@ defineExpose({ rowEl }) :has-children="hasChildren" :is-selected="isSelected" :is-dragging="isDragging" + :focused="ctx.focused.value" :pad-left="padLeft" :actions="actions" /> diff --git a/packages/vue/src/primitives/LayerTree/LayerTreeRoot.vue b/packages/vue/src/primitives/LayerTree/LayerTreeRoot.vue index 2ba21d2e5..42bc596f8 100644 --- a/packages/vue/src/primitives/LayerTree/LayerTreeRoot.vue +++ b/packages/vue/src/primitives/LayerTree/LayerTreeRoot.vue @@ -1,13 +1,25 @@