@nous-research/ui 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/hooks/use-below-breakpoint.d.ts +2 -0
  3. package/dist/hooks/use-below-breakpoint.js +17 -0
  4. package/dist/hooks/use-confirm-delete.d.ts +10 -0
  5. package/dist/hooks/use-confirm-delete.js +35 -0
  6. package/dist/hooks/use-toast.d.ts +7 -0
  7. package/dist/hooks/use-toast.js +21 -0
  8. package/dist/index.d.ts +11 -1
  9. package/dist/index.js +23 -2
  10. package/dist/ui/components/bottom-sheet.d.ts +15 -0
  11. package/dist/ui/components/bottom-sheet.js +192 -0
  12. package/dist/ui/components/card.d.ts +5 -0
  13. package/dist/ui/components/card.js +74 -0
  14. package/dist/ui/components/checkbox.d.ts +1 -1
  15. package/dist/ui/components/checkbox.js +2 -2
  16. package/dist/ui/components/confirm-dialog.d.ts +13 -0
  17. package/dist/ui/components/confirm-dialog.js +113 -0
  18. package/dist/ui/components/dialog.d.ts +15 -0
  19. package/dist/ui/components/dialog.js +171 -0
  20. package/dist/ui/components/input.d.ts +1 -0
  21. package/dist/ui/components/input.js +21 -0
  22. package/dist/ui/components/label.d.ts +1 -0
  23. package/dist/ui/components/label.js +18 -0
  24. package/dist/ui/components/separator.d.ts +5 -0
  25. package/dist/ui/components/separator.js +22 -0
  26. package/dist/ui/components/toast.d.ts +8 -0
  27. package/dist/ui/components/toast.js +39 -0
  28. package/dist/ui/globals.css +14 -2
  29. package/package.json +2 -2
  30. package/src/hooks/use-below-breakpoint.ts +21 -0
  31. package/src/hooks/use-confirm-delete.ts +43 -0
  32. package/src/hooks/use-toast.ts +29 -0
  33. package/src/index.ts +22 -1
  34. package/src/ui/components/animated-count.stories.tsx +1 -1
  35. package/src/ui/components/ascii.stories.tsx +1 -1
  36. package/src/ui/components/badge.stories.tsx +1 -1
  37. package/src/ui/components/blend-mode.stories.tsx +1 -1
  38. package/src/ui/components/blink.stories.tsx +1 -1
  39. package/src/ui/components/bottom-sheet.stories.tsx +43 -0
  40. package/src/ui/components/bottom-sheet.tsx +227 -0
  41. package/src/ui/components/button.stories.tsx +1 -1
  42. package/src/ui/components/card.stories.tsx +63 -0
  43. package/src/ui/components/card.tsx +85 -0
  44. package/src/ui/components/checkbox.stories.tsx +1 -1
  45. package/src/ui/components/checkbox.tsx +1 -1
  46. package/src/ui/components/command-block.stories.tsx +1 -1
  47. package/src/ui/components/confirm-dialog.stories.tsx +91 -0
  48. package/src/ui/components/confirm-dialog.tsx +130 -0
  49. package/src/ui/components/dialog.stories.tsx +169 -0
  50. package/src/ui/components/dialog.tsx +177 -0
  51. package/src/ui/components/dropdown-menu.stories.tsx +1 -1
  52. package/src/ui/components/fit-text/index.stories.tsx +1 -1
  53. package/src/ui/components/forms.stories.tsx +173 -0
  54. package/src/ui/components/graphs/index.stories.tsx +1 -1
  55. package/src/ui/components/hover-bg.stories.tsx +1 -1
  56. package/src/ui/components/image-distortion.stories.tsx +1 -1
  57. package/src/ui/components/input.stories.tsx +39 -0
  58. package/src/ui/components/input.tsx +20 -0
  59. package/src/ui/components/label.stories.tsx +26 -0
  60. package/src/ui/components/label.tsx +16 -0
  61. package/src/ui/components/list-item.stories.tsx +1 -1
  62. package/src/ui/components/poster.stories.tsx +1 -1
  63. package/src/ui/components/progress.stories.tsx +1 -1
  64. package/src/ui/components/scramble.stories.tsx +1 -1
  65. package/src/ui/components/segmented.stories.tsx +1 -1
  66. package/src/ui/components/select.stories.tsx +1 -1
  67. package/src/ui/components/separator.stories.tsx +33 -0
  68. package/src/ui/components/separator.tsx +24 -0
  69. package/src/ui/components/spinner.stories.tsx +1 -1
  70. package/src/ui/components/stats.stories.tsx +1 -1
  71. package/src/ui/components/switch.stories.tsx +1 -1
  72. package/src/ui/components/tabs.stories.tsx +1 -1
  73. package/src/ui/components/terminal-demo.stories.tsx +1 -1
  74. package/src/ui/components/theme-toggle.stories.tsx +1 -1
  75. package/src/ui/components/tier-card.stories.tsx +1 -1
  76. package/src/ui/components/toast.stories.tsx +55 -0
  77. package/src/ui/components/toast.tsx +49 -0
  78. package/src/ui/components/tv.stories.tsx +1 -1
  79. package/src/ui/components/watchlist.stories.tsx +1 -1
  80. package/src/ui/globals.css +14 -2
  81. package/dist/ui/components/modal/index.d.ts +0 -8
  82. package/dist/ui/components/modal/index.js +0 -35
  83. package/dist/ui/components/modal/modal.css +0 -36
  84. package/src/ui/components/modal/index.stories.tsx +0 -46
  85. package/src/ui/components/modal/index.tsx +0 -48
  86. package/src/ui/components/modal/modal.css +0 -36
package/CHANGELOG.md CHANGED
@@ -2,6 +2,45 @@
2
2
 
3
3
  All notable changes to `@nous-research/ui` are documented here. Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
4
4
 
5
+ ## 0.17.0
6
+
7
+ ### Component promotion and Radix Dialog consolidation
8
+
9
+ Promotes reusable components and hooks from `hermes-agent/web` into the shared design system, and consolidates all dialog/modal implementations on Radix UI primitives.
10
+
11
+ #### Added
12
+
13
+ - **`Dialog` compound component** — general-purpose modal built on Radix Dialog primitive. Compound API: `Dialog`, `DialogTrigger`, `DialogContent`, `DialogHeader`, `DialogFooter`, `DialogTitle`, `DialogDescription`, `DialogClose`. Dismissible via backdrop click or ESC.
14
+ - **`Input`** — styled text input with focus ring, disabled state, courier font.
15
+ - **`Label`** — form label with mondwest font, uppercase tracking, peer-disabled opacity.
16
+ - **`Separator`** — horizontal/vertical divider with `role="separator"`.
17
+ - **`Card`** compound component — `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardContent` with themeable `--component-card-*` CSS custom properties.
18
+ - **`Toast`** — portal-based success/error notification with enter/exit animations.
19
+ - **`BottomSheet`** — mobile-first bottom sheet with drag-to-dismiss, backdrop, reduced-motion support.
20
+ - **`useToast`** — toast state management with auto-dismiss timer.
21
+ - **`useBelowBreakpoint`** — `matchMedia`-based responsive breakpoint query (SSR-safe).
22
+ - **`useConfirmDelete`** — generic confirm-delete flow state machine.
23
+ - **Forms overview story** — showcases all form controls in one view.
24
+ - Toast keyframes (`toast-in`, `toast-out`) in `globals.css`.
25
+
26
+ #### Changed
27
+
28
+ - **`ConfirmDialog` rebuilt on Radix AlertDialog** — same external API (`open`, `onCancel`, `onConfirm`, `title`, `description`, `destructive`, `loading`), but ESC handling, focus trapping, scroll lock, and portal rendering are now handled by Radix. Backdrop click does not dismiss (correct for destructive confirms).
29
+ - **`Checkbox` migrated to unified `radix-ui` package** — import changed from `@radix-ui/react-checkbox` to `radix-ui`.
30
+ - **Dependency:** `@radix-ui/react-checkbox` replaced with unified `radix-ui` package.
31
+ - Storybook stories organized into categories (Forms, Feedback, Overlays, Data Display, Layout, Effects).
32
+ - Kitchen-sink demo updated to use new `Dialog`.
33
+
34
+ #### Removed
35
+
36
+ - **`Modal` component** (`modal/index.tsx`, `modal.css`) — unused by any consumer app; replaced by `Dialog`.
37
+ - **`useModalBehavior` hook** — functionality now provided natively by Radix Dialog/AlertDialog primitives.
38
+ - Stale `modal.css` import from `globals.css`.
39
+
40
+ #### Fixed
41
+
42
+ - Portal text color: dialogs now use `text-foreground-base` for correct rendering outside the blend-mode stack.
43
+
5
44
  ## 0.16.0
6
45
 
7
46
  ### Usability overhaul — typography, contrast, theming
