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