retail-design-system 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/.github/workflows/release.yml +46 -0
  2. package/.oxfmtrc.json +17 -0
  3. package/.oxlintrc.json +132 -0
  4. package/.vscode/extensions.json +3 -0
  5. package/.vscode/settings.json +13 -0
  6. package/README.md +56 -0
  7. package/apps/storybook/.storybook/main.ts +8 -0
  8. package/apps/storybook/.storybook/preview.css +9 -0
  9. package/apps/storybook/.storybook/preview.ts +6 -0
  10. package/apps/storybook/package.json +24 -0
  11. package/apps/storybook/stories/button.stories.ts +118 -0
  12. package/apps/storybook/stories/input.stories.ts +127 -0
  13. package/apps/storybook/stories/label.stories.ts +98 -0
  14. package/apps/storybook/tsconfig.app.json +24 -0
  15. package/apps/storybook/tsconfig.json +4 -0
  16. package/apps/storybook/tsconfig.node.json +22 -0
  17. package/apps/storybook/vite.config.ts +15 -0
  18. package/apps/web/app/(sidebar)/components/[...slugs]/get-child-block.ts +17 -0
  19. package/apps/web/app/(sidebar)/components/[...slugs]/get-component-page-match.ts +56 -0
  20. package/apps/web/app/(sidebar)/components/[...slugs]/get-direct-child-block.ts +22 -0
  21. package/apps/web/app/(sidebar)/components/[...slugs]/layout.tsx +25 -0
  22. package/apps/web/app/(sidebar)/components/[...slugs]/page.tsx +32 -0
  23. package/apps/web/app/(sidebar)/components/[...slugs]/pascal-to-kebab-case.ts +9 -0
  24. package/apps/web/app/(sidebar)/components/button2/page.tsx +154 -0
  25. package/apps/web/app/(sidebar)/components/input/page.tsx +98 -0
  26. package/apps/web/app/(sidebar)/experiments/2025-10-22/mayhem-mode-card-badge.tsx +9 -0
  27. package/apps/web/app/(sidebar)/experiments/2025-10-22/mayhem-mode-coin-active-badge.tsx +14 -0
  28. package/apps/web/app/(sidebar)/experiments/2025-10-22/mayhem-mode-coin-inactive-badge.tsx +12 -0
  29. package/apps/web/app/(sidebar)/experiments/2025-10-22/mayhem-mode-create-coin.tsx +44 -0
  30. package/apps/web/app/(sidebar)/experiments/2025-10-22/mayhem-mode-dialog-icon.tsx +47 -0
  31. package/apps/web/app/(sidebar)/experiments/2025-10-22/page.tsx +167 -0
  32. package/apps/web/app/(sidebar)/experiments/2025-11-04/filters.tsx +90 -0
  33. package/apps/web/app/(sidebar)/experiments/2025-11-04/page.tsx +18 -0
  34. package/apps/web/app/(sidebar)/layout.tsx +17 -0
  35. package/apps/web/app/(sidebar)/primitives/colors/page.tsx +49 -0
  36. package/apps/web/app/favicon.ico +0 -0
  37. package/apps/web/app/layout.tsx +39 -0
  38. package/apps/web/app/page.tsx +14 -0
  39. package/apps/web/app/providers.tsx +15 -0
  40. package/apps/web/components/dialog.tsx +21 -0
  41. package/apps/web/components/logo.tsx +11 -0
  42. package/apps/web/components/logomark.tsx +21 -0
  43. package/apps/web/components/logotype.tsx +25 -0
  44. package/apps/web/components/notion/notion-block-content.tsx +401 -0
  45. package/apps/web/components/notion/notion-docs-blocks.tsx +18 -0
  46. package/apps/web/components/notion/notion-docs-code-page.tsx +20 -0
  47. package/apps/web/components/notion/notion-docs-layout.tsx +52 -0
  48. package/apps/web/components/notion/notion-revalidate-button-client.tsx +14 -0
  49. package/apps/web/components/notion/notion-revalidate-button.tsx +20 -0
  50. package/apps/web/components/notion/notion-rich-text-segments.tsx +55 -0
  51. package/apps/web/components/notion/notion-tabs.tsx +38 -0
  52. package/apps/web/components/notion/notion.ts +223 -0
  53. package/apps/web/components/sidebar-client.tsx +60 -0
  54. package/apps/web/components/sidebar-server.tsx +185 -0
  55. package/apps/web/components/tooltip.tsx +53 -0
  56. package/apps/web/components/topbar.tsx +14 -0
  57. package/apps/web/next.config.ts +10 -0
  58. package/apps/web/package.json +42 -0
  59. package/apps/web/postcss.config.mjs +5 -0
  60. package/apps/web/public/2025-10-22-dialog-banner.png +0 -0
  61. package/apps/web/public/pump-logomark.svg +7 -0
  62. package/apps/web/styles/custom.css +31 -0
  63. package/apps/web/styles/font.css +8 -0
  64. package/apps/web/styles/global.css +5 -0
  65. package/apps/web/styles/tailwind-reset.css +102 -0
  66. package/apps/web/styles/tailwind.css +140 -0
  67. package/apps/web/tsconfig.json +34 -0
  68. package/bun.lock +1249 -0
  69. package/bunfig.toml +2 -0
  70. package/package.json +41 -0
  71. package/packages/ui/global.d.ts +4 -0
  72. package/packages/ui/package.json +49 -0
  73. package/packages/ui/src/components/button/button-spinner.module.css +95 -0
  74. package/packages/ui/src/components/button/button-spinner.tsx +18 -0
  75. package/packages/ui/src/components/button/button.module.css +144 -0
  76. package/packages/ui/src/components/button/button.tsx +102 -0
  77. package/packages/ui/src/components/button-link/button-link.tsx +46 -0
  78. package/packages/ui/src/components/column/column.module.css +4 -0
  79. package/packages/ui/src/components/column/column.tsx +65 -0
  80. package/packages/ui/src/components/row/row.module.css +4 -0
  81. package/packages/ui/src/components/row/row.tsx +65 -0
  82. package/packages/ui/src/components/spacer/spacer.module.css +3 -0
  83. package/packages/ui/src/components/spacer/spacer.tsx +30 -0
  84. package/packages/ui/src/components/switch/switch.module.css +62 -0
  85. package/packages/ui/src/components/switch/switch.tsx +58 -0
  86. package/packages/ui/src/components/tabs/tabs-panel.module.css +4 -0
  87. package/packages/ui/src/components/tabs/tabs-panel.tsx +21 -0
  88. package/packages/ui/src/components/tabs/tabs.module.css +5 -0
  89. package/packages/ui/src/components/tabs/tabs.tsx +21 -0
  90. package/packages/ui/src/components/tabs-underline/tabs-underline-indicator.module.css +10 -0
  91. package/packages/ui/src/components/tabs-underline/tabs-underline-indicator.tsx +33 -0
  92. package/packages/ui/src/components/tabs-underline/tabs-underline-list.module.css +8 -0
  93. package/packages/ui/src/components/tabs-underline/tabs-underline-list.tsx +27 -0
  94. package/packages/ui/src/components/tabs-underline/tabs-underline-tab.module.css +24 -0
  95. package/packages/ui/src/components/tabs-underline/tabs-underline-tab.tsx +30 -0
  96. package/packages/ui/src/foundations/colors/colors.ts +475 -0
  97. package/packages/ui/src/foundations/colors/generate-css.ts +34 -0
  98. package/packages/ui/src/foundations/colors/retail-design-system.css +116 -0
  99. package/packages/ui/src/foundations/colors/tailwind-v3.ts +18 -0
  100. package/packages/ui/src/foundations/colors/tailwind-v4.css +116 -0
  101. package/packages/ui/src/index.ts +34 -0
  102. package/packages/ui/src/input.module.css +57 -0
  103. package/packages/ui/src/input.tsx +49 -0
  104. package/packages/ui/src/label.module.css +8 -0
  105. package/packages/ui/src/label.tsx +23 -0
  106. package/packages/ui/tsconfig.json +14 -0
  107. package/packages/ui/tsup.config.ts +31 -0
  108. package/scripts/clean.sh +69 -0
  109. package/scripts/sort-package-json.sh +30 -0
  110. package/turbo.json +15 -0
