diff --git a/frontend/src/components/modals/NodeModal.tsx b/frontend/src/components/modals/NodeModal.tsx index 21d14a3..4d9b18a 100644 --- a/frontend/src/components/modals/NodeModal.tsx +++ b/frontend/src/components/modals/NodeModal.tsx @@ -62,6 +62,12 @@ export function NodeModal({ open, onClose, onSubmit, initial, title = 'Add Node' const [iconPickerOpen, setIconPickerOpen] = useState(false) const [labelError, setLabelError] = useState(false) const resolvedNodeColors = resolveNodeColors({ type: form.type ?? 'generic', custom_colors: form.custom_colors }) + const showServicesEnabled = form.custom_colors?.show_services === true + const hasAppearanceOverrides = Boolean( + form.custom_colors?.border + || form.custom_colors?.background + || form.custom_colors?.icon + ) const set = (key: keyof NodeData, value: unknown) => setForm((f) => ({ ...f, [key]: value })) @@ -299,8 +305,11 @@ export function NodeModal({ open, onClose, onSubmit, initial, title = 'Add Node'
- Allow other nodes to nest inside this node + + Allow other nodes to nest inside this node +
+
@@ -329,17 +340,17 @@ export function NodeModal({ open, onClose, onSubmit, initial, title = 'Add Node' type="button" role="switch" aria-label="Show Services" - aria-checked={form.custom_colors?.show_services === true} + aria-checked={showServicesEnabled} onClick={() => set('custom_colors', { ...form.custom_colors, - show_services: !(form.custom_colors?.show_services === true), + show_services: !showServicesEnabled, })} - className="relative inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus:outline-none" - style={{ background: form.custom_colors?.show_services === true ? resolvedNodeColors.icon : '#30363d' }} + className="relative inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full p-0.5 transition-colors focus:outline-none" + style={{ background: showServicesEnabled ? resolvedNodeColors.icon : '#30363d' }} > @@ -349,10 +360,20 @@ export function NodeModal({ open, onClose, onSubmit, initial, title = 'Add Node'
- {form.custom_colors && ( + {hasAppearanceOverrides && (
- {!form.custom_colors && ( -

Using default colors for {NODE_TYPE_LABELS[form.type ?? 'generic']}. Click a swatch to customize.

- )} +
+ {!hasAppearanceOverrides && ( +

Using default colors for {NODE_TYPE_LABELS[form.type ?? 'generic']}. Click a swatch to customize.

+ )} +
{/* Bottom connection points (not for group containers) */} diff --git a/frontend/src/components/modals/__tests__/NodeModal.test.tsx b/frontend/src/components/modals/__tests__/NodeModal.test.tsx index e2a3c20..ef32c0d 100644 --- a/frontend/src/components/modals/__tests__/NodeModal.test.tsx +++ b/frontend/src/components/modals/__tests__/NodeModal.test.tsx @@ -299,6 +299,18 @@ describe('NodeModal', () => { expect(data.custom_colors?.show_services).toBe(true) }) + it('keeps default colors hint visible when Show Services is toggled on', () => { + renderModal({ initial: BASE }) + fireEvent.click(screen.getByRole('switch', { name: 'Show Services' })) + expect(screen.getByText(/Using default colors for/)).toBeDefined() + }) + + it('does not show Appearance reset when only Show Services is set', () => { + renderModal({ initial: BASE }) + fireEvent.click(screen.getByRole('switch', { name: 'Show Services' })) + expect(screen.queryByText('Reset to defaults')).toBeNull() + }) + // ── Parent Proxmox (vm / lxc only) ─────────────────────────────────── const parentContainerVisibleTypes = ['proxmox', 'vm', 'lxc', 'docker_host', 'isp', 'router', 'switch', 'server', 'nas', 'ap', 'printer', 'iot', 'camera', 'cpl', 'computer', 'generic'] as const