@devalok/shilp-sutra 0.57.0 → 0.60.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.
- package/MIGRATION.md +163 -0
- package/dist/_chunks/badge-group.js +75 -188
- package/dist/_chunks/badge-group.js.map +1 -1
- package/dist/_chunks/chat.js +244 -243
- package/dist/_chunks/chat.js.map +1 -1
- package/dist/_chunks/image-preview.js +71 -70
- package/dist/_chunks/image-preview.js.map +1 -1
- package/dist/_chunks/motion-preference.js +15 -0
- package/dist/_chunks/motion-preference.js.map +1 -0
- package/dist/_chunks/motion-provider.js +1 -1
- package/dist/_chunks/motion-provider.js.map +1 -1
- package/dist/_chunks/popover.js +50 -49
- package/dist/_chunks/popover.js.map +1 -1
- package/dist/_chunks/primitives-internal.js +29 -29
- package/dist/_chunks/primitives-internal.js.map +1 -1
- package/dist/_chunks/shared.js +48 -47
- package/dist/_chunks/shared.js.map +1 -1
- package/dist/_chunks/success.js +34 -34
- package/dist/_chunks/tree-view.js +1 -1
- package/dist/_chunks/tree-view.js.map +1 -1
- package/dist/ai/block-renderer.js +8 -8
- package/dist/ai/command-bar.js +65 -65
- package/dist/ai/command-bar.js.map +1 -1
- package/dist/ai/conversation.js +35 -35
- package/dist/ai/conversation.js.map +1 -1
- package/dist/ai/index.js +4 -4
- package/dist/composed/activity-feed.d.ts.map +1 -1
- package/dist/composed/activity-feed.js +108 -107
- package/dist/composed/activity-feed.js.map +1 -1
- package/dist/composed/avatar-group.js +3 -3
- package/dist/composed/avatar-group.js.map +1 -1
- package/dist/composed/bulk-action-bar.d.ts +9 -35
- package/dist/composed/bulk-action-bar.d.ts.map +1 -1
- package/dist/composed/bulk-action-bar.js +2 -139
- package/dist/composed/command-palette.js +137 -137
- package/dist/composed/command-palette.js.map +1 -1
- package/dist/composed/content-card.js +1 -1
- package/dist/composed/content-card.js.map +1 -1
- package/dist/composed/date-picker/index.js +5 -5
- package/dist/composed/date-picker/index.js.map +1 -1
- package/dist/composed/empty-state.js +4 -4
- package/dist/composed/file-preview/image-preview.d.ts.map +1 -1
- package/dist/composed/file-preview/shared.d.ts.map +1 -1
- package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
- package/dist/composed/file-preview.js +151 -150
- package/dist/composed/file-preview.js.map +1 -1
- package/dist/composed/filter-bar.d.ts.map +1 -1
- package/dist/composed/filter-bar.js +53 -52
- package/dist/composed/filter-bar.js.map +1 -1
- package/dist/composed/form-section.d.ts.map +1 -1
- package/dist/composed/form-section.js +38 -37
- package/dist/composed/form-section.js.map +1 -1
- package/dist/composed/index.js +6 -5
- package/dist/composed/master-detail.d.ts.map +1 -1
- package/dist/composed/master-detail.js +1 -1
- package/dist/composed/master-detail.js.map +1 -1
- package/dist/composed/multi-select-popover.d.ts.map +1 -1
- package/dist/composed/multi-select-popover.js +109 -108
- package/dist/composed/multi-select-popover.js.map +1 -1
- package/dist/composed/rich-chat-input/attachment-strip.d.ts.map +1 -1
- package/dist/composed/rich-chat-input/reply-banner.d.ts.map +1 -1
- package/dist/composed/rich-chat-input/schedule-send.d.ts.map +1 -1
- package/dist/composed/rich-chat-input.d.ts.map +1 -1
- package/dist/composed/rich-chat-input.js +467 -466
- package/dist/composed/rich-chat-input.js.map +1 -1
- package/dist/composed/rich-text-editor.js +3 -3
- package/dist/composed/rich-text-editor.js.map +1 -1
- package/dist/composed/schedule-view.js +2 -2
- package/dist/composed/schedule-view.js.map +1 -1
- package/dist/composed/status-badge.d.ts.map +1 -1
- package/dist/composed/status-badge.js +29 -28
- package/dist/composed/status-badge.js.map +1 -1
- package/dist/motion/index.d.ts +1 -0
- package/dist/motion/index.d.ts.map +1 -1
- package/dist/motion/index.js +2 -15
- package/dist/motion/motion-preference.d.ts +36 -0
- package/dist/motion/motion-preference.d.ts.map +1 -0
- package/dist/motion/motion-provider.d.ts +2 -1
- package/dist/motion/motion-provider.d.ts.map +1 -1
- package/dist/motion/primitives-index.js +103 -102
- package/dist/motion/primitives-index.js.map +1 -1
- package/dist/motion/primitives.d.ts.map +1 -1
- package/dist/shell/bottom-navbar.js +19 -19
- package/dist/shell/bottom-navbar.js.map +1 -1
- package/dist/shell/index.d.ts +1 -1
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/notification-center.d.ts +17 -0
- package/dist/shell/notification-center.d.ts.map +1 -1
- package/dist/shell/notification-center.js +109 -104
- package/dist/shell/notification-center.js.map +1 -1
- package/dist/shell/notification-preferences.js +1 -1
- package/dist/shell/notification-preferences.js.map +1 -1
- package/dist/shell/top-bar.js +1 -1
- package/dist/shell/top-bar.js.map +1 -1
- package/dist/tokens/index.css +1 -0
- package/dist/tokens/palettes.css +292 -0
- package/dist/tokens/semantic.css +157 -11
- package/dist/tokens/shilp-sutra.css +1 -0
- package/dist/tokens/utilities.css +10 -7
- package/dist/ui/accordion.d.ts.map +1 -1
- package/dist/ui/accordion.js +27 -26
- package/dist/ui/accordion.js.map +1 -1
- package/dist/ui/alert-dialog.d.ts.map +1 -1
- package/dist/ui/alert-dialog.js +60 -59
- package/dist/ui/alert-dialog.js.map +1 -1
- package/dist/ui/alert.d.ts.map +1 -1
- package/dist/ui/alert.js +55 -113
- package/dist/ui/alert.js.map +1 -1
- package/dist/ui/autocomplete.js +80 -80
- package/dist/ui/autocomplete.js.map +1 -1
- package/dist/ui/avatar.d.ts.map +1 -1
- package/dist/ui/avatar.js +71 -70
- package/dist/ui/avatar.js.map +1 -1
- package/dist/ui/badge-indicator.d.ts +4 -8
- package/dist/ui/badge-indicator.d.ts.map +1 -1
- package/dist/ui/badge-indicator.js +3 -8
- package/dist/ui/badge-indicator.js.map +1 -1
- package/dist/ui/badge.d.ts +8 -1
- package/dist/ui/badge.d.ts.map +1 -1
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +42 -40
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/bulk-action-bar.d.ts +59 -0
- package/dist/ui/bulk-action-bar.d.ts.map +1 -0
- package/dist/ui/bulk-action-bar.js +145 -0
- package/dist/ui/bulk-action-bar.js.map +1 -0
- package/dist/ui/button-group.d.ts.map +1 -1
- package/dist/ui/button-group.js +3 -23
- package/dist/ui/button-group.js.map +1 -1
- package/dist/ui/button.d.ts +10 -1
- package/dist/ui/button.d.ts.map +1 -1
- package/dist/ui/button.js +79 -212
- package/dist/ui/button.js.map +1 -1
- package/dist/ui/card.d.ts.map +1 -1
- package/dist/ui/card.js +75 -72
- package/dist/ui/card.js.map +1 -1
- package/dist/ui/charts/radar-chart.d.ts.map +1 -1
- package/dist/ui/charts/radar-chart.js +1 -1
- package/dist/ui/charts/radar-chart.js.map +1 -1
- package/dist/ui/chat/message-list.d.ts.map +1 -1
- package/dist/ui/chat/message.d.ts.map +1 -1
- package/dist/ui/chat/typing-indicator.d.ts.map +1 -1
- package/dist/ui/checkbox.d.ts.map +1 -1
- package/dist/ui/checkbox.js +1 -1
- package/dist/ui/checkbox.js.map +1 -1
- package/dist/ui/code.js +1 -1
- package/dist/ui/code.js.map +1 -1
- package/dist/ui/color-input.d.ts.map +1 -1
- package/dist/ui/color-input.js +151 -150
- package/dist/ui/color-input.js.map +1 -1
- package/dist/ui/combobox.d.ts +14 -0
- package/dist/ui/combobox.d.ts.map +1 -1
- package/dist/ui/combobox.js +162 -158
- package/dist/ui/combobox.js.map +1 -1
- package/dist/ui/context-menu.d.ts.map +1 -1
- package/dist/ui/context-menu.js +70 -69
- package/dist/ui/context-menu.js.map +1 -1
- package/dist/ui/data-table-body.d.ts.map +1 -1
- package/dist/ui/data-table-body.js +4 -3
- package/dist/ui/data-table-body.js.map +1 -1
- package/dist/ui/data-table-bulk-actions.d.ts +26 -1
- package/dist/ui/data-table-bulk-actions.d.ts.map +1 -1
- package/dist/ui/data-table-bulk-actions.js +21 -46
- package/dist/ui/data-table-bulk-actions.js.map +1 -1
- package/dist/ui/data-table-context.d.ts +36 -2
- package/dist/ui/data-table-context.d.ts.map +1 -1
- package/dist/ui/data-table-context.js +25 -21
- package/dist/ui/data-table-context.js.map +1 -1
- package/dist/ui/data-table-header.d.ts.map +1 -1
- package/dist/ui/data-table-header.js +42 -40
- package/dist/ui/data-table-header.js.map +1 -1
- package/dist/ui/data-table-pagination.js +2 -2
- package/dist/ui/data-table-pagination.js.map +1 -1
- package/dist/ui/dialog.d.ts.map +1 -1
- package/dist/ui/dialog.js +61 -60
- package/dist/ui/dialog.js.map +1 -1
- package/dist/ui/dot.d.ts.map +1 -1
- package/dist/ui/dot.js +10 -41
- package/dist/ui/dot.js.map +1 -1
- package/dist/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/ui/dropdown-menu.js +79 -78
- package/dist/ui/dropdown-menu.js.map +1 -1
- package/dist/ui/file-upload.d.ts.map +1 -1
- package/dist/ui/file-upload.js +116 -115
- package/dist/ui/file-upload.js.map +1 -1
- package/dist/ui/form.d.ts.map +1 -1
- package/dist/ui/form.js +27 -26
- package/dist/ui/form.js.map +1 -1
- package/dist/ui/hover-card.d.ts.map +1 -1
- package/dist/ui/hover-card.js +26 -25
- package/dist/ui/hover-card.js.map +1 -1
- package/dist/ui/icon.js +7 -7
- package/dist/ui/index.d.ts +3 -2
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +60 -59
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/input.d.ts.map +1 -1
- package/dist/ui/input.js +7 -7
- package/dist/ui/input.js.map +1 -1
- package/dist/ui/menubar.d.ts.map +1 -1
- package/dist/ui/menubar.js +73 -72
- package/dist/ui/menubar.js.map +1 -1
- package/dist/ui/navigation-menu.d.ts.map +1 -1
- package/dist/ui/navigation-menu.js +80 -79
- package/dist/ui/navigation-menu.js.map +1 -1
- package/dist/ui/popover.d.ts.map +1 -1
- package/dist/ui/progress.d.ts.map +1 -1
- package/dist/ui/progress.js +72 -68
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/radio.d.ts.map +1 -1
- package/dist/ui/radio.js +35 -34
- package/dist/ui/radio.js.map +1 -1
- package/dist/ui/search-input.d.ts.map +1 -1
- package/dist/ui/search-input.js +28 -27
- package/dist/ui/search-input.js.map +1 -1
- package/dist/ui/select.d.ts.map +1 -1
- package/dist/ui/select.js +70 -69
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/sidebar.d.ts.map +1 -1
- package/dist/ui/sidebar.js +4 -4
- package/dist/ui/sidebar.js.map +1 -1
- package/dist/ui/slider.d.ts +63 -9
- package/dist/ui/slider.d.ts.map +1 -1
- package/dist/ui/slider.js +74 -32
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/split-button.d.ts +8 -2
- package/dist/ui/split-button.d.ts.map +1 -1
- package/dist/ui/split-button.js +49 -95
- package/dist/ui/split-button.js.map +1 -1
- package/dist/ui/stat-card.d.ts.map +1 -1
- package/dist/ui/stat-card.js +89 -88
- package/dist/ui/stat-card.js.map +1 -1
- package/dist/ui/stat-flash.js +16 -16
- package/dist/ui/stepper.d.ts.map +1 -1
- package/dist/ui/stepper.js +63 -62
- package/dist/ui/stepper.js.map +1 -1
- package/dist/ui/switch.d.ts.map +1 -1
- package/dist/ui/switch.js +2 -2
- package/dist/ui/switch.js.map +1 -1
- package/dist/ui/table.d.ts.map +1 -1
- package/dist/ui/table.js +3 -3
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/tabs.d.ts.map +1 -1
- package/dist/ui/tabs.js +67 -66
- package/dist/ui/tabs.js.map +1 -1
- package/dist/ui/textarea.d.ts.map +1 -1
- package/dist/ui/textarea.js +7 -7
- package/dist/ui/textarea.js.map +1 -1
- package/dist/ui/toast.d.ts.map +1 -1
- package/dist/ui/toast.js +196 -195
- package/dist/ui/toast.js.map +1 -1
- package/dist/ui/toggle.d.ts.map +1 -1
- package/dist/ui/toggle.js +24 -22
- package/dist/ui/toggle.js.map +1 -1
- package/dist/ui/tooltip.d.ts.map +1 -1
- package/dist/ui/tooltip.js +37 -36
- package/dist/ui/tooltip.js.map +1 -1
- package/dist/ui/tree-view/tree-item.d.ts.map +1 -1
- package/docs/components/composed/bulk-action-bar.md +14 -7
- package/docs/components/ui/bulk-action-bar.md +72 -0
- package/docs/recipes/customize-brand.md +58 -0
- package/docs/recipes/install-astro.md +1 -1
- package/docs/recipes/install-next-app-router.md +1 -1
- package/docs/recipes/install-next-pages.md +22 -1
- package/docs/recipes/install-remix.md +1 -1
- package/docs/recipes/install-tanstack-start.md +1 -1
- package/docs/recipes/install-vite.md +2 -1
- package/docs/recipes/server-components.md +7 -4
- package/docs/recipes/troubleshoot.md +1 -0
- package/llms.txt +2 -2
- package/make-kit/foundations/color.md +3 -1
- package/mcp-manifest.json +184 -151
- package/package.json +8 -2
- package/skill/SKILL.md +1 -1
- package/skill/references/components.md +2 -2
- package/skill/references/customize-brand.md +58 -0
- package/skill/references/server-components.md +7 -4
- package/skill/references/setup-astro.md +1 -1
- package/skill/references/setup-next-app-router.md +1 -1
- package/skill/references/setup-next-pages.md +22 -1
- package/skill/references/setup-remix.md +1 -1
- package/skill/references/setup-tanstack-start.md +1 -1
- package/skill/references/setup-vite.md +2 -1
- package/skill/references/troubleshoot.md +1 -0
- package/dist/composed/bulk-action-bar.js.map +0 -1
- package/dist/motion/check-motion-provider.d.ts +0 -2
- package/dist/motion/check-motion-provider.d.ts.map +0 -1
- package/dist/motion/index.js.map +0 -1
package/dist/tokens/semantic.css
CHANGED
|
@@ -211,6 +211,21 @@
|
|
|
211
211
|
--color-segment-track: color-mix(in oklch, var(--neutral-12) 6%, transparent);
|
|
212
212
|
--color-segment-thumb: var(--neutral-1);
|
|
213
213
|
|
|
214
|
+
/* Form-control ground (Input, Select, Textarea, Combobox). A ROLE token, not
|
|
215
|
+
a surface tier: the control is defined by its BORDER, so its fill sits
|
|
216
|
+
essentially flush with whatever it is dropped onto and the edge does the
|
|
217
|
+
work. Design 2026-08-24 moved light from neutral-2 to neutral-1.
|
|
218
|
+
|
|
219
|
+
The spec was authored light-only. Taking it literally in dark would be a
|
|
220
|
+
regression — neutral-1 in dark IS surface-base, so the field would vanish
|
|
221
|
+
into the page at 1.000:1 (the Table-striped / linear-Progress failure).
|
|
222
|
+
Dark therefore takes the step that preserves the INTENT, not the number.
|
|
223
|
+
Measured: light field #fcfcfc = 1.026:1 vs the page, hover lifts 1.063:1;
|
|
224
|
+
dark field #181818 = 1.000:1 vs a panel / 1.115:1 vs the page, hover lifts
|
|
225
|
+
1.173:1. Same relationship in both themes. */
|
|
226
|
+
--color-field: var(--neutral-1);
|
|
227
|
+
--color-field-hover: var(--neutral-2);
|
|
228
|
+
|
|
214
229
|
/* Overlay + disabled — promoted from internal :root into @theme so
|
|
215
230
|
`bg-overlay`, `text-overlay`, `bg-disabled`, `text-disabled` emit. */
|
|
216
231
|
--color-overlay: oklch(0 0 0 / 0.50);
|
|
@@ -228,6 +243,11 @@
|
|
|
228
243
|
--color-error-5: var(--red-5);
|
|
229
244
|
--color-error-6: var(--red-6);
|
|
230
245
|
--color-error-7: var(--red-7);
|
|
246
|
+
/* Step 8 exists so validation EDGES can clear WCAG 1.4.11. Step 7 measures
|
|
247
|
+
2.831:1 on a light field; step 8 is 3.929:1 (dark: 2.397:1 → 3.440:1).
|
|
248
|
+
Bridged 2026-08-24 — the primitive was always there, the semantic alias
|
|
249
|
+
was not, so `border-error-8` silently emitted nothing. */
|
|
250
|
+
--color-error-8: var(--red-8);
|
|
231
251
|
--color-error-9: var(--red-9);
|
|
232
252
|
--color-error-10: var(--red-10);
|
|
233
253
|
--color-error-11: var(--red-11);
|
|
@@ -240,6 +260,8 @@
|
|
|
240
260
|
--color-success-5: var(--green-5);
|
|
241
261
|
--color-success-6: var(--green-6);
|
|
242
262
|
--color-success-7: var(--green-7);
|
|
263
|
+
/* See --color-error-8. 2.557:1 → 3.441:1 light, 2.660:1 → 3.971:1 dark. */
|
|
264
|
+
--color-success-8: var(--green-8);
|
|
243
265
|
--color-success-9: var(--green-9);
|
|
244
266
|
--color-success-10: var(--green-10);
|
|
245
267
|
--color-success-11: var(--green-11);
|
|
@@ -486,6 +508,10 @@
|
|
|
486
508
|
--shadow-warning: 0 2px 8px oklch(0.78 0.16 65 / 0.22), 0 6px 20px oklch(0.78 0.16 65 / 0.15);
|
|
487
509
|
|
|
488
510
|
/* Keyboard shortcut badge shadow */
|
|
511
|
+
/* A key cap's bottom bevel. Black works on a light cap; on a dark one it is
|
|
512
|
+
invisible (1.02:1), so the cap loses the only thing making it look pressable.
|
|
513
|
+
`.dark` flips it to a top highlight, which is how a raised surface catches
|
|
514
|
+
light from above in a dark UI. See the .dark block below. */
|
|
489
515
|
--shadow-kbd: inset 0 -1px 0 oklch(0 0 0 / 0.1);
|
|
490
516
|
|
|
491
517
|
/* ───────────────────────────────────────────────────────────
|
|
@@ -522,7 +548,12 @@
|
|
|
522
548
|
/* Action state opacities (reflected by preset `opacity-action-*` util) */
|
|
523
549
|
--action-hover-opacity: 0.04;
|
|
524
550
|
--action-selected-opacity: 0.08;
|
|
525
|
-
|
|
551
|
+
/* 0.38 → 0.45 (design, 2026-08-24). Disabled text is exempt from WCAG 1.4.3,
|
|
552
|
+
so this is a legibility call, not a pass/fail one — and it moves the right
|
|
553
|
+
way on every ground. Measured over surface-panel, worst case first:
|
|
554
|
+
surface-fg-subtle 1.673:1 → 1.859:1, surface-fg-muted 1.879:1 → 2.169:1,
|
|
555
|
+
surface-fg 2.144:1 → 2.523:1 in light; surface-fg 3.046:1 → 3.745:1 in dark. */
|
|
556
|
+
--action-disabled-opacity: 0.45;
|
|
526
557
|
--action-focus-opacity: 0.12;
|
|
527
558
|
--action-active-opacity: 0.12;
|
|
528
559
|
|
|
@@ -536,25 +567,45 @@
|
|
|
536
567
|
the public `--shadow-raised`/`--shadow-floating` @theme values above.
|
|
537
568
|
They depend on `--shadow-color` (a runtime var) so they cannot live
|
|
538
569
|
in @theme (TW4 may statically-inline theme values). */
|
|
539
|
-
|
|
570
|
+
/* Light ink matches the Figma library's `#1c2533` exactly, so a designer
|
|
571
|
+
measuring a shadow in Figma and a developer measuring it in the browser
|
|
572
|
+
get the same answer. The two had drifted; Figma won on cost, not merit —
|
|
573
|
+
one value here against 26 in the library, for a difference measured at
|
|
574
|
+
**1/255** at the strongest light layer. Below what anyone can see.
|
|
575
|
+
DARK overrides this (see the .dark block) and must keep a darker ink:
|
|
576
|
+
dark multiplies every alpha by --shadow-strength 2.5, and at that weight
|
|
577
|
+
this lighter ink composites LIGHTER than the panel it sits on — a glow,
|
|
578
|
+
not a shadow. Measured before adopting; the light-mode reasoning does not
|
|
579
|
+
survive the multiplier. */
|
|
580
|
+
--shadow-color: 0.263 0.029 259; /* #1c2533 — cool blue tint, light */
|
|
540
581
|
--shadow-strength: 1;
|
|
541
582
|
--shadow-transition: box-shadow var(--duration-fast-02) var(--ease-productive-standard);
|
|
542
583
|
|
|
584
|
+
/* Hairline edge ring — the shadow's own 1px border-substitute (make-kit rule #6:
|
|
585
|
+
shadow already carries the ring, so components never add an explicit border).
|
|
586
|
+
Light: cool tint. Dark: a light ring, since drop shadows barely read on dark.
|
|
587
|
+
|
|
588
|
+
Declared BEFORE the internals below because all four consume it. It used to
|
|
589
|
+
sit between sm and md, and only md/lg referenced it — xs and sm hardcoded
|
|
590
|
+
their own near-black ring and so never received the dark-mode correction.
|
|
591
|
+
That left `shadow-raised` / `-raised-hover` at 1.00–1.03:1 in dark, i.e. no
|
|
592
|
+
edge, for every component using them as its only boundary. */
|
|
593
|
+
--shadow-edge-ring: 0 0 0 1px oklch(var(--shadow-color) / calc(0.09 * var(--shadow-strength)));
|
|
594
|
+
/* xs/sm take the ring at a lighter weight than md/lg — a raised card should
|
|
595
|
+
not read as strongly as a floating overlay. `--shadow-edge-ring-subtle`
|
|
596
|
+
mirrors `--shadow-edge-ring` and is likewise dark-corrected below. */
|
|
597
|
+
--shadow-edge-ring-subtle: 0 0 0 1px oklch(var(--shadow-color) / calc(0.035 * var(--shadow-strength)));
|
|
543
598
|
--shadow-xs-internal:
|
|
544
|
-
|
|
599
|
+
var(--shadow-edge-ring-subtle),
|
|
545
600
|
0 0.5px 1px -0.5px oklch(var(--shadow-color) / calc(0.045 * var(--shadow-strength))),
|
|
546
601
|
0 1.5px 3px -1px oklch(var(--shadow-color) / calc(0.04 * var(--shadow-strength))),
|
|
547
602
|
0 3px 7px -2px oklch(var(--shadow-color) / calc(0.03 * var(--shadow-strength)));
|
|
548
603
|
--shadow-sm-internal:
|
|
549
|
-
|
|
604
|
+
var(--shadow-edge-ring-subtle),
|
|
550
605
|
0 0.5px 1px -0.5px oklch(var(--shadow-color) / calc(0.04 * var(--shadow-strength))),
|
|
551
606
|
0 2px 4px -1.5px oklch(var(--shadow-color) / calc(0.045 * var(--shadow-strength))),
|
|
552
607
|
0 6px 12px -3px oklch(var(--shadow-color) / calc(0.035 * var(--shadow-strength))),
|
|
553
608
|
0 14px 28px -8px oklch(var(--shadow-color) / calc(0.025 * var(--shadow-strength)));
|
|
554
|
-
/* Hairline edge ring — the shadow's own 1px border-substitute (make-kit rule #6:
|
|
555
|
-
shadow already carries the ring, so components never add an explicit border).
|
|
556
|
-
Light: cool tint. Dark: a light ring, since drop shadows barely read on dark. */
|
|
557
|
-
--shadow-edge-ring: 0 0 0 1px oklch(var(--shadow-color) / calc(0.09 * var(--shadow-strength)));
|
|
558
609
|
--shadow-md-internal:
|
|
559
610
|
var(--shadow-edge-ring),
|
|
560
611
|
0 1px 2px -1px oklch(var(--shadow-color) / calc(0.05 * var(--shadow-strength))),
|
|
@@ -657,6 +708,12 @@
|
|
|
657
708
|
--color-surface-raised-hover: var(--color-surface-panel-hover);
|
|
658
709
|
--color-surface-raised-active: var(--color-surface-panel-active);
|
|
659
710
|
|
|
711
|
+
/* Form-control ground — one step up from the light values, NOT the same
|
|
712
|
+
neutral step. neutral-1 in dark is surface-base, so reusing the light
|
|
713
|
+
number would sink the field into the page. See the :root note. */
|
|
714
|
+
--color-field: var(--neutral-2);
|
|
715
|
+
--color-field-hover: var(--neutral-3);
|
|
716
|
+
|
|
660
717
|
/* Object edges invert to translucent white. */
|
|
661
718
|
--color-surface-border-subtle: oklch(1 0 0 / 0.06);
|
|
662
719
|
--color-surface-border: oklch(1 0 0 / 0.10);
|
|
@@ -668,9 +725,14 @@
|
|
|
668
725
|
--color-backdrop: oklch(0 0 0 / 0.6);
|
|
669
726
|
|
|
670
727
|
/* Segmented control — inverted elevation in dark: track is a faint LIGHTER
|
|
671
|
-
fill (can't go darker than a near-black page), thumb steps lighter still.
|
|
728
|
+
fill (can't go darker than a near-black page), thumb steps lighter still.
|
|
729
|
+
The model is right; the value was one step short. neutral-3 (#262626) is
|
|
730
|
+
DARKER than the track composited over a panel (#282828), so the selected
|
|
731
|
+
segment read as a dent — 1.028:1, inverted. neutral-5 clears the track on
|
|
732
|
+
both grounds a segmented control actually sits on: 1.46:1 over a panel,
|
|
733
|
+
1.69:1 over the page. */
|
|
672
734
|
--color-segment-track: color-mix(in oklch, oklch(1 0 0) 7%, transparent);
|
|
673
|
-
--color-segment-thumb: var(--neutral-
|
|
735
|
+
--color-segment-thumb: var(--neutral-5);
|
|
674
736
|
|
|
675
737
|
/* Overlay */
|
|
676
738
|
--color-overlay: oklch(0 0 0 / 0.70);
|
|
@@ -678,7 +740,8 @@
|
|
|
678
740
|
/* Action state opacities (higher in dark mode) */
|
|
679
741
|
--action-hover-opacity: 0.08;
|
|
680
742
|
--action-selected-opacity: 0.12;
|
|
681
|
-
|
|
743
|
+
/* Tracks the light value — see the note on the :root declaration. */
|
|
744
|
+
--action-disabled-opacity: 0.45;
|
|
682
745
|
--action-focus-opacity: 0.12;
|
|
683
746
|
--action-active-opacity: 0.16;
|
|
684
747
|
|
|
@@ -689,8 +752,54 @@
|
|
|
689
752
|
/* Shadows (heavier in dark mode) — brand-reactive via color-mix on
|
|
690
753
|
--color-accent-9 so they follow consumer brand swaps. */
|
|
691
754
|
--shadow-strength: 2.5;
|
|
755
|
+
/* Dark needs its OWN, DARKER ink, and the reason is worth reading before
|
|
756
|
+
touching this line.
|
|
757
|
+
|
|
758
|
+
Light moved to #1c2533 to match the Figma library. Dark cannot follow:
|
|
759
|
+
--shadow-strength is 2.5 here, and at that weight #1c2533 composites to
|
|
760
|
+
#1b1d21 over a #1a1a1a panel — LIGHTER than the surface it is meant to
|
|
761
|
+
darken. A glow, not a shadow. Worst case 9/255 in the wrong direction.
|
|
762
|
+
|
|
763
|
+
The previous dark ink (oklch(0.15 …)) had a milder version of the same
|
|
764
|
+
fault: it reads as a shadow on `surface-panel` but GLOWS on
|
|
765
|
+
`surface-base` (#0a0a0a), where it is itself the lighter colour. Measured
|
|
766
|
+
separation there was 1.001:1 — the drop layers contributed literally
|
|
767
|
+
nothing. 0.05 is below both grounds, so the sign is now correct everywhere.
|
|
768
|
+
|
|
769
|
+
What this does NOT do is make drop shadows carry dark elevation, and no
|
|
770
|
+
ink can. There is no headroom below a near-black ground: the best any ink
|
|
771
|
+
achieves at the strongest layer is 1.013:1 on base and 1.040:1 on panel.
|
|
772
|
+
**The white edge ring is what actually separates an elevated surface in
|
|
773
|
+
dark, and that is structural rather than a workaround.** If dark elevation
|
|
774
|
+
ever needs to read more strongly, the answer is the ring or a lighter
|
|
775
|
+
surface step — not a darker shadow, which has nowhere left to go. */
|
|
776
|
+
--shadow-color: 0.05 0.012 260;
|
|
692
777
|
/* Light ring on dark — a dark-tinted ring would vanish against dark surfaces. */
|
|
693
778
|
--shadow-edge-ring: 0 0 0 1px oklch(1 0 0 / 0.12);
|
|
779
|
+
/* Same correction for the raised tier. Without this, `shadow-raised` /
|
|
780
|
+
`-raised-hover` keep a near-black ring that measures ~1.00:1 on a dark
|
|
781
|
+
ground, so anything using them as its only edge has none. 0.07 keeps a
|
|
782
|
+
raised card quieter than a floating overlay while still reading. */
|
|
783
|
+
--shadow-edge-ring-subtle: 0 0 0 1px oklch(1 0 0 / 0.07);
|
|
784
|
+
/* The third ring, and the one that was missed. `--shadow-pressed` is also a
|
|
785
|
+
1px ring built from `--shadow-color`, so in dark it composited to
|
|
786
|
+
**1.012:1** against `surface-panel` — a pressed control had no pressed
|
|
787
|
+
state at all. Its two siblings above were corrected; this was not, which is
|
|
788
|
+
the failure mode the comment on --shadow-edge-ring describes. White at 0.10
|
|
789
|
+
measures 2.640:1, between subtle (2.148:1) and the full edge ring
|
|
790
|
+
(2.968:1) — pressed should read more firmly than a resting card and less
|
|
791
|
+
than a floating overlay. Found while binding the Figma effect styles, where
|
|
792
|
+
it had been masked by a binding to the wrong variable.
|
|
793
|
+
All three rings stop deliberately short of 1.4.11's 3:1 —
|
|
794
|
+
deviation: SHADOW-RING-BELOW-NONTEXT */
|
|
795
|
+
--shadow-pressed: 0 0 0 1px oklch(1 0 0 / 0.10);
|
|
796
|
+
--shadow-kbd: inset 0 1px 0 oklch(1 0 0 / 0.10);
|
|
797
|
+
/* The segmented thumb is documented as deliberately ring-less, the shadow
|
|
798
|
+
being its whole edge. That works in light and cannot work in dark, where
|
|
799
|
+
the shadow is near-black on a near-black ground — so the fallback failed in
|
|
800
|
+
the same theme as the fill it was meant to rescue. In dark it takes a ring
|
|
801
|
+
like everything else. */
|
|
802
|
+
--shadow-segment: 0 0 0 1px oklch(1 0 0 / 0.07), 0 1px 2px -0.5px oklch(0 0 0 / 0.40), 0 3px 8px -2px oklch(0 0 0 / 0.30);
|
|
694
803
|
--shadow-brand: 0 2px 8px color-mix(in oklch, var(--color-accent-9) 30%, transparent), 0 6px 20px color-mix(in oklch, var(--color-accent-9) 20%, transparent);
|
|
695
804
|
--shadow-glow: 0 0 0 1.5px color-mix(in oklch, var(--color-accent-9) 35%, transparent), 0 0 10px color-mix(in oklch, var(--color-accent-9) 20%, transparent);
|
|
696
805
|
--shadow-ring: 0 0 0 2px color-mix(in oklch, var(--color-accent-9) 45%, transparent);
|
|
@@ -722,6 +831,39 @@
|
|
|
722
831
|
--color-text-shadow: oklch(0 0 0 / 0.40);
|
|
723
832
|
}
|
|
724
833
|
|
|
834
|
+
/* ═══════════════════════════════════════════════════════════════════
|
|
835
|
+
HIGH CONTRAST — opt-in, via `data-contrast="high"` on any ancestor
|
|
836
|
+
|
|
837
|
+
WCAG 2.2 SC 1.4.11 asks for 3:1 between a control's edge and its
|
|
838
|
+
background. Our default control edge is 2.00:1 in light and 2.08:1 in
|
|
839
|
+
dark — deliberately softer, and deliberately under the bar. That gap is
|
|
840
|
+
recorded in docs/deviations.md as PALETTE-CONTROL-EDGE-BELOW-AA.
|
|
841
|
+
|
|
842
|
+
This block is the opt-out from that decision. Set the attribute on
|
|
843
|
+
<html> (or any wrapper) and every control edge in the subtree moves to
|
|
844
|
+
3.64:1 light / 3.93:1 dark.
|
|
845
|
+
|
|
846
|
+
<html data-contrast="high"> <!-- whole app -->
|
|
847
|
+
<div data-contrast="high"> … </div> <!-- one region -->
|
|
848
|
+
|
|
849
|
+
It is an ATTRIBUTE rather than a React provider on purpose: `.dark`
|
|
850
|
+
already works this way, so a consumer's existing theme switcher can set
|
|
851
|
+
both, it needs no client component, and it survives SSR.
|
|
852
|
+
|
|
853
|
+
The steps are named, not literal, so a consumer who rebrands the neutral
|
|
854
|
+
ramp gets a correctly-scaled high-contrast mode for free. `--neutral-*`
|
|
855
|
+
is itself theme-aware, so ONE rule serves light and dark.
|
|
856
|
+
|
|
857
|
+
Placed after `.dark` deliberately: `[data-contrast='high']` and `.dark`
|
|
858
|
+
have the same specificity (0,1,0), so when both sit on <html> source
|
|
859
|
+
order is what decides. Moving this block above `.dark` silently breaks
|
|
860
|
+
high contrast in dark mode only.
|
|
861
|
+
═══════════════════════════════════════════════════════════════════ */
|
|
862
|
+
[data-contrast='high'] {
|
|
863
|
+
--color-surface-border-interactive: var(--neutral-8);
|
|
864
|
+
--color-surface-border-interactive-strong: var(--neutral-9);
|
|
865
|
+
}
|
|
866
|
+
|
|
725
867
|
/* ═══════════════════════════════════════════════════════════════════
|
|
726
868
|
Ensure Radix popper content (Select, Combobox, Popover, etc.)
|
|
727
869
|
renders above Sheet/Dialog overlays.
|
|
@@ -795,6 +937,8 @@
|
|
|
795
937
|
--color-surface-disabled: Canvas;
|
|
796
938
|
--color-surface-inverted: CanvasText;
|
|
797
939
|
--color-surface-inverted-fg: Canvas;
|
|
940
|
+
--color-field: Canvas;
|
|
941
|
+
--color-field-hover: Canvas;
|
|
798
942
|
/* Forced colours flatten the object/control split — every edge must be a
|
|
799
943
|
system colour or it disappears entirely. */
|
|
800
944
|
--color-surface-border: CanvasText;
|
|
@@ -834,6 +978,7 @@
|
|
|
834
978
|
--color-error-4: Canvas;
|
|
835
979
|
--color-error-5: Canvas;
|
|
836
980
|
--color-error-7: CanvasText;
|
|
981
|
+
--color-error-8: CanvasText;
|
|
837
982
|
--color-error-9: Mark;
|
|
838
983
|
--color-error-10: Mark;
|
|
839
984
|
--color-error-11: CanvasText;
|
|
@@ -843,6 +988,7 @@
|
|
|
843
988
|
--color-success-4: Canvas;
|
|
844
989
|
--color-success-5: Canvas;
|
|
845
990
|
--color-success-7: CanvasText;
|
|
991
|
+
--color-success-8: CanvasText;
|
|
846
992
|
--color-success-9: Highlight;
|
|
847
993
|
--color-success-10: Highlight;
|
|
848
994
|
--color-success-11: CanvasText;
|
|
@@ -334,15 +334,18 @@
|
|
|
334
334
|
@utility bg-gradient-brand-dark { background-image: var(--gradient-brand-dark); }
|
|
335
335
|
|
|
336
336
|
/* ───────────────────────────────────────────────────────────────────
|
|
337
|
-
Card edge — the faint hairline for card/panel containers
|
|
338
|
-
|
|
337
|
+
Card edge — the faint hairline for card/panel containers. These are the
|
|
338
|
+
DECORATIVE border tier: they mark objects. Interactive controls must NOT
|
|
339
|
+
use them — controls take `border-surface-border-interactive[-strong]`,
|
|
340
|
+
which is the tier that carries WCAG 1.4.11 non-text contrast.
|
|
341
|
+
(This comment previously said the opposite, and ~19 controls followed it.)
|
|
339
342
|
Single tunable source of truth; pairs with `border` (width) on the element.
|
|
340
343
|
─────────────────────────────────────────────────────────────────── */
|
|
341
344
|
|
|
342
345
|
@utility border-card { border-color: var(--color-surface-border-card); }
|
|
343
346
|
/* Stronger card edge (kbd caps, code blocks, skeleton/panel outlines, chip
|
|
344
|
-
borders) — one step up from
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
@utility border-card-strong { border-color: var(--color-surface-border); }
|
|
347
|
+
borders) — genuinely one step up from `border-card`. It previously pointed at
|
|
348
|
+
`--color-surface-border`, which is exactly what `--color-surface-border-card`
|
|
349
|
+
already aliases, so the two utilities were the SAME colour and the ~13 call
|
|
350
|
+
sites asking for a heavier edge silently got the faint one. */
|
|
351
|
+
@utility border-card-strong { border-color: var(--color-surface-border-strong); }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../src/ui/accordion.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,kBAAkB,MAAM,6BAA6B,CAAA;AAGjE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../src/ui/accordion.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,kBAAkB,MAAM,6BAA6B,CAAA;AAGjE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,QAAA,MAAM,SAAS,8JAA0B,CAAA;AAEzC,QAAA,MAAM,aAAa,iKASjB,CAAA;AAGF,UAAU,6BAA8B,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC;IAC/G,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACnC;AAED,QAAA,MAAM,gBAAgB,yGAwBpB,CAAA;AAGF,QAAA,MAAM,gBAAgB,oKAmBpB,CAAA;AAGF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAA;AAC/F,MAAM,MAAM,qBAAqB,GAAG,6BAA6B,CAAA;AACjE,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAErG,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAC,aAAa,EAAE,gBAAgB,EAAE,CAAA"}
|
package/dist/ui/accordion.js
CHANGED
|
@@ -1,54 +1,55 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Content2 as e, Header as t, Item as n, Root2 as r, Trigger2 as i } from "../_chunks/primitives/react-accordion.js";
|
|
3
3
|
import { tweens as a } from "./lib/motion.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
4
|
+
import { MotionPreference as o } from "../_chunks/motion-preference.js";
|
|
5
|
+
import { cn as s } from "./lib/utils.js";
|
|
6
|
+
import { Icon as c } from "./icon.js";
|
|
7
|
+
import * as l from "react";
|
|
8
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
|
+
import { IconChevronDown as f } from "@tabler/icons-react";
|
|
10
|
+
import { motion as p } from "framer-motion";
|
|
10
11
|
//#region src/ui/accordion.tsx
|
|
11
|
-
var
|
|
12
|
+
var m = r, h = l.forwardRef(({ className: e, ...t }, r) => /* @__PURE__ */ u(n, {
|
|
12
13
|
ref: r,
|
|
13
|
-
className:
|
|
14
|
+
className: s("border-b border-surface-border", e),
|
|
14
15
|
...t
|
|
15
16
|
}));
|
|
16
|
-
|
|
17
|
-
var
|
|
18
|
-
let
|
|
19
|
-
icon:
|
|
17
|
+
h.displayName = "AccordionItem";
|
|
18
|
+
var g = l.forwardRef(({ className: e, children: n, chevronPosition: r = "right", ...a }, o) => {
|
|
19
|
+
let l = /* @__PURE__ */ u(c, {
|
|
20
|
+
icon: f,
|
|
20
21
|
size: "sm",
|
|
21
22
|
className: "shrink-0 text-surface-fg-muted transition-transform duration-moderate-02 ease-productive-standard group-data-[state=open]:rotate-180"
|
|
22
23
|
});
|
|
23
|
-
return /* @__PURE__ */
|
|
24
|
+
return /* @__PURE__ */ u(t, {
|
|
24
25
|
className: "flex",
|
|
25
|
-
children: /* @__PURE__ */
|
|
26
|
-
ref:
|
|
27
|
-
className:
|
|
26
|
+
children: /* @__PURE__ */ d(i, {
|
|
27
|
+
ref: o,
|
|
28
|
+
className: s("group flex flex-1 items-center justify-between py-ds-05 text-left text-body-md font-medium hover:bg-surface-panel-hover rounded-control data-[state=open]:bg-surface-panel-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9", e),
|
|
28
29
|
...a,
|
|
29
30
|
children: [
|
|
30
|
-
r === "left" &&
|
|
31
|
+
r === "left" && l,
|
|
31
32
|
n,
|
|
32
|
-
r === "right" &&
|
|
33
|
+
r === "right" && l
|
|
33
34
|
]
|
|
34
35
|
})
|
|
35
36
|
});
|
|
36
37
|
});
|
|
37
|
-
|
|
38
|
-
var
|
|
38
|
+
g.displayName = i.displayName;
|
|
39
|
+
var _ = l.forwardRef(({ className: t, children: n, ...r }, i) => /* @__PURE__ */ u(o, { children: /* @__PURE__ */ u(e, {
|
|
39
40
|
ref: i,
|
|
40
41
|
className: "w-full overflow-hidden text-body-md data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up",
|
|
41
42
|
...r,
|
|
42
|
-
children: /* @__PURE__ */
|
|
43
|
+
children: /* @__PURE__ */ u(p.div, {
|
|
43
44
|
initial: !1,
|
|
44
45
|
animate: { opacity: 1 },
|
|
45
46
|
transition: a.fade,
|
|
46
|
-
children: /* @__PURE__ */
|
|
47
|
-
className:
|
|
47
|
+
children: /* @__PURE__ */ u("div", {
|
|
48
|
+
className: s("pb-ds-05 pt-ds-02", t),
|
|
48
49
|
children: n
|
|
49
50
|
})
|
|
50
51
|
})
|
|
51
|
-
}));
|
|
52
|
-
|
|
52
|
+
}) }));
|
|
53
|
+
_.displayName = e.displayName;
|
|
53
54
|
//#endregion
|
|
54
|
-
export {
|
|
55
|
+
export { m as Accordion, _ as AccordionContent, h as AccordionItem, g as AccordionTrigger };
|
package/dist/ui/accordion.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.js","names":[],"sources":["../../src/ui/accordion.tsx"],"sourcesContent":["'use client'\n\nimport * as AccordionPrimitive from '@primitives/react-accordion'\nimport { IconChevronDown } from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { Icon } from './icon'\nimport { tweens } from './lib/motion'\nimport { cn } from './lib/utils'\n\n/**\n * Accordion compound component — vertically stacked, collapsible content sections.\n *\n * **Parts (in composition order):**\n * - `Accordion` — root; controls single vs. multiple open panels (this root)\n * - `AccordionItem` — individual collapsible section (requires `value` prop)\n * - `AccordionTrigger` — the clickable header row (chevron icon auto-renders and rotates)\n * - `AccordionContent` — the collapsible body revealed when the item is open\n *\n * **`type` prop (required on root):**\n * - `\"single\"` — only one panel open at a time; supports `collapsible` prop to re-close the active item\n * - `\"multiple\"` — multiple panels open simultaneously (value is `string[]`); `collapsible` is NOT valid here\n *\n * @compound\n * @example\n * // Single-open FAQ accordion:\n * <Accordion type=\"single\" defaultValue=\"item-1\" collapsible>\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>What is Shilp Sutra?</AccordionTrigger>\n * <AccordionContent>\n * A React design system built for Next.js App Router, with full accessibility baked in.\n * </AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item-2\">\n * <AccordionTrigger>Is dark mode supported?</AccordionTrigger>\n * <AccordionContent>\n * Yes — add the <code>.dark</code> class to the root element to activate it.\n * </AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * @example\n * // Multiple-open controlled accordion:\n * const [open, setOpen] = useState<string[]>(['billing'])\n * <Accordion type=\"multiple\" value={open} onValueChange={setOpen}>\n * <AccordionItem value=\"billing\">\n * <AccordionTrigger>Billing</AccordionTrigger>\n * <AccordionContent>Your billing details here.</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"security\">\n * <AccordionTrigger>Security</AccordionTrigger>\n * <AccordionContent>Security settings here.</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n */\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn('border-b border-surface-border', className)}\n {...props}\n />\n))\nAccordionItem.displayName = 'AccordionItem'\n\ninterface AccordionTriggerExtendedProps extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> {\n chevronPosition?: 'left' | 'right'\n}\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n AccordionTriggerExtendedProps\n>(({ className, children, chevronPosition = 'right', ...props }, ref) => {\n const chevron = (\n <Icon icon={IconChevronDown} size=\"sm\" className=\"shrink-0 text-surface-fg-muted transition-transform duration-moderate-02 ease-productive-standard group-data-[state=open]:rotate-180\" />\n )\n\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'group flex flex-1 items-center justify-between py-ds-05 text-left text-body-md font-medium hover:bg-surface-panel-hover rounded-control data-[state=open]:bg-surface-panel-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9',\n className,\n )}\n {...props}\n >\n {chevronPosition === 'left' && chevron}\n {children}\n {chevronPosition === 'right' && chevron}\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n})\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n
|
|
1
|
+
{"version":3,"file":"accordion.js","names":[],"sources":["../../src/ui/accordion.tsx"],"sourcesContent":["'use client'\n\nimport * as AccordionPrimitive from '@primitives/react-accordion'\nimport { IconChevronDown } from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { MotionPreference } from '../motion/motion-preference'\nimport { Icon } from './icon'\nimport { tweens } from './lib/motion'\nimport { cn } from './lib/utils'\n\n/**\n * Accordion compound component — vertically stacked, collapsible content sections.\n *\n * **Parts (in composition order):**\n * - `Accordion` — root; controls single vs. multiple open panels (this root)\n * - `AccordionItem` — individual collapsible section (requires `value` prop)\n * - `AccordionTrigger` — the clickable header row (chevron icon auto-renders and rotates)\n * - `AccordionContent` — the collapsible body revealed when the item is open\n *\n * **`type` prop (required on root):**\n * - `\"single\"` — only one panel open at a time; supports `collapsible` prop to re-close the active item\n * - `\"multiple\"` — multiple panels open simultaneously (value is `string[]`); `collapsible` is NOT valid here\n *\n * @compound\n * @example\n * // Single-open FAQ accordion:\n * <Accordion type=\"single\" defaultValue=\"item-1\" collapsible>\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>What is Shilp Sutra?</AccordionTrigger>\n * <AccordionContent>\n * A React design system built for Next.js App Router, with full accessibility baked in.\n * </AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item-2\">\n * <AccordionTrigger>Is dark mode supported?</AccordionTrigger>\n * <AccordionContent>\n * Yes — add the <code>.dark</code> class to the root element to activate it.\n * </AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * @example\n * // Multiple-open controlled accordion:\n * const [open, setOpen] = useState<string[]>(['billing'])\n * <Accordion type=\"multiple\" value={open} onValueChange={setOpen}>\n * <AccordionItem value=\"billing\">\n * <AccordionTrigger>Billing</AccordionTrigger>\n * <AccordionContent>Your billing details here.</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"security\">\n * <AccordionTrigger>Security</AccordionTrigger>\n * <AccordionContent>Security settings here.</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n */\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn('border-b border-surface-border', className)}\n {...props}\n />\n))\nAccordionItem.displayName = 'AccordionItem'\n\ninterface AccordionTriggerExtendedProps extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> {\n chevronPosition?: 'left' | 'right'\n}\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n AccordionTriggerExtendedProps\n>(({ className, children, chevronPosition = 'right', ...props }, ref) => {\n const chevron = (\n <Icon icon={IconChevronDown} size=\"sm\" className=\"shrink-0 text-surface-fg-muted transition-transform duration-moderate-02 ease-productive-standard group-data-[state=open]:rotate-180\" />\n )\n\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'group flex flex-1 items-center justify-between py-ds-05 text-left text-body-md font-medium hover:bg-surface-panel-hover rounded-control data-[state=open]:bg-surface-panel-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9',\n className,\n )}\n {...props}\n >\n {chevronPosition === 'left' && chevron}\n {children}\n {chevronPosition === 'right' && chevron}\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n})\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <MotionPreference>\n <AccordionPrimitive.Content\n ref={ref}\n className=\"w-full overflow-hidden text-body-md data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up\"\n {...props}\n >\n <motion.div\n initial={false}\n animate={{ opacity: 1 }}\n transition={tweens.fade}\n >\n <div className={cn('pb-ds-05 pt-ds-02', className)}>{children}</div>\n </motion.div>\n </AccordionPrimitive.Content>\n </MotionPreference>\n))\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\n\nexport type AccordionItemProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\nexport type AccordionTriggerProps = AccordionTriggerExtendedProps\nexport type AccordionContentProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n\nexport { Accordion, AccordionContent,AccordionItem, AccordionTrigger }\n"],"mappings":";;;;;;;;;;;AAyDA,IAAM,IAAY,GAEZ,IAAgB,EAAM,YAGzB,EAAE,cAAW,GAAG,KAAS,MAC1B,kBAAC,GAAD;CACO;CACL,WAAW,EAAG,kCAAkC,CAAS;CACzD,GAAI;AACL,CAAA,CACF;AACD,EAAc,cAAc;AAM5B,IAAM,IAAmB,EAAM,YAG5B,EAAE,cAAW,aAAU,qBAAkB,SAAS,GAAG,KAAS,MAAQ;CACvE,IAAM,IACJ,kBAAC,GAAD;EAAM,MAAM;EAAiB,MAAK;EAAK,WAAU;CAAwI,CAAA;CAG3L,OACE,kBAAC,GAAD;EAA2B,WAAU;YACnC,kBAAC,GAAD;GACO;GACL,WAAW,EACT,kQACA,CACF;GACA,GAAI;aANN;IAQG,MAAoB,UAAU;IAC9B;IACA,MAAoB,WAAW;GACN;;CACH,CAAA;AAE/B,CAAC;AACD,EAAiB,cAAA,EAAyC;AAE1D,IAAM,IAAmB,EAAM,YAG5B,EAAE,cAAW,aAAU,GAAG,KAAS,MACpC,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;CACO;CACL,WAAU;CACV,GAAI;WAEJ,kBAAC,EAAO,KAAR;EACE,SAAS;EACT,SAAS,EAAE,SAAS,EAAE;EACtB,YAAY,EAAO;YAEnB,kBAAC,OAAD;GAAK,WAAW,EAAG,qBAAqB,CAAS;GAAI;EAAc,CAAA;CACzD,CAAA;AACc,CAAA,EACZ,CAAA,CACnB;AACD,EAAiB,cAAA,EAAyC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../src/ui/alert-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,oBAAoB,MAAM,gCAAgC,CAAA;AAEtE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../src/ui/alert-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,oBAAoB,MAAM,gCAAgC,CAAA;AAEtE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAyB3F,CAAA;AAGD,QAAA,MAAM,kBAAkB,wHAA+B,CAAA;AAEvD,QAAA,MAAM,iBAAiB,uDAA8B,CAAA;AAErD,QAAA,MAAM,kBAAkB,wKAatB,CAAA;AAGF,UAAU,uBAAwB,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC;IAC3G,oHAAoH;IACpH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,QAAA,MAAM,kBAAkB,gGAmDtB,CAAA;AAGF,QAAA,MAAM,iBAAiB,6GAWtB,CAAA;AAGD,QAAA,MAAM,iBAAiB,6GAWtB,CAAA;AAGD,QAAA,MAAM,gBAAgB,8KAYpB,CAAA;AAGF,QAAA,MAAM,sBAAsB,wLAS1B,CAAA;AAIF,QAAA,MAAM,iBAAiB,6KAYrB,CAAA;AAGF,QAAA,MAAM,iBAAiB,6KAYrB,CAAA;AAGF,YAAY,EAAE,uBAAuB,EAAE,CAAA;AACvC,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AACvG,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAEvG,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,CAAA"}
|
package/dist/ui/alert-dialog.js
CHANGED
|
@@ -1,115 +1,116 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { springs as e, tweens as t } from "./lib/motion.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
3
|
+
import { MotionPreference as n } from "../_chunks/motion-preference.js";
|
|
4
|
+
import { cn as r } from "./lib/utils.js";
|
|
5
|
+
import { Action as i, Cancel as a, Content2 as o, Description2 as s, Overlay2 as c, Portal2 as l, Root2 as u, Title2 as d, Trigger2 as f } from "../_chunks/primitives/react-alert-dialog.js";
|
|
6
|
+
import { useIsMobile as p } from "../hooks/use-mobile.js";
|
|
7
|
+
import * as m from "react";
|
|
8
|
+
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
9
|
+
import { AnimatePresence as _, motion as v } from "framer-motion";
|
|
9
10
|
//#region src/ui/alert-dialog.tsx
|
|
10
|
-
var
|
|
11
|
-
let [i, a] =
|
|
11
|
+
var y = m.createContext({ open: !1 }), b = () => m.useContext(y), x = ({ open: e, defaultOpen: t, onOpenChange: n, ...r }) => {
|
|
12
|
+
let [i, a] = m.useState(t ?? !1), o = e !== void 0, s = o ? e : i, c = m.useCallback((e) => {
|
|
12
13
|
o || a(e), n?.(e);
|
|
13
|
-
}, [o, n]),
|
|
14
|
-
return /* @__PURE__ */
|
|
15
|
-
value:
|
|
16
|
-
children: /* @__PURE__ */
|
|
14
|
+
}, [o, n]), l = m.useMemo(() => ({ open: s }), [s]);
|
|
15
|
+
return /* @__PURE__ */ h(y.Provider, {
|
|
16
|
+
value: l,
|
|
17
|
+
children: /* @__PURE__ */ h(u, {
|
|
17
18
|
open: s,
|
|
18
19
|
onOpenChange: c,
|
|
19
20
|
...r
|
|
20
21
|
})
|
|
21
22
|
});
|
|
22
23
|
};
|
|
23
|
-
|
|
24
|
-
var
|
|
25
|
-
ref:
|
|
24
|
+
x.displayName = "AlertDialog";
|
|
25
|
+
var S = f, C = l, w = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h(c, {
|
|
26
|
+
ref: n,
|
|
26
27
|
forceMount: !0,
|
|
27
|
-
className:
|
|
28
|
+
className: r("fixed inset-0 z-modal bg-overlay", e),
|
|
28
29
|
...t
|
|
29
30
|
}));
|
|
30
|
-
|
|
31
|
-
var
|
|
32
|
-
let { open:
|
|
33
|
-
return /* @__PURE__ */
|
|
31
|
+
w.displayName = c.displayName;
|
|
32
|
+
var T = m.forwardRef(({ className: i, children: a, responsive: s, ...c }, l) => {
|
|
33
|
+
let { open: u } = b(), d = p(), f = s !== !1 && d;
|
|
34
|
+
return /* @__PURE__ */ h(n, { children: /* @__PURE__ */ h(_, { children: u && /* @__PURE__ */ g(C, {
|
|
34
35
|
forceMount: !0,
|
|
35
|
-
children: [/* @__PURE__ */
|
|
36
|
+
children: [/* @__PURE__ */ h(w, {
|
|
36
37
|
asChild: !0,
|
|
37
|
-
children: /* @__PURE__ */
|
|
38
|
+
children: /* @__PURE__ */ h(v.div, {
|
|
38
39
|
initial: { opacity: 0 },
|
|
39
40
|
animate: { opacity: 1 },
|
|
40
41
|
exit: { opacity: 0 },
|
|
41
42
|
transition: t.fade
|
|
42
43
|
})
|
|
43
|
-
}), /* @__PURE__ */
|
|
44
|
-
ref:
|
|
44
|
+
}), /* @__PURE__ */ h(o, {
|
|
45
|
+
ref: l,
|
|
45
46
|
forceMount: !0,
|
|
46
47
|
asChild: !0,
|
|
47
|
-
...
|
|
48
|
-
children: /* @__PURE__ */
|
|
49
|
-
initial:
|
|
48
|
+
...c,
|
|
49
|
+
children: /* @__PURE__ */ h(v.div, {
|
|
50
|
+
initial: f ? { y: "100%" } : {
|
|
50
51
|
opacity: 0,
|
|
51
52
|
scale: .95,
|
|
52
53
|
x: "-50%",
|
|
53
54
|
y: "-50%"
|
|
54
55
|
},
|
|
55
|
-
animate:
|
|
56
|
+
animate: f ? { y: 0 } : {
|
|
56
57
|
opacity: 1,
|
|
57
58
|
scale: 1,
|
|
58
59
|
x: "-50%",
|
|
59
60
|
y: "-50%"
|
|
60
61
|
},
|
|
61
|
-
exit:
|
|
62
|
+
exit: f ? { y: "100%" } : {
|
|
62
63
|
opacity: 0,
|
|
63
64
|
scale: .95,
|
|
64
65
|
x: "-50%",
|
|
65
66
|
y: "-50%"
|
|
66
67
|
},
|
|
67
|
-
transition:
|
|
68
|
+
transition: f ? e.smooth : {
|
|
68
69
|
...e.smooth,
|
|
69
70
|
opacity: t.fade
|
|
70
71
|
},
|
|
71
|
-
className:
|
|
72
|
-
children:
|
|
72
|
+
className: r("fixed z-modal grid w-full gap-ds-05 bg-surface-overlay p-ds-06", s === !1 ? "left-[50%] top-[50%] max-w-lg rounded-overlay-lg shadow-overlay" : "inset-0 md:inset-auto md:left-[50%] md:top-[50%] md:max-w-lg md:rounded-overlay-lg md:shadow-overlay", i),
|
|
73
|
+
children: a
|
|
73
74
|
})
|
|
74
75
|
})]
|
|
75
|
-
}) });
|
|
76
|
+
}) }) });
|
|
76
77
|
});
|
|
77
|
-
|
|
78
|
-
var
|
|
79
|
-
ref:
|
|
80
|
-
className:
|
|
78
|
+
T.displayName = o.displayName;
|
|
79
|
+
var E = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h("div", {
|
|
80
|
+
ref: n,
|
|
81
|
+
className: r("flex flex-col space-y-ds-02b text-center sm:text-left", e),
|
|
81
82
|
...t
|
|
82
83
|
}));
|
|
83
|
-
|
|
84
|
-
var
|
|
85
|
-
ref:
|
|
86
|
-
className:
|
|
84
|
+
E.displayName = "AlertDialogHeader";
|
|
85
|
+
var D = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h("div", {
|
|
86
|
+
ref: n,
|
|
87
|
+
className: r("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-ds-03", e),
|
|
87
88
|
...t
|
|
88
89
|
}));
|
|
89
|
-
|
|
90
|
-
var
|
|
91
|
-
ref:
|
|
92
|
-
className:
|
|
90
|
+
D.displayName = "AlertDialogFooter";
|
|
91
|
+
var O = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h(d, {
|
|
92
|
+
ref: n,
|
|
93
|
+
className: r("text-heading-xs font-semibold", e),
|
|
93
94
|
...t
|
|
94
95
|
}));
|
|
95
|
-
|
|
96
|
-
var
|
|
97
|
-
ref:
|
|
98
|
-
className:
|
|
96
|
+
O.displayName = d.displayName;
|
|
97
|
+
var k = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h(s, {
|
|
98
|
+
ref: n,
|
|
99
|
+
className: r("text-body-md text-surface-fg-muted", e),
|
|
99
100
|
...t
|
|
100
101
|
}));
|
|
101
|
-
|
|
102
|
-
var
|
|
103
|
-
ref:
|
|
104
|
-
className:
|
|
102
|
+
k.displayName = s.displayName;
|
|
103
|
+
var A = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h(i, {
|
|
104
|
+
ref: n,
|
|
105
|
+
className: r("inline-flex h-ds-md items-center justify-center rounded-control px-ds-05 text-body-md font-semibold transition-colors bg-accent-9 text-accent-fg hover:bg-accent-10 active:bg-accent-10 shadow-raised focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-action-disabled", e),
|
|
105
106
|
...t
|
|
106
107
|
}));
|
|
107
|
-
|
|
108
|
-
var
|
|
109
|
-
ref:
|
|
110
|
-
className:
|
|
108
|
+
A.displayName = i.displayName;
|
|
109
|
+
var j = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h(a, {
|
|
110
|
+
ref: n,
|
|
111
|
+
className: r("inline-flex h-ds-md items-center justify-center rounded-control px-ds-05 text-body-md font-semibold transition-colors bg-transparent text-surface-fg-muted border border-surface-border-interactive hover:bg-surface-panel-hover hover:text-surface-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-action-disabled", e),
|
|
111
112
|
...t
|
|
112
113
|
}));
|
|
113
|
-
|
|
114
|
+
j.displayName = a.displayName;
|
|
114
115
|
//#endregion
|
|
115
|
-
export {
|
|
116
|
+
export { x as AlertDialog, A as AlertDialogAction, j as AlertDialogCancel, T as AlertDialogContent, k as AlertDialogDescription, D as AlertDialogFooter, E as AlertDialogHeader, w as AlertDialogOverlay, C as AlertDialogPortal, O as AlertDialogTitle, S as AlertDialogTrigger };
|