@juxtui/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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/components/avatar/JAvatar.vue.d.ts +26 -0
  4. package/dist/components/badge/JBadge.vue.d.ts +26 -0
  5. package/dist/components/button/JButton.vue.d.ts +37 -0
  6. package/dist/components/card/JCard.vue.d.ts +29 -0
  7. package/dist/components/checkbox/JCheckbox.vue.d.ts +36 -0
  8. package/dist/components/command-palette/JCommandPalette.vue.d.ts +81 -0
  9. package/dist/components/command-palette/search.d.ts +16 -0
  10. package/dist/components/dialog/JDialog.vue.d.ts +53 -0
  11. package/dist/components/dropdown-menu/JDropdownMenu.vue.d.ts +39 -0
  12. package/dist/components/dropdown-menu/JDropdownMenuItem.vue.d.ts +35 -0
  13. package/dist/components/dropdown-menu/JDropdownMenuLabel.vue.d.ts +12 -0
  14. package/dist/components/dropdown-menu/JDropdownMenuSeparator.vue.d.ts +3 -0
  15. package/dist/components/dropdown-menu/JDropdownMenuSub.vue.d.ts +17 -0
  16. package/dist/components/dropdown-menu/JMenuContent.vue.d.ts +44 -0
  17. package/dist/components/dropdown-menu/context.d.ts +17 -0
  18. package/dist/components/field/JFieldShell.vue.d.ts +33 -0
  19. package/dist/components/field/useField.d.ts +24 -0
  20. package/dist/components/input/JInput.vue.d.ts +42 -0
  21. package/dist/components/primitives/JPortal.vue.d.ts +17 -0
  22. package/dist/components/primitives/JSlot.d.ts +8 -0
  23. package/dist/components/select/JSelect.vue.d.ts +53 -0
  24. package/dist/components/switch/JSwitch.vue.d.ts +37 -0
  25. package/dist/components/tabs/JTabs.vue.d.ts +48 -0
  26. package/dist/components/textarea/JTextarea.vue.d.ts +38 -0
  27. package/dist/components/toast/JToastItem.vue.d.ts +13 -0
  28. package/dist/components/toast/JToaster.vue.d.ts +18 -0
  29. package/dist/components/tooltip/JTooltip.vue.d.ts +24 -0
  30. package/dist/components.d.ts +19 -0
  31. package/dist/composables/useFloating.d.ts +28 -0
  32. package/dist/composables/useFocusTrap.d.ts +12 -0
  33. package/dist/composables/useHotkey.d.ts +10 -0
  34. package/dist/composables/useLayer.d.ts +13 -0
  35. package/dist/composables/useRecentCommands.d.ts +19 -0
  36. package/dist/composables/useScrollLock.d.ts +3 -0
  37. package/dist/composables/useToast.d.ts +93 -0
  38. package/dist/composables/useTypeahead.d.ts +8 -0
  39. package/dist/icons.d.ts +18 -0
  40. package/dist/index.d.ts +30 -0
  41. package/dist/index.js +3486 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/nuxt.d.ts +13 -0
  44. package/dist/nuxt.js +61 -0
  45. package/dist/nuxt.js.map +1 -0
  46. package/dist/plugin.d.ts +9 -0
  47. package/dist/style.css +2463 -0
  48. package/dist/tailwind.css +74 -0
  49. package/dist/tokens.css +237 -0
  50. package/dist/utils/dom.d.ts +10 -0
  51. package/package.json +68 -0
