@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.
- package/CHANGELOG.md +39 -0
- package/dist/hooks/use-below-breakpoint.d.ts +2 -0
- package/dist/hooks/use-below-breakpoint.js +17 -0
- package/dist/hooks/use-confirm-delete.d.ts +10 -0
- package/dist/hooks/use-confirm-delete.js +35 -0
- package/dist/hooks/use-toast.d.ts +7 -0
- package/dist/hooks/use-toast.js +21 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.js +23 -2
- package/dist/ui/components/bottom-sheet.d.ts +15 -0
- package/dist/ui/components/bottom-sheet.js +192 -0
- package/dist/ui/components/card.d.ts +5 -0
- package/dist/ui/components/card.js +74 -0
- package/dist/ui/components/checkbox.d.ts +1 -1
- package/dist/ui/components/checkbox.js +2 -2
- package/dist/ui/components/confirm-dialog.d.ts +13 -0
- package/dist/ui/components/confirm-dialog.js +113 -0
- package/dist/ui/components/dialog.d.ts +15 -0
- package/dist/ui/components/dialog.js +171 -0
- package/dist/ui/components/input.d.ts +1 -0
- package/dist/ui/components/input.js +21 -0
- package/dist/ui/components/label.d.ts +1 -0
- package/dist/ui/components/label.js +18 -0
- package/dist/ui/components/separator.d.ts +5 -0
- package/dist/ui/components/separator.js +22 -0
- package/dist/ui/components/toast.d.ts +8 -0
- package/dist/ui/components/toast.js +39 -0
- package/dist/ui/globals.css +14 -2
- package/package.json +2 -2
- package/src/hooks/use-below-breakpoint.ts +21 -0
- package/src/hooks/use-confirm-delete.ts +43 -0
- package/src/hooks/use-toast.ts +29 -0
- package/src/index.ts +22 -1
- package/src/ui/components/animated-count.stories.tsx +1 -1
- package/src/ui/components/ascii.stories.tsx +1 -1
- package/src/ui/components/badge.stories.tsx +1 -1
- package/src/ui/components/blend-mode.stories.tsx +1 -1
- package/src/ui/components/blink.stories.tsx +1 -1
- package/src/ui/components/bottom-sheet.stories.tsx +43 -0
- package/src/ui/components/bottom-sheet.tsx +227 -0
- package/src/ui/components/button.stories.tsx +1 -1
- package/src/ui/components/card.stories.tsx +63 -0
- package/src/ui/components/card.tsx +85 -0
- package/src/ui/components/checkbox.stories.tsx +1 -1
- package/src/ui/components/checkbox.tsx +1 -1
- package/src/ui/components/command-block.stories.tsx +1 -1
- package/src/ui/components/confirm-dialog.stories.tsx +91 -0
- package/src/ui/components/confirm-dialog.tsx +130 -0
- package/src/ui/components/dialog.stories.tsx +169 -0
- package/src/ui/components/dialog.tsx +177 -0
- package/src/ui/components/dropdown-menu.stories.tsx +1 -1
- package/src/ui/components/fit-text/index.stories.tsx +1 -1
- package/src/ui/components/forms.stories.tsx +173 -0
- package/src/ui/components/graphs/index.stories.tsx +1 -1
- package/src/ui/components/hover-bg.stories.tsx +1 -1
- package/src/ui/components/image-distortion.stories.tsx +1 -1
- package/src/ui/components/input.stories.tsx +39 -0
- package/src/ui/components/input.tsx +20 -0
- package/src/ui/components/label.stories.tsx +26 -0
- package/src/ui/components/label.tsx +16 -0
- package/src/ui/components/list-item.stories.tsx +1 -1
- package/src/ui/components/poster.stories.tsx +1 -1
- package/src/ui/components/progress.stories.tsx +1 -1
- package/src/ui/components/scramble.stories.tsx +1 -1
- package/src/ui/components/segmented.stories.tsx +1 -1
- package/src/ui/components/select.stories.tsx +1 -1
- package/src/ui/components/separator.stories.tsx +33 -0
- package/src/ui/components/separator.tsx +24 -0
- package/src/ui/components/spinner.stories.tsx +1 -1
- package/src/ui/components/stats.stories.tsx +1 -1
- package/src/ui/components/switch.stories.tsx +1 -1
- package/src/ui/components/tabs.stories.tsx +1 -1
- package/src/ui/components/terminal-demo.stories.tsx +1 -1
- package/src/ui/components/theme-toggle.stories.tsx +1 -1
- package/src/ui/components/tier-card.stories.tsx +1 -1
- package/src/ui/components/toast.stories.tsx +55 -0
- package/src/ui/components/toast.tsx +49 -0
- package/src/ui/components/tv.stories.tsx +1 -1
- package/src/ui/components/watchlist.stories.tsx +1 -1
- package/src/ui/globals.css +14 -2
- package/dist/ui/components/modal/index.d.ts +0 -8
- package/dist/ui/components/modal/index.js +0 -35
- package/dist/ui/components/modal/modal.css +0 -36
- package/src/ui/components/modal/index.stories.tsx +0 -46
- package/src/ui/components/modal/index.tsx +0 -48
- 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,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,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 {
|
|
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 {
|
|
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
|
-
|
|
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==
|