@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,41 @@
|
|
|
1
|
+
import { type SocialLink } from './components/socials';
|
|
2
|
+
export declare function Header({ brand, brandHref, className, desktopGridStyle, links, LinkComponent, scramble: scrambleProp, socials, socialsLabel, style, themeLabel, themeToggle }: HeaderProps): import("react").JSX.Element;
|
|
3
|
+
export interface HeaderLink {
|
|
4
|
+
external?: boolean;
|
|
5
|
+
href: string;
|
|
6
|
+
label: string;
|
|
7
|
+
onClick?: React.MouseEventHandler;
|
|
8
|
+
}
|
|
9
|
+
export interface HeaderProps {
|
|
10
|
+
brand?: React.ReactNode;
|
|
11
|
+
brandHref?: string;
|
|
12
|
+
className?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Inline `style` for the desktop `Grid` only — useful for overriding
|
|
15
|
+
* `grid-template-columns` (e.g. to align with a sidebar track) without
|
|
16
|
+
* affecting the mobile bar or drawer.
|
|
17
|
+
*/
|
|
18
|
+
desktopGridStyle?: React.CSSProperties;
|
|
19
|
+
links?: HeaderLink[];
|
|
20
|
+
LinkComponent?: React.ElementType;
|
|
21
|
+
/**
|
|
22
|
+
* Apply the hover-Scramble effect to nav link labels. Defaults to `true`,
|
|
23
|
+
* automatically suppressed on tier-0 GPUs and when the user has
|
|
24
|
+
* `prefers-reduced-motion: reduce`.
|
|
25
|
+
*/
|
|
26
|
+
scramble?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Optional socials shown in a trailing chrome cell on desktop and in the
|
|
29
|
+
* mobile drawer's chrome row. For nav-heavy products (≥ 5 links) prefer
|
|
30
|
+
* passing socials to `<Footer>` instead — the desktop `Grid` only ships
|
|
31
|
+
* column rules through `grid-cols-6`, so brand + many links + chrome can
|
|
32
|
+
* overflow.
|
|
33
|
+
*/
|
|
34
|
+
socials?: SocialLink[];
|
|
35
|
+
socialsLabel?: string;
|
|
36
|
+
style?: React.CSSProperties;
|
|
37
|
+
themeLabel?: string;
|
|
38
|
+
themeToggle?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/** @deprecated Use `SocialLink` from `@nous-research/ui`. Same shape. */
|
|
41
|
+
export type HeaderSocial = SocialLink;
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { AnimatePresence, motion } from "motion/react";
|
|
4
|
+
import { createElement, useCallback, useRef, useState } from "react";
|
|
5
|
+
import { useCssVarDims } from "../hooks/use-css-var-dims.js";
|
|
6
|
+
import { useGpuTier } from "../hooks/use-gpu-tier.js";
|
|
7
|
+
import { cn } from "../utils/index.js";
|
|
8
|
+
import { Blink } from "./components/blink.js";
|
|
9
|
+
import { Cell, Grid } from "./components/grid/index.js";
|
|
10
|
+
import { HoverBg } from "./components/hover-bg.js";
|
|
11
|
+
import { HamburgerIcon } from "./components/icons/hamburger.js";
|
|
12
|
+
import { Scramble } from "./components/scramble.js";
|
|
13
|
+
import { Socials } from "./components/socials.js";
|
|
14
|
+
import { ThemeToggle } from "./components/theme-toggle.js";
|
|
15
|
+
import { H2 } from "./components/typography/h2.js";
|
|
16
|
+
import { Small } from "./components/typography/small.js";
|
|
17
|
+
const DEFAULT_BRAND = /* @__PURE__ */ jsxs("hgroup", { className: "flex flex-col gap-2", children: [
|
|
18
|
+
/* @__PURE__ */ jsx(Small, { children: "Nous" }),
|
|
19
|
+
/* @__PURE__ */ jsx(H2, { children: "Research" })
|
|
20
|
+
] });
|
|
21
|
+
const DEFAULT_LINKS = [
|
|
22
|
+
{ href: "/projects", label: "Projects" },
|
|
23
|
+
{ href: "/participants", label: "Participants" },
|
|
24
|
+
{ href: "/provenance", label: "Provenance" },
|
|
25
|
+
{ href: "/contribute", label: "Contribute" }
|
|
26
|
+
];
|
|
27
|
+
export function Header({
|
|
28
|
+
brand = DEFAULT_BRAND,
|
|
29
|
+
brandHref = "/",
|
|
30
|
+
className,
|
|
31
|
+
desktopGridStyle,
|
|
32
|
+
links = DEFAULT_LINKS,
|
|
33
|
+
LinkComponent = "a",
|
|
34
|
+
scramble: scrambleProp = true,
|
|
35
|
+
socials,
|
|
36
|
+
socialsLabel = "Socials",
|
|
37
|
+
style,
|
|
38
|
+
themeLabel = "Theme",
|
|
39
|
+
themeToggle = false
|
|
40
|
+
}) {
|
|
41
|
+
const ref = useRef(null);
|
|
42
|
+
useCssVarDims("header", ref);
|
|
43
|
+
const gpuTier = useGpuTier();
|
|
44
|
+
const scramble = scrambleProp && gpuTier > 0;
|
|
45
|
+
const [open, setOpen] = useState(false);
|
|
46
|
+
const close = useCallback(() => setOpen(false), []);
|
|
47
|
+
const hasSocials = (socials?.length ?? 0) > 0;
|
|
48
|
+
const hasMobileChrome = themeToggle || hasSocials;
|
|
49
|
+
return /* @__PURE__ */ jsxs("header", { className, ref, style, children: [
|
|
50
|
+
/* @__PURE__ */ jsxs(
|
|
51
|
+
Grid,
|
|
52
|
+
{
|
|
53
|
+
className: "hidden border-t border-b lg:grid",
|
|
54
|
+
style: desktopGridStyle,
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
BrandCell,
|
|
58
|
+
{
|
|
59
|
+
brand,
|
|
60
|
+
href: brandHref,
|
|
61
|
+
LinkComponent
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
links.map((link) => /* @__PURE__ */ jsx(
|
|
65
|
+
NavCell,
|
|
66
|
+
{
|
|
67
|
+
link,
|
|
68
|
+
LinkComponent,
|
|
69
|
+
scramble
|
|
70
|
+
},
|
|
71
|
+
link.href
|
|
72
|
+
)),
|
|
73
|
+
hasSocials && /* @__PURE__ */ jsxs(Cell, { className: "flex items-start justify-between", children: [
|
|
74
|
+
/* @__PURE__ */ jsx(Small, { className: "opacity-50", children: socialsLabel }),
|
|
75
|
+
/* @__PURE__ */ jsx(Socials, { items: socials })
|
|
76
|
+
] }),
|
|
77
|
+
themeToggle && /* @__PURE__ */ jsxs(Cell, { className: "flex items-start justify-between", children: [
|
|
78
|
+
/* @__PURE__ */ jsx(Small, { className: "opacity-50", children: themeLabel }),
|
|
79
|
+
/* @__PURE__ */ jsx(ThemeToggle, {})
|
|
80
|
+
] })
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
/* @__PURE__ */ jsxs(
|
|
85
|
+
"div",
|
|
86
|
+
{
|
|
87
|
+
className: cn(
|
|
88
|
+
"flex items-center justify-between border border-current/20 p-4",
|
|
89
|
+
"lg:hidden"
|
|
90
|
+
),
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ jsx(
|
|
93
|
+
BrandLink,
|
|
94
|
+
{
|
|
95
|
+
brand,
|
|
96
|
+
href: brandHref,
|
|
97
|
+
LinkComponent
|
|
98
|
+
}
|
|
99
|
+
),
|
|
100
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
101
|
+
themeToggle && /* @__PURE__ */ jsx(ThemeToggle, {}),
|
|
102
|
+
/* @__PURE__ */ jsx(
|
|
103
|
+
"button",
|
|
104
|
+
{
|
|
105
|
+
"aria-label": open ? "Close menu" : "Open menu",
|
|
106
|
+
className: "relative z-50 cursor-pointer bg-transparent p-2",
|
|
107
|
+
onClick: () => setOpen((v) => !v),
|
|
108
|
+
type: "button",
|
|
109
|
+
children: /* @__PURE__ */ jsx(HamburgerIcon, { open })
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
] })
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
/* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsx(
|
|
117
|
+
motion.div,
|
|
118
|
+
{
|
|
119
|
+
animate: { opacity: 1 },
|
|
120
|
+
className: cn(
|
|
121
|
+
"bg-background/95 fixed inset-0 z-50 flex flex-col backdrop-blur-sm",
|
|
122
|
+
"p-8 lg:hidden"
|
|
123
|
+
),
|
|
124
|
+
exit: { opacity: 0 },
|
|
125
|
+
initial: { opacity: 0 },
|
|
126
|
+
transition: { duration: 0.2 },
|
|
127
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col border border-current/20", children: [
|
|
128
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-current/20 p-4", children: [
|
|
129
|
+
/* @__PURE__ */ jsx(
|
|
130
|
+
BrandLink,
|
|
131
|
+
{
|
|
132
|
+
brand,
|
|
133
|
+
href: brandHref,
|
|
134
|
+
LinkComponent,
|
|
135
|
+
onClick: close
|
|
136
|
+
}
|
|
137
|
+
),
|
|
138
|
+
/* @__PURE__ */ jsx(
|
|
139
|
+
"button",
|
|
140
|
+
{
|
|
141
|
+
"aria-label": "Close menu",
|
|
142
|
+
className: "cursor-pointer bg-transparent p-2",
|
|
143
|
+
onClick: close,
|
|
144
|
+
type: "button",
|
|
145
|
+
children: /* @__PURE__ */ jsx(HamburgerIcon, { open: true })
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
] }),
|
|
149
|
+
links.map((link) => /* @__PURE__ */ jsx(
|
|
150
|
+
MobileNavLink,
|
|
151
|
+
{
|
|
152
|
+
link,
|
|
153
|
+
LinkComponent,
|
|
154
|
+
onNavigate: close,
|
|
155
|
+
scramble
|
|
156
|
+
},
|
|
157
|
+
link.href
|
|
158
|
+
)),
|
|
159
|
+
hasMobileChrome && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b border-current/20 p-4", children: [
|
|
160
|
+
hasSocials && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
161
|
+
/* @__PURE__ */ jsx(Small, { className: "opacity-50", children: socialsLabel }),
|
|
162
|
+
/* @__PURE__ */ jsx(Socials, { items: socials, onNavigate: close })
|
|
163
|
+
] }),
|
|
164
|
+
themeToggle && hasSocials && /* @__PURE__ */ jsx("span", { className: "flex-1" }),
|
|
165
|
+
themeToggle && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
166
|
+
/* @__PURE__ */ jsx(Small, { className: "opacity-50", children: themeLabel }),
|
|
167
|
+
/* @__PURE__ */ jsx(ThemeToggle, {})
|
|
168
|
+
] })
|
|
169
|
+
] })
|
|
170
|
+
] })
|
|
171
|
+
}
|
|
172
|
+
) })
|
|
173
|
+
] });
|
|
174
|
+
}
|
|
175
|
+
function BrandCell({ brand, href, LinkComponent }) {
|
|
176
|
+
return isExternal(href) ? /* @__PURE__ */ jsx(Cell, { href, ...EXTERNAL_REL, as: "a", children: brand }) : /* @__PURE__ */ jsx(Cell, { as: LinkComponent, href, children: brand });
|
|
177
|
+
}
|
|
178
|
+
function BrandLink({ brand, href, LinkComponent, onClick }) {
|
|
179
|
+
if (isExternal(href)) {
|
|
180
|
+
return /* @__PURE__ */ jsx("a", { href, onClick, ...EXTERNAL_REL, children: brand });
|
|
181
|
+
}
|
|
182
|
+
return createElement(
|
|
183
|
+
LinkComponent,
|
|
184
|
+
{ href, onClick },
|
|
185
|
+
brand
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
function NavCell({ link, LinkComponent, scramble }) {
|
|
189
|
+
const ref = useRef(null);
|
|
190
|
+
const isExt = link.external ?? isExternal(link.href);
|
|
191
|
+
const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
192
|
+
/* @__PURE__ */ jsxs(Small, { children: [
|
|
193
|
+
scramble ? /* @__PURE__ */ jsx(Scramble, { target: ref, children: link.label }) : link.label,
|
|
194
|
+
/* @__PURE__ */ jsx(Blink, {})
|
|
195
|
+
] }),
|
|
196
|
+
/* @__PURE__ */ jsx(HoverBg, {})
|
|
197
|
+
] });
|
|
198
|
+
if (isExt) {
|
|
199
|
+
return /* @__PURE__ */ jsx(
|
|
200
|
+
Cell,
|
|
201
|
+
{
|
|
202
|
+
as: "a",
|
|
203
|
+
className: "group relative cursor-pointer",
|
|
204
|
+
href: link.href,
|
|
205
|
+
onClick: link.onClick,
|
|
206
|
+
ref,
|
|
207
|
+
...EXTERNAL_REL,
|
|
208
|
+
children: inner
|
|
209
|
+
}
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
return /* @__PURE__ */ jsx(
|
|
213
|
+
Cell,
|
|
214
|
+
{
|
|
215
|
+
as: LinkComponent,
|
|
216
|
+
className: "group relative cursor-pointer",
|
|
217
|
+
href: link.href,
|
|
218
|
+
onClick: link.onClick,
|
|
219
|
+
ref,
|
|
220
|
+
children: inner
|
|
221
|
+
}
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
function MobileNavLink({
|
|
225
|
+
link,
|
|
226
|
+
LinkComponent,
|
|
227
|
+
onNavigate,
|
|
228
|
+
scramble
|
|
229
|
+
}) {
|
|
230
|
+
const ref = useRef(null);
|
|
231
|
+
const isExt = link.external ?? isExternal(link.href);
|
|
232
|
+
const className = cn(
|
|
233
|
+
"group relative flex cursor-pointer items-center border-b border-current/20 p-4"
|
|
234
|
+
);
|
|
235
|
+
const onClick = (e) => {
|
|
236
|
+
link.onClick?.(e);
|
|
237
|
+
onNavigate();
|
|
238
|
+
};
|
|
239
|
+
const children = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
240
|
+
/* @__PURE__ */ jsxs(Small, { children: [
|
|
241
|
+
scramble ? /* @__PURE__ */ jsx(Scramble, { target: ref, children: link.label }) : link.label,
|
|
242
|
+
/* @__PURE__ */ jsx(Blink, {})
|
|
243
|
+
] }),
|
|
244
|
+
/* @__PURE__ */ jsx(HoverBg, {})
|
|
245
|
+
] });
|
|
246
|
+
if (isExt) {
|
|
247
|
+
return /* @__PURE__ */ jsx(
|
|
248
|
+
"a",
|
|
249
|
+
{
|
|
250
|
+
className,
|
|
251
|
+
href: link.href,
|
|
252
|
+
onClick,
|
|
253
|
+
ref,
|
|
254
|
+
...EXTERNAL_REL,
|
|
255
|
+
children
|
|
256
|
+
}
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
return createElement(
|
|
260
|
+
LinkComponent,
|
|
261
|
+
{ className, href: link.href, onClick, ref },
|
|
262
|
+
children
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
const EXTERNAL_REL = {
|
|
266
|
+
rel: "noopener noreferrer",
|
|
267
|
+
target: "_blank"
|
|
268
|
+
};
|
|
269
|
+
const isExternal = (href) => /^(https?:|mailto:|tel:)/i.test(href);
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IEFuaW1hdGVQcmVzZW5jZSwgbW90aW9uIH0gZnJvbSAnbW90aW9uL3JlYWN0J1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgdXNlQ3NzVmFyRGltcyB9IGZyb20gJy4uL2hvb2tzL3VzZS1jc3MtdmFyLWRpbXMnXG5pbXBvcnQgeyB1c2VHcHVUaWVyIH0gZnJvbSAnLi4vaG9va3MvdXNlLWdwdS10aWVyJ1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi91dGlscydcblxuaW1wb3J0IHsgQmxpbmsgfSBmcm9tICcuL2NvbXBvbmVudHMvYmxpbmsnXG5pbXBvcnQgeyBDZWxsLCBHcmlkIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQnXG5pbXBvcnQgeyBIb3ZlckJnIH0gZnJvbSAnLi9jb21wb25lbnRzL2hvdmVyLWJnJ1xuaW1wb3J0IHsgSGFtYnVyZ2VySWNvbiB9IGZyb20gJy4vY29tcG9uZW50cy9pY29ucy9oYW1idXJnZXInXG5pbXBvcnQgeyBTY3JhbWJsZSB9IGZyb20gJy4vY29tcG9uZW50cy9zY3JhbWJsZSdcbmltcG9ydCB7IFNvY2lhbHMsIHR5cGUgU29jaWFsTGluayB9IGZyb20gJy4vY29tcG9uZW50cy9zb2NpYWxzJ1xuaW1wb3J0IHsgVGhlbWVUb2dnbGUgfSBmcm9tICcuL2NvbXBvbmVudHMvdGhlbWUtdG9nZ2xlJ1xuaW1wb3J0IHsgSDIgfSBmcm9tICcuL2NvbXBvbmVudHMvdHlwb2dyYXBoeS9oMidcbmltcG9ydCB7IFNtYWxsIH0gZnJvbSAnLi9jb21wb25lbnRzL3R5cG9ncmFwaHkvc21hbGwnXG5cbmNvbnN0IERFRkFVTFRfQlJBTkQgPSAoXG4gIDxoZ3JvdXAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgIDxTbWFsbD5Ob3VzPC9TbWFsbD5cblxuICAgIDxIMj5SZXNlYXJjaDwvSDI+XG4gIDwvaGdyb3VwPlxuKVxuXG5jb25zdCBERUZBVUxUX0xJTktTOiBIZWFkZXJMaW5rW10gPSBbXG4gIHsgaHJlZjogJy9wcm9qZWN0cycsIGxhYmVsOiAnUHJvamVjdHMnIH0sXG4gIHsgaHJlZjogJy9wYXJ0aWNpcGFudHMnLCBsYWJlbDogJ1BhcnRpY2lwYW50cycgfSxcbiAgeyBocmVmOiAnL3Byb3ZlbmFuY2UnLCBsYWJlbDogJ1Byb3ZlbmFuY2UnIH0sXG4gIHsgaHJlZjogJy9jb250cmlidXRlJywgbGFiZWw6ICdDb250cmlidXRlJyB9XG5dXG5cbmV4cG9ydCBmdW5jdGlvbiBIZWFkZXIoe1xuICBicmFuZCA9IERFRkFVTFRfQlJBTkQsXG4gIGJyYW5kSHJlZiA9ICcvJyxcbiAgY2xhc3NOYW1lLFxuICBkZXNrdG9wR3JpZFN0eWxlLFxuICBsaW5rcyA9IERFRkFVTFRfTElOS1MsXG4gIExpbmtDb21wb25lbnQgPSAnYScsXG4gIHNjcmFtYmxlOiBzY3JhbWJsZVByb3AgPSB0cnVlLFxuICBzb2NpYWxzLFxuICBzb2NpYWxzTGFiZWwgPSAnU29jaWFscycsXG4gIHN0eWxlLFxuICB0aGVtZUxhYmVsID0gJ1RoZW1lJyxcbiAgdGhlbWVUb2dnbGUgPSBmYWxzZVxufTogSGVhZGVyUHJvcHMpIHtcbiAgY29uc3QgcmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PihudWxsKVxuICB1c2VDc3NWYXJEaW1zKCdoZWFkZXInLCByZWYpXG5cbiAgLy8gU2tpcCB0aGUgaG92ZXItU2NyYW1ibGUgckFGIGxvb3Agb24gdGllci0wIGRldmljZXMgKG5vIEdQVSAvIHNvZnR3YXJlXG4gIC8vIHJlbmRlcmVyIC8gYHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZWApIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb3AuXG4gIGNvbnN0IGdwdVRpZXIgPSB1c2VHcHVUaWVyKClcbiAgY29uc3Qgc2NyYW1ibGUgPSBzY3JhbWJsZVByb3AgJiYgZ3B1VGllciA+IDBcblxuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgY2xvc2UgPSB1c2VDYWxsYmFjaygoKSA9PiBzZXRPcGVuKGZhbHNlKSwgW10pXG5cbiAgY29uc3QgaGFzU29jaWFscyA9IChzb2NpYWxzPy5sZW5ndGggPz8gMCkgPiAwXG4gIGNvbnN0IGhhc01vYmlsZUNocm9tZSA9IHRoZW1lVG9nZ2xlIHx8IGhhc1NvY2lhbHNcblxuICByZXR1cm4gKFxuICAgIDxoZWFkZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9IHJlZj17cmVmfSBzdHlsZT17c3R5bGV9PlxuICAgICAgPEdyaWRcbiAgICAgICAgY2xhc3NOYW1lPVwiaGlkZGVuIGJvcmRlci10IGJvcmRlci1iIGxnOmdyaWRcIlxuICAgICAgICBzdHlsZT17ZGVza3RvcEdyaWRTdHlsZX1cbiAgICAgID5cbiAgICAgICAgPEJyYW5kQ2VsbFxuICAgICAgICAgIGJyYW5kPXticmFuZH1cbiAgICAgICAgICBocmVmPXticmFuZEhyZWZ9XG4gICAgICAgICAgTGlua0NvbXBvbmVudD17TGlua0NvbXBvbmVudH1cbiAgICAgICAgLz5cblxuICAgICAgICB7bGlua3MubWFwKGxpbmsgPT4gKFxuICAgICAgICAgIDxOYXZDZWxsXG4gICAgICAgICAgICBrZXk9e2xpbmsuaHJlZn1cbiAgICAgICAgICAgIGxpbms9e2xpbmt9XG4gICAgICAgICAgICBMaW5rQ29tcG9uZW50PXtMaW5rQ29tcG9uZW50fVxuICAgICAgICAgICAgc2NyYW1ibGU9e3NjcmFtYmxlfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuXG4gICAgICAgIHtoYXNTb2NpYWxzICYmIChcbiAgICAgICAgICA8Q2VsbCBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPFNtYWxsIGNsYXNzTmFtZT1cIm9wYWNpdHktNTBcIj57c29jaWFsc0xhYmVsfTwvU21hbGw+XG5cbiAgICAgICAgICAgIDxTb2NpYWxzIGl0ZW1zPXtzb2NpYWxzIX0gLz5cbiAgICAgICAgICA8L0NlbGw+XG4gICAgICAgICl9XG5cbiAgICAgICAge3RoZW1lVG9nZ2xlICYmIChcbiAgICAgICAgICA8Q2VsbCBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPFNtYWxsIGNsYXNzTmFtZT1cIm9wYWNpdHktNTBcIj57dGhlbWVMYWJlbH08L1NtYWxsPlxuXG4gICAgICAgICAgICA8VGhlbWVUb2dnbGUgLz5cbiAgICAgICAgICA8L0NlbGw+XG4gICAgICAgICl9XG4gICAgICA8L0dyaWQ+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlciBib3JkZXItY3VycmVudC8yMCBwLTQnLFxuICAgICAgICAgICdsZzpoaWRkZW4nXG4gICAgICAgICl9XG4gICAgICA+XG4gICAgICAgIDxCcmFuZExpbmtcbiAgICAgICAgICBicmFuZD17YnJhbmR9XG4gICAgICAgICAgaHJlZj17YnJhbmRIcmVmfVxuICAgICAgICAgIExpbmtDb21wb25lbnQ9e0xpbmtDb21wb25lbnR9XG4gICAgICAgIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgIHt0aGVtZVRvZ2dsZSAmJiA8VGhlbWVUb2dnbGUgLz59XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBhcmlhLWxhYmVsPXtvcGVuID8gJ0Nsb3NlIG1lbnUnIDogJ09wZW4gbWVudSd9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSB6LTUwIGN1cnNvci1wb2ludGVyIGJnLXRyYW5zcGFyZW50IHAtMlwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKHYgPT4gIXYpfVxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEhhbWJ1cmdlckljb24gb3Blbj17b3Blbn0gLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPEFuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAge29wZW4gJiYgKFxuICAgICAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdiZy1iYWNrZ3JvdW5kLzk1IGZpeGVkIGluc2V0LTAgei01MCBmbGV4IGZsZXgtY29sIGJhY2tkcm9wLWJsdXItc20nLFxuICAgICAgICAgICAgICAncC04IGxnOmhpZGRlbidcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAgfX1cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCB9fVxuICAgICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4yIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGJvcmRlciBib3JkZXItY3VycmVudC8yMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItY3VycmVudC8yMCBwLTRcIj5cbiAgICAgICAgICAgICAgICA8QnJhbmRMaW5rXG4gICAgICAgICAgICAgICAgICBicmFuZD17YnJhbmR9XG4gICAgICAgICAgICAgICAgICBocmVmPXticmFuZEhyZWZ9XG4gICAgICAgICAgICAgICAgICBMaW5rQ29tcG9uZW50PXtMaW5rQ29tcG9uZW50fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17Y2xvc2V9XG4gICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBtZW51XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImN1cnNvci1wb2ludGVyIGJnLXRyYW5zcGFyZW50IHAtMlwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtjbG9zZX1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxIYW1idXJnZXJJY29uIG9wZW4gLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAge2xpbmtzLm1hcChsaW5rID0+IChcbiAgICAgICAgICAgICAgICA8TW9iaWxlTmF2TGlua1xuICAgICAgICAgICAgICAgICAga2V5PXtsaW5rLmhyZWZ9XG4gICAgICAgICAgICAgICAgICBsaW5rPXtsaW5rfVxuICAgICAgICAgICAgICAgICAgTGlua0NvbXBvbmVudD17TGlua0NvbXBvbmVudH1cbiAgICAgICAgICAgICAgICAgIG9uTmF2aWdhdGU9e2Nsb3NlfVxuICAgICAgICAgICAgICAgICAgc2NyYW1ibGU9e3NjcmFtYmxlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICkpfVxuXG4gICAgICAgICAgICAgIHtoYXNNb2JpbGVDaHJvbWUgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgYm9yZGVyLWIgYm9yZGVyLWN1cnJlbnQvMjAgcC00XCI+XG4gICAgICAgICAgICAgICAgICB7aGFzU29jaWFscyAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgPFNtYWxsIGNsYXNzTmFtZT1cIm9wYWNpdHktNTBcIj57c29jaWFsc0xhYmVsfTwvU21hbGw+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U29jaWFscyBpdGVtcz17c29jaWFscyF9IG9uTmF2aWdhdGU9e2Nsb3NlfSAvPlxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICAgIHt0aGVtZVRvZ2dsZSAmJiBoYXNTb2NpYWxzICYmIDxzcGFuIGNsYXNzTmFtZT1cImZsZXgtMVwiIC8+fVxuXG4gICAgICAgICAgICAgICAgICB7dGhlbWVUb2dnbGUgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgIDxTbWFsbCBjbGFzc05hbWU9XCJvcGFjaXR5LTUwXCI+e3RoZW1lTGFiZWx9PC9TbWFsbD5cblxuICAgICAgICAgICAgICAgICAgICAgIDxUaGVtZVRvZ2dsZSAvPlxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICl9XG4gICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICA8L2hlYWRlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBCcmFuZENlbGwoeyBicmFuZCwgaHJlZiwgTGlua0NvbXBvbmVudCB9OiBCcmFuZFNsb3RQcm9wcykge1xuICByZXR1cm4gaXNFeHRlcm5hbChocmVmKSA/IChcbiAgICA8Q2VsbCBocmVmPXtocmVmfSB7Li4uRVhURVJOQUxfUkVMfSBhcz1cImFcIj5cbiAgICAgIHticmFuZH1cbiAgICA8L0NlbGw+XG4gICkgOiAoXG4gICAgPENlbGwgYXM9e0xpbmtDb21wb25lbnR9IGhyZWY9e2hyZWZ9PlxuICAgICAge2JyYW5kfVxuICAgIDwvQ2VsbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBCcmFuZExpbmsoeyBicmFuZCwgaHJlZiwgTGlua0NvbXBvbmVudCwgb25DbGljayB9OiBCcmFuZExpbmtQcm9wcykge1xuICBpZiAoaXNFeHRlcm5hbChocmVmKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8YSBocmVmPXtocmVmfSBvbkNsaWNrPXtvbkNsaWNrfSB7Li4uRVhURVJOQUxfUkVMfT5cbiAgICAgICAge2JyYW5kfVxuICAgICAgPC9hPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgIExpbmtDb21wb25lbnQsXG4gICAgeyBocmVmLCBvbkNsaWNrIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgYnJhbmRcbiAgKVxufVxuXG5mdW5jdGlvbiBOYXZDZWxsKHsgbGluaywgTGlua0NvbXBvbmVudCwgc2NyYW1ibGUgfTogTmF2Q2VsbFByb3BzKSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MQW5jaG9yRWxlbWVudD4obnVsbClcbiAgY29uc3QgaXNFeHQgPSBsaW5rLmV4dGVybmFsID8/IGlzRXh0ZXJuYWwobGluay5ocmVmKVxuXG4gIGNvbnN0IGlubmVyID0gKFxuICAgIDw+XG4gICAgICA8U21hbGw+XG4gICAgICAgIHtzY3JhbWJsZSA/IChcbiAgICAgICAgICA8U2NyYW1ibGUgdGFyZ2V0PXtyZWZ9PntsaW5rLmxhYmVsfTwvU2NyYW1ibGU+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgbGluay5sYWJlbFxuICAgICAgICApfVxuXG4gICAgICAgIDxCbGluayAvPlxuICAgICAgPC9TbWFsbD5cblxuICAgICAgPEhvdmVyQmcgLz5cbiAgICA8Lz5cbiAgKVxuXG4gIGlmIChpc0V4dCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Q2VsbFxuICAgICAgICBhcz1cImFcIlxuICAgICAgICBjbGFzc05hbWU9XCJncm91cCByZWxhdGl2ZSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIGhyZWY9e2xpbmsuaHJlZn1cbiAgICAgICAgb25DbGljaz17bGluay5vbkNsaWNrfVxuICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgey4uLkVYVEVSTkFMX1JFTH1cbiAgICAgID5cbiAgICAgICAge2lubmVyfVxuICAgICAgPC9DZWxsPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENlbGxcbiAgICAgIGFzPXtMaW5rQ29tcG9uZW50fVxuICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAgcmVsYXRpdmUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgaHJlZj17bGluay5ocmVmfVxuICAgICAgb25DbGljaz17bGluay5vbkNsaWNrfVxuICAgICAgcmVmPXtyZWZ9XG4gICAgPlxuICAgICAge2lubmVyfVxuICAgIDwvQ2VsbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBNb2JpbGVOYXZMaW5rKHtcbiAgbGluayxcbiAgTGlua0NvbXBvbmVudCxcbiAgb25OYXZpZ2F0ZSxcbiAgc2NyYW1ibGVcbn06IE1vYmlsZU5hdkxpbmtQcm9wcykge1xuICBjb25zdCByZWYgPSB1c2VSZWY8SFRNTEFuY2hvckVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGlzRXh0ID0gbGluay5leHRlcm5hbCA/PyBpc0V4dGVybmFsKGxpbmsuaHJlZilcblxuICBjb25zdCBjbGFzc05hbWUgPSBjbihcbiAgICAnZ3JvdXAgcmVsYXRpdmUgZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgYm9yZGVyLWIgYm9yZGVyLWN1cnJlbnQvMjAgcC00J1xuICApXG5cbiAgY29uc3Qgb25DbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxBbmNob3JFbGVtZW50PikgPT4ge1xuICAgIGxpbmsub25DbGljaz8uKGUpXG4gICAgb25OYXZpZ2F0ZSgpXG4gIH1cblxuICBjb25zdCBjaGlsZHJlbiA9IChcbiAgICA8PlxuICAgICAgPFNtYWxsPlxuICAgICAgICB7c2NyYW1ibGUgPyAoXG4gICAgICAgICAgPFNjcmFtYmxlIHRhcmdldD17cmVmfT57bGluay5sYWJlbH08L1NjcmFtYmxlPlxuICAgICAgICApIDogKFxuICAgICAgICAgIGxpbmsubGFiZWxcbiAgICAgICAgKX1cblxuICAgICAgICA8QmxpbmsgLz5cbiAgICAgIDwvU21hbGw+XG5cbiAgICAgIDxIb3ZlckJnIC8+XG4gICAgPC8+XG4gIClcblxuICBpZiAoaXNFeHQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGFcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgIGhyZWY9e2xpbmsuaHJlZn1cbiAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIHsuLi5FWFRFUk5BTF9SRUx9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvYT5cbiAgICApXG4gIH1cblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChcbiAgICBMaW5rQ29tcG9uZW50LFxuICAgIHsgY2xhc3NOYW1lLCBocmVmOiBsaW5rLmhyZWYsIG9uQ2xpY2ssIHJlZiB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGNoaWxkcmVuXG4gIClcbn1cblxuY29uc3QgRVhURVJOQUxfUkVMID0ge1xuICByZWw6ICdub29wZW5lciBub3JlZmVycmVyJyxcbiAgdGFyZ2V0OiAnX2JsYW5rJ1xufSBhcyBjb25zdFxuXG5jb25zdCBpc0V4dGVybmFsID0gKGhyZWY6IHN0cmluZykgPT4gL14oaHR0cHM/OnxtYWlsdG86fHRlbDopL2kudGVzdChocmVmKVxuXG5pbnRlcmZhY2UgQnJhbmRMaW5rUHJvcHMgZXh0ZW5kcyBCcmFuZFNsb3RQcm9wcyB7XG4gIG9uQ2xpY2s/OiBSZWFjdC5Nb3VzZUV2ZW50SGFuZGxlclxufVxuXG5pbnRlcmZhY2UgQnJhbmRTbG90UHJvcHMge1xuICBicmFuZDogUmVhY3QuUmVhY3ROb2RlXG4gIGhyZWY6IHN0cmluZ1xuICBMaW5rQ29tcG9uZW50OiBSZWFjdC5FbGVtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlckxpbmsge1xuICBleHRlcm5hbD86IGJvb2xlYW5cbiAgaHJlZjogc3RyaW5nXG4gIGxhYmVsOiBzdHJpbmdcbiAgb25DbGljaz86IFJlYWN0Lk1vdXNlRXZlbnRIYW5kbGVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyUHJvcHMge1xuICBicmFuZD86IFJlYWN0LlJlYWN0Tm9kZVxuICBicmFuZEhyZWY/OiBzdHJpbmdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBJbmxpbmUgYHN0eWxlYCBmb3IgdGhlIGRlc2t0b3AgYEdyaWRgIG9ubHkgXHUyMDE0IHVzZWZ1bCBmb3Igb3ZlcnJpZGluZ1xuICAgKiBgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zYCAoZS5nLiB0byBhbGlnbiB3aXRoIGEgc2lkZWJhciB0cmFjaykgd2l0aG91dFxuICAgKiBhZmZlY3RpbmcgdGhlIG1vYmlsZSBiYXIgb3IgZHJhd2VyLlxuICAgKi9cbiAgZGVza3RvcEdyaWRTdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgbGlua3M/OiBIZWFkZXJMaW5rW11cbiAgTGlua0NvbXBvbmVudD86IFJlYWN0LkVsZW1lbnRUeXBlXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgaG92ZXItU2NyYW1ibGUgZWZmZWN0IHRvIG5hdiBsaW5rIGxhYmVscy4gRGVmYXVsdHMgdG8gYHRydWVgLFxuICAgKiBhdXRvbWF0aWNhbGx5IHN1cHByZXNzZWQgb24gdGllci0wIEdQVXMgYW5kIHdoZW4gdGhlIHVzZXIgaGFzXG4gICAqIGBwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2VgLlxuICAgKi9cbiAgc2NyYW1ibGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzb2NpYWxzIHNob3duIGluIGEgdHJhaWxpbmcgY2hyb21lIGNlbGwgb24gZGVza3RvcCBhbmQgaW4gdGhlXG4gICAqIG1vYmlsZSBkcmF3ZXIncyBjaHJvbWUgcm93LiBGb3IgbmF2LWhlYXZ5IHByb2R1Y3RzIChcdTIyNjUgNSBsaW5rcykgcHJlZmVyXG4gICAqIHBhc3Npbmcgc29jaWFscyB0byBgPEZvb3Rlcj5gIGluc3RlYWQgXHUyMDE0IHRoZSBkZXNrdG9wIGBHcmlkYCBvbmx5IHNoaXBzXG4gICAqIGNvbHVtbiBydWxlcyB0aHJvdWdoIGBncmlkLWNvbHMtNmAsIHNvIGJyYW5kICsgbWFueSBsaW5rcyArIGNocm9tZSBjYW5cbiAgICogb3ZlcmZsb3cuXG4gICAqL1xuICBzb2NpYWxzPzogU29jaWFsTGlua1tdXG4gIHNvY2lhbHNMYWJlbD86IHN0cmluZ1xuICBzdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgdGhlbWVMYWJlbD86IHN0cmluZ1xuICB0aGVtZVRvZ2dsZT86IGJvb2xlYW5cbn1cblxuLyoqIEBkZXByZWNhdGVkIFVzZSBgU29jaWFsTGlua2AgZnJvbSBgQG5vdXMtcmVzZWFyY2gvdWlgLiBTYW1lIHNoYXBlLiAqL1xuZXhwb3J0IHR5cGUgSGVhZGVyU29jaWFsID0gU29jaWFsTGlua1xuXG5pbnRlcmZhY2UgTW9iaWxlTmF2TGlua1Byb3BzIHtcbiAgbGluazogSGVhZGVyTGlua1xuICBMaW5rQ29tcG9uZW50OiBSZWFjdC5FbGVtZW50VHlwZVxuICBvbk5hdmlnYXRlOiAoKSA9PiB2b2lkXG4gIHNjcmFtYmxlOiBib29sZWFuXG59XG5cbmludGVyZmFjZSBOYXZDZWxsUHJvcHMge1xuICBsaW5rOiBIZWFkZXJMaW5rXG4gIExpbmtDb21wb25lbnQ6IFJlYWN0LkVsZW1lbnRUeXBlXG4gIHNjcmFtYmxlOiBib29sZWFuXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBb0JFLFNBc0prQixVQXJKaEIsS0FERjtBQWxCRixTQUFTLGlCQUFpQixjQUFjO0FBQ3hDLFNBQVMsZUFBZSxhQUFhLFFBQVEsZ0JBQWdCO0FBRTdELFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsVUFBVTtBQUVuQixTQUFTLGFBQWE7QUFDdEIsU0FBUyxNQUFNLFlBQVk7QUFDM0IsU0FBUyxlQUFlO0FBQ3hCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMs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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function LayoutWrapper({ children }: Readonly<React.PropsWithChildren>): import("react").JSX.Element;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
export function LayoutWrapper({
|
|
3
|
+
children
|
|
4
|
+
}) {
|
|
5
|
+
return /* @__PURE__ */ jsx("html", { lang: "en", children: /* @__PURE__ */ jsx("body", { className: "text-text-primary bg-black antialiased", children }) });
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGZ1bmN0aW9uIExheW91dFdyYXBwZXIoe1xuICBjaGlsZHJlblxufTogUmVhZG9ubHk8UmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW4+KSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWwgbGFuZz1cImVuXCI+XG4gICAgICA8Ym9keSBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtcHJpbWFyeSBiZy1ibGFjayBhbnRpYWxpYXNlZFwiPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApXG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFLTTtBQUxDLGdCQUFTLGNBQWM7QUFBQSxFQUM1QjtBQUNGLEdBQXNDO0FBQ3BDLFNBQ0Usb0JBQUMsVUFBSyxNQUFLLE1BQ1QsOEJBQUMsVUFBSyxXQUFVLDBDQUNiLFVBQ0gsR0FDRjtBQUVKOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const hexToRgb: (hex: string) => number[];
|
|
2
|
+
export declare const rgbToHex: (r: number, g: number, b: number) => string;
|
|
3
|
+
export declare const colorDodge: (base: string, blend: string) => string;
|
|
4
|
+
export declare const colorMix: (color: string, alpha: number) => string;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const hexToRgb = (hex) => [
|
|
2
|
+
parseInt(hex.slice(1, 3), 16),
|
|
3
|
+
parseInt(hex.slice(3, 5), 16),
|
|
4
|
+
parseInt(hex.slice(5, 7), 16)
|
|
5
|
+
];
|
|
6
|
+
export const rgbToHex = (r, g, b) => `#${[r, g, b].map((v) => v.toString(16).padStart(2, "0")).join("")}`;
|
|
7
|
+
export const colorDodge = (base, blend) => {
|
|
8
|
+
const [br, bg, bb] = hexToRgb(base);
|
|
9
|
+
const [lr, lg, lb] = hexToRgb(blend);
|
|
10
|
+
const d = (b, l) => l === 255 ? 255 : Math.min(255, Math.floor(b * 255 / (255 - l)));
|
|
11
|
+
return rgbToHex(d(br, lr), d(bg, lg), d(bb, lb));
|
|
12
|
+
};
|
|
13
|
+
export const colorMix = (color, alpha) => `color-mix(in srgb, ${color} ${Math.round(alpha * 100)}%, transparent)`;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGNvbnN0IGhleFRvUmdiID0gKGhleDogc3RyaW5nKSA9PiBbXG4gIHBhcnNlSW50KGhleC5zbGljZSgxLCAzKSwgMTYpLFxuICBwYXJzZUludChoZXguc2xpY2UoMywgNSksIDE2KSxcbiAgcGFyc2VJbnQoaGV4LnNsaWNlKDUsIDcpLCAxNilcbl1cblxuZXhwb3J0IGNvbnN0IHJnYlRvSGV4ID0gKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpID0+XG4gIGAjJHtbciwgZywgYl0ubWFwKHYgPT4gdi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YFxuXG5leHBvcnQgY29uc3QgY29sb3JEb2RnZSA9IChiYXNlOiBzdHJpbmcsIGJsZW5kOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgW2JyLCBiZywgYmJdID0gaGV4VG9SZ2IoYmFzZSlcbiAgY29uc3QgW2xyLCBsZywgbGJdID0gaGV4VG9SZ2IoYmxlbmQpXG5cbiAgY29uc3QgZCA9IChiOiBudW1iZXIsIGw6IG51bWJlcikgPT5cbiAgICBsID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IoKGIgKiAyNTUpIC8gKDI1NSAtIGwpKSlcblxuICByZXR1cm4gcmdiVG9IZXgoZChiciwgbHIpLCBkKGJnLCBsZyksIGQoYmIsIGxiKSlcbn1cblxuZXhwb3J0IGNvbnN0IGNvbG9yTWl4ID0gKGNvbG9yOiBzdHJpbmcsIGFscGhhOiBudW1iZXIpID0+XG4gIGBjb2xvci1taXgoaW4gc3JnYiwgJHtjb2xvcn0gJHtNYXRoLnJvdW5kKGFscGhhICogMTAwKX0lLCB0cmFuc3BhcmVudClgXG4iXSwKICAibWFwcGluZ3MiOiAiQUFBTyxhQUFNLFdBQVcsQ0FBQyxRQUFnQjtBQUFBLEVBQ3ZDLFNBQVMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUU7QUFBQSxFQUM1QixTQUFTLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFO0FBQUEsRUFDNUIsU0FBUyxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRTtBQUM5QjtBQUVPLGFBQU0sV0FBVyxDQUFDLEdBQVcsR0FBVyxNQUM3QyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLE9BQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFFM0QsYUFBTSxhQUFhLENBQUMsTUFBYyxVQUFrQjtBQUN6RCxRQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxTQUFTLElBQUk7QUFDbEMsUUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksU0FBUyxLQUFLO0FBRW5DLFFBQU0sSUFBSSxDQUFDLEdBQVcsTUFDcEIsTUFBTSxNQUFNLE1BQU0sS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFPLElBQUksT0FBUSxNQUFNLEVBQUUsQ0FBQztBQUVuRSxTQUFPLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDakQ7QUFFTyxhQUFNLFdBQVcsQ0FBQyxPQUFlLFVBQ3RDLHNCQUFzQixLQUFLLElBQUksS0FBSyxNQUFNLFFBQVEsR0FBRyxDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ClassValue } from 'clsx';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
import { hexToRgb, rgbToHex } from './color';
|
|
4
|
+
import { polyRef } from './poly';
|
|
5
|
+
import type { PolyComponent, PolyProps, PolyRef } from './poly';
|
|
6
|
+
export { hexToRgb, polyRef, rgbToHex };
|
|
7
|
+
export type { PolyComponent, PolyProps, PolyRef };
|
|
8
|
+
export declare const cn: (...inputs: ClassValue[]) => string;
|
|
9
|
+
export declare const clamp: (v: number, min?: number, max?: number) => number;
|
|
10
|
+
export declare const smoothstep: (edge0: number, edge1: number, x: number) => number;
|
|
11
|
+
export declare const hexToVec3: (hex: string) => THREE.Vector3;
|
|
12
|
+
export declare const truncate: (text: string, options: {
|
|
13
|
+
length: number;
|
|
14
|
+
}) => string;
|
|
15
|
+
export declare const stripWpStyles: (html: string) => string;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { clsx } from "clsx";
|
|
2
|
+
import sanitize from "sanitize-html";
|
|
3
|
+
import { twMerge } from "tailwind-merge";
|
|
4
|
+
import * as THREE from "three";
|
|
5
|
+
import { hexToRgb, rgbToHex } from "./color.js";
|
|
6
|
+
import { polyRef } from "./poly.js";
|
|
7
|
+
export { hexToRgb, polyRef, rgbToHex };
|
|
8
|
+
export const cn = (...inputs) => twMerge(clsx(inputs));
|
|
9
|
+
export const clamp = (v, min = 0, max = 1) => Math.min(max, Math.max(min, Number.isFinite(v) ? v : min));
|
|
10
|
+
export const smoothstep = (edge0, edge1, x) => {
|
|
11
|
+
const t = clamp((x - edge0) / (edge1 - edge0));
|
|
12
|
+
return t * t * (3 - 2 * t);
|
|
13
|
+
};
|
|
14
|
+
export const hexToVec3 = (hex) => {
|
|
15
|
+
const [r, g, b] = hexToRgb(hex);
|
|
16
|
+
return new THREE.Vector3(r / 255, g / 255, b / 255);
|
|
17
|
+
};
|
|
18
|
+
export const truncate = (text, options) => text.length > options.length ? `${text.slice(0, options.length)}...` : text;
|
|
19
|
+
export const stripWpStyles = (html) => sanitize(html, {
|
|
20
|
+
allowedAttributes: {
|
|
21
|
+
a: ["href", "target", "rel", "name"],
|
|
22
|
+
audio: ["src", "controls"],
|
|
23
|
+
iframe: ["src", "width", "height", "frameborder", "allowfullscreen"],
|
|
24
|
+
img: ["src", "alt", "width", "height", "loading"],
|
|
25
|
+
source: ["src", "type", "srcset"],
|
|
26
|
+
td: ["colspan", "rowspan"],
|
|
27
|
+
th: ["colspan", "rowspan"],
|
|
28
|
+
video: ["src", "controls", "width", "height", "poster"]
|
|
29
|
+
},
|
|
30
|
+
allowedIframeHostnames: [
|
|
31
|
+
"www.youtube.com",
|
|
32
|
+
"youtube.com",
|
|
33
|
+
"player.vimeo.com"
|
|
34
|
+
],
|
|
35
|
+
allowedSchemes: ["http", "https", "mailto"],
|
|
36
|
+
allowedTags: [
|
|
37
|
+
...sanitize.defaults.allowedTags,
|
|
38
|
+
"img",
|
|
39
|
+
"figure",
|
|
40
|
+
"figcaption",
|
|
41
|
+
"iframe",
|
|
42
|
+
"video",
|
|
43
|
+
"audio",
|
|
44
|
+
"source",
|
|
45
|
+
"picture"
|
|
46
|
+
]
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCBzYW5pdGl6ZSBmcm9tICdzYW5pdGl6ZS1odG1sJ1xuaW1wb3J0IHsgdHdNZXJnZSB9IGZyb20gJ3RhaWx3aW5kLW1lcmdlJ1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnXG5cbmltcG9ydCB7IGhleFRvUmdiLCByZ2JUb0hleCB9IGZyb20gJy4vY29sb3InXG5pbXBvcnQgeyBwb2x5UmVmIH0gZnJvbSAnLi9wb2x5J1xuaW1wb3J0IHR5cGUgeyBQb2x5Q29tcG9uZW50LCBQb2x5UHJvcHMsIFBvbHlSZWYgfSBmcm9tICcuL3BvbHknXG5cbmV4cG9ydCB7IGhleFRvUmdiLCBwb2x5UmVmLCByZ2JUb0hleCB9XG5leHBvcnQgdHlwZSB7IFBvbHlDb21wb25lbnQsIFBvbHlQcm9wcywgUG9seVJlZiB9XG5cbmV4cG9ydCBjb25zdCBjbiA9ICguLi5pbnB1dHM6IENsYXNzVmFsdWVbXSkgPT4gdHdNZXJnZShjbHN4KGlucHV0cykpXG5cbmV4cG9ydCBjb25zdCBjbGFtcCA9ICh2OiBudW1iZXIsIG1pbiA9IDAsIG1heCA9IDEpID0+XG4gIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCBOdW1iZXIuaXNGaW5pdGUodikgPyB2IDogbWluKSlcblxuZXhwb3J0IGNvbnN0IHNtb290aHN0ZXAgPSAoZWRnZTA6IG51bWJlciwgZWRnZTE6IG51bWJlciwgeDogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHQgPSBjbGFtcCgoeCAtIGVkZ2UwKSAvIChlZGdlMSAtIGVkZ2UwKSlcblxuICByZXR1cm4gdCAqIHQgKiAoMyAtIDIgKiB0KVxufVxuXG5leHBvcnQgY29uc3QgaGV4VG9WZWMzID0gKGhleDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IFtyLCBnLCBiXSA9IGhleFRvUmdiKGhleClcblxuICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjMociAvIDI1NSwgZyAvIDI1NSwgYiAvIDI1NSlcbn1cblxuZXhwb3J0IGNvbnN0IHRydW5jYXRlID0gKHRleHQ6IHN0cmluZywgb3B0aW9uczogeyBsZW5ndGg6IG51bWJlciB9KSA9PlxuICB0ZXh0Lmxlbmd0aCA+IG9wdGlvbnMubGVuZ3RoID8gYCR7dGV4dC5zbGljZSgwLCBvcHRpb25zLmxlbmd0aCl9Li4uYCA6IHRleHRcblxuZXhwb3J0IGNvbnN0IHN0cmlwV3BTdHlsZXMgPSAoaHRtbDogc3RyaW5nKSA9PlxuICBzYW5pdGl6ZShodG1sLCB7XG4gICAgYWxsb3dlZEF0dHJpYnV0ZXM6IHtcbiAgICAgIGE6IFsnaHJlZicsICd0YXJnZXQnLCAncmVsJywgJ25hbWUnXSxcbiAgICAgIGF1ZGlvOiBbJ3NyYycsICdjb250cm9scyddLFxuICAgICAgaWZyYW1lOiBbJ3NyYycsICd3aWR0aCcsICdoZWlnaHQnLCAnZnJhbWVib3JkZXInLCAnYWxsb3dmdWxsc2NyZWVuJ10sXG4gICAgICBpbWc6IFsnc3JjJywgJ2FsdCcsICd3aWR0aCcsICdoZWlnaHQnLCAnbG9hZGluZyddLFxuICAgICAgc291cmNlOiBbJ3NyYycsICd0eXBlJywgJ3NyY3NldCddLFxuICAgICAgdGQ6IFsnY29sc3BhbicsICdyb3dzcGFuJ10sXG4gICAgICB0aDogWydjb2xzcGFuJywgJ3Jvd3NwYW4nXSxcbiAgICAgIHZpZGVvOiBbJ3NyYycsICdjb250cm9scycsICd3aWR0aCcsICdoZWlnaHQnLCAncG9zdGVyJ11cbiAgICB9LFxuICAgIGFsbG93ZWRJZnJhbWVIb3N0bmFtZXM6IFtcbiAgICAgICd3d3cueW91dHViZS5jb20nLFxuICAgICAgJ3lvdXR1YmUuY29tJyxcbiAgICAgICdwbGF5ZXIudmltZW8uY29tJ1xuICAgIF0sXG4gICAgYWxsb3dlZFNjaGVtZXM6IFsnaHR0cCcsICdodHRwcycsICdtYWlsdG8nXSxcbiAgICBhbGxvd2VkVGFnczogW1xuICAgICAgLi4uc2FuaXRpemUuZGVmYXVsdHMuYWxsb3dlZFRhZ3MsXG4gICAgICAnaW1nJyxcbiAgICAgICdmaWd1cmUnLFxuICAgICAgJ2ZpZ2NhcHRpb24nLFxuICAgICAgJ2lmcmFtZScsXG4gICAgICAndmlkZW8nLFxuICAgICAgJ2F1ZGlvJyxcbiAgICAgICdzb3VyY2UnLFxuICAgICAgJ3BpY3R1cmUnXG4gICAgXVxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBMEIsWUFBWTtBQUN0QyxPQUFPLGNBQWM7QUFDckIsU0FBUyxlQUFlO0FBQ3hCLFlBQVksV0FBVztBQUV2QixTQUFTLFVBQVUsZ0JBQWdCO0FBQ25DLFNBQVMsZUFBZTtBQUd4QixTQUFTLFVBQVUsU0FBUztBQUdyQixhQUFNLEtBQUssSUFBSSxXQUF5QixRQUFRLEtBQUssTUFBTSxDQUFDO0FBRTVELGFBQU0sUUFBUSxDQUFDLEdBQVcsTUFBTSxHQUFHLE1BQU0sTUFDOUMsS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUssT0FBTyxTQUFTLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztBQUVwRCxhQUFNLGFBQWEsQ0FBQyxPQUFlLE9BQWUsTUFBYztBQUNyRSxRQUFNLElBQUksT0FBTyxJQUFJLFVBQVUsUUFBUSxNQUFNO0FBRTdDLFNBQU8sSUFBSSxLQUFLLElBQUksSUFBSTtBQUMxQjtBQUVPLGFBQU0sWUFBWSxDQUFDLFFBQWdCO0FBQ3hDLFFBQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRztBQUU5QixTQUFPLElBQUksTUFBTSxRQUFRLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxHQUFHO0FBQ3BEO0FBRU8sYUFBTSxXQUFXLENBQUMsTUFBYyxZQUNyQyxLQUFLLFNBQVMsUUFBUSxTQUFTLEdBQUcsS0FBSyxNQUFNLEdBQUcsUUFBUSxNQUFNLENBQUMsUUFBUTtBQUVsRSxhQUFNLGdCQUFnQixDQUFDLFNBQzVCLFNBQVMsTUFBTTtBQUFBLEVBQ2IsbUJBQW1CO0FBQUEsSUFDakIsR0FBRyxDQUFDLFFBQVEsVUFBVSxPQUFPLE1BQU07QUFBQSxJQUNuQyxPQUFPLENBQUMsT0FBTyxVQUFVO0FBQUEsSUFDekIsUUFBUSxDQUFDLE9BQU8sU0FBUyxVQUFVLGVBQWUsaUJBQWlCO0FBQUEsSUFDbkUsS0FBSyxDQUFDLE9BQU8sT0FBTyxTQUFTLFVBQVUsU0FBUztBQUFBLElBQ2hELFFBQVEsQ0FBQyxPQUFPLFFBQVEsUUFBUTtBQUFBLElBQ2hDLElBQUksQ0FBQyxXQUFXLFNBQVM7QUFBQSxJQUN6QixJQUFJLENBQUMsV0FBVyxTQUFTO0FBQUEsSUFDekIsT0FBTyxDQUFDLE9BQU8sWUFBWSxTQUFTLFVBQVUsUUFBUTtBQUFBLEVBQ3hEO0FBQUEsRUFDQSx3QkFBd0I7QUFBQSxJQUN0QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBQ0EsZ0JBQWdCLENBQUMsUUFBUSxTQUFTLFFBQVE7QUFBQSxFQUMxQyxhQUFhO0FBQUEsSUFDWCxHQUFHLFNBQVMsU0FBUztBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type PolyProps<T extends React.ElementType, Own extends object = object> = {
|
|
2
|
+
as?: T;
|
|
3
|
+
} & Own & Omit<React.ComponentPropsWithoutRef<T>, 'as' | keyof Own>;
|
|
4
|
+
export type PolyRef<T extends React.ElementType> = React.ComponentPropsWithRef<T>['ref'];
|
|
5
|
+
export type PolyComponent<D extends React.ElementType, Own extends object = object> = <T extends React.ElementType = D>(props: PolyProps<T, Own> & {
|
|
6
|
+
ref?: PolyRef<T>;
|
|
7
|
+
}) => null | React.ReactElement;
|
|
8
|
+
export declare const polyRef: <D extends React.ElementType, Own extends object = object>(render: <T extends React.ElementType = D>(props: PolyProps<T, Own>, ref: PolyRef<T>) => null | React.ReactElement) => PolyComponent<D, Own>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { forwardRef } from "react";
|
|
2
|
+
export const polyRef = forwardRef;
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZm9yd2FyZFJlZiB9IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgdHlwZSBQb2x5UHJvcHM8XG4gIFQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSxcbiAgT3duIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0XG4+ID0geyBhcz86IFQgfSAmIE93biAmIE9taXQ8UmVhY3QuQ29tcG9uZW50UHJvcHNXaXRob3V0UmVmPFQ+LCAnYXMnIHwga2V5b2YgT3duPlxuXG5leHBvcnQgdHlwZSBQb2x5UmVmPFQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZT4gPVxuICBSZWFjdC5Db21wb25lbnRQcm9wc1dpdGhSZWY8VD5bJ3JlZiddXG5cbmV4cG9ydCB0eXBlIFBvbHlDb21wb25lbnQ8XG4gIEQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSxcbiAgT3duIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0XG4+ID0gPFQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IEQ+KFxuICBwcm9wczogUG9seVByb3BzPFQsIE93bj4gJiB7IHJlZj86IFBvbHlSZWY8VD4gfVxuKSA9PiBudWxsIHwgUmVhY3QuUmVhY3RFbGVtZW50XG5cbmV4cG9ydCBjb25zdCBwb2x5UmVmID0gZm9yd2FyZFJlZiBhcyA8XG4gIEQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSxcbiAgT3duIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0XG4+KFxuICByZW5kZXI6IDxUIGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBEPihcbiAgICBwcm9wczogUG9seVByb3BzPFQsIE93bj4sXG4gICAgcmVmOiBQb2x5UmVmPFQ+XG4gICkgPT4gbnVsbCB8IFJlYWN0LlJlYWN0RWxlbWVudFxuKSA9PiBQb2x5Q29tcG9uZW50PEQsIE93bj5cbiJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsa0JBQWtCO0FBaUJwQixhQUFNLFVBQVU7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/package.json
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nastechai-research/ui",
|
|
3
|
+
"version": "0.13.2",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"sideEffects": [
|
|
7
|
+
"**/*.css"
|
|
8
|
+
],
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"src",
|
|
12
|
+
"README.md",
|
|
13
|
+
"CHANGELOG.md"
|
|
14
|
+
],
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./ui/*": {
|
|
23
|
+
"types": "./dist/ui/*.d.ts",
|
|
24
|
+
"import": "./dist/ui/*.js"
|
|
25
|
+
},
|
|
26
|
+
"./utils": {
|
|
27
|
+
"types": "./dist/utils/index.d.ts",
|
|
28
|
+
"import": "./dist/utils/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./utils/*": {
|
|
31
|
+
"types": "./dist/utils/*.d.ts",
|
|
32
|
+
"import": "./dist/utils/*.js"
|
|
33
|
+
},
|
|
34
|
+
"./hooks/*": {
|
|
35
|
+
"types": "./dist/hooks/*.d.ts",
|
|
36
|
+
"import": "./dist/hooks/*.js"
|
|
37
|
+
},
|
|
38
|
+
"./fonts/*": "./dist/fonts/*",
|
|
39
|
+
"./assets/*": "./dist/assets/*",
|
|
40
|
+
"./styles/fonts.css": "./dist/ui/fonts.css",
|
|
41
|
+
"./styles/globals.css": "./dist/ui/globals.css"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@nanostores/react": "^1.1.0",
|
|
45
|
+
"radix-ui": "^1.4.0",
|
|
46
|
+
"class-variance-authority": "^0.7.1",
|
|
47
|
+
"clsx": "^2.1.1",
|
|
48
|
+
"nanostores": "^1.3.0",
|
|
49
|
+
"sanitize-html": "^2.17.4",
|
|
50
|
+
"tailwind-merge": "^3.6.0",
|
|
51
|
+
"tw-animate-css": "^1.4.0",
|
|
52
|
+
"unicode-animations": "^1.0.3"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@observablehq/plot": "^0.6.17",
|
|
56
|
+
"@react-three/fiber": "^9.6.1",
|
|
57
|
+
"@storybook/addon-a11y": "^10.4.0",
|
|
58
|
+
"@storybook/addon-docs": "^10.4.0",
|
|
59
|
+
"@storybook/addon-vitest": "^10.4.0",
|
|
60
|
+
"@storybook/react-vite": "^10.4.0",
|
|
61
|
+
"@tailwindcss/cli": "^4.3.0",
|
|
62
|
+
"@tailwindcss/vite": "^4.3.0",
|
|
63
|
+
"@types/node": "25.8.0",
|
|
64
|
+
"@types/react": "^19.2.14",
|
|
65
|
+
"@types/react-dom": "^19.2.3",
|
|
66
|
+
"@types/sanitize-html": "^2.16.1",
|
|
67
|
+
"@types/three": "^0.184.1",
|
|
68
|
+
"@vitejs/plugin-react": "^6.0.2",
|
|
69
|
+
"@vitest/browser-playwright": "^4.1.6",
|
|
70
|
+
"glob": "^13.0.6",
|
|
71
|
+
"gsap": "^3.15.0",
|
|
72
|
+
"leva": "^0.10.1",
|
|
73
|
+
"mockdate": "^3.0.5",
|
|
74
|
+
"motion": "^12.38.0",
|
|
75
|
+
"msw": "^2.14.6",
|
|
76
|
+
"msw-storybook-addon": "^2.0.7",
|
|
77
|
+
"playwright": "^1.60.0",
|
|
78
|
+
"storybook": "^10.4.0",
|
|
79
|
+
"tailwindcss": "^4.3.0",
|
|
80
|
+
"three": "^0.184.0",
|
|
81
|
+
"typescript": "^6.0.3",
|
|
82
|
+
"unbuild": "^3.6.1",
|
|
83
|
+
"vite": "^8.0.13",
|
|
84
|
+
"vite-plugin-static-copy": "^4.1.0",
|
|
85
|
+
"vitest": "^4.1.6"
|
|
86
|
+
},
|
|
87
|
+
"peerDependencies": {
|
|
88
|
+
"@observablehq/plot": "^0.6.17",
|
|
89
|
+
"@react-three/fiber": "^9.4.0",
|
|
90
|
+
"gsap": "^3.13.0",
|
|
91
|
+
"leva": "^0.10.1",
|
|
92
|
+
"motion": "^12.38.0",
|
|
93
|
+
"react": "^19.0.0",
|
|
94
|
+
"react-dom": "^19.0.0",
|
|
95
|
+
"three": "^0.180.0"
|
|
96
|
+
},
|
|
97
|
+
"peerDependenciesMeta": {
|
|
98
|
+
"three": {
|
|
99
|
+
"optional": true
|
|
100
|
+
},
|
|
101
|
+
"@react-three/fiber": {
|
|
102
|
+
"optional": true
|
|
103
|
+
},
|
|
104
|
+
"@observablehq/plot": {
|
|
105
|
+
"optional": true
|
|
106
|
+
},
|
|
107
|
+
"leva": {
|
|
108
|
+
"optional": true
|
|
109
|
+
},
|
|
110
|
+
"gsap": {
|
|
111
|
+
"optional": true
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"msw": {
|
|
115
|
+
"workerDirectory": [
|
|
116
|
+
"public"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
"description": "The shared design system for React UI @ Nastechai. Components, hooks, utils, fonts, overlays, etc."
|
|
120
|
+
}
|
|
Binary file
|
package/src/assets.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
interface StaticImageData {
|
|
2
|
+
src: string
|
|
3
|
+
height: number
|
|
4
|
+
width: number
|
|
5
|
+
blurDataURL?: string
|
|
6
|
+
blurWidth?: number
|
|
7
|
+
blurHeight?: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
declare module '*.jpg' {
|
|
11
|
+
const content: StaticImageData
|
|
12
|
+
export default content
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
declare module '*.jpeg' {
|
|
16
|
+
const content: StaticImageData
|
|
17
|
+
export default content
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
declare module '*.png' {
|
|
21
|
+
const content: StaticImageData
|
|
22
|
+
export default content
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare module '*.svg' {
|
|
26
|
+
const content: StaticImageData
|
|
27
|
+
export default content
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
declare module '*.gif' {
|
|
31
|
+
const content: StaticImageData
|
|
32
|
+
export default content
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
declare module '*.webp' {
|
|
36
|
+
const content: StaticImageData
|
|
37
|
+
export default content
|
|
38
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|