package/dist/style.css ADDED
@@ -0,0 +1,2463 @@
1
+
2
+ @layer theme, base, juxt, components, utilities;
3
+
4
+ /*
5
+ * Juxt's component styles live in the `juxt` cascade layer. The order below
6
+ * puts it above CSS resets (Tailwind's `base`) and below utilities, so a
7
+ * class like `hidden` or `w-full` on a component always wins — and any
8
+ * unlayered CSS of your own does too. Without Tailwind the extra names are
9
+ * simply empty layers.
10
+ */
11
+
12
+ /*
13
+ * Juxt design tokens
14
+ *
15
+ * One source of truth for colour, space, radius, type, elevation, motion and
16
+ * layering. Components never hardcode these values — they read them here.
17
+ *
18
+ * Light is the default. Dark applies under `.dark` or `[data-theme="dark"]`
19
+ * on any ancestor (usually <html>).
20
+ */
21
+
22
+ :root,
23
+ .light,
24
+ [data-theme='light'] {
25
+ color-scheme: light;
26
+
27
+ /* Surfaces */
28
+ --juxt-bg: #fcfcfc;
29
+ --juxt-surface: #ffffff;
30
+ --juxt-surface-raised: #ffffff;
31
+ --juxt-surface-sunken: #f4f4f5;
32
+ --juxt-surface-hover: #f1f1f2;
33
+ --juxt-surface-active: #e9e9eb;
34
+ --juxt-overlay: rgb(9 9 11 / 0.32);
35
+
36
+ /* Lines */
37
+ --juxt-border: #e4e4e7;
38
+ --juxt-border-subtle: #ededef;
39
+ --juxt-border-strong: #d1d1d6;
40
+
41
+ /* Text */
42
+ --juxt-fg: #09090b;
43
+ --juxt-fg-secondary: #52525b;
44
+ --juxt-fg-muted: #71717a;
45
+ --juxt-fg-disabled: #a1a1aa;
46
+
47
+ /* Ink — the inverted neutral used by primary actions */
48
+ --juxt-ink: #09090b;
49
+ --juxt-ink-hover: #27272a;
50
+ --juxt-ink-fg: #fafafa;
51
+
52
+ /* Accent */
53
+ --juxt-accent: #079d6b;
54
+ --juxt-accent-hover: #068a5e;
55
+ --juxt-accent-fg: #ffffff;
56
+ --juxt-accent-strong: #057a53;
57
+ --juxt-accent-text: #057a53;
58
+ --juxt-accent-soft: rgb(7 157 107 / 0.1);
59
+ --juxt-accent-border: rgb(7 157 107 / 0.28);
60
+ --juxt-ring: rgb(7 157 107 / 0.55);
61
+ --juxt-ring-soft: rgb(7 157 107 / 0.16);
62
+
63
+ /* Feedback */
64
+ --juxt-danger: #dc2626;
65
+ --juxt-danger-hover: #c21f1f;
66
+ --juxt-danger-fg: #ffffff;
67
+ --juxt-danger-text: #c81e1e;
68
+ --juxt-danger-soft: rgb(220 38 38 / 0.08);
69
+ --juxt-danger-border: rgb(220 38 38 / 0.28);
70
+ --juxt-danger-ring: rgb(220 38 38 / 0.16);
71
+
72
+ --juxt-warning: #d97706;
73
+ --juxt-warning-text: #a35a04;
74
+ --juxt-warning-soft: rgb(217 119 6 / 0.1);
75
+ --juxt-warning-border: rgb(217 119 6 / 0.28);
76
+
77
+ --juxt-info: #2563eb;
78
+ --juxt-info-text: #1d4fc4;
79
+ --juxt-info-soft: rgb(37 99 235 / 0.08);
80
+ --juxt-info-border: rgb(37 99 235 / 0.24);
81
+
82
+ --juxt-success: var(--juxt-accent);
83
+ --juxt-success-text: var(--juxt-accent-text);
84
+ --juxt-success-soft: var(--juxt-accent-soft);
85
+ --juxt-success-border: var(--juxt-accent-border);
86
+
87
+ /* Elevation — borders do most of the work, shadows only lift */
88
+ --juxt-shadow-xs: 0 1px 1px rgb(9 9 11 / 0.04);
89
+ --juxt-shadow-sm: 0 1px 2px rgb(9 9 11 / 0.05), 0 1px 1px rgb(9 9 11 / 0.03);
90
+ --juxt-shadow-md: 0 4px 12px -2px rgb(9 9 11 / 0.08), 0 2px 4px -2px rgb(9 9 11 / 0.05);
91
+ --juxt-shadow-lg: 0 16px 40px -8px rgb(9 9 11 / 0.16), 0 4px 12px -4px rgb(9 9 11 / 0.08);
92
+ --juxt-control-highlight: inset 0 1px 0 rgb(255 255 255 / 0.12);
93
+
94
+ --juxt-tooltip-bg: #18181b;
95
+ --juxt-tooltip-fg: #fafafa;
96
+ --juxt-tooltip-border: transparent;
97
+ }
98
+
99
+ .dark,
100
+ [data-theme='dark'] {
101
+ color-scheme: dark;
102
+
103
+ --juxt-bg: #09090b;
104
+ --juxt-surface: #111113;
105
+ --juxt-surface-raised: #18181b;
106
+ --juxt-surface-sunken: #0c0c0e;
107
+ --juxt-surface-hover: #1e1e22;
108
+ --juxt-surface-active: #26262b;
109
+ --juxt-overlay: rgb(0 0 0 / 0.6);
110
+
111
+ --juxt-border: #27272a;
112
+ --juxt-border-subtle: #1f1f23;
113
+ --juxt-border-strong: #3a3a40;
114
+
115
+ --juxt-fg: #fafafa;
116
+ --juxt-fg-secondary: #a1a1aa;
117
+ --juxt-fg-muted: #71717a;
118
+ --juxt-fg-disabled: #52525b;
119
+
120
+ --juxt-ink: #fafafa;
121
+ --juxt-ink-hover: #e4e4e7;
122
+ --juxt-ink-fg: #09090b;
123
+
124
+ --juxt-accent: #079d6b;
125
+ --juxt-accent-hover: #08b079;
126
+ --juxt-accent-fg: #ffffff;
127
+ --juxt-accent-strong: #067a53;
128
+ --juxt-accent-text: #1fc48a;
129
+ --juxt-accent-soft: rgb(7 157 107 / 0.14);
130
+ --juxt-accent-border: rgb(31 196 138 / 0.28);
131
+ --juxt-ring: rgb(31 196 138 / 0.6);
132
+ --juxt-ring-soft: rgb(7 157 107 / 0.24);
133
+
134
+ --juxt-danger: #d63a3f;
135
+ --juxt-danger-hover: #c53237;
136
+ --juxt-danger-fg: #ffffff;
137
+ --juxt-danger-text: #ff7a7e;
138
+ --juxt-danger-soft: rgb(229 72 77 / 0.14);
139
+ --juxt-danger-border: rgb(255 122 126 / 0.28);
140
+ --juxt-danger-ring: rgb(229 72 77 / 0.24);
141
+
142
+ --juxt-warning: #f5a524;
143
+ --juxt-warning-text: #f7b955;
144
+ --juxt-warning-soft: rgb(245 165 36 / 0.12);
145
+ --juxt-warning-border: rgb(247 185 85 / 0.26);
146
+
147
+ --juxt-info: #4f8cff;
148
+ --juxt-info-text: #85adff;
149
+ --juxt-info-soft: rgb(79 140 255 / 0.13);
150
+ --juxt-info-border: rgb(133 173 255 / 0.26);
151
+
152
+ --juxt-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.3);
153
+ --juxt-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.4);
154
+ --juxt-shadow-md: 0 8px 20px -4px rgb(0 0 0 / 0.5), 0 2px 6px -2px rgb(0 0 0 / 0.4);
155
+ --juxt-shadow-lg: 0 24px 56px -12px rgb(0 0 0 / 0.7), 0 6px 16px -6px rgb(0 0 0 / 0.5);
156
+ --juxt-control-highlight: inset 0 1px 0 rgb(255 255 255 / 0.04);
157
+
158
+ --juxt-tooltip-bg: #26262b;
159
+ --juxt-tooltip-fg: #fafafa;
160
+ --juxt-tooltip-border: #3a3a40;
161
+ }
162
+
163
+ :root {
164
+ /* Type */
165
+ --juxt-font-sans: 'Inter Variable', 'Inter', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
166
+ --juxt-font-mono: 'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
167
+
168
+ --juxt-text-2xs: 0.6875rem; /* 11 */
169
+ --juxt-text-xs: 0.75rem; /* 12 */
170
+ --juxt-text-sm: 0.8125rem; /* 13 */
171
+ --juxt-text-md: 0.875rem; /* 14 */
172
+ --juxt-text-lg: 1rem; /* 16 */
173
+ --juxt-text-xl: 1.125rem; /* 18 */
174
+ --juxt-text-2xl: 1.375rem; /* 22 */
175
+ --juxt-text-3xl: 1.75rem; /* 28 */
176
+ --juxt-text-4xl: 2.5rem; /* 40 */
177
+
178
+ --juxt-leading-tight: 1.2;
179
+ --juxt-leading-snug: 1.4;
180
+ --juxt-leading-normal: 1.55;
181
+
182
+ --juxt-weight-regular: 400;
183
+ --juxt-weight-medium: 500;
184
+ --juxt-weight-semibold: 600;
185
+
186
+ --juxt-tracking-tight: -0.011em;
187
+ --juxt-tracking-tighter: -0.022em;
188
+
189
+ /* Space — a 4px grid */
190
+ --juxt-space-0-5: 0.125rem; /* 2 */
191
+ --juxt-space-1: 0.25rem; /* 4 */
192
+ --juxt-space-1-5: 0.375rem; /* 6 */
193
+ --juxt-space-2: 0.5rem; /* 8 */
194
+ --juxt-space-2-5: 0.625rem; /* 10 */
195
+ --juxt-space-3: 0.75rem; /* 12 */
196
+ --juxt-space-4: 1rem; /* 16 */
197
+ --juxt-space-5: 1.25rem; /* 20 */
198
+ --juxt-space-6: 1.5rem; /* 24 */
199
+ --juxt-space-8: 2rem; /* 32 */
200
+ --juxt-space-10: 2.5rem; /* 40 */
201
+ --juxt-space-12: 3rem; /* 48 */
202
+
203
+ /* Control heights */
204
+ --juxt-control-xs: 1.5rem; /* 24 */
205
+ --juxt-control-sm: 1.75rem; /* 28 */
206
+ --juxt-control-md: 2.125rem; /* 34 */
207
+ --juxt-control-lg: 2.5rem; /* 40 */
208
+
209
+ /* Radius */
210
+ --juxt-radius-xs: 0.25rem; /* 4 */
211
+ --juxt-radius-sm: 0.375rem; /* 6 */
212
+ --juxt-radius-md: 0.5rem; /* 8 */
213
+ --juxt-radius-lg: 0.75rem; /* 12 */
214
+ --juxt-radius-full: 9999px;
215
+
216
+ /* Motion */
217
+ --juxt-duration-instant: 80ms;
218
+ --juxt-duration-fast: 120ms;
219
+ --juxt-duration-normal: 180ms;
220
+ --juxt-duration-slow: 240ms;
221
+
222
+ --juxt-ease-standard: cubic-bezier(0.2, 0, 0, 1);
223
+ --juxt-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
224
+ --juxt-ease-in: cubic-bezier(0.4, 0, 1, 1);
225
+
226
+ /* Distance things travel when they enter. Zeroed for reduced motion. */
227
+ --juxt-motion-shift: 4px;
228
+ --juxt-motion-scale: 0.97;
229
+
230
+ /* Layers */
231
+ --juxt-z-sticky: 20;
232
+ --juxt-z-dropdown: 50;
233
+ --juxt-z-overlay: 100;
234
+ --juxt-z-modal: 110;
235
+ --juxt-z-popover: 120;
236
+ --juxt-z-toast: 130;
237
+ --juxt-z-tooltip: 140;
238
+ }
239
+
240
+ @media (prefers-reduced-motion: reduce) {
241
+ :root {
242
+ /* Things still fade — they just stop travelling. */
243
+ --juxt-motion-shift: 0px;
244
+ --juxt-motion-scale: 1;
245
+ --juxt-duration-slow: 140ms;
246
+ --juxt-duration-normal: 120ms;
247
+ }
248
+ }
249
+
250
+ @layer juxt {
251
+ /*
252
+ * Shared primitives every component leans on: the focus ring, the spinner,
253
+ * the kbd hint and screen-reader helpers. Kept deliberately small.
254
+ */
255
+
256
+ .j-sr-only {
257
+ position: absolute;
258
+ width: 1px;
259
+ height: 1px;
260
+ padding: 0;
261
+ margin: -1px;
262
+ overflow: hidden;
263
+ clip: rect(0, 0, 0, 0);
264
+ white-space: nowrap;
265
+ border: 0;
266
+ }
267
+
268
+ /*
269
+ * The focus ring. It starts flush against the element and settles 2px out,
270
+ * which reads as a small, confident "here" rather than a flash.
271
+ */
272
+ .j-focusable {
273
+ outline: 2px solid transparent;
274
+ outline-offset: 0;
275
+ transition-property: outline-color, outline-offset;
276
+ transition-duration: var(--juxt-duration-fast);
277
+ transition-timing-function: var(--juxt-ease-out);
278
+ }
279
+
280
+ .j-focusable:focus-visible {
281
+ outline-color: var(--juxt-ring);
282
+ outline-offset: 2px;
283
+ }
284
+
285
+ .j-spinner {
286
+ display: block;
287
+ flex: none;
288
+ animation: j-spin 700ms linear infinite;
289
+ }
290
+
291
+ .j-spinner circle {
292
+ fill: none;
293
+ stroke: currentColor;
294
+ stroke-linecap: round;
295
+ }
296
+
297
+ .j-spinner .j-spinner__track {
298
+ opacity: 0.2;
299
+ }
300
+
301
+ @keyframes j-spin {
302
+ to {
303
+ transform: rotate(360deg);
304
+ }
305
+ }
306
+
307
+ @media (prefers-reduced-motion: reduce) {
308
+ .j-spinner {
309
+ animation-duration: 1400ms;
310
+ }
311
+ }
312
+
313
+ .j-kbd {
314
+ display: inline-flex;
315
+ align-items: center;
316
+ justify-content: center;
317
+ min-width: 1.25rem;
318
+ height: 1.25rem;
319
+ padding: 0 var(--juxt-space-1);
320
+ border: 1px solid var(--juxt-border);
321
+ border-bottom-width: 2px;
322
+ border-radius: var(--juxt-radius-xs);
323
+ background: var(--juxt-surface);
324
+ color: var(--juxt-fg-muted);
325
+ font-family: var(--juxt-font-sans);
326
+ font-size: var(--juxt-text-2xs);
327
+ font-weight: var(--juxt-weight-medium);
328
+ line-height: 1;
329
+ font-variant-numeric: tabular-nums;
330
+ }
331
+
332
+ /* Popover surfaces (select, menu) share one entrance. */
333
+ .j-pop-enter-active {
334
+ transition:
335
+ opacity var(--juxt-duration-fast) var(--juxt-ease-out),
336
+ transform var(--juxt-duration-normal) var(--juxt-ease-out);
337
+ }
338
+
339
+ .j-pop-leave-active {
340
+ transition:
341
+ opacity var(--juxt-duration-instant) var(--juxt-ease-in),
342
+ transform var(--juxt-duration-instant) var(--juxt-ease-in);
343
+ }
344
+
345
+ .j-pop-enter-from,
346
+ .j-pop-leave-to {
347
+ opacity: 0;
348
+ transform: translateY(calc(var(--juxt-motion-shift) * var(--j-pop-dir, -1))) scale(var(--juxt-motion-scale));
349
+ }
350
+
351
+ /* A shared popover surface. */
352
+ .j-popover-surface {
353
+ border: 1px solid var(--juxt-border);
354
+ border-radius: var(--juxt-radius-md);
355
+ background: var(--juxt-surface-raised);
356
+ box-shadow: var(--juxt-shadow-md);
357
+ color: var(--juxt-fg);
358
+ font-family: var(--juxt-font-sans);
359
+ }
360
+ }
361
+
362
+ @layer juxt {
363
+ /*
364
+ * `.j-control` is the shared frame for Input, Textarea and the Select trigger.
365
+ */
366
+ .j-control {
367
+ --j-control-height: var(--juxt-control-md);
368
+ --j-control-px: var(--juxt-space-2-5);
369
+ --j-control-font: var(--juxt-text-md);
370
+
371
+ position: relative;
372
+ display: flex;
373
+ align-items: center;
374
+ gap: var(--juxt-space-2);
375
+ min-height: var(--j-control-height);
376
+ padding: 0 var(--j-control-px);
377
+ border: 1px solid var(--juxt-border);
378
+ border-radius: var(--juxt-radius-sm);
379
+ background: var(--juxt-surface);
380
+ box-shadow: var(--juxt-shadow-xs);
381
+ color: var(--juxt-fg);
382
+ font-family: var(--juxt-font-sans);
383
+ font-size: var(--j-control-font);
384
+ cursor: text;
385
+ transition:
386
+ border-color var(--juxt-duration-fast) var(--juxt-ease-standard),
387
+ box-shadow var(--juxt-duration-normal) var(--juxt-ease-out),
388
+ background-color var(--juxt-duration-fast) var(--juxt-ease-standard);
389
+ }
390
+
391
+ .dark .j-control,
392
+ [data-theme='dark'] .j-control {
393
+ background: var(--juxt-surface-sunken);
394
+ }
395
+
396
+ .j-control:hover:not(.is-disabled, :focus-within) {
397
+ border-color: var(--juxt-border-strong);
398
+ }
399
+
400
+ /*
401
+ * Focus: the border takes the accent and a soft halo grows out of it.
402
+ * The halo is the same colour at low alpha, so it reads as one gesture.
403
+ */
404
+ .j-control:focus-within,
405
+ .j-control.is-open {
406
+ border-color: var(--juxt-accent);
407
+ box-shadow: 0 0 0 3px var(--juxt-ring-soft);
408
+ }
409
+
410
+ .j-control.is-invalid {
411
+ border-color: var(--juxt-danger-border);
412
+ }
413
+
414
+ .j-control.is-invalid:hover:not(.is-disabled, :focus-within) {
415
+ border-color: var(--juxt-danger);
416
+ }
417
+
418
+ .j-control.is-invalid:focus-within,
419
+ .j-control.is-invalid.is-open {
420
+ border-color: var(--juxt-danger);
421
+ box-shadow: 0 0 0 3px var(--juxt-danger-ring);
422
+ }
423
+
424
+ .j-control.is-disabled {
425
+ cursor: not-allowed;
426
+ background: var(--juxt-surface-sunken);
427
+ box-shadow: none;
428
+ color: var(--juxt-fg-disabled);
429
+ }
430
+
431
+ .j-control.is-readonly {
432
+ background: var(--juxt-surface-sunken);
433
+ }
434
+
435
+ .j-control--sm {
436
+ --j-control-height: var(--juxt-control-sm);
437
+ --j-control-px: var(--juxt-space-2);
438
+ --j-control-font: var(--juxt-text-sm);
439
+ }
440
+
441
+ .j-control--lg {
442
+ --j-control-height: var(--juxt-control-lg);
443
+ --j-control-px: var(--juxt-space-3);
444
+ --j-control-font: var(--juxt-text-md);
445
+ }
446
+
447
+ .j-control__adornment {
448
+ display: inline-flex;
449
+ flex: none;
450
+ align-items: center;
451
+ color: var(--juxt-fg-muted);
452
+ transition: color var(--juxt-duration-fast) var(--juxt-ease-standard);
453
+ }
454
+
455
+ .j-control__adornment > svg {
456
+ width: 1rem;
457
+ height: 1rem;
458
+ }
459
+
460
+ .j-control:focus-within .j-control__adornment--leading {
461
+ color: var(--juxt-fg-secondary);
462
+ }
463
+ }
464
+
465
+ @layer juxt {
466
+ .j-avatar {
467
+ --j-avatar-size: 2rem;
468
+ --j-avatar-font: var(--juxt-text-xs);
469
+ --j-avatar-status: 0.5rem;
470
+ --j-avatar-radius: var(--juxt-radius-full);
471
+
472
+ position: relative;
473
+ display: inline-flex;
474
+ flex: none;
475
+ width: var(--j-avatar-size);
476
+ height: var(--j-avatar-size);
477
+ font-family: var(--juxt-font-sans);
478
+ vertical-align: middle;
479
+ }
480
+ .j-avatar--xs {
481
+ --j-avatar-size: 1.25rem;
482
+ --j-avatar-font: 0.5625rem;
483
+ --j-avatar-status: 0.375rem;
484
+ }
485
+ .j-avatar--sm {
486
+ --j-avatar-size: 1.5rem;
487
+ --j-avatar-font: 0.625rem;
488
+ --j-avatar-status: 0.4375rem;
489
+ }
490
+ .j-avatar--lg {
491
+ --j-avatar-size: 2.5rem;
492
+ --j-avatar-font: var(--juxt-text-sm);
493
+ --j-avatar-status: 0.625rem;
494
+ }
495
+ .j-avatar--xl {
496
+ --j-avatar-size: 3.5rem;
497
+ --j-avatar-font: var(--juxt-text-lg);
498
+ --j-avatar-status: 0.75rem;
499
+ }
500
+ .j-avatar--square {
501
+ --j-avatar-radius: calc(var(--j-avatar-size) * 0.22);
502
+ }
503
+ .j-avatar__frame {
504
+ position: relative;
505
+ display: grid;
506
+ width: 100%;
507
+ height: 100%;
508
+ overflow: hidden;
509
+ border-radius: var(--j-avatar-radius);
510
+ background: var(--juxt-surface-active);
511
+ /* A hairline keeps light photos from bleeding into light backgrounds. */
512
+ box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.06);
513
+ }
514
+ .dark .j-avatar__frame,
515
+ [data-theme='dark'] .j-avatar__frame {
516
+ box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.06);
517
+ }
518
+ .j-avatar__image,
519
+ .j-avatar__fallback {
520
+ grid-area: 1 / 1;
521
+ width: 100%;
522
+ height: 100%;
523
+ }
524
+ .j-avatar__image {
525
+ object-fit: cover;
526
+ opacity: 0;
527
+ transition: opacity var(--juxt-duration-normal) var(--juxt-ease-standard);
528
+ }
529
+ .j-avatar[data-state='loaded'] .j-avatar__image {
530
+ opacity: 1;
531
+ }
532
+ .j-avatar__fallback {
533
+ display: grid;
534
+ place-items: center;
535
+ color: var(--juxt-fg-secondary);
536
+ font-size: var(--j-avatar-font);
537
+ font-weight: var(--juxt-weight-medium);
538
+ letter-spacing: 0.02em;
539
+ line-height: 1;
540
+ user-select: none;
541
+ }
542
+ .j-avatar__glyph {
543
+ width: 62%;
544
+ height: 62%;
545
+ margin-top: 18%;
546
+ color: var(--juxt-fg-muted);
547
+ }
548
+ .j-avatar__status {
549
+ position: absolute;
550
+ right: 0;
551
+ bottom: 0;
552
+ width: var(--j-avatar-status);
553
+ height: var(--j-avatar-status);
554
+ border-radius: var(--juxt-radius-full);
555
+ background: var(--juxt-fg-muted);
556
+ /* The ring is the page background, so the dot cuts cleanly out of the photo. */
557
+ box-shadow: 0 0 0 2px var(--j-avatar-ring, var(--juxt-bg));
558
+ }
559
+ .j-avatar--square .j-avatar__status {
560
+ right: -2px;
561
+ bottom: -2px;
562
+ }
563
+ .j-avatar__status--online {
564
+ background: var(--juxt-accent);
565
+ }
566
+ .j-avatar__status--away {
567
+ background: var(--juxt-warning);
568
+ }
569
+ .j-avatar__status--busy {
570
+ background: var(--juxt-danger);
571
+ }
572
+ .j-avatar__status--offline {
573
+ background: var(--juxt-fg-disabled);
574
+ }
575
+ }
576
+
577
+ @layer juxt {
578
+ /*
579
+ * Badges are small, square-shouldered labels — closer to a stamp than a pill.
580
+ * No borders: a quiet tint and the text colour carry the meaning.
581
+ */
582
+ .j-badge {
583
+ --j-badge-fg: var(--juxt-fg-secondary);
584
+ --j-badge-bg: var(--juxt-surface-active);
585
+ --j-badge-marker: var(--juxt-fg-muted);
586
+
587
+ display: inline-flex;
588
+ flex: none;
589
+ align-items: center;
590
+ gap: 0.375rem;
591
+ height: 1.25rem;
592
+ padding: 0 0.375rem;
593
+ border-radius: var(--juxt-radius-xs);
594
+ background: var(--j-badge-bg);
595
+ color: var(--j-badge-fg);
596
+ font-family: var(--juxt-font-sans);
597
+ font-size: var(--juxt-text-xs);
598
+ font-weight: var(--juxt-weight-medium);
599
+ line-height: 1;
600
+ letter-spacing: 0;
601
+ white-space: nowrap;
602
+ font-variant-numeric: tabular-nums;
603
+ }
604
+ .j-badge--sm {
605
+ gap: 0.3125rem;
606
+ height: 1.0625rem;
607
+ padding: 0 0.3125rem;
608
+ font-size: var(--juxt-text-2xs);
609
+ }
610
+ .j-badge--success {
611
+ --j-badge-fg: var(--juxt-success-text);
612
+ --j-badge-bg: var(--juxt-success-soft);
613
+ --j-badge-marker: var(--juxt-success);
614
+ }
615
+ .j-badge--warning {
616
+ --j-badge-fg: var(--juxt-warning-text);
617
+ --j-badge-bg: var(--juxt-warning-soft);
618
+ --j-badge-marker: var(--juxt-warning);
619
+ }
620
+ .j-badge--destructive {
621
+ --j-badge-fg: var(--juxt-danger-text);
622
+ --j-badge-bg: var(--juxt-danger-soft);
623
+ --j-badge-marker: var(--juxt-danger);
624
+ }
625
+
626
+ /* Accent is the only solid badge — reserve it for the thing that matters. */
627
+ .j-badge--accent {
628
+ --j-badge-fg: var(--juxt-accent-fg);
629
+ --j-badge-bg: var(--juxt-accent-strong);
630
+ --j-badge-marker: var(--juxt-accent);
631
+ }
632
+
633
+ /* Status: text first, colour only in the marker. */
634
+ .j-badge--status {
635
+ padding: 0;
636
+ background: none;
637
+ color: var(--juxt-fg-secondary);
638
+ }
639
+ .j-badge__marker {
640
+ flex: none;
641
+ width: 0.4375rem;
642
+ height: 0.4375rem;
643
+ border-radius: 1.5px;
644
+ background: var(--j-badge-marker);
645
+ }
646
+ .j-badge--sm .j-badge__marker {
647
+ width: 0.375rem;
648
+ height: 0.375rem;
649
+ }
650
+ .j-badge__icon {
651
+ display: inline-flex;
652
+ margin-left: -0.0625rem;
653
+ }
654
+ .j-badge__icon > svg {
655
+ width: 0.75rem;
656
+ height: 0.75rem;
657
+ }
658
+ }
659
+
660
+ @layer juxt {
661
+ .j-button {
662
+ --j-button-height: var(--juxt-control-md);
663
+ --j-button-px: var(--juxt-space-3);
664
+ --j-button-gap: var(--juxt-space-1-5);
665
+ --j-button-font: var(--juxt-text-md);
666
+ --j-button-radius: var(--juxt-radius-sm);
667
+
668
+ position: relative;
669
+ display: inline-flex;
670
+ align-items: center;
671
+ justify-content: center;
672
+ height: var(--j-button-height);
673
+ padding: 0 var(--j-button-px);
674
+ border: 1px solid transparent;
675
+ border-radius: var(--j-button-radius);
676
+ font-family: var(--juxt-font-sans);
677
+ font-size: var(--j-button-font);
678
+ font-weight: var(--juxt-weight-medium);
679
+ line-height: 1;
680
+ letter-spacing: var(--juxt-tracking-tight);
681
+ white-space: nowrap;
682
+ text-decoration: none;
683
+ cursor: pointer;
684
+ user-select: none;
685
+ -webkit-tap-highlight-color: transparent;
686
+ touch-action: manipulation;
687
+ transition-property: background-color, border-color, color, box-shadow, transform, outline-color, outline-offset;
688
+ transition-duration: var(--juxt-duration-fast);
689
+ transition-timing-function: var(--juxt-ease-standard);
690
+ }
691
+
692
+ /* Pressed: a short, physical dip. Released slower than pressed. */
693
+ .j-button:active:not([aria-disabled='true'], :disabled) {
694
+ transform: scale(0.97);
695
+ transition-duration: var(--juxt-duration-instant);
696
+ }
697
+ @media (prefers-reduced-motion: reduce) {
698
+ .j-button:active:not([aria-disabled='true'], :disabled) {
699
+ transform: none;
700
+ }
701
+ }
702
+ .j-button__content {
703
+ display: inline-flex;
704
+ align-items: center;
705
+ gap: var(--j-button-gap);
706
+ transition:
707
+ opacity var(--juxt-duration-fast) var(--juxt-ease-standard),
708
+ transform var(--juxt-duration-normal) var(--juxt-ease-out);
709
+ }
710
+ .j-button__icon {
711
+ display: inline-flex;
712
+ margin-inline: -0.125rem;
713
+ opacity: 0.85;
714
+ }
715
+ .j-button__icon > svg {
716
+ width: 1em;
717
+ height: 1em;
718
+ }
719
+ .j-button.is-loading {
720
+ cursor: progress;
721
+ }
722
+ .j-button.is-loading .j-button__content {
723
+ opacity: 0;
724
+ transform: scale(0.96);
725
+ }
726
+ .j-button__spinner {
727
+ position: absolute;
728
+ inset: 0;
729
+ display: grid;
730
+ place-items: center;
731
+ }
732
+ .j-button-spinner-enter-active {
733
+ transition:
734
+ opacity var(--juxt-duration-fast) var(--juxt-ease-out) 40ms,
735
+ transform var(--juxt-duration-normal) var(--juxt-ease-out) 40ms;
736
+ }
737
+ .j-button-spinner-leave-active {
738
+ transition:
739
+ opacity var(--juxt-duration-instant) var(--juxt-ease-in),
740
+ transform var(--juxt-duration-instant) var(--juxt-ease-in);
741
+ }
742
+ .j-button-spinner-enter-from,
743
+ .j-button-spinner-leave-to {
744
+ opacity: 0;
745
+ transform: scale(0.8);
746
+ }
747
+
748
+ /* Sizes */
749
+ .j-button--xs {
750
+ --j-button-height: var(--juxt-control-xs);
751
+ --j-button-px: var(--juxt-space-2);
752
+ --j-button-gap: var(--juxt-space-1);
753
+ --j-button-font: var(--juxt-text-xs);
754
+ --j-button-radius: var(--juxt-radius-xs);
755
+ }
756
+ .j-button--sm {
757
+ --j-button-height: var(--juxt-control-sm);
758
+ --j-button-px: var(--juxt-space-2-5);
759
+ --j-button-gap: var(--juxt-space-1-5);
760
+ --j-button-font: var(--juxt-text-sm);
761
+ }
762
+ .j-button--lg {
763
+ --j-button-height: var(--juxt-control-lg);
764
+ --j-button-px: var(--juxt-space-4);
765
+ --j-button-gap: var(--juxt-space-2);
766
+ --j-button-font: var(--juxt-text-md);
767
+ --j-button-radius: var(--juxt-radius-md);
768
+ }
769
+ .j-button--icon {
770
+ width: var(--j-button-height);
771
+ padding: 0;
772
+ }
773
+ .j-button--icon .j-button__content > svg,
774
+ .j-button--icon .j-button__content > :where(span, i) > svg {
775
+ width: calc(var(--j-button-height) * 0.46);
776
+ height: calc(var(--j-button-height) * 0.46);
777
+ }
778
+ .j-button--block {
779
+ display: flex;
780
+ width: 100%;
781
+ }
782
+
783
+ /* Variants */
784
+ .j-button--primary {
785
+ background: var(--juxt-ink);
786
+ color: var(--juxt-ink-fg);
787
+ box-shadow: var(--juxt-shadow-xs), var(--juxt-control-highlight);
788
+ }
789
+ .j-button--primary:hover:not([aria-disabled='true'], :disabled) {
790
+ background: var(--juxt-ink-hover);
791
+ }
792
+ .j-button--secondary {
793
+ background: var(--juxt-surface-sunken);
794
+ border-color: var(--juxt-border-subtle);
795
+ color: var(--juxt-fg);
796
+ }
797
+ .dark .j-button--secondary,
798
+ [data-theme='dark'] .j-button--secondary {
799
+ background: var(--juxt-surface-raised);
800
+ border-color: var(--juxt-border-subtle);
801
+ }
802
+ .j-button--secondary:hover:not([aria-disabled='true'], :disabled) {
803
+ background: var(--juxt-surface-active);
804
+ }
805
+ .j-button--outline {
806
+ background: var(--juxt-surface);
807
+ border-color: var(--juxt-border);
808
+ color: var(--juxt-fg);
809
+ box-shadow: var(--juxt-shadow-xs);
810
+ }
811
+ .j-button--outline:hover:not([aria-disabled='true'], :disabled) {
812
+ background: var(--juxt-surface-hover);
813
+ border-color: var(--juxt-border-strong);
814
+ }
815
+ .j-button--ghost {
816
+ background: transparent;
817
+ color: var(--juxt-fg-secondary);
818
+ }
819
+ .j-button--ghost:hover:not([aria-disabled='true'], :disabled) {
820
+ background: var(--juxt-surface-hover);
821
+ color: var(--juxt-fg);
822
+ }
823
+ .j-button--ghost:active:not([aria-disabled='true'], :disabled) {
824
+ background: var(--juxt-surface-active);
825
+ }
826
+ .j-button--destructive {
827
+ background: var(--juxt-danger);
828
+ color: var(--juxt-danger-fg);
829
+ box-shadow: var(--juxt-shadow-xs), var(--juxt-control-highlight);
830
+ }
831
+ .j-button--destructive:hover:not([aria-disabled='true'], :disabled) {
832
+ background: var(--juxt-danger-hover);
833
+ }
834
+ .j-button--destructive:focus-visible {
835
+ outline-color: var(--juxt-danger);
836
+ }
837
+
838
+ /* Disabled: quiet, not ghostly. */
839
+ .j-button:disabled,
840
+ .j-button[data-disabled] {
841
+ cursor: not-allowed;
842
+ opacity: 0.45;
843
+ box-shadow: none;
844
+ }
845
+ }
846
+
847
+ @layer juxt {
848
+ .j-card {
849
+ --j-card-p: var(--juxt-space-5);
850
+
851
+ display: flex;
852
+ flex-direction: column;
853
+ min-width: 0;
854
+ border-radius: var(--juxt-radius-lg);
855
+ color: var(--juxt-fg);
856
+ font-family: var(--juxt-font-sans);
857
+ }
858
+ .j-card--outline {
859
+ --j-avatar-ring: var(--juxt-surface);
860
+
861
+ border: 1px solid var(--juxt-border);
862
+ background: var(--juxt-surface);
863
+ box-shadow: var(--juxt-shadow-xs);
864
+ }
865
+ .j-card--muted {
866
+ --j-avatar-ring: var(--juxt-surface-sunken);
867
+
868
+ border: 1px solid transparent;
869
+ background: var(--juxt-surface-sunken);
870
+ }
871
+ .j-card--p-none {
872
+ --j-card-p: 0;
873
+ }
874
+ .j-card--p-sm {
875
+ --j-card-p: var(--juxt-space-3);
876
+ }
877
+ .j-card--p-lg {
878
+ --j-card-p: var(--juxt-space-6);
879
+ }
880
+ .j-card__header {
881
+ display: flex;
882
+ align-items: flex-start;
883
+ justify-content: space-between;
884
+ gap: var(--juxt-space-4);
885
+ padding: var(--j-card-p) var(--j-card-p) 0;
886
+ }
887
+ .j-card__heading {
888
+ display: flex;
889
+ flex-direction: column;
890
+ gap: var(--juxt-space-1);
891
+ min-width: 0;
892
+ }
893
+ .j-card__title {
894
+ margin: 0;
895
+ font-size: var(--juxt-text-md);
896
+ font-weight: var(--juxt-weight-semibold);
897
+ line-height: var(--juxt-leading-snug);
898
+ letter-spacing: var(--juxt-tracking-tight);
899
+ }
900
+ .j-card__description {
901
+ margin: 0;
902
+ color: var(--juxt-fg-muted);
903
+ font-size: var(--juxt-text-sm);
904
+ line-height: var(--juxt-leading-normal);
905
+ }
906
+ .j-card__actions {
907
+ display: flex;
908
+ flex: none;
909
+ align-items: center;
910
+ gap: var(--juxt-space-2);
911
+ margin: calc(var(--juxt-space-1) * -1) 0;
912
+ }
913
+ .j-card__body {
914
+ flex: 1;
915
+ padding: var(--j-card-p);
916
+ color: var(--juxt-fg-secondary);
917
+ font-size: var(--juxt-text-md);
918
+ line-height: var(--juxt-leading-normal);
919
+ }
920
+ .j-card__header + .j-card__body {
921
+ padding-top: var(--juxt-space-4);
922
+ }
923
+ .j-card__footer {
924
+ display: flex;
925
+ align-items: center;
926
+ justify-content: flex-end;
927
+ gap: var(--juxt-space-2);
928
+ padding: var(--juxt-space-3) var(--j-card-p);
929
+ border-top: 1px solid var(--juxt-border-subtle);
930
+ }
931
+ .j-card__header:last-child {
932
+ padding-bottom: var(--j-card-p);
933
+ }
934
+ .j-card--muted .j-card__footer {
935
+ border-top-color: var(--juxt-border);
936
+ }
937
+ }
938
+
939
+ @layer juxt {
940
+ .j-checkbox {
941
+ --j-checkbox-size: 1rem;
942
+
943
+ display: inline-flex;
944
+ align-items: flex-start;
945
+ gap: var(--juxt-space-2-5);
946
+ font-family: var(--juxt-font-sans);
947
+ }
948
+ .j-checkbox__control {
949
+ position: relative;
950
+ display: inline-flex;
951
+ flex: none;
952
+ /* Align the box with the first line of the label. */
953
+ margin-top: calc((var(--juxt-text-md) * var(--juxt-leading-snug) - var(--j-checkbox-size)) / 2);
954
+ }
955
+ .j-checkbox__input {
956
+ position: absolute;
957
+ inset: -4px;
958
+ z-index: 1;
959
+ width: calc(100% + 8px);
960
+ height: calc(100% + 8px);
961
+ margin: 0;
962
+ opacity: 0;
963
+ cursor: pointer;
964
+ }
965
+ .j-checkbox__input:disabled {
966
+ cursor: not-allowed;
967
+ }
968
+ .j-checkbox__box {
969
+ display: grid;
970
+ place-items: center;
971
+ width: var(--j-checkbox-size);
972
+ height: var(--j-checkbox-size);
973
+ border: 1px solid var(--juxt-border-strong);
974
+ border-radius: var(--juxt-radius-xs);
975
+ background: var(--juxt-surface);
976
+ box-shadow: var(--juxt-shadow-xs);
977
+ color: var(--juxt-accent-fg);
978
+ outline: 2px solid transparent;
979
+ outline-offset: 0;
980
+ transition:
981
+ background-color var(--juxt-duration-fast) var(--juxt-ease-standard),
982
+ border-color var(--juxt-duration-fast) var(--juxt-ease-standard),
983
+ transform var(--juxt-duration-fast) var(--juxt-ease-out),
984
+ outline-color var(--juxt-duration-fast) var(--juxt-ease-out),
985
+ outline-offset var(--juxt-duration-fast) var(--juxt-ease-out);
986
+ }
987
+ .j-checkbox__box > svg {
988
+ grid-area: 1 / 1;
989
+ width: 100%;
990
+ height: 100%;
991
+ stroke: currentColor;
992
+ stroke-width: 2;
993
+ stroke-linecap: round;
994
+ stroke-linejoin: round;
995
+ }
996
+ .j-checkbox__input:hover:not(:disabled) + .j-checkbox__box {
997
+ border-color: var(--juxt-fg-muted);
998
+ }
999
+ .j-checkbox__input:active:not(:disabled) + .j-checkbox__box {
1000
+ transform: scale(0.9);
1001
+ }
1002
+ .j-checkbox__input:focus-visible + .j-checkbox__box {
1003
+ outline-color: var(--juxt-ring);
1004
+ outline-offset: 2px;
1005
+ }
1006
+ .j-checkbox[data-state='checked'] .j-checkbox__box,
1007
+ .j-checkbox[data-state='indeterminate'] .j-checkbox__box {
1008
+ border-color: var(--juxt-accent);
1009
+ background: var(--juxt-accent);
1010
+ }
1011
+ .j-checkbox[data-state='checked'] .j-checkbox__input:hover:not(:disabled) + .j-checkbox__box,
1012
+ .j-checkbox[data-state='indeterminate'] .j-checkbox__input:hover:not(:disabled) + .j-checkbox__box {
1013
+ border-color: var(--juxt-accent-hover);
1014
+ background: var(--juxt-accent-hover);
1015
+ }
1016
+
1017
+ /* The check draws itself in, just after the fill lands. */
1018
+ .j-checkbox__check path {
1019
+ stroke-dasharray: 1;
1020
+ stroke-dashoffset: 1;
1021
+ transition: stroke-dashoffset var(--juxt-duration-fast) var(--juxt-ease-in);
1022
+ }
1023
+ .j-checkbox[data-state='checked'] .j-checkbox__check path {
1024
+ stroke-dashoffset: 0;
1025
+ transition: stroke-dashoffset var(--juxt-duration-normal) var(--juxt-ease-out) 40ms;
1026
+ }
1027
+ .j-checkbox__dash {
1028
+ opacity: 0;
1029
+ transform: scaleX(0.4);
1030
+ transition:
1031
+ opacity var(--juxt-duration-instant) var(--juxt-ease-standard),
1032
+ transform var(--juxt-duration-fast) var(--juxt-ease-out);
1033
+ }
1034
+ .j-checkbox[data-state='indeterminate'] .j-checkbox__dash {
1035
+ opacity: 1;
1036
+ transform: none;
1037
+ }
1038
+ .j-checkbox[data-state='indeterminate'] .j-checkbox__check {
1039
+ opacity: 0;
1040
+ }
1041
+ @media (prefers-reduced-motion: reduce) {
1042
+ .j-checkbox__check path,
1043
+ .j-checkbox[data-state='checked'] .j-checkbox__check path {
1044
+ transition-duration: 0ms;
1045
+ }
1046
+ .j-checkbox__input:active:not(:disabled) + .j-checkbox__box {
1047
+ transform: none;
1048
+ }
1049
+ }
1050
+ .j-checkbox__text {
1051
+ display: flex;
1052
+ flex-direction: column;
1053
+ gap: var(--juxt-space-0-5);
1054
+ min-width: 0;
1055
+ }
1056
+ .j-checkbox__label {
1057
+ color: var(--juxt-fg);
1058
+ font-size: var(--juxt-text-md);
1059
+ line-height: var(--juxt-leading-snug);
1060
+ letter-spacing: var(--juxt-tracking-tight);
1061
+ cursor: pointer;
1062
+ user-select: none;
1063
+ }
1064
+ .j-checkbox__description {
1065
+ color: var(--juxt-fg-muted);
1066
+ font-size: var(--juxt-text-sm);
1067
+ line-height: var(--juxt-leading-normal);
1068
+ }
1069
+ .j-checkbox.is-disabled .j-checkbox__box {
1070
+ opacity: 0.5;
1071
+ box-shadow: none;
1072
+ }
1073
+ .j-checkbox.is-disabled .j-checkbox__label {
1074
+ color: var(--juxt-fg-muted);
1075
+ cursor: not-allowed;
1076
+ }
1077
+ }
1078
+
1079
+ @layer juxt {
1080
+ .j-command__overlay {
1081
+ position: fixed;
1082
+ inset: 0;
1083
+ z-index: var(--juxt-z-overlay);
1084
+ background: var(--juxt-overlay);
1085
+ }
1086
+ .j-command__positioner {
1087
+ position: fixed;
1088
+ inset: 0;
1089
+ z-index: var(--juxt-z-modal);
1090
+ display: flex;
1091
+ align-items: flex-start;
1092
+ justify-content: center;
1093
+ padding: max(12vh, var(--juxt-space-4)) var(--juxt-space-4) var(--juxt-space-4);
1094
+ }
1095
+ .j-command {
1096
+ position: relative;
1097
+ display: flex;
1098
+ flex-direction: column;
1099
+ width: 100%;
1100
+ max-width: 40rem;
1101
+ max-height: min(34rem, calc(100dvh - 12vh - var(--juxt-space-8)));
1102
+ overflow: hidden;
1103
+ border: 1px solid var(--juxt-border);
1104
+ border-radius: var(--juxt-radius-lg);
1105
+ background: var(--juxt-surface-raised);
1106
+ box-shadow: var(--juxt-shadow-lg);
1107
+ color: var(--juxt-fg);
1108
+ font-family: var(--juxt-font-sans);
1109
+ }
1110
+
1111
+ /* Search */
1112
+ .j-command__search {
1113
+ position: relative;
1114
+ display: flex;
1115
+ flex: none;
1116
+ align-items: center;
1117
+ gap: var(--juxt-space-3);
1118
+ height: 3.25rem;
1119
+ padding: 0 var(--juxt-space-3) 0 var(--juxt-space-4);
1120
+ border-bottom: 1px solid var(--juxt-border-subtle);
1121
+ }
1122
+ .dark .j-command__search,
1123
+ [data-theme='dark'] .j-command__search {
1124
+ border-bottom-color: var(--juxt-border);
1125
+ }
1126
+ .j-command__search-icon {
1127
+ flex: none;
1128
+ width: 1.125rem;
1129
+ height: 1.125rem;
1130
+ color: var(--juxt-fg-muted);
1131
+ }
1132
+ .j-command__input {
1133
+ flex: 1;
1134
+ min-width: 0;
1135
+ height: 100%;
1136
+ padding: 0;
1137
+ border: 0;
1138
+ outline: none;
1139
+ background: transparent;
1140
+ color: var(--juxt-fg);
1141
+ font: inherit;
1142
+ font-size: var(--juxt-text-lg);
1143
+ letter-spacing: var(--juxt-tracking-tight);
1144
+ caret-color: var(--juxt-accent);
1145
+ }
1146
+ .j-command__input::placeholder {
1147
+ color: var(--juxt-fg-muted);
1148
+ }
1149
+ .j-command__esc {
1150
+ height: 1.375rem;
1151
+ padding: 0 var(--juxt-space-1-5);
1152
+ cursor: pointer;
1153
+ }
1154
+ .j-command__esc:hover {
1155
+ color: var(--juxt-fg-secondary);
1156
+ }
1157
+
1158
+ /* An indeterminate hairline: present, never loud. */
1159
+ .j-command__progress {
1160
+ position: absolute;
1161
+ right: 0;
1162
+ bottom: -1px;
1163
+ left: 0;
1164
+ height: 1px;
1165
+ overflow: hidden;
1166
+ }
1167
+ .j-command__progress::after {
1168
+ content: '';
1169
+ position: absolute;
1170
+ inset: 0;
1171
+ width: 40%;
1172
+ background: linear-gradient(90deg, transparent, var(--juxt-accent), transparent);
1173
+ animation: j-command-progress 1.1s var(--juxt-ease-standard) infinite;
1174
+ }
1175
+ @keyframes j-command-progress {
1176
+ from {
1177
+ transform: translateX(-100%);
1178
+ }
1179
+ to {
1180
+ transform: translateX(250%);
1181
+ }
1182
+ }
1183
+ @media (prefers-reduced-motion: reduce) {
1184
+ .j-command__progress::after {
1185
+ width: 100%;
1186
+ animation: j-command-pulse 1.4s ease-in-out infinite;
1187
+ }
1188
+ @keyframes j-command-pulse {
1189
+ 50% {
1190
+ opacity: 0.3;
1191
+ }
1192
+ }
1193
+ }
1194
+
1195
+ /* List */
1196
+ .j-command__list {
1197
+ flex: 1;
1198
+ min-height: 0;
1199
+ padding: var(--juxt-space-1-5);
1200
+ overflow-y: auto;
1201
+ overscroll-behavior: contain;
1202
+ scroll-padding-block: var(--juxt-space-8) var(--juxt-space-1-5);
1203
+ }
1204
+ .j-command__group + .j-command__group {
1205
+ margin-top: var(--juxt-space-1);
1206
+ }
1207
+ .j-command__group-label {
1208
+ padding: var(--juxt-space-2) var(--juxt-space-2-5) var(--juxt-space-1-5);
1209
+ color: var(--juxt-fg-muted);
1210
+ font-size: var(--juxt-text-xs);
1211
+ font-weight: var(--juxt-weight-medium);
1212
+ user-select: none;
1213
+ }
1214
+ .j-command__item {
1215
+ position: relative;
1216
+ display: flex;
1217
+ align-items: center;
1218
+ gap: var(--juxt-space-2-5);
1219
+ height: 2.5rem;
1220
+ padding: 0 var(--juxt-space-2-5);
1221
+ border-radius: var(--juxt-radius-sm);
1222
+ color: var(--juxt-fg);
1223
+ font-size: var(--juxt-text-md);
1224
+ letter-spacing: var(--juxt-tracking-tight);
1225
+ cursor: pointer;
1226
+ user-select: none;
1227
+ }
1228
+
1229
+ /* The one place the palette uses green: a hairline marking where you are. */
1230
+ .j-command__item::before {
1231
+ content: '';
1232
+ position: absolute;
1233
+ top: 0.625rem;
1234
+ bottom: 0.625rem;
1235
+ left: 0;
1236
+ width: 2px;
1237
+ border-radius: 0 2px 2px 0;
1238
+ background: var(--juxt-accent);
1239
+ opacity: 0;
1240
+ transform: scaleY(0.4);
1241
+ transition:
1242
+ opacity var(--juxt-duration-instant) var(--juxt-ease-standard),
1243
+ transform var(--juxt-duration-fast) var(--juxt-ease-out);
1244
+ }
1245
+ .j-command__item.is-active {
1246
+ background: var(--juxt-surface-hover);
1247
+ }
1248
+ .j-command__item.is-active::before {
1249
+ opacity: 1;
1250
+ transform: none;
1251
+ }
1252
+ .j-command__item[aria-disabled='true'] {
1253
+ color: var(--juxt-fg-disabled);
1254
+ cursor: not-allowed;
1255
+ }
1256
+ .j-command__item-icon {
1257
+ display: grid;
1258
+ flex: none;
1259
+ place-items: center;
1260
+ width: 1.25rem;
1261
+ height: 1.25rem;
1262
+ color: var(--juxt-fg-muted);
1263
+ }
1264
+ .j-command__item-icon > svg {
1265
+ width: 1rem;
1266
+ height: 1rem;
1267
+ }
1268
+ .j-command__item.is-active .j-command__item-icon {
1269
+ color: var(--juxt-fg);
1270
+ }
1271
+ .j-command__item-text {
1272
+ display: flex;
1273
+ flex: 1;
1274
+ align-items: baseline;
1275
+ gap: var(--juxt-space-2);
1276
+ min-width: 0;
1277
+ overflow: hidden;
1278
+ white-space: nowrap;
1279
+ }
1280
+ .j-command__item-label {
1281
+ flex: none;
1282
+ max-width: 100%;
1283
+ overflow: hidden;
1284
+ text-overflow: ellipsis;
1285
+ }
1286
+ .j-command__item-label.is-searching {
1287
+ color: var(--juxt-fg-secondary);
1288
+ }
1289
+ .j-command__item-label mark {
1290
+ background: none;
1291
+ color: var(--juxt-fg);
1292
+ font-weight: var(--juxt-weight-medium);
1293
+ }
1294
+ .j-command__item-description {
1295
+ overflow: hidden;
1296
+ color: var(--juxt-fg-muted);
1297
+ font-size: var(--juxt-text-sm);
1298
+ text-overflow: ellipsis;
1299
+ }
1300
+ .j-command__item-shortcut {
1301
+ display: inline-flex;
1302
+ flex: none;
1303
+ gap: 3px;
1304
+ }
1305
+ .j-command__empty {
1306
+ display: flex;
1307
+ flex-direction: column;
1308
+ align-items: center;
1309
+ justify-content: center;
1310
+ gap: var(--juxt-space-1-5);
1311
+ min-height: 8rem;
1312
+ padding: var(--juxt-space-6) var(--juxt-space-4);
1313
+ color: var(--juxt-fg-muted);
1314
+ font-size: var(--juxt-text-sm);
1315
+ text-align: center;
1316
+ }
1317
+ .j-command__empty-title {
1318
+ color: var(--juxt-fg-secondary);
1319
+ font-size: var(--juxt-text-md);
1320
+ font-weight: var(--juxt-weight-medium);
1321
+ }
1322
+
1323
+ /* Footer */
1324
+ .j-command__footer {
1325
+ display: flex;
1326
+ flex: none;
1327
+ align-items: center;
1328
+ gap: var(--juxt-space-4);
1329
+ height: 2.25rem;
1330
+ padding: 0 var(--juxt-space-4);
1331
+ border-top: 1px solid var(--juxt-border-subtle);
1332
+ background: var(--juxt-surface-sunken);
1333
+ color: var(--juxt-fg-muted);
1334
+ font-size: var(--juxt-text-xs);
1335
+ }
1336
+ .dark .j-command__footer,
1337
+ [data-theme='dark'] .j-command__footer {
1338
+ border-top-color: var(--juxt-border);
1339
+ background: var(--juxt-surface);
1340
+ }
1341
+ .j-command__hint {
1342
+ display: inline-flex;
1343
+ align-items: center;
1344
+ gap: var(--juxt-space-1);
1345
+ }
1346
+ .j-command__hint .j-kbd + .j-kbd {
1347
+ margin-left: -1px;
1348
+ }
1349
+
1350
+ /* Motion: quick in, quicker out. */
1351
+ .j-command-overlay-enter-active {
1352
+ transition: opacity var(--juxt-duration-fast) var(--juxt-ease-out);
1353
+ }
1354
+ .j-command-overlay-leave-active {
1355
+ transition: opacity var(--juxt-duration-instant) var(--juxt-ease-in);
1356
+ }
1357
+ .j-command-overlay-enter-from,
1358
+ .j-command-overlay-leave-to {
1359
+ opacity: 0;
1360
+ }
1361
+ .j-command-enter-active .j-command {
1362
+ transition:
1363
+ opacity var(--juxt-duration-fast) var(--juxt-ease-out),
1364
+ transform var(--juxt-duration-normal) var(--juxt-ease-out);
1365
+ }
1366
+ .j-command-leave-active .j-command {
1367
+ transition:
1368
+ opacity var(--juxt-duration-instant) var(--juxt-ease-in),
1369
+ transform var(--juxt-duration-instant) var(--juxt-ease-in);
1370
+ }
1371
+ .j-command-enter-from .j-command,
1372
+ .j-command-leave-to .j-command {
1373
+ opacity: 0;
1374
+ transform: translateY(calc(var(--juxt-motion-shift) * -1)) scale(0.985);
1375
+ }
1376
+ @media (prefers-reduced-motion: reduce) {
1377
+ .j-command-enter-from .j-command,
1378
+ .j-command-leave-to .j-command {
1379
+ transform: none;
1380
+ }
1381
+ }
1382
+ @media (max-width: 639px) {
1383
+ .j-command__positioner {
1384
+ padding: var(--juxt-space-2);
1385
+ }
1386
+ .j-command {
1387
+ max-height: calc(100dvh - var(--juxt-space-4));
1388
+ }
1389
+ .j-command__footer {
1390
+ display: none;
1391
+ }
1392
+ }
1393
+ }
1394
+
1395
+ @layer juxt {
1396
+ .j-dialog__overlay {
1397
+ position: fixed;
1398
+ inset: 0;
1399
+ z-index: var(--juxt-z-overlay);
1400
+ background: var(--juxt-overlay);
1401
+ }
1402
+ .j-dialog__positioner {
1403
+ --j-dialog-shift: calc(var(--juxt-motion-shift) * 2);
1404
+
1405
+ position: fixed;
1406
+ inset: 0;
1407
+ z-index: var(--juxt-z-modal);
1408
+ display: flex;
1409
+ align-items: center;
1410
+ justify-content: center;
1411
+ padding: var(--juxt-space-4);
1412
+ overflow-y: auto;
1413
+ overscroll-behavior: contain;
1414
+ }
1415
+ .j-dialog__panel {
1416
+ position: relative;
1417
+ display: flex;
1418
+ flex-direction: column;
1419
+ width: 100%;
1420
+ max-height: calc(100dvh - var(--juxt-space-8));
1421
+ border: 1px solid var(--juxt-border);
1422
+ border-radius: var(--juxt-radius-lg);
1423
+ background: var(--juxt-surface-raised);
1424
+ box-shadow: var(--juxt-shadow-lg);
1425
+ color: var(--juxt-fg);
1426
+ font-family: var(--juxt-font-sans);
1427
+ outline: none;
1428
+ }
1429
+ .j-dialog__panel--sm {
1430
+ max-width: 25rem;
1431
+ }
1432
+ .j-dialog__panel--md {
1433
+ max-width: 30rem;
1434
+ }
1435
+ .j-dialog__panel--lg {
1436
+ max-width: 40rem;
1437
+ }
1438
+ .j-dialog__header {
1439
+ display: flex;
1440
+ flex-direction: column;
1441
+ gap: var(--juxt-space-1-5);
1442
+ padding: var(--juxt-space-5) var(--juxt-space-12) 0 var(--juxt-space-5);
1443
+ }
1444
+ .j-dialog__title {
1445
+ margin: 0;
1446
+ font-size: var(--juxt-text-lg);
1447
+ font-weight: var(--juxt-weight-semibold);
1448
+ line-height: var(--juxt-leading-snug);
1449
+ letter-spacing: var(--juxt-tracking-tight);
1450
+ }
1451
+ .j-dialog__description {
1452
+ margin: 0;
1453
+ color: var(--juxt-fg-secondary);
1454
+ font-size: var(--juxt-text-md);
1455
+ line-height: var(--juxt-leading-normal);
1456
+ }
1457
+ .j-dialog__body {
1458
+ flex: 1;
1459
+ min-height: 0;
1460
+ padding: var(--juxt-space-4) var(--juxt-space-5) 0;
1461
+ overflow-y: auto;
1462
+ color: var(--juxt-fg-secondary);
1463
+ font-size: var(--juxt-text-md);
1464
+ line-height: var(--juxt-leading-normal);
1465
+ }
1466
+ .j-dialog__header + .j-dialog__footer {
1467
+ margin-top: var(--juxt-space-1);
1468
+ }
1469
+ .j-dialog__footer {
1470
+ display: flex;
1471
+ justify-content: flex-end;
1472
+ gap: var(--juxt-space-2);
1473
+ padding: var(--juxt-space-5);
1474
+ }
1475
+ .j-dialog__body:last-child {
1476
+ padding-bottom: var(--juxt-space-5);
1477
+ }
1478
+ .j-dialog__close {
1479
+ position: absolute;
1480
+ top: var(--juxt-space-3);
1481
+ right: var(--juxt-space-3);
1482
+ display: grid;
1483
+ place-items: center;
1484
+ width: var(--juxt-control-sm);
1485
+ height: var(--juxt-control-sm);
1486
+ padding: 0;
1487
+ border: 0;
1488
+ border-radius: var(--juxt-radius-sm);
1489
+ background: transparent;
1490
+ color: var(--juxt-fg-muted);
1491
+ cursor: pointer;
1492
+ transition-property: background-color, color, outline-color, outline-offset;
1493
+ }
1494
+ .j-dialog__close:hover {
1495
+ background: var(--juxt-surface-hover);
1496
+ color: var(--juxt-fg);
1497
+ }
1498
+ .j-dialog__close > svg {
1499
+ width: 1rem;
1500
+ height: 1rem;
1501
+ }
1502
+
1503
+ /* Motion: the backdrop fades; the panel fades, lifts and settles. */
1504
+ .j-dialog-overlay-enter-active {
1505
+ transition: opacity var(--juxt-duration-normal) var(--juxt-ease-out);
1506
+ }
1507
+ .j-dialog-overlay-leave-active {
1508
+ transition: opacity var(--juxt-duration-fast) var(--juxt-ease-in);
1509
+ }
1510
+ .j-dialog-overlay-enter-from,
1511
+ .j-dialog-overlay-leave-to {
1512
+ opacity: 0;
1513
+ }
1514
+ .j-dialog-enter-active .j-dialog__panel {
1515
+ transition:
1516
+ opacity var(--juxt-duration-normal) var(--juxt-ease-out),
1517
+ transform var(--juxt-duration-slow) var(--juxt-ease-out);
1518
+ }
1519
+ .j-dialog-leave-active .j-dialog__panel {
1520
+ transition:
1521
+ opacity var(--juxt-duration-fast) var(--juxt-ease-in),
1522
+ transform var(--juxt-duration-fast) var(--juxt-ease-in);
1523
+ }
1524
+ .j-dialog-enter-from .j-dialog__panel,
1525
+ .j-dialog-leave-to .j-dialog__panel {
1526
+ opacity: 0;
1527
+ transform: translateY(var(--j-dialog-shift)) scale(var(--juxt-motion-scale));
1528
+ }
1529
+ .j-dialog__panel.is-nudging {
1530
+ animation: j-dialog-nudge 220ms var(--juxt-ease-out);
1531
+ }
1532
+ @keyframes j-dialog-nudge {
1533
+ 40% {
1534
+ transform: scale(1.012);
1535
+ }
1536
+ }
1537
+
1538
+ /* Small screens: a sheet anchored to the bottom, within thumb reach. */
1539
+ @media (max-width: 639px) {
1540
+ .j-dialog__positioner {
1541
+ --j-dialog-shift: calc(var(--juxt-motion-shift) * 6);
1542
+
1543
+ align-items: flex-end;
1544
+ padding: var(--juxt-space-2);
1545
+ padding-bottom: max(var(--juxt-space-2), env(safe-area-inset-bottom));
1546
+ }
1547
+ .j-dialog__panel {
1548
+ max-width: none;
1549
+ max-height: calc(100dvh - var(--juxt-space-12));
1550
+ }
1551
+ .j-dialog-enter-from .j-dialog__panel,
1552
+ .j-dialog-leave-to .j-dialog__panel {
1553
+ transform: translateY(var(--j-dialog-shift));
1554
+ }
1555
+ .j-dialog__footer {
1556
+ flex-direction: column-reverse;
1557
+ }
1558
+ .j-dialog__footer > * {
1559
+ width: 100%;
1560
+ }
1561
+ }
1562
+ }
1563
+
1564
+ @layer juxt {
1565
+ .j-menu {
1566
+ z-index: var(--juxt-z-popover);
1567
+ box-sizing: border-box;
1568
+ min-width: 11rem;
1569
+ max-width: calc(100vw - 16px);
1570
+ max-height: var(--j-available-height, 24rem);
1571
+ padding: var(--juxt-space-1);
1572
+ overflow-y: auto;
1573
+ overscroll-behavior: contain;
1574
+ outline: none;
1575
+ }
1576
+ .j-menu__item {
1577
+ position: relative;
1578
+ display: flex;
1579
+ align-items: center;
1580
+ gap: var(--juxt-space-2);
1581
+ min-height: var(--juxt-control-sm);
1582
+ padding: 0 var(--juxt-space-2);
1583
+ border-radius: var(--juxt-radius-xs);
1584
+ color: var(--juxt-fg);
1585
+ font-size: var(--juxt-text-md);
1586
+ letter-spacing: var(--juxt-tracking-tight);
1587
+ text-decoration: none;
1588
+ cursor: pointer;
1589
+ outline: none;
1590
+ user-select: none;
1591
+ -webkit-tap-highlight-color: transparent;
1592
+ }
1593
+ .j-menu__item:focus,
1594
+ .j-menu__item[aria-expanded='true'] {
1595
+ background: var(--juxt-surface-hover);
1596
+ }
1597
+ .j-menu__item[aria-disabled='true'] {
1598
+ color: var(--juxt-fg-disabled);
1599
+ cursor: not-allowed;
1600
+ }
1601
+ .j-menu__item--destructive {
1602
+ color: var(--juxt-danger-text);
1603
+ }
1604
+ .j-menu__item--destructive:focus {
1605
+ background: var(--juxt-danger-soft);
1606
+ }
1607
+ .j-menu__icon {
1608
+ display: inline-flex;
1609
+ flex: none;
1610
+ color: var(--juxt-fg-muted);
1611
+ }
1612
+ .j-menu__icon > svg {
1613
+ width: 1rem;
1614
+ height: 1rem;
1615
+ }
1616
+ .j-menu__item:focus .j-menu__icon {
1617
+ color: var(--juxt-fg-secondary);
1618
+ }
1619
+ .j-menu__item--destructive .j-menu__icon {
1620
+ color: inherit;
1621
+ }
1622
+ .j-menu__text {
1623
+ flex: 1;
1624
+ min-width: 0;
1625
+ overflow: hidden;
1626
+ text-overflow: ellipsis;
1627
+ white-space: nowrap;
1628
+ }
1629
+ .j-menu__shortcut {
1630
+ margin-left: var(--juxt-space-4);
1631
+ color: var(--juxt-fg-muted);
1632
+ font-size: var(--juxt-text-xs);
1633
+ letter-spacing: 0.04em;
1634
+ }
1635
+ .j-menu__check {
1636
+ flex: none;
1637
+ width: 0.875rem;
1638
+ height: 0.875rem;
1639
+ margin-left: var(--juxt-space-4);
1640
+ color: var(--juxt-accent-text);
1641
+ opacity: 0;
1642
+ }
1643
+ .j-menu__check.is-checked {
1644
+ opacity: 1;
1645
+ }
1646
+ .j-menu__chevron {
1647
+ width: 0.875rem;
1648
+ height: 0.875rem;
1649
+ margin-right: -0.125rem;
1650
+ color: var(--juxt-fg-muted);
1651
+ }
1652
+ .j-menu__separator {
1653
+ height: 1px;
1654
+ margin: var(--juxt-space-1) calc(var(--juxt-space-1) * -1);
1655
+ background: var(--juxt-border-subtle);
1656
+ }
1657
+ .dark .j-menu__separator,
1658
+ [data-theme='dark'] .j-menu__separator {
1659
+ background: var(--juxt-border);
1660
+ }
1661
+ .j-menu__label {
1662
+ padding: var(--juxt-space-1-5) var(--juxt-space-2) var(--juxt-space-1);
1663
+ color: var(--juxt-fg-muted);
1664
+ font-size: var(--juxt-text-xs);
1665
+ font-weight: var(--juxt-weight-medium);
1666
+ }
1667
+ }
1668
+
1669
+ @layer juxt {
1670
+ .j-field {
1671
+ display: flex;
1672
+ flex-direction: column;
1673
+ gap: var(--juxt-space-1-5);
1674
+ min-width: 0;
1675
+ font-family: var(--juxt-font-sans);
1676
+ }
1677
+ .j-field__label {
1678
+ display: inline-flex;
1679
+ align-items: baseline;
1680
+ gap: var(--juxt-space-0-5);
1681
+ width: fit-content;
1682
+ color: var(--juxt-fg);
1683
+ font-size: var(--juxt-text-sm);
1684
+ font-weight: var(--juxt-weight-medium);
1685
+ line-height: var(--juxt-leading-snug);
1686
+ letter-spacing: var(--juxt-tracking-tight);
1687
+ }
1688
+ .j-field.is-disabled .j-field__label {
1689
+ color: var(--juxt-fg-muted);
1690
+ }
1691
+ .j-field__required {
1692
+ color: var(--juxt-fg-muted);
1693
+ font-weight: var(--juxt-weight-regular);
1694
+ }
1695
+ .j-field__messages:empty {
1696
+ display: none;
1697
+ }
1698
+ .j-field__description,
1699
+ .j-field__error {
1700
+ margin: 0;
1701
+ font-size: var(--juxt-text-xs);
1702
+ line-height: var(--juxt-leading-normal);
1703
+ }
1704
+ .j-field__description {
1705
+ color: var(--juxt-fg-muted);
1706
+ }
1707
+ .j-field__error {
1708
+ color: var(--juxt-danger-text);
1709
+ }
1710
+ .j-field-message-enter-active {
1711
+ transition:
1712
+ opacity var(--juxt-duration-fast) var(--juxt-ease-out),
1713
+ transform var(--juxt-duration-normal) var(--juxt-ease-out);
1714
+ }
1715
+ .j-field-message-leave-active {
1716
+ transition: opacity var(--juxt-duration-instant) var(--juxt-ease-in);
1717
+ }
1718
+ .j-field-message-enter-from {
1719
+ opacity: 0;
1720
+ transform: translateY(calc(var(--juxt-motion-shift) * -0.5));
1721
+ }
1722
+ .j-field-message-leave-to {
1723
+ opacity: 0;
1724
+ }
1725
+ }
1726
+
1727
+ @layer juxt {
1728
+ .j-input__native {
1729
+ flex: 1;
1730
+ width: 100%;
1731
+ min-width: 0;
1732
+ height: calc(var(--j-control-height) - 2px);
1733
+ padding: 0;
1734
+ border: 0;
1735
+ outline: 0;
1736
+ background: transparent;
1737
+ color: inherit;
1738
+ font: inherit;
1739
+ letter-spacing: var(--juxt-tracking-tight);
1740
+ }
1741
+ .j-input__native::placeholder {
1742
+ color: var(--juxt-fg-muted);
1743
+ opacity: 1;
1744
+ }
1745
+ .j-input__native:disabled {
1746
+ cursor: not-allowed;
1747
+ }
1748
+ .j-input__native::-webkit-search-cancel-button {
1749
+ display: none;
1750
+ }
1751
+ }
1752
+
1753
+ @layer juxt {
1754
+ .j-select__trigger {
1755
+ width: 100%;
1756
+ justify-content: space-between;
1757
+ text-align: left;
1758
+ cursor: pointer;
1759
+ -webkit-tap-highlight-color: transparent;
1760
+ }
1761
+ .j-select__trigger:focus-visible {
1762
+ outline: none;
1763
+ }
1764
+ .j-select__trigger:focus-visible:not(.is-invalid) {
1765
+ border-color: var(--juxt-accent);
1766
+ box-shadow: 0 0 0 3px var(--juxt-ring-soft);
1767
+ }
1768
+ .j-select__trigger:disabled {
1769
+ cursor: not-allowed;
1770
+ }
1771
+ .j-select__value {
1772
+ overflow: hidden;
1773
+ min-width: 0;
1774
+ text-overflow: ellipsis;
1775
+ white-space: nowrap;
1776
+ letter-spacing: var(--juxt-tracking-tight);
1777
+ }
1778
+ .j-select__value.is-placeholder {
1779
+ color: var(--juxt-fg-muted);
1780
+ }
1781
+ .j-select__trigger.is-disabled .j-select__value {
1782
+ color: var(--juxt-fg-disabled);
1783
+ }
1784
+ .j-select__chevron {
1785
+ flex: none;
1786
+ width: 0.875rem;
1787
+ height: 0.875rem;
1788
+ margin-right: -0.125rem;
1789
+ color: var(--juxt-fg-muted);
1790
+ }
1791
+ .j-select__listbox {
1792
+ z-index: var(--juxt-z-popover);
1793
+ box-sizing: border-box;
1794
+ max-width: calc(100vw - 16px);
1795
+ max-height: min(18rem, var(--j-available-height, 18rem));
1796
+ margin: 0;
1797
+ padding: var(--juxt-space-1);
1798
+ overflow-y: auto;
1799
+ overscroll-behavior: contain;
1800
+ list-style: none;
1801
+ outline: none;
1802
+ scroll-padding-block: var(--juxt-space-1);
1803
+ }
1804
+ .j-select__option {
1805
+ position: relative;
1806
+ display: flex;
1807
+ align-items: center;
1808
+ gap: var(--juxt-space-2);
1809
+ min-height: var(--juxt-control-sm);
1810
+ padding: var(--juxt-space-1-5) var(--juxt-space-2);
1811
+ border-radius: var(--juxt-radius-xs);
1812
+ color: var(--juxt-fg);
1813
+ font-size: var(--juxt-text-md);
1814
+ letter-spacing: var(--juxt-tracking-tight);
1815
+ cursor: pointer;
1816
+ user-select: none;
1817
+ }
1818
+ .j-select__option.is-active {
1819
+ background: var(--juxt-surface-hover);
1820
+ }
1821
+ .j-select__option[aria-disabled='true'] {
1822
+ color: var(--juxt-fg-disabled);
1823
+ cursor: not-allowed;
1824
+ }
1825
+ .j-select__option-text {
1826
+ display: flex;
1827
+ flex: 1;
1828
+ flex-direction: column;
1829
+ gap: 1px;
1830
+ min-width: 0;
1831
+ }
1832
+ .j-select__option-label {
1833
+ overflow: hidden;
1834
+ text-overflow: ellipsis;
1835
+ white-space: nowrap;
1836
+ }
1837
+ .j-select__option-description {
1838
+ color: var(--juxt-fg-muted);
1839
+ font-size: var(--juxt-text-xs);
1840
+ }
1841
+ .j-select__check {
1842
+ flex: none;
1843
+ width: 0.875rem;
1844
+ height: 0.875rem;
1845
+ color: var(--juxt-accent-text);
1846
+ opacity: 0;
1847
+ transform: scale(0.8);
1848
+ transition:
1849
+ opacity var(--juxt-duration-fast) var(--juxt-ease-out),
1850
+ transform var(--juxt-duration-fast) var(--juxt-ease-out);
1851
+ }
1852
+ .j-select__option.is-selected .j-select__check {
1853
+ opacity: 1;
1854
+ transform: none;
1855
+ }
1856
+ .j-select__empty {
1857
+ padding: var(--juxt-space-3) var(--juxt-space-2);
1858
+ color: var(--juxt-fg-muted);
1859
+ font-size: var(--juxt-text-sm);
1860
+ text-align: center;
1861
+ }
1862
+ }
1863
+
1864
+ @layer juxt {
1865
+ .j-switch {
1866
+ --j-switch-w: 2rem;
1867
+ --j-switch-h: 1.125rem;
1868
+ --j-switch-pad: 2px;
1869
+ --j-switch-thumb: calc(var(--j-switch-h) - var(--j-switch-pad) * 2);
1870
+
1871
+ display: inline-flex;
1872
+ align-items: flex-start;
1873
+ gap: var(--juxt-space-2-5);
1874
+ font-family: var(--juxt-font-sans);
1875
+ }
1876
+ .j-switch--sm {
1877
+ --j-switch-w: 1.625rem;
1878
+ --j-switch-h: 0.9375rem;
1879
+ }
1880
+ .j-switch__track {
1881
+ position: relative;
1882
+ flex: none;
1883
+ width: var(--j-switch-w);
1884
+ height: var(--j-switch-h);
1885
+ margin: calc((var(--juxt-text-md) * var(--juxt-leading-snug) - var(--j-switch-h)) / 2) 0 0;
1886
+ padding: 0;
1887
+ border: 0;
1888
+ border-radius: var(--juxt-radius-full);
1889
+ background: var(--juxt-border-strong);
1890
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.08);
1891
+ cursor: pointer;
1892
+ outline: 2px solid transparent;
1893
+ outline-offset: 0;
1894
+ -webkit-tap-highlight-color: transparent;
1895
+ transition:
1896
+ background-color var(--juxt-duration-normal) var(--juxt-ease-standard),
1897
+ outline-color var(--juxt-duration-fast) var(--juxt-ease-out),
1898
+ outline-offset var(--juxt-duration-fast) var(--juxt-ease-out);
1899
+ }
1900
+ .j-switch__track:hover:not(:disabled) {
1901
+ background: var(--juxt-fg-disabled);
1902
+ }
1903
+ .j-switch__track:focus-visible {
1904
+ outline-color: var(--juxt-ring);
1905
+ outline-offset: 2px;
1906
+ }
1907
+ .j-switch[data-state='on'] .j-switch__track {
1908
+ background: var(--juxt-accent);
1909
+ }
1910
+ .j-switch[data-state='on'] .j-switch__track:hover:not(:disabled) {
1911
+ background: var(--juxt-accent-hover);
1912
+ }
1913
+ .j-switch__thumb {
1914
+ position: absolute;
1915
+ top: var(--j-switch-pad);
1916
+ left: var(--j-switch-pad);
1917
+ width: var(--j-switch-thumb);
1918
+ height: var(--j-switch-thumb);
1919
+ border-radius: var(--juxt-radius-full);
1920
+ background: #fff;
1921
+ box-shadow: 0 1px 2px rgb(0 0 0 / 0.2), 0 0 0 0.5px rgb(0 0 0 / 0.04);
1922
+ transition:
1923
+ transform var(--juxt-duration-normal) var(--juxt-ease-out),
1924
+ width var(--juxt-duration-fast) var(--juxt-ease-out);
1925
+ }
1926
+ .j-switch[data-state='on'] .j-switch__thumb {
1927
+ transform: translateX(calc(var(--j-switch-w) - var(--j-switch-thumb) - var(--j-switch-pad) * 2));
1928
+ }
1929
+
1930
+ /* A whisper of stretch while pressed, so the thumb feels held. */
1931
+ .j-switch__track:active:not(:disabled) .j-switch__thumb {
1932
+ width: calc(var(--j-switch-thumb) + 3px);
1933
+ }
1934
+ .j-switch[data-state='on'] .j-switch__track:active:not(:disabled) .j-switch__thumb {
1935
+ transform: translateX(calc(var(--j-switch-w) - var(--j-switch-thumb) - var(--j-switch-pad) * 2 - 3px));
1936
+ }
1937
+ @media (prefers-reduced-motion: reduce) {
1938
+ .j-switch__track:active:not(:disabled) .j-switch__thumb {
1939
+ width: var(--j-switch-thumb);
1940
+ }
1941
+ .j-switch[data-state='on'] .j-switch__track:active:not(:disabled) .j-switch__thumb {
1942
+ transform: translateX(calc(var(--j-switch-w) - var(--j-switch-thumb) - var(--j-switch-pad) * 2));
1943
+ }
1944
+ }
1945
+ .j-switch__text {
1946
+ display: flex;
1947
+ flex-direction: column;
1948
+ gap: var(--juxt-space-0-5);
1949
+ min-width: 0;
1950
+ }
1951
+ .j-switch__label {
1952
+ color: var(--juxt-fg);
1953
+ font-size: var(--juxt-text-md);
1954
+ line-height: var(--juxt-leading-snug);
1955
+ letter-spacing: var(--juxt-tracking-tight);
1956
+ cursor: pointer;
1957
+ user-select: none;
1958
+ }
1959
+ .j-switch__description {
1960
+ color: var(--juxt-fg-muted);
1961
+ font-size: var(--juxt-text-sm);
1962
+ line-height: var(--juxt-leading-normal);
1963
+ }
1964
+ .j-switch.is-disabled .j-switch__track {
1965
+ cursor: not-allowed;
1966
+ opacity: 0.5;
1967
+ }
1968
+ .j-switch.is-disabled .j-switch__label {
1969
+ color: var(--juxt-fg-muted);
1970
+ cursor: not-allowed;
1971
+ }
1972
+ }
1973
+
1974
+ @layer juxt {
1975
+ .j-tabs {
1976
+ --j-tab-height: var(--juxt-control-md);
1977
+ --j-tab-font: var(--juxt-text-md);
1978
+
1979
+ display: flex;
1980
+ flex-direction: column;
1981
+ min-width: 0;
1982
+ font-family: var(--juxt-font-sans);
1983
+ }
1984
+ .j-tabs--sm {
1985
+ --j-tab-height: var(--juxt-control-sm);
1986
+ --j-tab-font: var(--juxt-text-sm);
1987
+ }
1988
+ .j-tabs__list {
1989
+ position: relative;
1990
+ display: flex;
1991
+ align-items: center;
1992
+ max-width: 100%;
1993
+ overflow-x: auto;
1994
+ scrollbar-width: none;
1995
+ }
1996
+ .j-tabs__list::-webkit-scrollbar {
1997
+ display: none;
1998
+ }
1999
+ .j-tabs__tab {
2000
+ position: relative;
2001
+ z-index: 1;
2002
+ display: inline-flex;
2003
+ flex: none;
2004
+ align-items: center;
2005
+ justify-content: center;
2006
+ gap: var(--juxt-space-1-5);
2007
+ height: var(--j-tab-height);
2008
+ padding: 0 var(--juxt-space-3);
2009
+ border: 0;
2010
+ background: transparent;
2011
+ color: var(--juxt-fg-muted);
2012
+ font: inherit;
2013
+ font-size: var(--j-tab-font);
2014
+ font-weight: var(--juxt-weight-medium);
2015
+ letter-spacing: var(--juxt-tracking-tight);
2016
+ white-space: nowrap;
2017
+ cursor: pointer;
2018
+ outline: 2px solid transparent;
2019
+ outline-offset: -2px;
2020
+ -webkit-tap-highlight-color: transparent;
2021
+ transition:
2022
+ color var(--juxt-duration-fast) var(--juxt-ease-standard),
2023
+ outline-color var(--juxt-duration-fast) var(--juxt-ease-out);
2024
+ }
2025
+ .j-tabs__tab:hover:not(:disabled) {
2026
+ color: var(--juxt-fg-secondary);
2027
+ }
2028
+ .j-tabs__tab[aria-selected='true'] {
2029
+ color: var(--juxt-fg);
2030
+ }
2031
+ .j-tabs__tab:focus-visible {
2032
+ outline-color: var(--juxt-ring);
2033
+ }
2034
+ .j-tabs__tab:disabled {
2035
+ color: var(--juxt-fg-disabled);
2036
+ cursor: not-allowed;
2037
+ }
2038
+ .j-tabs--fill .j-tabs__tab {
2039
+ flex: 1;
2040
+ }
2041
+ .j-tabs__indicator {
2042
+ position: absolute;
2043
+ left: 0;
2044
+ opacity: 0;
2045
+ pointer-events: none;
2046
+ }
2047
+ .j-tabs__indicator.is-ready {
2048
+ opacity: 1;
2049
+ }
2050
+ .j-tabs__indicator.is-animated {
2051
+ transition:
2052
+ transform var(--juxt-duration-slow) var(--juxt-ease-out),
2053
+ width var(--juxt-duration-slow) var(--juxt-ease-out);
2054
+ }
2055
+ @media (prefers-reduced-motion: reduce) {
2056
+ .j-tabs__indicator.is-animated {
2057
+ transition: none;
2058
+ }
2059
+ }
2060
+
2061
+ /* Line */
2062
+ .j-tabs--line .j-tabs__list {
2063
+ gap: var(--juxt-space-1);
2064
+ box-shadow: inset 0 -1px 0 var(--juxt-border);
2065
+ }
2066
+ .j-tabs--line .j-tabs__tab {
2067
+ padding: 0 var(--juxt-space-2);
2068
+ border-radius: var(--juxt-radius-sm) var(--juxt-radius-sm) 0 0;
2069
+ }
2070
+ .j-tabs--line .j-tabs__indicator {
2071
+ bottom: 0;
2072
+ height: 2px;
2073
+ border-radius: 2px 2px 0 0;
2074
+ background: var(--juxt-fg);
2075
+ }
2076
+
2077
+ /* Pill */
2078
+ .j-tabs--pill .j-tabs__list {
2079
+ align-self: flex-start;
2080
+ padding: 3px;
2081
+ border-radius: var(--juxt-radius-md);
2082
+ background: var(--juxt-surface-sunken);
2083
+ box-shadow: inset 0 0 0 1px var(--juxt-border-subtle);
2084
+ }
2085
+ .j-tabs--pill.j-tabs--fill .j-tabs__list {
2086
+ align-self: stretch;
2087
+ }
2088
+ .j-tabs--pill .j-tabs__tab {
2089
+ --j-tab-height: calc(var(--juxt-control-md) - 6px);
2090
+
2091
+ border-radius: var(--juxt-radius-sm);
2092
+ }
2093
+ .j-tabs--pill.j-tabs--sm .j-tabs__tab {
2094
+ --j-tab-height: calc(var(--juxt-control-sm) - 6px);
2095
+
2096
+ padding: 0 var(--juxt-space-2-5);
2097
+ }
2098
+ .j-tabs--pill .j-tabs__indicator {
2099
+ top: 3px;
2100
+ bottom: 3px;
2101
+ border-radius: var(--juxt-radius-sm);
2102
+ background: var(--juxt-surface);
2103
+ box-shadow: var(--juxt-shadow-sm);
2104
+ }
2105
+ .dark .j-tabs--pill .j-tabs__indicator,
2106
+ [data-theme='dark'] .j-tabs--pill .j-tabs__indicator {
2107
+ background: var(--juxt-surface-active);
2108
+ }
2109
+
2110
+ /* Panels */
2111
+ .j-tabs__panel {
2112
+ padding-top: var(--juxt-space-4);
2113
+ border-radius: var(--juxt-radius-sm);
2114
+ outline: 2px solid transparent;
2115
+ outline-offset: 2px;
2116
+ animation: j-tabs-panel-in var(--juxt-duration-normal) var(--juxt-ease-out);
2117
+ }
2118
+ .j-tabs__panel:focus-visible {
2119
+ outline-color: var(--juxt-ring);
2120
+ }
2121
+ @keyframes j-tabs-panel-in {
2122
+ from {
2123
+ opacity: 0;
2124
+ }
2125
+ }
2126
+ }
2127
+
2128
+ @layer juxt {
2129
+ .j-textarea {
2130
+ align-items: stretch;
2131
+ padding: 0;
2132
+ cursor: auto;
2133
+ }
2134
+ .j-textarea__native {
2135
+ display: block;
2136
+ width: 100%;
2137
+ min-height: calc(var(--juxt-control-md) * 2);
2138
+ padding: var(--juxt-space-2) var(--juxt-space-2-5);
2139
+ border: 0;
2140
+ border-radius: inherit;
2141
+ outline: 0;
2142
+ background: transparent;
2143
+ color: inherit;
2144
+ font: inherit;
2145
+ line-height: var(--juxt-leading-normal);
2146
+ letter-spacing: var(--juxt-tracking-tight);
2147
+ resize: vertical;
2148
+ }
2149
+ .j-textarea__native.is-autoresize {
2150
+ resize: none;
2151
+ overflow-y: hidden;
2152
+ }
2153
+ .j-textarea__native::placeholder {
2154
+ color: var(--juxt-fg-muted);
2155
+ opacity: 1;
2156
+ }
2157
+ .j-textarea__native:disabled {
2158
+ cursor: not-allowed;
2159
+ resize: none;
2160
+ }
2161
+ }
2162
+
2163
+ @layer juxt {
2164
+ .j-toaster {
2165
+ --j-toast-width: 22.5rem;
2166
+ --j-toast-edge: var(--juxt-space-4);
2167
+
2168
+ position: fixed;
2169
+ z-index: var(--juxt-z-toast);
2170
+ width: var(--j-toast-width);
2171
+ max-width: calc(100vw - var(--j-toast-edge) * 2);
2172
+ pointer-events: none;
2173
+ }
2174
+ .j-toaster--top-left,
2175
+ .j-toaster--top-center,
2176
+ .j-toaster--top-right {
2177
+ top: max(var(--j-toast-edge), env(safe-area-inset-top));
2178
+ }
2179
+ .j-toaster--bottom-left,
2180
+ .j-toaster--bottom-center,
2181
+ .j-toaster--bottom-right {
2182
+ bottom: max(var(--j-toast-edge), env(safe-area-inset-bottom));
2183
+ }
2184
+ .j-toaster--top-left,
2185
+ .j-toaster--bottom-left {
2186
+ left: var(--j-toast-edge);
2187
+ }
2188
+ .j-toaster--top-right,
2189
+ .j-toaster--bottom-right {
2190
+ right: calc(var(--j-toast-edge) + var(--juxt-scrollbar-width, 0px));
2191
+ }
2192
+ .j-toaster--top-center,
2193
+ .j-toaster--bottom-center {
2194
+ left: 50%;
2195
+ transform: translateX(-50%);
2196
+ }
2197
+ .j-toaster__list {
2198
+ position: relative;
2199
+ display: flex;
2200
+ flex-direction: column;
2201
+ gap: var(--juxt-space-2);
2202
+ margin: 0;
2203
+ padding: 0;
2204
+ list-style: none;
2205
+ }
2206
+ .j-toast {
2207
+ --j-toast-enter: calc(var(--juxt-motion-shift) * 3);
2208
+
2209
+ position: relative;
2210
+ display: flex;
2211
+ align-items: flex-start;
2212
+ gap: var(--juxt-space-2-5);
2213
+ box-sizing: border-box;
2214
+ width: 100%;
2215
+ padding: var(--juxt-space-3) var(--juxt-space-10) var(--juxt-space-3) var(--juxt-space-3);
2216
+ overflow: hidden;
2217
+ border: 1px solid var(--juxt-border);
2218
+ border-radius: var(--juxt-radius-md);
2219
+ background: var(--juxt-surface-raised);
2220
+ box-shadow: var(--juxt-shadow-md);
2221
+ color: var(--juxt-fg);
2222
+ font-family: var(--juxt-font-sans);
2223
+ pointer-events: auto;
2224
+ opacity: var(--j-toast-swipe-opacity, 1);
2225
+ transform: translateX(var(--j-toast-swipe, 0));
2226
+ outline: 2px solid transparent;
2227
+ outline-offset: 0;
2228
+ touch-action: pan-y;
2229
+ transition:
2230
+ transform var(--juxt-duration-slow) var(--juxt-ease-out),
2231
+ opacity var(--juxt-duration-normal) var(--juxt-ease-out),
2232
+ outline-color var(--juxt-duration-fast) var(--juxt-ease-out),
2233
+ outline-offset var(--juxt-duration-fast) var(--juxt-ease-out);
2234
+ }
2235
+ .j-toaster--top-left .j-toast,
2236
+ .j-toaster--top-center .j-toast,
2237
+ .j-toaster--top-right .j-toast {
2238
+ --j-toast-enter: calc(var(--juxt-motion-shift) * -3);
2239
+ }
2240
+ .j-toast.is-swiping {
2241
+ transition: none;
2242
+ user-select: none;
2243
+ }
2244
+ .j-toast:focus-visible {
2245
+ outline-color: var(--juxt-ring);
2246
+ outline-offset: 2px;
2247
+ }
2248
+ .j-toast__icon {
2249
+ display: grid;
2250
+ flex: none;
2251
+ place-items: center;
2252
+ width: 1rem;
2253
+ height: 1.25rem;
2254
+ }
2255
+ .j-toast__icon > svg {
2256
+ width: 1rem;
2257
+ height: 1rem;
2258
+ }
2259
+ .j-toast--success .j-toast__icon {
2260
+ color: var(--juxt-success-text);
2261
+ }
2262
+ .j-toast--error .j-toast__icon {
2263
+ color: var(--juxt-danger-text);
2264
+ }
2265
+ .j-toast--warning .j-toast__icon {
2266
+ color: var(--juxt-warning-text);
2267
+ }
2268
+ .j-toast--info .j-toast__icon {
2269
+ color: var(--juxt-info-text);
2270
+ }
2271
+ .j-toast--loading .j-toast__icon {
2272
+ color: var(--juxt-fg-muted);
2273
+ }
2274
+ .j-toast__body {
2275
+ display: flex;
2276
+ flex: 1;
2277
+ flex-direction: column;
2278
+ gap: var(--juxt-space-0-5);
2279
+ min-width: 0;
2280
+ }
2281
+ .j-toast__title {
2282
+ margin: 0;
2283
+ font-size: var(--juxt-text-md);
2284
+ font-weight: var(--juxt-weight-medium);
2285
+ line-height: 1.25rem;
2286
+ letter-spacing: var(--juxt-tracking-tight);
2287
+ }
2288
+ .j-toast__description {
2289
+ margin: 0;
2290
+ color: var(--juxt-fg-secondary);
2291
+ font-size: var(--juxt-text-sm);
2292
+ line-height: var(--juxt-leading-normal);
2293
+ }
2294
+ .j-toast__actions {
2295
+ display: flex;
2296
+ gap: var(--juxt-space-2);
2297
+ margin-top: var(--juxt-space-2);
2298
+ }
2299
+ .j-toast__action {
2300
+ height: var(--juxt-control-xs);
2301
+ padding: 0 var(--juxt-space-2);
2302
+ border: 1px solid var(--juxt-border);
2303
+ border-radius: var(--juxt-radius-xs);
2304
+ background: var(--juxt-surface);
2305
+ color: var(--juxt-fg);
2306
+ font: inherit;
2307
+ font-size: var(--juxt-text-xs);
2308
+ font-weight: var(--juxt-weight-medium);
2309
+ cursor: pointer;
2310
+ transition-property: background-color, border-color, outline-color, outline-offset;
2311
+ }
2312
+ .j-toast__action:hover {
2313
+ border-color: var(--juxt-border-strong);
2314
+ background: var(--juxt-surface-hover);
2315
+ }
2316
+ .j-toast__close {
2317
+ position: absolute;
2318
+ top: var(--juxt-space-2-5);
2319
+ right: var(--juxt-space-2-5);
2320
+ display: grid;
2321
+ place-items: center;
2322
+ width: 1.5rem;
2323
+ height: 1.5rem;
2324
+ padding: 0;
2325
+ border: 0;
2326
+ border-radius: var(--juxt-radius-xs);
2327
+ background: transparent;
2328
+ color: var(--juxt-fg-muted);
2329
+ cursor: pointer;
2330
+ transition-property: background-color, color, outline-color, outline-offset;
2331
+ }
2332
+ .j-toast__close:hover {
2333
+ background: var(--juxt-surface-hover);
2334
+ color: var(--juxt-fg);
2335
+ }
2336
+ .j-toast__close > svg {
2337
+ width: 0.875rem;
2338
+ height: 0.875rem;
2339
+ }
2340
+
2341
+ /* Remaining time, drawn as a hairline that drains toward the start. */
2342
+ .j-toast__progress {
2343
+ position: absolute;
2344
+ right: 0;
2345
+ bottom: 0;
2346
+ left: 0;
2347
+ height: 2px;
2348
+ background: var(--juxt-border-strong);
2349
+ opacity: 0.6;
2350
+ transform-origin: left;
2351
+ animation: j-toast-progress linear forwards;
2352
+ }
2353
+ .j-toast--success .j-toast__progress {
2354
+ background: var(--juxt-accent-border);
2355
+ }
2356
+ .j-toast__progress.is-paused {
2357
+ animation-play-state: paused;
2358
+ }
2359
+ @keyframes j-toast-progress {
2360
+ from {
2361
+ transform: scaleX(1);
2362
+ }
2363
+ to {
2364
+ transform: scaleX(0);
2365
+ }
2366
+ }
2367
+
2368
+ /* List motion */
2369
+ .j-toast-enter-from {
2370
+ opacity: 0;
2371
+ transform: translateY(var(--j-toast-enter)) scale(0.98);
2372
+ }
2373
+ .j-toast-leave-active {
2374
+ position: absolute;
2375
+ width: 100%;
2376
+ transition:
2377
+ opacity var(--juxt-duration-fast) var(--juxt-ease-in),
2378
+ transform var(--juxt-duration-normal) var(--juxt-ease-in);
2379
+ }
2380
+ .j-toast-leave-to {
2381
+ opacity: 0;
2382
+ transform: scale(0.96);
2383
+ }
2384
+ .j-toast-leave-to.is-swiped {
2385
+ transform: translateX(calc(var(--j-toast-width) * var(--j-swipe-sign, 1)));
2386
+ }
2387
+ .j-toast-leave-to.is-swiped[data-swipe-direction='-1'] {
2388
+ --j-swipe-sign: -1;
2389
+ }
2390
+ .j-toast-move {
2391
+ transition: transform var(--juxt-duration-slow) var(--juxt-ease-out);
2392
+ }
2393
+ .j-toast-icon-enter-active,
2394
+ .j-toast-icon-leave-active {
2395
+ transition:
2396
+ opacity var(--juxt-duration-fast) var(--juxt-ease-out),
2397
+ transform var(--juxt-duration-fast) var(--juxt-ease-out);
2398
+ }
2399
+ .j-toast-icon-enter-from,
2400
+ .j-toast-icon-leave-to {
2401
+ opacity: 0;
2402
+ transform: scale(0.6);
2403
+ }
2404
+ @media (max-width: 639px) {
2405
+ .j-toaster {
2406
+ --j-toast-edge: var(--juxt-space-2);
2407
+
2408
+ right: var(--j-toast-edge);
2409
+ left: var(--j-toast-edge);
2410
+ width: auto;
2411
+ max-width: none;
2412
+ transform: none;
2413
+ }
2414
+ }
2415
+ }
2416
+
2417
+ @layer juxt {
2418
+ .j-tooltip {
2419
+ z-index: var(--juxt-z-tooltip);
2420
+ box-sizing: border-box;
2421
+ max-width: min(17.5rem, calc(100vw - 16px));
2422
+ padding: var(--juxt-space-1) var(--juxt-space-2);
2423
+ border: 1px solid var(--juxt-tooltip-border);
2424
+ border-radius: var(--juxt-radius-sm);
2425
+ background: var(--juxt-tooltip-bg);
2426
+ box-shadow: var(--juxt-shadow-sm);
2427
+ color: var(--juxt-tooltip-fg);
2428
+ font-family: var(--juxt-font-sans);
2429
+ font-size: var(--juxt-text-xs);
2430
+ font-weight: var(--juxt-weight-medium);
2431
+ line-height: var(--juxt-leading-snug);
2432
+ letter-spacing: 0;
2433
+ overflow-wrap: break-word;
2434
+ pointer-events: auto;
2435
+ }
2436
+ .j-tooltip .j-kbd {
2437
+ height: 1rem;
2438
+ min-width: 1rem;
2439
+ margin-left: var(--juxt-space-1);
2440
+ border-color: rgb(255 255 255 / 0.14);
2441
+ background: rgb(255 255 255 / 0.08);
2442
+ color: rgb(255 255 255 / 0.72);
2443
+ }
2444
+ .j-tooltip-enter-active {
2445
+ transition:
2446
+ opacity var(--juxt-duration-fast) var(--juxt-ease-out),
2447
+ transform var(--juxt-duration-fast) var(--juxt-ease-out);
2448
+ }
2449
+ .j-tooltip-leave-active {
2450
+ transition: opacity var(--juxt-duration-instant) var(--juxt-ease-in);
2451
+ }
2452
+ .j-tooltip-enter-from,
2453
+ .j-tooltip-leave-to {
2454
+ opacity: 0;
2455
+ }
2456
+ .j-tooltip-enter-from {
2457
+ transform: translate(
2458
+ calc(var(--juxt-motion-shift) * 0.5 * var(--j-pop-x, 0)),
2459
+ calc(var(--juxt-motion-shift) * 0.5 * var(--j-pop-dir, 0))
2460
+ );
2461
+ }
2462
+ }
2463
+ /*$vite$:1*/