@nastechai-research/ui 0.13.2
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 +5 -0
- package/README.md +21 -0
- package/dist/assets/filler-bg0.webp +0 -0
- package/dist/assets.d.ts +38 -0
- package/dist/fonts/Collapse-Bold.woff2 +0 -0
- package/dist/fonts/Collapse-BoldItalic.woff2 +0 -0
- package/dist/fonts/Collapse-Italic.woff2 +0 -0
- package/dist/fonts/Collapse-Light.woff2 +0 -0
- package/dist/fonts/Collapse-LightItalic.woff2 +0 -0
- package/dist/fonts/Collapse-Regular.woff2 +0 -0
- package/dist/fonts/Collapse-Thin.woff2 +0 -0
- package/dist/fonts/Collapse-ThinItalic.woff2 +0 -0
- package/dist/fonts/Mondwest-Regular.woff2 +0 -0
- package/dist/fonts/Neuebit-Bold.woff2 +0 -0
- package/dist/fonts/RulesCompressed-Medium.woff2 +0 -0
- package/dist/fonts/RulesCompressed-Regular.woff2 +0 -0
- package/dist/fonts/RulesExpanded-Bold.woff2 +0 -0
- package/dist/fonts/RulesExpanded-Regular.woff2 +0 -0
- package/dist/fonts.d.ts +6 -0
- package/dist/fonts.js +6 -0
- package/dist/hooks/use-below-breakpoint.d.ts +2 -0
- package/dist/hooks/use-below-breakpoint.js +17 -0
- package/dist/hooks/use-capped-frame.d.ts +2 -0
- package/dist/hooks/use-capped-frame.js +15 -0
- package/dist/hooks/use-confirm-delete.d.ts +10 -0
- package/dist/hooks/use-confirm-delete.js +35 -0
- package/dist/hooks/use-css-var-dims.d.ts +1 -0
- package/dist/hooks/use-css-var-dims.js +29 -0
- package/dist/hooks/use-gpu-tier.d.ts +34 -0
- package/dist/hooks/use-gpu-tier.js +111 -0
- package/dist/hooks/use-render-loop.d.ts +41 -0
- package/dist/hooks/use-render-loop.js +63 -0
- package/dist/hooks/use-smooth-controls.d.ts +16 -0
- package/dist/hooks/use-smooth-controls.js +217 -0
- package/dist/hooks/use-toast.d.ts +7 -0
- package/dist/hooks/use-toast.js +21 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.js +107 -0
- package/dist/ui/basic-page.d.ts +7 -0
- package/dist/ui/basic-page.js +18 -0
- package/dist/ui/build.css +4 -0
- package/dist/ui/components/animated-count.d.ts +10 -0
- package/dist/ui/components/animated-count.js +113 -0
- package/dist/ui/components/ascii.d.ts +10 -0
- package/dist/ui/components/ascii.js +79 -0
- package/dist/ui/components/badge.d.ts +6 -0
- package/dist/ui/components/badge.js +40 -0
- package/dist/ui/components/badges/nous-girl.d.ts +2 -0
- package/dist/ui/components/badges/nous-girl.js +83 -0
- package/dist/ui/components/blend-mode.d.ts +28 -0
- package/dist/ui/components/blend-mode.js +69 -0
- package/dist/ui/components/blink.d.ts +6 -0
- package/dist/ui/components/blink.js +17 -0
- package/dist/ui/components/bottom-sheet.d.ts +15 -0
- package/dist/ui/components/bottom-sheet.js +192 -0
- package/dist/ui/components/button.d.ts +14 -0
- package/dist/ui/components/button.js +147 -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 +2 -0
- package/dist/ui/components/checkbox.js +27 -0
- package/dist/ui/components/command-block.d.ts +24 -0
- package/dist/ui/components/command-block.js +56 -0
- package/dist/ui/components/confirm-dialog.d.ts +13 -0
- package/dist/ui/components/confirm-dialog.js +113 -0
- package/dist/ui/components/cursor.d.ts +3 -0
- package/dist/ui/components/cursor.js +97 -0
- package/dist/ui/components/dialog.d.ts +15 -0
- package/dist/ui/components/dialog.js +171 -0
- package/dist/ui/components/dropdown-menu.d.ts +12 -0
- package/dist/ui/components/dropdown-menu.js +102 -0
- package/dist/ui/components/fit-text/fit-text.css +42 -0
- package/dist/ui/components/fit-text/index.d.ts +9 -0
- package/dist/ui/components/fit-text/index.js +25 -0
- package/dist/ui/components/graphs/bar-chart.d.ts +12 -0
- package/dist/ui/components/graphs/bar-chart.js +129 -0
- package/dist/ui/components/graphs/index.d.ts +3 -0
- package/dist/ui/components/graphs/index.js +4 -0
- package/dist/ui/components/graphs/line-chart.d.ts +14 -0
- package/dist/ui/components/graphs/line-chart.js +175 -0
- package/dist/ui/components/graphs/utils.d.ts +52 -0
- package/dist/ui/components/graphs/utils.js +162 -0
- package/dist/ui/components/grid/grid.css +79 -0
- package/dist/ui/components/grid/index.d.ts +2 -0
- package/dist/ui/components/grid/index.js +17 -0
- package/dist/ui/components/hover-bg.d.ts +1 -0
- package/dist/ui/components/hover-bg.js +14 -0
- package/dist/ui/components/icons/arrow.d.ts +6 -0
- package/dist/ui/components/icons/arrow.js +44 -0
- package/dist/ui/components/icons/check.d.ts +2 -0
- package/dist/ui/components/icons/check.js +13 -0
- package/dist/ui/components/icons/chevron.d.ts +6 -0
- package/dist/ui/components/icons/chevron.js +51 -0
- package/dist/ui/components/icons/discord.d.ts +2 -0
- package/dist/ui/components/icons/discord.js +15 -0
- package/dist/ui/components/icons/eye.d.ts +2 -0
- package/dist/ui/components/icons/eye.js +8 -0
- package/dist/ui/components/icons/gear.d.ts +6 -0
- package/dist/ui/components/icons/gear.js +30 -0
- package/dist/ui/components/icons/github.d.ts +2 -0
- package/dist/ui/components/icons/github.js +15 -0
- package/dist/ui/components/icons/hamburger.d.ts +6 -0
- package/dist/ui/components/icons/hamburger.js +56 -0
- package/dist/ui/components/icons/heart.d.ts +2 -0
- package/dist/ui/components/icons/heart.js +11 -0
- package/dist/ui/components/icons/index.d.ts +12 -0
- package/dist/ui/components/icons/index.js +13 -0
- package/dist/ui/components/icons/link.d.ts +2 -0
- package/dist/ui/components/icons/link.js +13 -0
- package/dist/ui/components/icons/minus.d.ts +2 -0
- package/dist/ui/components/icons/minus.js +13 -0
- package/dist/ui/components/icons/search.d.ts +2 -0
- package/dist/ui/components/icons/search.js +33 -0
- package/dist/ui/components/image-distortion.d.ts +21 -0
- package/dist/ui/components/image-distortion.js +398 -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/leva-client.d.ts +1 -0
- package/dist/ui/components/leva-client.js +12 -0
- package/dist/ui/components/list-item.d.ts +6 -0
- package/dist/ui/components/list-item.js +27 -0
- package/dist/ui/components/overlays/blend-modes.d.ts +1 -0
- package/dist/ui/components/overlays/blend-modes.js +14 -0
- package/dist/ui/components/overlays/glitch.d.ts +6 -0
- package/dist/ui/components/overlays/glitch.js +209 -0
- package/dist/ui/components/overlays/greys.d.ts +6 -0
- package/dist/ui/components/overlays/greys.js +339 -0
- package/dist/ui/components/overlays/index.d.ts +14 -0
- package/dist/ui/components/overlays/index.js +34 -0
- package/dist/ui/components/overlays/lens-layers.d.ts +14 -0
- package/dist/ui/components/overlays/lens-layers.js +95 -0
- package/dist/ui/components/overlays/lens.d.ts +44 -0
- package/dist/ui/components/overlays/lens.js +60 -0
- package/dist/ui/components/overlays/noise.d.ts +6 -0
- package/dist/ui/components/overlays/noise.js +136 -0
- package/dist/ui/components/overlays/vignette.d.ts +6 -0
- package/dist/ui/components/overlays/vignette.js +47 -0
- package/dist/ui/components/poster.d.ts +62 -0
- package/dist/ui/components/poster.js +256 -0
- package/dist/ui/components/progress.d.ts +9 -0
- package/dist/ui/components/progress.js +53 -0
- package/dist/ui/components/scene-canvas.d.ts +23 -0
- package/dist/ui/components/scene-canvas.js +179 -0
- package/dist/ui/components/scramble.d.ts +9 -0
- package/dist/ui/components/scramble.js +63 -0
- package/dist/ui/components/segmented.d.ts +20 -0
- package/dist/ui/components/segmented.js +51 -0
- package/dist/ui/components/select.d.ts +18 -0
- package/dist/ui/components/select.js +215 -0
- package/dist/ui/components/selection-switcher.d.ts +1 -0
- package/dist/ui/components/selection-switcher.js +34 -0
- package/dist/ui/components/separator.d.ts +5 -0
- package/dist/ui/components/separator.js +22 -0
- package/dist/ui/components/shader.d.ts +7 -0
- package/dist/ui/components/shader.js +60 -0
- package/dist/ui/components/socials.d.ts +20 -0
- package/dist/ui/components/socials.js +21 -0
- package/dist/ui/components/spinner.d.ts +20 -0
- package/dist/ui/components/spinner.js +38 -0
- package/dist/ui/components/stats.d.ts +16 -0
- package/dist/ui/components/stats.js +36 -0
- package/dist/ui/components/switch.d.ts +7 -0
- package/dist/ui/components/switch.js +37 -0
- package/dist/ui/components/tabs.d.ts +14 -0
- package/dist/ui/components/tabs.js +44 -0
- package/dist/ui/components/terminal-demo.d.ts +32 -0
- package/dist/ui/components/terminal-demo.js +125 -0
- package/dist/ui/components/theme-toggle.d.ts +6 -0
- package/dist/ui/components/theme-toggle.js +66 -0
- package/dist/ui/components/tier-card.d.ts +53 -0
- package/dist/ui/components/tier-card.js +146 -0
- package/dist/ui/components/toast.d.ts +8 -0
- package/dist/ui/components/toast.js +39 -0
- package/dist/ui/components/tv.d.ts +3 -0
- package/dist/ui/components/tv.js +239 -0
- package/dist/ui/components/typography/h1.d.ts +11 -0
- package/dist/ui/components/typography/h1.js +18 -0
- package/dist/ui/components/typography/h2.d.ts +11 -0
- package/dist/ui/components/typography/h2.js +18 -0
- package/dist/ui/components/typography/index.d.ts +15 -0
- package/dist/ui/components/typography/index.js +41 -0
- package/dist/ui/components/typography/legend.d.ts +6 -0
- package/dist/ui/components/typography/legend.js +20 -0
- package/dist/ui/components/typography/small.d.ts +2 -0
- package/dist/ui/components/typography/small.js +9 -0
- package/dist/ui/components/watchlist.d.ts +11 -0
- package/dist/ui/components/watchlist.js +80 -0
- package/dist/ui/fonts.css +63 -0
- package/dist/ui/footer.d.ts +20 -0
- package/dist/ui/footer.js +65 -0
- package/dist/ui/globals.css +395 -0
- package/dist/ui/header.d.ts +41 -0
- package/dist/ui/header.js +270 -0
- package/dist/ui/layout-wrapper.d.ts +1 -0
- package/dist/ui/layout-wrapper.js +7 -0
- package/dist/utils/color.d.ts +4 -0
- package/dist/utils/color.js +14 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.js +48 -0
- package/dist/utils/poly.d.ts +8 -0
- package/dist/utils/poly.js +3 -0
- package/package.json +120 -0
- package/src/assets/filler-bg0.webp +0 -0
- package/src/assets.d.ts +38 -0
- package/src/fonts/Collapse-Bold.woff2 +0 -0
- package/src/fonts/Collapse-BoldItalic.woff2 +0 -0
- package/src/fonts/Collapse-Italic.woff2 +0 -0
- package/src/fonts/Collapse-Light.woff2 +0 -0
- package/src/fonts/Collapse-LightItalic.woff2 +0 -0
- package/src/fonts/Collapse-Regular.woff2 +0 -0
- package/src/fonts/Collapse-Thin.woff2 +0 -0
- package/src/fonts/Collapse-ThinItalic.woff2 +0 -0
- package/src/fonts/Mondwest-Regular.woff2 +0 -0
- package/src/fonts/Neuebit-Bold.woff2 +0 -0
- package/src/fonts/RulesCompressed-Medium.woff2 +0 -0
- package/src/fonts/RulesCompressed-Regular.woff2 +0 -0
- package/src/fonts/RulesExpanded-Bold.woff2 +0 -0
- package/src/fonts/RulesExpanded-Regular.woff2 +0 -0
- package/src/fonts.ts +6 -0
- package/src/hooks/use-below-breakpoint.ts +21 -0
- package/src/hooks/use-capped-frame.ts +18 -0
- package/src/hooks/use-confirm-delete.ts +43 -0
- package/src/hooks/use-css-var-dims.ts +39 -0
- package/src/hooks/use-gpu-tier.ts +190 -0
- package/src/hooks/use-render-loop.ts +121 -0
- package/src/hooks/use-smooth-controls.ts +318 -0
- package/src/hooks/use-toast.ts +29 -0
- package/src/index.ts +130 -0
- package/src/ui/basic-page.tsx +34 -0
- package/src/ui/build.css +4 -0
- package/src/ui/components/animated-count.stories.tsx +67 -0
- package/src/ui/components/animated-count.tsx +168 -0
- package/src/ui/components/ascii.stories.tsx +30 -0
- package/src/ui/components/ascii.tsx +110 -0
- package/src/ui/components/badge.stories.tsx +31 -0
- package/src/ui/components/badge.tsx +60 -0
- package/src/ui/components/badges/nous-girl.tsx +52 -0
- package/src/ui/components/blend-mode.stories.tsx +33 -0
- package/src/ui/components/blend-mode.tsx +129 -0
- package/src/ui/components/blink.stories.tsx +32 -0
- package/src/ui/components/blink.tsx +21 -0
- 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 +68 -0
- package/src/ui/components/button.tsx +170 -0
- package/src/ui/components/card.stories.tsx +63 -0
- package/src/ui/components/card.tsx +85 -0
- package/src/ui/components/checkbox.stories.tsx +113 -0
- package/src/ui/components/checkbox.tsx +36 -0
- package/src/ui/components/command-block.stories.tsx +52 -0
- package/src/ui/components/command-block.tsx +86 -0
- package/src/ui/components/confirm-dialog.stories.tsx +91 -0
- package/src/ui/components/confirm-dialog.tsx +130 -0
- package/src/ui/components/cursor.tsx +115 -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 +52 -0
- package/src/ui/components/dropdown-menu.tsx +117 -0
- package/src/ui/components/fit-text/fit-text.css +42 -0
- package/src/ui/components/fit-text/index.stories.tsx +33 -0
- package/src/ui/components/fit-text/index.tsx +45 -0
- package/src/ui/components/forms.stories.tsx +173 -0
- package/src/ui/components/graphs/bar-chart.tsx +153 -0
- package/src/ui/components/graphs/index.stories.tsx +64 -0
- package/src/ui/components/graphs/index.tsx +4 -0
- package/src/ui/components/graphs/line-chart.tsx +213 -0
- package/src/ui/components/graphs/utils.tsx +265 -0
- package/src/ui/components/grid/grid.css +79 -0
- package/src/ui/components/grid/index.tsx +19 -0
- package/src/ui/components/hover-bg.stories.tsx +29 -0
- package/src/ui/components/hover-bg.tsx +15 -0
- package/src/ui/components/icons/arrow.tsx +42 -0
- package/src/ui/components/icons/check.tsx +14 -0
- package/src/ui/components/icons/chevron.tsx +45 -0
- package/src/ui/components/icons/discord.tsx +16 -0
- package/src/ui/components/icons/eye.tsx +12 -0
- package/src/ui/components/icons/gear.tsx +51 -0
- package/src/ui/components/icons/github.tsx +16 -0
- package/src/ui/components/icons/hamburger.tsx +52 -0
- package/src/ui/components/icons/heart.tsx +12 -0
- package/src/ui/components/icons/index.ts +12 -0
- package/src/ui/components/icons/link.tsx +14 -0
- package/src/ui/components/icons/minus.tsx +14 -0
- package/src/ui/components/icons/search.tsx +28 -0
- package/src/ui/components/image-distortion.stories.tsx +120 -0
- package/src/ui/components/image-distortion.tsx +499 -0
- 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/leva-client.tsx +14 -0
- package/src/ui/components/list-item.stories.tsx +83 -0
- package/src/ui/components/list-item.tsx +37 -0
- package/src/ui/components/overlays/blend-modes.ts +13 -0
- package/src/ui/components/overlays/glitch.tsx +243 -0
- package/src/ui/components/overlays/greys.tsx +386 -0
- package/src/ui/components/overlays/index.tsx +47 -0
- package/src/ui/components/overlays/lens-layers.tsx +121 -0
- package/src/ui/components/overlays/lens.ts +91 -0
- package/src/ui/components/overlays/noise.tsx +174 -0
- package/src/ui/components/overlays/vignette.tsx +60 -0
- package/src/ui/components/poster.stories.tsx +513 -0
- package/src/ui/components/poster.tsx +411 -0
- package/src/ui/components/progress.stories.tsx +48 -0
- package/src/ui/components/progress.tsx +56 -0
- package/src/ui/components/scene-canvas.tsx +254 -0
- package/src/ui/components/scramble.stories.tsx +49 -0
- package/src/ui/components/scramble.tsx +95 -0
- package/src/ui/components/segmented.stories.tsx +101 -0
- package/src/ui/components/segmented.tsx +81 -0
- package/src/ui/components/select.stories.tsx +88 -0
- package/src/ui/components/select.tsx +267 -0
- package/src/ui/components/selection-switcher.tsx +44 -0
- package/src/ui/components/separator.stories.tsx +33 -0
- package/src/ui/components/separator.tsx +24 -0
- package/src/ui/components/shader.tsx +83 -0
- package/src/ui/components/socials.tsx +42 -0
- package/src/ui/components/spinner.stories.tsx +101 -0
- package/src/ui/components/spinner.tsx +60 -0
- package/src/ui/components/stats.stories.tsx +24 -0
- package/src/ui/components/stats.tsx +53 -0
- package/src/ui/components/switch.stories.tsx +77 -0
- package/src/ui/components/switch.tsx +48 -0
- package/src/ui/components/tabs.stories.tsx +101 -0
- package/src/ui/components/tabs.tsx +66 -0
- package/src/ui/components/terminal-demo.stories.tsx +67 -0
- package/src/ui/components/terminal-demo.tsx +189 -0
- package/src/ui/components/theme-toggle.stories.tsx +47 -0
- package/src/ui/components/theme-toggle.tsx +66 -0
- package/src/ui/components/tier-card.stories.tsx +217 -0
- package/src/ui/components/tier-card.tsx +190 -0
- package/src/ui/components/toast.stories.tsx +55 -0
- package/src/ui/components/toast.tsx +49 -0
- package/src/ui/components/tv.stories.tsx +37 -0
- package/src/ui/components/tv.tsx +257 -0
- package/src/ui/components/typography/h1.tsx +18 -0
- package/src/ui/components/typography/h2.tsx +18 -0
- package/src/ui/components/typography/index.tsx +54 -0
- package/src/ui/components/typography/legend.tsx +24 -0
- package/src/ui/components/typography/small.tsx +11 -0
- package/src/ui/components/watchlist.stories.tsx +33 -0
- package/src/ui/components/watchlist.tsx +105 -0
- package/src/ui/fonts.css +63 -0
- package/src/ui/footer.tsx +111 -0
- package/src/ui/globals.css +395 -0
- package/src/ui/header.tsx +398 -0
- package/src/ui/layout-wrapper.tsx +11 -0
- package/src/utils/color.ts +21 -0
- package/src/utils/index.ts +62 -0
- package/src/utils/poly.ts +26 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import {
|
|
4
|
+
useEffect,
|
|
5
|
+
useState
|
|
6
|
+
} from "react";
|
|
7
|
+
import spinners from "unicode-animations";
|
|
8
|
+
import { cn } from "../../utils/index.js";
|
|
9
|
+
export function Spinner({
|
|
10
|
+
className,
|
|
11
|
+
name = "braille",
|
|
12
|
+
style,
|
|
13
|
+
...props
|
|
14
|
+
}) {
|
|
15
|
+
const [frame, setFrame] = useState(0);
|
|
16
|
+
const animation = spinners[name];
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const id = setInterval(
|
|
19
|
+
() => setFrame((f) => (f + 1) % animation.frames.length),
|
|
20
|
+
animation.interval
|
|
21
|
+
);
|
|
22
|
+
return () => clearInterval(id);
|
|
23
|
+
}, [animation.frames.length, animation.interval]);
|
|
24
|
+
return /* @__PURE__ */ jsx(
|
|
25
|
+
"span",
|
|
26
|
+
{
|
|
27
|
+
"aria-hidden": props["aria-label"] ? void 0 : true,
|
|
28
|
+
className: cn(
|
|
29
|
+
"font-mono inline-block leading-none tabular-nums",
|
|
30
|
+
className
|
|
31
|
+
),
|
|
32
|
+
style,
|
|
33
|
+
...props,
|
|
34
|
+
children: animation.frames[frame]
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7XG4gIHR5cGUgQ1NTUHJvcGVydGllcyxcbiAgdHlwZSBIVE1MQXR0cmlidXRlcyxcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZVxufSBmcm9tICdyZWFjdCdcbmltcG9ydCBzcGlubmVycywgeyB0eXBlIEJyYWlsbGVTcGlubmVyTmFtZSB9IGZyb20gJ3VuaWNvZGUtYW5pbWF0aW9ucydcblxuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuLyoqXG4gKiBCcmFpbGxlIHVuaWNvZGUgc3Bpbm5lci4gUmVuZGVycyB0aGUgYWN0aXZlIGZyYW1lIG9mIGEgYHVuaWNvZGUtYW5pbWF0aW9uc2BcbiAqIHNlcXVlbmNlIGluc2lkZSBhbiBpbmxpbmUgYDxzcGFuPmAsIGFkdmFuY2luZyBvbiB0aGUgc3Bpbm5lcidzIG93biBpbnRlcnZhbC5cbiAqXG4gKiBJbmhlcml0cyBmb250IGNvbG9yIGFuZCBmb250IHNpemUgZnJvbSBpdHMgcGFyZW50IFx1MjAxNCBhcHBseSBUYWlsd2luZCB1dGlsaXRpZXNcbiAqIChlLmcuIGB0ZXh0LXdhcm5pbmdgLCBgdGV4dC1iYXNlYCkgdmlhIGBjbGFzc05hbWVgIHRvIHN0eWxlLlxuICpcbiAqIERlY29yYXRpdmUgYnkgZGVmYXVsdC4gUGFzcyBgYXJpYS1sYWJlbGAgKGFuZCBvcHRpb25hbGx5IGByb2xlPVwic3RhdHVzXCJgKSB3aGVuXG4gKiB0aGUgc3Bpbm5lciBoYXMgbm8gc3Vycm91bmRpbmcgbG9hZGluZyB0ZXh0IGFuZCBzY3JlZW4gcmVhZGVycyBuZWVkIHRvIGtub3dcbiAqIHNvbWV0aGluZyBpcyBsb2FkaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3Bpbm5lcih7XG4gIGNsYXNzTmFtZSxcbiAgbmFtZSA9ICdicmFpbGxlJyxcbiAgc3R5bGUsXG4gIC4uLnByb3BzXG59OiBTcGlubmVyUHJvcHMpIHtcbiAgY29uc3QgW2ZyYW1lLCBzZXRGcmFtZV0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBhbmltYXRpb24gPSBzcGlubmVyc1tuYW1lXVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaWQgPSBzZXRJbnRlcnZhbChcbiAgICAgICgpID0+IHNldEZyYW1lKGYgPT4gKGYgKyAxKSAlIGFuaW1hdGlvbi5mcmFtZXMubGVuZ3RoKSxcbiAgICAgIGFuaW1hdGlvbi5pbnRlcnZhbFxuICAgIClcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJJbnRlcnZhbChpZClcbiAgfSwgW2FuaW1hdGlvbi5mcmFtZXMubGVuZ3RoLCBhbmltYXRpb24uaW50ZXJ2YWxdKVxuXG4gIHJldHVybiAoXG4gICAgPHNwYW5cbiAgICAgIGFyaWEtaGlkZGVuPXtwcm9wc1snYXJpYS1sYWJlbCddID8gdW5kZWZpbmVkIDogdHJ1ZX1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmb250LW1vbm8gaW5saW5lLWJsb2NrIGxlYWRpbmctbm9uZSB0YWJ1bGFyLW51bXMnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBzdHlsZT17c3R5bGV9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAge2FuaW1hdGlvbi5mcmFtZXNbZnJhbWVdfVxuICAgIDwvc3Bhbj5cbiAgKVxufVxuXG5pbnRlcmZhY2UgU3Bpbm5lclByb3BzIGV4dGVuZHMgSFRNTEF0dHJpYnV0ZXM8SFRNTFNwYW5FbGVtZW50PiB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBuYW1lPzogQnJhaWxsZVNwaW5uZXJOYW1lXG4gIHN0eWxlPzogQ1NTUHJvcGVydGllc1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQXlDSTtBQXZDSjtBQUFBLEVBR0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sY0FBMkM7QUFFbEQsU0FBUyxVQUFVO0FBYVosZ0JBQVMsUUFBUTtBQUFBLEVBQ3RCO0FBQUEsRUFDQSxPQUFPO0FBQUEsRUFDUDtBQUFBLEVBQ0EsR0FBRztBQUNMLEdBQWlCO0FBQ2YsUUFBTSxDQUFDLE9BQU8sUUFBUSxJQUFJLFNBQVMsQ0FBQztBQUNwQyxRQUFNLFlBQVksU0FBUyxJQUFJO0FBRS9CLFlBQVUsTUFBTTtBQUNkLFVBQU0sS0FBSztBQUFBLE1BQ1QsTUFBTSxTQUFTLFFBQU0sSUFBSSxLQUFLLFVBQVUsT0FBTyxNQUFNO0FBQUEsTUFDckQsVUFBVTtBQUFBLElBQ1o7QUFDQSxXQUFPLE1BQU0sY0FBYyxFQUFFO0FBQUEsRUFDL0IsR0FBRyxDQUFDLFVBQVUsT0FBTyxRQUFRLFVBQVUsUUFBUSxDQUFDO0FBRWhELFNBQ0U7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDLGVBQWEsTUFBTSxZQUFZLElBQUksU0FBWTtBQUFBLE1BQy9DLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBO0FBQUEsTUFDQyxHQUFHO0FBQUEsTUFFSCxvQkFBVSxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBQ3pCO0FBRUo7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
|
+
export declare function Stats({ className, items, flip, ...props }: StatsProps): React.JSX.Element;
|
|
3
|
+
interface StatsProps extends React.ComponentProps<'div'> {
|
|
4
|
+
items: {
|
|
5
|
+
label: string | {
|
|
6
|
+
key: string;
|
|
7
|
+
node: ReactNode;
|
|
8
|
+
};
|
|
9
|
+
value: string | {
|
|
10
|
+
key: string;
|
|
11
|
+
node: ReactNode;
|
|
12
|
+
};
|
|
13
|
+
}[];
|
|
14
|
+
flip?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../utils/index.js";
|
|
3
|
+
import { Typography } from "./typography/index.js";
|
|
4
|
+
export function Stats({ className, items, flip, ...props }) {
|
|
5
|
+
return /* @__PURE__ */ jsx("div", { className: cn("flex w-full flex-col gap-5", className), ...props, children: items.map(({ label, value }) => {
|
|
6
|
+
const valueText = /* @__PURE__ */ jsx(
|
|
7
|
+
Typography,
|
|
8
|
+
{
|
|
9
|
+
className: "text-xs leading-[1.4] tracking-widest",
|
|
10
|
+
expanded: true,
|
|
11
|
+
children: typeof value === "string" ? value : value.node
|
|
12
|
+
}
|
|
13
|
+
);
|
|
14
|
+
const labelText = /* @__PURE__ */ jsx(Typography, { className: "leading-none tracking-[0.2em] opacity-60", mono: true, children: typeof label === "string" ? label : label.node });
|
|
15
|
+
return /* @__PURE__ */ jsxs(
|
|
16
|
+
"div",
|
|
17
|
+
{
|
|
18
|
+
className: "text-midground text-display grid grid-cols-[auto_1fr_auto] items-center gap-2.5",
|
|
19
|
+
children: [
|
|
20
|
+
flip ? labelText : valueText,
|
|
21
|
+
/* @__PURE__ */ jsx(
|
|
22
|
+
Typography,
|
|
23
|
+
{
|
|
24
|
+
className: "min-w-0 overflow-hidden text-[13px] leading-[1.4] tracking-[0.4em] opacity-20",
|
|
25
|
+
expanded: true,
|
|
26
|
+
children: "\xB7".repeat(100)
|
|
27
|
+
}
|
|
28
|
+
),
|
|
29
|
+
flip ? valueText : labelText
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
(typeof label === "string" ? label : label.key) + "@@@" + (typeof value === "string" ? value : value.key)
|
|
33
|
+
);
|
|
34
|
+
}) });
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IFJlYWN0LCB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuXG5pbXBvcnQgeyBUeXBvZ3JhcGh5IH0gZnJvbSAnLi90eXBvZ3JhcGh5J1xuXG5leHBvcnQgZnVuY3Rpb24gU3RhdHMoeyBjbGFzc05hbWUsIGl0ZW1zLCBmbGlwLCAuLi5wcm9wcyB9OiBTdGF0c1Byb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2NuKCdmbGV4IHctZnVsbCBmbGV4LWNvbCBnYXAtNScsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30+XG4gICAgICB7aXRlbXMubWFwKCh7IGxhYmVsLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlVGV4dCA9IChcbiAgICAgICAgICA8VHlwb2dyYXBoeVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyBsZWFkaW5nLVsxLjRdIHRyYWNraW5nLXdpZGVzdFwiXG4gICAgICAgICAgICBleHBhbmRlZFxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiB2YWx1ZS5ub2RlfVxuICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgKVxuICAgICAgICBjb25zdCBsYWJlbFRleHQgPSAoXG4gICAgICAgICAgPFR5cG9ncmFwaHkgY2xhc3NOYW1lPVwibGVhZGluZy1ub25lIHRyYWNraW5nLVswLjJlbV0gb3BhY2l0eS02MFwiIG1vbm8+XG4gICAgICAgICAgICB7dHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJyA/IGxhYmVsIDogbGFiZWwubm9kZX1cbiAgICAgICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtbWlkZ3JvdW5kIHRleHQtZGlzcGxheSBncmlkIGdyaWQtY29scy1bYXV0b18xZnJfYXV0b10gaXRlbXMtY2VudGVyIGdhcC0yLjVcIlxuICAgICAgICAgICAga2V5PXsodHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJyA/IGxhYmVsIDogbGFiZWwua2V5ICkgKyAnQEBAJysodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdmFsdWUua2V5KX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZmxpcCA/IGxhYmVsVGV4dCA6IHZhbHVlVGV4dH1cblxuICAgICAgICAgICAgPFR5cG9ncmFwaHlcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWluLXctMCBvdmVyZmxvdy1oaWRkZW4gdGV4dC1bMTNweF0gbGVhZGluZy1bMS40XSB0cmFja2luZy1bMC40ZW1dIG9wYWNpdHktMjBcIlxuICAgICAgICAgICAgICBleHBhbmRlZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7J1x1MDBCNycucmVwZWF0KDEwMCl9XG4gICAgICAgICAgICA8L1R5cG9ncmFwaHk+XG5cbiAgICAgICAgICAgIHtmbGlwID8gdmFsdWVUZXh0IDogbGFiZWxUZXh0fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApXG4gICAgICB9KX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5pbnRlcmZhY2UgU3RhdHNQcm9wcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPiB7XG4gIGl0ZW1zOiB7XG4gICAgbGFiZWw6IHN0cmluZyB8IHtrZXk6IHN0cmluZywgbm9kZTogUmVhY3ROb2RlfVxuICAgIHZhbHVlOiBzdHJpbmcgfCB7a2V5OiBzdHJpbmcsIG5vZGU6IFJlYWN0Tm9kZX1cbiAgfVtdXG4gIGZsaXA/OiBib29sZWFuXG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFXVSxjQWNBLFlBZEE7QUFUVixTQUFTLFVBQVU7QUFFbkIsU0FBUyxrQkFBa0I7QUFFcEIsZ0JBQVMsTUFBTSxFQUFFLFdBQVcsT0FBTyxNQUFNLEdBQUcsTUFBTSxHQUFlO0FBQ3RFLFNBQ0Usb0JBQUMsU0FBSSxXQUFXLEdBQUcsOEJBQThCLFNBQVMsR0FBSSxHQUFHLE9BQzlELGdCQUFNLElBQUksQ0FBQyxFQUFFLE9BQU8sTUFBTSxNQUFNO0FBQy9CLFVBQU0sWUFDSjtBQUFBLE1BQUM7QUFBQTtBQUFBLFFBQ0MsV0FBVTtBQUFBLFFBQ1YsVUFBUTtBQUFBLFFBRVAsaUJBQU8sVUFBVSxXQUFXLFFBQVEsTUFBTTtBQUFBO0FBQUEsSUFDN0M7QUFFRixVQUFNLFlBQ0osb0JBQUMsY0FBVyxXQUFVLDRDQUEyQyxNQUFJLE1BQ2xFLGlCQUFPLFVBQVUsV0FBVyxRQUFRLE1BQU0sTUFDN0M7QUFHRixXQUNFO0FBQUEsTUFBQztBQUFBO0FBQUEsUUFDQyxXQUFVO0FBQUEsUUFHVDtBQUFBLGlCQUFPLFlBQVk7QUFBQSxVQUVwQjtBQUFBLFlBQUM7QUFBQTtBQUFBLGNBQ0MsV0FBVTtBQUFBLGNBQ1YsVUFBUTtBQUFBLGNBRVAsaUJBQUksT0FBTyxHQUFHO0FBQUE7QUFBQSxVQUNqQjtBQUFBLFVBRUMsT0FBTyxZQUFZO0FBQUE7QUFBQTtBQUFBLE9BWGQsT0FBTyxVQUFVLFdBQVcsUUFBUSxNQUFNLE9BQVEsU0FBTyxPQUFPLFVBQVUsV0FBVyxRQUFRLE1BQU07QUFBQSxJQVkzRztBQUFBLEVBRUosQ0FBQyxHQUNIO0FBRUo7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes } from 'react';
|
|
2
|
+
export declare const Switch: import("react").ForwardRefExoticComponent<SwitchProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
3
|
+
interface SwitchProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {
|
|
4
|
+
checked: boolean;
|
|
5
|
+
onCheckedChange: (checked: boolean) => void;
|
|
6
|
+
}
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import { cn } from "../../utils/index.js";
|
|
5
|
+
export const Switch = forwardRef(function Switch2({ checked, className, disabled, id, onCheckedChange, ...props }, ref) {
|
|
6
|
+
return /* @__PURE__ */ jsx(
|
|
7
|
+
"button",
|
|
8
|
+
{
|
|
9
|
+
"aria-checked": checked,
|
|
10
|
+
className: cn(
|
|
11
|
+
"peer inline-flex h-5 w-9 shrink-0 items-center border transition-colors cursor-pointer",
|
|
12
|
+
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30",
|
|
13
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
14
|
+
checked ? "bg-midground/15 border-midground/30" : "bg-background border-midground/20",
|
|
15
|
+
className
|
|
16
|
+
),
|
|
17
|
+
disabled,
|
|
18
|
+
id,
|
|
19
|
+
onClick: () => onCheckedChange(!checked),
|
|
20
|
+
ref,
|
|
21
|
+
role: "switch",
|
|
22
|
+
type: "button",
|
|
23
|
+
...props,
|
|
24
|
+
children: /* @__PURE__ */ jsx(
|
|
25
|
+
"span",
|
|
26
|
+
{
|
|
27
|
+
"aria-hidden": true,
|
|
28
|
+
className: cn(
|
|
29
|
+
"pointer-events-none block h-3.5 w-3.5 transition-transform",
|
|
30
|
+
checked ? "translate-x-4 bg-midground" : "translate-x-0.5 bg-midground/40"
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHR5cGUgQnV0dG9uSFRNTEF0dHJpYnV0ZXMsIGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuZXhwb3J0IGNvbnN0IFN3aXRjaCA9IGZvcndhcmRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQsIFN3aXRjaFByb3BzPihmdW5jdGlvbiBTd2l0Y2goXG4gIHsgY2hlY2tlZCwgY2xhc3NOYW1lLCBkaXNhYmxlZCwgaWQsIG9uQ2hlY2tlZENoYW5nZSwgLi4ucHJvcHMgfSxcbiAgcmVmXG4pIHtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICBhcmlhLWNoZWNrZWQ9e2NoZWNrZWR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncGVlciBpbmxpbmUtZmxleCBoLTUgdy05IHNocmluay0wIGl0ZW1zLWNlbnRlciBib3JkZXIgdHJhbnNpdGlvbi1jb2xvcnMgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAnZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTEgZm9jdXMtdmlzaWJsZTpyaW5nLW1pZGdyb3VuZC8zMCcsXG4gICAgICAgICdkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gICAgICAgIGNoZWNrZWRcbiAgICAgICAgICA/ICdiZy1taWRncm91bmQvMTUgYm9yZGVyLW1pZGdyb3VuZC8zMCdcbiAgICAgICAgICA6ICdiZy1iYWNrZ3JvdW5kIGJvcmRlci1taWRncm91bmQvMjAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBpZD17aWR9XG4gICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoZWNrZWRDaGFuZ2UoIWNoZWNrZWQpfVxuICAgICAgcmVmPXtyZWZ9XG4gICAgICByb2xlPVwic3dpdGNoXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgYmxvY2sgaC0zLjUgdy0zLjUgdHJhbnNpdGlvbi10cmFuc2Zvcm0nLFxuICAgICAgICAgIGNoZWNrZWRcbiAgICAgICAgICAgID8gJ3RyYW5zbGF0ZS14LTQgYmctbWlkZ3JvdW5kJ1xuICAgICAgICAgICAgOiAndHJhbnNsYXRlLXgtMC41IGJnLW1pZGdyb3VuZC80MCdcbiAgICAgICAgKX1cbiAgICAgIC8+XG4gICAgPC9idXR0b24+XG4gIClcbn0pXG5cbmludGVyZmFjZSBTd2l0Y2hQcm9wc1xuICBleHRlbmRzIE9taXQ8QnV0dG9uSFRNTEF0dHJpYnV0ZXM8SFRNTEJ1dHRvbkVsZW1lbnQ+LCAnb25DaGFuZ2UnPiB7XG4gIGNoZWNrZWQ6IGJvb2xlYW5cbiAgb25DaGVja2VkQ2hhbmdlOiAoY2hlY2tlZDogYm9vbGVhbikgPT4gdm9pZFxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQThCTTtBQTVCTixTQUFvQyxrQkFBa0I7QUFFdEQsU0FBUyxVQUFVO0FBRVosYUFBTSxTQUFTLFdBQTJDLFNBQVNBLFFBQ3hFLEVBQUUsU0FBUyxXQUFXLFVBQVUsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLEdBQzlELEtBQ0E7QUFDQSxTQUNFO0FBQUEsSUFBQztBQUFBO0FBQUEsTUFDQyxnQkFBYztBQUFBLE1BQ2QsV0FBVztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsVUFDSSx3Q0FDQTtBQUFBLFFBQ0o7QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLFNBQVMsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPO0FBQUEsTUFDdkM7QUFBQSxNQUNBLE1BQUs7QUFBQSxNQUNMLE1BQUs7QUFBQSxNQUNKLEdBQUc7QUFBQSxNQUVKO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDQyxlQUFXO0FBQUEsVUFDWCxXQUFXO0FBQUEsWUFDVDtBQUFBLFlBQ0EsVUFDSSwrQkFDQTtBQUFBLFVBQ047QUFBQTtBQUFBLE1BQ0Y7QUFBQTtBQUFBLEVBQ0Y7QUFFSixDQUFDOyIsCiAgIm5hbWVzIjogWyJTd2l0Y2giXQp9Cg==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export declare function Tabs({ children, className, defaultValue }: TabsProps): import("react").JSX.Element;
|
|
3
|
+
export declare function TabsList({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
4
|
+
export declare function TabsTrigger({ active, className, value: _value, ...props }: TabsTriggerProps): import("react").JSX.Element;
|
|
5
|
+
interface TabsProps {
|
|
6
|
+
children: (active: string, setActive: (value: string) => void) => ReactNode;
|
|
7
|
+
className?: string;
|
|
8
|
+
defaultValue: string;
|
|
9
|
+
}
|
|
10
|
+
interface TabsTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
11
|
+
active: boolean;
|
|
12
|
+
value: string;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import {
|
|
4
|
+
useState
|
|
5
|
+
} from "react";
|
|
6
|
+
import { cn } from "../../utils/index.js";
|
|
7
|
+
export function Tabs({ children, className, defaultValue }) {
|
|
8
|
+
const [active, setActive] = useState(defaultValue);
|
|
9
|
+
return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-4", className), children: children(active, setActive) });
|
|
10
|
+
}
|
|
11
|
+
export function TabsList({ className, ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx(
|
|
13
|
+
"div",
|
|
14
|
+
{
|
|
15
|
+
className: cn(
|
|
16
|
+
"inline-flex h-9 items-center justify-start border-b border-midground/15 text-text-secondary",
|
|
17
|
+
className
|
|
18
|
+
),
|
|
19
|
+
...props
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
export function TabsTrigger({
|
|
24
|
+
active,
|
|
25
|
+
className,
|
|
26
|
+
value: _value,
|
|
27
|
+
...props
|
|
28
|
+
}) {
|
|
29
|
+
return /* @__PURE__ */ jsx(
|
|
30
|
+
"button",
|
|
31
|
+
{
|
|
32
|
+
className: cn(
|
|
33
|
+
"relative inline-flex items-center justify-center whitespace-nowrap px-3 py-1.5",
|
|
34
|
+
"font-mondwest text-display text-xs tracking-[0.1em] transition-all cursor-pointer",
|
|
35
|
+
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30",
|
|
36
|
+
active ? "text-midground after:absolute after:bottom-0 after:left-0 after:right-0 after:h-px after:bg-midground" : "text-text-secondary hover:text-midground",
|
|
37
|
+
className
|
|
38
|
+
),
|
|
39
|
+
type: "button",
|
|
40
|
+
...props
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7XG4gIHR5cGUgQnV0dG9uSFRNTEF0dHJpYnV0ZXMsXG4gIHR5cGUgSFRNTEF0dHJpYnV0ZXMsXG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VTdGF0ZVxufSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIFRhYnMoeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBkZWZhdWx0VmFsdWUgfTogVGFic1Byb3BzKSB7XG4gIGNvbnN0IFthY3RpdmUsIHNldEFjdGl2ZV0gPSB1c2VTdGF0ZShkZWZhdWx0VmFsdWUpXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y24oJ2ZsZXggZmxleC1jb2wgZ2FwLTQnLCBjbGFzc05hbWUpfT5cbiAgICAgIHtjaGlsZHJlbihhY3RpdmUsIHNldEFjdGl2ZSl9XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRhYnNMaXN0KHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBIVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnaW5saW5lLWZsZXggaC05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGJvcmRlci1iIGJvcmRlci1taWRncm91bmQvMTUgdGV4dC10ZXh0LXNlY29uZGFyeScsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUYWJzVHJpZ2dlcih7XG4gIGFjdGl2ZSxcbiAgY2xhc3NOYW1lLFxuICB2YWx1ZTogX3ZhbHVlLFxuICAuLi5wcm9wc1xufTogVGFic1RyaWdnZXJQcm9wcykge1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdyZWxhdGl2ZSBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgd2hpdGVzcGFjZS1ub3dyYXAgcHgtMyBweS0xLjUnLFxuICAgICAgICAnZm9udC1tb25kd2VzdCB0ZXh0LWRpc3BsYXkgdGV4dC14cyB0cmFja2luZy1bMC4xZW1dIHRyYW5zaXRpb24tYWxsIGN1cnNvci1wb2ludGVyJyxcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0xIGZvY3VzLXZpc2libGU6cmluZy1taWRncm91bmQvMzAnLFxuICAgICAgICBhY3RpdmVcbiAgICAgICAgICA/ICd0ZXh0LW1pZGdyb3VuZCBhZnRlcjphYnNvbHV0ZSBhZnRlcjpib3R0b20tMCBhZnRlcjpsZWZ0LTAgYWZ0ZXI6cmlnaHQtMCBhZnRlcjpoLXB4IGFmdGVyOmJnLW1pZGdyb3VuZCdcbiAgICAgICAgICA6ICd0ZXh0LXRleHQtc2Vjb25kYXJ5IGhvdmVyOnRleHQtbWlkZ3JvdW5kJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5pbnRlcmZhY2UgVGFic1Byb3BzIHtcbiAgY2hpbGRyZW46IChhY3RpdmU6IHN0cmluZywgc2V0QWN0aXZlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCkgPT4gUmVhY3ROb2RlXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBkZWZhdWx0VmFsdWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgVGFic1RyaWdnZXJQcm9wcyBleHRlbmRzIEJ1dHRvbkhUTUxBdHRyaWJ1dGVzPEhUTUxCdXR0b25FbGVtZW50PiB7XG4gIGFjdGl2ZTogYm9vbGVhblxuICB2YWx1ZTogc3RyaW5nXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBZUk7QUFiSjtBQUFBLEVBSUU7QUFBQSxPQUNLO0FBRVAsU0FBUyxVQUFVO0FBRVosZ0JBQVMsS0FBSyxFQUFFLFVBQVUsV0FBVyxhQUFhLEdBQWM7QUFDckUsUUFBTSxDQUFDLFFBQVEsU0FBUyxJQUFJLFNBQVMsWUFBWTtBQUVqRCxTQUNFLG9CQUFDLFNBQUksV0FBVyxHQUFHLHVCQUF1QixTQUFTLEdBQ2hELG1CQUFTLFFBQVEsU0FBUyxHQUM3QjtBQUVKO0FBRU8sZ0JBQVMsU0FBUyxFQUFFLFdBQVcsR0FBRyxNQUFNLEdBQW1DO0FBQ2hGLFNBQ0U7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNDLEdBQUc7QUFBQTtBQUFBLEVBQ047QUFFSjtBQUVPLGdCQUFTLFlBQVk7QUFBQSxFQUMxQjtBQUFBLEVBQ0E7QUFBQSxFQUNBLE9BQU87QUFBQSxFQUNQLEdBQUc7QUFDTCxHQUFxQjtBQUNuQixTQUNFO0FBQUEsSUFBQztBQUFBO0FBQUEsTUFDQyxXQUFXO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQSxTQUNJLDBHQUNBO0FBQUEsUUFDSjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE1BQUs7QUFBQSxNQUNKLEdBQUc7QUFBQTtBQUFBLEVBQ047QUFFSjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare function TerminalDemo({ ariaLabel, className, height, label, loopDelayMs, outputLineDelayMs, sequence }: TerminalDemoProps): import("react").JSX.Element;
|
|
2
|
+
interface ClearStep {
|
|
3
|
+
type: 'clear';
|
|
4
|
+
}
|
|
5
|
+
interface OutputStep {
|
|
6
|
+
lines: string[];
|
|
7
|
+
type: 'output';
|
|
8
|
+
}
|
|
9
|
+
interface PauseStep {
|
|
10
|
+
ms: number;
|
|
11
|
+
type: 'pause';
|
|
12
|
+
}
|
|
13
|
+
interface PromptStep {
|
|
14
|
+
text: string;
|
|
15
|
+
type: 'prompt';
|
|
16
|
+
}
|
|
17
|
+
interface TerminalDemoProps {
|
|
18
|
+
ariaLabel?: string;
|
|
19
|
+
className?: string;
|
|
20
|
+
height?: number | string;
|
|
21
|
+
label?: string;
|
|
22
|
+
loopDelayMs?: number;
|
|
23
|
+
outputLineDelayMs?: number;
|
|
24
|
+
sequence: TerminalDemoStep[];
|
|
25
|
+
}
|
|
26
|
+
export type TerminalDemoStep = ClearStep | OutputStep | PauseStep | PromptStep | TypeStep;
|
|
27
|
+
interface TypeStep {
|
|
28
|
+
delay?: number;
|
|
29
|
+
text: string;
|
|
30
|
+
type: 'type';
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { cn } from "../../utils/index.js";
|
|
5
|
+
function sleep(ms) {
|
|
6
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
7
|
+
}
|
|
8
|
+
export function TerminalDemo({
|
|
9
|
+
ariaLabel = "Terminal Demo",
|
|
10
|
+
className,
|
|
11
|
+
height = 320,
|
|
12
|
+
label = "Terminal",
|
|
13
|
+
loopDelayMs = 1e3,
|
|
14
|
+
outputLineDelayMs = 50,
|
|
15
|
+
sequence
|
|
16
|
+
}) {
|
|
17
|
+
const bodyRef = useRef(null);
|
|
18
|
+
const startedRef = useRef(false);
|
|
19
|
+
const [html, setHtml] = useState("");
|
|
20
|
+
const runDemo = useCallback(async () => {
|
|
21
|
+
if (startedRef.current) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
startedRef.current = true;
|
|
25
|
+
let content = "";
|
|
26
|
+
const render = (h) => {
|
|
27
|
+
content = h;
|
|
28
|
+
setHtml(h);
|
|
29
|
+
};
|
|
30
|
+
for (; ; ) {
|
|
31
|
+
for (const step of sequence) {
|
|
32
|
+
switch (step.type) {
|
|
33
|
+
case "clear":
|
|
34
|
+
content = "";
|
|
35
|
+
render("");
|
|
36
|
+
break;
|
|
37
|
+
case "output":
|
|
38
|
+
for (const line of step.lines) {
|
|
39
|
+
render(content + "\n" + line);
|
|
40
|
+
await sleep(outputLineDelayMs);
|
|
41
|
+
}
|
|
42
|
+
break;
|
|
43
|
+
case "pause":
|
|
44
|
+
await sleep(step.ms);
|
|
45
|
+
break;
|
|
46
|
+
case "prompt":
|
|
47
|
+
render(content + `<span class="text-midground">${step.text}</span>`);
|
|
48
|
+
break;
|
|
49
|
+
case "type":
|
|
50
|
+
for (const char of step.text) {
|
|
51
|
+
render(content + char);
|
|
52
|
+
await sleep(step.delay ?? 30);
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
content = "";
|
|
58
|
+
render("");
|
|
59
|
+
await sleep(loopDelayMs);
|
|
60
|
+
}
|
|
61
|
+
}, [loopDelayMs, outputLineDelayMs, sequence]);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
const el = bodyRef.current?.closest("[data-demo-root]");
|
|
64
|
+
if (!el) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const observer = new IntersectionObserver(
|
|
68
|
+
(entries) => {
|
|
69
|
+
entries.forEach((entry) => {
|
|
70
|
+
if (entry.isIntersecting) {
|
|
71
|
+
runDemo();
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
{ threshold: 0.3 }
|
|
76
|
+
);
|
|
77
|
+
observer.observe(el);
|
|
78
|
+
return () => observer.disconnect();
|
|
79
|
+
}, [runDemo]);
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
if (bodyRef.current) {
|
|
82
|
+
bodyRef.current.scrollTop = bodyRef.current.scrollHeight;
|
|
83
|
+
}
|
|
84
|
+
}, [html]);
|
|
85
|
+
return /* @__PURE__ */ jsxs(
|
|
86
|
+
"div",
|
|
87
|
+
{
|
|
88
|
+
"aria-label": ariaLabel,
|
|
89
|
+
className: cn("border-4 border-double border-inherit", className),
|
|
90
|
+
"data-demo-root": true,
|
|
91
|
+
role: "img",
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b border-current/10 px-3 py-2", children: [
|
|
94
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-1.5", children: [
|
|
95
|
+
/* @__PURE__ */ jsx(
|
|
96
|
+
"span",
|
|
97
|
+
{
|
|
98
|
+
className: "bg-midground size-2 rounded-full",
|
|
99
|
+
style: { mixBlendMode: "plus-lighter" }
|
|
100
|
+
}
|
|
101
|
+
),
|
|
102
|
+
/* @__PURE__ */ jsx("span", { className: "bg-midground/60 size-2 rounded-full" }),
|
|
103
|
+
/* @__PURE__ */ jsx("span", { className: "bg-midground/30 size-2 rounded-full" })
|
|
104
|
+
] }),
|
|
105
|
+
/* @__PURE__ */ jsx("span", { className: "font-courier text-display text-xs tracking-widest text-text-tertiary", children: label })
|
|
106
|
+
] }),
|
|
107
|
+
/* @__PURE__ */ jsx(
|
|
108
|
+
"div",
|
|
109
|
+
{
|
|
110
|
+
className: cn(
|
|
111
|
+
"overflow-x-hidden overflow-y-auto whitespace-pre-wrap",
|
|
112
|
+
"font-courier p-4 text-[0.75rem] leading-[1.7] normal-case"
|
|
113
|
+
),
|
|
114
|
+
dangerouslySetInnerHTML: {
|
|
115
|
+
__html: html + '<span class="blink inline-block dither ml-0.5 h-[1em] w-[1ch]"></span>'
|
|
116
|
+
},
|
|
117
|
+
ref: bodyRef,
|
|
118
|
+
style: { height }
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRlcm1pbmFsRGVtbyh7XG4gIGFyaWFMYWJlbCA9ICdUZXJtaW5hbCBEZW1vJyxcbiAgY2xhc3NOYW1lLFxuICBoZWlnaHQgPSAzMjAsXG4gIGxhYmVsID0gJ1Rlcm1pbmFsJyxcbiAgbG9vcERlbGF5TXMgPSAxMDAwLFxuICBvdXRwdXRMaW5lRGVsYXlNcyA9IDUwLFxuICBzZXF1ZW5jZVxufTogVGVybWluYWxEZW1vUHJvcHMpIHtcbiAgY29uc3QgYm9keVJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3Qgc3RhcnRlZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgW2h0bWwsIHNldEh0bWxdID0gdXNlU3RhdGUoJycpXG5cbiAgY29uc3QgcnVuRGVtbyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoc3RhcnRlZFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzdGFydGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgbGV0IGNvbnRlbnQgPSAnJ1xuXG4gICAgY29uc3QgcmVuZGVyID0gKGg6IHN0cmluZykgPT4ge1xuICAgICAgY29udGVudCA9IGhcbiAgICAgIHNldEh0bWwoaClcbiAgICB9XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc2VxdWVuY2UpIHtcbiAgICAgICAgc3dpdGNoIChzdGVwLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdjbGVhcic6XG4gICAgICAgICAgICBjb250ZW50ID0gJydcbiAgICAgICAgICAgIHJlbmRlcignJylcblxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgJ291dHB1dCc6XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RlcC5saW5lcykge1xuICAgICAgICAgICAgICByZW5kZXIoY29udGVudCArICdcXG4nICsgbGluZSlcbiAgICAgICAgICAgICAgYXdhaXQgc2xlZXAob3V0cHV0TGluZURlbGF5TXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlICdwYXVzZSc6XG4gICAgICAgICAgICBhd2FpdCBzbGVlcChzdGVwLm1zKVxuXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSAncHJvbXB0JzpcbiAgICAgICAgICAgIHJlbmRlcihjb250ZW50ICsgYDxzcGFuIGNsYXNzPVwidGV4dC1taWRncm91bmRcIj4ke3N0ZXAudGV4dH08L3NwYW4+YClcblxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyIG9mIHN0ZXAudGV4dCkge1xuICAgICAgICAgICAgICByZW5kZXIoY29udGVudCArIGNoYXIpXG4gICAgICAgICAgICAgIGF3YWl0IHNsZWVwKHN0ZXAuZGVsYXkgPz8gMzApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29udGVudCA9ICcnXG4gICAgICByZW5kZXIoJycpXG4gICAgICBhd2FpdCBzbGVlcChsb29wRGVsYXlNcylcbiAgICB9XG4gIH0sIFtsb29wRGVsYXlNcywgb3V0cHV0TGluZURlbGF5TXMsIHNlcXVlbmNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gYm9keVJlZi5jdXJyZW50Py5jbG9zZXN0KCdbZGF0YS1kZW1vLXJvb3RdJylcblxuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgICAgZW50cmllcyA9PiB7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICBydW5EZW1vKClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgeyB0aHJlc2hvbGQ6IDAuMyB9XG4gICAgKVxuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbClcblxuICAgIHJldHVybiAoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgfSwgW3J1bkRlbW9dKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGJvZHlSZWYuY3VycmVudCkge1xuICAgICAgYm9keVJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IGJvZHlSZWYuY3VycmVudC5zY3JvbGxIZWlnaHRcbiAgICB9XG4gIH0sIFtodG1sXSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGFyaWEtbGFiZWw9e2FyaWFMYWJlbH1cbiAgICAgIGNsYXNzTmFtZT17Y24oJ2JvcmRlci00IGJvcmRlci1kb3VibGUgYm9yZGVyLWluaGVyaXQnLCBjbGFzc05hbWUpfVxuICAgICAgZGF0YS1kZW1vLXJvb3RcbiAgICAgIHJvbGU9XCJpbWdcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgYm9yZGVyLWIgYm9yZGVyLWN1cnJlbnQvMTAgcHgtMyBweS0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMS41XCI+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLW1pZGdyb3VuZCBzaXplLTIgcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IG1peEJsZW5kTW9kZTogJ3BsdXMtbGlnaHRlcicgfX1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmctbWlkZ3JvdW5kLzYwIHNpemUtMiByb3VuZGVkLWZ1bGxcIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJnLW1pZGdyb3VuZC8zMCBzaXplLTIgcm91bmRlZC1mdWxsXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1jb3VyaWVyIHRleHQtZGlzcGxheSB0ZXh0LXhzIHRyYWNraW5nLXdpZGVzdCB0ZXh0LXRleHQtdGVydGlhcnlcIj5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ292ZXJmbG93LXgtaGlkZGVuIG92ZXJmbG93LXktYXV0byB3aGl0ZXNwYWNlLXByZS13cmFwJyxcbiAgICAgICAgICAnZm9udC1jb3VyaWVyIHAtNCB0ZXh0LVswLjc1cmVtXSBsZWFkaW5nLVsxLjddIG5vcm1hbC1jYXNlJ1xuICAgICAgICApfVxuICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgIF9faHRtbDpcbiAgICAgICAgICAgIGh0bWwgK1xuICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiYmxpbmsgaW5saW5lLWJsb2NrIGRpdGhlciBtbC0wLjUgaC1bMWVtXSB3LVsxY2hdXCI+PC9zcGFuPidcbiAgICAgICAgfX1cbiAgICAgICAgcmVmPXtib2R5UmVmfVxuICAgICAgICBzdHlsZT17eyBoZWlnaHQgfX1cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuaW50ZXJmYWNlIENsZWFyU3RlcCB7XG4gIHR5cGU6ICdjbGVhcidcbn1cblxuaW50ZXJmYWNlIE91dHB1dFN0ZXAge1xuICBsaW5lczogc3RyaW5nW11cbiAgdHlwZTogJ291dHB1dCdcbn1cblxuaW50ZXJmYWNlIFBhdXNlU3RlcCB7XG4gIG1zOiBudW1iZXJcbiAgdHlwZTogJ3BhdXNlJ1xufVxuXG5pbnRlcmZhY2UgUHJvbXB0U3RlcCB7XG4gIHRleHQ6IHN0cmluZ1xuICB0eXBlOiAncHJvbXB0J1xufVxuXG5pbnRlcmZhY2UgVGVybWluYWxEZW1vUHJvcHMge1xuICBhcmlhTGFiZWw/OiBzdHJpbmdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIGhlaWdodD86IG51bWJlciB8IHN0cmluZ1xuICBsYWJlbD86IHN0cmluZ1xuICBsb29wRGVsYXlNcz86IG51bWJlclxuICBvdXRwdXRMaW5lRGVsYXlNcz86IG51bWJlclxuICBzZXF1ZW5jZTogVGVybWluYWxEZW1vU3RlcFtdXG59XG5cbmV4cG9ydCB0eXBlIFRlcm1pbmFsRGVtb1N0ZXAgPVxuICB8IENsZWFyU3RlcFxuICB8IE91dHB1dFN0ZXBcbiAgfCBQYXVzZVN0ZXBcbiAgfCBQcm9tcHRTdGVwXG4gIHwgVHlwZVN0ZXBcblxuaW50ZXJmYWNlIFR5cGVTdGVwIHtcbiAgZGVsYXk/OiBudW1iZXJcbiAgdGV4dDogc3RyaW5nXG4gIHR5cGU6ICd0eXBlJ1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQW9IUSxTQUNFLEtBREY7QUFsSFIsU0FBUyxhQUFhLFdBQVcsUUFBUSxnQkFBZ0I7QUFFekQsU0FBUyxVQUFVO0FBRW5CLFNBQVMsTUFBTSxJQUFZO0FBQ3pCLFNBQU8sSUFBSSxRQUFjLGFBQVcsV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUM3RDtBQUVPLGdCQUFTLGFBQWE7QUFBQSxFQUMzQixZQUFZO0FBQUEsRUFDWjtBQUFBLEVBQ0EsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1IsY0FBYztBQUFBLEVBQ2Qsb0JBQW9CO0FBQUEsRUFDcEI7QUFDRixHQUFzQjtBQUNwQixRQUFNLFVBQVUsT0FBdUIsSUFBSTtBQUMzQyxRQUFNLGFBQWEsT0FBTyxLQUFLO0FBQy9CLFFBQU0sQ0FBQyxNQUFNLE9BQU8sSUFBSSxTQUFTLEVBQUU7QUFFbkMsUUFBTSxVQUFVLFlBQVksWUFBWTtBQUN0QyxRQUFJLFdBQVcsU0FBUztBQUN0QjtBQUFBLElBQ0Y7QUFFQSxlQUFXLFVBQVU7QUFDckIsUUFBSSxVQUFVO0FBRWQsVUFBTSxTQUFTLENBQUMsTUFBYztBQUM1QixnQkFBVTtBQUNWLGNBQVEsQ0FBQztBQUFBLElBQ1g7QUFFQSxlQUFTO0FBQ1AsaUJBQVcsUUFBUSxVQUFVO0FBQzNCLGdCQUFRLEtBQUssTUFBTTtBQUFBLFVBQ2pCLEtBQUs7QUFDSCxzQkFBVTtBQUNWLG1CQUFPLEVBQUU7QUFFVDtBQUFBLFVBRUYsS0FBSztBQUNILHVCQUFXLFFBQVEsS0FBSyxPQUFPO0FBQzdCLHFCQUFPLFVBQVUsT0FBTyxJQUFJO0FBQzVCLG9CQUFNLE1BQU0saUJBQWlCO0FBQUEsWUFDL0I7QUFFQTtBQUFBLFVBRUYsS0FBSztBQUNILGtCQUFNLE1BQU0sS0FBSyxFQUFFO0FBRW5CO0FBQUEsVUFFRixLQUFLO0FBQ0gsbUJBQU8sVUFBVSxnQ0FBZ0MsS0FBSyxJQUFJLFNBQVM7QUFFbkU7QUFBQSxVQUVGLEtBQUs7QUFDSCx1QkFBVyxRQUFRLEtBQUssTUFBTTtBQUM1QixxQkFBTyxVQUFVLElBQUk7QUFDckIsb0JBQU0sTUFBTSxLQUFLLFNBQVMsRUFBRTtBQUFBLFlBQzlCO0FBRUE7QUFBQSxRQUNKO0FBQUEsTUFDRjtBQUVBLGdCQUFVO0FBQ1YsYUFBTyxFQUFFO0FBQ1QsWUFBTSxNQUFNLFdBQVc7QUFBQSxJQUN6QjtBQUFBLEVBQ0YsR0FBRyxDQUFDLGFBQWEsbUJBQW1CLFFBQVEsQ0FBQztBQUU3QyxZQUFVLE1BQU07QUFDZCxVQUFNLEtBQUssUUFBUSxTQUFTLFFBQVEsa0JBQWtCO0FBRXRELFFBQUksQ0FBQyxJQUFJO0FBQ1A7QUFBQSxJQUNGO0FBRUEsVUFBTSxXQUFXLElBQUk7QUFBQSxNQUNuQixhQUFXO0FBQ1QsZ0JBQVEsUUFBUSxXQUFTO0FBQ3ZCLGNBQUksTUFBTSxnQkFBZ0I7QUFDeEIsb0JBQVE7QUFBQSxVQUNWO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLE1BQ0EsRUFBRSxXQUFXLElBQUk7QUFBQSxJQUNuQjtBQUVBLGFBQVMsUUFBUSxFQUFFO0FBRW5CLFdBQU8sTUFBTSxTQUFTLFdBQVc7QUFBQSxFQUNuQyxHQUFHLENBQUMsT0FBTyxDQUFDO0FBRVosWUFBVSxNQUFNO0FBQ2QsUUFBSSxRQUFRLFNBQVM7QUFDbkIsY0FBUSxRQUFRLFlBQVksUUFBUSxRQUFRO0FBQUEsSUFDOUM7QUFBQSxFQUNGLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFFVCxTQUNFO0FBQUEsSUFBQztBQUFBO0FBQUEsTUFDQyxjQUFZO0FBQUEsTUFDWixXQUFXLEdBQUcseUNBQXlDLFNBQVM7QUFBQSxNQUNoRSxrQkFBYztBQUFBLE1BQ2QsTUFBSztBQUFBLE1BRUw7QUFBQSw2QkFBQyxTQUFJLFdBQVUsZ0VBQ2I7QUFBQSwrQkFBQyxTQUFJLFdBQVUsZ0JBQ2I7QUFBQTtBQUFBLGNBQUM7QUFBQTtBQUFBLGdCQUNDLFdBQVU7QUFBQSxnQkFDVixPQUFPLEVBQUUsY0FBYyxlQUFlO0FBQUE7QUFBQSxZQUN4QztBQUFBLFlBRUEsb0JBQUMsVUFBSyxXQUFVLHVDQUFzQztBQUFBLFlBQ3RELG9CQUFDLFVBQUssV0FBVSx1Q0FBc0M7QUFBQSxhQUN4RDtBQUFBLFVBRUEsb0JBQUMsVUFBSyxXQUFVLHdFQUNiLGlCQUNIO0FBQUEsV0FDRjtBQUFBLFFBRUE7QUFBQSxVQUFDO0FBQUE7QUFBQSxZQUNDLFdBQVc7QUFBQSxjQUNUO0FBQUEsY0FDQTtBQUFBLFlBQ0Y7QUFBQSxZQUNBLHlCQUF5QjtBQUFBLGNBQ3ZCLFFBQ0UsT0FDQTtBQUFBLFlBQ0o7QUFBQSxZQUNBLEtBQUs7QUFBQSxZQUNMLE9BQU8sRUFBRSxPQUFPO0FBQUE7QUFBQSxRQUNsQjtBQUFBO0FBQUE7QUFBQSxFQUNGO0FBRUo7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useStore } from "@nanostores/react";
|
|
4
|
+
import { cn } from "../../utils/index.js";
|
|
5
|
+
import { $lightMode, toggleLens } from "./overlays/index.js";
|
|
6
|
+
export function ThemeToggle({ className, style }) {
|
|
7
|
+
const light = useStore($lightMode);
|
|
8
|
+
return /* @__PURE__ */ jsxs(
|
|
9
|
+
"button",
|
|
10
|
+
{
|
|
11
|
+
"aria-label": light ? "Switch to dark mode" : "Switch to light mode",
|
|
12
|
+
className: cn(
|
|
13
|
+
"relative flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full",
|
|
14
|
+
"border border-current/25 bg-current/8 transition-colors",
|
|
15
|
+
"hover:bg-current/15",
|
|
16
|
+
className
|
|
17
|
+
),
|
|
18
|
+
onClick: toggleLens,
|
|
19
|
+
style,
|
|
20
|
+
type: "button",
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ jsxs(
|
|
23
|
+
"svg",
|
|
24
|
+
{
|
|
25
|
+
className: "absolute left-1 size-3.5 opacity-40",
|
|
26
|
+
fill: "none",
|
|
27
|
+
stroke: "currentColor",
|
|
28
|
+
strokeLinecap: "round",
|
|
29
|
+
strokeLinejoin: "round",
|
|
30
|
+
strokeWidth: 2,
|
|
31
|
+
viewBox: "0 0 24 24",
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsx("circle", { cx: 12, cy: 12, r: 5 }),
|
|
34
|
+
/* @__PURE__ */ jsx("path", { d: "M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42" })
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
),
|
|
38
|
+
/* @__PURE__ */ jsx(
|
|
39
|
+
"svg",
|
|
40
|
+
{
|
|
41
|
+
className: "absolute right-1 size-3.5 opacity-40",
|
|
42
|
+
fill: "none",
|
|
43
|
+
stroke: "currentColor",
|
|
44
|
+
strokeLinecap: "round",
|
|
45
|
+
strokeLinejoin: "round",
|
|
46
|
+
strokeWidth: 2,
|
|
47
|
+
viewBox: "0 0 24 24",
|
|
48
|
+
children: /* @__PURE__ */ jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
|
|
49
|
+
}
|
|
50
|
+
),
|
|
51
|
+
/* @__PURE__ */ jsx(
|
|
52
|
+
"span",
|
|
53
|
+
{
|
|
54
|
+
"aria-hidden": true,
|
|
55
|
+
className: cn(
|
|
56
|
+
"bg-midground absolute size-4 rounded-full",
|
|
57
|
+
"transition-transform duration-200 ease-out"
|
|
58
|
+
),
|
|
59
|
+
style: { transform: `translateX(${light ? 2 : 22}px)` }
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZVN0b3JlIH0gZnJvbSAnQG5hbm9zdG9yZXMvcmVhY3QnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vdXRpbHMnXG5cbmltcG9ydCB7ICRsaWdodE1vZGUsIHRvZ2dsZUxlbnMgfSBmcm9tICcuL292ZXJsYXlzJ1xuXG5leHBvcnQgZnVuY3Rpb24gVGhlbWVUb2dnbGUoeyBjbGFzc05hbWUsIHN0eWxlIH06IFRoZW1lVG9nZ2xlUHJvcHMpIHtcbiAgY29uc3QgbGlnaHQgPSB1c2VTdG9yZSgkbGlnaHRNb2RlKVxuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgYXJpYS1sYWJlbD17bGlnaHQgPyAnU3dpdGNoIHRvIGRhcmsgbW9kZScgOiAnU3dpdGNoIHRvIGxpZ2h0IG1vZGUnfVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ3JlbGF0aXZlIGZsZXggaC02IHctMTEgc2hyaW5rLTAgY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICdib3JkZXIgYm9yZGVyLWN1cnJlbnQvMjUgYmctY3VycmVudC84IHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgJ2hvdmVyOmJnLWN1cnJlbnQvMTUnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBvbkNsaWNrPXt0b2dnbGVMZW5zfVxuICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgPHN2Z1xuICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTEgc2l6ZS0zLjUgb3BhY2l0eS00MFwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgc3Ryb2tlTGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIHN0cm9rZVdpZHRoPXsyfVxuICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgID5cbiAgICAgICAgPGNpcmNsZSBjeD17MTJ9IGN5PXsxMn0gcj17NX0gLz5cblxuICAgICAgICA8cGF0aCBkPVwiTTEyIDF2Mk0xMiAyMXYyTTQuMjIgNC4yMmwxLjQyIDEuNDJNMTguMzYgMTguMzZsMS40MiAxLjQyTTEgMTJoMk0yMSAxMmgyTTQuMjIgMTkuNzhsMS40Mi0xLjQyTTE4LjM2IDUuNjRsMS40Mi0xLjQyXCIgLz5cbiAgICAgIDwvc3ZnPlxuXG4gICAgICA8c3ZnXG4gICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHJpZ2h0LTEgc2l6ZS0zLjUgb3BhY2l0eS00MFwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgc3Ryb2tlTGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIHN0cm9rZVdpZHRoPXsyfVxuICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgID5cbiAgICAgICAgPHBhdGggZD1cIk0yMSAxMi43OUE5IDkgMCAxIDEgMTEuMjEgMyA3IDcgMCAwIDAgMjEgMTIuNzl6XCIgLz5cbiAgICAgIDwvc3ZnPlxuXG4gICAgICA8c3BhblxuICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1taWRncm91bmQgYWJzb2x1dGUgc2l6ZS00IHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgJ3RyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMCBlYXNlLW91dCdcbiAgICAgICAgKX1cbiAgICAgICAgc3R5bGU9e3sgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgke2xpZ2h0ID8gMiA6IDIyfXB4KWAgfX1cbiAgICAgIC8+XG4gICAgPC9idXR0b24+XG4gIClcbn1cblxuaW50ZXJmYWNlIFRoZW1lVG9nZ2xlUHJvcHMge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBd0JNLFNBU0UsS0FURjtBQXRCTixTQUFTLGdCQUFnQjtBQUV6QixTQUFTLFVBQVU7QUFFbkIsU0FBUyxZQUFZLGtCQUFrQjtBQUVoQyxnQkFBUyxZQUFZLEVBQUUsV0FBVyxNQUFNLEdBQXFCO0FBQ2xFLFFBQU0sUUFBUSxTQUFTLFVBQVU7QUFFakMsU0FDRTtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsY0FBWSxRQUFRLHdCQUF3QjtBQUFBLE1BQzVDLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLE1BQ0EsU0FBUztBQUFBLE1BQ1Q7QUFBQSxNQUNBLE1BQUs7QUFBQSxNQUVMO0FBQUE7QUFBQSxVQUFDO0FBQUE7QUFBQSxZQUNDLFdBQVU7QUFBQSxZQUNWLE1BQUs7QUFBQSxZQUNMLFFBQU87QUFBQSxZQUNQLGVBQWM7QUFBQSxZQUNkLGdCQUFlO0FBQUEsWUFDZixhQUFhO0FBQUEsWUFDYixTQUFRO0FBQUEsWUFFUjtBQUFBLGtDQUFDLFlBQU8sSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUc7QUFBQSxjQUU5QixvQkFBQyxVQUFLLEdBQUUsc0hBQXFIO0FBQUE7QUFBQTtBQUFBLFFBQy9IO0FBQUEsUUFFQTtBQUFBLFVBQUM7QUFBQTtBQUFBLFlBQ0MsV0FBVTtBQUFBLFlBQ1YsTUFBSztBQUFBLFlBQ0wsUUFBTztBQUFBLFlBQ1AsZUFBYztBQUFBLFlBQ2QsZ0JBQWU7QUFBQSxZQUNmLGFBQWE7QUFBQSxZQUNiLFNBQVE7QUFBQSxZQUVSLDhCQUFDLFVBQUssR0FBRSxtREFBa0Q7QUFBQTtBQUFBLFFBQzVEO0FBQUEsUUFFQTtBQUFBLFVBQUM7QUFBQTtBQUFBLFlBQ0MsZUFBVztBQUFBLFlBQ1gsV0FBVztBQUFBLGNBQ1Q7QUFBQSxjQUNBO0FBQUEsWUFDRjtBQUFBLFlBQ0EsT0FBTyxFQUFFLFdBQVcsY0FBYyxRQUFRLElBQUksRUFBRSxNQUFNO0FBQUE7QUFBQSxRQUN4RDtBQUFBO0FBQUE7QUFBQSxFQUNGO0FBRUo7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selectable tier / pricing card. Full-bleed distorted image background,
|
|
3
|
+
* readable overlay text, and an animated `.arc-border` shimmer on the
|
|
4
|
+
* selected state. Fully presentational — the consumer owns the data
|
|
5
|
+
* (tier schema, price formatting, tier imagery / tints).
|
|
6
|
+
*
|
|
7
|
+
* Visual states:
|
|
8
|
+
* - `selected`: brightens the distortion, activates `.arc-border`, and
|
|
9
|
+
* composites the headline / price with `mix-blend-mode: plus-lighter`
|
|
10
|
+
* so the text lifts off the image regardless of tint.
|
|
11
|
+
* - `isCurrent`: subtle midground-tinted border hint (suppressed when
|
|
12
|
+
* `selected` wins).
|
|
13
|
+
* - `overlay`: optional top-layer color blended with `mix-blend-mode:
|
|
14
|
+
* color` — used for the "highest tier" red treatment on top of any
|
|
15
|
+
* base tint.
|
|
16
|
+
*/
|
|
17
|
+
export declare function TierCard({ badge, bullets, className, image, isCurrent, onSelect, overlay, price, selected, tint, tintStrength, title }: TierCardProps): import("react").JSX.Element;
|
|
18
|
+
export interface TierCardPrice {
|
|
19
|
+
/** Headline price, e.g. `"$20"` or `"Free"`. */
|
|
20
|
+
primary: string;
|
|
21
|
+
/** Small suffix rendered after `primary`, e.g. `"/mo"` or `"first payment"`. */
|
|
22
|
+
primarySuffix?: string;
|
|
23
|
+
/** Optional struck-through comparison price rendered above `primary`, e.g. `"$30"`. */
|
|
24
|
+
secondary?: string;
|
|
25
|
+
/** Small suffix rendered after `secondary`. */
|
|
26
|
+
secondarySuffix?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface TierCardProps {
|
|
29
|
+
/** Small annotation after the title, e.g. `"(current)"`. */
|
|
30
|
+
badge?: React.ReactNode;
|
|
31
|
+
/** Feature list rendered under the price. */
|
|
32
|
+
bullets: React.ReactNode[];
|
|
33
|
+
className?: string;
|
|
34
|
+
/** Background image URL. */
|
|
35
|
+
image: string;
|
|
36
|
+
/** Applies the "current plan" border hint when not `selected`. */
|
|
37
|
+
isCurrent?: boolean;
|
|
38
|
+
onSelect?: () => void;
|
|
39
|
+
/** Color blended with `mix-blend-mode: color` over the image (used for the highest-tier red treatment). */
|
|
40
|
+
overlay?: string;
|
|
41
|
+
price: TierCardPrice;
|
|
42
|
+
/** Applies selected chrome (arc-border shimmer, active distortion, plus-lighter text blend). */
|
|
43
|
+
selected?: boolean;
|
|
44
|
+
/** Shader tint passed through to `ImageDistortion`. */
|
|
45
|
+
tint?: string;
|
|
46
|
+
/** Active / inactive tint strength passed through to `ImageDistortion`. */
|
|
47
|
+
tintStrength?: {
|
|
48
|
+
active: number;
|
|
49
|
+
inactive: number;
|
|
50
|
+
};
|
|
51
|
+
/** Tier name / headline. */
|
|
52
|
+
title: React.ReactNode;
|
|
53
|
+
}
|