@salmexio/ui 0.4.0 → 1.1.0

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 (119) hide show
  1. package/README.md +52 -3
  2. package/dist/dialogs/ContextMenu/ContextMenu.svelte +97 -94
  3. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +3 -2
  4. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts.map +1 -1
  5. package/dist/dialogs/Modal/Modal.svelte +112 -116
  6. package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
  7. package/dist/feedback/Alert/Alert.svelte +119 -220
  8. package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
  9. package/dist/feedback/ProgressBar/ProgressBar.svelte +265 -0
  10. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +40 -0
  11. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
  12. package/dist/feedback/ProgressBar/index.d.ts +2 -0
  13. package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
  14. package/dist/feedback/ProgressBar/index.js +1 -0
  15. package/dist/feedback/Skeleton/Skeleton.svelte +157 -0
  16. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +37 -0
  17. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
  18. package/dist/feedback/Skeleton/index.d.ts +2 -0
  19. package/dist/feedback/Skeleton/index.d.ts.map +1 -0
  20. package/dist/feedback/Skeleton/index.js +1 -0
  21. package/dist/feedback/Spinner/Spinner.svelte +86 -151
  22. package/dist/feedback/Spinner/Spinner.svelte.d.ts +5 -3
  23. package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -1
  24. package/dist/feedback/Toast/Toaster.svelte +431 -0
  25. package/dist/feedback/Toast/Toaster.svelte.d.ts +22 -0
  26. package/dist/feedback/Toast/Toaster.svelte.d.ts.map +1 -0
  27. package/dist/feedback/Toast/index.d.ts +4 -0
  28. package/dist/feedback/Toast/index.d.ts.map +1 -0
  29. package/dist/feedback/Toast/index.js +2 -0
  30. package/dist/feedback/Toast/toastStore.d.ts +34 -0
  31. package/dist/feedback/Toast/toastStore.d.ts.map +1 -0
  32. package/dist/feedback/Toast/toastStore.js +43 -0
  33. package/dist/feedback/index.d.ts +4 -0
  34. package/dist/feedback/index.d.ts.map +1 -1
  35. package/dist/feedback/index.js +3 -0
  36. package/dist/forms/Checkbox/Checkbox.svelte +87 -104
  37. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
  38. package/dist/forms/Select/Select.svelte +137 -179
  39. package/dist/forms/Select/Select.svelte.d.ts +1 -1
  40. package/dist/forms/Slider/Slider.svelte +356 -0
  41. package/dist/forms/Slider/Slider.svelte.d.ts +50 -0
  42. package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -0
  43. package/dist/forms/Slider/index.d.ts +2 -0
  44. package/dist/forms/Slider/index.d.ts.map +1 -0
  45. package/dist/forms/Slider/index.js +1 -0
  46. package/dist/forms/TextInput/TextInput.svelte +161 -167
  47. package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
  48. package/dist/forms/Textarea/Textarea.svelte +615 -0
  49. package/dist/forms/Textarea/Textarea.svelte.d.ts +47 -0
  50. package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
  51. package/dist/forms/Textarea/index.d.ts +2 -0
  52. package/dist/forms/Textarea/index.d.ts.map +1 -0
  53. package/dist/forms/Textarea/index.js +1 -0
  54. package/dist/forms/Toggle/Toggle.svelte +239 -0
  55. package/dist/forms/Toggle/Toggle.svelte.d.ts +39 -0
  56. package/dist/forms/Toggle/Toggle.svelte.d.ts.map +1 -0
  57. package/dist/forms/Toggle/index.d.ts +2 -0
  58. package/dist/forms/Toggle/index.d.ts.map +1 -0
  59. package/dist/forms/Toggle/index.js +1 -0
  60. package/dist/forms/index.d.ts +3 -0
  61. package/dist/forms/index.d.ts.map +1 -1
  62. package/dist/forms/index.js +3 -0
  63. package/dist/index.d.ts +0 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +0 -1
  66. package/dist/layout/Card/Card.svelte +66 -39
  67. package/dist/layout/Card/Card.svelte.d.ts +1 -1
  68. package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
  69. package/dist/layout/Container/Container.svelte +71 -71
  70. package/dist/layout/Container/Container.svelte.d.ts +2 -2
  71. package/dist/layout/ThermalBackground/ThermalBackground.svelte +313 -0
  72. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts +16 -0
  73. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts.map +1 -0
  74. package/dist/layout/ThermalBackground/index.d.ts +2 -0
  75. package/dist/layout/ThermalBackground/index.d.ts.map +1 -0
  76. package/dist/layout/ThermalBackground/index.js +1 -0
  77. package/dist/layout/index.d.ts +1 -0
  78. package/dist/layout/index.d.ts.map +1 -1
  79. package/dist/layout/index.js +1 -0
  80. package/dist/navigation/CommandPalette/CommandPalette.svelte +407 -189
  81. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +8 -3
  82. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts.map +1 -1
  83. package/dist/navigation/Tabs/Tabs.svelte +139 -192
  84. package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
  85. package/dist/primitives/Badge/Badge.svelte +85 -220
  86. package/dist/primitives/Badge/Badge.svelte.d.ts +2 -2
  87. package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
  88. package/dist/primitives/Button/Button.svelte +214 -194
  89. package/dist/primitives/Button/Button.svelte.d.ts +3 -3
  90. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
  91. package/dist/primitives/Tooltip/Tooltip.svelte +260 -0
  92. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +36 -0
  93. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -0
  94. package/dist/primitives/Tooltip/index.d.ts +2 -0
  95. package/dist/primitives/Tooltip/index.d.ts.map +1 -0
  96. package/dist/primitives/Tooltip/index.js +1 -0
  97. package/dist/primitives/index.d.ts +1 -0
  98. package/dist/primitives/index.d.ts.map +1 -1
  99. package/dist/primitives/index.js +1 -0
  100. package/dist/styles/tokens.css +329 -260
  101. package/package.json +5 -5
  102. package/dist/windowing/Window/Window.svelte +0 -637
  103. package/dist/windowing/Window/Window.svelte.d.ts +0 -65
  104. package/dist/windowing/Window/Window.svelte.d.ts.map +0 -1
  105. package/dist/windowing/Window/index.d.ts +0 -2
  106. package/dist/windowing/Window/index.d.ts.map +0 -1
  107. package/dist/windowing/Window/index.js +0 -1
  108. package/dist/windowing/WindowManager/WindowManager.svelte +0 -425
  109. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts +0 -38
  110. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts.map +0 -1
  111. package/dist/windowing/WindowManager/index.d.ts +0 -2
  112. package/dist/windowing/WindowManager/index.d.ts.map +0 -1
  113. package/dist/windowing/WindowManager/index.js +0 -1
  114. package/dist/windowing/index.d.ts +0 -5
  115. package/dist/windowing/index.d.ts.map +0 -1
  116. package/dist/windowing/index.js +0 -3
  117. package/dist/windowing/windowStore.svelte.d.ts +0 -49
  118. package/dist/windowing/windowStore.svelte.d.ts.map +0 -1
  119. package/dist/windowing/windowStore.svelte.js +0 -170