@@ -0,0 +1,2 @@
1
+ /** True when viewport width is strictly below `px`. */
2
+ export declare function useBelowBreakpoint(px: number): boolean;
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { useEffect, useState } from "react";
3
+ export function useBelowBreakpoint(px) {
4
+ const query = `(max-width: ${px - 1}px)`;
5
+ const [matches, setMatches] = useState(
6
+ () => typeof window !== "undefined" ? window.matchMedia(query).matches : false
7
+ );
8
+ useEffect(() => {
9
+ const mql = window.matchMedia(query);
10
+ const sync = () => setMatches(mql.matches);
11
+ sync();
12
+ mql.addEventListener("change", sync);
13
+ return () => mql.removeEventListener("change", sync);
14
+ }, [query]);
15
+ return matches;
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuLyoqIFRydWUgd2hlbiB2aWV3cG9ydCB3aWR0aCBpcyBzdHJpY3RseSBiZWxvdyBgcHhgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUJlbG93QnJlYWtwb2ludChweDogbnVtYmVyKSB7XG4gIGNvbnN0IHF1ZXJ5ID0gYChtYXgtd2lkdGg6ICR7cHggLSAxfXB4KWBcbiAgY29uc3QgW21hdGNoZXMsIHNldE1hdGNoZXNdID0gdXNlU3RhdGUoKCkgPT5cbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5tYXRjaE1lZGlhKHF1ZXJ5KS5tYXRjaGVzIDogZmFsc2VcbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbXFsID0gd2luZG93Lm1hdGNoTWVkaWEocXVlcnkpXG4gICAgY29uc3Qgc3luYyA9ICgpID0+IHNldE1hdGNoZXMobXFsLm1hdGNoZXMpXG4gICAgc3luYygpXG4gICAgbXFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHN5bmMpXG4gICAgcmV0dXJuICgpID0+IG1xbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBzeW5jKVxuICB9LCBbcXVlcnldKVxuXG4gIHJldHVybiBtYXRjaGVzXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBRUEsU0FBUyxXQUFXLGdCQUFnQjtBQUc3QixnQkFBUyxtQkFBbUIsSUFBWTtBQUM3QyxRQUFNLFFBQVEsZUFBZSxLQUFLLENBQUM7QUFDbkMsUUFBTSxDQUFDLFNBQVMsVUFBVSxJQUFJO0FBQUEsSUFBUyxNQUNyQyxPQUFPLFdBQVcsY0FBYyxPQUFPLFdBQVcsS0FBSyxFQUFFLFVBQVU7QUFBQSxFQUNyRTtBQUVBLFlBQVUsTUFBTTtBQUNkLFVBQU0sTUFBTSxPQUFPLFdBQVcsS0FBSztBQUNuQyxVQUFNLE9BQU8sTUFBTSxXQUFXLElBQUksT0FBTztBQUN6QyxTQUFLO0FBQ0wsUUFBSSxpQkFBaUIsVUFBVSxJQUFJO0FBQ25DLFdBQU8sTUFBTSxJQUFJLG9CQUFvQixVQUFVLElBQUk7QUFBQSxFQUNyRCxHQUFHLENBQUMsS0FBSyxDQUFDO0FBRVYsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,10 @@
1
+ export declare function useConfirmDelete<TId>({ onDelete }: {
2
+ onDelete: (id: TId) => Promise<void>;
3
+ }): {
4
+ readonly cancel: () => void;
5
+ readonly confirm: () => Promise<void>;
6
+ readonly isDeleting: boolean;
7
+ readonly isOpen: boolean;
8
+ readonly pendingId: TId | null;
9
+ readonly requestDelete: (id: TId) => void;
10
+ };
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { useCallback, useState } from "react";
3
+ export function useConfirmDelete({
4
+ onDelete
5
+ }) {
6
+ const [pendingId, setPendingId] = useState(null);
7
+ const [isDeleting, setIsDeleting] = useState(false);
8
+ const requestDelete = useCallback((id) => {
9
+ setPendingId(id);
10
+ }, []);
11
+ const cancel = useCallback(() => {
12
+ if (!isDeleting) setPendingId(null);
13
+ }, [isDeleting]);
14
+ const confirm = useCallback(async () => {
15
+ if (pendingId === null) return;
16
+ const id = pendingId;
17
+ setIsDeleting(true);
18
+ try {
19
+ await onDelete(id);
20
+ setPendingId(null);
21
+ } catch {
22
+ } finally {
23
+ setIsDeleting(false);
24
+ }
25
+ }, [pendingId, onDelete]);
26
+ return {
27
+ cancel,
28
+ confirm,
29
+ isDeleting,
30
+ isOpen: pendingId !== null,
31
+ pendingId,
32
+ requestDelete
33
+ };
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29uZmlybURlbGV0ZTxUSWQ+KHtcbiAgb25EZWxldGVcbn06IHtcbiAgb25EZWxldGU6IChpZDogVElkKSA9PiBQcm9taXNlPHZvaWQ+XG59KSB7XG4gIGNvbnN0IFtwZW5kaW5nSWQsIHNldFBlbmRpbmdJZF0gPSB1c2VTdGF0ZTxUSWQgfCBudWxsPihudWxsKVxuICBjb25zdCBbaXNEZWxldGluZywgc2V0SXNEZWxldGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCByZXF1ZXN0RGVsZXRlID0gdXNlQ2FsbGJhY2soKGlkOiBUSWQpID0+IHtcbiAgICBzZXRQZW5kaW5nSWQoaWQpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGNhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIWlzRGVsZXRpbmcpIHNldFBlbmRpbmdJZChudWxsKVxuICB9LCBbaXNEZWxldGluZ10pXG5cbiAgY29uc3QgY29uZmlybSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAocGVuZGluZ0lkID09PSBudWxsKSByZXR1cm5cbiAgICBjb25zdCBpZCA9IHBlbmRpbmdJZFxuICAgIHNldElzRGVsZXRpbmcodHJ1ZSlcbiAgICB0cnkge1xuICAgICAgYXdhaXQgb25EZWxldGUoaWQpXG4gICAgICBzZXRQZW5kaW5nSWQobnVsbClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIERpYWxvZyBzdGF5cyBvcGVuOyBjYWxsZXIgY2FuIHN1cmZhY2UgZXJyb3JzIGluIG9uRGVsZXRlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzRGVsZXRpbmcoZmFsc2UpXG4gICAgfVxuICB9LCBbcGVuZGluZ0lkLCBvbkRlbGV0ZV0pXG5cbiAgcmV0dXJuIHtcbiAgICBjYW5jZWwsXG4gICAgY29uZmlybSxcbiAgICBpc0RlbGV0aW5nLFxuICAgIGlzT3BlbjogcGVuZGluZ0lkICE9PSBudWxsLFxuICAgIHBlbmRpbmdJZCxcbiAgICByZXF1ZXN0RGVsZXRlXG4gIH0gYXMgY29uc3Rcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFQSxTQUFTLGFBQWEsZ0JBQWdCO0FBRS9CLGdCQUFTLGlCQUFzQjtBQUFBLEVBQ3BDO0FBQ0YsR0FFRztBQUNELFFBQU0sQ0FBQyxXQUFXLFlBQVksSUFBSSxTQUFxQixJQUFJO0FBQzNELFFBQU0sQ0FBQyxZQUFZLGFBQWEsSUFBSSxTQUFTLEtBQUs7QUFFbEQsUUFBTSxnQkFBZ0IsWUFBWSxDQUFDLE9BQVk7QUFDN0MsaUJBQWEsRUFBRTtBQUFBLEVBQ2pCLEdBQUcsQ0FBQyxDQUFDO0FBRUwsUUFBTSxTQUFTLFlBQVksTUFBTTtBQUMvQixRQUFJLENBQUMsV0FBWSxjQUFhLElBQUk7QUFBQSxFQUNwQyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBRWYsUUFBTSxVQUFVLFlBQVksWUFBWTtBQUN0QyxRQUFJLGNBQWMsS0FBTTtBQUN4QixVQUFNLEtBQUs7QUFDWCxrQkFBYyxJQUFJO0FBQ2xCLFFBQUk7QUFDRixZQUFNLFNBQVMsRUFBRTtBQUNqQixtQkFBYSxJQUFJO0FBQUEsSUFDbkIsUUFBUTtBQUFBLElBRVIsVUFBRTtBQUNBLG9CQUFjLEtBQUs7QUFBQSxJQUNyQjtBQUFBLEVBQ0YsR0FBRyxDQUFDLFdBQVcsUUFBUSxDQUFDO0FBRXhCLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLFFBQVEsY0FBYztBQUFBLElBQ3RCO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,7 @@
1
+ export declare function useToast(duration?: number): {
2
+ showToast: (message: string, type: "error" | "success") => void;
3
+ toast: {
4
+ message: string;
5
+ type: "error" | "success";
6
+ } | null;
7
+ };
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ export function useToast(duration = 3e3) {
4
+ const [toast, setToast] = useState(null);
5
+ const timerRef = useRef(null);
6
+ useEffect(() => {
7
+ return () => {
8
+ if (timerRef.current) clearTimeout(timerRef.current);
9
+ };
10
+ }, []);
11
+ const showToast = useCallback(
12
+ (message, type) => {
13
+ if (timerRef.current) clearTimeout(timerRef.current);
14
+ setToast({ message, type });
15
+ timerRef.current = setTimeout(() => setToast(null), duration);
16
+ },
17
+ [duration]
18
+ );
19
+ return { showToast, toast };
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRvYXN0KGR1cmF0aW9uID0gMzAwMCkge1xuICBjb25zdCBbdG9hc3QsIHNldFRvYXN0XSA9IHVzZVN0YXRlPHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICB0eXBlOiAnZXJyb3InIHwgJ3N1Y2Nlc3MnXG4gIH0gfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IHRpbWVyUmVmID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAodGltZXJSZWYuY3VycmVudCkgY2xlYXJUaW1lb3V0KHRpbWVyUmVmLmN1cnJlbnQpXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBzaG93VG9hc3QgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZTogc3RyaW5nLCB0eXBlOiAnZXJyb3InIHwgJ3N1Y2Nlc3MnKSA9PiB7XG4gICAgICBpZiAodGltZXJSZWYuY3VycmVudCkgY2xlYXJUaW1lb3V0KHRpbWVyUmVmLmN1cnJlbnQpXG4gICAgICBzZXRUb2FzdCh7IG1lc3NhZ2UsIHR5cGUgfSlcbiAgICAgIHRpbWVyUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHNldFRvYXN0KG51bGwpLCBkdXJhdGlvbilcbiAgICB9LFxuICAgIFtkdXJhdGlvbl1cbiAgKVxuXG4gIHJldHVybiB7IHNob3dUb2FzdCwgdG9hc3QgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsYUFBYSxXQUFXLFFBQVEsZ0JBQWdCO0FBRWxELGdCQUFTLFNBQVMsV0FBVyxLQUFNO0FBQ3hDLFFBQU0sQ0FBQyxPQUFPLFFBQVEsSUFBSSxTQUdoQixJQUFJO0FBRWQsUUFBTSxXQUFXLE9BQTZDLElBQUk7QUFFbEUsWUFBVSxNQUFNO0FBQ2QsV0FBTyxNQUFNO0FBQ1gsVUFBSSxTQUFTLFFBQVMsY0FBYSxTQUFTLE9BQU87QUFBQSxJQUNyRDtBQUFBLEVBQ0YsR0FBRyxDQUFDLENBQUM7QUFFTCxRQUFNLFlBQVk7QUFBQSxJQUNoQixDQUFDLFNBQWlCLFNBQThCO0FBQzlDLFVBQUksU0FBUyxRQUFTLGNBQWEsU0FBUyxPQUFPO0FBQ25ELGVBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUMxQixlQUFTLFVBQVUsV0FBVyxNQUFNLFNBQVMsSUFBSSxHQUFHLFFBQVE7QUFBQSxJQUM5RDtBQUFBLElBQ0EsQ0FBQyxRQUFRO0FBQUEsRUFDWDtBQUVBLFNBQU8sRUFBRSxXQUFXLE1BQU07QUFDNUI7IiwKICAibmFtZXMiOiBbXQp9Cg==
package/dist/index.d.ts CHANGED
@@ -1,13 +1,16 @@
1
1
  export { AnimatedCount, useAnimatedCount } from './ui/components/animated-count';
2
2
  export { AsciiSkeleton, Scramble as AsciiScramble } from './ui/components/ascii';
3
3
  export { Badge } from './ui/components/badge';
4
+ export { BottomSheet } from './ui/components/bottom-sheet';
4
5
  export { NousGirlBadge } from './ui/components/badges/nous-girl';
5
6
  export { BlendMode, useBlendMode, withBlendMode } from './ui/components/blend-mode';
6
7
  export type { BlendModeProps } from './ui/components/blend-mode';
7
8
  export { Blink } from './ui/components/blink';
8
9
  export { Button } from './ui/components/button';
10
+ export { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/components/card';
9
11
  export { Checkbox } from './ui/components/checkbox';
10
12
  export { CommandBlock, CopyButton } from './ui/components/command-block';
13
+ export { ConfirmDialog } from './ui/components/confirm-dialog';
11
14
  export { Cursor } from './ui/components/cursor';
12
15
  export { DropdownMenu } from './ui/components/dropdown-menu';
13
16
  export { FitText } from './ui/components/fit-text';
@@ -19,9 +22,11 @@ export { DiscordIcon } from './ui/components/icons/discord';
19
22
  export { GitHubIcon } from './ui/components/icons/github';
20
23
  export { ImageDistortion } from './ui/components/image-distortion';
21
24
  export type { AutoPlayPattern } from './ui/components/image-distortion';
25
+ export { Input } from './ui/components/input';
26
+ export { Label } from './ui/components/label';
22
27
  export { LevaClient } from './ui/components/leva-client';
23
28
  export { ListItem } from './ui/components/list-item';
24
- export { Modal } from './ui/components/modal';
29
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './ui/components/dialog';
25
30
  export { FilterGroup, Segmented } from './ui/components/segmented';
26
31
  export { Switch } from './ui/components/switch';
27
32
  export { Tabs, TabsList, TabsTrigger } from './ui/components/tabs';
@@ -35,12 +40,14 @@ export { SceneCanvas } from './ui/components/scene-canvas';
35
40
  export { Scramble } from './ui/components/scramble';
36
41
  export { Select, SelectOption } from './ui/components/select';
37
42
  export { SelectionSwitcher } from './ui/components/selection-switcher';
43
+ export { Separator } from './ui/components/separator';
38
44
  export { Spinner } from './ui/components/spinner';
39
45
  export { Stats } from './ui/components/stats';
40
46
  export { TerminalDemo } from './ui/components/terminal-demo';
41
47
  export type { TerminalDemoStep } from './ui/components/terminal-demo';
42
48
  export { ThemeToggle } from './ui/components/theme-toggle';
43
49
  export { TierCard } from './ui/components/tier-card';
50
+ export { Toast } from './ui/components/toast';
44
51
  export type { TierCardPrice, TierCardProps } from './ui/components/tier-card';
45
52
  export { TV } from './ui/components/tv';
46
53
  export { Watchlist } from './ui/components/watchlist';
@@ -63,7 +70,10 @@ export { cn, clamp, smoothstep, hexToVec3, truncate, stripWpStyles } from './uti
63
70
  export { polyRef } from './utils';
64
71
  export type { PolyComponent, PolyProps, PolyRef } from './utils';
65
72
  export { hexToRgb, rgbToHex, colorDodge, colorMix } from './utils/color';
73
+ export { useBelowBreakpoint } from './hooks/use-below-breakpoint';
66
74
  export { useCappedFrame } from './hooks/use-capped-frame';
75
+ export { useConfirmDelete } from './hooks/use-confirm-delete';
67
76
  export { useCssVarDims } from './hooks/use-css-var-dims';
68
77
  export { $gpuTier, useGpuTier } from './hooks/use-gpu-tier';
69
78
  export { useSmoothControls, getControlAtom, setControlValue } from './hooks/use-smooth-controls';
79
+ export { useToast } from './hooks/use-toast';
package/dist/index.js CHANGED
@@ -1,12 +1,15 @@
1
1
  export { AnimatedCount, useAnimatedCount } from "./ui/components/animated-count.js";
2
2
  export { AsciiSkeleton, Scramble as AsciiScramble } from "./ui/components/ascii.js";
3
3
  export { Badge } from "./ui/components/badge.js";
4
+ export { BottomSheet } from "./ui/components/bottom-sheet.js";
4
5
  export { NousGirlBadge } from "./ui/components/badges/nous-girl.js";
5
6
  export { BlendMode, useBlendMode, withBlendMode } from "./ui/components/blend-mode.js";
6
7
  export { Blink } from "./ui/components/blink.js";
7
8
  export { Button } from "./ui/components/button.js";
9
+ export { Card, CardContent, CardDescription, CardHeader, CardTitle } from "./ui/components/card.js";
8
10
  export { Checkbox } from "./ui/components/checkbox.js";
9
11
  export { CommandBlock, CopyButton } from "./ui/components/command-block.js";
12
+ export { ConfirmDialog } from "./ui/components/confirm-dialog.js";
10
13
  export { Cursor } from "./ui/components/cursor.js";
11
14
  export { DropdownMenu } from "./ui/components/dropdown-menu.js";
12
15
  export { FitText } from "./ui/components/fit-text/index.js";
@@ -17,9 +20,22 @@ export * as Icons from "./ui/components/icons/index.js";
17
20
  export { DiscordIcon } from "./ui/components/icons/discord.js";
18
21
  export { GitHubIcon } from "./ui/components/icons/github.js";
19
22
  export { ImageDistortion } from "./ui/components/image-distortion.js";
23
+ export { Input } from "./ui/components/input.js";
24
+ export { Label } from "./ui/components/label.js";
20
25
  export { LevaClient } from "./ui/components/leva-client.js";
21
26
  export { ListItem } from "./ui/components/list-item.js";
22
- export { Modal } from "./ui/components/modal/index.js";
27
+ export {
28
+ Dialog,
29
+ DialogClose,
30
+ DialogContent,
31
+ DialogDescription,
32
+ DialogFooter,
33
+ DialogHeader,
34
+ DialogOverlay,
35
+ DialogPortal,
36
+ DialogTitle,
37
+ DialogTrigger
38
+ } from "./ui/components/dialog.js";
23
39
  export { FilterGroup, Segmented } from "./ui/components/segmented.js";
24
40
  export { Switch } from "./ui/components/switch.js";
25
41
  export { Tabs, TabsList, TabsTrigger } from "./ui/components/tabs.js";
@@ -48,11 +64,13 @@ export { SceneCanvas } from "./ui/components/scene-canvas.js";
48
64
  export { Scramble } from "./ui/components/scramble.js";
49
65
  export { Select, SelectOption } from "./ui/components/select.js";
50
66
  export { SelectionSwitcher } from "./ui/components/selection-switcher.js";
67
+ export { Separator } from "./ui/components/separator.js";
51
68
  export { Spinner } from "./ui/components/spinner.js";
52
69
  export { Stats } from "./ui/components/stats.js";
53
70
  export { TerminalDemo } from "./ui/components/terminal-demo.js";
54
71
  export { ThemeToggle } from "./ui/components/theme-toggle.js";
55
72
  export { TierCard } from "./ui/components/tier-card.js";
73
+ export { Toast } from "./ui/components/toast.js";
56
74
  export { TV } from "./ui/components/tv.js";
57
75
  export { Watchlist } from "./ui/components/watchlist.js";
58
76
  export { Typography } from "./ui/components/typography/index.js";
@@ -75,7 +93,9 @@ export {
75
93
  export { cn, clamp, smoothstep, hexToVec3, truncate, stripWpStyles } from "./utils/index.js";
76
94
  export { polyRef } from "./utils/index.js";
77
95
  export { hexToRgb, rgbToHex, colorDodge, colorMix } from "./utils/color.js";
96
+ export { useBelowBreakpoint } from "./hooks/use-below-breakpoint.js";
78
97
  export { useCappedFrame } from "./hooks/use-capped-frame.js";
98
+ export { useConfirmDelete } from "./hooks/use-confirm-delete.js";
79
99
  export { useCssVarDims } from "./hooks/use-css-var-dims.js";
80
100
  export { $gpuTier, useGpuTier } from "./hooks/use-gpu-tier.js";
81
101
  export {
@@ -83,4 +103,5 @@ export {
83
103
  getControlAtom,
84
104
  setControlValue
85
105
  } from "./hooks/use-smooth-controls.js";
86
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHsgQW5pbWF0ZWRDb3VudCwgdXNlQW5pbWF0ZWRDb3VudCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9hbmltYXRlZC1jb3VudCdcbmV4cG9ydCB7IEFzY2lpU2tlbGV0b24sIFNjcmFtYmxlIGFzIEFzY2lpU2NyYW1ibGUgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvYXNjaWknXG5leHBvcnQgeyBCYWRnZSB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9iYWRnZSdcbmV4cG9ydCB7IE5vdXNHaXJsQmFkZ2UgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvYmFkZ2VzL25vdXMtZ2lybCdcbmV4cG9ydCB7IEJsZW5kTW9kZSwgdXNlQmxlbmRNb2RlLCB3aXRoQmxlbmRNb2RlIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2JsZW5kLW1vZGUnXG5leHBvcnQgdHlwZSB7IEJsZW5kTW9kZVByb3BzIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2JsZW5kLW1vZGUnXG5leHBvcnQgeyBCbGluayB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9ibGluaydcbmV4cG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9idXR0b24nXG5leHBvcnQgeyBDaGVja2JveCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9jaGVja2JveCdcbmV4cG9ydCB7IENvbW1hbmRCbG9jaywgQ29weUJ1dHRvbiB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9jb21tYW5kLWJsb2NrJ1xuZXhwb3J0IHsgQ3Vyc29yIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2N1cnNvcidcbmV4cG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9kcm9wZG93bi1tZW51J1xuZXhwb3J0IHsgRml0VGV4dCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9maXQtdGV4dCdcbmV4cG9ydCB7IEJhckNoYXJ0LCBMaW5lQ2hhcnQgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvZ3JhcGhzJ1xuZXhwb3J0IHsgQ2VsbCwgR3JpZCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9ncmlkJ1xuZXhwb3J0IHsgSG92ZXJCZyB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9ob3Zlci1iZydcbmV4cG9ydCAqIGFzIEljb25zIGZyb20gJy4vdWkvY29tcG9uZW50cy9pY29ucydcbmV4cG9ydCB7IERpc2NvcmRJY29uIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2ljb25zL2Rpc2NvcmQnXG5leHBvcnQgeyBHaXRIdWJJY29uIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2ljb25zL2dpdGh1YidcbmV4cG9ydCB7IEltYWdlRGlzdG9ydGlvbiB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9pbWFnZS1kaXN0b3J0aW9uJ1xuZXhwb3J0IHR5cGUgeyBBdXRvUGxheVBhdHRlcm4gfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvaW1hZ2UtZGlzdG9ydGlvbidcbmV4cG9ydCB7IExldmFDbGllbnQgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvbGV2YS1jbGllbnQnXG5leHBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9saXN0LWl0ZW0nXG5leHBvcnQgeyBNb2RhbCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9tb2RhbCdcbmV4cG9ydCB7IEZpbHRlckdyb3VwLCBTZWdtZW50ZWQgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvc2VnbWVudGVkJ1xuZXhwb3J0IHsgU3dpdGNoIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3N3aXRjaCdcbmV4cG9ydCB7IFRhYnMsIFRhYnNMaXN0LCBUYWJzVHJpZ2dlciB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90YWJzJ1xuZXhwb3J0IHsgUG9zdGVyIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3Bvc3RlcidcbmV4cG9ydCB0eXBlIHtcbiAgUG9zdGVyQXNwZWN0LFxuICBQb3N0ZXJQcm9wcyxcbiAgUG9zdGVyVmFyaWFudFxufSBmcm9tICcuL3VpL2NvbXBvbmVudHMvcG9zdGVyJ1xuZXhwb3J0IHtcbiAgYXBwbHlMZW5zLFxuICBCTEVORF9NT0RFUyxcbiAgTEVOU0VTLFxuICBMRU5TXzAsXG4gIExFTlNfNUksXG4gIGxlbnMwLFxuICBsZW5zNWksXG4gIHRvZ2dsZUxlbnMsXG4gICRsaWdodE1vZGVcbn0gZnJvbSAnLi91aS9jb21wb25lbnRzL292ZXJsYXlzJ1xuZXhwb3J0IHtcbiAgR2xpdGNoLFxuICBHcmV5cyxcbiAgTGVucyxcbiAgTm9pc2UsXG4gIE92ZXJsYXlzLFxuICBWaWduZXR0ZVxufSBmcm9tICcuL3VpL2NvbXBvbmVudHMvb3ZlcmxheXMnXG5leHBvcnQgdHlwZSB7IExlbnNQcmVzZXQgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvb3ZlcmxheXMnXG5leHBvcnQgeyBQcm9ncmVzcyB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9wcm9ncmVzcydcbmV4cG9ydCB7IFNjZW5lQ2FudmFzIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3NjZW5lLWNhbnZhcydcbmV4cG9ydCB7IFNjcmFtYmxlIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3NjcmFtYmxlJ1xuZXhwb3J0IHsgU2VsZWN0LCBTZWxlY3RPcHRpb24gfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvc2VsZWN0J1xuZXhwb3J0IHsgU2VsZWN0aW9uU3dpdGNoZXIgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvc2VsZWN0aW9uLXN3aXRjaGVyJ1xuZXhwb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9zcGlubmVyJ1xuZXhwb3J0IHsgU3RhdHMgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvc3RhdHMnXG5leHBvcnQgeyBUZXJtaW5hbERlbW8gfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvdGVybWluYWwtZGVtbydcbmV4cG9ydCB0eXBlIHsgVGVybWluYWxEZW1vU3RlcCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90ZXJtaW5hbC1kZW1vJ1xuZXhwb3J0IHsgVGhlbWVUb2dnbGUgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvdGhlbWUtdG9nZ2xlJ1xuZXhwb3J0IHsgVGllckNhcmQgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvdGllci1jYXJkJ1xuZXhwb3J0IHR5cGUgeyBUaWVyQ2FyZFByaWNlLCBUaWVyQ2FyZFByb3BzIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3RpZXItY2FyZCdcbmV4cG9ydCB7IFRWIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3R2J1xuZXhwb3J0IHsgV2F0Y2hsaXN0IH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3dhdGNobGlzdCdcblxuZXhwb3J0IHsgVHlwb2dyYXBoeSB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90eXBvZ3JhcGh5J1xuZXhwb3J0IHR5cGUgeyBUeXBvZ3JhcGh5UHJvcHMgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvdHlwb2dyYXBoeSdcbmV4cG9ydCB7IEgxIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3R5cG9ncmFwaHkvaDEnXG5leHBvcnQgeyBIMiB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90eXBvZ3JhcGh5L2gyJ1xuZXhwb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3R5cG9ncmFwaHkvbGVnZW5kJ1xuZXhwb3J0IHsgU21hbGwgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvdHlwb2dyYXBoeS9zbWFsbCdcblxuZXhwb3J0IHsgQmFzaWNQYWdlIH0gZnJvbSAnLi91aS9iYXNpYy1wYWdlJ1xuZXhwb3J0IHsgSGVhZGVyIH0gZnJvbSAnLi91aS9oZWFkZXInXG5leHBvcnQgdHlwZSB7IEhlYWRlckxpbmssIEhlYWRlclByb3BzLCBIZWFkZXJTb2NpYWwgfSBmcm9tICcuL3VpL2hlYWRlcidcbmV4cG9ydCB7IEZvb3RlciB9IGZyb20gJy4vdWkvZm9vdGVyJ1xuZXhwb3J0IHR5cGUge1xuICBGb290ZXJHcm91cCxcbiAgRm9vdGVyTGluayxcbiAgRm9vdGVyUHJvcHNcbn0gZnJvbSAnLi91aS9mb290ZXInXG5leHBvcnQgeyBTb2NpYWxzIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3NvY2lhbHMnXG5leHBvcnQgdHlwZSB7IFNvY2lhbExpbmsgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvc29jaWFscydcbmV4cG9ydCB7IExheW91dFdyYXBwZXIgfSBmcm9tICcuL3VpL2xheW91dC13cmFwcGVyJ1xuXG5leHBvcnQge1xuICBGT05UX1NBTlMsXG4gIEZPTlRfTU9OTyxcbiAgRk9OVF9SVUxFU19DT01QUkVTU0VELFxuICBGT05UX1JVTEVTX0VYUEFOREVELFxuICBGT05UX01PTkRXRVNUXG59IGZyb20gJy4vZm9udHMnXG5cbmV4cG9ydCB7IGNuLCBjbGFtcCwgc21vb3Roc3RlcCwgaGV4VG9WZWMzLCB0cnVuY2F0ZSwgc3RyaXBXcFN0eWxlcyB9IGZyb20gJy4vdXRpbHMnXG5leHBvcnQgeyBwb2x5UmVmIH0gZnJvbSAnLi91dGlscydcbmV4cG9ydCB0eXBlIHsgUG9seUNvbXBvbmVudCwgUG9seVByb3BzLCBQb2x5UmVmIH0gZnJvbSAnLi91dGlscydcbmV4cG9ydCB7IGhleFRvUmdiLCByZ2JUb0hleCwgY29sb3JEb2RnZSwgY29sb3JNaXggfSBmcm9tICcuL3V0aWxzL2NvbG9yJ1xuXG5leHBvcnQgeyB1c2VDYXBwZWRGcmFtZSB9IGZyb20gJy4vaG9va3MvdXNlLWNhcHBlZC1mcmFtZSdcbmV4cG9ydCB7IHVzZUNzc1ZhckRpbXMgfSBmcm9tICcuL2hvb2tzL3VzZS1jc3MtdmFyLWRpbXMnXG5leHBvcnQgeyAkZ3B1VGllciwgdXNlR3B1VGllciB9IGZyb20gJy4vaG9va3MvdXNlLWdwdS10aWVyJ1xuZXhwb3J0IHtcbiAgdXNlU21vb3RoQ29udHJvbHMsXG4gIGdldENvbnRyb2xBdG9tLFxuICBzZXRDb250cm9sVmFsdWVcbn0gZnJvbSAnLi9ob29rcy91c2Utc21vb3RoLWNvbnRyb2xzJ1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxlQUFlLHdCQUF3QjtBQUNoRCxTQUFTLGVBQWUsWUFBWSxxQkFBcUI7QUFDekQsU0FBUyxhQUFhO0FBQ3RCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsV0FBVyxjQUFjLHFCQUFxQjtBQUV2RCxTQUFTLGFBQWE7QUFDdEIsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsY0FBYyxrQkFBa0I7QUFDekMsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsZUFBZTtBQUN4QixTQUFTLFVBQVUsaUJBQWlCO0FBQ3BDLFNBQVMsTUFBTSxZQUFZO0FBQzNCLFNBQVMsZUFBZTtBQUN4QixZQUFZLFdBQVc7QUFDdkIsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyx1QkFBdUI7QUFFaEMsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsYUFBYSxpQkFBaUI7QUFDdkMsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsTUFBTSxVQUFVLG1CQUFtQjtBQUM1QyxTQUFTLGNBQWM7QUFNdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxRQUFRLG9CQUFvQjtBQUNyQyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGVBQWU7QUFDeEIsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsb0JBQW9CO0FBRTdCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsZ0JBQWdCO0FBRXpCLFNBQVMsVUFBVTtBQUNuQixTQUFTLGlCQUFpQjtBQUUxQixTQUFTLGtCQUFrQjtBQUUzQixTQUFTLFVBQVU7QUFDbkIsU0FBUyxVQUFVO0FBQ25CLFNBQVMsY0FBYztBQUN2QixTQUFTLGFBQWE7QUFFdEIsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxjQUFjO0FBRXZCLFNBQVMsY0FBYztBQU12QixTQUFTLGVBQWU7QUFFeEIsU0FBUyxxQkFBcUI7QUFFOUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLElBQUksT0FBTyxZQUFZLFdBQVcsVUFBVSxxQkFBcUI7QUFDMUUsU0FBUyxlQUFlO0FBRXhCLFNBQVMsVUFBVSxVQUFVLFlBQVksZ0JBQWdCO0FBRXpELFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsVUFBVSxrQkFBa0I7QUFDckM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLOyIsCiAgIm5hbWVzIjogW10KfQo=
106
+ export { useToast } from "./hooks/use-toast.js";
107
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHsgQW5pbWF0ZWRDb3VudCwgdXNlQW5pbWF0ZWRDb3VudCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9hbmltYXRlZC1jb3VudCdcbmV4cG9ydCB7IEFzY2lpU2tlbGV0b24sIFNjcmFtYmxlIGFzIEFzY2lpU2NyYW1ibGUgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvYXNjaWknXG5leHBvcnQgeyBCYWRnZSB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9iYWRnZSdcbmV4cG9ydCB7IEJvdHRvbVNoZWV0IH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2JvdHRvbS1zaGVldCdcbmV4cG9ydCB7IE5vdXNHaXJsQmFkZ2UgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvYmFkZ2VzL25vdXMtZ2lybCdcbmV4cG9ydCB7IEJsZW5kTW9kZSwgdXNlQmxlbmRNb2RlLCB3aXRoQmxlbmRNb2RlIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2JsZW5kLW1vZGUnXG5leHBvcnQgdHlwZSB7IEJsZW5kTW9kZVByb3BzIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2JsZW5kLW1vZGUnXG5leHBvcnQgeyBCbGluayB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9ibGluaydcbmV4cG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9idXR0b24nXG5leHBvcnQgeyBDYXJkLCBDYXJkQ29udGVudCwgQ2FyZERlc2NyaXB0aW9uLCBDYXJkSGVhZGVyLCBDYXJkVGl0bGUgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvY2FyZCdcbmV4cG9ydCB7IENoZWNrYm94IH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2NoZWNrYm94J1xuZXhwb3J0IHsgQ29tbWFuZEJsb2NrLCBDb3B5QnV0dG9uIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2NvbW1hbmQtYmxvY2snXG5leHBvcnQgeyBDb25maXJtRGlhbG9nIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nJ1xuZXhwb3J0IHsgQ3Vyc29yIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2N1cnNvcidcbmV4cG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9kcm9wZG93bi1tZW51J1xuZXhwb3J0IHsgRml0VGV4dCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9maXQtdGV4dCdcbmV4cG9ydCB7IEJhckNoYXJ0LCBMaW5lQ2hhcnQgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvZ3JhcGhzJ1xuZXhwb3J0IHsgQ2VsbCwgR3JpZCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9ncmlkJ1xuZXhwb3J0IHsgSG92ZXJCZyB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9ob3Zlci1iZydcbmV4cG9ydCAqIGFzIEljb25zIGZyb20gJy4vdWkvY29tcG9uZW50cy9pY29ucydcbmV4cG9ydCB7IERpc2NvcmRJY29uIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2ljb25zL2Rpc2NvcmQnXG5leHBvcnQgeyBHaXRIdWJJY29uIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2ljb25zL2dpdGh1YidcbmV4cG9ydCB7IEltYWdlRGlzdG9ydGlvbiB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9pbWFnZS1kaXN0b3J0aW9uJ1xuZXhwb3J0IHR5cGUgeyBBdXRvUGxheVBhdHRlcm4gfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvaW1hZ2UtZGlzdG9ydGlvbidcbmV4cG9ydCB7IElucHV0IH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2lucHV0J1xuZXhwb3J0IHsgTGFiZWwgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvbGFiZWwnXG5leHBvcnQgeyBMZXZhQ2xpZW50IH0gZnJvbSAnLi91aS9jb21wb25lbnRzL2xldmEtY2xpZW50J1xuZXhwb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvbGlzdC1pdGVtJ1xuZXhwb3J0IHtcbiAgRGlhbG9nLFxuICBEaWFsb2dDbG9zZSxcbiAgRGlhbG9nQ29udGVudCxcbiAgRGlhbG9nRGVzY3JpcHRpb24sXG4gIERpYWxvZ0Zvb3RlcixcbiAgRGlhbG9nSGVhZGVyLFxuICBEaWFsb2dPdmVybGF5LFxuICBEaWFsb2dQb3J0YWwsXG4gIERpYWxvZ1RpdGxlLFxuICBEaWFsb2dUcmlnZ2VyXG59IGZyb20gJy4vdWkvY29tcG9uZW50cy9kaWFsb2cnXG5leHBvcnQgeyBGaWx0ZXJHcm91cCwgU2VnbWVudGVkIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3NlZ21lbnRlZCdcbmV4cG9ydCB7IFN3aXRjaCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9zd2l0Y2gnXG5leHBvcnQgeyBUYWJzLCBUYWJzTGlzdCwgVGFic1RyaWdnZXIgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvdGFicydcbmV4cG9ydCB7IFBvc3RlciB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9wb3N0ZXInXG5leHBvcnQgdHlwZSB7XG4gIFBvc3RlckFzcGVjdCxcbiAgUG9zdGVyUHJvcHMsXG4gIFBvc3RlclZhcmlhbnRcbn0gZnJvbSAnLi91aS9jb21wb25lbnRzL3Bvc3RlcidcbmV4cG9ydCB7XG4gIGFwcGx5TGVucyxcbiAgQkxFTkRfTU9ERVMsXG4gIExFTlNFUyxcbiAgTEVOU18wLFxuICBMRU5TXzVJLFxuICBsZW5zMCxcbiAgbGVuczVpLFxuICB0b2dnbGVMZW5zLFxuICAkbGlnaHRNb2RlXG59IGZyb20gJy4vdWkvY29tcG9uZW50cy9vdmVybGF5cydcbmV4cG9ydCB7XG4gIEdsaXRjaCxcbiAgR3JleXMsXG4gIExlbnMsXG4gIE5vaXNlLFxuICBPdmVybGF5cyxcbiAgVmlnbmV0dGVcbn0gZnJvbSAnLi91aS9jb21wb25lbnRzL292ZXJsYXlzJ1xuZXhwb3J0IHR5cGUgeyBMZW5zUHJlc2V0IH0gZnJvbSAnLi91aS9jb21wb25lbnRzL292ZXJsYXlzJ1xuZXhwb3J0IHsgUHJvZ3Jlc3MgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvcHJvZ3Jlc3MnXG5leHBvcnQgeyBTY2VuZUNhbnZhcyB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9zY2VuZS1jYW52YXMnXG5leHBvcnQgeyBTY3JhbWJsZSB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9zY3JhbWJsZSdcbmV4cG9ydCB7IFNlbGVjdCwgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3NlbGVjdCdcbmV4cG9ydCB7IFNlbGVjdGlvblN3aXRjaGVyIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3NlbGVjdGlvbi1zd2l0Y2hlcidcbmV4cG9ydCB7IFNlcGFyYXRvciB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9zZXBhcmF0b3InXG5leHBvcnQgeyBTcGlubmVyIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3NwaW5uZXInXG5leHBvcnQgeyBTdGF0cyB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9zdGF0cydcbmV4cG9ydCB7IFRlcm1pbmFsRGVtbyB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90ZXJtaW5hbC1kZW1vJ1xuZXhwb3J0IHR5cGUgeyBUZXJtaW5hbERlbW9TdGVwIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3Rlcm1pbmFsLWRlbW8nXG5leHBvcnQgeyBUaGVtZVRvZ2dsZSB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90aGVtZS10b2dnbGUnXG5leHBvcnQgeyBUaWVyQ2FyZCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90aWVyLWNhcmQnXG5leHBvcnQgeyBUb2FzdCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90b2FzdCdcbmV4cG9ydCB0eXBlIHsgVGllckNhcmRQcmljZSwgVGllckNhcmRQcm9wcyB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90aWVyLWNhcmQnXG5leHBvcnQgeyBUViB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90didcbmV4cG9ydCB7IFdhdGNobGlzdCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy93YXRjaGxpc3QnXG5cbmV4cG9ydCB7IFR5cG9ncmFwaHkgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvdHlwb2dyYXBoeSdcbmV4cG9ydCB0eXBlIHsgVHlwb2dyYXBoeVByb3BzIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3R5cG9ncmFwaHknXG5leHBvcnQgeyBIMSB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90eXBvZ3JhcGh5L2gxJ1xuZXhwb3J0IHsgSDIgfSBmcm9tICcuL3VpL2NvbXBvbmVudHMvdHlwb2dyYXBoeS9oMidcbmV4cG9ydCB7IExlZ2VuZCB9IGZyb20gJy4vdWkvY29tcG9uZW50cy90eXBvZ3JhcGh5L2xlZ2VuZCdcbmV4cG9ydCB7IFNtYWxsIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3R5cG9ncmFwaHkvc21hbGwnXG5cbmV4cG9ydCB7IEJhc2ljUGFnZSB9IGZyb20gJy4vdWkvYmFzaWMtcGFnZSdcbmV4cG9ydCB7IEhlYWRlciB9IGZyb20gJy4vdWkvaGVhZGVyJ1xuZXhwb3J0IHR5cGUgeyBIZWFkZXJMaW5rLCBIZWFkZXJQcm9wcywgSGVhZGVyU29jaWFsIH0gZnJvbSAnLi91aS9oZWFkZXInXG5leHBvcnQgeyBGb290ZXIgfSBmcm9tICcuL3VpL2Zvb3RlcidcbmV4cG9ydCB0eXBlIHtcbiAgRm9vdGVyR3JvdXAsXG4gIEZvb3RlckxpbmssXG4gIEZvb3RlclByb3BzXG59IGZyb20gJy4vdWkvZm9vdGVyJ1xuZXhwb3J0IHsgU29jaWFscyB9IGZyb20gJy4vdWkvY29tcG9uZW50cy9zb2NpYWxzJ1xuZXhwb3J0IHR5cGUgeyBTb2NpYWxMaW5rIH0gZnJvbSAnLi91aS9jb21wb25lbnRzL3NvY2lhbHMnXG5leHBvcnQgeyBMYXlvdXRXcmFwcGVyIH0gZnJvbSAnLi91aS9sYXlvdXQtd3JhcHBlcidcblxuZXhwb3J0IHtcbiAgRk9OVF9TQU5TLFxuICBGT05UX01PTk8sXG4gIEZPTlRfUlVMRVNfQ09NUFJFU1NFRCxcbiAgRk9OVF9SVUxFU19FWFBBTkRFRCxcbiAgRk9OVF9NT05EV0VTVFxufSBmcm9tICcuL2ZvbnRzJ1xuXG5leHBvcnQgeyBjbiwgY2xhbXAsIHNtb290aHN0ZXAsIGhleFRvVmVjMywgdHJ1bmNhdGUsIHN0cmlwV3BTdHlsZXMgfSBmcm9tICcuL3V0aWxzJ1xuZXhwb3J0IHsgcG9seVJlZiB9IGZyb20gJy4vdXRpbHMnXG5leHBvcnQgdHlwZSB7IFBvbHlDb21wb25lbnQsIFBvbHlQcm9wcywgUG9seVJlZiB9IGZyb20gJy4vdXRpbHMnXG5leHBvcnQgeyBoZXhUb1JnYiwgcmdiVG9IZXgsIGNvbG9yRG9kZ2UsIGNvbG9yTWl4IH0gZnJvbSAnLi91dGlscy9jb2xvcidcblxuZXhwb3J0IHsgdXNlQmVsb3dCcmVha3BvaW50IH0gZnJvbSAnLi9ob29rcy91c2UtYmVsb3ctYnJlYWtwb2ludCdcbmV4cG9ydCB7IHVzZUNhcHBlZEZyYW1lIH0gZnJvbSAnLi9ob29rcy91c2UtY2FwcGVkLWZyYW1lJ1xuZXhwb3J0IHsgdXNlQ29uZmlybURlbGV0ZSB9IGZyb20gJy4vaG9va3MvdXNlLWNvbmZpcm0tZGVsZXRlJ1xuZXhwb3J0IHsgdXNlQ3NzVmFyRGltcyB9IGZyb20gJy4vaG9va3MvdXNlLWNzcy12YXItZGltcydcbmV4cG9ydCB7ICRncHVUaWVyLCB1c2VHcHVUaWVyIH0gZnJvbSAnLi9ob29rcy91c2UtZ3B1LXRpZXInXG5leHBvcnQge1xuICB1c2VTbW9vdGhDb250cm9scyxcbiAgZ2V0Q29udHJvbEF0b20sXG4gIHNldENvbnRyb2xWYWx1ZVxufSBmcm9tICcuL2hvb2tzL3VzZS1zbW9vdGgtY29udHJvbHMnXG5leHBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJy4vaG9va3MvdXNlLXRvYXN0J1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxlQUFlLHdCQUF3QjtBQUNoRCxTQUFTLGVBQWUsWUFBWSxxQkFBcUI7QUFDekQsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsV0FBVyxjQUFjLHFCQUFxQjtBQUV2RCxTQUFTLGFBQWE7QUFDdEIsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsTUFBTSxhQUFhLGlCQUFpQixZQUFZLGlCQUFpQjtBQUMxRSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLGNBQWMsa0JBQWtCO0FBQ3pDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsY0FBYztBQUN2QixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGVBQWU7QUFDeEIsU0FBUyxVQUFVLGlCQUFpQjtBQUNwQyxTQUFTLE1BQU0sWUFBWTtBQUMzQixTQUFTLGVBQWU7QUFDeEIsWUFBWSxXQUFXO0FBQ3ZCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsdUJBQXVCO0FBRWhDLFNBQVMsYUFBYTtBQUN0QixTQUFTLGFBQWE7QUFDdEIsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsYUFBYSxpQkFBaUI7QUFDdkMsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsTUFBTSxVQUFVLG1CQUFtQjtBQUM1QyxTQUFTLGNBQWM7QUFNdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxRQUFRLG9CQUFvQjtBQUNyQyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLGVBQWU7QUFDeEIsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsb0JBQW9CO0FBRTdCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsYUFBYTtBQUV0QixTQUFTLFVBQVU7QUFDbkIsU0FBUyxpQkFBaUI7QUFFMUIsU0FBUyxrQkFBa0I7QUFFM0IsU0FBUyxVQUFVO0FBQ25CLFNBQVMsVUFBVTtBQUNuQixTQUFTLGNBQWM7QUFDdkIsU0FBUyxhQUFhO0FBRXRCLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsY0FBYztBQUV2QixTQUFTLGNBQWM7QUFNdkIsU0FBUyxlQUFlO0FBRXhCLFNBQVMscUJBQXFCO0FBRTlCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxJQUFJLE9BQU8sWUFBWSxXQUFXLFVBQVUscUJBQXFCO0FBQzFFLFNBQVMsZUFBZTtBQUV4QixTQUFTLFVBQVUsVUFBVSxZQUFZLGdCQUFnQjtBQUV6RCxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLFVBQVUsa0JBQWtCO0FBQ3JDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsZ0JBQWdCOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * Mobile-first bottom sheet with slide + fade enter/exit, drag-to-dismiss
4
+ * handle, body scroll lock, and reduced-motion support. Portaled to
5
+ * `document.body` to escape ancestor stacking contexts.
6
+ */
7
+ export declare function BottomSheet({ backdropDismissLabel, children, onClose, open, title }: BottomSheetProps): import("react").ReactPortal | null;
8
+ interface BottomSheetProps {
9
+ backdropDismissLabel?: string;
10
+ children: ReactNode;
11
+ onClose: () => void;
12
+ open: boolean;
13
+ title: string;
14
+ }
15
+ export {};
@@ -0,0 +1,192 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ useEffect,
5
+ useRef,
6
+ useState
7
+ } from "react";
8
+ import { createPortal } from "react-dom";
9
+ import { cn } from "../../utils/index.js";
10
+ import { Typography } from "./typography/index.js";
11
+ const CLOSE_DRAG_MIN_PX = 72;
12
+ const CLOSE_DRAG_RATIO = 0.18;
13
+ const SHEET_TRANSITION_MS = 280;
14
+ export function BottomSheet({
15
+ backdropDismissLabel = "Dismiss",
16
+ children,
17
+ onClose,
18
+ open,
19
+ title
20
+ }) {
21
+ const [renderPortal, setRenderPortal] = useState(open);
22
+ const [entered, setEntered] = useState(false);
23
+ const [dragOffsetPx, setDragOffsetPx] = useState(0);
24
+ const [dragActive, setDragActive] = useState(false);
25
+ const closeTimerRef = useRef(null);
26
+ const sheetRef = useRef(null);
27
+ const dragTrackingRef = useRef(false);
28
+ const dragStartYRef = useRef(0);
29
+ const dragOffsetRef = useRef(0);
30
+ const reducedMotion = typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
31
+ const syncDragPx = (next) => {
32
+ dragOffsetRef.current = next;
33
+ setDragOffsetPx(next);
34
+ };
35
+ useEffect(() => {
36
+ if (closeTimerRef.current) {
37
+ clearTimeout(closeTimerRef.current);
38
+ closeTimerRef.current = null;
39
+ }
40
+ const ms = reducedMotion ? 0 : SHEET_TRANSITION_MS;
41
+ let openRafId = 0;
42
+ let exitRafId = 0;
43
+ if (open) {
44
+ openRafId = requestAnimationFrame(() => {
45
+ dragTrackingRef.current = false;
46
+ dragOffsetRef.current = 0;
47
+ setDragActive(false);
48
+ setDragOffsetPx(0);
49
+ setRenderPortal(true);
50
+ requestAnimationFrame(() => {
51
+ requestAnimationFrame(() => setEntered(true));
52
+ });
53
+ });
54
+ } else {
55
+ exitRafId = requestAnimationFrame(() => {
56
+ dragTrackingRef.current = false;
57
+ setDragActive(false);
58
+ setEntered(false);
59
+ closeTimerRef.current = window.setTimeout(() => {
60
+ dragOffsetRef.current = 0;
61
+ setDragOffsetPx(0);
62
+ setRenderPortal(false);
63
+ closeTimerRef.current = null;
64
+ }, ms);
65
+ });
66
+ }
67
+ return () => {
68
+ cancelAnimationFrame(openRafId);
69
+ cancelAnimationFrame(exitRafId);
70
+ if (closeTimerRef.current) {
71
+ clearTimeout(closeTimerRef.current);
72
+ closeTimerRef.current = null;
73
+ }
74
+ };
75
+ }, [open, reducedMotion]);
76
+ useEffect(() => {
77
+ if (!renderPortal) return;
78
+ const prev = document.body.style.overflow;
79
+ document.body.style.overflow = "hidden";
80
+ return () => {
81
+ document.body.style.overflow = prev;
82
+ };
83
+ }, [renderPortal]);
84
+ if (!renderPortal || typeof document === "undefined") return null;
85
+ const durationClass = reducedMotion ? "duration-0" : "duration-[280ms]";
86
+ const draggingVisual = dragActive || dragOffsetPx > 0;
87
+ const onDragPointerDown = (e) => {
88
+ if (reducedMotion || !entered) return;
89
+ if (e.pointerType === "mouse" && e.button !== 0) return;
90
+ dragTrackingRef.current = true;
91
+ setDragActive(true);
92
+ dragStartYRef.current = e.clientY;
93
+ syncDragPx(0);
94
+ e.currentTarget.setPointerCapture(e.pointerId);
95
+ };
96
+ const onDragPointerMove = (e) => {
97
+ if (!dragTrackingRef.current) return;
98
+ const dy = e.clientY - dragStartYRef.current;
99
+ const next = Math.max(0, dy);
100
+ const sheetH = sheetRef.current?.offsetHeight ?? 560;
101
+ syncDragPx(Math.min(next, sheetH));
102
+ };
103
+ const endDrag = (e) => {
104
+ if (!dragTrackingRef.current) return;
105
+ dragTrackingRef.current = false;
106
+ setDragActive(false);
107
+ try {
108
+ e.currentTarget.releasePointerCapture(e.pointerId);
109
+ } catch {
110
+ }
111
+ const sheetH = sheetRef.current?.offsetHeight ?? 560;
112
+ const threshold = Math.max(CLOSE_DRAG_MIN_PX, sheetH * CLOSE_DRAG_RATIO);
113
+ const d = dragOffsetRef.current;
114
+ if (d >= threshold) {
115
+ onClose();
116
+ return;
117
+ }
118
+ syncDragPx(0);
119
+ };
120
+ return createPortal(
121
+ /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-[200] flex flex-col justify-end", children: [
122
+ /* @__PURE__ */ jsx(
123
+ "button",
124
+ {
125
+ "aria-label": backdropDismissLabel,
126
+ className: cn(
127
+ "absolute inset-0 bg-black/55 backdrop-blur-[2px]",
128
+ "transition-opacity ease-out motion-reduce:transition-none",
129
+ durationClass,
130
+ entered ? "opacity-100" : "opacity-0"
131
+ ),
132
+ onClick: onClose,
133
+ type: "button"
134
+ }
135
+ ),
136
+ /* @__PURE__ */ jsxs(
137
+ "div",
138
+ {
139
+ "aria-label": title,
140
+ "aria-modal": "true",
141
+ className: cn(
142
+ "relative flex max-h-[85dvh] min-h-0 flex-col rounded-t-xl border border-current/20",
143
+ "bg-background-base/98 pb-[max(1rem,env(safe-area-inset-bottom))]",
144
+ "shadow-[0_-12px_40px_-8px_rgba(0,0,0,0.55)] backdrop-blur-md",
145
+ "ease-out motion-reduce:transition-none transform-gpu",
146
+ draggingVisual ? "transition-none" : cn("transition-transform", durationClass),
147
+ entered ? "translate-y-0" : "translate-y-full"
148
+ ),
149
+ ref: sheetRef,
150
+ role: "dialog",
151
+ style: entered && dragOffsetPx > 0 ? { transform: `translateY(${dragOffsetPx}px)` } : void 0,
152
+ children: [
153
+ /* @__PURE__ */ jsxs(
154
+ "div",
155
+ {
156
+ className: cn(
157
+ "flex shrink-0 flex-col gap-2 border-b border-current/15 px-4 pb-3 pt-2",
158
+ "touch-none select-none",
159
+ reducedMotion ? "cursor-default" : "cursor-grab active:cursor-grabbing"
160
+ ),
161
+ onPointerCancel: endDrag,
162
+ onPointerDown: onDragPointerDown,
163
+ onPointerMove: onDragPointerMove,
164
+ onPointerUp: endDrag,
165
+ children: [
166
+ /* @__PURE__ */ jsx(
167
+ "div",
168
+ {
169
+ "aria-hidden": true,
170
+ className: "mx-auto h-1 w-10 shrink-0 rounded-full bg-current/20"
171
+ }
172
+ ),
173
+ /* @__PURE__ */ jsx(
174
+ Typography,
175
+ {
176
+ className: "text-[0.65rem] tracking-[0.15em] uppercase text-midground/70",
177
+ mondwest: true,
178
+ children: title
179
+ }
180
+ )
181
+ ]
182
+ }
183
+ ),
184
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto overscroll-contain", children })
185
+ ]
186
+ }
187
+ )
188
+ ] }),
189
+ document.body
190
+ );
191
+ }
192
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7XG4gIHR5cGUgUG9pbnRlckV2ZW50IGFzIFJlYWN0UG9pbnRlckV2ZW50LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlRWZmZWN0LFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlXG59IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgVHlwb2dyYXBoeSB9IGZyb20gJy4vdHlwb2dyYXBoeSdcblxuY29uc3QgQ0xPU0VfRFJBR19NSU5fUFggPSA3MlxuY29uc3QgQ0xPU0VfRFJBR19SQVRJTyA9IDAuMThcbmNvbnN0IFNIRUVUX1RSQU5TSVRJT05fTVMgPSAyODBcblxuLyoqXG4gKiBNb2JpbGUtZmlyc3QgYm90dG9tIHNoZWV0IHdpdGggc2xpZGUgKyBmYWRlIGVudGVyL2V4aXQsIGRyYWctdG8tZGlzbWlzc1xuICogaGFuZGxlLCBib2R5IHNjcm9sbCBsb2NrLCBhbmQgcmVkdWNlZC1tb3Rpb24gc3VwcG9ydC4gUG9ydGFsZWQgdG9cbiAqIGBkb2N1bWVudC5ib2R5YCB0byBlc2NhcGUgYW5jZXN0b3Igc3RhY2tpbmcgY29udGV4dHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCb3R0b21TaGVldCh7XG4gIGJhY2tkcm9wRGlzbWlzc0xhYmVsID0gJ0Rpc21pc3MnLFxuICBjaGlsZHJlbixcbiAgb25DbG9zZSxcbiAgb3BlbixcbiAgdGl0bGVcbn06IEJvdHRvbVNoZWV0UHJvcHMpIHtcbiAgY29uc3QgW3JlbmRlclBvcnRhbCwgc2V0UmVuZGVyUG9ydGFsXSA9IHVzZVN0YXRlKG9wZW4pXG4gIGNvbnN0IFtlbnRlcmVkLCBzZXRFbnRlcmVkXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZHJhZ09mZnNldFB4LCBzZXREcmFnT2Zmc2V0UHhdID0gdXNlU3RhdGUoMClcbiAgY29uc3QgW2RyYWdBY3RpdmUsIHNldERyYWdBY3RpdmVdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgY2xvc2VUaW1lclJlZiA9IHVzZVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHNoZWV0UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCBkcmFnVHJhY2tpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGRyYWdTdGFydFlSZWYgPSB1c2VSZWYoMClcbiAgY29uc3QgZHJhZ09mZnNldFJlZiA9IHVzZVJlZigwKVxuXG4gIGNvbnN0IHJlZHVjZWRNb3Rpb24gPVxuICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlc1xuXG4gIGNvbnN0IHN5bmNEcmFnUHggPSAobmV4dDogbnVtYmVyKSA9PiB7XG4gICAgZHJhZ09mZnNldFJlZi5jdXJyZW50ID0gbmV4dFxuICAgIHNldERyYWdPZmZzZXRQeChuZXh0KVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY2xvc2VUaW1lclJlZi5jdXJyZW50KSB7XG4gICAgICBjbGVhclRpbWVvdXQoY2xvc2VUaW1lclJlZi5jdXJyZW50KVxuICAgICAgY2xvc2VUaW1lclJlZi5jdXJyZW50ID0gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IG1zID0gcmVkdWNlZE1vdGlvbiA/IDAgOiBTSEVFVF9UUkFOU0lUSU9OX01TXG5cbiAgICBsZXQgb3BlblJhZklkID0gMFxuICAgIGxldCBleGl0UmFmSWQgPSAwXG5cbiAgICBpZiAob3Blbikge1xuICAgICAgb3BlblJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgZHJhZ1RyYWNraW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBkcmFnT2Zmc2V0UmVmLmN1cnJlbnQgPSAwXG4gICAgICAgIHNldERyYWdBY3RpdmUoZmFsc2UpXG4gICAgICAgIHNldERyYWdPZmZzZXRQeCgwKVxuICAgICAgICBzZXRSZW5kZXJQb3J0YWwodHJ1ZSlcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gc2V0RW50ZXJlZCh0cnVlKSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXRSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGRyYWdUcmFja2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgc2V0RHJhZ0FjdGl2ZShmYWxzZSlcbiAgICAgICAgc2V0RW50ZXJlZChmYWxzZSlcbiAgICAgICAgY2xvc2VUaW1lclJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGRyYWdPZmZzZXRSZWYuY3VycmVudCA9IDBcbiAgICAgICAgICBzZXREcmFnT2Zmc2V0UHgoMClcbiAgICAgICAgICBzZXRSZW5kZXJQb3J0YWwoZmFsc2UpXG4gICAgICAgICAgY2xvc2VUaW1lclJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICB9LCBtcylcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKG9wZW5SYWZJZClcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGV4aXRSYWZJZClcbiAgICAgIGlmIChjbG9zZVRpbWVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGNsb3NlVGltZXJSZWYuY3VycmVudClcbiAgICAgICAgY2xvc2VUaW1lclJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgfVxuICAgIH1cbiAgfSwgW29wZW4sIHJlZHVjZWRNb3Rpb25dKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFyZW5kZXJQb3J0YWwpIHJldHVyblxuICAgIGNvbnN0IHByZXYgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBwcmV2XG4gICAgfVxuICB9LCBbcmVuZGVyUG9ydGFsXSlcblxuICBpZiAoIXJlbmRlclBvcnRhbCB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGR1cmF0aW9uQ2xhc3MgPSByZWR1Y2VkTW90aW9uID8gJ2R1cmF0aW9uLTAnIDogJ2R1cmF0aW9uLVsyODBtc10nXG4gIGNvbnN0IGRyYWdnaW5nVmlzdWFsID0gZHJhZ0FjdGl2ZSB8fCBkcmFnT2Zmc2V0UHggPiAwXG5cbiAgY29uc3Qgb25EcmFnUG9pbnRlckRvd24gPSAoZTogUmVhY3RQb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKHJlZHVjZWRNb3Rpb24gfHwgIWVudGVyZWQpIHJldHVyblxuICAgIGlmIChlLnBvaW50ZXJUeXBlID09PSAnbW91c2UnICYmIGUuYnV0dG9uICE9PSAwKSByZXR1cm5cblxuICAgIGRyYWdUcmFja2luZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIHNldERyYWdBY3RpdmUodHJ1ZSlcbiAgICBkcmFnU3RhcnRZUmVmLmN1cnJlbnQgPSBlLmNsaWVudFlcbiAgICBzeW5jRHJhZ1B4KDApXG4gICAgZS5jdXJyZW50VGFyZ2V0LnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKVxuICB9XG5cbiAgY29uc3Qgb25EcmFnUG9pbnRlck1vdmUgPSAoZTogUmVhY3RQb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFkcmFnVHJhY2tpbmdSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgY29uc3QgZHkgPSBlLmNsaWVudFkgLSBkcmFnU3RhcnRZUmVmLmN1cnJlbnRcbiAgICBjb25zdCBuZXh0ID0gTWF0aC5tYXgoMCwgZHkpXG4gICAgY29uc3Qgc2hlZXRIID0gc2hlZXRSZWYuY3VycmVudD8ub2Zmc2V0SGVpZ2h0ID8/IDU2MFxuICAgIHN5bmNEcmFnUHgoTWF0aC5taW4obmV4dCwgc2hlZXRIKSlcbiAgfVxuXG4gIGNvbnN0IGVuZERyYWcgPSAoZTogUmVhY3RQb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFkcmFnVHJhY2tpbmdSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgZHJhZ1RyYWNraW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNldERyYWdBY3RpdmUoZmFsc2UpXG4gICAgdHJ5IHtcbiAgICAgIGUuY3VycmVudFRhcmdldC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBhbHJlYWR5IHJlbGVhc2VkICovXG4gICAgfVxuXG4gICAgY29uc3Qgc2hlZXRIID0gc2hlZXRSZWYuY3VycmVudD8ub2Zmc2V0SGVpZ2h0ID8/IDU2MFxuICAgIGNvbnN0IHRocmVzaG9sZCA9IE1hdGgubWF4KENMT1NFX0RSQUdfTUlOX1BYLCBzaGVldEggKiBDTE9TRV9EUkFHX1JBVElPKVxuICAgIGNvbnN0IGQgPSBkcmFnT2Zmc2V0UmVmLmN1cnJlbnRcblxuICAgIGlmIChkID49IHRocmVzaG9sZCkge1xuICAgICAgb25DbG9zZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc3luY0RyYWdQeCgwKVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIGluc2V0LTAgei1bMjAwXSBmbGV4IGZsZXgtY29sIGp1c3RpZnktZW5kXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGFyaWEtbGFiZWw9e2JhY2tkcm9wRGlzbWlzc0xhYmVsfVxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdhYnNvbHV0ZSBpbnNldC0wIGJnLWJsYWNrLzU1IGJhY2tkcm9wLWJsdXItWzJweF0nLFxuICAgICAgICAgICd0cmFuc2l0aW9uLW9wYWNpdHkgZWFzZS1vdXQgbW90aW9uLXJlZHVjZTp0cmFuc2l0aW9uLW5vbmUnLFxuICAgICAgICAgIGR1cmF0aW9uQ2xhc3MsXG4gICAgICAgICAgZW50ZXJlZCA/ICdvcGFjaXR5LTEwMCcgOiAnb3BhY2l0eS0wJ1xuICAgICAgICApfVxuICAgICAgICBvbkNsaWNrPXtvbkNsb3NlfVxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIC8+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgYXJpYS1sYWJlbD17dGl0bGV9XG4gICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAncmVsYXRpdmUgZmxleCBtYXgtaC1bODVkdmhdIG1pbi1oLTAgZmxleC1jb2wgcm91bmRlZC10LXhsIGJvcmRlciBib3JkZXItY3VycmVudC8yMCcsXG4gICAgICAgICAgJ2JnLWJhY2tncm91bmQtYmFzZS85OCBwYi1bbWF4KDFyZW0sZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20pKV0nLFxuICAgICAgICAgICdzaGFkb3ctWzBfLTEycHhfNDBweF8tOHB4X3JnYmEoMCwwLDAsMC41NSldIGJhY2tkcm9wLWJsdXItbWQnLFxuICAgICAgICAgICdlYXNlLW91dCBtb3Rpb24tcmVkdWNlOnRyYW5zaXRpb24tbm9uZSB0cmFuc2Zvcm0tZ3B1JyxcbiAgICAgICAgICBkcmFnZ2luZ1Zpc3VhbFxuICAgICAgICAgICAgPyAndHJhbnNpdGlvbi1ub25lJ1xuICAgICAgICAgICAgOiBjbigndHJhbnNpdGlvbi10cmFuc2Zvcm0nLCBkdXJhdGlvbkNsYXNzKSxcbiAgICAgICAgICBlbnRlcmVkID8gJ3RyYW5zbGF0ZS15LTAnIDogJ3RyYW5zbGF0ZS15LWZ1bGwnXG4gICAgICAgICl9XG4gICAgICAgIHJlZj17c2hlZXRSZWZ9XG4gICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICBzdHlsZT17XG4gICAgICAgICAgZW50ZXJlZCAmJiBkcmFnT2Zmc2V0UHggPiAwXG4gICAgICAgICAgICA/IHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgke2RyYWdPZmZzZXRQeH1weClgIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAnZmxleCBzaHJpbmstMCBmbGV4LWNvbCBnYXAtMiBib3JkZXItYiBib3JkZXItY3VycmVudC8xNSBweC00IHBiLTMgcHQtMicsXG4gICAgICAgICAgICAndG91Y2gtbm9uZSBzZWxlY3Qtbm9uZScsXG4gICAgICAgICAgICByZWR1Y2VkTW90aW9uXG4gICAgICAgICAgICAgID8gJ2N1cnNvci1kZWZhdWx0J1xuICAgICAgICAgICAgICA6ICdjdXJzb3ItZ3JhYiBhY3RpdmU6Y3Vyc29yLWdyYWJiaW5nJ1xuICAgICAgICAgICl9XG4gICAgICAgICAgb25Qb2ludGVyQ2FuY2VsPXtlbmREcmFnfVxuICAgICAgICAgIG9uUG9pbnRlckRvd249e29uRHJhZ1BvaW50ZXJEb3dufVxuICAgICAgICAgIG9uUG9pbnRlck1vdmU9e29uRHJhZ1BvaW50ZXJNb3ZlfVxuICAgICAgICAgIG9uUG9pbnRlclVwPXtlbmREcmFnfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14LWF1dG8gaC0xIHctMTAgc2hyaW5rLTAgcm91bmRlZC1mdWxsIGJnLWN1cnJlbnQvMjBcIlxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICA8VHlwb2dyYXBoeVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMC42NXJlbV0gdHJhY2tpbmctWzAuMTVlbV0gdXBwZXJjYXNlIHRleHQtbWlkZ3JvdW5kLzcwXCJcbiAgICAgICAgICAgIG1vbmR3ZXN0XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC0wIGZsZXgtMSBvdmVyZmxvdy15LWF1dG8gb3ZlcnNjcm9sbC1jb250YWluXCI+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PixcbiAgICBkb2N1bWVudC5ib2R5XG4gIClcbn1cblxuaW50ZXJmYWNlIEJvdHRvbVNoZWV0UHJvcHMge1xuICBiYWNrZHJvcERpc21pc3NMYWJlbD86IHN0cmluZ1xuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gIG9uQ2xvc2U6ICgpID0+IHZvaWRcbiAgb3BlbjogYm9vbGVhblxuICB0aXRsZTogc3RyaW5nXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBd0pNLGNBaUNFLFlBakNGO0FBdEpOO0FBQUEsRUFHRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0JBQW9CO0FBRTdCLFNBQVMsVUFBVTtBQUNuQixTQUFTLGtCQUFrQjtBQUUzQixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLG1CQUFtQjtBQUN6QixNQUFNLHNCQUFzQjtBQU9yQixnQkFBUyxZQUFZO0FBQUEsRUFDMUIsdUJBQXVCO0FBQUEsRUFDdkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQUFxQjtBQUNuQixRQUFNLENBQUMsY0FBYyxlQUFlLElBQUksU0FBUyxJQUFJO0FBQ3JELFFBQU0sQ0FBQyxTQUFTLFVBQVUsSUFBSSxTQUFTLEtBQUs7QUFDNUMsUUFBTSxDQUFDLGNBQWMsZUFBZSxJQUFJLFNBQVMsQ0FBQztB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
@@ -0,0 +1,5 @@
1
+ export declare function Card({ className, style, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
2
+ export declare function CardHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
3
+ export declare function CardTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>): import("react").JSX.Element;
4
+ export declare function CardDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): import("react").JSX.Element;
5
+ export declare function CardContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -0,0 +1,74 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../utils/index.js";
3
+ const CARD_STYLE = {
4
+ background: "var(--component-card-background)",
5
+ borderImage: "var(--component-card-border-image)",
6
+ boxShadow: "var(--component-card-box-shadow)",
7
+ clipPath: "var(--component-card-clip-path)"
8
+ };
9
+ export function Card({
10
+ className,
11
+ style,
12
+ ...props
13
+ }) {
14
+ return /* @__PURE__ */ jsx(
15
+ "div",
16
+ {
17
+ className: cn(
18
+ "border border-midground/15 bg-background-base/80 text-midground w-full",
19
+ className
20
+ ),
21
+ style: { ...CARD_STYLE, ...style },
22
+ ...props
23
+ }
24
+ );
25
+ }
26
+ export function CardHeader({
27
+ className,
28
+ ...props
29
+ }) {
30
+ return /* @__PURE__ */ jsx(
31
+ "div",
32
+ {
33
+ className: cn(
34
+ "flex flex-col gap-1.5 p-4 border-b border-midground/15",
35
+ className
36
+ ),
37
+ ...props
38
+ }
39
+ );
40
+ }
41
+ export function CardTitle({
42
+ className,
43
+ ...props
44
+ }) {
45
+ return /* @__PURE__ */ jsx(
46
+ "h3",
47
+ {
48
+ className: cn(
49
+ "font-expanded text-sm font-bold tracking-[0.08em] uppercase",
50
+ className
51
+ ),
52
+ ...props
53
+ }
54
+ );
55
+ }
56
+ export function CardDescription({
57
+ className,
58
+ ...props
59
+ }) {
60
+ return /* @__PURE__ */ jsx(
61
+ "p",
62
+ {
63
+ className: cn("font-mondwest text-xs text-midground/60", className),
64
+ ...props
65
+ }
66
+ );
67
+ }
68
+ export function CardContent({
69
+ className,
70
+ ...props
71
+ }) {
72
+ return /* @__PURE__ */ jsx("div", { className: cn("p-4", className), ...props });
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuLyoqXG4gKiBUaGVtZWFibGUgY2FyZCBwcmltaXRpdmUuIFRoZW1lcyBjYW4gcmVzdHlsZSBldmVyeSBjYXJkIGJ5IHNldHRpbmcgQ1NTXG4gKiBjdXN0b20gcHJvcGVydGllczpcbiAqXG4gKiAgIC0tY29tcG9uZW50LWNhcmQtY2xpcC1wYXRoXG4gKiAgIC0tY29tcG9uZW50LWNhcmQtYm9yZGVyLWltYWdlXG4gKiAgIC0tY29tcG9uZW50LWNhcmQtYmFja2dyb3VuZFxuICogICAtLWNvbXBvbmVudC1jYXJkLWJveC1zaGFkb3dcbiAqXG4gKiBBbGwgYXJlIG9wdGlvbmFsIFx1MjAxNCB1bnNldCB2YXJzIGNvbXB1dGUgdG8gdGhlaXIgQ1NTIGluaXRpYWwgdmFsdWUuXG4gKi9cbmNvbnN0IENBUkRfU1RZTEU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gIGJhY2tncm91bmQ6ICd2YXIoLS1jb21wb25lbnQtY2FyZC1iYWNrZ3JvdW5kKScsXG4gIGJvcmRlckltYWdlOiAndmFyKC0tY29tcG9uZW50LWNhcmQtYm9yZGVyLWltYWdlKScsXG4gIGJveFNoYWRvdzogJ3ZhcigtLWNvbXBvbmVudC1jYXJkLWJveC1zaGFkb3cpJyxcbiAgY2xpcFBhdGg6ICd2YXIoLS1jb21wb25lbnQtY2FyZC1jbGlwLXBhdGgpJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ2FyZCh7XG4gIGNsYXNzTmFtZSxcbiAgc3R5bGUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnYm9yZGVyIGJvcmRlci1taWRncm91bmQvMTUgYmctYmFja2dyb3VuZC1iYXNlLzgwIHRleHQtbWlkZ3JvdW5kIHctZnVsbCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHN0eWxlPXt7IC4uLkNBUkRfU1RZTEUsIC4uLnN0eWxlIH19XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQ2FyZEhlYWRlcih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkhUTUxBdHRyaWJ1dGVzPEhUTUxEaXZFbGVtZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmbGV4IGZsZXgtY29sIGdhcC0xLjUgcC00IGJvcmRlci1iIGJvcmRlci1taWRncm91bmQvMTUnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQ2FyZFRpdGxlKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTEhlYWRpbmdFbGVtZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxoM1xuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZvbnQtZXhwYW5kZWQgdGV4dC1zbSBmb250LWJvbGQgdHJhY2tpbmctWzAuMDhlbV0gdXBwZXJjYXNlJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENhcmREZXNjcmlwdGlvbih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkhUTUxBdHRyaWJ1dGVzPEhUTUxQYXJhZ3JhcGhFbGVtZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxwXG4gICAgICBjbGFzc05hbWU9e2NuKCdmb250LW1vbmR3ZXN0IHRleHQteHMgdGV4dC1taWRncm91bmQvNjAnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENhcmRDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+KSB7XG4gIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17Y24oJ3AtNCcsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30gLz5cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQTBCSTtBQTFCSixTQUFTLFVBQVU7QUFhbkIsTUFBTSxhQUFrQztBQUFBLEVBQ3RDLFlBQVk7QUFBQSxFQUNaLGFBQWE7QUFBQSxFQUNiLFdBQVc7QUFBQSxFQUNYLFVBQVU7QUFDWjtBQUVPLGdCQUFTLEtBQUs7QUFBQSxFQUNuQjtBQUFBLEVBQ0E7QUFBQSxFQUNBLEdBQUc7QUFDTCxHQUF5QztBQUN2QyxTQUNFO0FBQUEsSUFBQztBQUFBO0FBQUEsTUFDQyxXQUFXO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsTUFDQSxPQUFPLEVBQUUsR0FBRyxZQUFZLEdBQUcsTUFBTTtBQUFBLE1BQ2hDLEdBQUc7QUFBQTtBQUFBLEVBQ047QUFFSjtBQUVPLGdCQUFTLFdBQVc7QUFBQSxFQUN6QjtBQUFBLEVBQ0EsR0FBRztBQUNMLEdBQXlDO0FBQ3ZDLFNBQ0U7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNDLEdBQUc7QUFBQTtBQUFBLEVBQ047QUFFSjtBQUVPLGdCQUFTLFVBQVU7QUFBQSxFQUN4QjtBQUFBLEVBQ0EsR0FBRztBQUNMLEdBQTZDO0FBQzNDLFNBQ0U7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNDLEdBQUc7QUFBQTtBQUFBLEVBQ047QUFFSjtBQUVPLGdCQUFTLGdCQUFnQjtBQUFBLEVBQzlCO0FBQUEsRUFDQSxHQUFHO0FBQ0wsR0FBK0M7QUFDN0MsU0FDRTtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsV0FBVyxHQUFHLDJDQUEyQyxTQUFTO0FBQUEsTUFDakUsR0FBRztBQUFBO0FBQUEsRUFDTjtBQUVKO0FBRU8sZ0JBQVMsWUFBWTtBQUFBLEVBQzFCO0FBQUEsRUFDQSxHQUFHO0FBQ0wsR0FBeUM7QUFDdkMsU0FBTyxvQkFBQyxTQUFJLFdBQVcsR0FBRyxPQUFPLFNBQVMsR0FBSSxHQUFHLE9BQU87QUFDMUQ7IiwKICAibmFtZXMiOiBbXQp9Cg==