@@ -0,0 +1,167 @@
1
+ import { Dialog as BaseDialog } from "@base-ui/react"
2
+ import { IconCrossLarge, IconSquareArrowTopRight } from "@pump-fun/icons-line"
3
+ import { Button } from "@pump-fun/retail-design-system"
4
+ import { MayhemModeCardBadge } from "@/app/(sidebar)/experiments/2025-10-22/mayhem-mode-card-badge"
5
+ import { MayhemModeCoinActiveBadge } from "@/app/(sidebar)/experiments/2025-10-22/mayhem-mode-coin-active-badge"
6
+ import { MayhemModeCoinInactiveBadge } from "@/app/(sidebar)/experiments/2025-10-22/mayhem-mode-coin-inactive-badge"
7
+ import { MayhemModeCreateCoin } from "@/app/(sidebar)/experiments/2025-10-22/mayhem-mode-create-coin"
8
+ import { MayhemModeDialogIcon } from "@/app/(sidebar)/experiments/2025-10-22/mayhem-mode-dialog-icon"
9
+ import { Dialog } from "@/components/dialog"
10
+
11
+ export default function Page() {
12
+ return (
13
+ <div className="flex flex-col gap-y-16">
14
+ <p>Dialogs</p>
15
+ <MayhemModeIntroDialog />
16
+ <MayhemModeDialog isActive isEnabled />
17
+ <MayhemModeDialog isActive={false} isEnabled />
18
+ <MayhemModeDialog isActive={false} isEnabled={false} />
19
+ <div className="h-16 shrink-0" />
20
+ <p>Badges</p>
21
+ <MayhemModeCardBadge />
22
+ <MayhemModeCoinActiveBadge />
23
+ <MayhemModeCoinInactiveBadge />
24
+ <div className="h-16 shrink-0" />
25
+ <p>Components</p>
26
+ <div className="max-w-448">
27
+ <MayhemModeCreateCoin />
28
+ </div>
29
+ </div>
30
+ )
31
+ }
32
+
33
+ // oxlint-disable eslint-plugin-react(no-multi-comp)
34
+ function MayhemModeDialog(props: { isActive: boolean; isEnabled: boolean }) {
35
+ const { isActive, isEnabled } = props
36
+
37
+ return (
38
+ <BaseDialog.Root>
39
+ <BaseDialog.Trigger
40
+ render={<Button>{isEnabled ? (isActive ? "Active" : "Inactive") : "Off"} dialog</Button>}
41
+ />
42
+ <Dialog className="max-w-448!">
43
+ {/* Close button */}
44
+ <BaseDialog.Close
45
+ render={
46
+ <Button className="absolute! top-8 right-8" isIconOnly variant="ghost">
47
+ <IconCrossLarge size={16} />
48
+ </Button>
49
+ }
50
+ />
51
+
52
+ {/* Title */}
53
+ <BaseDialog.Title className="font-600 text-18">What is Mayhem mode?</BaseDialog.Title>
54
+ <div className="h-16 shrink-0" />
55
+
56
+ {/* Detail */}
57
+ <div className="rounded-12 bg-bg-tertiary flex items-center gap-x-12 p-12">
58
+ <div className="shrink-0">
59
+ <MayhemModeDialogIcon />
60
+ </div>
61
+ <div className="flex w-full flex-col gap-y-2">
62
+ <div className="flex justify-between">
63
+ <p className="font-600 text-14 text-text-primary">Mayhem mode</p>
64
+ {isEnabled && (
65
+ <p
66
+ className="font-600 text-14 data-[is-active=false]:text-text-error data-[is-active=true]:text-text-success tabular-nums"
67
+ data-is-active={isActive}
68
+ >
69
+ {isActive ? "68:45:32" : "Inactive"}
70
+ </p>
71
+ )}
72
+ </div>
73
+ <div className="flex w-full justify-between">
74
+ <p className="text-12 text-text-tertiary">Temporary increased volatility.</p>
75
+ {isEnabled && <p className="text-12 text-text-tertiary">Time remaining</p>}
76
+ </div>
77
+ </div>
78
+ </div>
79
+ <div className="h-16 shrink-0" />
80
+
81
+ {/* Description */}
82
+ <div className="flex flex-col gap-y-16">
83
+ {isEnabled && (
84
+ <p className="text-14 text-text-primary">
85
+ This coin has mayhem mode enabled and is{" "}
86
+ <span
87
+ className="data-[is-active=false]:text-text-error data-[is-active=true]:text-text-success"
88
+ data-is-active={isActive}
89
+ >
90
+ {isActive ? "active" : "inactive"}
91
+ </span>
92
+ .
93
+ </p>
94
+ )}
95
+ <p className="text-14 text-text-muted">
96
+ Mayhem mode adds life to coins with increased volatility through random transactions.
97
+ </p>
98
+ <p className="text-14 text-text-muted">
99
+ Coins with mayhem mode enabled may have mayhem mode activated at any time, for a
100
+ duration of 72 hours.
101
+ </p>
102
+ <p className="text-14 text-text-muted">
103
+ Mayhem mode can only be enabled during coin creation.
104
+ </p>
105
+ {isEnabled && <p className="text-14 text-text-muted">Previously active: 5d ago.</p>}
106
+ {/* oxlint-disable-next-line oxceslint-plugin-jsx-a11y(anchor-is-valid): Demo purposes */}
107
+ <a
108
+ className="text-14 text-text-accent flex w-fit items-center gap-x-4 hover:underline"
109
+ href="#"
110
+ >
111
+ Read more <IconSquareArrowTopRight size={14} />
112
+ </a>
113
+ </div>
114
+ <div className="h-16 shrink-0" />
115
+
116
+ {/* Button group */}
117
+ <div className="flex items-center justify-between">
118
+ <BaseDialog.Close render={<Button variant="secondary">Done</Button>} />
119
+ <BaseDialog.Close render={<Button>{isEnabled ? "Trade Pnut" : "Try it now"}</Button>} />
120
+ </div>
121
+ </Dialog>
122
+ </BaseDialog.Root>
123
+ )
124
+ }
125
+
126
+ function MayhemModeIntroDialog() {
127
+ return (
128
+ <BaseDialog.Root>
129
+ <BaseDialog.Trigger render={<Button>Intro dialog</Button>} />
130
+ <Dialog className="bg-bg-secondary!">
131
+ {/* Banner */}
132
+ <div className="aspect-16-9 rounded-8 border-border-secondary bg-bg-primary w-full overflow-hidden border select-none">
133
+ <img
134
+ alt="Mayhem mode banner"
135
+ className="h-full w-full object-cover"
136
+ draggable={false}
137
+ src="/2025-10-22-dialog-banner.png"
138
+ />
139
+ </div>
140
+ <div className="h-24 shrink-0" />
141
+
142
+ {/* Title with badge */}
143
+ <div className="flex items-center justify-center">
144
+ <div className="rounded-6 bg-bg-accent font-600 text-12 text-text-on-accent mr-8 inline-flex h-20 items-center justify-center px-8">
145
+ New
146
+ </div>
147
+ <BaseDialog.Title className="font-600 text-20 items-center">
148
+ <span className="text-text-accent">Mayhem</span> 🔥 - fresh coins lighting up the chart
149
+ </BaseDialog.Title>
150
+ </div>
151
+ <div className="h-16 shrink-0" />
152
+
153
+ {/* Description */}
154
+ <BaseDialog.Description className="text-14 text-text-muted text-center">
155
+ Increased volatility for 72 hour periods with random transactions.
156
+ </BaseDialog.Description>
157
+ <div className="h-24 shrink-0" />
158
+
159
+ {/* Button group */}
160
+ <div className="flex items-center justify-between">
161
+ <BaseDialog.Close render={<Button variant="secondary">Skip</Button>} />
162
+ <BaseDialog.Close render={<Button>View Mayhem coins</Button>} />
163
+ </div>
164
+ </Dialog>
165
+ </BaseDialog.Root>
166
+ )
167
+ }
@@ -0,0 +1,90 @@
1
+ "use client"
2
+
3
+ import { Button, Spacer } from "@pump-fun/retail-design-system"
4
+ import { parseAsStringLiteral, useQueryState } from "nuqs"
5
+
6
+ interface Filter {
7
+ label: FilterLabel
8
+ value: FilterValue
9
+ }
10
+
11
+ type FilterLabel = (typeof FILTER)[keyof typeof FILTER]["LABEL"]
12
+ type FilterValue = (typeof FILTER)[keyof typeof FILTER]["VALUE"]
13
+
14
+ export function Filters() {
15
+ const [sort, setSort] = useQueryState(
16
+ "sort",
17
+ parseAsStringLiteral([
18
+ FILTER.FEATURED.VALUE,
19
+ FILTER.LATEST.VALUE,
20
+ FILTER.MARKET_CAP.VALUE,
21
+ FILTER.MOVERS.VALUE,
22
+ ]).withDefault(FILTER.FEATURED.VALUE),
23
+ )
24
+
25
+ function onClick(value: FilterValue) {
26
+ setSort(value)
27
+ }
28
+
29
+ return (
30
+ <>
31
+ <div className="border-border-secondary flex max-w-384 scroll-px-64 flex-col overflow-x-scroll border py-64">
32
+ <div className="flex gap-x-8">
33
+ {filters.map((filter) => (
34
+ <Button
35
+ key={filter.value}
36
+ onClick={() => onClick(filter.value)}
37
+ variant={filter.value === sort ? "primary" : "secondary"}
38
+ >
39
+ {filter.label}
40
+ </Button>
41
+ ))}
42
+ </div>
43
+ </div>
44
+
45
+ <Spacer className="h-8" />
46
+
47
+ <p className="text-14">
48
+ sort: <span className="bg-amber-950 font-mono">{sort}</span>
49
+ </p>
50
+ </>
51
+ )
52
+ }
53
+
54
+ const FILTER = {
55
+ FEATURED: {
56
+ LABEL: "🌟 Featured",
57
+ VALUE: "featured",
58
+ },
59
+ LATEST: {
60
+ LABEL: "🌱 Recently created",
61
+ VALUE: "latest",
62
+ },
63
+ MARKET_CAP: {
64
+ LABEL: "💰 Most valuable",
65
+ VALUE: "market_cap",
66
+ },
67
+ MOVERS: {
68
+ LABEL: "📈 Movers",
69
+ VALUE: "movers",
70
+ },
71
+ } as const
72
+
73
+ const filters: Filter[] = [
74
+ {
75
+ label: FILTER.FEATURED.LABEL,
76
+ value: FILTER.FEATURED.VALUE,
77
+ },
78
+ {
79
+ label: FILTER.MOVERS.LABEL,
80
+ value: FILTER.MOVERS.VALUE,
81
+ },
82
+ {
83
+ label: FILTER.MARKET_CAP.LABEL,
84
+ value: FILTER.MARKET_CAP.VALUE,
85
+ },
86
+ {
87
+ label: FILTER.LATEST.LABEL,
88
+ value: FILTER.LATEST.VALUE,
89
+ },
90
+ ]
@@ -0,0 +1,18 @@
1
+ import { Spacer } from "@pump-fun/retail-design-system"
2
+ import { Suspense } from "react"
3
+ import { Filters } from "@/app/(sidebar)/experiments/2025-11-04/filters"
4
+
5
+ export default function Page() {
6
+ return (
7
+ <div>
8
+ <h1 className="font-500 text-24">2025/11/04</h1>
9
+ <Spacer className="h-16" />
10
+ <p>Try scrolling on the filters</p>
11
+ <Spacer className="h-8" />
12
+
13
+ <Suspense>
14
+ <Filters />
15
+ </Suspense>
16
+ </div>
17
+ )
18
+ }
@@ -0,0 +1,17 @@
1
+ import type { PropsWithChildren } from "react"
2
+ import { SidebarServer } from "@/components/sidebar-server"
3
+
4
+ export default function SidebarLayout(props: PropsWithChildren) {
5
+ const { children } = props
6
+
7
+ return (
8
+ <div className="flex size-full">
9
+ <SidebarServer />
10
+ <main className="w-full min-w-0">
11
+ <div className="relative mx-auto flex w-full max-w-768 flex-col px-16 py-80">
12
+ {children}
13
+ </div>
14
+ </main>
15
+ </div>
16
+ )
17
+ }
@@ -0,0 +1,49 @@
1
+ // oxlint-disable react/no-multi-comp
2
+
3
+ import { composite, primitive } from "@pump-fun/retail-design-system"
4
+
5
+ export default function ColorsPage() {
6
+ return (
7
+ <>
8
+ <h1 className="font-400 text-24">Colors</h1>
9
+ <div className="h-16 shrink-0" />
10
+
11
+ <h2 className="font-400 text-20">Primitives</h2>
12
+ <div className="h-16 shrink-0" />
13
+
14
+ <div className="flex flex-wrap gap-32">
15
+ {Object.entries(primitive).map(([name, color]) => (
16
+ <Badge hex={color.hex} key={name} name={color.name} />
17
+ ))}
18
+ </div>
19
+ <div className="h-32 shrink-0" />
20
+
21
+ <h2 className="font-400 text-20">Semantics</h2>
22
+ <div className="h-16 shrink-0" />
23
+
24
+ <div className="flex flex-wrap gap-32">
25
+ {Object.entries(composite).map(([name, color]) => (
26
+ <Badge hex={color.color.hex} key={name} name={color.name} variable={color.color.name} />
27
+ ))}
28
+ </div>
29
+ </>
30
+ )
31
+ }
32
+
33
+ function Badge(props: { hex: string; name: string; variable?: string }) {
34
+ const { hex = "", name = "", variable = "" } = props
35
+
36
+ return (
37
+ <div className="flex items-center gap-x-8">
38
+ <div
39
+ className="rounded-8 border-border-primary size-32 border"
40
+ style={{ backgroundColor: hex }}
41
+ />
42
+
43
+ <div className="flex flex-col">
44
+ <p className="text-14 text-text-primary">{name}</p>
45
+ <p className="text-14 text-text-tertiary font-mono">{variable || hex}</p>
46
+ </div>
47
+ </div>
48
+ )
49
+ }
Binary file
@@ -0,0 +1,39 @@
1
+ import { Column } from "@pump-fun/retail-design-system"
2
+ import type { Metadata } from "next"
3
+ import { Inter as sans, JetBrains_Mono as mono } from "next/font/google"
4
+ import type { PropsWithChildren } from "react"
5
+ import { Providers } from "@/app/providers"
6
+ import "@/styles/global.css"
7
+ import { Topbar } from "@/components/topbar"
8
+
9
+ const fontMono = mono({
10
+ subsets: ["latin"],
11
+ variable: "--font-mono",
12
+ })
13
+
14
+ const fontSans = sans({
15
+ subsets: ["latin"],
16
+ variable: "--font-sans",
17
+ })
18
+
19
+ export default function Layout(props: PropsWithChildren) {
20
+ const { children } = props
21
+
22
+ return (
23
+ <html lang="en">
24
+ <body className={`${fontMono.variable} ${fontSans.variable}`}>
25
+ <Providers>
26
+ <Column className="size-full">
27
+ <Topbar />
28
+ {children}
29
+ </Column>
30
+ </Providers>
31
+ </body>
32
+ </html>
33
+ )
34
+ }
35
+
36
+ export const metadata: Metadata = {
37
+ description: "React Components",
38
+ title: "React Components",
39
+ }
@@ -0,0 +1,14 @@
1
+ import { ButtonLink, Column, Spacer } from "@pump-fun/retail-design-system"
2
+ import Link from "next/link"
3
+
4
+ export default function Page() {
5
+ return (
6
+ <Column className="px-24">
7
+ <p>Welcome to Retail React Components</p>
8
+ <Spacer height={16} />
9
+ <ButtonLink as={Link} href="/components/button">
10
+ Go to components
11
+ </ButtonLink>
12
+ </Column>
13
+ )
14
+ }
@@ -0,0 +1,15 @@
1
+ "use client"
2
+
3
+ import { NuqsAdapter } from "nuqs/adapters/next/app"
4
+ import type { PropsWithChildren } from "react"
5
+ import { TooltipProvider } from "@/components/tooltip"
6
+
7
+ export function Providers(props: PropsWithChildren) {
8
+ const { children } = props
9
+
10
+ return (
11
+ <NuqsAdapter>
12
+ <TooltipProvider>{children}</TooltipProvider>
13
+ </NuqsAdapter>
14
+ )
15
+ }
@@ -0,0 +1,21 @@
1
+ import { Dialog as BaseDialog } from "@base-ui/react"
2
+ import type { PropsWithChildren } from "react"
3
+
4
+ interface DialogProps extends PropsWithChildren {
5
+ className?: string
6
+ }
7
+
8
+ export function Dialog(props: DialogProps) {
9
+ const { children = "", className = "" } = props
10
+
11
+ return (
12
+ <BaseDialog.Portal>
13
+ <BaseDialog.Backdrop className="backdrop-blur-4 fixed inset-0 z-30 min-h-dvh bg-[rgba(0,0,0,0.5)] transition-all duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-[-webkit-touch-callout:none]:absolute" />
14
+ <BaseDialog.Popup
15
+ className={`rounded-10 border-border-secondary bg-bg-primary outline-bg-accent fixed top-1/2 left-1/2 z-30 flex w-full max-w-672 -translate-x-1/2 -translate-y-1/2 flex-col border p-24 outline-offset-2 transition-all duration-150 data-ending-style:scale-90 data-ending-style:opacity-0 data-starting-style:scale-90 data-starting-style:opacity-0 ${className}`}
16
+ >
17
+ {children}
18
+ </BaseDialog.Popup>
19
+ </BaseDialog.Portal>
20
+ )
21
+ }
@@ -0,0 +1,11 @@
1
+ import { Logomark } from "@/components/logomark"
2
+ import { Logotype } from "@/components/logotype"
3
+
4
+ export function Logo() {
5
+ return (
6
+ <div className="flex shrink-0 items-center gap-x-8">
7
+ <Logomark className="text-text-accent" />
8
+ <Logotype className="text-text-primary" />
9
+ </div>
10
+ )
11
+ }
@@ -0,0 +1,21 @@
1
+ import type { ComponentProps } from "react"
2
+
3
+ interface LogomarkProps extends ComponentProps<"svg"> {}
4
+
5
+ export function Logomark(props: LogomarkProps) {
6
+ const { ...rest } = props
7
+
8
+ return (
9
+ <svg
10
+ fill="currentColor"
11
+ height="24"
12
+ viewBox="0 0 24 24"
13
+ width="24"
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ {...rest}
16
+ >
17
+ <path d="M11.9995 21.9412C9.25446 24.6863 4.80385 24.6863 2.05879 21.9412C-0.686264 19.1962 -0.686264 14.7455 2.05879 12.0005L7.03012 7.02915L16.9708 16.9699L11.9995 21.9412Z" />
18
+ <path d="M12.0005 2.05879C14.7455 -0.686264 19.1962 -0.686264 21.9412 2.05879C24.6863 4.80385 24.6863 9.25446 21.9412 11.9995L16.9708 16.9699L14.9827 14.9817L19.9531 10.0114C21.6001 8.36434 21.6001 5.69397 19.9531 4.04694C18.306 2.3999 15.6357 2.3999 13.9886 4.04694L9.01827 9.0173L7.03012 7.02915L12.0005 2.05879Z" />
19
+ </svg>
20
+ )
21
+ }
@@ -0,0 +1,25 @@
1
+ import type { ComponentProps } from "react"
2
+
3
+ interface LogotypeProps extends ComponentProps<"svg"> {}
4
+
5
+ export function Logotype(props: LogotypeProps) {
6
+ const { ...rest } = props
7
+
8
+ return (
9
+ <svg
10
+ fill="currentColor"
11
+ height="16"
12
+ viewBox="0 0 57 16"
13
+ width="57"
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ {...rest}
16
+ >
17
+ <path d="M0 16V3.75975H1.90372V4.8725H2.02271C2.17002 4.63646 2.36832 4.41166 2.61762 4.1981C2.87825 3.98455 3.1842 3.81595 3.53549 3.69231C3.88677 3.55743 4.27771 3.48999 4.70831 3.48999C5.50153 3.48999 6.20976 3.68669 6.83301 4.08008C7.46758 4.46224 7.96617 4.99614 8.32879 5.68177C8.70273 6.3674 8.88971 7.15982 8.88971 8.05901C8.88971 8.9582 8.70273 9.75061 8.32879 10.4362C7.96617 11.1219 7.46758 11.6614 6.83301 12.0548C6.20976 12.437 5.50153 12.628 4.70831 12.628C4.07374 12.628 3.52415 12.4932 3.05955 12.2234C2.59496 11.9424 2.24934 11.6221 2.02271 11.2624H1.90372L2.02271 12.4763V16H0ZM4.38536 10.7734C4.8273 10.7734 5.23524 10.6667 5.60918 10.4531C5.98313 10.2283 6.28342 9.91359 6.51005 9.50896C6.74802 9.09308 6.867 8.60976 6.867 8.05901C6.867 7.49701 6.74802 7.01932 6.51005 6.62592C6.28342 6.22129 5.98313 5.91219 5.60918 5.69863C5.23524 5.47383 4.8273 5.36143 4.38536 5.36143C3.95476 5.36143 3.54682 5.47383 3.16154 5.69863C2.78759 5.91219 2.48164 6.22129 2.24367 6.62592C2.01704 7.03056 1.90372 7.50825 1.90372 8.05901C1.90372 8.60976 2.01704 9.08746 2.24367 9.4921C2.48164 9.89673 2.78759 10.2115 3.16154 10.4362C3.54682 10.661 3.95476 10.7734 4.38536 10.7734Z" />
18
+ <path d="M13.3446 12.628C12.2795 12.628 11.4806 12.3077 10.948 11.667C10.4154 11.0263 10.1491 10.1496 10.1491 9.03688V3.75975H12.1718V8.78398C12.1718 9.4359 12.3305 9.93045 12.6478 10.2677C12.965 10.6048 13.3673 10.7734 13.8546 10.7734C14.3078 10.7734 14.6988 10.661 15.0274 10.4362C15.356 10.2002 15.6053 9.89111 15.7753 9.50896C15.9453 9.1268 16.0303 8.71092 16.0303 8.26133V3.75975H18.07V12.3583H16.1492V11.2287H16.0303C15.8716 11.4984 15.6506 11.7401 15.3674 11.9536C15.0954 12.1672 14.7894 12.3302 14.4495 12.4426C14.1095 12.5662 13.7413 12.628 13.3446 12.628Z" />
19
+ <path d="M19.8532 12.3583V3.75975H21.757V4.88936H21.8759C22.0573 4.6196 22.2782 4.37794 22.5388 4.16438C22.7995 3.95083 23.0998 3.78785 23.4397 3.67545C23.7797 3.55181 24.1423 3.48999 24.5276 3.48999C25.1621 3.48999 25.7061 3.64173 26.1593 3.94521C26.6126 4.23744 26.9355 4.60274 27.1282 5.0411C27.3888 4.61398 27.7628 4.24868 28.25 3.94521C28.7373 3.64173 29.3379 3.48999 30.0518 3.48999C31.0603 3.48999 31.8138 3.79909 32.3124 4.41728C32.811 5.02424 33.0603 5.82789 33.0603 6.82824V12.3583H31.0546V7.1823C31.0546 6.5641 30.913 6.10889 30.6297 5.81665C30.3464 5.51317 29.9611 5.36143 29.4738 5.36143C29.0772 5.36143 28.7259 5.47383 28.42 5.69863C28.1254 5.91219 27.8931 6.21005 27.7231 6.5922C27.5645 6.96312 27.4851 7.39586 27.4851 7.89041V12.3583H25.4454V7.19916C25.4454 6.56972 25.3038 6.10889 25.0205 5.81665C24.7372 5.51317 24.3349 5.36143 23.8137 5.36143C23.4284 5.36143 23.0884 5.47383 22.7938 5.69863C22.4992 5.91219 22.2726 6.21005 22.1139 6.5922C21.9553 6.97436 21.8759 7.41271 21.8759 7.90727V12.3583H19.8532Z" />
20
+ <path d="M34.8011 16V3.75975H36.7048V4.8725H36.8238C36.9711 4.63646 37.1694 4.41166 37.4187 4.1981C37.6793 3.98455 37.9853 3.81595 38.3366 3.69231C38.6879 3.55743 39.0788 3.48999 39.5094 3.48999C40.3026 3.48999 41.0109 3.68669 41.6341 4.08008C42.2687 4.46224 42.7673 4.99614 43.1299 5.68177C43.5038 6.3674 43.6908 7.15982 43.6908 8.05901C43.6908 8.9582 43.5038 9.75061 43.1299 10.4362C42.7673 11.1219 42.2687 11.6614 41.6341 12.0548C41.0109 12.437 40.3026 12.628 39.5094 12.628C38.8748 12.628 38.3253 12.4932 37.8607 12.2234C37.3961 11.9424 37.0504 11.6221 36.8238 11.2624H36.7048L36.8238 12.4763V16H34.8011ZM39.1865 10.7734C39.6284 10.7734 40.0363 10.6667 40.4103 10.4531C40.7842 10.2283 41.0845 9.91359 41.3112 9.50896C41.5491 9.09308 41.6681 8.60976 41.6681 8.05901C41.6681 7.49701 41.5491 7.01932 41.3112 6.62592C41.0845 6.22129 40.7842 5.91219 40.4103 5.69863C40.0363 5.47383 39.6284 5.36143 39.1865 5.36143C38.7559 5.36143 38.3479 5.47383 37.9626 5.69863C37.5887 5.91219 37.2827 6.22129 37.0448 6.62592C36.8181 7.03056 36.7048 7.50825 36.7048 8.05901C36.7048 8.60976 36.8181 9.08746 37.0448 9.4921C37.2827 9.89673 37.5887 10.2115 37.9626 10.4362C38.3479 10.661 38.7559 10.7734 39.1865 10.7734Z" />
21
+ <path d="M48.1457 12.628C47.0806 12.628 46.2817 12.3077 45.7491 11.667C45.2165 11.0263 44.9502 10.1496 44.9502 9.03688V3.75975H46.9729V8.78398C46.9729 9.4359 47.1316 9.93045 47.4489 10.2677C47.7661 10.6048 48.1684 10.7734 48.6557 10.7734C49.1089 10.7734 49.4999 10.661 49.8285 10.4362C50.1571 10.2002 50.4064 9.89111 50.5764 9.50896C50.7464 9.1268 50.8314 8.71092 50.8314 8.26133V3.75975H52.8711V12.3583H50.9503V11.2287H50.8314C50.6727 11.4984 50.4517 11.7401 50.1685 11.9536C49.8965 12.1672 49.5905 12.3302 49.2506 12.4426C48.9106 12.5662 48.5424 12.628 48.1457 12.628Z" />
22
+ <path d="M54.6543 12.3583V3.75975H56.677V12.3583H54.6543ZM55.6742 2.647C55.3002 2.647 54.983 2.51774 54.7223 2.25922C54.4617 2.0007 54.3314 1.68599 54.3314 1.31507C54.3314 0.955392 54.4617 0.646294 54.7223 0.387777C54.983 0.129259 55.3002 0 55.6742 0C56.0368 0 56.3484 0.129259 56.6091 0.387777C56.8697 0.646294 57 0.955392 57 1.31507C57 1.68599 56.8697 2.0007 56.6091 2.25922C56.3484 2.51774 56.0368 2.647 55.6742 2.647Z" />
23
+ </svg>
24
+ )
25
+ }