@@ -1,334 +1,407 @@
1
1
  /**
2
- * Salmex I/O UI Design Tokens
3
- * Win2K reimagined by Jean-Michel Basquiat
4
- * Raw. Expressive. Powerful. Unfinished.
2
+ * Salmex I/O Design System — INFRARED
5
3
  *
6
- * Typography: Work Sans (UI), Roboto Mono (code), Space Grotesk (display), Caveat Brush (accent).
7
- * Load fonts first in your app (e.g. in root layout CSS): @import url('https://fonts.googleapis.com/...') before other imports.
4
+ * Dark-only. Glassmorphic. Sovereign.
5
+ * Thermal optics. Forge heat. Earned authority.
6
+ *
7
+ * Token architecture: primitives → semantic → component
8
+ * Prefix: --sx-
9
+ *
10
+ * Typography: TT Fors (body), TT Quaris (display), JetBrains Mono (mono).
11
+ * Fonts must be loaded by the consuming app.
8
12
  */
13
+
9
14
  :root {
10
15
  /* ========================================
11
- BASQUIAT × WIN2K COLORS
16
+ PRIMITIVE COLORS
17
+ Raw palette — never use directly in components
18
+ ======================================== */
19
+
20
+ --sx-gray-950: #08080C;
21
+ --sx-gray-900: #0F0F14;
22
+ --sx-gray-800: #171720;
23
+ --sx-gray-700: #1F1F2A;
24
+ --sx-gray-600: #2D2D3A;
25
+ --sx-gray-500: #505060;
26
+ --sx-gray-400: #7A7A88;
27
+ --sx-gray-300: #A0A0AB;
28
+ --sx-gray-200: #C5C5CC;
29
+ --sx-gray-100: #E8E6E1;
30
+ --sx-white: #F0EEE8;
31
+
32
+ /* Accents — Vermilion (forge heat) */
33
+ --sx-vermilion-500: #FF6B35;
34
+ --sx-vermilion-400: #FF8C5A;
35
+ --sx-vermilion-600: #E05520;
36
+
37
+ /* Accents — Brass (earned authority) */
38
+ --sx-brass-500: #C8A84E;
39
+ --sx-brass-400: #D4B86A;
40
+ --sx-brass-600: #A68B3A;
41
+
42
+ /* Accents — Danger */
43
+ --sx-red-500: #DC2626;
44
+ --sx-red-400: #EF4444;
45
+ --sx-red-600: #B91C1C;
46
+
47
+ /* Accents — Phosphor (operational green) */
48
+ --sx-green-500: #4ADE80;
49
+ --sx-green-400: #6EE7A0;
50
+ --sx-green-600: #22C55E;
51
+
52
+ /* Accents — Teal (encrypted channel) */
53
+ --sx-teal-500: #3D8B8B;
54
+ --sx-teal-400: #5AABAB;
55
+ --sx-teal-600: #2D6B6B;
56
+
57
+ /* ========================================
58
+ SEMANTIC COLORS
59
+ Purpose-driven — use these in components
60
+ ======================================== */
61
+
62
+ /* Backgrounds */
63
+ --sx-color-base: var(--sx-gray-950);
64
+ --sx-color-surface: var(--sx-gray-900);
65
+ --sx-color-surface-2: var(--sx-gray-800);
66
+ --sx-color-surface-3: var(--sx-gray-700);
67
+
68
+ /* Text */
69
+ --sx-color-text: var(--sx-gray-100);
70
+ --sx-color-text-secondary: var(--sx-gray-400);
71
+ --sx-color-text-disabled: var(--sx-gray-500);
72
+ --sx-color-text-inverse: var(--sx-gray-950);
73
+
74
+ /* Borders */
75
+ --sx-color-border: rgba(255, 255, 255, 0.06);
76
+ --sx-color-border-strong: rgba(255, 255, 255, 0.12);
77
+ --sx-color-border-hover: rgba(255, 255, 255, 0.18);
78
+
79
+ /* Accents — semantic aliases */
80
+ --sx-color-primary: var(--sx-vermilion-500);
81
+ --sx-color-secondary: var(--sx-brass-500);
82
+ --sx-color-red: var(--sx-red-500);
83
+ --sx-color-green: var(--sx-green-500);
84
+ --sx-color-teal: var(--sx-teal-500);
85
+
86
+ /* Backward compat aliases — components referencing old names */
87
+ --sx-color-cyan: var(--sx-vermilion-500);
88
+ --sx-color-gold: var(--sx-brass-500);
89
+ --sx-color-purple: var(--sx-teal-500);
90
+
91
+ /* Semantic states */
92
+ --sx-color-success: var(--sx-green-500);
93
+ --sx-color-warning: var(--sx-brass-500);
94
+ --sx-color-error: var(--sx-red-500);
95
+ --sx-color-info: var(--sx-teal-500);
96
+
97
+ /* ========================================
98
+ GLASSMORPHISM
99
+ ======================================== */
100
+
101
+ --sx-glass-bg: rgba(15, 15, 20, 0.6);
102
+ --sx-glass-bg-strong: rgba(15, 15, 20, 0.85);
103
+ --sx-glass-border: 1px solid rgba(255, 255, 255, 0.06);
104
+ --sx-glass-blur: blur(16px);
105
+
106
+ /* ========================================
107
+ SHADOWS
12
108
  ======================================== */
13
109
 
14
- /* Primary Palette - Bold & Vibrant (not safe corporate colors) */
15
- --salmex-crown-yellow: 255 220 0; /* Basquiat's crown gold */
16
- --salmex-street-yellow: 230 180 0; /* Lighter golden yellow for light mode */
17
- --salmex-electric-blue: 0 112 255; /* Vibrant, not muted */
18
- --salmex-street-red: 237 28 36; /* Graffiti red */
19
- --salmex-midnight-black: 18 18 18; /* Deep black canvas */
20
- --salmex-chalk-white: 248 248 240; /* Slightly off-white, like canvas */
21
-
22
- /* Window Chrome - Rougher, Less Perfect */
23
- --salmex-window-surface: 230 225 210; /* Aged paper/canvas feel */
24
- --salmex-titlebar-bold: 0 90 200; /* Strong blue, less corporate */
25
- --salmex-frame-dark: 40 40 40; /* Dark frame, not gray */
26
-
27
- /* Button Face - Textured */
28
- --salmex-button-face: 235 230 215; /* Canvas-like surface */
29
- --salmex-button-shadow: 80 80 80; /* Stronger shadows */
30
- --salmex-button-dark-edge: 30 30 30; /* Bold dark edges */
31
- --salmex-button-highlight: 255 255 245; /* Bright highlights */
32
- --salmex-button-light: 210 205 190; /* Subtle mid-tone */
33
-
34
- /* Accent Colors - Neo-Expressionist */
35
- --salmex-graffiti-pink: 255 105 180; /* Hot pink */
36
- --salmex-spray-orange: 255 140 0; /* Bold orange */
37
- --salmex-urban-green: 50 205 50; /* Bright green */
38
- --salmex-neon-purple: 148 0 211; /* Deep purple */
39
-
40
- /* System Colors - Less Safe */
41
- --salmex-selection: 255 220 0; /* Crown yellow, not blue */
42
- --salmex-hover-layer: 255 220 0; /* Yellow hover */
110
+ --sx-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
111
+ --sx-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
112
+ --sx-shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5);
113
+ --sx-shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.6);
114
+ --sx-shadow-glow-primary: 0 0 20px rgba(255, 107, 53, 0.18);
115
+ --sx-shadow-glow-primary-strong: 0 0 30px rgba(255, 107, 53, 0.30);
116
+ --sx-shadow-glow-brass: 0 0 20px rgba(200, 168, 78, 0.15);
117
+ --sx-shadow-glow-red: 0 0 20px rgba(220, 38, 38, 0.15);
118
+ --sx-shadow-glow-green: 0 0 20px rgba(74, 222, 128, 0.15);
119
+ --sx-shadow-glow-teal: 0 0 20px rgba(61, 139, 139, 0.15);
120
+
121
+ /* Backward compat aliases */
122
+ --sx-shadow-glow-cyan: var(--sx-shadow-glow-primary);
123
+ --sx-shadow-glow-cyan-strong: var(--sx-shadow-glow-primary-strong);
124
+ --sx-shadow-glow-gold: var(--sx-shadow-glow-brass);
43
125
 
