@salmexio/ui 0.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 (82) hide show
  1. package/README.md +7 -0
  2. package/dist/app.html +11 -0
  3. package/dist/feedback/Alert/Alert.svelte +538 -0
  4. package/dist/feedback/Alert/Alert.svelte.d.ts +30 -0
  5. package/dist/feedback/Alert/Alert.svelte.d.ts.map +1 -0
  6. package/dist/feedback/Alert/index.d.ts +2 -0
  7. package/dist/feedback/Alert/index.d.ts.map +1 -0
  8. package/dist/feedback/Alert/index.js +1 -0
  9. package/dist/feedback/Spinner/Spinner.svelte +421 -0
  10. package/dist/feedback/Spinner/Spinner.svelte.d.ts +25 -0
  11. package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -0
  12. package/dist/feedback/Spinner/index.d.ts +2 -0
  13. package/dist/feedback/Spinner/index.d.ts.map +1 -0
  14. package/dist/feedback/Spinner/index.js +1 -0
  15. package/dist/feedback/index.d.ts +3 -0
  16. package/dist/feedback/index.d.ts.map +1 -0
  17. package/dist/feedback/index.js +2 -0
  18. package/dist/forms/TextInput/TextInput.svelte +576 -0
  19. package/dist/forms/TextInput/TextInput.svelte.d.ts +50 -0
  20. package/dist/forms/TextInput/TextInput.svelte.d.ts.map +1 -0
  21. package/dist/forms/TextInput/index.d.ts +2 -0
  22. package/dist/forms/TextInput/index.d.ts.map +1 -0
  23. package/dist/forms/TextInput/index.js +1 -0
  24. package/dist/forms/index.d.ts +2 -0
  25. package/dist/forms/index.d.ts.map +1 -0
  26. package/dist/forms/index.js +1 -0
  27. package/dist/index.d.ts +7 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +6 -0
  30. package/dist/layout/Card/Card.svelte +283 -0
  31. package/dist/layout/Card/Card.svelte.d.ts +35 -0
  32. package/dist/layout/Card/Card.svelte.d.ts.map +1 -0
  33. package/dist/layout/Card/index.d.ts +2 -0
  34. package/dist/layout/Card/index.d.ts.map +1 -0
  35. package/dist/layout/Card/index.js +1 -0
  36. package/dist/layout/Container/Container.svelte +202 -0
  37. package/dist/layout/Container/Container.svelte.d.ts +25 -0
  38. package/dist/layout/Container/Container.svelte.d.ts.map +1 -0
  39. package/dist/layout/Container/index.d.ts +2 -0
  40. package/dist/layout/Container/index.d.ts.map +1 -0
  41. package/dist/layout/Container/index.js +1 -0
  42. package/dist/layout/index.d.ts +3 -0
  43. package/dist/layout/index.d.ts.map +1 -0
  44. package/dist/layout/index.js +2 -0
  45. package/dist/navigation/Tabs/Tabs.svelte +448 -0
  46. package/dist/navigation/Tabs/Tabs.svelte.d.ts +59 -0
  47. package/dist/navigation/Tabs/Tabs.svelte.d.ts.map +1 -0
  48. package/dist/navigation/Tabs/index.d.ts +3 -0
  49. package/dist/navigation/Tabs/index.d.ts.map +1 -0
  50. package/dist/navigation/Tabs/index.js +1 -0
  51. package/dist/navigation/index.d.ts +3 -0
  52. package/dist/navigation/index.d.ts.map +1 -0
  53. package/dist/navigation/index.js +1 -0
  54. package/dist/primitives/Badge/Badge.svelte +351 -0
  55. package/dist/primitives/Badge/Badge.svelte.d.ts +35 -0
  56. package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -0
  57. package/dist/primitives/Badge/index.d.ts +2 -0
  58. package/dist/primitives/Badge/index.d.ts.map +1 -0
  59. package/dist/primitives/Badge/index.js +1 -0
  60. package/dist/primitives/Button/Button.svelte +383 -0
  61. package/dist/primitives/Button/Button.svelte.d.ts +47 -0
  62. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -0
  63. package/dist/primitives/Button/index.d.ts +2 -0
  64. package/dist/primitives/Button/index.d.ts.map +1 -0
  65. package/dist/primitives/Button/index.js +1 -0
  66. package/dist/primitives/index.d.ts +3 -0
  67. package/dist/primitives/index.d.ts.map +1 -0
  68. package/dist/primitives/index.js +2 -0
  69. package/dist/routes/+layout.svelte +5 -0
  70. package/dist/routes/+layout.svelte.d.ts +6 -0
  71. package/dist/routes/+layout.svelte.d.ts.map +1 -0
  72. package/dist/routes/+page.svelte +6 -0
  73. package/dist/routes/+page.svelte.d.ts +27 -0
  74. package/dist/routes/+page.svelte.d.ts.map +1 -0
  75. package/dist/styles/tokens.css +340 -0
  76. package/dist/utils/cn.d.ts +9 -0
  77. package/dist/utils/cn.d.ts.map +1 -0
  78. package/dist/utils/cn.js +29 -0
  79. package/dist/utils/index.d.ts +2 -0
  80. package/dist/utils/index.d.ts.map +1 -0
  81. package/dist/utils/index.js +1 -0
  82. package/package.json +84 -0
