@sophostechne/ui 0.18.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 +268 -0
- package/README.md +112 -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 +129 -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,513 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite'
|
|
2
|
+
|
|
3
|
+
import fillerBg from '../../assets/filler-bg0.webp'
|
|
4
|
+
import { Poster } from './poster'
|
|
5
|
+
|
|
6
|
+
import type { ComponentProps } from 'react'
|
|
7
|
+
|
|
8
|
+
// Triptych-scoped story type: the gallery/triptych renders thread a
|
|
9
|
+
// `showLabels` toggle through the Controls panel that isn't a Poster prop.
|
|
10
|
+
type TriptychArgs = ComponentProps<typeof Poster> & { showLabels?: boolean }
|
|
11
|
+
type TriptychStory = StoryObj<TriptychArgs>
|
|
12
|
+
|
|
13
|
+
const SCOUT_SRC = fillerBg.src ?? (fillerBg as unknown as string)
|
|
14
|
+
|
|
15
|
+
// Matches the tier visuals from sophos-account-service/src/app/manage-subscription/_components/TierCard.tsx
|
|
16
|
+
const TIERS = [
|
|
17
|
+
{
|
|
18
|
+
label: 'Scout',
|
|
19
|
+
src: SCOUT_SRC,
|
|
20
|
+
subtitle: 'warrior approaches the giant',
|
|
21
|
+
tint: '#88ccaa'
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
label: 'Visor',
|
|
25
|
+
src: '/img/hackit-2.png',
|
|
26
|
+
subtitle: 'helmeted figure, visor drawn',
|
|
27
|
+
tint: '#99bbdd'
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
label: 'Angel',
|
|
31
|
+
src: '/img/hackit-3.jpg',
|
|
32
|
+
subtitle: 'winged, in flight',
|
|
33
|
+
tint: '#ccaa88'
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
label: 'Herald',
|
|
37
|
+
src: '/img/hackit-4.png',
|
|
38
|
+
subtitle: 'plumed helm, armored',
|
|
39
|
+
tint: '#dd8899'
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
label: 'Muse',
|
|
43
|
+
src: '/img/hackit-1.png',
|
|
44
|
+
subtitle: 'portrait, pensive',
|
|
45
|
+
tint: '#ccaa88'
|
|
46
|
+
}
|
|
47
|
+
] as const
|
|
48
|
+
|
|
49
|
+
const HIGHEST_TINT = '#ff4444'
|
|
50
|
+
const HIGHEST_TINT_STRENGTH = { active: 0.55, inactive: 0.35 }
|
|
51
|
+
|
|
52
|
+
const meta: Meta<typeof Poster> = {
|
|
53
|
+
argTypes: {
|
|
54
|
+
aspect: {
|
|
55
|
+
control: 'select',
|
|
56
|
+
options: ['square', 'portrait', 'landscape', 'story', 'wide']
|
|
57
|
+
},
|
|
58
|
+
autoPlay: {
|
|
59
|
+
control: 'select',
|
|
60
|
+
options: ['slash', 'gentle', 'aggressive']
|
|
61
|
+
},
|
|
62
|
+
// `React.ReactNode` props default to Storybook's "object" control, which
|
|
63
|
+
// shows as "Set object" and can't be edited in-place. Force them to
|
|
64
|
+
// plain text / object inputs since that's how they're used in practice.
|
|
65
|
+
body: {
|
|
66
|
+
control: 'text',
|
|
67
|
+
table: { category: 'Dispatch variant' }
|
|
68
|
+
},
|
|
69
|
+
border: { control: 'boolean' },
|
|
70
|
+
channel: { control: 'text' },
|
|
71
|
+
// `children` and `className` are dev-only escape hatches (arbitrary JSX
|
|
72
|
+
// / Tailwind passthrough). Neither is useful for the "record a GIF for
|
|
73
|
+
// socials" workflow, so hide them from the panel to keep it tidy.
|
|
74
|
+
children: { table: { disable: true } },
|
|
75
|
+
className: { table: { disable: true } },
|
|
76
|
+
cornerMarks: { control: 'boolean' },
|
|
77
|
+
eyebrow: {
|
|
78
|
+
control: 'text',
|
|
79
|
+
table: { category: 'Dispatch variant' }
|
|
80
|
+
},
|
|
81
|
+
headline: {
|
|
82
|
+
control: 'object',
|
|
83
|
+
table: { category: 'Dispatch variant' }
|
|
84
|
+
},
|
|
85
|
+
layout: {
|
|
86
|
+
control: 'inline-radio',
|
|
87
|
+
options: ['split', 'stacked'],
|
|
88
|
+
table: { category: 'Dispatch variant' }
|
|
89
|
+
},
|
|
90
|
+
scale: { control: { max: 1, min: 0.25, step: 0.05, type: 'range' } },
|
|
91
|
+
seal: {
|
|
92
|
+
control: 'text',
|
|
93
|
+
table: { category: 'Dispatch variant' }
|
|
94
|
+
},
|
|
95
|
+
signature: { control: 'text' },
|
|
96
|
+
src: { control: 'text' },
|
|
97
|
+
tags: {
|
|
98
|
+
control: 'object',
|
|
99
|
+
table: { category: 'Dispatch variant' }
|
|
100
|
+
},
|
|
101
|
+
tint: { control: 'color' },
|
|
102
|
+
tintStrength: { control: 'object' },
|
|
103
|
+
variant: {
|
|
104
|
+
control: 'inline-radio',
|
|
105
|
+
options: ['vibe', 'dispatch']
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
component: Poster,
|
|
109
|
+
parameters: {
|
|
110
|
+
docs: {
|
|
111
|
+
description: {
|
|
112
|
+
component:
|
|
113
|
+
'A social-ready glitchy card built around the haptic-distortion image component. Defaults to the `vibe` variant — full-bleed distortion with minimal registration chrome — matching the overlay on the Hackit agent website. Switch to `variant="dispatch"` for the broadcast-card layout with copy + sidebar tags.\n\nPoster stories include all five tier images from the `manage-subscription` page so you can screen-record any character on-demand.'
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
layout: 'centered'
|
|
117
|
+
},
|
|
118
|
+
title: 'Components/Data Display/Poster'
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export default meta
|
|
122
|
+
|
|
123
|
+
type Story = StoryObj<typeof Poster>
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Primary story. Full-bleed "Scout" scene (warrior approaching the giant),
|
|
127
|
+
* minimal chrome, just the subtle `Hackit Agent` overlay at the bottom-right.
|
|
128
|
+
* Screen-record one ~7s pass (two 3.6s slash cycles) → export as GIF →
|
|
129
|
+
* attach to the pricing tweet.
|
|
130
|
+
*
|
|
131
|
+
* Rendered at full target resolution (1080×1080). The storybook viewport
|
|
132
|
+
* naturally clamps it via `max-width: 100%` if your window is narrower.
|
|
133
|
+
*/
|
|
134
|
+
export const Vibe: Story = {
|
|
135
|
+
args: {
|
|
136
|
+
aspect: 'square',
|
|
137
|
+
autoPlay: 'slash',
|
|
138
|
+
scale: 1,
|
|
139
|
+
signature: 'Hackit Agent',
|
|
140
|
+
variant: 'vibe'
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** 9:16 for Instagram / TikTok stories and reels. */
|
|
145
|
+
export const VibeStory: Story = {
|
|
146
|
+
args: {
|
|
147
|
+
aspect: 'story',
|
|
148
|
+
autoPlay: 'slash',
|
|
149
|
+
scale: 1,
|
|
150
|
+
signature: 'Hackit Agent',
|
|
151
|
+
variant: 'vibe'
|
|
152
|
+
},
|
|
153
|
+
name: 'Vibe · Story (9:16)'
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** 16:9 for Twitter cards, LinkedIn, Discord embeds. */
|
|
157
|
+
export const VibeLandscape: Story = {
|
|
158
|
+
args: {
|
|
159
|
+
aspect: 'landscape',
|
|
160
|
+
autoPlay: 'slash',
|
|
161
|
+
scale: 1,
|
|
162
|
+
signature: 'Hackit Agent',
|
|
163
|
+
variant: 'vibe'
|
|
164
|
+
},
|
|
165
|
+
name: 'Vibe · Landscape (16:9)'
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** 4:5 — the Instagram feed recommendation. */
|
|
169
|
+
export const VibePortrait: Story = {
|
|
170
|
+
args: {
|
|
171
|
+
aspect: 'portrait',
|
|
172
|
+
autoPlay: 'slash',
|
|
173
|
+
scale: 1,
|
|
174
|
+
signature: 'Hackit Agent',
|
|
175
|
+
variant: 'vibe'
|
|
176
|
+
},
|
|
177
|
+
name: 'Vibe · Portrait (4:5)'
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ─── Tier images, each on its canonical tint ───
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* All five `manage-subscription` tier images in one view, each with the
|
|
184
|
+
* tint from `TierCard.tsx`. Pick whichever one matches the vibe for the
|
|
185
|
+
* release and screen-record it on its own.
|
|
186
|
+
*/
|
|
187
|
+
export const TierGallery: TriptychStory = {
|
|
188
|
+
args: {
|
|
189
|
+
aspect: 'square',
|
|
190
|
+
autoPlay: 'slash',
|
|
191
|
+
border: true,
|
|
192
|
+
cornerMarks: true,
|
|
193
|
+
scale: 0.3,
|
|
194
|
+
showLabels: true,
|
|
195
|
+
variant: 'vibe'
|
|
196
|
+
},
|
|
197
|
+
argTypes: { showLabels: { control: 'boolean' } },
|
|
198
|
+
name: 'Tier Gallery',
|
|
199
|
+
parameters: { layout: 'fullscreen' },
|
|
200
|
+
render: ({ showLabels, ...args }) => (
|
|
201
|
+
<div className="bg-background flex min-h-screen items-center justify-center p-8">
|
|
202
|
+
<div className="grid grid-cols-3 items-start gap-4 xl:grid-cols-5">
|
|
203
|
+
{TIERS.map(tier => (
|
|
204
|
+
<div className="flex flex-col gap-2" key={tier.label}>
|
|
205
|
+
{showLabels && (
|
|
206
|
+
<div className="flex items-baseline justify-between gap-2 px-1">
|
|
207
|
+
<span className="font-mondwest text-[0.75rem] tracking-[0.1875rem] uppercase opacity-80">
|
|
208
|
+
{tier.label}
|
|
209
|
+
</span>
|
|
210
|
+
|
|
211
|
+
<span className="font-courier text-[0.625rem] tracking-widest opacity-40">
|
|
212
|
+
{tier.tint}
|
|
213
|
+
</span>
|
|
214
|
+
</div>
|
|
215
|
+
)}
|
|
216
|
+
|
|
217
|
+
<Poster
|
|
218
|
+
{...args}
|
|
219
|
+
signature={showLabels ? tier.label : undefined}
|
|
220
|
+
src={tier.src}
|
|
221
|
+
tint={tier.tint}
|
|
222
|
+
/>
|
|
223
|
+
|
|
224
|
+
{showLabels && (
|
|
225
|
+
<span className="font-courier px-1 text-[0.625rem] tracking-wider opacity-50">
|
|
226
|
+
{tier.subtitle}
|
|
227
|
+
</span>
|
|
228
|
+
)}
|
|
229
|
+
</div>
|
|
230
|
+
))}
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export const TierScout: Story = {
|
|
237
|
+
args: {
|
|
238
|
+
aspect: 'square',
|
|
239
|
+
autoPlay: 'slash',
|
|
240
|
+
scale: 1,
|
|
241
|
+
signature: 'Hackit Agent',
|
|
242
|
+
src: SCOUT_SRC,
|
|
243
|
+
tint: TIERS[0].tint,
|
|
244
|
+
variant: 'vibe'
|
|
245
|
+
},
|
|
246
|
+
name: 'Tier · Scout'
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export const TierVisor: Story = {
|
|
250
|
+
args: {
|
|
251
|
+
aspect: 'square',
|
|
252
|
+
autoPlay: 'slash',
|
|
253
|
+
scale: 1,
|
|
254
|
+
signature: 'Hackit Agent',
|
|
255
|
+
src: TIERS[1].src,
|
|
256
|
+
tint: TIERS[1].tint,
|
|
257
|
+
variant: 'vibe'
|
|
258
|
+
},
|
|
259
|
+
name: 'Tier · Visor'
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export const TierAngel: Story = {
|
|
263
|
+
args: {
|
|
264
|
+
aspect: 'square',
|
|
265
|
+
autoPlay: 'gentle',
|
|
266
|
+
scale: 1,
|
|
267
|
+
signature: 'Hackit Agent',
|
|
268
|
+
src: TIERS[2].src,
|
|
269
|
+
tint: TIERS[2].tint,
|
|
270
|
+
variant: 'vibe'
|
|
271
|
+
},
|
|
272
|
+
name: 'Tier · Angel'
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export const TierHerald: Story = {
|
|
276
|
+
args: {
|
|
277
|
+
aspect: 'square',
|
|
278
|
+
autoPlay: 'slash',
|
|
279
|
+
scale: 1,
|
|
280
|
+
signature: 'Hackit Agent',
|
|
281
|
+
src: TIERS[3].src,
|
|
282
|
+
tint: TIERS[3].tint,
|
|
283
|
+
variant: 'vibe'
|
|
284
|
+
},
|
|
285
|
+
name: 'Tier · Herald'
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export const TierMuse: Story = {
|
|
289
|
+
args: {
|
|
290
|
+
aspect: 'square',
|
|
291
|
+
autoPlay: 'gentle',
|
|
292
|
+
scale: 1,
|
|
293
|
+
signature: 'Hackit Agent',
|
|
294
|
+
src: TIERS[4].src,
|
|
295
|
+
tint: TIERS[4].tint,
|
|
296
|
+
variant: 'vibe'
|
|
297
|
+
},
|
|
298
|
+
name: 'Tier · Muse'
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Top-tier red-overlay treatment from `TierCard` — use this for the
|
|
303
|
+
* "Sovereign" / highest tier poster.
|
|
304
|
+
*/
|
|
305
|
+
export const TierApex: Story = {
|
|
306
|
+
args: {
|
|
307
|
+
aspect: 'square',
|
|
308
|
+
autoPlay: 'aggressive',
|
|
309
|
+
scale: 1,
|
|
310
|
+
signature: 'Hackit · Apex',
|
|
311
|
+
src: TIERS[3].src,
|
|
312
|
+
tint: HIGHEST_TINT,
|
|
313
|
+
tintStrength: HIGHEST_TINT_STRENGTH,
|
|
314
|
+
variant: 'vibe'
|
|
315
|
+
},
|
|
316
|
+
name: 'Tier · Apex (highest)'
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/** Three vibe tiles side-by-side — same scene, three tier tints. */
|
|
320
|
+
export const VibeTriptychScout: TriptychStory = {
|
|
321
|
+
args: {
|
|
322
|
+
aspect: 'square',
|
|
323
|
+
autoPlay: 'slash',
|
|
324
|
+
border: true,
|
|
325
|
+
cornerMarks: true,
|
|
326
|
+
scale: 0.35,
|
|
327
|
+
showLabels: true,
|
|
328
|
+
variant: 'vibe'
|
|
329
|
+
},
|
|
330
|
+
argTypes: { showLabels: { control: 'boolean' } },
|
|
331
|
+
name: 'Vibe · Triptych (Scout, 3 tints)',
|
|
332
|
+
parameters: { layout: 'fullscreen' },
|
|
333
|
+
// `args` here drives the shared props across all three tiles; per-tile
|
|
334
|
+
// specifics (signature, tint) stay hardcoded inside the render so the
|
|
335
|
+
// triptych keeps its identity while you tweak chrome/scale/etc. from the
|
|
336
|
+
// Controls panel. `showLabels` hides the per-tile signature text.
|
|
337
|
+
render: ({ showLabels, ...args }) => (
|
|
338
|
+
<div className="bg-background flex min-h-screen items-center justify-center p-8">
|
|
339
|
+
<div className="flex items-stretch gap-4">
|
|
340
|
+
<Poster
|
|
341
|
+
{...args}
|
|
342
|
+
signature={showLabels ? 'Studio' : undefined}
|
|
343
|
+
tint="#88ccaa"
|
|
344
|
+
/>
|
|
345
|
+
|
|
346
|
+
<Poster
|
|
347
|
+
{...args}
|
|
348
|
+
signature={showLabels ? 'Pro' : undefined}
|
|
349
|
+
tint="#ccaa88"
|
|
350
|
+
/>
|
|
351
|
+
|
|
352
|
+
<Poster
|
|
353
|
+
{...args}
|
|
354
|
+
signature={showLabels ? 'Sovereign' : undefined}
|
|
355
|
+
tint={HIGHEST_TINT}
|
|
356
|
+
tintStrength={HIGHEST_TINT_STRENGTH}
|
|
357
|
+
/>
|
|
358
|
+
</div>
|
|
359
|
+
</div>
|
|
360
|
+
)
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/** Three vibe tiles, three tier images — mixed character set. */
|
|
364
|
+
export const VibeTriptychMixed: TriptychStory = {
|
|
365
|
+
args: {
|
|
366
|
+
aspect: 'square',
|
|
367
|
+
autoPlay: 'slash',
|
|
368
|
+
border: true,
|
|
369
|
+
cornerMarks: true,
|
|
370
|
+
scale: 0.35,
|
|
371
|
+
showLabels: true,
|
|
372
|
+
variant: 'vibe'
|
|
373
|
+
},
|
|
374
|
+
argTypes: { showLabels: { control: 'boolean' } },
|
|
375
|
+
name: 'Vibe · Triptych (mixed characters)',
|
|
376
|
+
parameters: { layout: 'fullscreen' },
|
|
377
|
+
render: ({ showLabels, ...args }) => (
|
|
378
|
+
<div className="bg-background flex min-h-screen items-center justify-center p-8">
|
|
379
|
+
<div className="flex items-stretch gap-4">
|
|
380
|
+
<Poster
|
|
381
|
+
{...args}
|
|
382
|
+
signature={showLabels ? TIERS[0].label : undefined}
|
|
383
|
+
src={TIERS[0].src}
|
|
384
|
+
tint={TIERS[0].tint}
|
|
385
|
+
/>
|
|
386
|
+
|
|
387
|
+
<Poster
|
|
388
|
+
{...args}
|
|
389
|
+
signature={showLabels ? TIERS[2].label : undefined}
|
|
390
|
+
src={TIERS[2].src}
|
|
391
|
+
tint={TIERS[2].tint}
|
|
392
|
+
/>
|
|
393
|
+
|
|
394
|
+
<Poster
|
|
395
|
+
{...args}
|
|
396
|
+
signature={showLabels ? TIERS[3].label : undefined}
|
|
397
|
+
src={TIERS[3].src}
|
|
398
|
+
tint={HIGHEST_TINT}
|
|
399
|
+
tintStrength={HIGHEST_TINT_STRENGTH}
|
|
400
|
+
/>
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
)
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/** "Gentle" choreography — softer, slower drift. */
|
|
407
|
+
export const VibeGentle: Story = {
|
|
408
|
+
args: {
|
|
409
|
+
aspect: 'square',
|
|
410
|
+
autoPlay: 'gentle',
|
|
411
|
+
scale: 1,
|
|
412
|
+
signature: 'Hackit Agent',
|
|
413
|
+
tint: '#88ccaa',
|
|
414
|
+
variant: 'vibe'
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/** "Aggressive" choreography — rapid multi-directional stabs. */
|
|
419
|
+
export const VibeAggressive: Story = {
|
|
420
|
+
args: {
|
|
421
|
+
aspect: 'square',
|
|
422
|
+
autoPlay: 'aggressive',
|
|
423
|
+
scale: 1,
|
|
424
|
+
signature: 'Hackit Agent',
|
|
425
|
+
tint: HIGHEST_TINT,
|
|
426
|
+
variant: 'vibe'
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// ─── Dispatch variants (in the backpocket if copy ends up on the poster) ───
|
|
431
|
+
|
|
432
|
+
/** Full broadcast-card layout with copy, sidebar tags, and chrome. */
|
|
433
|
+
export const DispatchPricingTeaser: Story = {
|
|
434
|
+
args: {
|
|
435
|
+
aspect: 'square',
|
|
436
|
+
body: 'New tiers. Same autonomous agent, scaled to how you actually run it — solo on a laptop, shared across a team, or sovereign on your own hardware.',
|
|
437
|
+
channel: 'SOPHOS • HACKIT AGENT',
|
|
438
|
+
eyebrow: 'PRICING / 2026',
|
|
439
|
+
headline: ['Pricing', 'That Grows', 'With You.'],
|
|
440
|
+
scale: 1,
|
|
441
|
+
seal: 'v0.9 · 2026',
|
|
442
|
+
signature: 'SophosTechne.com/hackit-agent',
|
|
443
|
+
tags: ['Studio · free', 'Pro · $20/mo', 'Sovereign · on-prem'],
|
|
444
|
+
tint: '#ccaa88',
|
|
445
|
+
variant: 'dispatch'
|
|
446
|
+
},
|
|
447
|
+
name: 'Dispatch · Pricing Teaser'
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/** Three dispatch posters side-by-side for the full tier rollout. */
|
|
451
|
+
export const DispatchTriptych: TriptychStory = {
|
|
452
|
+
args: {
|
|
453
|
+
aspect: 'square',
|
|
454
|
+
border: true,
|
|
455
|
+
cornerMarks: true,
|
|
456
|
+
scale: 0.35,
|
|
457
|
+
showLabels: true,
|
|
458
|
+
variant: 'dispatch'
|
|
459
|
+
},
|
|
460
|
+
argTypes: { showLabels: { control: 'boolean' } },
|
|
461
|
+
name: 'Dispatch · Triptych',
|
|
462
|
+
parameters: { layout: 'fullscreen' },
|
|
463
|
+
render: ({ showLabels, ...args }) => (
|
|
464
|
+
<div className="bg-background flex min-h-screen items-center justify-center p-8">
|
|
465
|
+
<div className="flex items-stretch gap-4">
|
|
466
|
+
<Poster
|
|
467
|
+
{...args}
|
|
468
|
+
channel={showLabels ? 'SOPHOS • STUDIO' : undefined}
|
|
469
|
+
eyebrow={showLabels ? 'TIER / 001' : undefined}
|
|
470
|
+
headline={showLabels ? ['Hackit', 'Studio.'] : ['']}
|
|
471
|
+
seal={showLabels ? 'FREE · MIT' : undefined}
|
|
472
|
+
signature={showLabels ? 'hackit.run / studio' : undefined}
|
|
473
|
+
src={TIERS[0].src}
|
|
474
|
+
tags={showLabels ? ['Local-first', 'Unlimited tools', 'MIT'] : []}
|
|
475
|
+
tint={TIERS[0].tint}
|
|
476
|
+
/>
|
|
477
|
+
|
|
478
|
+
<Poster
|
|
479
|
+
{...args}
|
|
480
|
+
channel={showLabels ? 'SOPHOS • PRO' : undefined}
|
|
481
|
+
eyebrow={showLabels ? 'TIER / 002' : undefined}
|
|
482
|
+
headline={showLabels ? ['Hackit', 'Pro.'] : ['']}
|
|
483
|
+
seal={showLabels ? '$20/mo' : undefined}
|
|
484
|
+
signature={showLabels ? 'hackit.run / pro' : undefined}
|
|
485
|
+
src={TIERS[2].src}
|
|
486
|
+
tags={
|
|
487
|
+
showLabels
|
|
488
|
+
? ['Hosted memory', 'Priority inference', 'Team workspaces']
|
|
489
|
+
: []
|
|
490
|
+
}
|
|
491
|
+
tint={TIERS[2].tint}
|
|
492
|
+
/>
|
|
493
|
+
|
|
494
|
+
<Poster
|
|
495
|
+
{...args}
|
|
496
|
+
channel={showLabels ? 'SOPHOS • SOVEREIGN' : undefined}
|
|
497
|
+
eyebrow={showLabels ? 'TIER / 003' : undefined}
|
|
498
|
+
headline={showLabels ? ['Hackit', 'Sovereign.'] : ['']}
|
|
499
|
+
seal={showLabels ? 'talk to us' : undefined}
|
|
500
|
+
signature={showLabels ? 'hackit.run / sovereign' : undefined}
|
|
501
|
+
src={TIERS[3].src}
|
|
502
|
+
tags={
|
|
503
|
+
showLabels
|
|
504
|
+
? ['Self-hosted', 'Dedicated inference', 'SSO + audit']
|
|
505
|
+
: []
|
|
506
|
+
}
|
|
507
|
+
tint={HIGHEST_TINT}
|
|
508
|
+
tintStrength={HIGHEST_TINT_STRENGTH}
|
|
509
|
+
/>
|
|
510
|
+
</div>
|
|
511
|
+
</div>
|
|
512
|
+
)
|
|
513
|
+
}
|