44
126
  /* ========================================
45
- MODERN ENHANCEMENTS
127
+ INTERACTION OVERLAYS
128
+ Translucent accents for hovers, highlights, backdrops
46
129
  ======================================== */
47
130
 
48
- /* Primary Brand */
49
- --salmex-primary: 0 112 255; /* Electric blue */
50
- --salmex-primary-light: 64 150 255;
51
- --salmex-primary-dark: 0 80 200;
52
-
53
- /* Semantic Colors */
54
- --salmex-success: 50 205 50;
55
- --salmex-warning: 255 140 0;
56
- --salmex-error: 237 28 36;
57
- --salmex-info: 0 112 255;
58
-
59
- /* Text Colors */
60
- --salmex-text-primary: 18 18 18;
61
- --salmex-text-secondary: 60 60 60;
62
- --salmex-text-disabled: 140 140 140;
63
- --salmex-text-inverse: 248 248 240;
64
-
65
- /* Background Colors */
66
- --salmex-bg-primary: 248 248 240;
67
- --salmex-bg-secondary: 235 230 215;
68
- --salmex-bg-tertiary: 220 215 200;
69
- --salmex-bg-canvas: 255 255 250; /* Raw canvas */
70
-
71
- /* Border Colors - Bolder */
72
- --salmex-border-default: 80 80 80;
73
- --salmex-border-light: 160 160 160;
74
- --salmex-border-dark: 30 30 30;
75
- --salmex-border-accent: 255 220 0; /* Yellow accent borders */
131
+ --sx-color-primary-subtle: rgba(255, 107, 53, 0.06);
132
+ --sx-color-primary-hover: rgba(255, 107, 53, 0.1);
133
+ --sx-color-primary-active: rgba(255, 107, 53, 0.15);
134
+ --sx-color-primary-ring: rgba(255, 107, 53, 0.1);
135
+ --sx-color-red-subtle: rgba(220, 38, 38, 0.06);
136
+ --sx-color-red-hover: rgba(220, 38, 38, 0.1);
137
+ --sx-color-red-ring: rgba(220, 38, 38, 0.1);
138
+ --sx-color-green-subtle: rgba(74, 222, 128, 0.06);
139
+ --sx-color-brass-subtle: rgba(200, 168, 78, 0.06);
140
+ --sx-color-teal-subtle: rgba(61, 139, 139, 0.12);
141
+ --sx-color-backdrop: rgba(8, 8, 12, 0.7);
142
+
143
+ /* Backward compat aliases */
144
+ --sx-color-cyan-subtle: var(--sx-color-primary-subtle);
145
+ --sx-color-cyan-hover: var(--sx-color-primary-hover);
146
+ --sx-color-cyan-active: var(--sx-color-primary-active);
147
+ --sx-color-cyan-ring: var(--sx-color-primary-ring);
148
+ --sx-color-gold-subtle: var(--sx-color-brass-subtle);
149
+ --sx-color-purple-subtle: var(--sx-color-teal-subtle);
76
150
 