@@ -0,0 +1,351 @@
1
+ <!--
2
+ @component Badge
3
+
4
+ Win2K × Basquiat — Status badge for labels, counts, and states.
5
+ Bold borders, high contrast, role="status" for screen readers.
6
+
7
+ @example
8
+ <Badge status="success">Active</Badge>
9
+ <Badge status="warning" size="lg" dot />
10
+ -->
11
+ <script lang="ts">
12
+ import type { Snippet } from 'svelte';
13
+ import { cn } from '../../utils/cn.js';
14
+
15
+ type BadgeSize = 'sm' | 'md' | 'lg';
16
+ type BadgeStatus =
17
+ | 'neutral'
18
+ | 'primary'
19
+ | 'success'
20
+ | 'warning'
21
+ | 'error'
22
+ | 'info'
23
+ | 'outline';
24
+
25
+ interface Props {
26
+ /** Semantic status / variant */
27
+ status?: BadgeStatus;
28
+ /** Size */
29
+ size?: BadgeSize;
30
+ /** Pill shape (fully rounded) — we use minimal radius by default */
31
+ pill?: boolean;
32
+ /** Dot-only indicator (no text), use with aria-label for a11y */
33
+ dot?: boolean;
34
+ /** Optional icon before label */
35
+ icon?: Snippet;
36
+ /** Additional class names */
37
+ class?: string;
38
+ /** Badge content (ignored when dot) */
39
+ children?: Snippet;
40
+ /** Accessible label when dot (required when dot for a11y) */
41
+ 'aria-label'?: string;
42
+ }
43
+
44
+ let {
45
+ status = 'neutral',
46
+ size = 'md',
47
+ pill = false,
48
+ dot = false,
49
+ icon,
50
+ class: className = '',
51
+ children,
52
+ 'aria-label': ariaLabel
53
+ }: Props = $props();
54
+ </script>
55
+
56
+ {#if dot}
57
+ <span
58
+ class={cn(
59
+ 'salmex-badge',
60
+ 'salmex-badge-dot',
61
+ `salmex-badge-dot-${size}`,
62
+ `salmex-badge-${status}`,
63
+ className
64
+ )}
65
+ role="status"
66
+ aria-label={ariaLabel ?? status}
67
+ >
68
+ <span class="salmex-sr-only">{ariaLabel ?? status}</span>
69
+ </span>
70
+ {:else}
71
+ <span
72
+ class={cn(
73
+ 'salmex-badge',
74
+ `salmex-badge-${size}`,
75
+ `salmex-badge-${status}`,
76
+ pill && 'salmex-badge-pill',
77
+ status === 'primary' && 'salmex-badge-has-accent',
78
+ className
79
+ )}
80
+ role="status"
81
+ >
82
+ {#if icon}
83
+ <span class="salmex-badge-icon" aria-hidden="true">
84
+ {@render icon()}
85
+ </span>
86
+ {/if}
87
+ {#if children}
88
+ {@render children()}
89
+ {/if}
90
+ </span>
91
+ {/if}
92
+
93
+ <style>
94
+ /* Base — philosophy at small scale: flat shadow, bold border, no heavy bevel */
95
+ .salmex-badge {
96
+ display: inline-flex;
97
+ align-items: center;
98
+ gap: var(--salmex-space-1);
99
+ font-family: var(--salmex-font-system);
100
+ font-weight: 700;
101
+ text-transform: uppercase;
102
+ letter-spacing: 0.4px;
103
+ white-space: nowrap;
104
+ transition: box-shadow var(--salmex-transition-fast);
105
+ border: 2px solid transparent;
106
+ box-shadow: var(--salmex-shadow-sm);
107
+ }
108
+
109
+ .salmex-badge-pill {
110
+ border-radius: 9999px;
111
+ }
112
+
113
+ /* Stay sharp — minimal radius, Basquiat style */
114
+ .salmex-badge:not(.salmex-badge-pill) {
115
+ border-radius: var(--salmex-radius-none);
116
+ }
117
+
118
+ .salmex-badge-icon {
119
+ display: inline-flex;
120
+ flex-shrink: 0;
121
+ line-height: 0;
122
+ }
123
+
124
+ .salmex-badge-has-accent {
125
+ position: relative;
126
+ }
127
+
128
+ .salmex-sr-only {
129
+ position: absolute;
130
+ width: 1px;
131
+ height: 1px;
132
+ padding: 0;
133
+ margin: -1px;
134
+ overflow: hidden;
135
+ clip: rect(0, 0, 0, 0);
136
+ white-space: nowrap;
137
+ border: 0;
138
+ }
139
+
140
+ /* Sizes */
141
+ .salmex-badge-sm {
142
+ padding: 2px var(--salmex-space-2);
143
+ font-size: var(--salmex-font-size-xs);
144
+ }
145
+
146
+ .salmex-badge-md {
147
+ padding: 4px var(--salmex-space-3);
148
+ font-size: var(--salmex-font-size-xs);
149
+ }
150
+
151
+ .salmex-badge-lg {
152
+ padding: 6px var(--salmex-space-4);
153
+ font-size: var(--salmex-font-size-sm);
154
+ }
155
+
156
+ /* Dot */
157
+ .salmex-badge-dot {
158
+ padding: 0;
159
+ border-radius: 50%;
160
+ box-shadow: var(--salmex-shadow-sm);
161
+ }
162
+
163
+ .salmex-badge-dot-sm {
164
+ width: 8px;
165
+ height: 8px;
166
+ }
167
+
168
+ .salmex-badge-dot-md {
169
+ width: 10px;
170
+ height: 10px;
171
+ }
172
+
173
+ .salmex-badge-dot-lg {
174
+ width: 12px;
175
+ height: 12px;
176
+ }
177
+
178
+ /* Neutral — canvas/button face */
179
+ .salmex-badge-neutral {
180
+ background: rgb(var(--salmex-button-face));
181
+ color: rgb(var(--salmex-text-primary));
182
+ border-color: rgb(var(--salmex-border-dark));
183
+ }
184
+
185
+ .salmex-badge-dot.salmex-badge-neutral {
186
+ background: rgb(var(--salmex-text-secondary));
187
+ border: none;
188
+ box-shadow: var(--salmex-shadow-sm);
189
+ }
190
+
191
+ /* Primary — electric blue + thin crown yellow accent */
192
+ .salmex-badge-primary {
193
+ background: rgb(var(--salmex-electric-blue) / 0.18);
194
+ color: rgb(var(--salmex-electric-blue));
195
+ border-color: rgb(var(--salmex-electric-blue));
196
+ box-shadow: var(--salmex-shadow-sm);
197
+ }
198
+
199
+ .salmex-badge-primary::after {
200
+ content: '';
201
+ position: absolute;
202
+ bottom: 0;
203
+ left: 12%;
204
+ width: 76%;
205
+ height: 1px;
206
+ background: rgb(var(--salmex-crown-yellow));
207
+ opacity: 0.85;
208
+ }
209
+
210
+ .salmex-badge-dot.salmex-badge-primary {
211
+ background: rgb(var(--salmex-electric-blue));
212
+ border: none;
213
+ box-shadow: var(--salmex-shadow-sm);
214
+ }
215
+
216
+ :global([data-theme='dark']) .salmex-badge-primary {
217
+ background: rgb(var(--salmex-primary-light) / 0.25);
218
+ color: rgb(var(--salmex-primary-light));
219
+ border-color: rgb(var(--salmex-primary-light));
220
+ box-shadow: var(--salmex-shadow-sm);
221
+ }
222
+
223
+ :global([data-theme='dark']) .salmex-badge-primary::after {
224
+ background: rgb(var(--salmex-crown-yellow));
225
+ opacity: 0.9;
226
+ }
227
+
228
+ :global([data-theme='dark']) .salmex-badge-dot.salmex-badge-primary {
229
+ background: rgb(var(--salmex-primary-light));
230
+ }
231
+
232
+ /* Success — deep green, flat */
233
+ .salmex-badge-success {
234
+ background: rgb(30 115 65 / 0.2);
235
+ color: rgb(25 95 55);
236
+ border-color: rgb(25 95 55);
237
+ box-shadow: var(--salmex-shadow-sm);
238
+ }
239
+
240
+ .salmex-badge-dot.salmex-badge-success {
241
+ background: rgb(25 95 55);
242
+ border: none;
243
+ box-shadow: var(--salmex-shadow-sm);
244
+ }
245
+
246
+ :global([data-theme='dark']) .salmex-badge-success {
247
+ background: rgb(var(--salmex-urban-green) / 0.2);
248
+ color: rgb(var(--salmex-urban-green));
249
+ border-color: rgb(var(--salmex-urban-green));
250
+ }
251
+
252
+ :global([data-theme='dark']) .salmex-badge-dot.salmex-badge-success {
253
+ background: rgb(var(--salmex-urban-green));
254
+ }
255
+
256
+ @media (prefers-color-scheme: dark) {
257
+ :global(:root:not([data-theme='light'])) .salmex-badge-success {
258
+ background: rgb(var(--salmex-urban-green) / 0.2);
259
+ color: rgb(var(--salmex-urban-green));
260
+ border-color: rgb(var(--salmex-urban-green));
261
+ }
262
+
263
+ :global(:root:not([data-theme='light'])) .salmex-badge-dot.salmex-badge-success {
264
+ background: rgb(var(--salmex-urban-green));
265
+ }
266
+ }
267
+
268
+ /* Warning — deep amber, flat */
269
+ .salmex-badge-warning {
270
+ background: rgb(185 95 15 / 0.22);
271
+ color: rgb(145 75 10);
272
+ border-color: rgb(145 75 10);
273
+ box-shadow: var(--salmex-shadow-sm);
274
+ }
275
+
276
+ .salmex-badge-dot.salmex-badge-warning {
277
+ background: rgb(145 75 10);
278
+ border: none;
279
+ box-shadow: var(--salmex-shadow-sm);
280
+ }
281
+
282
+ :global([data-theme='dark']) .salmex-badge-warning {
283
+ background: rgb(var(--salmex-spray-orange) / 0.2);
284
+ color: rgb(var(--salmex-spray-orange));
285
+ border-color: rgb(var(--salmex-spray-orange));
286
+ }
287
+
288
+ :global([data-theme='dark']) .salmex-badge-dot.salmex-badge-warning {
289
+ background: rgb(var(--salmex-spray-orange));
290
+ }
291
+
292
+ @media (prefers-color-scheme: dark) {
293
+ :global(:root:not([data-theme='light'])) .salmex-badge-warning {
294
+ background: rgb(var(--salmex-spray-orange) / 0.2);
295
+ color: rgb(var(--salmex-spray-orange));
296
+ border-color: rgb(var(--salmex-spray-orange));
297
+ }
298
+
299
+ :global(:root:not([data-theme='light'])) .salmex-badge-dot.salmex-badge-warning {
300
+ background: rgb(var(--salmex-spray-orange));
301
+ }
302
+ }
303
+
304
+ /* Error — street red, flat */
305
+ .salmex-badge-error {
306
+ background: rgb(var(--salmex-street-red) / 0.18);
307
+ color: rgb(var(--salmex-street-red));
308
+ border-color: rgb(var(--salmex-street-red));
309
+ box-shadow: var(--salmex-shadow-sm);
310
+ }
311
+
312
+ .salmex-badge-dot.salmex-badge-error {
313
+ background: rgb(var(--salmex-street-red));
314
+ border: none;
315
+ box-shadow: var(--salmex-shadow-sm);
316
+ }
317
+
318
+ /* Info — electric blue, flat */
319
+ .salmex-badge-info {
320
+ background: rgb(var(--salmex-info) / 0.18);
321
+ color: rgb(var(--salmex-info));
322
+ border-color: rgb(var(--salmex-info));
323
+ box-shadow: var(--salmex-shadow-sm);
324
+ }
325
+
326
+ .salmex-badge-dot.salmex-badge-info {
327
+ background: rgb(var(--salmex-info));
328
+ border: none;
329
+ box-shadow: var(--salmex-shadow-sm);
330
+ }
331
+
332
+ /* Outline — transparent, bold border, no inset (flat) */
333
+ .salmex-badge-outline {
334
+ background: rgb(var(--salmex-button-face) / 0.5);
335
+ color: rgb(var(--salmex-text-primary));
336
+ border-color: rgb(var(--salmex-border-dark));
337
+ box-shadow: var(--salmex-shadow-sm);
338
+ }
339
+
340
+ .salmex-badge-dot.salmex-badge-outline {
341
+ background: rgb(var(--salmex-border-default));
342
+ border: none;
343
+ box-shadow: var(--salmex-shadow-sm);
344
+ }
345
+
346
+ @media (prefers-reduced-motion: reduce) {
347
+ .salmex-badge {
348
+ transition: none;
349
+ }
350
+ }
351
+ </style>
@@ -0,0 +1,35 @@
1
+ import type { Snippet } from 'svelte';
2
+ type BadgeSize = 'sm' | 'md' | 'lg';
3
+ type BadgeStatus = 'neutral' | 'primary' | 'success' | 'warning' | 'error' | 'info' | 'outline';
4
+ interface Props {
5
+ /** Semantic status / variant */
6
+ status?: BadgeStatus;
7
+ /** Size */
8
+ size?: BadgeSize;
9
+ /** Pill shape (fully rounded) — we use minimal radius by default */
10
+ pill?: boolean;
11
+ /** Dot-only indicator (no text), use with aria-label for a11y */
12
+ dot?: boolean;
13
+ /** Optional icon before label */
14
+ icon?: Snippet;
15
+ /** Additional class names */
16
+ class?: string;
17
+ /** Badge content (ignored when dot) */
18
+ children?: Snippet;
19
+ /** Accessible label when dot (required when dot for a11y) */
20
+ 'aria-label'?: string;
21
+ }
22
+ /**
23
+ * Badge
24
+ *
25
+ * Win2K × Basquiat — Status badge for labels, counts, and states.
26
+ * Bold borders, high contrast, role="status" for screen readers.
27
+ *
28
+ * @example
29
+ * <Badge status="success">Active</Badge>
30
+ * <Badge status="warning" size="lg" dot />
31
+ */
32
+ declare const Badge: import("svelte").Component<Props, {}, "">;
33
+ type Badge = ReturnType<typeof Badge>;
34
+ export default Badge;
35
+ //# sourceMappingURL=Badge.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.svelte.d.ts","sourceRoot":"","sources":["../../../src/primitives/Badge/Badge.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIrC,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACpC,KAAK,WAAW,GACb,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,OAAO,GACP,MAAM,GACN,SAAS,CAAC;AAEb,UAAU,KAAK;IACd,gCAAgC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW;IACX,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAuDF;;;;;;;;;GASG;AACH,QAAA,MAAM,KAAK,2CAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as Badge } from './Badge.svelte';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitives/Badge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { default as Badge } from './Badge.svelte';