@selvajs/ui 6.6.0-beta.15 → 6.6.0-beta.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +0 -3
  2. package/dist/components/compute/AppLayout.svelte +5 -3
  3. package/dist/components/compute/CollapsedPanelStrip.svelte +1 -1
  4. package/dist/components/compute/ParameterPresetManager.svelte +1 -1
  5. package/dist/components/compute/SolveMessages.svelte +2 -2
  6. package/dist/components/layout/FooterItemRenderer.svelte +1 -1
  7. package/dist/components/layout/PageFooter.svelte +2 -2
  8. package/dist/components/layout/PageHeader.svelte +1 -1
  9. package/dist/components/layout/SideNav.svelte +3 -3
  10. package/dist/components/layout/SubNav.svelte +2 -2
  11. package/dist/components/preview/ChartOutput.svelte +3 -3
  12. package/dist/components/preview/Group.svelte +7 -7
  13. package/dist/components/preview/ImageOutput.svelte +6 -6
  14. package/dist/components/preview/InputControl.svelte +1 -0
  15. package/dist/components/preview/OutputDisplay.svelte +8 -6
  16. package/dist/components/preview/TabBar.svelte +6 -4
  17. package/dist/components/preview/TabBar.svelte.d.ts +2 -0
  18. package/dist/components/preview/TabContent.svelte +1 -1
  19. package/dist/components/preview/TabLayout.svelte +3 -4
  20. package/dist/components/preview/inputs/ChecklistInput.svelte +3 -3
  21. package/dist/components/preview/inputs/ColorInput.svelte +356 -14
  22. package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
  23. package/dist/components/preview/inputs/FileInput.svelte +3 -3
  24. package/dist/components/preview/inputs/SegmentedInput.svelte +2 -1
  25. package/dist/components/preview/inputs/TileInput.svelte +1 -1
  26. package/dist/components/primitives/CalculateButton.svelte +2 -2
  27. package/dist/components/primitives/Callout.svelte +7 -5
  28. package/dist/components/primitives/Callout.svelte.d.ts +4 -4
  29. package/dist/components/primitives/DataTable.svelte +1 -1
  30. package/dist/components/primitives/ImageUploadField.svelte +1 -1
  31. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  32. package/dist/components/primitives/badge/badge.svelte +2 -2
  33. package/dist/components/primitives/badge/badge.svelte.d.ts +6 -6
  34. package/dist/components/primitives/button/button.svelte +6 -7
  35. package/dist/components/primitives/button/button.svelte.d.ts +18 -18
  36. package/dist/components/primitives/card/card.svelte +1 -1
  37. package/dist/components/primitives/card/card.svelte.d.ts +1 -1
  38. package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
  39. package/dist/components/primitives/command/command-input.svelte +1 -1
  40. package/dist/components/primitives/command/command-item.svelte +1 -1
  41. package/dist/components/primitives/command/command-link-item.svelte +1 -1
  42. package/dist/components/primitives/command/command.svelte +1 -1
  43. package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
  44. package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
  45. package/dist/components/primitives/context-menu/context-menu-item.svelte +1 -1
  46. package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
  47. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  48. package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
  49. package/dist/components/primitives/dialog/dialog-content.svelte +2 -2
  50. package/dist/components/primitives/drawer/Drawer.svelte +1 -1
  51. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
  52. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +2 -0
  53. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
  54. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +2 -0
  55. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
  56. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +2 -1
  57. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  58. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  59. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  60. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  61. package/dist/components/primitives/index.d.ts +1 -1
  62. package/dist/components/primitives/index.js +1 -1
  63. package/dist/components/primitives/input/input.svelte +2 -2
  64. package/dist/components/primitives/input-group/input-group.svelte +1 -1
  65. package/dist/components/primitives/popover/popover-content.svelte +1 -1
  66. package/dist/components/primitives/resizable/resizable-handle.svelte +2 -2
  67. package/dist/components/primitives/search/search.svelte +1 -1
  68. package/dist/components/primitives/select/select-content.svelte +1 -1
  69. package/dist/components/primitives/select/select-item.svelte +1 -1
  70. package/dist/components/primitives/select/select-trigger.svelte +1 -1
  71. package/dist/components/primitives/slider/slider.svelte +1 -1
  72. package/dist/components/primitives/switch/switch.svelte +1 -1
  73. package/dist/components/primitives/tabs/tabs-list.svelte +1 -1
  74. package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +3 -3
  75. package/dist/components/primitives/tabs/tabs-trigger.svelte +1 -1
  76. package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +3 -3
  77. package/dist/components/primitives/textarea/textarea.svelte +1 -1
  78. package/dist/components/primitives/toggle/toggle.svelte +6 -3
  79. package/dist/components/primitives/toggle/toggle.svelte.d.ts +10 -7
  80. package/dist/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
  81. package/dist/components/primitives/toggle-group/toggle-group.svelte +1 -1
  82. package/dist/components/primitives/tooltip/index.d.ts +6 -0
  83. package/dist/components/primitives/tooltip/index.js +8 -0
  84. package/dist/components/primitives/tooltip/tooltip-content.svelte +34 -0
  85. package/dist/components/primitives/tooltip/tooltip-content.svelte.d.ts +10 -0
  86. package/dist/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  87. package/dist/components/primitives/tooltip/tooltip-portal.svelte.d.ts +4 -0
  88. package/dist/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  89. package/dist/components/primitives/tooltip/tooltip-provider.svelte.d.ts +4 -0
  90. package/dist/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  91. package/dist/components/primitives/tooltip/tooltip-trigger.svelte.d.ts +4 -0
  92. package/dist/components/primitives/tooltip/tooltip.svelte +7 -0
  93. package/dist/components/primitives/tooltip/tooltip.svelte.d.ts +4 -0
  94. package/dist/components/viewer/MeshMetadataPanel.svelte +1 -1
  95. package/dist/components/viewer/SceneManager.svelte +19 -19
  96. package/dist/components/viewer/Viewer.svelte +68 -157
  97. package/dist/components/viewer/ViewerDock.svelte +404 -0
  98. package/dist/components/viewer/ViewerDock.svelte.d.ts +42 -0
  99. package/dist/i18n/messages.d.ts +11 -0
  100. package/dist/i18n/messages.js +18 -0
  101. package/dist/styles/base.css +81 -80
  102. package/dist/utils/color-space.d.ts +21 -0
  103. package/dist/utils/color-space.js +90 -0
  104. package/package.json +9 -10
  105. package/src/lib/components/compute/AppLayout.svelte +5 -3
  106. package/src/lib/components/compute/CollapsedPanelStrip.svelte +1 -1
  107. package/src/lib/components/compute/ParameterPresetManager.svelte +1 -1
  108. package/src/lib/components/compute/SolveMessages.svelte +2 -2
  109. package/src/lib/components/layout/FooterItemRenderer.svelte +1 -1
  110. package/src/lib/components/layout/PageFooter.svelte +2 -2
  111. package/src/lib/components/layout/PageHeader.svelte +1 -1
  112. package/src/lib/components/layout/SideNav.svelte +3 -3
  113. package/src/lib/components/layout/SubNav.svelte +2 -2
  114. package/src/lib/components/preview/ChartOutput.svelte +3 -3
  115. package/src/lib/components/preview/Group.svelte +7 -7
  116. package/src/lib/components/preview/ImageOutput.svelte +6 -6
  117. package/src/lib/components/preview/InputControl.svelte +1 -0
  118. package/src/lib/components/preview/OutputDisplay.svelte +8 -6
  119. package/src/lib/components/preview/TabBar.svelte +6 -4
  120. package/src/lib/components/preview/TabContent.svelte +1 -1
  121. package/src/lib/components/preview/TabLayout.svelte +3 -4
  122. package/src/lib/components/preview/inputs/ChecklistInput.svelte +3 -3
  123. package/src/lib/components/preview/inputs/ColorInput.svelte +356 -14
  124. package/src/lib/components/preview/inputs/FileInput.svelte +3 -3
  125. package/src/lib/components/preview/inputs/SegmentedInput.svelte +2 -1
  126. package/src/lib/components/preview/inputs/TileInput.svelte +1 -1
  127. package/src/lib/components/primitives/CalculateButton.svelte +2 -2
  128. package/src/lib/components/primitives/Callout.svelte +7 -5
  129. package/src/lib/components/primitives/DataTable.svelte +1 -1
  130. package/src/lib/components/primitives/ImageUploadField.svelte +1 -1
  131. package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  132. package/src/lib/components/primitives/badge/badge.svelte +2 -2
  133. package/src/lib/components/primitives/button/button.svelte +6 -7
  134. package/src/lib/components/primitives/card/card.svelte +1 -1
  135. package/src/lib/components/primitives/checkbox/checkbox.svelte +1 -1
  136. package/src/lib/components/primitives/command/command-input.svelte +1 -1
  137. package/src/lib/components/primitives/command/command-item.svelte +1 -1
  138. package/src/lib/components/primitives/command/command-link-item.svelte +1 -1
  139. package/src/lib/components/primitives/command/command.svelte +1 -1
  140. package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
  141. package/src/lib/components/primitives/context-menu/context-menu-content.svelte +1 -1
  142. package/src/lib/components/primitives/context-menu/context-menu-item.svelte +1 -1
  143. package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
  144. package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  145. package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
  146. package/src/lib/components/primitives/dialog/dialog-content.svelte +2 -2
  147. package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
  148. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
  149. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
  150. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
  151. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  152. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  153. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  154. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  155. package/src/lib/components/primitives/index.ts +1 -1
  156. package/src/lib/components/primitives/input/input.svelte +2 -2
  157. package/src/lib/components/primitives/input-group/input-group.svelte +1 -1
  158. package/src/lib/components/primitives/popover/popover-content.svelte +1 -1
  159. package/src/lib/components/primitives/resizable/resizable-handle.svelte +2 -2
  160. package/src/lib/components/primitives/search/search.svelte +1 -1
  161. package/src/lib/components/primitives/select/select-content.svelte +1 -1
  162. package/src/lib/components/primitives/select/select-item.svelte +1 -1
  163. package/src/lib/components/primitives/select/select-trigger.svelte +1 -1
  164. package/src/lib/components/primitives/slider/slider.svelte +1 -1
  165. package/src/lib/components/primitives/switch/switch.svelte +1 -1
  166. package/src/lib/components/primitives/tabs/tabs-list.svelte +1 -1
  167. package/src/lib/components/primitives/tabs/tabs-trigger.svelte +1 -1
  168. package/src/lib/components/primitives/textarea/textarea.svelte +1 -1
  169. package/src/lib/components/primitives/toggle/toggle.svelte +6 -3
  170. package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
  171. package/src/lib/components/primitives/toggle-group/toggle-group.svelte +1 -1
  172. package/src/lib/components/primitives/tooltip/index.ts +19 -0
  173. package/src/lib/components/primitives/tooltip/tooltip-content.svelte +34 -0
  174. package/src/lib/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  175. package/src/lib/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  176. package/src/lib/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  177. package/src/lib/components/primitives/tooltip/tooltip.svelte +7 -0
  178. package/src/lib/components/viewer/MeshMetadataPanel.svelte +1 -1
  179. package/src/lib/components/viewer/SceneManager.svelte +19 -19
  180. package/src/lib/components/viewer/Viewer.svelte +68 -157
  181. package/src/lib/components/viewer/ViewerDock.svelte +404 -0
  182. package/src/lib/i18n/messages.ts +29 -0
  183. package/src/lib/styles/base.css +81 -80
  184. package/src/lib/utils/color-space.ts +107 -0
  185. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  186. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +0 -3
  187. package/dist/components/primitives/theme-switcher/index.d.ts +0 -1
  188. package/dist/components/primitives/theme-switcher/index.js +0 -1
  189. package/dist/styles/themes/cyberpunk.css +0 -98
  190. package/dist/styles/themes/neutral.css +0 -72
  191. package/dist/styles/themes/ocean.css +0 -75
  192. package/dist/styles/themes/selva.css +0 -105
  193. package/dist/theme/themeStore.svelte.d.ts +0 -12
  194. package/dist/theme/themeStore.svelte.js +0 -40
  195. package/dist/theme/themes.d.ts +0 -5
  196. package/dist/theme/themes.js +0 -13
  197. package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  198. package/src/lib/components/primitives/theme-switcher/index.ts +0 -1
  199. package/src/lib/styles/themes/cyberpunk.css +0 -98
  200. package/src/lib/styles/themes/neutral.css +0 -72
  201. package/src/lib/styles/themes/ocean.css +0 -75
  202. package/src/lib/styles/themes/selva.css +0 -105
  203. package/src/lib/theme/themeStore.svelte.ts +0 -50
  204. package/src/lib/theme/themes.ts +0 -18