77
151
  /* ========================================
78
- FOCUS INDICATORS - Yellow, visible in both themes
152
+ GRADIENTS
79
153
  ======================================== */
80
154
 
81
- /* Light: dark inner edge + yellow ring so yellow pops on light backgrounds */
82
- --salmex-focus-outline: none;
83
- --salmex-focus-offset: 0;
84
- --salmex-focus-style: dashed;
85
- --salmex-focus-ring: 0 0 0 2px rgb(var(--salmex-midnight-black)), 0 0 2px 4px
86
- rgb(var(--salmex-crown-yellow));
87
- /* Thicker dashed outline fallback for outline-only usage */
88
- --salmex-focus-outline-color: rgb(var(--salmex-crown-yellow));
89
- --salmex-focus-outline-width: 3px;
155
+ --sx-gradient-brand: linear-gradient(135deg, var(--sx-color-primary), var(--sx-color-secondary));
156
+ --sx-gradient-surface: linear-gradient(180deg, var(--sx-color-surface), var(--sx-color-base));
157
+ --sx-gradient-primary: linear-gradient(135deg, var(--sx-color-primary), var(--sx-vermilion-600));
158
+ --sx-gradient-overlay: linear-gradient(180deg, rgba(8, 8, 12, 0) 0%, rgba(8, 8, 12, 0.8) 100%);
159
+
160
+ /* Backward compat */
161
+ --sx-gradient-cyan: var(--sx-gradient-primary);
90
162
 
