@inui/design-system 0.0.0-stage → 1.22.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/README.md +360 -2
- package/dist/components/ui/accordion.d.ts +44 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/accordion.js +86 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/ai-avatar.d.ts +46 -0
- package/dist/components/ui/ai-avatar.d.ts.map +1 -0
- package/dist/components/ui/ai-avatar.js +43 -0
- package/dist/components/ui/ai-avatar.js.map +1 -0
- package/dist/components/ui/ai-label.d.ts +118 -0
- package/dist/components/ui/ai-label.d.ts.map +1 -0
- package/dist/components/ui/ai-label.js +184 -0
- package/dist/components/ui/ai-label.js.map +1 -0
- package/dist/components/ui/ai-sparkle.d.ts +91 -0
- package/dist/components/ui/ai-sparkle.d.ts.map +1 -0
- package/dist/components/ui/ai-sparkle.js +200 -0
- package/dist/components/ui/ai-sparkle.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +79 -0
- package/dist/components/ui/alert-dialog.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog.js +147 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/alert.d.ts +71 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/alert.js +108 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/aspect-ratio.d.ts +30 -0
- package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
- package/dist/components/ui/aspect-ratio.js +40 -0
- package/dist/components/ui/aspect-ratio.js.map +1 -0
- package/dist/components/ui/attachment.d.ts +74 -0
- package/dist/components/ui/attachment.d.ts.map +1 -0
- package/dist/components/ui/attachment.js +142 -0
- package/dist/components/ui/attachment.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +82 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +123 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +130 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +226 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +43 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.js +98 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/browser-tabs.d.ts +218 -0
- package/dist/components/ui/browser-tabs.d.ts.map +1 -0
- package/dist/components/ui/browser-tabs.js +528 -0
- package/dist/components/ui/browser-tabs.js.map +1 -0
- package/dist/components/ui/bubble.d.ts +80 -0
- package/dist/components/ui/bubble.d.ts.map +1 -0
- package/dist/components/ui/bubble.js +235 -0
- package/dist/components/ui/bubble.js.map +1 -0
- package/dist/components/ui/button-group.d.ts +60 -0
- package/dist/components/ui/button-group.d.ts.map +1 -0
- package/dist/components/ui/button-group.js +89 -0
- package/dist/components/ui/button-group.js.map +1 -0
- package/dist/components/ui/button.d.ts +157 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +144 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.d.ts +57 -0
- package/dist/components/ui/calendar.d.ts.map +1 -0
- package/dist/components/ui/calendar.js +163 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.d.ts +96 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +131 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/carousel.d.ts +86 -0
- package/dist/components/ui/carousel.d.ts.map +1 -0
- package/dist/components/ui/carousel.js +207 -0
- package/dist/components/ui/carousel.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +54 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +78 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +45 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +65 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/combobox.d.ts +111 -0
- package/dist/components/ui/combobox.d.ts.map +1 -0
- package/dist/components/ui/combobox.js +264 -0
- package/dist/components/ui/combobox.js.map +1 -0
- package/dist/components/ui/command.d.ts +71 -0
- package/dist/components/ui/command.d.ts.map +1 -0
- package/dist/components/ui/command.js +133 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/context-menu.d.ts +70 -0
- package/dist/components/ui/context-menu.d.ts.map +1 -0
- package/dist/components/ui/context-menu.js +163 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/count-badge.d.ts +40 -0
- package/dist/components/ui/count-badge.d.ts.map +1 -0
- package/dist/components/ui/count-badge.js +43 -0
- package/dist/components/ui/count-badge.js.map +1 -0
- package/dist/components/ui/data-table.d.ts +1026 -0
- package/dist/components/ui/data-table.d.ts.map +1 -0
- package/dist/components/ui/data-table.js +3423 -0
- package/dist/components/ui/data-table.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +73 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +145 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/direction.d.ts +35 -0
- package/dist/components/ui/direction.d.ts.map +1 -0
- package/dist/components/ui/direction.js +35 -0
- package/dist/components/ui/direction.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +53 -0
- package/dist/components/ui/drawer.d.ts.map +1 -0
- package/dist/components/ui/drawer.js +115 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +75 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.js +173 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/dropzone.d.ts +141 -0
- package/dist/components/ui/dropzone.d.ts.map +1 -0
- package/dist/components/ui/dropzone.js +257 -0
- package/dist/components/ui/dropzone.js.map +1 -0
- package/dist/components/ui/empty.d.ts +94 -0
- package/dist/components/ui/empty.d.ts.map +1 -0
- package/dist/components/ui/empty.js +149 -0
- package/dist/components/ui/empty.js.map +1 -0
- package/dist/components/ui/field.d.ts +122 -0
- package/dist/components/ui/field.d.ts.map +1 -0
- package/dist/components/ui/field.js +254 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/hover-card.d.ts +51 -0
- package/dist/components/ui/hover-card.d.ts.map +1 -0
- package/dist/components/ui/hover-card.js +101 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/input-group.d.ts +62 -0
- package/dist/components/ui/input-group.d.ts.map +1 -0
- package/dist/components/ui/input-group.js +115 -0
- package/dist/components/ui/input-group.js.map +1 -0
- package/dist/components/ui/input-otp.d.ts +52 -0
- package/dist/components/ui/input-otp.d.ts.map +1 -0
- package/dist/components/ui/input-otp.js +89 -0
- package/dist/components/ui/input-otp.js.map +1 -0
- package/dist/components/ui/input.d.ts +47 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +47 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/item.d.ts +74 -0
- package/dist/components/ui/item.d.ts.map +1 -0
- package/dist/components/ui/item.js +176 -0
- package/dist/components/ui/item.js.map +1 -0
- package/dist/components/ui/kbd.d.ts +41 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +58 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/key-value-pair.d.ts +56 -0
- package/dist/components/ui/key-value-pair.d.ts.map +1 -0
- package/dist/components/ui/key-value-pair.js +110 -0
- package/dist/components/ui/key-value-pair.js.map +1 -0
- package/dist/components/ui/label.d.ts +83 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/label.js +85 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/marker.d.ts +54 -0
- package/dist/components/ui/marker.d.ts.map +1 -0
- package/dist/components/ui/marker.js +79 -0
- package/dist/components/ui/marker.js.map +1 -0
- package/dist/components/ui/menubar.d.ts +72 -0
- package/dist/components/ui/menubar.d.ts.map +1 -0
- package/dist/components/ui/menubar.js +174 -0
- package/dist/components/ui/menubar.js.map +1 -0
- package/dist/components/ui/message-scroller.d.ts +53 -0
- package/dist/components/ui/message-scroller.d.ts.map +1 -0
- package/dist/components/ui/message-scroller.js +95 -0
- package/dist/components/ui/message-scroller.js.map +1 -0
- package/dist/components/ui/message.d.ts +63 -0
- package/dist/components/ui/message.d.ts.map +1 -0
- package/dist/components/ui/message.js +92 -0
- package/dist/components/ui/message.js.map +1 -0
- package/dist/components/ui/meta-list.d.ts +55 -0
- package/dist/components/ui/meta-list.d.ts.map +1 -0
- package/dist/components/ui/meta-list.js +75 -0
- package/dist/components/ui/meta-list.js.map +1 -0
- package/dist/components/ui/native-select.d.ts +51 -0
- package/dist/components/ui/native-select.d.ts.map +1 -0
- package/dist/components/ui/native-select.js +75 -0
- package/dist/components/ui/native-select.js.map +1 -0
- package/dist/components/ui/navigation-menu.d.ts +56 -0
- package/dist/components/ui/navigation-menu.d.ts.map +1 -0
- package/dist/components/ui/navigation-menu.js +116 -0
- package/dist/components/ui/navigation-menu.js.map +1 -0
- package/dist/components/ui/page-header.d.ts +223 -0
- package/dist/components/ui/page-header.d.ts.map +1 -0
- package/dist/components/ui/page-header.js +233 -0
- package/dist/components/ui/page-header.js.map +1 -0
- package/dist/components/ui/pagination.d.ts +68 -0
- package/dist/components/ui/pagination.d.ts.map +1 -0
- package/dist/components/ui/pagination.js +145 -0
- package/dist/components/ui/pagination.js.map +1 -0
- package/dist/components/ui/popover.d.ts +61 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +144 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/progress.d.ts +35 -0
- package/dist/components/ui/progress.d.ts.map +1 -0
- package/dist/components/ui/progress.js +46 -0
- package/dist/components/ui/progress.js.map +1 -0
- package/dist/components/ui/questionnaire.d.ts +92 -0
- package/dist/components/ui/questionnaire.d.ts.map +1 -0
- package/dist/components/ui/questionnaire.js +277 -0
- package/dist/components/ui/questionnaire.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +50 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -0
- package/dist/components/ui/radio-group.js +65 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/resizable.d.ts +44 -0
- package/dist/components/ui/resizable.d.ts.map +1 -0
- package/dist/components/ui/resizable.js +73 -0
- package/dist/components/ui/resizable.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +55 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.js +72 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.d.ts +274 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/select.js +609 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.d.ts +31 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +38 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.d.ts +59 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/sheet.js +128 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/sidebar.d.ts +166 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/sidebar.js +512 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +35 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +46 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.d.ts +39 -0
- package/dist/components/ui/slider.d.ts.map +1 -0
- package/dist/components/ui/slider.js +75 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.d.ts +56 -0
- package/dist/components/ui/sonner.d.ts.map +1 -0
- package/dist/components/ui/sonner.js +96 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/spinner.d.ts +37 -0
- package/dist/components/ui/spinner.d.ts.map +1 -0
- package/dist/components/ui/spinner.js +51 -0
- package/dist/components/ui/spinner.js.map +1 -0
- package/dist/components/ui/stepper.d.ts +84 -0
- package/dist/components/ui/stepper.d.ts.map +1 -0
- package/dist/components/ui/stepper.js +145 -0
- package/dist/components/ui/stepper.js.map +1 -0
- package/dist/components/ui/switch.d.ts +36 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/switch.js +44 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.d.ts +80 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.js +130 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +87 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +128 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +35 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +38 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/time-picker.d.ts +58 -0
- package/dist/components/ui/time-picker.d.ts.map +1 -0
- package/dist/components/ui/time-picker.js +188 -0
- package/dist/components/ui/time-picker.js.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +52 -0
- package/dist/components/ui/toggle-group.d.ts.map +1 -0
- package/dist/components/ui/toggle-group.js +94 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle.d.ts +50 -0
- package/dist/components/ui/toggle.d.ts.map +1 -0
- package/dist/components/ui/toggle.js +70 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +51 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +78 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/hooks/use-dark-mode.d.ts +2 -0
- package/dist/hooks/use-dark-mode.d.ts.map +1 -0
- package/dist/hooks/use-dark-mode.js +36 -0
- package/dist/hooks/use-dark-mode.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +20 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/lib/scope.d.ts +64 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +74 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +11 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/theme-tokens.css +537 -0
- package/dist/theme.css +417 -0
- package/package.json +103 -3
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { cn } from "../../lib/utils.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/ui/skeleton.tsx
|
|
4
|
+
/**
|
|
5
|
+
* Skeleton — pulsing placeholder block that mirrors the shape of content still loading.
|
|
6
|
+
*
|
|
7
|
+
* A single div with an `animate-pulse` background; no internal shape logic.
|
|
8
|
+
* All sizing/shape comes from
|
|
9
|
+
* utility classes passed via `className` (e.g. `h-4 w-48`, `size-12 rounded-full`).
|
|
10
|
+
*/
|
|
11
|
+
function Skeleton({ className, ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx("div", {
|
|
13
|
+
"data-slot": "skeleton",
|
|
14
|
+
className: cn("animate-pulse rounded-md bg-muted", className),
|
|
15
|
+
...props
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* WHEN TO USE
|
|
20
|
+
* - Initial data fetch for a region whose layout is already known — lists, cards, tables — so the placeholder mirrors the real content shape.
|
|
21
|
+
* - Composing multiple Skeletons together (e.g. an avatar circle plus two text lines) to approximate a specific card or row.
|
|
22
|
+
*
|
|
23
|
+
* NOT WHEN
|
|
24
|
+
* - Action-level feedback on a button or small control — use Spinner instead.
|
|
25
|
+
* - Loads short enough to flash (under ~300ms) — a flashing skeleton reads as a glitch, not loading.
|
|
26
|
+
* - The final layout isn't known yet — an inaccurate placeholder is worse than a generic spinner.
|
|
27
|
+
*
|
|
28
|
+
* KEY RULES
|
|
29
|
+
* - Skeleton has no default size — always pass explicit sizing via `className` (e.g. `h-4 w-48`, `size-12 rounded-full`) to match the real content.
|
|
30
|
+
* - Shape should mirror the content it stands in for: circles for avatars, matching line-heights/widths for text.
|
|
31
|
+
*
|
|
32
|
+
* USAGE
|
|
33
|
+
* <Skeleton className="h-4 w-48" />
|
|
34
|
+
*
|
|
35
|
+
* <div className="flex items-center gap-4">
|
|
36
|
+
* <Skeleton className="size-12 rounded-full" />
|
|
37
|
+
* <div className="grid flex-1 gap-2">
|
|
38
|
+
* <Skeleton className="h-4 w-full" />
|
|
39
|
+
* <Skeleton className="h-4 w-3/5" />
|
|
40
|
+
* </div>
|
|
41
|
+
* </div>
|
|
42
|
+
*/
|
|
43
|
+
//#endregion
|
|
44
|
+
export { Skeleton };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.js","names":[],"sources":["../../../src/components/ui/skeleton.tsx"],"sourcesContent":["/**\n * Skeleton — pulsing placeholder block that mirrors the shape of content still loading.\n *\n * A single div with an `animate-pulse` background; no internal shape logic.\n * All sizing/shape comes from\n * utility classes passed via `className` (e.g. `h-4 w-48`, `size-12 rounded-full`).\n */\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n\n/**\n * WHEN TO USE\n * - Initial data fetch for a region whose layout is already known — lists, cards, tables — so the placeholder mirrors the real content shape.\n * - Composing multiple Skeletons together (e.g. an avatar circle plus two text lines) to approximate a specific card or row.\n *\n * NOT WHEN\n * - Action-level feedback on a button or small control — use Spinner instead.\n * - Loads short enough to flash (under ~300ms) — a flashing skeleton reads as a glitch, not loading.\n * - The final layout isn't known yet — an inaccurate placeholder is worse than a generic spinner.\n *\n * KEY RULES\n * - Skeleton has no default size — always pass explicit sizing via `className` (e.g. `h-4 w-48`, `size-12 rounded-full`) to match the real content.\n * - Shape should mirror the content it stands in for: circles for avatars, matching line-heights/widths for text.\n *\n * USAGE\n * <Skeleton className=\"h-4 w-48\" />\n *\n * <div className=\"flex items-center gap-4\">\n * <Skeleton className=\"size-12 rounded-full\" />\n * <div className=\"grid flex-1 gap-2\">\n * <Skeleton className=\"h-4 w-full\" />\n * <Skeleton className=\"h-4 w-3/5\" />\n * </div>\n * </div>\n */\n"],"mappings":";;;;;;;;;;AAUA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAsC;CACtE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,qCAAqC,SAAS;EAC5D,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slider — draggable thumb control for picking a value or span within bounds.
|
|
3
|
+
*
|
|
4
|
+
* Built on the Radix Slider primitive. Thumb count is derived from
|
|
5
|
+
* `value`/`defaultValue` length (one number = one thumb, two = a range).
|
|
6
|
+
*/
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import { Slider as SliderPrimitive } from "radix-ui";
|
|
9
|
+
declare function Slider({ className, defaultValue, value, min, max, disabled, "aria-label": ariaLabel, ...props }: React.ComponentProps<typeof SliderPrimitive.Root>): React.JSX.Element;
|
|
10
|
+
export { Slider };
|
|
11
|
+
/**
|
|
12
|
+
* WHEN TO USE
|
|
13
|
+
* - Selecting a single value or a span within a bounded numeric range where approximate, visual input is acceptable (volume, price range, opacity).
|
|
14
|
+
* - `orientation="vertical"` for vertical layouts.
|
|
15
|
+
*
|
|
16
|
+
* NOT WHEN
|
|
17
|
+
* - Exact numeric entry matters — use Input type="number" instead.
|
|
18
|
+
* - The range is unbounded or unknown — Slider requires explicit `min`/`max` (default 0/100).
|
|
19
|
+
*
|
|
20
|
+
* KEY RULES
|
|
21
|
+
* - Thumb count is derived from `defaultValue`/`value` array length: one number = one thumb, two numbers = a range with two thumbs.
|
|
22
|
+
* - `step` quantizes the value (e.g. step={20} snaps to 0/20/40/60/80/100).
|
|
23
|
+
* - `min`/`max` default to 0/100 — pass explicit bounds for anything that isn't a percentage.
|
|
24
|
+
* - `disabled` dims the whole control automatically — no separate disabled styling needed.
|
|
25
|
+
* - Pass `aria-label`, not a paired `<Label htmlFor>` — the `id`/`htmlFor` association only
|
|
26
|
+
* reaches SliderPrimitive.Root, which isn't the focusable element; the actual `role="slider"`
|
|
27
|
+
* thumb(s) need a real name, so `aria-label` is applied straight to each Thumb instead (a range
|
|
28
|
+
* slider's two thumbs get it suffixed "(min)"/"(max)" automatically).
|
|
29
|
+
*
|
|
30
|
+
* USAGE
|
|
31
|
+
* <Slider defaultValue={[50]} max={100} step={1} />
|
|
32
|
+
*
|
|
33
|
+
* // Range (two thumbs)
|
|
34
|
+
* <Slider defaultValue={[25, 75]} max={100} step={1} />
|
|
35
|
+
*
|
|
36
|
+
* // Vertical
|
|
37
|
+
* <Slider defaultValue={[50]} max={100} orientation="vertical" />
|
|
38
|
+
*/
|
|
39
|
+
//# sourceMappingURL=slider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/components/ui/slider.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,UAAU,CAAA;AAIpD,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,YAAY,EACZ,KAAK,EACL,GAAO,EACP,GAAS,EACT,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,qBAyDnD;AAED,OAAO,EAAE,MAAM,EAAE,CAAA;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Slider as Slider$1 } from "radix-ui";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/components/ui/slider.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Slider — draggable thumb control for picking a value or span within bounds.
|
|
9
|
+
*
|
|
10
|
+
* Built on the Radix Slider primitive. Thumb count is derived from
|
|
11
|
+
* `value`/`defaultValue` length (one number = one thumb, two = a range).
|
|
12
|
+
*/
|
|
13
|
+
function Slider({ className, defaultValue, value, min = 0, max = 100, disabled, "aria-label": ariaLabel, ...props }) {
|
|
14
|
+
const _values = React.useMemo(() => Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max], [
|
|
15
|
+
value,
|
|
16
|
+
defaultValue,
|
|
17
|
+
min,
|
|
18
|
+
max
|
|
19
|
+
]);
|
|
20
|
+
return /* @__PURE__ */ jsxs(Slider$1.Root, {
|
|
21
|
+
"data-slot": "slider",
|
|
22
|
+
defaultValue,
|
|
23
|
+
value,
|
|
24
|
+
min,
|
|
25
|
+
max,
|
|
26
|
+
disabled,
|
|
27
|
+
className: cn("relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col", className),
|
|
28
|
+
...props,
|
|
29
|
+
children: [/* @__PURE__ */ jsx(Slider$1.Track, {
|
|
30
|
+
"data-slot": "slider-track",
|
|
31
|
+
className: "relative grow overflow-hidden rounded-full bg-muted data-[orientation=horizontal]:h-1 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1",
|
|
32
|
+
children: /* @__PURE__ */ jsx(Slider$1.Range, {
|
|
33
|
+
"data-slot": "slider-range",
|
|
34
|
+
className: "absolute bg-primary select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full"
|
|
35
|
+
})
|
|
36
|
+
}), Array.from({ length: _values.length }, (_, index) => /* @__PURE__ */ jsx(Slider$1.Thumb, {
|
|
37
|
+
"data-slot": "slider-thumb",
|
|
38
|
+
"aria-disabled": disabled || void 0,
|
|
39
|
+
"aria-label": _values.length > 1 ? `${ariaLabel ?? "Slider"} (${index === 0 ? "min" : "max"})` : ariaLabel ?? "Slider",
|
|
40
|
+
className: "relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 disabled:pointer-events-none disabled:opacity-50"
|
|
41
|
+
}, index))]
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* WHEN TO USE
|
|
46
|
+
* - Selecting a single value or a span within a bounded numeric range where approximate, visual input is acceptable (volume, price range, opacity).
|
|
47
|
+
* - `orientation="vertical"` for vertical layouts.
|
|
48
|
+
*
|
|
49
|
+
* NOT WHEN
|
|
50
|
+
* - Exact numeric entry matters — use Input type="number" instead.
|
|
51
|
+
* - The range is unbounded or unknown — Slider requires explicit `min`/`max` (default 0/100).
|
|
52
|
+
*
|
|
53
|
+
* KEY RULES
|
|
54
|
+
* - Thumb count is derived from `defaultValue`/`value` array length: one number = one thumb, two numbers = a range with two thumbs.
|
|
55
|
+
* - `step` quantizes the value (e.g. step={20} snaps to 0/20/40/60/80/100).
|
|
56
|
+
* - `min`/`max` default to 0/100 — pass explicit bounds for anything that isn't a percentage.
|
|
57
|
+
* - `disabled` dims the whole control automatically — no separate disabled styling needed.
|
|
58
|
+
* - Pass `aria-label`, not a paired `<Label htmlFor>` — the `id`/`htmlFor` association only
|
|
59
|
+
* reaches SliderPrimitive.Root, which isn't the focusable element; the actual `role="slider"`
|
|
60
|
+
* thumb(s) need a real name, so `aria-label` is applied straight to each Thumb instead (a range
|
|
61
|
+
* slider's two thumbs get it suffixed "(min)"/"(max)" automatically).
|
|
62
|
+
*
|
|
63
|
+
* USAGE
|
|
64
|
+
* <Slider defaultValue={[50]} max={100} step={1} />
|
|
65
|
+
*
|
|
66
|
+
* // Range (two thumbs)
|
|
67
|
+
* <Slider defaultValue={[25, 75]} max={100} step={1} />
|
|
68
|
+
*
|
|
69
|
+
* // Vertical
|
|
70
|
+
* <Slider defaultValue={[50]} max={100} orientation="vertical" />
|
|
71
|
+
*/
|
|
72
|
+
//#endregion
|
|
73
|
+
export { Slider };
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider.js","names":[],"sources":["../../../src/components/ui/slider.tsx"],"sourcesContent":["\"use client\"\n\n/**\n * Slider — draggable thumb control for picking a value or span within bounds.\n *\n * Built on the Radix Slider primitive. Thumb count is derived from\n * `value`/`defaultValue` length (one number = one thumb, two = a range).\n */\n\nimport * as React from \"react\"\nimport { Slider as SliderPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n disabled,\n \"aria-label\": ariaLabel,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max]\n )\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n disabled={disabled}\n className={cn(\n \"relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"relative grow overflow-hidden rounded-full bg-muted data-[orientation=horizontal]:h-1 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1\"\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className=\"absolute bg-primary select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\"\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n // Radix only puts `aria-disabled` on the root track element, not\n // on the `role=\"slider\"` thumb itself — browse/virtual-cursor\n // screen-reader navigation reaches the thumb independent of tab\n // order, so it needs its own disabled state, not just a removed\n // `tabIndex`.\n aria-disabled={disabled || undefined}\n aria-label={\n // Falls back to a generic name when the consumer forgets one —\n // `role=\"slider\"` has no accessible name otherwise (4.1.2).\n // Prefer passing a real one describing what the value controls.\n _values.length > 1\n ? `${ariaLabel ?? \"Slider\"} (${index === 0 ? \"min\" : \"max\"})`\n : ariaLabel ?? \"Slider\"\n }\n className=\"relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider }\n\n/**\n * WHEN TO USE\n * - Selecting a single value or a span within a bounded numeric range where approximate, visual input is acceptable (volume, price range, opacity).\n * - `orientation=\"vertical\"` for vertical layouts.\n *\n * NOT WHEN\n * - Exact numeric entry matters — use Input type=\"number\" instead.\n * - The range is unbounded or unknown — Slider requires explicit `min`/`max` (default 0/100).\n *\n * KEY RULES\n * - Thumb count is derived from `defaultValue`/`value` array length: one number = one thumb, two numbers = a range with two thumbs.\n * - `step` quantizes the value (e.g. step={20} snaps to 0/20/40/60/80/100).\n * - `min`/`max` default to 0/100 — pass explicit bounds for anything that isn't a percentage.\n * - `disabled` dims the whole control automatically — no separate disabled styling needed.\n * - Pass `aria-label`, not a paired `<Label htmlFor>` — the `id`/`htmlFor` association only\n * reaches SliderPrimitive.Root, which isn't the focusable element; the actual `role=\"slider\"`\n * thumb(s) need a real name, so `aria-label` is applied straight to each Thumb instead (a range\n * slider's two thumbs get it suffixed \"(min)\"/\"(max)\" automatically).\n *\n * USAGE\n * <Slider defaultValue={[50]} max={100} step={1} />\n *\n * // Range (two thumbs)\n * <Slider defaultValue={[25, 75]} max={100} step={1} />\n *\n * // Vertical\n * <Slider defaultValue={[50]} max={100} orientation=\"vertical\" />\n */\n"],"mappings":";;;;;;;;;;;;AAcA,SAAS,OAAO,EACd,WACA,cACA,OACA,MAAM,GACN,MAAM,KACN,UACA,cAAc,WACd,GAAG,SACiD;CACpD,MAAM,UAAU,MAAM,cAElB,MAAM,QAAQ,KAAK,IACf,QACA,MAAM,QAAQ,YAAY,IACxB,eACA,CAAC,KAAK,GAAG,GACjB;EAAC;EAAO;EAAc;EAAK;CAAG,CAChC;CAEA,OACE,qBAAC,SAAgB,MAAjB;EACE,aAAU;EACI;EACP;EACF;EACA;EACK;EACV,WAAW,GACT,qOACA,SACF;EACA,GAAI;EAXN,UAAA,CAaE,oBAAC,SAAgB,OAAjB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,SAAgB,OAAjB;IACE,aAAU;IACV,WAAU;GACX,CAAA;EACoB,CAAA,GACtB,MAAM,KAAK,EAAE,QAAQ,QAAQ,OAAO,IAAI,GAAG,UAC1C,oBAAC,SAAgB,OAAjB;GACE,aAAU;GAOV,iBAAe,YAAY,KAAA;GAC3B,cAIE,QAAQ,SAAS,IACb,GAAG,aAAa,SAAS,IAAI,UAAU,IAAI,QAAQ,MAAM,KACzD,aAAa;GAEnB,WAAU;EACX,GAhBM,KAgBN,CACF,CACmB;;AAE1B"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toaster — host that renders transient toast notifications fired from anywhere in the app.
|
|
3
|
+
*
|
|
4
|
+
* Pre-wires the `sonner` library's `<Toaster />` with themed icons AND
|
|
5
|
+
* colors for success/info/warning/error — `richColors` plus a status-token
|
|
6
|
+
* override so each type gets MMDS's own success/info/warning/destructive
|
|
7
|
+
* bg-light/border/text triad instead of sonner's hardcoded default hues.
|
|
8
|
+
* `loading` stays neutral (`--normal-*`), matching the icon-only treatment.
|
|
9
|
+
* Mount `<Toaster />` once. Light/dark is resolved from the `dark` class on
|
|
10
|
+
* `<html>` (see `useIsDarkMode`) rather than via `next-themes`, so consumers
|
|
11
|
+
* aren't forced into a theme provider — pass `theme` explicitly to override.
|
|
12
|
+
*/
|
|
13
|
+
import { type ToasterProps } from "sonner";
|
|
14
|
+
/**
|
|
15
|
+
* Theme is resolved from the `dark` class on `<html>` rather than from
|
|
16
|
+
* `next-themes`, so the design system doesn't drag
|
|
17
|
+
* a theme provider into every consumer. Pass `theme` explicitly to override —
|
|
18
|
+
* e.g. `theme={useTheme().resolvedTheme}` if you do use next-themes.
|
|
19
|
+
*/
|
|
20
|
+
declare const Toaster: ({ ...props }: ToasterProps) => import("react").JSX.Element;
|
|
21
|
+
export { Toaster };
|
|
22
|
+
/**
|
|
23
|
+
* WHEN TO USE
|
|
24
|
+
* - Transient confirmations and background-operation results — saved, deleted, upload finished, deployment started.
|
|
25
|
+
* - Status updates that use the pre-wired semantic icons: success, info, warning, error, or loading.
|
|
26
|
+
* - A toast with an inline action (e.g. "Undo") via the `action` option.
|
|
27
|
+
*
|
|
28
|
+
* NOT WHEN
|
|
29
|
+
* - Information that must stay visible until resolved — use Alert instead.
|
|
30
|
+
* - Anything requiring the user to make a decision before continuing — use AlertDialog instead.
|
|
31
|
+
* - Form validation feedback — use Field + FieldError instead.
|
|
32
|
+
*
|
|
33
|
+
* KEY RULES
|
|
34
|
+
* - Requires `<Toaster />` mounted once at the app root; toasts are fired from anywhere via `import { toast } from "sonner"`, not by importing this file's `Toaster` directly.
|
|
35
|
+
* - Call `toast(message)`, or a variant: `toast.success(...)`, `toast.error(...)`, `toast.warning(...)`, `toast.info(...)`, `toast.loading(...)` — each renders with its matching themed icon automatically.
|
|
36
|
+
* - Theme is derived from the `dark` class on `<html>`; pass `theme` explicitly only if that detection doesn't fit your app's theming setup.
|
|
37
|
+
*
|
|
38
|
+
* USAGE
|
|
39
|
+
* <Toaster />
|
|
40
|
+
* <Button onClick={() => toast("Deployment started")}>Show toast</Button>
|
|
41
|
+
*
|
|
42
|
+
* <Button onClick={() => toast.success("Build succeeded")}>Success</Button>
|
|
43
|
+
* <Button onClick={() => toast.error("Build failed")}>Error</Button>
|
|
44
|
+
*
|
|
45
|
+
* <Button
|
|
46
|
+
* onClick={() =>
|
|
47
|
+
* toast("Component deleted", {
|
|
48
|
+
* description: "button.tsx was removed from the registry.",
|
|
49
|
+
* action: { label: "Undo", onClick: () => toast("Restored") },
|
|
50
|
+
* })
|
|
51
|
+
* }
|
|
52
|
+
* >
|
|
53
|
+
* Show toast with action
|
|
54
|
+
* </Button>
|
|
55
|
+
*/
|
|
56
|
+
//# sourceMappingURL=sonner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sonner.d.ts","sourceRoot":"","sources":["../../../src/components/ui/sonner.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AAW7D;;;;;GAKG;AACH,QAAA,MAAM,OAAO,GAAI,cAAc,YAAY,gCAqD1C,CAAA;AAED,OAAO,EAAE,OAAO,EAAE,CAAA;AAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { useIsDarkMode } from "../../hooks/use-dark-mode.js";
|
|
2
|
+
import { CircleCheckIcon, InfoIcon, Loader2Icon, OctagonXIcon, TriangleAlertIcon } from "lucide-react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { Toaster as Toaster$1 } from "sonner";
|
|
5
|
+
//#region src/components/ui/sonner.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Toaster — host that renders transient toast notifications fired from anywhere in the app.
|
|
8
|
+
*
|
|
9
|
+
* Pre-wires the `sonner` library's `<Toaster />` with themed icons AND
|
|
10
|
+
* colors for success/info/warning/error — `richColors` plus a status-token
|
|
11
|
+
* override so each type gets MMDS's own success/info/warning/destructive
|
|
12
|
+
* bg-light/border/text triad instead of sonner's hardcoded default hues.
|
|
13
|
+
* `loading` stays neutral (`--normal-*`), matching the icon-only treatment.
|
|
14
|
+
* Mount `<Toaster />` once. Light/dark is resolved from the `dark` class on
|
|
15
|
+
* `<html>` (see `useIsDarkMode`) rather than via `next-themes`, so consumers
|
|
16
|
+
* aren't forced into a theme provider — pass `theme` explicitly to override.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Theme is resolved from the `dark` class on `<html>` rather than from
|
|
20
|
+
* `next-themes`, so the design system doesn't drag
|
|
21
|
+
* a theme provider into every consumer. Pass `theme` explicitly to override —
|
|
22
|
+
* e.g. `theme={useTheme().resolvedTheme}` if you do use next-themes.
|
|
23
|
+
*/
|
|
24
|
+
var Toaster = ({ ...props }) => {
|
|
25
|
+
const isDark = useIsDarkMode();
|
|
26
|
+
return /* @__PURE__ */ jsx(Toaster$1, {
|
|
27
|
+
theme: isDark ? "dark" : "light",
|
|
28
|
+
className: "toaster group",
|
|
29
|
+
richColors: true,
|
|
30
|
+
icons: {
|
|
31
|
+
success: /* @__PURE__ */ jsx(CircleCheckIcon, { className: "size-4" }),
|
|
32
|
+
info: /* @__PURE__ */ jsx(InfoIcon, { className: "size-4" }),
|
|
33
|
+
warning: /* @__PURE__ */ jsx(TriangleAlertIcon, { className: "size-4" }),
|
|
34
|
+
error: /* @__PURE__ */ jsx(OctagonXIcon, { className: "size-4" }),
|
|
35
|
+
loading: /* @__PURE__ */ jsx(Loader2Icon, { className: "size-4 animate-spin" })
|
|
36
|
+
},
|
|
37
|
+
style: {
|
|
38
|
+
"--normal-bg": "var(--popover)",
|
|
39
|
+
"--normal-text": "var(--popover-foreground)",
|
|
40
|
+
"--normal-border": "var(--border)",
|
|
41
|
+
"--border-radius": "var(--radius)",
|
|
42
|
+
"--success-bg": "var(--color-success-light)",
|
|
43
|
+
"--success-border": "var(--color-success)",
|
|
44
|
+
"--success-text": "var(--color-success-text)",
|
|
45
|
+
"--info-bg": "var(--color-info-light)",
|
|
46
|
+
"--info-border": "var(--color-info)",
|
|
47
|
+
"--info-text": "var(--color-info-text)",
|
|
48
|
+
"--warning-bg": "var(--color-warning-light)",
|
|
49
|
+
"--warning-border": "var(--color-warning)",
|
|
50
|
+
"--warning-text": "var(--color-warning-text)",
|
|
51
|
+
"--error-bg": "var(--color-destructive-light)",
|
|
52
|
+
"--error-border": "var(--color-destructive)",
|
|
53
|
+
"--error-text": "var(--color-destructive-text)"
|
|
54
|
+
},
|
|
55
|
+
toastOptions: { classNames: { toast: "cn-toast" } },
|
|
56
|
+
...props
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* WHEN TO USE
|
|
61
|
+
* - Transient confirmations and background-operation results — saved, deleted, upload finished, deployment started.
|
|
62
|
+
* - Status updates that use the pre-wired semantic icons: success, info, warning, error, or loading.
|
|
63
|
+
* - A toast with an inline action (e.g. "Undo") via the `action` option.
|
|
64
|
+
*
|
|
65
|
+
* NOT WHEN
|
|
66
|
+
* - Information that must stay visible until resolved — use Alert instead.
|
|
67
|
+
* - Anything requiring the user to make a decision before continuing — use AlertDialog instead.
|
|
68
|
+
* - Form validation feedback — use Field + FieldError instead.
|
|
69
|
+
*
|
|
70
|
+
* KEY RULES
|
|
71
|
+
* - Requires `<Toaster />` mounted once at the app root; toasts are fired from anywhere via `import { toast } from "sonner"`, not by importing this file's `Toaster` directly.
|
|
72
|
+
* - Call `toast(message)`, or a variant: `toast.success(...)`, `toast.error(...)`, `toast.warning(...)`, `toast.info(...)`, `toast.loading(...)` — each renders with its matching themed icon automatically.
|
|
73
|
+
* - Theme is derived from the `dark` class on `<html>`; pass `theme` explicitly only if that detection doesn't fit your app's theming setup.
|
|
74
|
+
*
|
|
75
|
+
* USAGE
|
|
76
|
+
* <Toaster />
|
|
77
|
+
* <Button onClick={() => toast("Deployment started")}>Show toast</Button>
|
|
78
|
+
*
|
|
79
|
+
* <Button onClick={() => toast.success("Build succeeded")}>Success</Button>
|
|
80
|
+
* <Button onClick={() => toast.error("Build failed")}>Error</Button>
|
|
81
|
+
*
|
|
82
|
+
* <Button
|
|
83
|
+
* onClick={() =>
|
|
84
|
+
* toast("Component deleted", {
|
|
85
|
+
* description: "button.tsx was removed from the registry.",
|
|
86
|
+
* action: { label: "Undo", onClick: () => toast("Restored") },
|
|
87
|
+
* })
|
|
88
|
+
* }
|
|
89
|
+
* >
|
|
90
|
+
* Show toast with action
|
|
91
|
+
* </Button>
|
|
92
|
+
*/
|
|
93
|
+
//#endregion
|
|
94
|
+
export { Toaster };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=sonner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sonner.js","names":[],"sources":["../../../src/components/ui/sonner.tsx"],"sourcesContent":["/**\n * Toaster — host that renders transient toast notifications fired from anywhere in the app.\n *\n * Pre-wires the `sonner` library's `<Toaster />` with themed icons AND\n * colors for success/info/warning/error — `richColors` plus a status-token\n * override so each type gets MMDS's own success/info/warning/destructive\n * bg-light/border/text triad instead of sonner's hardcoded default hues.\n * `loading` stays neutral (`--normal-*`), matching the icon-only treatment.\n * Mount `<Toaster />` once. Light/dark is resolved from the `dark` class on\n * `<html>` (see `useIsDarkMode`) rather than via `next-themes`, so consumers\n * aren't forced into a theme provider — pass `theme` explicitly to override.\n */\n\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\"\nimport {\n CircleCheckIcon,\n InfoIcon,\n TriangleAlertIcon,\n OctagonXIcon,\n Loader2Icon,\n} from \"lucide-react\"\n\nimport { useIsDarkMode } from \"@/hooks/use-dark-mode\"\n\n/**\n * Theme is resolved from the `dark` class on `<html>` rather than from\n * `next-themes`, so the design system doesn't drag\n * a theme provider into every consumer. Pass `theme` explicitly to override —\n * e.g. `theme={useTheme().resolvedTheme}` if you do use next-themes.\n */\nconst Toaster = ({ ...props }: ToasterProps) => {\n const isDark = useIsDarkMode()\n\n return (\n <Sonner\n theme={isDark ? \"dark\" : \"light\"}\n className=\"toaster group\"\n // Sonner only applies its per-type `--success-*`/`--error-*`/etc.\n // variables (below) when `richColors` is on — otherwise every type\n // falls back to `--normal-*` regardless of icon, and success/error/\n // warning/info toasts render visually identical.\n richColors\n icons={{\n success: <CircleCheckIcon className=\"size-4\" />,\n info: <InfoIcon className=\"size-4\" />,\n warning: <TriangleAlertIcon className=\"size-4\" />,\n error: <OctagonXIcon className=\"size-4\" />,\n loading: <Loader2Icon className=\"size-4 animate-spin\" />,\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n // Same bg-light/border-base/text-text triad Badge's own\n // outline+colored-icon status convention uses — overrides\n // sonner's hardcoded default HSLs with MMDS's status tokens.\n \"--success-bg\": \"var(--color-success-light)\",\n \"--success-border\": \"var(--color-success)\",\n \"--success-text\": \"var(--color-success-text)\",\n \"--info-bg\": \"var(--color-info-light)\",\n \"--info-border\": \"var(--color-info)\",\n \"--info-text\": \"var(--color-info-text)\",\n \"--warning-bg\": \"var(--color-warning-light)\",\n \"--warning-border\": \"var(--color-warning)\",\n \"--warning-text\": \"var(--color-warning-text)\",\n // Sonner has no separate \"alert\" tier — its `error` type maps to\n // MMDS's `destructive` family (tokens.md: \"Errors, destructive\n // actions\"), the same mapping toast.error() implies semantically.\n \"--error-bg\": \"var(--color-destructive-light)\",\n \"--error-border\": \"var(--color-destructive)\",\n \"--error-text\": \"var(--color-destructive-text)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast: \"cn-toast\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n\n/**\n * WHEN TO USE\n * - Transient confirmations and background-operation results — saved, deleted, upload finished, deployment started.\n * - Status updates that use the pre-wired semantic icons: success, info, warning, error, or loading.\n * - A toast with an inline action (e.g. \"Undo\") via the `action` option.\n *\n * NOT WHEN\n * - Information that must stay visible until resolved — use Alert instead.\n * - Anything requiring the user to make a decision before continuing — use AlertDialog instead.\n * - Form validation feedback — use Field + FieldError instead.\n *\n * KEY RULES\n * - Requires `<Toaster />` mounted once at the app root; toasts are fired from anywhere via `import { toast } from \"sonner\"`, not by importing this file's `Toaster` directly.\n * - Call `toast(message)`, or a variant: `toast.success(...)`, `toast.error(...)`, `toast.warning(...)`, `toast.info(...)`, `toast.loading(...)` — each renders with its matching themed icon automatically.\n * - Theme is derived from the `dark` class on `<html>`; pass `theme` explicitly only if that detection doesn't fit your app's theming setup.\n *\n * USAGE\n * <Toaster />\n * <Button onClick={() => toast(\"Deployment started\")}>Show toast</Button>\n *\n * <Button onClick={() => toast.success(\"Build succeeded\")}>Success</Button>\n * <Button onClick={() => toast.error(\"Build failed\")}>Error</Button>\n *\n * <Button\n * onClick={() =>\n * toast(\"Component deleted\", {\n * description: \"button.tsx was removed from the registry.\",\n * action: { label: \"Undo\", onClick: () => toast(\"Restored\") },\n * })\n * }\n * >\n * Show toast with action\n * </Button>\n */\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAM,WAAW,EAAE,GAAG,YAA0B;CAC9C,MAAM,SAAS,cAAc;CAE7B,OACE,oBAAC,WAAD;EACE,OAAO,SAAS,SAAS;EACzB,WAAU;EAKV,YAAA;EACA,OAAO;GACL,SAAS,oBAAC,iBAAD,EAAiB,WAAU,SAAU,CAAA;GAC9C,MAAM,oBAAC,UAAD,EAAU,WAAU,SAAU,CAAA;GACpC,SAAS,oBAAC,mBAAD,EAAmB,WAAU,SAAU,CAAA;GAChD,OAAO,oBAAC,cAAD,EAAc,WAAU,SAAU,CAAA;GACzC,SAAS,oBAAC,aAAD,EAAa,WAAU,sBAAuB,CAAA;EACzD;EACA,OACE;GACE,eAAe;GACf,iBAAiB;GACjB,mBAAmB;GACnB,mBAAmB;GAInB,gBAAgB;GAChB,oBAAoB;GACpB,kBAAkB;GAClB,aAAa;GACb,iBAAiB;GACjB,eAAe;GACf,gBAAgB;GAChB,oBAAoB;GACpB,kBAAkB;GAIlB,cAAc;GACd,kBAAkB;GAClB,gBAAgB;EAClB;EAEF,cAAc,EACZ,YAAY,EACV,OAAO,WACT,EACF;EACA,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spinner — small indeterminate loading indicator for inline/action-level feedback.
|
|
3
|
+
*
|
|
4
|
+
* A single `Loader2Icon` (lucide-react) with `animate-spin` applied; no
|
|
5
|
+
* wrapper element.
|
|
6
|
+
*/
|
|
7
|
+
declare function Spinner({ className, ...props }: React.ComponentProps<"svg">): import("react").JSX.Element;
|
|
8
|
+
export { Spinner };
|
|
9
|
+
/**
|
|
10
|
+
* WHEN TO USE
|
|
11
|
+
* - Async feedback inside a button while an action is in flight (e.g. Saving, Loading) — pair with `disabled` on the button.
|
|
12
|
+
* - Small inline load indicators where the surrounding layout is already stable.
|
|
13
|
+
*
|
|
14
|
+
* NOT WHEN
|
|
15
|
+
* - Loading a whole region with a known layout — use Skeleton instead.
|
|
16
|
+
* - Progress is measurable — use Progress instead.
|
|
17
|
+
*
|
|
18
|
+
* KEY RULES
|
|
19
|
+
* - Size with utility classes (`size-3` … `size-8`); default is `size-4` if no size class is passed.
|
|
20
|
+
* - Color inherits `currentColor` — it takes on the text color of its container, no separate color prop.
|
|
21
|
+
* - Renders as a single `<svg>` with `role="status"` and `aria-label="Loading"` already applied — don't wrap it in another status/live-region element.
|
|
22
|
+
*
|
|
23
|
+
* USAGE
|
|
24
|
+
* <Spinner />
|
|
25
|
+
*
|
|
26
|
+
* <div className="flex items-center gap-4">
|
|
27
|
+
* <Spinner className="size-3" />
|
|
28
|
+
* <Spinner className="size-6" />
|
|
29
|
+
* <Spinner className="size-8" />
|
|
30
|
+
* </div>
|
|
31
|
+
*
|
|
32
|
+
* <Button disabled>
|
|
33
|
+
* <Spinner />
|
|
34
|
+
* Saving
|
|
35
|
+
* </Button>
|
|
36
|
+
*/
|
|
37
|
+
//# sourceMappingURL=spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/components/ui/spinner.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,iBAAS,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAUpE;AAED,OAAO,EAAE,OAAO,EAAE,CAAA;AAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { cn } from "../../lib/utils.js";
|
|
2
|
+
import { Loader2Icon } from "lucide-react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/ui/spinner.tsx
|
|
5
|
+
/**
|
|
6
|
+
* Spinner — small indeterminate loading indicator for inline/action-level feedback.
|
|
7
|
+
*
|
|
8
|
+
* A single `Loader2Icon` (lucide-react) with `animate-spin` applied; no
|
|
9
|
+
* wrapper element.
|
|
10
|
+
*/
|
|
11
|
+
function Spinner({ className, ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx(Loader2Icon, {
|
|
13
|
+
"data-slot": "spinner",
|
|
14
|
+
role: "status",
|
|
15
|
+
"aria-label": "Loading",
|
|
16
|
+
className: cn("size-4 animate-spin", className),
|
|
17
|
+
...props
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* WHEN TO USE
|
|
22
|
+
* - Async feedback inside a button while an action is in flight (e.g. Saving, Loading) — pair with `disabled` on the button.
|
|
23
|
+
* - Small inline load indicators where the surrounding layout is already stable.
|
|
24
|
+
*
|
|
25
|
+
* NOT WHEN
|
|
26
|
+
* - Loading a whole region with a known layout — use Skeleton instead.
|
|
27
|
+
* - Progress is measurable — use Progress instead.
|
|
28
|
+
*
|
|
29
|
+
* KEY RULES
|
|
30
|
+
* - Size with utility classes (`size-3` … `size-8`); default is `size-4` if no size class is passed.
|
|
31
|
+
* - Color inherits `currentColor` — it takes on the text color of its container, no separate color prop.
|
|
32
|
+
* - Renders as a single `<svg>` with `role="status"` and `aria-label="Loading"` already applied — don't wrap it in another status/live-region element.
|
|
33
|
+
*
|
|
34
|
+
* USAGE
|
|
35
|
+
* <Spinner />
|
|
36
|
+
*
|
|
37
|
+
* <div className="flex items-center gap-4">
|
|
38
|
+
* <Spinner className="size-3" />
|
|
39
|
+
* <Spinner className="size-6" />
|
|
40
|
+
* <Spinner className="size-8" />
|
|
41
|
+
* </div>
|
|
42
|
+
*
|
|
43
|
+
* <Button disabled>
|
|
44
|
+
* <Spinner />
|
|
45
|
+
* Saving
|
|
46
|
+
* </Button>
|
|
47
|
+
*/
|
|
48
|
+
//#endregion
|
|
49
|
+
export { Spinner };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","names":[],"sources":["../../../src/components/ui/spinner.tsx"],"sourcesContent":["/**\n * Spinner — small indeterminate loading indicator for inline/action-level feedback.\n *\n * A single `Loader2Icon` (lucide-react) with `animate-spin` applied; no\n * wrapper element.\n */\n\nimport { cn } from \"@/lib/utils\"\nimport { Loader2Icon } from \"lucide-react\"\n\nfunction Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon\n data-slot=\"spinner\"\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\"size-4 animate-spin\", className)}\n {...props}\n />\n )\n}\n\nexport { Spinner }\n\n/**\n * WHEN TO USE\n * - Async feedback inside a button while an action is in flight (e.g. Saving, Loading) — pair with `disabled` on the button.\n * - Small inline load indicators where the surrounding layout is already stable.\n *\n * NOT WHEN\n * - Loading a whole region with a known layout — use Skeleton instead.\n * - Progress is measurable — use Progress instead.\n *\n * KEY RULES\n * - Size with utility classes (`size-3` … `size-8`); default is `size-4` if no size class is passed.\n * - Color inherits `currentColor` — it takes on the text color of its container, no separate color prop.\n * - Renders as a single `<svg>` with `role=\"status\"` and `aria-label=\"Loading\"` already applied — don't wrap it in another status/live-region element.\n *\n * USAGE\n * <Spinner />\n *\n * <div className=\"flex items-center gap-4\">\n * <Spinner className=\"size-3\" />\n * <Spinner className=\"size-6\" />\n * <Spinner className=\"size-8\" />\n * </div>\n *\n * <Button disabled>\n * <Spinner />\n * Saving\n * </Button>\n */\n"],"mappings":";;;;;;;;;;AAUA,SAAS,QAAQ,EAAE,WAAW,GAAG,SAAsC;CACrE,OACE,oBAAC,aAAD;EACE,aAAU;EACV,MAAK;EACL,cAAW;EACX,WAAW,GAAG,uBAAuB,SAAS;EAC9C,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stepper — a horizontal sequence of named steps with pending/done state.
|
|
3
|
+
*
|
|
4
|
+
* A thin composite over Tabs, not a new primitive: `StepperList`/
|
|
5
|
+
* `StepperTrigger`/`StepperContent` are Tabs' own List/Trigger/Content,
|
|
6
|
+
* restyled — the same Radix Tabs keyboard/roving-focus/panel behavior
|
|
7
|
+
* applies unchanged. `StepperTrigger` adds one thing Tabs doesn't have: a
|
|
8
|
+
* leading step-circle icon (empty for pending, checked for done), using the
|
|
9
|
+
* same `data-icon="inline-start"` slot convention as Tabs' own icon support
|
|
10
|
+
* (see Tabs' "With icons" story) — not a new icon prop shape.
|
|
11
|
+
*/
|
|
12
|
+
import * as React from "react";
|
|
13
|
+
import { Tabs, TabsList, TabsTrigger, TabsContent } from "../../components/ui/tabs";
|
|
14
|
+
declare function Stepper({ children, ...props }: React.ComponentProps<typeof Tabs>): React.JSX.Element;
|
|
15
|
+
declare function StepperList({ ...props }: React.ComponentProps<typeof TabsList>): React.JSX.Element;
|
|
16
|
+
declare function StepperTrigger({ status, className, children, ...props }: React.ComponentProps<typeof TabsTrigger> & {
|
|
17
|
+
/** "pending" (empty circle, default) | "done" (filled circle with a check) — independent of whether this step is the currently active one, which Tabs' own active styling already communicates. */
|
|
18
|
+
status?: "pending" | "done";
|
|
19
|
+
}): React.JSX.Element;
|
|
20
|
+
declare function StepperContent({ ...props }: React.ComponentProps<typeof TabsContent>): React.JSX.Element;
|
|
21
|
+
export { Stepper, StepperList, StepperTrigger, StepperContent };
|
|
22
|
+
/**
|
|
23
|
+
* WHEN TO USE
|
|
24
|
+
* - A short, ordered sequence of named steps the user moves through, where
|
|
25
|
+
* each step's completion state matters — account setup, a multi-part
|
|
26
|
+
* form's section nav, an order/shipment progress row.
|
|
27
|
+
*
|
|
28
|
+
* NOT WHEN
|
|
29
|
+
* - The steps are actually a full one-question-at-a-time form flow with its
|
|
30
|
+
* own Previous/Next/Submit navigation — use Questionnaire, which has that
|
|
31
|
+
* built in (its `QuestionnaireProgress` is a plain text label, not this).
|
|
32
|
+
* - The panels are unrelated views with no inherent order or completion
|
|
33
|
+
* state — use plain Tabs.
|
|
34
|
+
* - Showing hierarchical position, not sequence — use Breadcrumb.
|
|
35
|
+
*
|
|
36
|
+
* KEY RULES
|
|
37
|
+
* - It's Tabs underneath: same `value`/`defaultValue`/`onValueChange` on
|
|
38
|
+
* Stepper, same `variant`/`size` on StepperList, same `disabled` per
|
|
39
|
+
* trigger, same `orientation="vertical"` for a side-by-side layout.
|
|
40
|
+
* - `status` on StepperTrigger ("pending" default | "done") is independent
|
|
41
|
+
* of which step is currently active: a step can be active-and-pending
|
|
42
|
+
* (viewing unfinished work) or inactive-and-done (already completed, user
|
|
43
|
+
* has since moved on). A pending circle's outline is `border-current`, so
|
|
44
|
+
* it automatically tracks whatever color TabsTrigger's own hover/active
|
|
45
|
+
* rules put on the trigger's text — muted normally, primary when it's the
|
|
46
|
+
* active step, primary-hover on hover — the same currentColor mechanism a
|
|
47
|
+
* plain lucide icon in Tabs already gets for free, not extra state here.
|
|
48
|
+
* A "done" circle stays a fixed filled primary regardless of hover/active,
|
|
49
|
+
* since completion should read as stable, not reactive to the pointer.
|
|
50
|
+
* - Tracking which steps are "done" is the consumer's own state — Stepper
|
|
51
|
+
* doesn't infer completion from navigation; nothing marks a step done
|
|
52
|
+
* just because the user moved past it.
|
|
53
|
+
* - A step transitioning to `status="done"` is announced via a shared sr-only live region on
|
|
54
|
+
* Stepper itself (not just the trigger's own `, done` text) — the common "finish step N, focus
|
|
55
|
+
* moves to N+1, step N flips to done behind you" flow still reaches screen-reader users.
|
|
56
|
+
* - No connector line between circles — this is triggers-in-a-row, same
|
|
57
|
+
* visual weight as Tabs. Compose one in yourself (an absolutely
|
|
58
|
+
* positioned `border-t` between items) if a specific design calls for it.
|
|
59
|
+
*
|
|
60
|
+
* USAGE
|
|
61
|
+
* <Stepper defaultValue="account">
|
|
62
|
+
* <StepperList>
|
|
63
|
+
* <StepperTrigger value="account" status="done">Account</StepperTrigger>
|
|
64
|
+
* <StepperTrigger value="profile" status="pending">Profile</StepperTrigger>
|
|
65
|
+
* <StepperTrigger value="review" status="pending">Review</StepperTrigger>
|
|
66
|
+
* </StepperList>
|
|
67
|
+
* <StepperContent value="account">...</StepperContent>
|
|
68
|
+
* <StepperContent value="profile">...</StepperContent>
|
|
69
|
+
* <StepperContent value="review">...</StepperContent>
|
|
70
|
+
* </Stepper>
|
|
71
|
+
*
|
|
72
|
+
* // Vertical — StepperList stacks in a column, StepperContent sits beside
|
|
73
|
+
* // it, exactly like Tabs' own orientation="vertical" (no Stepper-specific
|
|
74
|
+
* // layout code involved).
|
|
75
|
+
* <Stepper defaultValue="account" orientation="vertical" className="flex-row gap-6">
|
|
76
|
+
* <StepperList className="flex-col">
|
|
77
|
+
* <StepperTrigger value="account" status="done">Account</StepperTrigger>
|
|
78
|
+
* <StepperTrigger value="profile" status="pending">Profile</StepperTrigger>
|
|
79
|
+
* </StepperList>
|
|
80
|
+
* <StepperContent value="account">...</StepperContent>
|
|
81
|
+
* <StepperContent value="profile">...</StepperContent>
|
|
82
|
+
* </Stepper>
|
|
83
|
+
*/
|
|
84
|
+
//# sourceMappingURL=stepper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepper.d.ts","sourceRoot":"","sources":["../../../src/components/ui/stepper.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAW/E,iBAAS,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,qBAYzE;AAED,iBAAS,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAEvE;AAED,iBAAS,cAAc,CAAC,EACtB,MAAkB,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,GAAG;IAC5C,mMAAmM;IACnM,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CAC5B,qBAuCA;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,qBAE7E;AAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,CAAA;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG"}
|