From 64d75b9686c494075223a0a318297fe59ec99e81 Mon Sep 17 00:00:00 2001 From: Max Richter Date: Mon, 9 Feb 2026 15:26:18 +0100 Subject: [PATCH] feat(ui): add InputColor and custom theme --- app/src/lib/graph-interface/edges/Edge.svelte | 8 +- app/src/lib/graph-interface/node/Node.svelte | 2 +- .../graph-interface/node/NodeHeader.svelte | 8 +- packages/ui/src/lib/Input.svelte | 18 +++- packages/ui/src/lib/app.css | 8 +- packages/ui/src/lib/index.ts | 1 + packages/ui/src/lib/inputs/InputColor.svelte | 85 +++++++++++++++++++ packages/ui/src/routes/+page.svelte | 56 +++--------- packages/ui/src/routes/Theme.svelte | 80 +++++++++++++++++ packages/ui/src/routes/ThemeSelector.svelte | 27 ++++++ 10 files changed, 234 insertions(+), 59 deletions(-) create mode 100644 packages/ui/src/lib/inputs/InputColor.svelte create mode 100644 packages/ui/src/routes/Theme.svelte create mode 100644 packages/ui/src/routes/ThemeSelector.svelte diff --git a/app/src/lib/graph-interface/edges/Edge.svelte b/app/src/lib/graph-interface/edges/Edge.svelte index db7a1f9..fe58df3 100644 --- a/app/src/lib/graph-interface/edges/Edge.svelte +++ b/app/src/lib/graph-interface/edges/Edge.svelte @@ -2,19 +2,19 @@ import { colors } from '../graph/colors.svelte'; const circleMaterial = new MeshBasicMaterial({ - color: colors.connection.clone(), + color: colors.outline.clone(), toneMapped: false }); - let lineColor = $state(colors.connection.clone().convertSRGBToLinear()); + let lineColor = $state(colors.outline.clone().convertSRGBToLinear()); $effect.root(() => { $effect(() => { if (appSettings.value.theme === undefined) { return; } - circleMaterial.color = colors.connection.clone().convertSRGBToLinear(); - lineColor = colors.connection.clone().convertSRGBToLinear(); + circleMaterial.color = colors.outline.clone().convertSRGBToLinear(); + lineColor = colors.outline.clone().convertSRGBToLinear(); }); }); diff --git a/app/src/lib/graph-interface/node/Node.svelte b/app/src/lib/graph-interface/node/Node.svelte index 5fdf383..8aa2fd3 100644 --- a/app/src/lib/graph-interface/node/Node.svelte +++ b/app/src/lib/graph-interface/node/Node.svelte @@ -57,7 +57,7 @@ uniforms={{ uColorBright: { value: colors['layer-2'] }, uColorDark: { value: colors['layer-1'] }, - uStrokeColor: { value: colors.outline.clone() }, + uStrokeColor: { value: colors['layer-2'] }, uStrokeWidth: { value: 1.0 }, uWidth: { value: 20 }, uHeight: { value: height } diff --git a/app/src/lib/graph-interface/node/NodeHeader.svelte b/app/src/lib/graph-interface/node/NodeHeader.svelte index a773ba0..af24f2f 100644 --- a/app/src/lib/graph-interface/node/NodeHeader.svelte +++ b/app/src/lib/graph-interface/node/NodeHeader.svelte @@ -87,8 +87,6 @@ width: 30px; z-index: 100; border-radius: 50%; - /* background: red; */ - /* opacity: 0.2; */ } .click-target:hover + svg path { @@ -108,8 +106,10 @@ svg path { stroke-width: 0.2px; - transition: d 0.3s ease, fill 0.3s ease; - fill: var(--color-layer-2); + transition: + d 0.3s ease, + fill 0.3s ease; + fill: var(--color-outline); stroke: var(--stroke); stroke-width: var(--stroke-width); d: var(--path); diff --git a/packages/ui/src/lib/Input.svelte b/packages/ui/src/lib/Input.svelte index b16490f..804eb3a 100644 --- a/packages/ui/src/lib/Input.svelte +++ b/packages/ui/src/lib/Input.svelte @@ -1,7 +1,14 @@ + +
+ +
+ # + +
+
+ + diff --git a/packages/ui/src/routes/+page.svelte b/packages/ui/src/routes/+page.svelte index 3ed1faf..8d32719 100644 --- a/packages/ui/src/routes/+page.svelte +++ b/packages/ui/src/routes/+page.svelte @@ -3,6 +3,7 @@ import { Details, InputCheckbox, + InputColor, InputNumber, InputSelect, InputShape, @@ -10,6 +11,8 @@ ShortCut } from '$lib'; import Section from './Section.svelte'; + import Theme from './Theme.svelte'; + import ThemeSelector from './ThemeSelector.svelte'; let intValue = $state(0); let floatValue = $state(0.2); @@ -19,61 +22,22 @@ let selectValue = $state(0); const d = $derived(options[selectValue]); let checked = $state(false); + let colorValue = $state<[number, number, number]>([59, 130, 246]); let mirrorShape = $state(true); let detailsOpen = $state(false); let points = $state([]); - - const themes = [ - 'dark', - 'light', - 'solarized', - 'catppuccin', - 'high-contrast', - 'nord', - 'dracula' - ]; - let themeIndex = $state(0); - $effect(() => { - const classList = document.documentElement.classList; - for (const c of classList) { - if (c.startsWith('theme-')) document.documentElement.classList.remove(c); - } - document.documentElement.classList.add(`theme-${themes[themeIndex]}`); - }); - - const colors = [ - 'layer-0', - 'layer-1', - 'layer-2', - 'layer-3', - 'active', - 'selected', - 'outline', - 'connection', - 'text' - ]; + let theme = $state('dark');

@nodarium/ui

- +
-
- - - {#each colors as color (color)} - - - - - {/each} - -
-
-
{color}
+
+
@@ -99,6 +63,10 @@
+
+ +
+
{#snippet header()}