91
163
  /* ========================================
92
- SPACING (Slightly Irregular - 8px base but expressive)
164
+ TYPOGRAPHY
93
165
  ======================================== */
94
166
 
95
- --salmex-space-1: 4px;
96
- --salmex-space-2: 8px;
97
- --salmex-space-3: 12px;
98
- --salmex-space-4: 16px;
99
- --salmex-space-5: 20px;
100
- --salmex-space-6: 24px;
101
- --salmex-space-8: 32px;
102
- --salmex-space-10: 40px;
103
- --salmex-space-12: 48px;
167
+ --sx-font-body: 'TT Fors', system-ui, -apple-system, sans-serif;
168
+ --sx-font-display: 'TT Quaris', Georgia, 'Times New Roman', serif;
169
+ --sx-font-mono: 'JetBrains Mono', 'Consolas', 'Courier New', monospace;
170
+
171
+ --sx-text-xs: 0.75rem;
172
+ --sx-text-sm: 0.875rem;
173
+ --sx-text-base: 1rem;
174
+ --sx-text-md: 1.125rem;
175
+ --sx-text-lg: 1.25rem;
176
+ --sx-text-xl: 1.5rem;
177
+ --sx-text-2xl: 2rem;
178
+ --sx-text-display: 3rem;
179
+
180
+ --sx-leading-tight: 1.2;
181
+ --sx-leading-normal: 1.5;
182
+ --sx-leading-relaxed: 1.65;
183
+
184
+ --sx-tracking-tight: -0.02em;
185
+ --sx-tracking-normal: 0;
186
+ --sx-tracking-wide: 0.02em;
187
+ --sx-tracking-wider: 0.05em;
104
188
 
105
189
  /* ========================================
106
- TYPOGRAPHY - Win2K workhorse + Basquiat accents
190
+ SPACING
107
191
  ======================================== */
108
192
 
109
- /* Core UI / body – dense UI, labels, long sessions (Work Sans) */
110
- --salmex-font-system: "Work Sans", "Segoe UI", system-ui, sans-serif;
111
- /* Display / sci-system – logos, nav, title bars, large only (Space Grotesk) */
112
- --salmex-font-display: "Space Grotesk", "Impact", system-ui, sans-serif;
113
- /* Monospace – code, logs, debug panels (Roboto Mono) */
114
- --salmex-font-mono: "Roboto Mono", "Consolas", "Courier New", monospace;
115
- /* Accent – scribble labels, notes, decorative only (Caveat Brush) */
116
- --salmex-font-handwrite: "Caveat Brush", cursive;
117
-
118
- --salmex-font-size-xs: 11px;
119
- --salmex-font-size-sm: 13px;
120
- --salmex-font-size-base: 14px;
121
- --salmex-font-size-md: 15px;
122
- --salmex-font-size-lg: 18px;
123
- --salmex-font-size-xl: 24px;
124
- --salmex-font-size-display: 32px;
193
+ --sx-space-0: 0;
194
+ --sx-space-px: 1px;
195
+ --sx-space-0-5: 0.125rem;
196
+ --sx-space-1: 0.25rem;
197
+ --sx-space-1-5: 0.375rem;
198
+ --sx-space-2: 0.5rem;
199
+ --sx-space-2-5: 0.625rem;
200
+ --sx-space-3: 0.75rem;
201
+ --sx-space-4: 1rem;
202
+ --sx-space-5: 1.25rem;
203
+ --sx-space-6: 1.5rem;
204
+ --sx-space-8: 2rem;
205
+ --sx-space-10: 2.5rem;
206
+ --sx-space-12: 3rem;
207
+ --sx-space-16: 4rem;
208
+ --sx-space-20: 5rem;
209
+ --sx-space-24: 6rem;
125
210
 
126
211
  /* ========================================
127
- SHADOWS - Stronger, More Dramatic
212
+ BORDER RADIUS
128
213
  ======================================== */
129
214
 
130
- --salmex-shadow-sm: 2px 2px 1px rgb(var(--salmex-button-shadow));
131
- --salmex-shadow-md: 3px 3px 2px rgb(0 0 0 / 0.25);
132
- --salmex-shadow-lg: 4px 4px 3px rgb(0 0 0 / 0.3);
133
- --salmex-shadow-inset: inset 2px 2px 3px rgb(0 0 0 / 0.15);
215
+ --sx-radius-none: 0;
216
+ --sx-radius-sm: 6px;
217
+ --sx-radius-md: 10px;
218
+ --sx-radius-lg: 16px;
219
+ --sx-radius-xl: 24px;
220
+ --sx-radius-full: 9999px;
134
221
 