@@ -0,0 +1,107 @@
1
+ export interface Rgb {
2
+ r: number;
3
+ g: number;
4
+ b: number;
5
+ }
6
+
7
+ /** h in [0, 360), s and v in [0, 1]. */
8
+ export interface Hsv {
9
+ h: number;
10
+ s: number;
11
+ v: number;
12
+ }
13
+
14
+ const clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n));
15
+
16
+ /** Accepts `#rgb`, `#rrggbb` and the same without `#`. Returns lowercase `#rrggbb`, or null. */
17
+ export function normalizeHex(input: string): string | null {
18
+ const raw = input.trim().replace(/^#/, '');
19
+ if (/^[0-9a-f]{3}$/i.test(raw)) {
20
+ return `#${raw
21
+ .split('')
22
+ .map((c) => c + c)
23
+ .join('')
24
+ .toLowerCase()}`;
25
+ }
26
+ if (/^[0-9a-f]{6}$/i.test(raw)) return `#${raw.toLowerCase()}`;
27
+ return null;
28
+ }
29
+
30
+ export function hexToRgb(hex: string): Rgb | null {
31
+ const normalized = normalizeHex(hex);
32
+ if (!normalized) return null;
33
+ return {
34
+ r: parseInt(normalized.slice(1, 3), 16),
35
+ g: parseInt(normalized.slice(3, 5), 16),
36
+ b: parseInt(normalized.slice(5, 7), 16)
37
+ };
38
+ }
39
+
40
+ export function rgbToHex({ r, g, b }: Rgb): string {
41
+ const channel = (n: number) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, '0');
42
+ return `#${channel(r)}${channel(g)}${channel(b)}`;
43
+ }
44
+
45
+ export function rgbToHsv({ r, g, b }: Rgb): Hsv {
46
+ const rn = r / 255;
47
+ const gn = g / 255;
48
+ const bn = b / 255;
49
+ const max = Math.max(rn, gn, bn);
50
+ const delta = max - Math.min(rn, gn, bn);
51
+
52
+ let h = 0;
53
+ if (delta !== 0) {
54
+ if (max === rn) h = ((gn - bn) / delta) % 6;
55
+ else if (max === gn) h = (bn - rn) / delta + 2;
56
+ else h = (rn - gn) / delta + 4;
57
+ h *= 60;
58
+ if (h < 0) h += 360;
59
+ }
60
+ return { h, s: max === 0 ? 0 : delta / max, v: max };
61
+ }
62
+
63
+ export function hsvToRgb({ h, s, v }: Hsv): Rgb {
64
+ const c = v * s;
65
+ const hp = (((h % 360) + 360) % 360) / 60;
66
+ const x = c * (1 - Math.abs((hp % 2) - 1));
67
+ const [r1, g1, b1] =
68
+ hp < 1
69
+ ? [c, x, 0]
70
+ : hp < 2
71
+ ? [x, c, 0]
72
+ : hp < 3
73
+ ? [0, c, x]
74
+ : hp < 4
75
+ ? [0, x, c]
76
+ : hp < 5
77
+ ? [x, 0, c]
78
+ : [c, 0, x];
79
+ const m = v - c;
80
+ return { r: (r1 + m) * 255, g: (g1 + m) * 255, b: (b1 + m) * 255 };
81
+ }
82
+
83
+ export const hexToHsv = (hex: string): Hsv | null => {
84
+ const rgb = hexToRgb(hex);
85
+ return rgb ? rgbToHsv(rgb) : null;
86
+ };
87
+
88
+ export const hsvToHex = (hsv: Hsv): string => rgbToHex(hsvToRgb(hsv));
89
+
90
+ /** WCAG relative luminance of an sRGB color. */
91
+ function luminance({ r, g, b }: Rgb): number {
92
+ const lin = (c: number) => {
93
+ const n = c / 255;
94
+ return n <= 0.04045 ? n / 12.92 : Math.pow((n + 0.055) / 1.055, 2.4);
95
+ };
96
+ return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);
97
+ }
98
+
99
+ /** WCAG contrast ratio between two hex colors, 1 to 21. Null if either isn't a hex color. */
100
+ export function contrastRatio(a: string, b: string): number | null {
101
+ const ra = hexToRgb(a);
102
+ const rb = hexToRgb(b);
103
+ if (!ra || !rb) return null;
104
+ const la = luminance(ra);
105
+ const lb = luminance(rb);
106
+ return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);
107
+ }
@@ -1,39 +0,0 @@
1
- <script lang="ts">
2
- import { themeStore, type Theme } from '../../../theme/themeStore.svelte';
3
- import * as Select from '../select';
4
- import { Palette } from '@lucide/svelte';
5
-
6
- const themes: { value: Theme; label: string; description: string }[] = [
7
- { value: 'neutral', label: 'Neutral', description: 'Classic grayscale' },
8
- { value: 'selva', label: 'Selva', description: 'Forest green' },
9
- { value: 'ocean', label: 'Ocean', description: 'Calm blue tones' },
10
- { value: 'cyberpunk', label: 'Cyberpunk', description: 'Vibrant neon colors' }
11
- ];
12
-
13
- let value = $state(themeStore.current);
14
-
15
- $effect(() => {
16
- if (value) {
17
- themeStore.set(value as Theme);
18
- }
19
- });
20
-
21
- const triggerContent = $derived(themes.find((t) => t.value === value)?.label ?? 'Select theme');
22
- </script>
23
-
24
- <Select.Root type="single" bind:value>
25
- <Select.Trigger class="gap-2 w-35">
26
- <Palette size={14} />
27
- <span>{triggerContent}</span>
28
- </Select.Trigger>
29
- <Select.Content>
30
- {#each themes as theme (theme.value)}
31
- <Select.Item value={theme.value} label={theme.label}>
32
- <div class="flex flex-col items-start">
33
- <span class="font-medium text-sm">{theme.label}</span>
34
- <span class="text-xs text-muted-foreground">{theme.description}</span>
35
- </div>
36
- </Select.Item>
37
- {/each}
38
- </Select.Content>
39
- </Select.Root>
@@ -1,3 +0,0 @@
1
- declare const ThemeSwitcher: import("svelte").Component<Record<string, never>, {}, "">;
2
- type ThemeSwitcher = ReturnType<typeof ThemeSwitcher>;
3
- export default ThemeSwitcher;
@@ -1 +0,0 @@
1
- export { default as ThemeSwitcher } from './ThemeSwitcher.svelte';
@@ -1 +0,0 @@
1
- export { default as ThemeSwitcher } from './ThemeSwitcher.svelte';
@@ -1,98 +0,0 @@
1
- :root {
2
- --radius: 0.625rem;
3
-
4
- --background: oklch(0.98 0.01 300);
5
- --foreground: oklch(0.18 0.05 300);
6
-
7
- --card: oklch(0.97 0.015 300);
8
- --card-foreground: oklch(0.18 0.05 300);
9
-
10
- --popover: oklch(0.97 0.015 300);
11
- --popover-foreground: oklch(0.18 0.05 300);
12
-
13
- --primary: oklch(0.7 0.28 295);
14
- --primary-foreground: oklch(0.98 0 0);
15
-
16
- --secondary: oklch(0.9 0.05 300);
17
- --secondary-foreground: oklch(0.18 0.05 300);
18
-
19
- --muted: oklch(0.92 0.015 300);
20
- --muted-foreground: oklch(0.5 0.03 300);
21
-
22
- --accent: oklch(0.78 0.2 305);
23
- --accent-foreground: oklch(0.12 0.05 300);
24
-
25
- --destructive: oklch(0.62 0.25 20);
26
- --destructive-foreground: oklch(0.98 0 0);
27
-
28
- --border: oklch(0.86 0.02 300);
29
- --input: oklch(0.92 0.015 300);
30
- --ring: oklch(0.75 0.18 295);
31
-
32
- --chart-1: oklch(0.7 0.28 295);
33
- --chart-2: oklch(0.8 0.24 305);
34
- --chart-3: oklch(0.65 0.22 310);
35
- --chart-4: oklch(0.55 0.18 290);
36
- --chart-5: oklch(0.85 0.15 300);
37
-
38
- --sidebar: oklch(0.97 0.015 300);
39
- --sidebar-foreground: oklch(0.18 0.05 300);
40
- --sidebar-primary: oklch(0.7 0.28 295);
41
- --sidebar-primary-foreground: oklch(0.98 0 0);
42
- --sidebar-accent: oklch(0.92 0.015 300);
43
- --sidebar-accent-foreground: oklch(0.18 0.05 300);
44
- --sidebar-border: oklch(0.86 0.02 300);
45
- --sidebar-ring: oklch(0.75 0.18 295);
46
-
47
- --inputparam: oklch(0.86 0.02 300);
48
- --outputparam: oklch(0.86 0.04 305);
49
- --downloadparam: oklch(0.86 0.05 295);
50
- }
51
-
52
- .dark {
53
- --background: oklch(0.18 0.05 300);
54
- --foreground: oklch(0.98 0 0);
55
-
56
- --card: oklch(0.22 0.05 300);
57
- --card-foreground: oklch(0.98 0 0);
58
-
59
- --popover: oklch(0.22 0.05 300);
60
- --popover-foreground: oklch(0.98 0 0);
61
-
62
- --primary: oklch(0.7 0.28 295);
63
- --primary-foreground: oklch(0.18 0.05 300);
64
-
65
- --secondary: oklch(0.28 0.03 300);
66
- --secondary-foreground: oklch(0.98 0 0);
67
-
68
- --muted: oklch(0.28 0.03 300);
69
- --muted-foreground: oklch(0.75 0.04 300);
70
-
71
- --accent: oklch(0.22 0.05 305);
72
- --accent-foreground: oklch(0.98 0 0);
73
-
74
- --destructive: oklch(0.55 0.22 20);
75
- --destructive-foreground: oklch(0.18 0.05 300);
76
-
77
- --border: oklch(0.35 0.04 300);
78
- --input: oklch(0.3 0.03 300);
79
- --ring: oklch(0.75 0.18 295);
80
-
81
- --chart-1: oklch(0.7 0.28 295);
82
- --chart-2: oklch(0.8 0.24 305);
83
- --chart-3: oklch(0.65 0.22 310);
84
- --chart-4: oklch(0.32 0.03 300);
85
- --chart-5: oklch(0.85 0.15 300);
86
-
87
- --sidebar: oklch(0.18 0.05 300);
88
- --sidebar-foreground: oklch(0.98 0 0);
89
- --sidebar-primary: oklch(0.7 0.28 295);
90
- --sidebar-primary-foreground: oklch(0.18 0.05 300);
91
- --sidebar-accent: oklch(0.28 0.03 300);
92
- --sidebar-accent-foreground: oklch(0.98 0 0);
93
- --sidebar-border: oklch(0.35 0.04 300);
94
- --sidebar-ring: oklch(0.75 0.18 295);
95
-
96
- --inputparam: oklch(0.12 0.03 300);
97
- --outputparam: oklch(0.32 0.04 305);
98
- }
@@ -1,72 +0,0 @@
1
- :root {
2
- --radius: 0.625rem;
3
- --background: oklch(1 0 0);
4
- --foreground: oklch(0.145 0 0);
5
- --card: oklch(1 0 0);
6
- --card-foreground: oklch(0.145 0 0);
7
- --popover: oklch(1 0 0);
8
- --popover-foreground: oklch(0.145 0 0);
9
- --primary: oklch(0.205 0 0);
10
- --primary-foreground: oklch(0.985 0 0);
11
- --secondary: oklch(0.97 0 0);
12
- --secondary-foreground: oklch(0.205 0 0);
13
- --muted: oklch(0.97 0 0);
14
- --muted-foreground: oklch(0.556 0 0);
15
- --accent: oklch(0.97 0 0);
16
- --accent-foreground: oklch(0.205 0 0);
17
- --destructive: oklch(0.577 0.245 27.325);
18
- --border: oklch(87.61% 0.0001 271.152);
19
- --input: oklch(0.922 0 0);
20
- --ring: oklch(0.708 0 0);
21
- --chart-1: oklch(0.646 0.222 41.116);
22
- --chart-2: oklch(0.6 0.118 184.704);
23
- --chart-3: oklch(0.398 0.07 227.392);
24
- --chart-4: oklch(0.828 0.189 84.429);
25
- --chart-5: oklch(0.769 0.188 70.08);
26
- --sidebar: oklch(0.985 0 0);
27
- --sidebar-foreground: oklch(0.145 0 0);
28
- --sidebar-primary: oklch(0.205 0 0);
29
- --sidebar-primary-foreground: oklch(0.985 0 0);
30
- --sidebar-accent: oklch(0.97 0 0);
31
- --sidebar-accent-foreground: oklch(0.205 0 0);
32
- --sidebar-border: oklch(0.922 0 0);
33
- --sidebar-ring: oklch(0.708 0 0);
34
- --inputparam: oklch(100% 0.00011 271.152);
35
- --outputparam: oklch(100% 0.00011 271.152);
36
- }
37
-
38
- .dark {
39
- --background: oklch(0.145 0 0);
40
- --foreground: oklch(0.985 0 0);
41
- --card: oklch(0.205 0 0);
42
- --card-foreground: oklch(0.985 0 0);
43
- --popover: oklch(0.205 0 0);
44
- --popover-foreground: oklch(0.985 0 0);
45
- --primary: oklch(0.922 0 0);
46
- --primary-foreground: oklch(0.205 0 0);
47
- --secondary: oklch(0.269 0 0);
48
- --secondary-foreground: oklch(0.985 0 0);
49
- --muted: oklch(0.269 0 0);
50
- --muted-foreground: oklch(0.708 0 0);
51
- --accent: oklch(0.269 0 0);
52
- --accent-foreground: oklch(0.985 0 0);
53
- --destructive: oklch(0.704 0.191 22.216);
54
- --border: oklch(1 0 0 / 10%);
55
- --input: oklch(1 0 0 / 15%);
56
- --ring: oklch(0.556 0 0);
57
- --chart-1: oklch(0.488 0.243 264.376);
58
- --chart-2: oklch(0.696 0.17 162.48);
59
- --chart-3: oklch(0.769 0.188 70.08);
60
- --chart-4: oklch(0.627 0.265 303.9);
61
- --chart-5: oklch(0.645 0.246 16.439);
62
- --sidebar: oklch(0.205 0 0);
63
- --sidebar-foreground: oklch(0.985 0 0);
64
- --sidebar-primary: oklch(0.488 0.243 264.376);
65
- --sidebar-primary-foreground: oklch(0.985 0 0);
66
- --sidebar-accent: oklch(0.269 0 0);
67
- --sidebar-accent-foreground: oklch(0.985 0 0);
68
- --sidebar-border: oklch(1 0 0 / 10%);
69
- --sidebar-ring: oklch(0.556 0 0);
70
- --inputparam: oklch(0% 0 271.152);
71
- --outputparam: oklch(23.574% 0.00241 67.461);
72
- }
@@ -1,75 +0,0 @@
1
- :root {
2
- --radius: 0.625rem;
3
- --background: oklch(0.98 0.003 260);
4
- --foreground: oklch(0.22 0.01 260);
5
- --card: oklch(0.97 0.002 260);
6
- --card-foreground: oklch(0.22 0.01 260);
7
- --popover: oklch(0.97 0.002 260);
8
- --popover-foreground: oklch(0.22 0.01 260);
9
- --primary: oklch(0.62 0.18 275);
10
- --primary-foreground: oklch(0.98 0 0);
11
- --secondary: oklch(0.85 0.05 260);
12
- --secondary-foreground: oklch(0.22 0.01 260);
13
- --muted: oklch(0.92 0.01 260);
14
- --muted-foreground: oklch(0.45 0.02 260);
15
- --accent: oklch(0.78 0.04 275);
16
- --accent-foreground: oklch(0.15 0.01 260);
17
- --destructive: oklch(0.6 0.23 20);
18
- --destructive-foreground: oklch(0.98 0 0);
19
- --border: oklch(0.85 0.01 260);
20
- --input: oklch(0.92 0.01 260);
21
- --ring: oklch(0.55 0.04 275);
22
- --chart-1: oklch(0.62 0.18 275);
23
- --chart-2: oklch(0.68 0.14 255);
24
- --chart-3: oklch(0.74 0.12 290);
25
- --chart-4: oklch(0.5 0.09 270);
26
- --chart-5: oklch(0.82 0.06 250);
27
- --sidebar: oklch(0.97 0.002 260);
28
- --sidebar-foreground: oklch(0.22 0.01 260);
29
- --sidebar-primary: oklch(0.62 0.18 275);
30
- --sidebar-primary-foreground: oklch(0.98 0 0);
31
- --sidebar-accent: oklch(0.92 0.01 260);
32
- --sidebar-accent-foreground: oklch(0.22 0.01 260);
33
- --sidebar-border: oklch(0.85 0.01 260);
34
- --sidebar-ring: oklch(0.55 0.04 275);
35
- --inputparam: oklch(0.86 0.01 260);
36
- --outputparam: oklch(0.86 0.0156 280);
37
- --downloadparam: oklch(0.86 0.021 265);
38
- }
39
-
40
- .dark {
41
- --background: oklch(0.22 0.01 260);
42
- --foreground: oklch(0.98 0 0);
43
- --card: oklch(0.27 0.01 260);
44
- --card-foreground: oklch(0.98 0 0);
45
- --popover: oklch(0.27 0.01 260);
46
- --popover-foreground: oklch(0.98 0 0);
47
- --primary: oklch(0.62 0.18 275);
48
- --primary-foreground: oklch(0.22 0.01 260);
49
- --secondary: oklch(0.32 0.015 260);
50
- --secondary-foreground: oklch(0.98 0 0);
51
- --muted: oklch(0.32 0.01 260);
52
- --muted-foreground: oklch(0.78 0.02 260);
53
- --accent: oklch(0.27 0.01 275);
54
- --accent-foreground: oklch(0.98 0 0);
55
- --destructive: oklch(0.55 0.22 20);
56
- --destructive-foreground: oklch(0.22 0.01 260);
57
- --border: oklch(0.4 0.01 260);
58
- --input: oklch(0.35 0.01 260);
59
- --ring: oklch(0.78 0.02 260);
60
- --chart-1: oklch(0.62 0.18 275);
61
- --chart-2: oklch(0.68 0.14 255);
62
- --chart-3: oklch(0.74 0.12 290);
63
- --chart-4: oklch(0.32 0.015 260);
64
- --chart-5: oklch(0.82 0.06 250);
65
- --sidebar: oklch(0.22 0.01 260);
66
- --sidebar-foreground: oklch(0.98 0 0);
67
- --sidebar-primary: oklch(0.62 0.18 275);
68
- --sidebar-primary-foreground: oklch(0.22 0.01 260);
69
- --sidebar-accent: oklch(0.32 0.015 260);
70
- --sidebar-accent-foreground: oklch(0.98 0 0);
71
- --sidebar-border: oklch(0.4 0.01 260);
72
- --sidebar-ring: oklch(0.78 0.02 260);
73
- --inputparam: oklch(0.12 0.01 260);
74
- --outputparam: oklch(0.36 0.0156 280);
75
- }
@@ -1,105 +0,0 @@
1
- :root {
2
- --radius: 0.625rem;
3
-
4
- /* Light Mode - Forest Theme */
5
- --background: oklch(0.98 0.005 110); /* Very light sage */
6
- --foreground: oklch(0.22 0.02 110); /* Deep forest green, darker for better contrast */
7
-
8
- --card: oklch(0.97 0.008 108); /* Slightly tinted white */
9
- --card-foreground: oklch(0.25 0.018 105); /* Dark forest text */
10
-
11
- --popover: oklch(0.98 0.005 110);
12
- --popover-foreground: oklch(0.22 0.02 110);
13
-
14
- --primary: oklch(0.55 0.16 140); /* Rich forest green, darker for contrast */
15
- --primary-foreground: oklch(0.98 0.005 110); /* Light text on primary */
16
-
17
- --secondary: oklch(0.38 0.08 165); /* Deep teal/evergreen */
18
- --secondary-foreground: oklch(0.98 0.005 110);
19
-
20
- --muted: oklch(0.92 0.01 120); /* Soft sage background */
21
- --muted-foreground: oklch(0.35 0.015 110); /* Darker muted text for contrast */
22
-
23
- --accent: oklch(0.62 0.12 85); /* Moss/olive accent */
24
- --accent-foreground: oklch(0.98 0.005 110);
25
-
26
- --destructive: oklch(0.54 0.22 27); /* Autumn red, darker for contrast */
27
- --destructive-foreground: oklch(0.98 0.005 110);
28
-
29
- --border: oklch(0.85 0.015 120); /* Soft green-grey border */
30
- --input: oklch(0.94 0.008 115); /* Light sage input */
31
- --ring: oklch(0.55 0.16 140); /* Focus ring matches primary */
32
-
33
- /* Chart colors - forest palette */
34
- --chart-1: oklch(0.55 0.16 140); /* Primary forest green */
35
- --chart-2: oklch(0.45 0.12 165); /* Deep evergreen */
36
- --chart-3: oklch(0.62 0.12 85); /* Moss green */
37
- --chart-4: oklch(0.68 0.08 180); /* Fern green */
38
- --chart-5: oklch(0.52 0.1 110); /* Pine green */
39
-
40
- /* Sidebar */
41
- --sidebar: oklch(0.96 0.01 115);
42
- --sidebar-foreground: oklch(0.25 0.018 105);
43
- --sidebar-primary: oklch(0.55 0.16 140);
44
- --sidebar-primary-foreground: oklch(0.98 0.005 110);
45
- --sidebar-accent: oklch(0.9 0.015 120);
46
- --sidebar-accent-foreground: oklch(0.25 0.018 105);
47
- --sidebar-border: oklch(0.85 0.015 120);
48
- --sidebar-ring: oklch(0.55 0.16 140);
49
-
50
- /* Special parameters */
51
- --inputparam: oklch(86.877% 0.02027 155.1); /* Soft blue-lavender */
52
- --outputparam: oklch(85.332% 0.0278 145.489); /* Soft yellow-green */
53
- }
54
-
55
- .dark {
56
- /* Dark Mode - Deep Forest Theme */
57
- --background: oklch(0.18 0.02 140); /* Deep forest background */
58
- --foreground: oklch(0.92 0.01 110); /* Soft cream text */
59
-
60
- --card: oklch(0.22 0.025 135); /* Darker forest card */
61
- --card-foreground: oklch(0.92 0.01 110);
62
-
63
- --popover: oklch(0.22 0.025 135);
64
- --popover-foreground: oklch(0.92 0.01 110);
65
-
66
- --primary: oklch(0.68 0.14 130); /* Bright forest green */
67
- --primary-foreground: oklch(0.15 0.02 140); /* Dark text on primary */
68
-
69
- --secondary: oklch(0.35 0.08 165); /* Deep teal */
70
- --secondary-foreground: oklch(0.92 0.01 110);
71
-
72
- --muted: oklch(0.28 0.02 130); /* Muted forest */
73
- --muted-foreground: oklch(0.72 0.01 115); /* Lighter muted text */
74
-
75
- --accent: oklch(0.52 0.12 85); /* Moss accent */
76
- --accent-foreground: oklch(0.92 0.01 110);
77
-
78
- --destructive: oklch(0.65 0.18 25); /* Autumn red-orange */
79
- --destructive-foreground: oklch(0.15 0.02 140);
80
-
81
- --border: oklch(0.35 0.02 130 / 60%); /* Subtle forest border */
82
- --input: oklch(0.26 0.025 135); /* Dark forest input */
83
- --ring: oklch(0.68 0.14 130); /* Bright focus ring */
84
-
85
- /* Chart colors - deep forest palette */
86
- --chart-1: oklch(0.68 0.14 130); /* Bright forest green */
87
- --chart-2: oklch(0.52 0.12 85); /* Moss green */
88
- --chart-3: oklch(0.75 0.08 180); /* Light fern */
89
- --chart-4: oklch(0.45 0.1 165); /* Deep evergreen */
90
- --chart-5: oklch(0.6 0.1 110); /* Medium pine */
91
-
92
- /* Sidebar */
93
- --sidebar: oklch(0.2 0.022 138);
94
- --sidebar-foreground: oklch(0.92 0.01 110);
95
- --sidebar-primary: oklch(0.68 0.14 130);
96
- --sidebar-primary-foreground: oklch(0.15 0.02 140);
97
- --sidebar-accent: oklch(0.28 0.025 135);
98
- --sidebar-accent-foreground: oklch(0.92 0.01 110);
99
- --sidebar-border: oklch(0.92 0.01 110 / 10%);
100
- --sidebar-ring: oklch(0.68 0.14 130);
101
-
102
- /* Special parameters */
103
- --inputparam: oklch(21.813% 0.00595 156.915); /* Deep forest blue */
104
- --outputparam: oklch(16.216% 0.00263 145.779); /* Forest gold */
105
- }
@@ -1,12 +0,0 @@
1
- import { type Theme } from './themes';
2
- declare class ThemeStore {
3
- private _theme;
4
- constructor();
5
- get current(): Theme;
6
- get availableThemes(): readonly Theme[];
7
- set(theme: Theme): void;
8
- private applyTheme;
9
- toggle(): void;
10
- }
11
- export declare const themeStore: ThemeStore;
12
- export type { Theme };
@@ -1,40 +0,0 @@
1
- import { themes, isTheme } from './themes';
2
- const STORAGE_KEY = 'selva-theme';
3
- const DEFAULT_THEME = 'neutral';
4
- class ThemeStore {
5
- _theme = $state(DEFAULT_THEME);
6
- constructor() {
7
- if (typeof window !== 'undefined') {
8
- const stored = localStorage.getItem(STORAGE_KEY);
9
- if (stored && isTheme(stored)) {
10
- this._theme = stored;
11
- }
12
- }
13
- }
14
- get current() {
15
- return this._theme;
16
- }
17
- get availableThemes() {
18
- return themes;
19
- }
20
- set(theme) {
21
- if (!isTheme(theme)) {
22
- console.warn(`Theme "${theme}" is not available. Falling back to default.`);
23
- return;
24
- }
25
- this._theme = theme;
26
- if (typeof window !== 'undefined') {
27
- localStorage.setItem(STORAGE_KEY, theme);
28
- this.applyTheme(theme);
29
- }
30
- }
31
- applyTheme(theme) {
32
- document.documentElement.setAttribute('data-theme', theme);
33
- }
34
- toggle() {
35
- const currentIndex = themes.indexOf(this._theme);
36
- const nextIndex = (currentIndex + 1) % themes.length;
37
- this.set(themes[nextIndex]);
38
- }
39
- }
40
- export const themeStore = new ThemeStore();
@@ -1,5 +0,0 @@
1
- export type Theme = 'neutral' | 'selva' | 'ocean' | 'cyberpunk';
2
- export declare const themes: readonly Theme[];
3
- export declare const themeDescriptions: Record<Theme, string>;
4
- export declare function isTheme(value: string): value is Theme;
5
- export declare function getThemePath(theme: Theme): string;
@@ -1,13 +0,0 @@
1
- export const themes = ['neutral', 'selva', 'ocean', 'cyberpunk'];
2
- export const themeDescriptions = {
3
- neutral: 'Classic grayscale theme',
4
- selva: 'Forest green nature-inspired theme',
5
- ocean: 'Cool blue ocean theme',
6
- cyberpunk: 'Vibrant neon magenta theme'
7
- };
8
- export function isTheme(value) {
9
- return themes.includes(value);
10
- }
11
- export function getThemePath(theme) {
12
- return `/styles/themes/${theme}.css`;
13
- }
@@ -1,39 +0,0 @@
1
- <script lang="ts">
2
- import { themeStore, type Theme } from '$lib/theme/themeStore.svelte';
3
- import * as Select from '$lib/components/primitives/select';
4
- import { Palette } from '@lucide/svelte';
5
-
6
- const themes: { value: Theme; label: string; description: string }[] = [
7
- { value: 'neutral', label: 'Neutral', description: 'Classic grayscale' },
8
- { value: 'selva', label: 'Selva', description: 'Forest green' },
9
- { value: 'ocean', label: 'Ocean', description: 'Calm blue tones' },
10
- { value: 'cyberpunk', label: 'Cyberpunk', description: 'Vibrant neon colors' }
11
- ];
12
-
13
- let value = $state(themeStore.current);
14
-
15
- $effect(() => {
16
- if (value) {
17
- themeStore.set(value as Theme);
18
- }
19
- });
20
-
21
- const triggerContent = $derived(themes.find((t) => t.value === value)?.label ?? 'Select theme');
22
- </script>
23
-
24
- <Select.Root type="single" bind:value>
25
- <Select.Trigger class="gap-2 w-35">
26
- <Palette size={14} />
27
- <span>{triggerContent}</span>
28
- </Select.Trigger>
29
- <Select.Content>
30
- {#each themes as theme (theme.value)}
31
- <Select.Item value={theme.value} label={theme.label}>
32
- <div class="flex flex-col items-start">
33
- <span class="font-medium text-sm">{theme.label}</span>
34
- <span class="text-xs text-muted-foreground">{theme.description}</span>
35
- </div>
36
- </Select.Item>
37
- {/each}
38
- </Select.Content>
39
- </Select.Root>
@@ -1 +0,0 @@
1
- export { default as ThemeSwitcher } from './ThemeSwitcher.svelte';