@jinaan/uikit 0.0.0-stage → 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 (89) hide show
  1. package/README.md +63 -2
  2. package/dist/agent-prompt.d.ts +16 -0
  3. package/dist/agent-prompt.d.ts.map +1 -0
  4. package/dist/avatar.d.ts +5 -0
  5. package/dist/avatar.d.ts.map +1 -0
  6. package/dist/badge.d.ts +11 -0
  7. package/dist/badge.d.ts.map +1 -0
  8. package/dist/button.d.ts +22 -0
  9. package/dist/button.d.ts.map +1 -0
  10. package/dist/callout.d.ts +12 -0
  11. package/dist/callout.d.ts.map +1 -0
  12. package/dist/card.d.ts +8 -0
  13. package/dist/card.d.ts.map +1 -0
  14. package/dist/checkbox.d.ts +3 -0
  15. package/dist/checkbox.d.ts.map +1 -0
  16. package/dist/choice-dialog.d.ts +34 -0
  17. package/dist/choice-dialog.d.ts.map +1 -0
  18. package/dist/code-block.d.ts +11 -0
  19. package/dist/code-block.d.ts.map +1 -0
  20. package/dist/data-table.d.ts +84 -0
  21. package/dist/data-table.d.ts.map +1 -0
  22. package/dist/dialog.d.ts +19 -0
  23. package/dist/dialog.d.ts.map +1 -0
  24. package/dist/dropdown-menu.d.ts +13 -0
  25. package/dist/dropdown-menu.d.ts.map +1 -0
  26. package/dist/empty-state.d.ts +11 -0
  27. package/dist/empty-state.d.ts.map +1 -0
  28. package/dist/index.d.ts +27 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +1522 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/input.d.ts +19 -0
  33. package/dist/input.d.ts.map +1 -0
  34. package/dist/kbd.d.ts +4 -0
  35. package/dist/kbd.d.ts.map +1 -0
  36. package/dist/label.d.ts +3 -0
  37. package/dist/label.d.ts.map +1 -0
  38. package/dist/radio-group.d.ts +35 -0
  39. package/dist/radio-group.d.ts.map +1 -0
  40. package/dist/segmented.d.ts +22 -0
  41. package/dist/segmented.d.ts.map +1 -0
  42. package/dist/select.d.ts +9 -0
  43. package/dist/select.d.ts.map +1 -0
  44. package/dist/separator.d.ts +3 -0
  45. package/dist/separator.d.ts.map +1 -0
  46. package/dist/skeleton.d.ts +3 -0
  47. package/dist/skeleton.d.ts.map +1 -0
  48. package/dist/spinner.d.ts +4 -0
  49. package/dist/spinner.d.ts.map +1 -0
  50. package/dist/table-empty-state.d.ts +15 -0
  51. package/dist/table-empty-state.d.ts.map +1 -0
  52. package/dist/table-surface.d.ts +38 -0
  53. package/dist/table-surface.d.ts.map +1 -0
  54. package/dist/table.d.ts +15 -0
  55. package/dist/table.d.ts.map +1 -0
  56. package/dist/tooltip.d.ts +6 -0
  57. package/dist/tooltip.d.ts.map +1 -0
  58. package/dist/utils.d.ts +4 -0
  59. package/dist/utils.d.ts.map +1 -0
  60. package/package.json +73 -4
  61. package/src/agent-prompt.tsx +60 -0
  62. package/src/avatar.tsx +46 -0
  63. package/src/badge.tsx +54 -0
  64. package/src/button.tsx +126 -0
  65. package/src/callout.tsx +74 -0
  66. package/src/card.tsx +61 -0
  67. package/src/checkbox.tsx +32 -0
  68. package/src/choice-dialog.tsx +110 -0
  69. package/src/code-block.tsx +53 -0
  70. package/src/data-table.tsx +589 -0
  71. package/src/dialog.tsx +123 -0
  72. package/src/dropdown-menu.tsx +103 -0
  73. package/src/empty-state.tsx +35 -0
  74. package/src/index.ts +26 -0
  75. package/src/input.tsx +171 -0
  76. package/src/kbd.tsx +16 -0
  77. package/src/label.tsx +19 -0
  78. package/src/radio-group.tsx +134 -0
  79. package/src/segmented.tsx +76 -0
  80. package/src/select.tsx +91 -0
  81. package/src/separator.tsx +22 -0
  82. package/src/skeleton.tsx +12 -0
  83. package/src/spinner.tsx +13 -0
  84. package/src/table-empty-state.tsx +51 -0
  85. package/src/table-surface.tsx +122 -0
  86. package/src/table.tsx +91 -0
  87. package/src/tooltip.tsx +32 -0
  88. package/src/utils.ts +7 -0
  89. package/styles.css +371 -0