135
222
  /* ========================================
136
- BORDER RADIUS - Minimal but Slightly Imperfect
223
+ MOTION Durations
137
224
  ======================================== */
138
225
 
139
- --salmex-radius-none: 0;
140
- --salmex-radius-sm: 4px;
141
- --salmex-radius-md: 6px;
142
- --salmex-radius-lg: 10px;
143
- --salmex-radius-xl: 14px;
144
- --salmex-radius-rough: 0; /* Sharp edges, Basquiat style */
226
+ --sx-duration-instant: 100ms;
227
+ --sx-duration-fast: 150ms;
228
+ --sx-duration-base: 250ms;
229
+ --sx-duration-slow: 400ms;
230
+ --sx-duration-slower: 600ms;
145
231
 
146
232
  /* ========================================
147
- BORDER WIDTHS
233
+ MOTION — Easing curves
148
234
  ======================================== */
149
235
 
150
- --salmex-border-width-sm: 1px; /* inputs, badges, separators */
151
- --salmex-border-width-md: 2px; /* buttons, cards, panels */
152
- --salmex-border-width-lg: 3px; /* windows only */
236
+ --sx-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
237
+ --sx-ease-in: cubic-bezier(0.7, 0, 0.84, 0);
238
+ --sx-ease-in-out: cubic-bezier(0.45, 0, 0.55, 1);
239
+ --sx-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
153
240
 
154
241
  /* ========================================
155
- TRANSITIONS - Snappier, More Energetic
242
+ MOTION Transition shorthands
156
243
  ======================================== */
157
244
 
158
- --salmex-transition-fast: 100ms ease-out;
159
- --salmex-transition-base: 150ms ease-out;
160
- --salmex-transition-slow: 200ms ease-out;
245
+ --sx-transition-fast: 150ms ease;
246
+ --sx-transition-base: 250ms ease;
247
+ --sx-transition-slow: 400ms ease;
161
248
 
162
249
  /* ========================================
163
250
  Z-INDEX LAYERS
164
251
  ======================================== */
165
252
 
166
- --salmex-z-dropdown: 1000;
167
- --salmex-z-sticky: 1020;
168
- --salmex-z-fixed: 1030;
169
- --salmex-z-modal-backdrop: 1040;
170
- --salmex-z-modal: 1050;
171
- --salmex-z-popover: 1060;
172
- --salmex-z-tooltip: 1070;
253
+ --sx-z-base: 1;
254
+ --sx-z-dropdown: 1000;
255
+ --sx-z-sticky: 1020;
256
+ --sx-z-fixed: 1030;
257
+ --sx-z-modal-backdrop: 1040;
258
+ --sx-z-modal: 1050;
259
+ --sx-z-popover: 1060;
260
+ --sx-z-tooltip: 1070;
261
+ --sx-z-grain: 2000;
173
262
 
174
263
  /* ========================================
175
- BASQUIAT SIGNATURE ELEMENTS
264
+ ICON SIZES
265
+ Standardised sizes for Lucide (or any) icons
176
266
  ======================================== */
177
267
 
178
- --salmex-crown-symbol: "👑"; /* Basquiat's crown */
179
- --salmex-annotation-style: "handwrite";
180
- --salmex-texture-noise: 0.02; /* Slight texture/grain */
268
+ --sx-icon-xs: 14px;
269
+ --sx-icon-sm: 16px;
270
+ --sx-icon-md: 18px;
271
+ --sx-icon-lg: 20px;
272
+ --sx-icon-xl: 24px;
273
+ --sx-icon-stroke: 1.75;
181
274
  }
182
275
 
183
276
  /* ========================================
184
- DARK MODE (Street Art Night Mode)
277
+ GLOBAL RESETS
185
278
  ======================================== */
186
279
 
