@dtsports/design-system 0.2.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/LICENSE +21 -0
- package/README.md +156 -0
- package/dist/components/accordion.d.ts +19 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +26 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert.d.ts +26 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/app-shell.d.ts +21 -0
- package/dist/components/app-shell.d.ts.map +1 -0
- package/dist/components/app-shell.js +25 -0
- package/dist/components/app-shell.js.map +1 -0
- package/dist/components/aspect-ratio.d.ts +16 -0
- package/dist/components/aspect-ratio.d.ts.map +1 -0
- package/dist/components/aspect-ratio.js +17 -0
- package/dist/components/aspect-ratio.js.map +1 -0
- package/dist/components/avatar-group.d.ts +31 -0
- package/dist/components/avatar-group.d.ts.map +1 -0
- package/dist/components/avatar.d.ts +15 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +20 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +27 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +51 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button.d.ts +33 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +58 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.d.ts +15 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.js +33 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/capacity-bar.d.ts +32 -0
- package/dist/components/capacity-bar.d.ts.map +1 -0
- package/dist/components/capacity-bar.js +29 -0
- package/dist/components/capacity-bar.js.map +1 -0
- package/dist/components/card.d.ts +26 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +20 -0
- package/dist/components/checkbox.d.ts +11 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +19 -0
- package/dist/components/chip.d.ts +23 -0
- package/dist/components/chip.d.ts.map +1 -0
- package/dist/components/chip.js +32 -0
- package/dist/components/chip.js.map +1 -0
- package/dist/components/collapsible.d.ts +16 -0
- package/dist/components/collapsible.js +22 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/combobox.d.ts +38 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +17 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/confirm-action.d.ts +36 -0
- package/dist/components/confirm-action.d.ts.map +1 -0
- package/dist/components/confirm-action.js +21 -0
- package/dist/components/confirm-action.js.map +1 -0
- package/dist/components/container.js.map +1 -0
- package/dist/components/date-picker.d.ts.map +1 -0
- package/dist/components/date-picker.js +22 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/dialog.d.ts +28 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/drawer.js +55 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +39 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.js +47 -0
- package/dist/components/empty-state.d.ts +15 -0
- package/dist/components/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state.js +6 -0
- package/dist/components/form-field.d.ts +32 -0
- package/dist/components/form-field.d.ts.map +1 -0
- package/dist/components/form-field.js +31 -0
- package/dist/components/form-field.js.map +1 -0
- package/dist/components/input.d.ts +10 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +6 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/label.d.ts +11 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +13 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/live-pill.d.ts +14 -0
- package/dist/components/live-pill.js +15 -0
- package/dist/components/live-pill.js.map +1 -0
- package/dist/components/metric-tile.d.ts +23 -0
- package/dist/components/metric-tile.d.ts.map +1 -0
- package/dist/components/money-breakdown.d.ts +36 -0
- package/dist/components/money-breakdown.d.ts.map +1 -0
- package/dist/components/money-breakdown.js +12 -0
- package/dist/components/money-breakdown.js.map +1 -0
- package/dist/components/number-input.d.ts +16 -0
- package/dist/components/number-input.d.ts.map +1 -0
- package/dist/components/number-input.js +30 -0
- package/dist/components/number-input.js.map +1 -0
- package/dist/components/pagination.d.ts +27 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +52 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +24 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +28 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.d.ts +13 -0
- package/dist/components/progress.d.ts.map +1 -0
- package/dist/components/progress.js +17 -0
- package/dist/components/radio-group.d.ts +10 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +17 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js +22 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +27 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +40 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +10 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +14 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sidebar.d.ts.map +1 -0
- package/dist/components/sidebar.js +48 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton.d.ts +23 -0
- package/dist/components/skeleton.js +25 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.d.ts +14 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +30 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/spec.d.ts +35 -0
- package/dist/components/spec.js +31 -0
- package/dist/components/spec.js.map +1 -0
- package/dist/components/spinner.d.ts +20 -0
- package/dist/components/spinner.d.ts.map +1 -0
- package/dist/components/spinner.js +18 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/stack.d.ts +48 -0
- package/dist/components/stack.d.ts.map +1 -0
- package/dist/components/stack.js +43 -0
- package/dist/components/stack.js.map +1 -0
- package/dist/components/status-pill.js +34 -0
- package/dist/components/status-pill.js.map +1 -0
- package/dist/components/switch.d.ts +9 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +15 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +31 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/tabs.d.ts +22 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +28 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +8 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +6 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/theme-provider.d.ts +35 -0
- package/dist/components/theme-provider.d.ts.map +1 -0
- package/dist/components/theme-provider.js.map +1 -0
- package/dist/components/theme-toggle.d.ts +10 -0
- package/dist/components/theme-toggle.d.ts.map +1 -0
- package/dist/components/theme-toggle.js.map +1 -0
- package/dist/components/three-state.d.ts +39 -0
- package/dist/components/three-state.d.ts.map +1 -0
- package/dist/components/three-state.js +24 -0
- package/dist/components/three-state.js.map +1 -0
- package/dist/components/timestamp.d.ts +24 -0
- package/dist/components/timestamp.js +64 -0
- package/dist/components/timestamp.js.map +1 -0
- package/dist/components/toaster.d.ts +27 -0
- package/dist/components/toaster.d.ts.map +1 -0
- package/dist/components/toaster.js +21 -0
- package/dist/components/toaster.js.map +1 -0
- package/dist/components/tooltip.d.ts +28 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/top-bar.d.ts +13 -0
- package/dist/components/top-bar.d.ts.map +1 -0
- package/dist/components/top-bar.js +16 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +10 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/marketing/footer.d.ts +31 -0
- package/dist/marketing/footer.d.ts.map +1 -0
- package/dist/marketing/footer.js +9 -0
- package/dist/marketing/footer.js.map +1 -0
- package/dist/marketing/hero.d.ts +29 -0
- package/dist/marketing/hero.d.ts.map +1 -0
- package/dist/marketing/hero.js +7 -0
- package/dist/marketing/hero.js.map +1 -0
- package/dist/marketing/index.d.ts +21 -0
- package/dist/marketing/index.d.ts.map +1 -0
- package/dist/marketing/index.js +21 -0
- package/dist/marketing/index.js.map +1 -0
- package/dist/marketing/logo-cloud.d.ts +15 -0
- package/dist/marketing/logo-cloud.d.ts.map +1 -0
- package/dist/marketing/logo-cloud.js +6 -0
- package/dist/marketing/logo-cloud.js.map +1 -0
- package/dist/marketing/nav.d.ts +33 -0
- package/dist/marketing/nav.d.ts.map +1 -0
- package/dist/marketing/nav.js +14 -0
- package/dist/marketing/nav.js.map +1 -0
- package/dist/marketing/prose.d.ts +12 -0
- package/dist/marketing/prose.d.ts.map +1 -0
- package/dist/marketing/prose.js +18 -0
- package/dist/marketing/prose.js.map +1 -0
- package/dist/marketing/section.d.ts +22 -0
- package/dist/marketing/section.d.ts.map +1 -0
- package/dist/marketing/section.js +7 -0
- package/dist/marketing/section.js.map +1 -0
- package/dist/showcase/components/code-block.d.ts +11 -0
- package/dist/showcase/components/code-block.d.ts.map +1 -0
- package/dist/showcase/components/code-block.js +20 -0
- package/dist/showcase/components/code-block.js.map +1 -0
- package/dist/showcase/components/example.d.ts +16 -0
- package/dist/showcase/components/example.d.ts.map +1 -0
- package/dist/showcase/components/example.js +14 -0
- package/dist/showcase/components/example.js.map +1 -0
- package/dist/showcase/components/section.d.ts +21 -0
- package/dist/showcase/components/section.d.ts.map +1 -0
- package/dist/showcase/components/section.js +10 -0
- package/dist/showcase/components/section.js.map +1 -0
- package/dist/showcase/components/swatch.d.ts +17 -0
- package/dist/showcase/components/swatch.d.ts.map +1 -0
- package/dist/showcase/components/swatch.js +6 -0
- package/dist/showcase/components/swatch.js.map +1 -0
- package/dist/showcase/index.d.ts +17 -0
- package/dist/showcase/index.d.ts.map +1 -0
- package/dist/showcase/index.js +17 -0
- package/dist/showcase/index.js.map +1 -0
- package/dist/showcase/page.d.ts +2 -0
- package/dist/showcase/page.d.ts.map +1 -0
- package/dist/showcase/page.js +1085 -0
- package/dist/showcase/page.js.map +1 -0
- package/dist/styles/generated/tokens.d.ts +131 -0
- package/dist/styles/generated/tokens.d.ts.map +1 -0
- package/dist/styles/generated/tokens.js +107 -0
- package/dist/styles/generated/tokens.js.map +1 -0
- package/dist/styles/globals.css +131 -0
- package/dist/styles/tailwind.preset.d.ts +181 -0
- package/dist/styles/tailwind.preset.d.ts.map +1 -0
- package/dist/styles/tailwind.preset.js +114 -0
- package/dist/styles/tailwind.preset.js.map +1 -0
- package/dist/tokens/index.d.ts +176 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +139 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/tokens.json +154 -0
- package/package.json +124 -0
- package/src/components/accordion.tsx +76 -0
- package/src/components/alert.tsx +113 -0
- package/src/components/app-shell.tsx +43 -0
- package/src/components/aspect-ratio.tsx +18 -0
- package/src/components/avatar-group.tsx +73 -0
- package/src/components/avatar.tsx +81 -0
- package/src/components/badge.tsx +77 -0
- package/src/components/breadcrumb.tsx +121 -0
- package/src/components/button.tsx +83 -0
- package/src/components/calendar.tsx +85 -0
- package/src/components/capacity-bar.tsx +80 -0
- package/src/components/card.tsx +104 -0
- package/src/components/checkbox.tsx +46 -0
- package/src/components/chip.tsx +74 -0
- package/src/components/collapsible.tsx +54 -0
- package/src/components/combobox.tsx +140 -0
- package/src/components/confirm-action.tsx +111 -0
- package/src/components/container.tsx +39 -0
- package/src/components/date-picker.tsx +98 -0
- package/src/components/dialog.tsx +174 -0
- package/src/components/drawer.tsx +157 -0
- package/src/components/dropdown-menu.tsx +200 -0
- package/src/components/empty-state.tsx +46 -0
- package/src/components/form-field.tsx +118 -0
- package/src/components/input.tsx +29 -0
- package/src/components/label.tsx +35 -0
- package/src/components/live-pill.tsx +35 -0
- package/src/components/metric-tile.tsx +83 -0
- package/src/components/money-breakdown.tsx +92 -0
- package/src/components/number-input.tsx +113 -0
- package/src/components/pagination.tsx +157 -0
- package/src/components/popover.tsx +46 -0
- package/src/components/progress.tsx +34 -0
- package/src/components/radio-group.tsx +46 -0
- package/src/components/scroll-area.tsx +55 -0
- package/src/components/select.tsx +169 -0
- package/src/components/separator.tsx +34 -0
- package/src/components/sidebar.tsx +168 -0
- package/src/components/skeleton.tsx +85 -0
- package/src/components/slider.tsx +58 -0
- package/src/components/spec.tsx +59 -0
- package/src/components/spinner.tsx +36 -0
- package/src/components/stack.tsx +80 -0
- package/src/components/status-pill.tsx +100 -0
- package/src/components/switch.tsx +37 -0
- package/src/components/table.tsx +129 -0
- package/src/components/tabs.tsx +72 -0
- package/src/components/textarea.tsx +27 -0
- package/src/components/theme-provider.tsx +131 -0
- package/src/components/theme-toggle.tsx +34 -0
- package/src/components/three-state.tsx +90 -0
- package/src/components/timestamp.tsx +107 -0
- package/src/components/toaster.tsx +55 -0
- package/src/components/tooltip.tsx +49 -0
- package/src/components/top-bar.tsx +29 -0
- package/src/index.ts +221 -0
- package/src/lib/utils.ts +10 -0
- package/src/marketing/footer.tsx +93 -0
- package/src/marketing/hero.tsx +92 -0
- package/src/marketing/index.ts +24 -0
- package/src/marketing/logo-cloud.tsx +35 -0
- package/src/marketing/nav.tsx +122 -0
- package/src/marketing/prose.tsx +45 -0
- package/src/marketing/section.tsx +77 -0
- package/src/showcase/components/code-block.tsx +66 -0
- package/src/showcase/components/example.tsx +47 -0
- package/src/showcase/components/section.tsx +70 -0
- package/src/showcase/components/swatch.tsx +52 -0
- package/src/showcase/index.tsx +16 -0
- package/src/showcase/page.tsx +4216 -0
- package/src/styles/generated/tokens.ts +119 -0
- package/src/styles/globals.css +131 -0
- package/src/styles/tailwind.preset.ts +134 -0
- package/src/test/a11y.test.tsx +638 -0
- package/src/test/marketing-a11y.test.tsx +138 -0
- package/src/test/setup.ts +47 -0
- package/src/tokens/index.ts +154 -0
- package/src/tokens/tokens.json +154 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/components/spec.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC;;;;;;;;;;GAUG;AACH,MAAM,WAAW,GAAG;IAClB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;CACR,CAAC;AAEX,MAAM,OAAO,GAAG;IACd,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,OAAO;CACF,CAAC;AAOX,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CACtC,CAAC,EAAE,SAAS,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CACtD,aACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,KAChE,KAAK,GACT,CACH,CACF,CAAC;AACF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC;AAMlC,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAClC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CACjD,eAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,KAAM,KAAK,aACpD,aAAI,SAAS,EAAC,qEAAqE,YAChF,KAAK,GACH,EACL,aAAI,SAAS,EAAC,gCAAgC,YAAE,QAAQ,GAAM,IAC1D,CACP,CACF,CAAC;AACF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spinner — tiny inline loader for buttons + per-row "working" state.
|
|
3
|
+
* Prefer Skeleton for full-region loading (per design.md §3.14).
|
|
4
|
+
*
|
|
5
|
+
* Honors prefers-reduced-motion via globals.css.
|
|
6
|
+
*/
|
|
7
|
+
declare const SIZE_MAP: {
|
|
8
|
+
readonly sm: "h-3 w-3";
|
|
9
|
+
readonly default: "h-4 w-4";
|
|
10
|
+
readonly lg: "h-5 w-5";
|
|
11
|
+
};
|
|
12
|
+
export interface SpinnerProps {
|
|
13
|
+
size?: keyof typeof SIZE_MAP;
|
|
14
|
+
className?: string;
|
|
15
|
+
/** Accessible label (default "Loading") */
|
|
16
|
+
label?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function Spinner({ size, className, label, }: SpinnerProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/components/spinner.tsx"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,QAAA,MAAM,QAAQ;;;;CAIJ,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,OAAO,QAAQ,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,EACtB,IAAgB,EAChB,SAAS,EACT,KAAiB,GAClB,EAAE,YAAY,2CASd"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Loader2 } from "lucide-react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
/**
|
|
5
|
+
* Spinner — tiny inline loader for buttons + per-row "working" state.
|
|
6
|
+
* Prefer Skeleton for full-region loading (per design.md §3.14).
|
|
7
|
+
*
|
|
8
|
+
* Honors prefers-reduced-motion via globals.css.
|
|
9
|
+
*/
|
|
10
|
+
const SIZE_MAP = {
|
|
11
|
+
sm: "h-3 w-3",
|
|
12
|
+
default: "h-4 w-4",
|
|
13
|
+
lg: "h-5 w-5",
|
|
14
|
+
};
|
|
15
|
+
export function Spinner({ size = "default", className, label = "Loading", }) {
|
|
16
|
+
return (_jsx(Loader2, { role: "status", "aria-label": label, className: cn("animate-spin", SIZE_MAP[size], className), strokeWidth: 2 }));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/components/spinner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC;;;;;GAKG;AACH,MAAM,QAAQ,GAAG;IACf,EAAE,EAAE,SAAS;IACb,OAAO,EAAE,SAAS;IAClB,EAAE,EAAE,SAAS;CACL,CAAC;AASX,MAAM,UAAU,OAAO,CAAC,EACtB,IAAI,GAAG,SAAS,EAChB,SAAS,EACT,KAAK,GAAG,SAAS,GACJ;IACb,OAAO,CACL,KAAC,OAAO,IACN,IAAI,EAAC,QAAQ,gBACD,KAAK,EACjB,SAAS,EAAE,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,EACxD,WAAW,EAAE,CAAC,GACd,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Stack — flexbox with consistent gap. Use Stack when you'd otherwise
|
|
4
|
+
* reach for `flex flex-col gap-3` (or `space-y-3`); it documents intent
|
|
5
|
+
* and keeps gap tokens consistent across the app.
|
|
6
|
+
*
|
|
7
|
+
* <Stack gap={2}> // vertical, gap-2
|
|
8
|
+
* <Stack direction="row" gap={4} align="center" justify="between">
|
|
9
|
+
*/
|
|
10
|
+
declare const GAP_MAP: {
|
|
11
|
+
readonly 0: "gap-0";
|
|
12
|
+
readonly 0.5: "gap-0.5";
|
|
13
|
+
readonly 1: "gap-1";
|
|
14
|
+
readonly 1.5: "gap-1.5";
|
|
15
|
+
readonly 2: "gap-2";
|
|
16
|
+
readonly 2.5: "gap-2.5";
|
|
17
|
+
readonly 3: "gap-3";
|
|
18
|
+
readonly 4: "gap-4";
|
|
19
|
+
readonly 5: "gap-5";
|
|
20
|
+
readonly 6: "gap-6";
|
|
21
|
+
readonly 8: "gap-8";
|
|
22
|
+
readonly 10: "gap-10";
|
|
23
|
+
};
|
|
24
|
+
declare const ALIGN_MAP: {
|
|
25
|
+
readonly start: "items-start";
|
|
26
|
+
readonly center: "items-center";
|
|
27
|
+
readonly end: "items-end";
|
|
28
|
+
readonly baseline: "items-baseline";
|
|
29
|
+
readonly stretch: "items-stretch";
|
|
30
|
+
};
|
|
31
|
+
declare const JUSTIFY_MAP: {
|
|
32
|
+
readonly start: "justify-start";
|
|
33
|
+
readonly center: "justify-center";
|
|
34
|
+
readonly end: "justify-end";
|
|
35
|
+
readonly between: "justify-between";
|
|
36
|
+
readonly around: "justify-around";
|
|
37
|
+
readonly evenly: "justify-evenly";
|
|
38
|
+
};
|
|
39
|
+
export interface StackProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
40
|
+
direction?: "column" | "row";
|
|
41
|
+
gap?: keyof typeof GAP_MAP;
|
|
42
|
+
align?: keyof typeof ALIGN_MAP;
|
|
43
|
+
justify?: keyof typeof JUSTIFY_MAP;
|
|
44
|
+
wrap?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export declare const Stack: React.ForwardRefExoticComponent<StackProps & React.RefAttributes<HTMLDivElement>>;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/components/stack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B;;;;;;;GAOG;AACH,QAAA,MAAM,OAAO;;;;;;;;;;;;;CAaH,CAAC;AAEX,QAAA,MAAM,SAAS;;;;;;CAML,CAAC;AAEX,QAAA,MAAM,WAAW;;;;;;;CAOP,CAAC;AAEX,MAAM,WAAW,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACtE,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,OAAO,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,OAAO,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,OAAO,WAAW,CAAC;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,KAAK,mFA2BjB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
/**
|
|
5
|
+
* Stack — flexbox with consistent gap. Use Stack when you'd otherwise
|
|
6
|
+
* reach for `flex flex-col gap-3` (or `space-y-3`); it documents intent
|
|
7
|
+
* and keeps gap tokens consistent across the app.
|
|
8
|
+
*
|
|
9
|
+
* <Stack gap={2}> // vertical, gap-2
|
|
10
|
+
* <Stack direction="row" gap={4} align="center" justify="between">
|
|
11
|
+
*/
|
|
12
|
+
const GAP_MAP = {
|
|
13
|
+
0: "gap-0",
|
|
14
|
+
0.5: "gap-0.5",
|
|
15
|
+
1: "gap-1",
|
|
16
|
+
1.5: "gap-1.5",
|
|
17
|
+
2: "gap-2",
|
|
18
|
+
2.5: "gap-2.5",
|
|
19
|
+
3: "gap-3",
|
|
20
|
+
4: "gap-4",
|
|
21
|
+
5: "gap-5",
|
|
22
|
+
6: "gap-6",
|
|
23
|
+
8: "gap-8",
|
|
24
|
+
10: "gap-10",
|
|
25
|
+
};
|
|
26
|
+
const ALIGN_MAP = {
|
|
27
|
+
start: "items-start",
|
|
28
|
+
center: "items-center",
|
|
29
|
+
end: "items-end",
|
|
30
|
+
baseline: "items-baseline",
|
|
31
|
+
stretch: "items-stretch",
|
|
32
|
+
};
|
|
33
|
+
const JUSTIFY_MAP = {
|
|
34
|
+
start: "justify-start",
|
|
35
|
+
center: "justify-center",
|
|
36
|
+
end: "justify-end",
|
|
37
|
+
between: "justify-between",
|
|
38
|
+
around: "justify-around",
|
|
39
|
+
evenly: "justify-evenly",
|
|
40
|
+
};
|
|
41
|
+
export const Stack = React.forwardRef(({ className, direction = "column", gap = 3, align, justify, wrap, ...props }, ref) => (_jsx("div", { ref: ref, className: cn("flex", direction === "column" ? "flex-col" : "flex-row", GAP_MAP[gap], align && ALIGN_MAP[align], justify && JUSTIFY_MAP[justify], wrap && "flex-wrap", className), ...props })));
|
|
42
|
+
Stack.displayName = "Stack";
|
|
43
|
+
//# sourceMappingURL=stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/components/stack.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG;IACd,CAAC,EAAE,OAAO;IACV,GAAG,EAAE,SAAS;IACd,CAAC,EAAE,OAAO;IACV,GAAG,EAAE,SAAS;IACd,CAAC,EAAE,OAAO;IACV,GAAG,EAAE,SAAS;IACd,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,OAAO;IACV,EAAE,EAAE,QAAQ;CACJ,CAAC;AAEX,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,cAAc;IACtB,GAAG,EAAE,WAAW;IAChB,QAAQ,EAAE,gBAAgB;IAC1B,OAAO,EAAE,eAAe;CAChB,CAAC;AAEX,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,GAAG,EAAE,aAAa;IAClB,OAAO,EAAE,iBAAiB;IAC1B,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;CAChB,CAAC;AAUX,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CACnC,CACE,EACE,SAAS,EACT,SAAS,GAAG,QAAQ,EACpB,GAAG,GAAG,CAAC,EACP,KAAK,EACL,OAAO,EACP,IAAI,EACJ,GAAG,KAAK,EACT,EACD,GAAG,EACH,EAAE,CAAC,CACH,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,MAAM,EACN,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAChD,OAAO,CAAC,GAAG,CAAC,EACZ,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,EACzB,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,EAC/B,IAAI,IAAI,WAAW,EACnB,SAAS,CACV,KACG,KAAK,GACT,CACH,CACF,CAAC;AACF,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
import { Badge } from "./badge.js";
|
|
4
|
+
import { LivePill } from "./live-pill.js";
|
|
5
|
+
const labels = {
|
|
6
|
+
draft: "Draft",
|
|
7
|
+
scheduled: "Scheduled",
|
|
8
|
+
filling: "Filling",
|
|
9
|
+
sold_out: "Sold out",
|
|
10
|
+
live: "Live",
|
|
11
|
+
completed: "Completed",
|
|
12
|
+
cancelled: "Cancelled",
|
|
13
|
+
};
|
|
14
|
+
export function StatusPill({ status, className, }) {
|
|
15
|
+
if (status === "live")
|
|
16
|
+
return _jsx(LivePill, { className: className });
|
|
17
|
+
if (status === "draft" || status === "completed") {
|
|
18
|
+
return (_jsxs(Badge, { variant: "muted-outline", shape: "pill", className: cn("gap-1.5", className), children: [_jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-text-subtle", "aria-hidden": "true" }), labels[status]] }));
|
|
19
|
+
}
|
|
20
|
+
if (status === "scheduled") {
|
|
21
|
+
return (_jsx(Badge, { variant: "forest", shape: "pill", className: className, children: labels[status] }));
|
|
22
|
+
}
|
|
23
|
+
if (status === "filling") {
|
|
24
|
+
return (_jsx(Badge, { variant: "info", shape: "pill", className: className, children: labels[status] }));
|
|
25
|
+
}
|
|
26
|
+
if (status === "sold_out") {
|
|
27
|
+
return (_jsx(Badge, { shape: "pill", className: cn("bg-foreground text-background", className), children: labels[status] }));
|
|
28
|
+
}
|
|
29
|
+
if (status === "cancelled") {
|
|
30
|
+
return (_jsx(Badge, { shape: "pill", className: cn("border border-danger bg-transparent text-danger", className), children: labels[status] }));
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=status-pill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-pill.js","sourceRoot":"","sources":["../../src/components/status-pill.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAoBvC,MAAM,MAAM,GAA+B;IACzC,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,EACzB,MAAM,EACN,SAAS,GAIV;IACC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,KAAC,QAAQ,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC;IAEjE,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QACjD,OAAO,CACL,MAAC,KAAK,IACJ,OAAO,EAAC,eAAe,EACvB,KAAK,EAAC,MAAM,EACZ,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,aAEnC,eACE,SAAS,EAAC,yCAAyC,iBACvC,MAAM,GAClB,EACD,MAAM,CAAC,MAAM,CAAC,IACT,CACT,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,CACL,KAAC,KAAK,IAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,SAAS,EAAE,SAAS,YACtD,MAAM,CAAC,MAAM,CAAC,GACT,CACT,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,CACL,KAAC,KAAK,IAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,SAAS,EAAE,SAAS,YACpD,MAAM,CAAC,MAAM,CAAC,GACT,CACT,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,CACL,KAAC,KAAK,IACJ,KAAK,EAAC,MAAM,EACZ,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,YAExD,MAAM,CAAC,MAAM,CAAC,GACT,CACT,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,CACL,KAAC,KAAK,IACJ,KAAK,EAAC,MAAM,EACZ,SAAS,EAAE,EAAE,CACX,iDAAiD,EACjD,SAAS,CACV,YAEA,MAAM,CAAC,MAAM,CAAC,GACT,CACT,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as SwitchPrimitive from "@radix-ui/react-switch";
|
|
3
|
+
/**
|
|
4
|
+
* Switch — for boolean settings. Use only for instantly-applied toggles
|
|
5
|
+
* (theme, notification preferences, "use credit at checkout"). Don't use
|
|
6
|
+
* Switch for form fields that need an explicit Save button — use Checkbox.
|
|
7
|
+
*/
|
|
8
|
+
export declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchPrimitive.SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
9
|
+
//# sourceMappingURL=switch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../src/components/switch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAG1D;;;;GAIG;AACH,eAAO,MAAM,MAAM,6JAwBjB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import * as SwitchPrimitive from "@radix-ui/react-switch";
|
|
5
|
+
import { cn } from "../lib/utils.js";
|
|
6
|
+
/**
|
|
7
|
+
* Switch — for boolean settings. Use only for instantly-applied toggles
|
|
8
|
+
* (theme, notification preferences, "use credit at checkout"). Don't use
|
|
9
|
+
* Switch for form fields that need an explicit Save button — use Checkbox.
|
|
10
|
+
*/
|
|
11
|
+
export const Switch = React.forwardRef(({ className, ...props }, ref) => (_jsx(SwitchPrimitive.Root, { ref: ref, className: cn("peer inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-full transition-colors",
|
|
12
|
+
// Invisible hit-area extension: 24px desktop / 44px touch.
|
|
13
|
+
"relative after:absolute after:-inset-y-1 pointer-coarse:after:-inset-y-3.5 pointer-coarse:after:-inset-x-2", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background", "disabled:cursor-not-allowed disabled:opacity-50", "data-[state=checked]:bg-brand-forest data-[state=unchecked]:bg-border-strong", className), ...props, children: _jsx(SwitchPrimitive.Thumb, { className: cn("pointer-events-none block h-3 w-3 rounded-full bg-background shadow-sm transition-transform", "data-[state=checked]:translate-x-3.5 data-[state=unchecked]:translate-x-0.5") }) })));
|
|
14
|
+
Switch.displayName = "Switch";
|
|
15
|
+
//# sourceMappingURL=switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.js","sourceRoot":"","sources":["../../src/components/switch.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAGpC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,eAAe,CAAC,IAAI,IACnB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,8FAA8F;IAC9F,2DAA2D;IAC3D,4GAA4G,EAC5G,0IAA0I,EAC1I,iDAAiD,EACjD,8EAA8E,EAC9E,SAAS,CACV,KACG,KAAK,YAET,KAAC,eAAe,CAAC,KAAK,IACpB,SAAS,EAAE,EAAE,CACX,6FAA6F,EAC7F,6EAA6E,CAC9E,GACD,GACmB,CACxB,CAAC,CAAC;AACH,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Table primitives — per design.md §10
|
|
4
|
+
*
|
|
5
|
+
* Centerpiece component for the data-heavy UI.
|
|
6
|
+
* - Row height: 36px compact (default) / 40px comfortable
|
|
7
|
+
* - Header: text-xs uppercase tracking-wide muted on bg-subtle
|
|
8
|
+
* - Cell padding: 8px / 12px
|
|
9
|
+
* - Border: 1px bottom on rows, NO vertical borders
|
|
10
|
+
* - Numeric columns: add `tabular text-right` to cells
|
|
11
|
+
* - Sticky header: wrap <Table> in a scrollable parent and set <TableHeader sticky>
|
|
12
|
+
*
|
|
13
|
+
* Accessibility:
|
|
14
|
+
* - Always provide a <caption> via <TableCaption> for screen readers (it can be visually hidden)
|
|
15
|
+
* - Use scope="col" / scope="row" on <TableHead> / row headers
|
|
16
|
+
* - For sortable columns, pass aria-sort on <TableHead>
|
|
17
|
+
*/
|
|
18
|
+
export declare const Table: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableElement> & React.RefAttributes<HTMLTableElement>>;
|
|
19
|
+
export declare const TableHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & {
|
|
20
|
+
sticky?: boolean;
|
|
21
|
+
} & React.RefAttributes<HTMLTableSectionElement>>;
|
|
22
|
+
export declare const TableBody: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
|
|
23
|
+
export declare const TableFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
|
|
24
|
+
export declare const TableRow: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableRowElement> & {
|
|
25
|
+
interactive?: boolean;
|
|
26
|
+
selected?: boolean;
|
|
27
|
+
} & React.RefAttributes<HTMLTableRowElement>>;
|
|
28
|
+
export declare const TableHead: React.ForwardRefExoticComponent<React.ThHTMLAttributes<HTMLTableCellElement> & React.RefAttributes<HTMLTableCellElement>>;
|
|
29
|
+
export declare const TableCell: React.ForwardRefExoticComponent<React.TdHTMLAttributes<HTMLTableCellElement> & React.RefAttributes<HTMLTableCellElement>>;
|
|
30
|
+
export declare const TableCaption: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableCaptionElement> & React.RefAttributes<HTMLTableCaptionElement>>;
|
|
31
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/components/table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,KAAK,iHAWhB,CAAC;AAGH,eAAO,MAAM,WAAW;aAEqC,OAAO;iDAWlE,CAAC;AAGH,eAAO,MAAM,SAAS,+HAKpB,CAAC;AAGH,eAAO,MAAM,WAAW,+HAStB,CAAC;AAGH,eAAO,MAAM,QAAQ;kBAGH,OAAO;eACV,OAAO;6CAapB,CAAC;AAGH,eAAO,MAAM,SAAS,2HAapB,CAAC;AAGH,eAAO,MAAM,SAAS,2HASpB,CAAC;AAGH,eAAO,MAAM,YAAY,+HASvB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as TabsPrimitive from "@radix-ui/react-tabs";
|
|
3
|
+
/**
|
|
4
|
+
* Tabs — underline-style horizontal tabs.
|
|
5
|
+
*
|
|
6
|
+
* <Tabs defaultValue="today">
|
|
7
|
+
* <TabsList>
|
|
8
|
+
* <TabsTrigger value="today">Today</TabsTrigger>
|
|
9
|
+
* <TabsTrigger value="week">This week</TabsTrigger>
|
|
10
|
+
* </TabsList>
|
|
11
|
+
* <TabsContent value="today">…</TabsContent>
|
|
12
|
+
* <TabsContent value="week">…</TabsContent>
|
|
13
|
+
* </Tabs>
|
|
14
|
+
*
|
|
15
|
+
* Use for: admin time-window filters, booking status filters, settings
|
|
16
|
+
* groupings. Keyboard nav (←/→/Home/End) handled by Radix.
|
|
17
|
+
*/
|
|
18
|
+
export declare const Tabs: React.ForwardRefExoticComponent<TabsPrimitive.TabsProps & React.RefAttributes<HTMLDivElement>>;
|
|
19
|
+
export declare const TabsList: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsListProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
20
|
+
export declare const TabsTrigger: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
21
|
+
export declare const TabsContent: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
22
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AAGtD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,IAAI,gGAAqB,CAAC;AAEvC,eAAO,MAAM,QAAQ,uJAYnB,CAAC;AAGH,eAAO,MAAM,WAAW,gKAiBtB,CAAC;AAGH,eAAO,MAAM,WAAW,0JAYtB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import * as TabsPrimitive from "@radix-ui/react-tabs";
|
|
5
|
+
import { cn } from "../lib/utils.js";
|
|
6
|
+
/**
|
|
7
|
+
* Tabs — underline-style horizontal tabs.
|
|
8
|
+
*
|
|
9
|
+
* <Tabs defaultValue="today">
|
|
10
|
+
* <TabsList>
|
|
11
|
+
* <TabsTrigger value="today">Today</TabsTrigger>
|
|
12
|
+
* <TabsTrigger value="week">This week</TabsTrigger>
|
|
13
|
+
* </TabsList>
|
|
14
|
+
* <TabsContent value="today">…</TabsContent>
|
|
15
|
+
* <TabsContent value="week">…</TabsContent>
|
|
16
|
+
* </Tabs>
|
|
17
|
+
*
|
|
18
|
+
* Use for: admin time-window filters, booking status filters, settings
|
|
19
|
+
* groupings. Keyboard nav (←/→/Home/End) handled by Radix.
|
|
20
|
+
*/
|
|
21
|
+
export const Tabs = TabsPrimitive.Root;
|
|
22
|
+
export const TabsList = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.List, { ref: ref, className: cn("inline-flex h-9 items-center gap-1 border-b border-border w-full", className), ...props })));
|
|
23
|
+
TabsList.displayName = "TabsList";
|
|
24
|
+
export const TabsTrigger = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.Trigger, { ref: ref, className: cn("relative inline-flex items-center justify-center gap-1.5 whitespace-nowrap px-3 py-1.5 text-sm font-medium text-text-muted transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm", "hover:text-foreground", "disabled:opacity-50 disabled:cursor-not-allowed", "data-[state=active]:text-foreground", "data-[state=active]:after:absolute data-[state=active]:after:left-0 data-[state=active]:after:right-0 data-[state=active]:after:-bottom-px data-[state=active]:after:h-0.5 data-[state=active]:after:bg-brand-forest", className), ...props })));
|
|
25
|
+
TabsTrigger.displayName = "TabsTrigger";
|
|
26
|
+
export const TabsContent = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.Content, { ref: ref, className: cn("mt-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded", className), ...props })));
|
|
27
|
+
TabsContent.displayName = "TabsContent";
|
|
28
|
+
//# sourceMappingURL=tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAGtC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,aAAa,CAAC,IAAI,IACjB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,kEAAkE,EAClE,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC;AAElC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGzC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,aAAa,CAAC,OAAO,IACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,8IAA8I,EAC9I,kGAAkG,EAClG,uBAAuB,EACvB,iDAAiD,EACjD,qCAAqC,EACrC,sNAAsN,EACtN,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGzC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,aAAa,CAAC,OAAO,IACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,oGAAoG,EACpG,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Textarea — multi-line text input. Same focus/error pattern as Input.
|
|
4
|
+
* Use for: house rules markdown, broadcast composer, policy notes.
|
|
5
|
+
*/
|
|
6
|
+
export type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>;
|
|
7
|
+
export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
|
|
8
|
+
//# sourceMappingURL=textarea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;AAE9E,eAAO,MAAM,QAAQ,2FAgBpB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
export const Textarea = React.forwardRef(({ className, ...props }, ref) => (_jsx("textarea", { ref: ref, className: cn("flex min-h-[80px] w-full rounded-sm border border-border-strong bg-background px-2.5 py-2 text-sm text-foreground transition-colors duration-150 ease-out", "placeholder:text-text-subtle", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:bg-bg-muted disabled:opacity-60", "aria-[invalid=true]:border-danger aria-[invalid=true]:focus-visible:ring-danger", "resize-y", className), ...props })));
|
|
5
|
+
Textarea.displayName = "Textarea";
|
|
6
|
+
//# sourceMappingURL=textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAQlC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CACtC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,mBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,2JAA2J,EAC3J,8BAA8B,EAC9B,yEAAyE,EACzE,sEAAsE,EACtE,iFAAiF,EACjF,UAAU,EACV,SAAS,CACV,KACG,KAAK,GACT,CACH,CACF,CAAC;AACF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Theme = the effective look the page is rendered in (one of
|
|
4
|
+
* "light" | "dark"). ThemePreference = the user's chosen mode
|
|
5
|
+
* ("light", "dark", or "system"). When preference is "system" the
|
|
6
|
+
* effective theme tracks the OS `prefers-color-scheme` media query
|
|
7
|
+
* and updates live as the user toggles their laptop's appearance.
|
|
8
|
+
*
|
|
9
|
+
* Storage:
|
|
10
|
+
* - "dt-theme" persists the user's PREFERENCE (light/dark/system).
|
|
11
|
+
* Default if unset = "system" — out-of-the-box experience matches
|
|
12
|
+
* the laptop, no flash of wrong theme on first visit.
|
|
13
|
+
*
|
|
14
|
+
* Backward compatibility:
|
|
15
|
+
* - `theme` is still the effective theme (consumers that read
|
|
16
|
+
* `useTheme().theme` keep working unchanged).
|
|
17
|
+
* - `setTheme(t)` is preserved as a shortcut for setPreference(t)
|
|
18
|
+
* where t is "light" or "dark".
|
|
19
|
+
* - `toggle()` is preserved and now cycles light → dark → system.
|
|
20
|
+
*/
|
|
21
|
+
type Theme = "light" | "dark";
|
|
22
|
+
type ThemePreference = "light" | "dark" | "system";
|
|
23
|
+
interface ThemeContextValue {
|
|
24
|
+
theme: Theme;
|
|
25
|
+
preference: ThemePreference;
|
|
26
|
+
setPreference: (p: ThemePreference) => void;
|
|
27
|
+
setTheme: (t: Theme) => void;
|
|
28
|
+
toggle: () => void;
|
|
29
|
+
}
|
|
30
|
+
export declare function ThemeProvider({ children }: {
|
|
31
|
+
children: React.ReactNode;
|
|
32
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
export declare function useTheme(): ThemeContextValue;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=theme-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-provider.d.ts","sourceRoot":"","sources":["../../src/components/theme-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B;;;;;;;;;;;;;;;;;;GAkBG;AAEH,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAC9B,KAAK,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnD,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,eAAe,CAAC;IAC5B,aAAa,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAYD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CA8ExE;AAED,wBAAgB,QAAQ,sBAIvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-provider.js","sourceRoot":"","sources":["../../src/components/theme-provider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThemeToggle — single button that cycles light → dark → system,
|
|
3
|
+
* mirroring the macOS / Windows / iOS "Appearance" model. The icon
|
|
4
|
+
* reflects the user's PREFERENCE, not the resolved theme, so
|
|
5
|
+
* "system" shows a laptop glyph even when the effective theme is
|
|
6
|
+
* dark — that's how the user sees they're not in an explicit
|
|
7
|
+
* override.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ThemeToggle(): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=theme-toggle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../src/components/theme-toggle.tsx"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,wBAAgB,WAAW,4CAmB1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-toggle.js","sourceRoot":"","sources":["../../src/components/theme-toggle.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC1C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GACzB,UAAU,KAAK,OAAO;QACpB,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE;QAC7D,CAAC,CAAC,UAAU,KAAK,MAAM;YACrB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,EAAE;YAC/D,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IACzE,OAAO,CACL,KAAC,MAAM,IACL,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,MAAM,gBACH,GAAG,KAAK,MAAM,IAAI,EAAE,EAChC,KAAK,EAAE,GAAG,KAAK,eAAe,IAAI,CAAC,WAAW,EAAE,EAAE,YAElD,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,IAAI,GAAI,GACxC,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type EmptyStateProps } from "./empty-state.js";
|
|
3
|
+
/**
|
|
4
|
+
* ThreeState — implements design.md §3.14 Empty/Loading/Full discipline.
|
|
5
|
+
*
|
|
6
|
+
* One wrapper for every list, every chart, every dashboard tile. Forces
|
|
7
|
+
* you to think about all three states (plus error) at design time.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* <ThreeState
|
|
11
|
+
* state={state}
|
|
12
|
+
* loading={<TableSkeleton rows={5} />}
|
|
13
|
+
* empty={{ title: "No games this week", description: "Host one?", action: <Button>Create</Button> }}
|
|
14
|
+
* error={(err, retry) => <ErrorView err={err} onRetry={retry} />}
|
|
15
|
+
* >
|
|
16
|
+
* <RealList items={data} />
|
|
17
|
+
* </ThreeState>
|
|
18
|
+
*/
|
|
19
|
+
export type ListState<T> = {
|
|
20
|
+
kind: "loading";
|
|
21
|
+
} | {
|
|
22
|
+
kind: "empty";
|
|
23
|
+
} | {
|
|
24
|
+
kind: "error";
|
|
25
|
+
error: Error;
|
|
26
|
+
retry?: () => void;
|
|
27
|
+
} | {
|
|
28
|
+
kind: "data";
|
|
29
|
+
data: T;
|
|
30
|
+
};
|
|
31
|
+
export interface ThreeStateProps<T> {
|
|
32
|
+
state: ListState<T>;
|
|
33
|
+
loading?: React.ReactNode;
|
|
34
|
+
empty: EmptyStateProps;
|
|
35
|
+
error?: (err: Error, retry?: () => void) => React.ReactNode;
|
|
36
|
+
children: React.ReactNode;
|
|
37
|
+
}
|
|
38
|
+
export declare function ThreeState<T>({ state, loading, empty, error, children, }: ThreeStateProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
//# sourceMappingURL=three-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-state.d.ts","sourceRoot":"","sources":["../../src/components/three-state.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAIjE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC;AAE9B,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAC5B,KAAK,EACL,OAAO,EACP,KAAK,EACL,KAAK,EACL,QAAQ,GACT,EAAE,eAAe,CAAC,CAAC,CAAC,2CAmBpB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Skeleton } from "./skeleton.js";
|
|
3
|
+
import { EmptyState } from "./empty-state.js";
|
|
4
|
+
import { Button } from "./button.js";
|
|
5
|
+
import { AlertTriangle } from "lucide-react";
|
|
6
|
+
export function ThreeState({ state, loading, empty, error, children, }) {
|
|
7
|
+
if (state.kind === "loading") {
|
|
8
|
+
return _jsx(_Fragment, { children: loading ?? _jsx(DefaultLoading, {}) });
|
|
9
|
+
}
|
|
10
|
+
if (state.kind === "empty") {
|
|
11
|
+
return _jsx(EmptyState, { ...empty });
|
|
12
|
+
}
|
|
13
|
+
if (state.kind === "error") {
|
|
14
|
+
return (_jsx(_Fragment, { children: error ? (error(state.error, state.retry)) : (_jsx(DefaultError, { err: state.error, retry: state.retry })) }));
|
|
15
|
+
}
|
|
16
|
+
return _jsx(_Fragment, { children: children });
|
|
17
|
+
}
|
|
18
|
+
function DefaultLoading() {
|
|
19
|
+
return (_jsxs("div", { className: "space-y-2 p-2", children: [_jsx(Skeleton, { className: "h-9 w-full" }), _jsx(Skeleton, { className: "h-9 w-full" }), _jsx(Skeleton, { className: "h-9 w-full" })] }));
|
|
20
|
+
}
|
|
21
|
+
function DefaultError({ err, retry }) {
|
|
22
|
+
return (_jsxs("div", { role: "alert", className: "flex flex-col items-center justify-center gap-2 px-6 py-10 text-center", children: [_jsx(AlertTriangle, { className: "h-5 w-5 text-danger", strokeWidth: 1.75 }), _jsx("div", { className: "text-sm font-medium", children: "Couldn't load this" }), _jsx("div", { className: "text-xs text-text-muted max-w-xs", children: err.message }), retry && (_jsx(Button, { variant: "secondary", size: "sm", onClick: retry, className: "mt-2", children: "Try again" }))] }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=three-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-state.js","sourceRoot":"","sources":["../../src/components/three-state.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAwB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgC7C,MAAM,UAAU,UAAU,CAAI,EAC5B,KAAK,EACL,OAAO,EACP,KAAK,EACL,KAAK,EACL,QAAQ,GACW;IACnB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,4BAAG,OAAO,IAAI,KAAC,cAAc,KAAG,GAAI,CAAC;IAC9C,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,KAAC,UAAU,OAAK,KAAK,GAAI,CAAC;IACnC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,CACL,4BACG,KAAK,CAAC,CAAC,CAAC,CACP,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAChC,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,IAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAI,CACvD,GACA,CACJ,CAAC;IACJ,CAAC;IACD,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACzB,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAC5B,KAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,GAAG,EACnC,KAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,GAAG,EACnC,KAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,GAAG,IAC/B,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,GAAG,EAAE,KAAK,EAAsC;IACtE,OAAO,CACL,eACE,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,wEAAwE,aAElF,KAAC,aAAa,IAAC,SAAS,EAAC,qBAAqB,EAAC,WAAW,EAAE,IAAI,GAAI,EACpE,cAAK,SAAS,EAAC,qBAAqB,mCAA8B,EAClE,cAAK,SAAS,EAAC,kCAAkC,YAAE,GAAG,CAAC,OAAO,GAAO,EACpE,KAAK,IAAI,CACR,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAC,MAAM,0BAE7D,CACV,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timestamp — implements design.md §3.16 Time UX.
|
|
3
|
+
*
|
|
4
|
+
* - Future events: absolute in venue local time
|
|
5
|
+
* ("Sat May 22, 6:00 pm"); tooltip reveals user-tz if different.
|
|
6
|
+
* - Past events within 7 days: relative ("3 min ago"); absolute beyond.
|
|
7
|
+
* - Within 24h of a future event with `relative` enabled: ticker
|
|
8
|
+
* ("Starts in 3h 12m").
|
|
9
|
+
*
|
|
10
|
+
* Accessibility:
|
|
11
|
+
* - Renders <time dateTime={iso}> for assistive tech.
|
|
12
|
+
* - Tooltip via native `title` attr — readable by screen readers.
|
|
13
|
+
*/
|
|
14
|
+
export interface TimestampProps {
|
|
15
|
+
/** ISO-8601 date string (UTC preferred). */
|
|
16
|
+
iso: string;
|
|
17
|
+
/** Venue timezone (IANA, e.g. "America/New_York"). Falls back to user tz. */
|
|
18
|
+
venueTz?: string;
|
|
19
|
+
/** Show relative ticker when within 24h before / 7d after. */
|
|
20
|
+
relative?: boolean;
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function Timestamp({ iso, venueTz, relative, className, }: TimestampProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=timestamp.d.ts.map
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
function formatInTz(date, tz) {
|
|
6
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
7
|
+
timeZone: tz,
|
|
8
|
+
weekday: "short",
|
|
9
|
+
month: "short",
|
|
10
|
+
day: "numeric",
|
|
11
|
+
hour: "numeric",
|
|
12
|
+
minute: "2-digit",
|
|
13
|
+
hour12: true,
|
|
14
|
+
}).format(date);
|
|
15
|
+
}
|
|
16
|
+
function diffMinutes(a, b) {
|
|
17
|
+
return Math.round((a.getTime() - b.getTime()) / 60_000);
|
|
18
|
+
}
|
|
19
|
+
function relativeLabel(target, now) {
|
|
20
|
+
const minsToTarget = diffMinutes(target, now);
|
|
21
|
+
const absMins = Math.abs(minsToTarget);
|
|
22
|
+
// Future, within 24h
|
|
23
|
+
if (minsToTarget > 0 && minsToTarget <= 24 * 60) {
|
|
24
|
+
const h = Math.floor(minsToTarget / 60);
|
|
25
|
+
const m = minsToTarget % 60;
|
|
26
|
+
return `Starts in ${h > 0 ? `${h}h ` : ""}${m}m`;
|
|
27
|
+
}
|
|
28
|
+
// Past, within 7 days
|
|
29
|
+
if (minsToTarget < 0 && absMins <= 7 * 24 * 60) {
|
|
30
|
+
if (absMins < 1)
|
|
31
|
+
return "just now";
|
|
32
|
+
if (absMins < 60)
|
|
33
|
+
return `${absMins} min ago`;
|
|
34
|
+
const h = Math.floor(absMins / 60);
|
|
35
|
+
if (h < 24)
|
|
36
|
+
return `${h}h ago`;
|
|
37
|
+
const d = Math.floor(h / 24);
|
|
38
|
+
return `${d}d ago`;
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
export function Timestamp({ iso, venueTz, relative = false, className, }) {
|
|
43
|
+
const target = React.useMemo(() => new Date(iso), [iso]);
|
|
44
|
+
// Tick once per minute so relative labels stay fresh
|
|
45
|
+
const [now, setNow] = React.useState(() => new Date());
|
|
46
|
+
React.useEffect(() => {
|
|
47
|
+
if (!relative)
|
|
48
|
+
return;
|
|
49
|
+
const id = setInterval(() => setNow(new Date()), 60_000);
|
|
50
|
+
return () => clearInterval(id);
|
|
51
|
+
}, [relative]);
|
|
52
|
+
const userTz = typeof Intl !== "undefined"
|
|
53
|
+
? Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
54
|
+
: undefined;
|
|
55
|
+
const showUserTz = !!venueTz && !!userTz && venueTz !== userTz;
|
|
56
|
+
const venueLabel = formatInTz(target, venueTz);
|
|
57
|
+
const rel = relative ? relativeLabel(target, now) : null;
|
|
58
|
+
const userLabel = showUserTz ? formatInTz(target, userTz) : null;
|
|
59
|
+
const title = userLabel
|
|
60
|
+
? `Venue: ${venueLabel}\nYour time: ${userLabel}`
|
|
61
|
+
: venueLabel;
|
|
62
|
+
return (_jsx("time", { dateTime: iso, title: title, className: cn("tabular text-sm text-foreground", className), children: rel ?? venueLabel }));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=timestamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../src/components/timestamp.tsx"],"names":[],"mappings":"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"}
|