package/styles.css ADDED
@@ -0,0 +1,371 @@
1
+ @import "tw-animate-css";
2
+
3
+ @source "./src";
4
+
5
+ /* Class-based dark mode (toggled on <html class="dark">). */
6
+ @custom-variant dark (&:where(.dark, .dark *));
7
+
8
+ /*
9
+ * Semantic design tokens. Components must reference these (via the Tailwind
10
+ * utilities below) rather than raw palette values, so both themes stay correct.
11
+ * Values mirror the Clerk "Ceramic" system captured in docs/design-reference.md.
12
+ */
13
+ :root {
14
+ --canvas: #fafafb;
15
+ --surface: #ffffff;
16
+ --elevated: #f6f6f7;
17
+ --fg: #131316;
18
+ --fg-muted: #5f5f6f;
19
+ --fg-subtle: #90909d;
20
+ --line: #e3e3e7;
21
+ --line-strong: #c7c7cf;
22
+ --primary: #6c47ff;
23
+ --primary-hover: #5f15fe;
24
+ --primary-fg: #ffffff;
25
+ --success: #15892b;
26
+ --warning: #c3540f;
27
+ --error: #e02e2e;
28
+ --info: #236dd7;
29
+ --focus: #6c47ff;
30
+ --overlay: rgb(19 19 22 / 0.45);
31
+ /* Sidebar navigation surfaces: a visible highlight in both themes. */
32
+ --nav-hover: #f6f6f7;
33
+ --nav-active: #ececee;
34
+ --nav-active-fg: var(--fg);
35
+ --nav-accent: var(--primary);
36
+
37
+ --shadow-xs: 0 1px 2px 0 rgb(19 19 22 / 0.05);
38
+ --shadow-sm: 0 1px 3px 0 rgb(19 19 22 / 0.08), 0 1px 2px -1px rgb(19 19 22 / 0.08);
39
+ --shadow-md: 0 4px 12px -2px rgb(19 19 22 / 0.1);
40
+ --shadow-lg: 0 16px 40px -12px rgb(19 19 22 / 0.18);
41
+
42
+ /* Data tables: header band is the darkest layer, the body panel sits above it
43
+ and the page is lighter than the header. */
44
+ --table-container-bg: #f1f1f3;
45
+ --table-panel-bg: #ffffff;
46
+ --table-panel-border: #e3e3e7;
47
+ --table-header-text: #5f5f6f;
48
+ --table-header-active-text: #131316;
49
+ --table-row-text: #131316;
50
+ --table-muted-text: #5f5f6f;
51
+ --table-empty-icon-bg: #f6f6f7;
52
+ --table-empty-icon-border: #e3e3e7;
53
+ --table-row-hover: #f6f6f7;
54
+ --table-row-selected: #ececee;
55
+ --table-accent: var(--primary);
56
+ /* Table geometry (theme-independent). */
57
+ --table-radius-outer: 1.5rem;
58
+ --table-radius-panel: 1.25rem;
59
+ --table-header-h: 2.75rem;
60
+ --table-pad-x: 1.5rem;
61
+ --table-inset: 0.375rem;
62
+ --table-empty-icon: 5rem;
63
+
64
+ /* Control system: shared sizing for Button and Input. */
65
+ --control-h-xs: 1.75rem;
66
+ --control-h-sm: 2rem;
67
+ --control-h-md: 2.25rem;
68
+ --control-h-lg: 2.5rem;
69
+ --control-h-xl: 4rem;
70
+ --control-radius: 0.625rem;
71
+ --control-radius-xl: 0.75rem;
72
+ --control-pad-x-xs: 0.625rem;
73
+ --control-pad-x-sm: 0.75rem;
74
+ --control-pad-x-md: 1rem;
75
+ --control-pad-x-lg: 1.25rem;
76
+ --control-pad-x-xl: 1.375rem;
77
+ --control-icon-xs: 0.75rem;
78
+ --control-icon-sm: 0.875rem;
79
+ --control-icon-md: 1rem;
80
+ --control-icon-lg: 1.125rem;
81
+ --control-icon-xl: 1.5rem;
82
+ --control-gap-xs: 0.375rem;
83
+ --control-gap: 0.5rem;
84
+
85
+ /* Input surfaces. */
86
+ --input-bg: #ffffff;
87
+ --input-fg: #131316;
88
+ --input-placeholder: #90909d;
89
+ --input-border: #e3e3e7;
90
+ --input-border-hover: #c7c7cf;
91
+ --input-border-focus: var(--primary);
92
+ --input-bg-disabled: #f6f6f7;
93
+
94
+ /* Button surfaces. */
95
+ --button-primary-bg: var(--primary);
96
+ --button-primary-fg: var(--primary-fg);
97
+ --button-primary-hover: var(--primary-hover);
98
+ --button-primary-active: #4a10d9;
99
+ --button-secondary-bg: color-mix(in oklab, #f1f1f3 95%, black);
100
+ --button-secondary-border: #e3e3e7;
101
+ --button-secondary-hover: color-mix(in oklab, #e9e9ec 95%, black);
102
+ --button-outline-border: #d4d4d8;
103
+ --button-outline-hover: #f1f1f3;
104
+ /* Interactive (hover/pressed) surface shared by secondary, outline, ghost. */
105
+ --button-surface-hover: #f1f1f3;
106
+ --button-surface-active: #e9e9ec;
107
+ --button-ghost-hover: var(--button-surface-hover);
108
+ --button-destructive-bg: var(--error);
109
+ --button-destructive-fg: #ffffff;
110
+ /* Destructive keeps its red identity; hover/pressed are red-shifted. */
111
+ --button-destructive-hover: color-mix(in oklab, var(--error) 88%, black);
112
+ --button-destructive-active: color-mix(in oklab, var(--error) 78%, black);
113
+ /* Filled buttons: flat surface + inset gloss + soft drop (Clerk). */
114
+ --button-inner: rgb(255 255 255 / 0.45);
115
+ /* Primary and destructive read their own, stronger top gloss. */
116
+ --button-primary-inner: rgb(255 255 255 / 0.5);
117
+ --button-destructive-inner: rgb(255 255 255 / 0.5);
118
+ --button-drop: 0 4px 4px -2px rgb(0 0 0 / 0.1);
119
+ --button-drop-pressed: 0 2.5px 4px -2px rgb(0 0 0 / 0.08);
120
+
121
+ /* Dialog surfaces: a soft shell with an elevated inner panel. */
122
+ --dialog-shell-bg: #f4f4f5;
123
+ --dialog-shell-border: #e3e3e7;
124
+ --dialog-shell-shadow: 0 24px 64px -24px rgb(19 19 22 / 0.28);
125
+ --dialog-panel-bg: #ffffff;
126
+ --dialog-panel-border: #e9e9ec;
127
+ --dialog-panel-shadow:
128
+ 0 1px 2px rgb(19 19 22 / 0.06),
129
+ 0 10px 28px -14px rgb(19 19 22 / 0.2);
130
+
131
+ /* Third-party brand marks (identity providers). */
132
+ --brand-google-blue: #4285f4;
133
+ --brand-google-green: #34a853;
134
+ --brand-google-yellow: #fbbc05;
135
+ --brand-google-red: #ea4335;
136
+ --brand-microsoft-red: #f25022;
137
+ --brand-microsoft-green: #7fba00;
138
+ --brand-microsoft-blue: #00a4ef;
139
+ --brand-microsoft-yellow: #ffb900;
140
+ }
141
+
142
+ .dark {
143
+ --canvas: #131316;
144
+ --surface: #1b1b1f;
145
+ --elevated: #232328;
146
+ --fg: #fcfcfc;
147
+ --fg-muted: #adadb7;
148
+ --fg-subtle: #767684;
149
+ --line: #2b2b34;
150
+ --line-strong: #3d3d4a;
151
+ --primary: #6c47ff;
152
+ --primary-hover: #846bff;
153
+ --primary-fg: #ffffff;
154
+ --success: #31c854;
155
+ --warning: #fd7224;
156
+ --error: #f73d3d;
157
+ --info: #6694f8;
158
+ --focus: #846bff;
159
+ --overlay: rgb(0 0 0 / 0.6);
160
+ --nav-hover: #232328;
161
+ --nav-active: #2b2b34;
162
+ --nav-active-fg: var(--fg);
163
+ --nav-accent: var(--primary);
164
+
165
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.4);
166
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.5);
167
+ --shadow-md: 0 4px 12px -2px rgb(0 0 0 / 0.55);
168
+ --shadow-lg: 0 16px 40px -12px rgb(0 0 0 / 0.65);
169
+
170
+ /* Data tables: header band (#0a0a0b) is darker than the page canvas
171
+ (#131316); the body panel (#1b1b1f) is lighter than both. */
172
+ --table-container-bg: #0a0a0b;
173
+ --table-panel-bg: #1b1b1f;
174
+ --table-panel-border: #2b2b34;
175
+ --table-header-text: #a1a1aa;
176
+ --table-header-active-text: #f4f4f5;
177
+ --table-row-text: #f4f4f5;
178
+ --table-muted-text: #a1a1aa;
179
+ --table-empty-icon-bg: #232328;
180
+ --table-empty-icon-border: #373840;
181
+ --table-row-hover: #232328;
182
+ --table-row-selected: #2b2b34;
183
+ --table-accent: var(--primary);
184
+
185
+ /* Control system overrides (dark) — surfaces match the Clerk dashboard. */
186
+ --input-bg: #30303a;
187
+ --input-fg: #f4f4f5;
188
+ --input-placeholder: #777783;
189
+ --input-border: #41414d;
190
+ --input-border-hover: #4d4d5a;
191
+ --input-border-focus: var(--primary-hover);
192
+ --input-bg-disabled: #26262c;
193
+
194
+ --button-primary-bg: var(--primary);
195
+ --button-primary-fg: var(--primary-fg);
196
+ --button-primary-hover: var(--primary-hover);
197
+ --button-primary-active: #5f15fe;
198
+ --button-secondary-bg: #30303a;
199
+ --button-secondary-border: #41414d;
200
+ --button-secondary-hover: #3a3a45;
201
+ --button-outline-border: #41414d;
202
+ --button-outline-hover: #30303a;
203
+ /* Interactive (hover/pressed) surface shared by secondary, outline, ghost. */
204
+ --button-surface-hover: #3a3a45;
205
+ --button-surface-active: #30303a;
206
+ --button-ghost-hover: var(--button-surface-hover);
207
+ --button-destructive-bg: var(--error);
208
+ --button-destructive-fg: #ffffff;
209
+ --button-inner: rgb(255 255 255 / 0.12);
210
+ --button-primary-inner: rgb(255 255 255 / 0.26);
211
+ --button-destructive-inner: rgb(255 255 255 / 0.26);
212
+ --button-drop: 0 4px 4px -2px rgb(0 0 0 / 0.24);
213
+ --button-drop-pressed: 0 2.5px 4px -2px rgb(0 0 0 / 0.24);
214
+
215
+ /* Dialog surfaces (dark): near-black shell, elevated charcoal panel. */
216
+ --dialog-shell-bg: #131316;
217
+ --dialog-shell-border: #2b2b34;
218
+ --dialog-shell-shadow: 0 32px 80px -28px rgb(0 0 0 / 0.7);
219
+ --dialog-panel-bg: #1e1e23;
220
+ --dialog-panel-border: #2f2f38;
221
+ --dialog-panel-shadow:
222
+ inset 0 1px 0 rgb(255 255 255 / 0.04),
223
+ 0 12px 32px -16px rgb(0 0 0 / 0.6);
224
+ }
225
+
226
+ @theme inline {
227
+ --color-canvas: var(--canvas);
228
+ --color-surface: var(--surface);
229
+ --color-elevated: var(--elevated);
230
+ --color-fg: var(--fg);
231
+ --color-muted: var(--fg-muted);
232
+ --color-subtle: var(--fg-subtle);
233
+ --color-line: var(--line);
234
+ --color-line-strong: var(--line-strong);
235
+ --color-primary: var(--primary);
236
+ --color-primary-hover: var(--primary-hover);
237
+ --color-primary-fg: var(--primary-fg);
238
+ --color-success: var(--success);
239
+ --color-warning: var(--warning);
240
+ --color-error: var(--error);
241
+ --color-info: var(--info);
242
+ --color-focus: var(--focus);
243
+ --color-overlay: var(--overlay);
244
+ --color-nav-hover: var(--nav-hover);
245
+ --color-nav-active: var(--nav-active);
246
+ --color-nav-active-fg: var(--nav-active-fg);
247
+ --color-nav-accent: var(--nav-accent);
248
+
249
+ --font-sans: "Suisse Intl", "Suisse Intl Fallback", ui-sans-serif, system-ui,
250
+ -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
251
+ --font-display: "Suisse Intl", "Suisse Intl Fallback", ui-sans-serif, system-ui,
252
+ -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
253
+ --font-mono: "Söhne Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo,
254
+ Consolas, monospace;
255
+
256
+ --radius-xs: 0.125rem;
257
+ --radius-sm: 0.25rem;
258
+ --radius-md: 0.5rem;
259
+ --radius-lg: 0.625rem;
260
+ --radius-xl: 0.75rem;
261
+ --radius-2xl: 0.875rem;
262
+ --radius-3xl: 1rem;
263
+ --radius-4xl: 2rem;
264
+ --radius-card: 0.75rem;
265
+
266
+ --shadow-xs: var(--shadow-xs);
267
+ --shadow-sm: var(--shadow-sm);
268
+ --shadow-md: var(--shadow-md);
269
+ --shadow-lg: var(--shadow-lg);
270
+
271
+ --color-table-container: var(--table-container-bg);
272
+ --color-table-panel: var(--table-panel-bg);
273
+ --color-table-panel-border: var(--table-panel-border);
274
+ --color-table-header: var(--table-header-text);
275
+ --color-table-header-active: var(--table-header-active-text);
276
+ --color-table-row: var(--table-row-text);
277
+ --color-table-muted: var(--table-muted-text);
278
+ --color-table-empty-icon: var(--table-empty-icon-bg);
279
+ --color-table-empty-icon-border: var(--table-empty-icon-border);
280
+ --color-table-row-hover: var(--table-row-hover);
281
+ --color-table-row-selected: var(--table-row-selected);
282
+ --color-table-accent: var(--table-accent);
283
+ }
284
+
285
+ @utility font-numeric {
286
+ font-family: var(--font-sans);
287
+ font-variant-numeric: tabular-nums;
288
+ }
289
+
290
+ @layer components {
291
+ /*
292
+ * Filled control surface: a soft blurred drop plus a 1px inset top gloss
293
+ * (matches the Clerk dashboard buttons). The Tailwind focus ring replaces
294
+ * this shadow while focused.
295
+ */
296
+ .btn-fill {
297
+ box-shadow:
298
+ var(--button-drop),
299
+ inset 0 1px 0.5px 0 var(--button-inner),
300
+ inset 0 0 0 1px var(--button-inner-border, transparent);
301
+ }
302
+ .btn-fill:active {
303
+ box-shadow:
304
+ var(--button-drop-pressed),
305
+ inset 0 1px 0.5px 0 var(--button-inner),
306
+ inset 0 0 0 1px var(--button-inner-border, transparent);
307
+ }
308
+
309
+ /*
310
+ * Light-theme definition for filled buttons: a subtle inset hairline keeps
311
+ * the surface readable on white, where a white gloss has no contrast.
312
+ */
313
+ .btn-inner-border {
314
+ --button-inner-border: color-mix(in oklab, var(--fg) 12%, transparent);
315
+ }
316
+ .dark .btn-inner-border {
317
+ --button-inner-border: transparent;
318
+ }
319
+
320
+ /*
321
+ * Shared hover/press treatment (secondary, outline, ghost): the surface
322
+ * colour is applied with utilities; here we add the gloss and the drop,
323
+ * swapping to the pressed drop on activation.
324
+ */
325
+ .btn-interactive {
326
+ transition:
327
+ color 120ms ease,
328
+ background-color 120ms ease,
329
+ box-shadow 120ms ease;
330
+ }
331
+ .btn-interactive:hover,
332
+ .btn-interactive:active {
333
+ color: var(--fg);
334
+ box-shadow:
335
+ var(--button-drop),
336
+ inset 0 1px 0.5px 0 var(--button-inner),
337
+ inset 0 0 0 1px var(--button-inner-border, transparent);
338
+ }
339
+ .btn-interactive:active {
340
+ box-shadow:
341
+ var(--button-drop-pressed),
342
+ inset 0 1px 0.5px 0 var(--button-inner),
343
+ inset 0 0 0 1px var(--button-inner-border, transparent);
344
+ }
345
+
346
+ /* Fluid display scale for marketing headlines (Suisse Bold, tight). */
347
+ .text-display {
348
+ font-family: var(--font-display);
349
+ font-weight: 700;
350
+ letter-spacing: -0.03em;
351
+ line-height: 1.02;
352
+ font-size: clamp(2.5rem, 1.5rem + 4.2vw, 5rem);
353
+ }
354
+ .text-display-sm {
355
+ font-family: var(--font-display);
356
+ font-weight: 700;
357
+ letter-spacing: -0.02em;
358
+ line-height: 1.05;
359
+ font-size: clamp(1.75rem, 1.2rem + 2vw, 2.75rem);
360
+ }
361
+ }
362
+
363
+ @media (prefers-reduced-motion: reduce) {
364
+ *,
365
+ *::before,
366
+ *::after {
367
+ animation-duration: 0.01ms !important;
368
+ animation-iteration-count: 1 !important;
369
+ transition-duration: 0.01ms !important;
370
+ }
371
+ }