From 2af2a280c668d3599959f1489fe1cb74a568a30c Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Sat, 28 Feb 2026 09:20:31 +0300 Subject: [PATCH] Appearance section: opacity + corner radius + visibility toggle - Opacity with blend icon, corner radius with radius icon - Eye/eye-off toggle in section header - Layers panel: hidden layers dimmed (opacity-50) with permanent eye-off indicator - Removed duplicate corner radius from LayoutSection --- components.d.ts | 2 + src/components/LayersPanel.vue | 11 +++-- src/components/PropertiesPanel.vue | 4 +- .../properties/AppearanceSection.vue | 42 ++++++++++++++++--- src/components/properties/LayoutSection.vue | 4 -- 5 files changed, 48 insertions(+), 15 deletions(-) diff --git a/components.d.ts b/components.d.ts index dde5a2604..9600ef3eb 100644 --- a/components.d.ts +++ b/components.d.ts @@ -20,11 +20,13 @@ declare module 'vue' { IconLucideAlignLeft: typeof import('~icons/lucide/align-left')['default'] IconLucideAlignRight: typeof import('~icons/lucide/align-right')['default'] IconLucideBaseline: typeof import('~icons/lucide/baseline')['default'] + IconLucideBlend: typeof import('~icons/lucide/blend')['default'] IconLucideCheck: typeof import('~icons/lucide/check')['default'] IconLucideChevronDown: typeof import('~icons/lucide/chevron-down')['default'] IconLucideChevronRight: typeof import('~icons/lucide/chevron-right')['default'] IconLucideEye: typeof import('~icons/lucide/eye')['default'] IconLucideEyeOff: typeof import('~icons/lucide/eye-off')['default'] + IconLucideRadius: typeof import('~icons/lucide/radius')['default'] IconLucideSearch: typeof import('~icons/lucide/search')['default'] LayersPanel: typeof import('./src/components/LayersPanel.vue')['default'] LayoutSection: typeof import('./src/components/properties/LayoutSection.vue')['default'] diff --git a/src/components/LayersPanel.vue b/src/components/LayersPanel.vue index bef7aee39..cf28a136c 100644 --- a/src/components/LayersPanel.vue +++ b/src/components/LayersPanel.vue @@ -218,13 +218,14 @@ function updateDropTarget(ev: PointerEvent) { @select="onSelect" > diff --git a/src/components/PropertiesPanel.vue b/src/components/PropertiesPanel.vue index 0da1b9ab9..c1526e556 100644 --- a/src/components/PropertiesPanel.vue +++ b/src/components/PropertiesPanel.vue @@ -33,7 +33,7 @@ const multiCount = computed(() => store.selectedNodes.value.length) Mixed {{ multiCount }} layers - + @@ -46,7 +46,7 @@ const multiCount = computed(() => store.selectedNodes.value.length) - + diff --git a/src/components/properties/AppearanceSection.vue b/src/components/properties/AppearanceSection.vue index 91b34d680..d965eb96a 100644 --- a/src/components/properties/AppearanceSection.vue +++ b/src/components/properties/AppearanceSection.vue @@ -2,24 +2,54 @@ import ScrubInput from '../ScrubInput.vue' import { useNodeProps } from '../../composables/use-node-props' -const { updateProp, commitProp } = useNodeProps() +import type { SceneNode } from '../../engine/scene-graph' -defineProps<{ opacity: number }>() +const { node } = defineProps<{ node: SceneNode }>() +const { store, updateProp, commitProp } = useNodeProps() + +function toggleVisibility() { + store.updateNodeWithUndo(node.id, { visible: !node.visible }, 'Toggle visibility') + store.requestRender() +} diff --git a/src/components/properties/LayoutSection.vue b/src/components/properties/LayoutSection.vue index 0b4c109ab..7756aea35 100644 --- a/src/components/properties/LayoutSection.vue +++ b/src/components/properties/LayoutSection.vue @@ -145,10 +145,6 @@ function setAlignment(primary: LayoutAlign, counter: LayoutCounterAlign) { - -
- -