187
- [data-theme="dark"] {
188
- /* Neon on black - high contrast street art */
189
- --salmex-midnight-black: 10 10 10;
190
- --salmex-chalk-white: 255 255 255;
191
-
192
- /* Window chrome - darker canvas */
193
- --salmex-window-surface: 22 22 22;
194
- --salmex-titlebar-bold: 0 140 255; /* Brighter blue for dark mode */
195
- --salmex-button-face: 32 32 32;
196
- --salmex-button-shadow: 50 50 50;
197
- --salmex-button-dark-edge: 8 8 8;
198
- --salmex-button-highlight: 90 90 90;
199
- --salmex-button-light: 50 50 50;
200
-
201
- /* Text - high contrast */
202
- --salmex-text-primary: 255 255 255;
203
- --salmex-text-secondary: 200 200 200;
204
- --salmex-text-disabled: 100 100 100;
205
-
206
- /* Backgrounds - darker canvas */
207
- --salmex-bg-primary: 15 15 15;
208
- --salmex-bg-secondary: 22 22 22;
209
- --salmex-bg-tertiary: 32 32 32;
210
- --salmex-bg-canvas: 18 18 18;
211
-
212
- /* Borders - more visible */
213
- --salmex-border-default: 80 80 80;
214
- --salmex-border-light: 60 60 60;
215
- --salmex-border-dark: 120 120 120;
216
-
217
- /* Neon colors pop more in dark mode */
218
- --salmex-crown-yellow: 255 240 0; /* Brighter yellow */
219
- --salmex-electric-blue: 64 150 255; /* Lighter blue */
220
- --salmex-street-red: 255 50 50; /* Brighter red */
221
- --salmex-graffiti-pink: 255 120 200;
222
- --salmex-spray-orange: 255 160 40;
223
- --salmex-urban-green: 80 230 80;
224
- --salmex-neon-purple: 180 40 255;
225
-
226
- /* Primary colors adjusted */
227
- --salmex-primary: 64 150 255;
228
- --salmex-primary-light: 100 180 255;
229
- --salmex-primary-dark: 40 120 220;
230
-
231
- /* Selection/hover - neon yellow */
232
- --salmex-selection: 255 240 0;
233
- --salmex-hover-layer: 255 240 0;
234
-
235
- /* Focus - bright yellow ring (no dark edge needed on dark bg) */
236
- --salmex-focus-outline: 2px dashed rgb(var(--salmex-crown-yellow));
237
- --salmex-focus-ring: 0 0 2px 3px rgb(var(--salmex-crown-yellow));
238
- --salmex-focus-outline-color: rgb(var(--salmex-crown-yellow));
239
- --salmex-focus-outline-width: 3px;
280
+ *,
281
+ *::before,
282
+ *::after {
283
+ box-sizing: border-box;
240
284
  }
241
285
 
242
- @media (prefers-color-scheme: dark) {
243
- :root:not([data-theme="light"]) {
244
- /* Same as [data-theme='dark'] */
245
- --salmex-midnight-black: 10 10 10;
246
- --salmex-chalk-white: 255 255 255;
247
- --salmex-window-surface: 22 22 22;
248
- --salmex-titlebar-bold: 0 140 255;
249
- --salmex-button-face: 32 32 32;
250
- --salmex-button-shadow: 50 50 50;
251
- --salmex-button-dark-edge: 8 8 8;
252
- --salmex-button-highlight: 90 90 90;
253
- --salmex-button-light: 50 50 50;
254
- --salmex-text-primary: 255 255 255;
255
- --salmex-text-secondary: 200 200 200;
256
- --salmex-text-disabled: 100 100 100;
257
- --salmex-bg-primary: 15 15 15;
258
- --salmex-bg-secondary: 22 22 22;
259
- --salmex-bg-tertiary: 32 32 32;
260
- --salmex-bg-canvas: 18 18 18;
261
- --salmex-border-default: 80 80 80;
262
- --salmex-border-light: 60 60 60;
263
- --salmex-border-dark: 120 120 120;
264
- --salmex-crown-yellow: 255 240 0;
265
- --salmex-electric-blue: 64 150 255;
266
- --salmex-street-red: 255 50 50;
267
- --salmex-primary: 64 150 255;
268
- --salmex-primary-light: 100 180 255;
269
- --salmex-selection: 255 240 0;
270
- }
286
+ /* ========================================
287
+ FOCUS STATES — Vermilion outline, visible on dark
288
+ ======================================== */
289
+
290
+ :focus {
291
+ outline: none;
292
+ }
293
+
294
+ :focus-visible {
295
+ outline: 2px solid var(--sx-color-primary);
296
+ outline-offset: 2px;
271
297
  }
272
298
 
273
299
  /* ========================================
274
- GLOBAL RESETS & BASQUIAT TEXTURE
300
+ LUCIDE ICON DEFAULTS
301
+ Refined stroke weight for dark UI; Safari vector-effect fix
275
302
  ======================================== */
276
303
 
277
- *,
278
- *::before,
279
- *::after {
280
- box-sizing: border-box;
304
+ .lucide {
305
+ width: var(--sx-icon-md);
306
+ height: var(--sx-icon-md);
307
+ stroke-width: var(--sx-icon-stroke);
281
308
  }
282
309
 
283
- /* Add subtle canvas texture to body */
310
+ /* ========================================
311
+ AMBIENT BACKGROUND — Thermal signature
312
+ Barely-visible heat dissipation drifts slowly,
313
+ giving the base surface infrared life.
314
+ ======================================== */
315
+
284
316
  body {
285
- position: relative;
317
+ background-color: var(--sx-color-base);
318
+ background-image:
319
+ radial-gradient(ellipse at 15% 50%, rgba(255, 107, 53, 0.02) 0%, transparent 50%),
320
+ radial-gradient(ellipse at 85% 20%, rgba(200, 168, 78, 0.015) 0%, transparent 50%),
321
+ radial-gradient(ellipse at 50% 85%, rgba(61, 139, 139, 0.015) 0%, transparent 50%);
322
+ background-size: 200% 200%;
323
+ animation: sx-ambient-drift 25s ease-in-out infinite;
286
324
  }
287
325
 
288
- body::before {
289
- content: "";
290
- position: fixed;
291
- top: 0;
292
- left: 0;
293
- width: 100%;
294
- height: 100%;
295
- pointer-events: none;
296
- opacity: 0.015;
297
- background-image: repeating-linear-gradient(
298
- 0deg,
299
- transparent,
300
- transparent 2px,
301
- rgb(0 0 0 / 0.02) 2px,
302
- rgb(0 0 0 / 0.02) 4px
303
- );
304
- z-index: -1;
326
+ /* ========================================
327
+ SELECTION
328
+ ======================================== */
329
+
330
+ ::selection {
331
+ background: rgba(255, 107, 53, 0.25);
332
+ color: var(--sx-color-text);
305
333
  }
306
334
 
307
- /* Remove default focus styles - we'll add our own */
308
- :focus {
309
- outline: none;
335
+ /* ========================================
336
+ @property — GPU-accelerated gradient angles
337
+ Required for conic-gradient rotation animations.
338
+ Falls back gracefully: browsers without @property
339
+ see a static gradient (no rotation), which is fine.
340
+ ======================================== */
341
+
342
+ @property --sx-border-angle {
343
+ syntax: "<angle>";
344
+ initial-value: 0deg;
345
+ inherits: false;
310
346
  }
311
347
 
312
- /* Basquiat-style focus - single yellow ring; transition only (no keyframes = no double shadow) */
313
- :focus-visible {
314
- outline: none;
315
- box-shadow: var(--salmex-focus-ring);
316
- transition: box-shadow var(--salmex-transition-fast);
348
+ /* ========================================
349
+ GLOBAL KEYFRAMES
350
+ Shared animations used by multiple components.
351
+ Component-specific keyframes live in the component.
352
+ ======================================== */
353
+
354
+ @keyframes sx-border-flow {
355
+ to {
356
+ --sx-border-angle: 360deg;
357
+ }
358
+ }
359
+
360
+ @keyframes sx-ambient-drift {
361
+ 0% { background-position: 0% 50%; }
362
+ 50% { background-position: 100% 50%; }
363
+ 100% { background-position: 0% 50%; }
364
+ }
365
+
366
+ @keyframes sx-focus-breathe {
367
+ 0%, 100% { box-shadow: 0 0 0 3px rgba(255, 107, 53, 0.12); }
368
+ 50% { box-shadow: 0 0 0 3px rgba(255, 107, 53, 0.28); }
369
+ }
370
+
371
+ @keyframes sx-error-shake {
372
+ 0%, 100% { transform: translateX(0); }
373
+ 15% { transform: translateX(-4px); }
374
+ 30% { transform: translateX(4px); }
375
+ 45% { transform: translateX(-3px); }
376
+ 60% { transform: translateX(2px); }
377
+ 75% { transform: translateX(-1px); }
317
378
  }
318
379
 
319
- /* Light theme: dark edge + yellow in one clean ring */
320
- :root:not([data-theme="dark"]) :focus-visible {
321
- box-shadow: 0 0 0 2px rgb(var(--salmex-midnight-black)), 0 0 2px 4px rgb(var(--salmex-crown-yellow));
380
+ @keyframes sx-check-in {
381
+ from {
382
+ transform: scale(0.5);
383
+ opacity: 0;
384
+ }
385
+ to {
386
+ transform: scale(1);
387
+ opacity: 1;
388
+ }
322
389
  }
323
390
 
324
- /* Dark theme: yellow only with blur */
325
- [data-theme="dark"] :focus-visible {
326
- box-shadow: 0 0 2px 3px rgb(var(--salmex-crown-yellow));
391
+ @keyframes sx-badge-pop {
392
+ 0% { transform: scale(1); }
393
+ 40% { transform: scale(1.15); }
394
+ 100% { transform: scale(1); }
327
395
  }
328
396
 
329
- @media (prefers-color-scheme: dark) {
330
- :root:not([data-theme="light"]) :focus-visible {
331
- box-shadow: 0 0 2px 3px rgb(var(--salmex-crown-yellow));
397
+ @keyframes sx-alert-in {
398
+ from {
399
+ opacity: 0;
400
+ transform: translateY(-8px);
401
+ }
402
+ to {
403
+ opacity: 1;
404
+ transform: translateY(0);
332
405
  }
333
406
  }
334
407
 
@@ -345,8 +418,4 @@ body::before {
345
418
  transition-duration: 0.01ms !important;
346
419
  scroll-behavior: auto !important;
347
420
  }
348
-
349
- :focus-visible {
350
- transition: none;
351
- }
352
421
  }