create-auto-app 1.24.0 → 1.25.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.
@@ -1,7 +1,11 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
1
3
  import { fileURLToPath } from "node:url";
2
- import { dirname } from "node:path";
3
4
  import type { StorybookConfig } from "@storybook/react-vite";
4
5
 
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const managerHeadContent = readFileSync(join(__dirname, "manager-head.html"), "utf-8");
8
+
5
9
  const isFastMode = !!process.env.STORYBOOK_FAST;
6
10
 
7
11
  const config: StorybookConfig = {
@@ -19,6 +23,7 @@ const config: StorybookConfig = {
19
23
  },
20
24
  },
21
25
  },
26
+ getAbsolutePath("@vueless/storybook-dark-mode"),
22
27
  ],
23
28
  staticDirs: ["../public"],
24
29
  features: {
@@ -41,6 +46,7 @@ const config: StorybookConfig = {
41
46
  };
42
47
  return config;
43
48
  },
49
+ managerHead: () => managerHeadContent,
44
50
  };
45
51
 
46
52
  export default config;
@@ -0,0 +1,133 @@
1
+ <script>
2
+ (function() {
3
+ // Check localStorage for dark mode state before anything renders
4
+ var isDark = false;
5
+ try {
6
+ var stored = localStorage.getItem('sb-addon-themes-3');
7
+ if (stored) {
8
+ var parsed = JSON.parse(stored);
9
+ isDark = parsed && parsed.current === 'dark';
10
+ }
11
+ } catch(e) {}
12
+
13
+ // Also check URL parameter
14
+ var urlParams = new URLSearchParams(window.location.search);
15
+ var urlTheme = urlParams.get('theme');
16
+ if (urlTheme) {
17
+ isDark = urlTheme === 'dark';
18
+ }
19
+
20
+ // Apply matching theme background colors immediately (blue-tinted grays)
21
+ document.documentElement.style.backgroundColor = isDark ? '#1a1f2e' : '#f0f3f9';
22
+ document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
23
+
24
+ // Store theme state for CSS
25
+ document.documentElement.dataset.theme = isDark ? 'dark' : 'light';
26
+ })();
27
+ </script>
28
+ <style>
29
+ html, body {
30
+ transition: none !important;
31
+ }
32
+
33
+ /* Force sidebar and nav backgrounds - target the actual container divs */
34
+ #storybook-explorer-tree,
35
+ [class*="sidebar"],
36
+ [class*="Sidebar"],
37
+ nav[class],
38
+ aside[class] {
39
+ background-color: #f0f3f9 !important;
40
+ }
41
+
42
+ html[data-theme="dark"] #storybook-explorer-tree,
43
+ html[data-theme="dark"] [class*="sidebar"],
44
+ html[data-theme="dark"] [class*="Sidebar"],
45
+ html[data-theme="dark"] nav[class],
46
+ html[data-theme="dark"] aside[class] {
47
+ background-color: #1a1f2e !important;
48
+ }
49
+
50
+ /* Force toolbar/header backgrounds */
51
+ [class*="toolbar"],
52
+ [class*="Toolbar"],
53
+ [class*="bar"],
54
+ [class*="Bar"],
55
+ header[class] {
56
+ background-color: #f0f3f9 !important;
57
+ }
58
+
59
+ html[data-theme="dark"] [class*="toolbar"],
60
+ html[data-theme="dark"] [class*="Toolbar"],
61
+ html[data-theme="dark"] [class*="bar"],
62
+ html[data-theme="dark"] [class*="Bar"],
63
+ html[data-theme="dark"] header[class] {
64
+ background-color: #1a1f2e !important;
65
+ }
66
+
67
+ /* Force ALL sidebar text to dark gray instead of blue */
68
+ [data-nodetype],
69
+ [data-nodetype] * {
70
+ color: #2d3748 !important;
71
+ }
72
+
73
+ html[data-theme="dark"] [data-nodetype],
74
+ html[data-theme="dark"] [data-nodetype] * {
75
+ color: #e2e8f0 !important;
76
+ }
77
+
78
+ /* Sidebar selection styles - subtle background */
79
+ [data-nodetype="story"][data-selected="true"],
80
+ [data-nodetype="document"][data-selected="true"],
81
+ [data-nodetype="component"][data-selected="true"],
82
+ [data-nodetype="group"][data-selected="true"] {
83
+ background-color: #e2e8f0 !important;
84
+ border-radius: 0.5rem !important;
85
+ }
86
+
87
+ [data-nodetype="story"][data-selected="true"] *,
88
+ [data-nodetype="document"][data-selected="true"] *,
89
+ [data-nodetype="component"][data-selected="true"] *,
90
+ [data-nodetype="group"][data-selected="true"] * {
91
+ color: #1a202c !important;
92
+ }
93
+
94
+ /* Dark mode selected item */
95
+ html[data-theme="dark"] [data-nodetype="story"][data-selected="true"],
96
+ html[data-theme="dark"] [data-nodetype="document"][data-selected="true"],
97
+ html[data-theme="dark"] [data-nodetype="component"][data-selected="true"],
98
+ html[data-theme="dark"] [data-nodetype="group"][data-selected="true"] {
99
+ background-color: #3d4663 !important;
100
+ }
101
+
102
+ html[data-theme="dark"] [data-nodetype="story"][data-selected="true"] *,
103
+ html[data-theme="dark"] [data-nodetype="document"][data-selected="true"] *,
104
+ html[data-theme="dark"] [data-nodetype="component"][data-selected="true"] *,
105
+ html[data-theme="dark"] [data-nodetype="group"][data-selected="true"] * {
106
+ color: #f7fafc !important;
107
+ }
108
+
109
+ /* Hover state */
110
+ [data-nodetype="story"]:hover,
111
+ [data-nodetype="document"]:hover,
112
+ [data-nodetype="component"]:hover,
113
+ [data-nodetype="group"]:hover {
114
+ background-color: #edf2f7 !important;
115
+ border-radius: 0.5rem !important;
116
+ }
117
+
118
+ html[data-theme="dark"] [data-nodetype="story"]:hover,
119
+ html[data-theme="dark"] [data-nodetype="document"]:hover,
120
+ html[data-theme="dark"] [data-nodetype="component"]:hover,
121
+ html[data-theme="dark"] [data-nodetype="group"]:hover {
122
+ background-color: #2d3748 !important;
123
+ }
124
+
125
+ /* Selected hover - keep selected state */
126
+ [data-nodetype][data-selected="true"]:hover {
127
+ background-color: #e2e8f0 !important;
128
+ }
129
+
130
+ html[data-theme="dark"] [data-nodetype][data-selected="true"]:hover {
131
+ background-color: #3d4663 !important;
132
+ }
133
+ </style>
@@ -0,0 +1,165 @@
1
+ import { addons } from 'storybook/manager-api';
2
+ import { create } from 'storybook/theming';
3
+ import { STORY_CHANGED } from 'storybook/internal/core-events';
4
+ import { UPDATE_DARK_MODE_EVENT_NAME } from '@vueless/storybook-dark-mode';
5
+
6
+ // Get initial theme from localStorage (dark mode addon) or URL parameter
7
+ const urlParams = new URLSearchParams(window.location.search);
8
+ const urlTheme = urlParams.get('theme');
9
+ const getStoredDarkMode = (): boolean => {
10
+ try {
11
+ const stored = localStorage.getItem('sb-addon-themes-3');
12
+ if (stored) {
13
+ const parsed = JSON.parse(stored);
14
+ return parsed?.current === 'dark';
15
+ }
16
+ } catch {}
17
+ return false;
18
+ };
19
+ const initialIsDark = urlTheme ? urlTheme === 'dark' : getStoredDarkMode();
20
+
21
+ // Theme colors matching app's design with subtle blue tint
22
+ // Analyzed from screenshots - app has slight blue undertone in grays
23
+
24
+ const lightTheme = create({
25
+ base: 'light',
26
+ brandTitle: ' ',
27
+ brandUrl: '/',
28
+ brandImage: '/blank.svg',
29
+
30
+ // App background colors - matching your app's blue-tinted sidebar
31
+ appBg: '#f0f3f9', // sidebar background (blue-tinted like your app)
32
+ appContentBg: '#ffffff', // main content area
33
+ appPreviewBg: '#ffffff', // preview/canvas background
34
+ appBorderColor: '#e2e8f0', // borders (blue-tinted)
35
+ appBorderRadius: 10, // 0.625rem = 10px
36
+
37
+ // Text colors - dark gray, not blue
38
+ textColor: '#2d3748', // dark gray text for sidebar items
39
+ textMutedColor: '#718096', // muted gray text
40
+ textInverseColor: '#f7fafc',// inverse text
41
+
42
+ // Toolbar/UI colors
43
+ barBg: '#f0f3f9', // toolbar background (blue-tinted)
44
+ barTextColor: '#2d3748', // toolbar text (dark gray)
45
+ barHoverColor: '#1a202c', // toolbar hover
46
+ barSelectedColor: '#1a202c',// toolbar selected
47
+
48
+ // Form colors
49
+ inputBg: '#ffffff', // input background
50
+ inputBorder: '#e2e8f0', // input border
51
+ inputTextColor: '#2d3748', // input text
52
+
53
+ // Button colors
54
+ buttonBg: '#edf2f7', // button background
55
+ buttonBorder: '#e2e8f0', // button border
56
+
57
+ // Boolean inputs
58
+ booleanBg: '#edf2f7',
59
+ booleanSelectedBg: '#2d3748',
60
+
61
+ // Grid colors for canvas
62
+ gridCellSize: 10,
63
+
64
+ // Color for links/interactive items - override the blue
65
+ colorPrimary: '#2d3748',
66
+ colorSecondary: '#4a5568',
67
+ });
68
+
69
+ const darkTheme = create({
70
+ base: 'dark',
71
+ brandTitle: ' ',
72
+ brandUrl: '/',
73
+ brandImage: '/blank.svg',
74
+
75
+ // App background colors - matching app's dark blue-tinted theme
76
+ appBg: '#1a1f2e', // sidebar background (blue-tinted dark)
77
+ appContentBg: '#131620', // main content area (darker)
78
+ appPreviewBg: '#131620', // preview/canvas background
79
+ appBorderColor: '#2a3142', // borders (blue-tinted)
80
+ appBorderRadius: 10,
81
+
82
+ // Text colors - light gray, not blue
83
+ textColor: '#e2e8f0', // light gray text
84
+ textMutedColor: '#a0aec0', // muted gray text
85
+ textInverseColor: '#1a1f2e',// inverse text
86
+
87
+ // Toolbar/UI colors
88
+ barBg: '#1a1f2e', // toolbar background
89
+ barTextColor: '#e2e8f0', // toolbar text (light gray)
90
+ barHoverColor: '#f7fafc', // toolbar hover
91
+ barSelectedColor: '#f7fafc',// toolbar selected
92
+
93
+ // Form colors
94
+ inputBg: '#242938', // input background
95
+ inputBorder: '#3d4663', // input border
96
+ inputTextColor: '#e2e8f0', // input text
97
+
98
+ // Button colors
99
+ buttonBg: '#242938', // button background
100
+ buttonBorder: '#3d4663', // button border
101
+
102
+ // Boolean inputs
103
+ booleanBg: '#242938',
104
+ booleanSelectedBg: '#e2e8f0',
105
+
106
+ // Grid colors for canvas
107
+ gridCellSize: 10,
108
+
109
+ // Color for links/interactive items - override the blue
110
+ colorPrimary: '#e2e8f0',
111
+ colorSecondary: '#a0aec0',
112
+ });
113
+
114
+ const customTheme = initialIsDark ? darkTheme : lightTheme;
115
+
116
+ // Hide the addon panel globally (Storybook 8+/10 API)
117
+ addons.setConfig({
118
+ bottomPanelHeight: 0,
119
+ layoutCustomisations: {
120
+ showPanel: () => false,
121
+ },
122
+ theme: customTheme,
123
+ });
124
+
125
+ // Set default story to Design System Overview if no path specified
126
+ if (!urlParams.has('path')) {
127
+ const newUrl = new URL(window.location.href);
128
+ newUrl.searchParams.set('path', '/story/design-system-overview--default');
129
+ window.history.replaceState({}, '', newUrl.toString());
130
+ }
131
+
132
+ // Register addon to handle navigation sync and theme after Storybook is ready
133
+ addons.register('url-sync', (api) => {
134
+ const channel = api.getChannel();
135
+ if (!channel) return;
136
+
137
+ // Set initial dark mode state (pass string "dark" or "light", not boolean)
138
+ if (initialIsDark) {
139
+ channel.emit(UPDATE_DARK_MODE_EVENT_NAME, 'dark');
140
+ }
141
+
142
+ // Report navigation changes to parent window for URL bar sync
143
+ channel.on(STORY_CHANGED, (storyId: string) => {
144
+ if (window.parent !== window) {
145
+ window.parent.postMessage({ type: 'storybook-navigation', storyId }, '*');
146
+ }
147
+ });
148
+
149
+ // Listen for theme changes from parent window
150
+ window.addEventListener('message', (event) => {
151
+ if (event.data?.type === 'storybook-theme-change' && event.data?.theme) {
152
+ const isDark = event.data.theme === 'dark';
153
+ // Update the dark mode addon
154
+ channel.emit(UPDATE_DARK_MODE_EVENT_NAME, event.data.theme);
155
+ // Update the Storybook manager theme
156
+ addons.setConfig({
157
+ theme: isDark ? darkTheme : lightTheme,
158
+ });
159
+ // Update CSS theme selector and background
160
+ document.documentElement.dataset.theme = isDark ? 'dark' : 'light';
161
+ document.documentElement.style.backgroundColor = isDark ? '#1a1f2e' : '#f0f3f9';
162
+ document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
163
+ }
164
+ });
165
+ });
@@ -0,0 +1,31 @@
1
+ <script>
2
+ (function() {
3
+ var isDark = false;
4
+ var stored, parsed, urlParams, urlTheme;
5
+ try {
6
+ stored = localStorage.getItem('sb-addon-themes-3');
7
+ if (stored) {
8
+ parsed = JSON.parse(stored);
9
+ isDark = parsed && parsed.current === 'dark';
10
+ }
11
+ } catch(_) {}
12
+
13
+ urlParams = new URLSearchParams(window.location.search);
14
+ urlTheme = urlParams.get('theme');
15
+ if (urlTheme) {
16
+ isDark = urlTheme === 'dark';
17
+ }
18
+
19
+ if (isDark) {
20
+ document.documentElement.classList.add('dark');
21
+ }
22
+ // Dark: appContentBg=#222325, Light: #FFFFFF
23
+ document.documentElement.style.backgroundColor = isDark ? '#222325' : '#FFFFFF';
24
+ document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
25
+ })();
26
+ </script>
27
+ <style>
28
+ html, body {
29
+ transition: none;
30
+ }
31
+ </style>
@@ -1,9 +1,51 @@
1
1
  import type { Preview } from '@storybook/react-vite';
2
+ import type { PropsWithChildren } from 'react';
3
+ import { useEffect, useState } from 'react';
4
+ import { addons } from 'storybook/preview-api';
5
+ import { themes } from 'storybook/theming';
6
+ import { DocsContainer } from '@storybook/addon-docs/blocks';
2
7
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
8
+ import { DARK_MODE_EVENT_NAME } from '@vueless/storybook-dark-mode';
3
9
  import { initialize, mswLoader } from 'msw-storybook-addon';
4
10
  import '../src/index.css';
5
11
 
6
- initialize();
12
+ initialize({
13
+ onUnhandledRequest: 'bypass',
14
+ });
15
+
16
+ // Apply theme to the preview iframe (for component styling and background)
17
+ const applyTheme = (isDark: boolean) => {
18
+ if (isDark) {
19
+ document.documentElement.classList.add('dark');
20
+ } else {
21
+ document.documentElement.classList.remove('dark');
22
+ }
23
+ // Update background color to match Storybook theme
24
+ document.documentElement.style.backgroundColor = isDark ? '#222325' : '#FFFFFF';
25
+ document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
26
+ };
27
+
28
+ // Get initial theme from URL parameter or localStorage
29
+ const urlParams = new URLSearchParams(window.location.search);
30
+ const urlTheme = urlParams.get('theme');
31
+ const getStoredDarkMode = (): boolean => {
32
+ try {
33
+ const stored = localStorage.getItem('sb-addon-themes-3');
34
+ if (stored) {
35
+ const parsed = JSON.parse(stored);
36
+ return parsed?.current === 'dark';
37
+ }
38
+ } catch {}
39
+ return false;
40
+ };
41
+ const initialIsDark = urlTheme ? urlTheme === 'dark' : getStoredDarkMode();
42
+ applyTheme(initialIsDark);
43
+
44
+ // Listen to dark mode addon changes and sync with our CSS class
45
+ const channel = addons.getChannel();
46
+ channel.on(DARK_MODE_EVENT_NAME, (isDark: boolean) => {
47
+ applyTheme(isDark);
48
+ });
7
49
 
8
50
  const queryClient = new QueryClient({
9
51
  defaultOptions: {
@@ -13,6 +55,26 @@ const queryClient = new QueryClient({
13
55
  },
14
56
  });
15
57
 
58
+ // Themed docs container that responds to dark mode
59
+ function ThemedDocsContainer({
60
+ children,
61
+ context,
62
+ }: PropsWithChildren<{ context: Parameters<typeof DocsContainer>[0]['context'] }>) {
63
+ const [isDark, setIsDark] = useState(initialIsDark);
64
+
65
+ useEffect(() => {
66
+ const ch = addons.getChannel();
67
+ ch.on(DARK_MODE_EVENT_NAME, setIsDark);
68
+ return () => ch.off(DARK_MODE_EVENT_NAME, setIsDark);
69
+ }, []);
70
+
71
+ return (
72
+ <DocsContainer context={context} theme={isDark ? themes.dark : themes.light}>
73
+ {children}
74
+ </DocsContainer>
75
+ );
76
+ }
77
+
16
78
  const preview: Preview = {
17
79
  decorators: [
18
80
  (Story) => (
@@ -33,10 +95,20 @@ const preview: Preview = {
33
95
  },
34
96
  layout: 'padded',
35
97
  options: {
98
+ showPanel: false,
36
99
  storySort: {
37
- order: ['Design System', 'UI Components'],
100
+ order: ['Design System', ['Overview', '*'], 'UI Components'],
38
101
  },
39
102
  },
103
+ darkMode: {
104
+ current: initialIsDark ? 'dark' : 'light',
105
+ stylePreview: true,
106
+ dark: themes.dark,
107
+ light: themes.light,
108
+ },
109
+ docs: {
110
+ container: ThemedDocsContainer,
111
+ },
40
112
  },
41
113
  initialGlobals: {
42
114
  showPanel: false,
@@ -45,6 +45,7 @@
45
45
  "@types/react": "^19.2.7",
46
46
  "@types/react-dom": "^19.2.3",
47
47
  "@vitejs/plugin-react-swc": "^4.2.2",
48
+ "@vueless/storybook-dark-mode": "^10.0.7",
48
49
  "msw": "^2.12.10",
49
50
  "msw-storybook-addon": "^2.0.6",
50
51
  "storybook": "^10.2.8",
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>
@@ -93,17 +93,17 @@ function PaymentMethodDemo() {
93
93
  <FieldLabel htmlFor="card-name">Name on Card</FieldLabel>
94
94
  <Input id="card-name" placeholder="John Doe" />
95
95
  </Field>
96
- <div className="grid grid-cols-3 gap-4">
97
- <Field className="col-span-2">
96
+ <div className="grid grid-cols-4 gap-4">
97
+ <Field className="col-span-3">
98
98
  <FieldLabel htmlFor="card-number">Card Number</FieldLabel>
99
99
  <Input id="card-number" placeholder="1234 5678 9012 3456" />
100
- <FieldDescription>Enter your 16-digit number.</FieldDescription>
101
100
  </Field>
102
101
  <Field className="col-span-1">
103
102
  <FieldLabel htmlFor="cvv">CVV</FieldLabel>
104
103
  <Input id="cvv" placeholder="123" />
105
104
  </Field>
106
105
  </div>
106
+ <FieldDescription className="-mt-2">Enter your 16-digit number.</FieldDescription>
107
107
  <div className="grid grid-cols-2 gap-4">
108
108
  <Field>
109
109
  <FieldLabel htmlFor="exp-month">Month</FieldLabel>
@@ -181,18 +181,18 @@ function EmptyAvatarGroupDemo() {
181
181
  <Empty className="flex-none py-4">
182
182
  <EmptyHeader>
183
183
  <EmptyMedia>
184
- <AvatarGroup className="grayscale">
184
+ <AvatarGroup>
185
185
  <Avatar>
186
- <AvatarImage src="https://github.com/shadcn.png" alt="@shadcn" />
187
- <AvatarFallback>CN</AvatarFallback>
186
+ <AvatarImage src="https://randomuser.me/api/portraits/women/44.jpg" alt="Sarah" />
187
+ <AvatarFallback>SA</AvatarFallback>
188
188
  </Avatar>
189
189
  <Avatar>
190
- <AvatarImage src="https://github.com/maxleiter.png" alt="@maxleiter" />
191
- <AvatarFallback>LR</AvatarFallback>
190
+ <AvatarImage src="https://randomuser.me/api/portraits/men/32.jpg" alt="James" />
191
+ <AvatarFallback>JA</AvatarFallback>
192
192
  </Avatar>
193
193
  <Avatar>
194
- <AvatarImage src="https://github.com/evilrabbit.png" alt="@evilrabbit" />
195
- <AvatarFallback>ER</AvatarFallback>
194
+ <AvatarImage src="https://randomuser.me/api/portraits/women/68.jpg" alt="Maya" />
195
+ <AvatarFallback>MA</AvatarFallback>
196
196
  </Avatar>
197
197
  </AvatarGroup>
198
198
  </EmptyMedia>
@@ -510,8 +510,8 @@ function NotionPromptDemo() {
510
510
  <div className="w-full">
511
511
  <InputGroup>
512
512
  <InputGroupAddon>
513
- <Button variant="outline" size="sm" className="h-7 gap-1 px-2 text-xs">
514
- <PlusIcon className="size-3" />
513
+ <Button variant="outline" size="sm" className="h-6 gap-0.5 px-1.5 text-[10px]">
514
+ <PlusIcon className="size-2.5" />
515
515
  Add context
516
516
  </Button>
517
517
  </InputGroupAddon>
@@ -543,9 +543,13 @@ function UrlBookmarkDemo() {
543
543
  return (
544
544
  <InputGroup>
545
545
  <InputGroupAddon>
546
- <InfoIcon className="size-4" />
546
+ <svg className="size-4 text-muted-foreground" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" aria-hidden="true">
547
+ <circle cx="12" cy="12" r="10" />
548
+ <path d="M2 12h20" />
549
+ <path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" />
550
+ </svg>
547
551
  </InputGroupAddon>
548
- <InputGroupInput placeholder="https://" className="!pl-0" />
552
+ <InputGroupInput placeholder="https://" />
549
553
  <InputGroupAddon align="inline-end">
550
554
  <Button variant="ghost" size="sm" className="size-6 p-0">
551
555
  <svg className="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" aria-hidden="true">
@@ -603,10 +607,10 @@ function SurveyOptionsDemo() {
603
607
  <FieldTitle>How did you hear about us?</FieldTitle>
604
608
  <FieldDescription>Select the option that best describes how you...</FieldDescription>
605
609
  <div className="mt-3 flex flex-wrap gap-2">
606
- <Button variant="outline" size="sm" className="gap-1.5">
610
+ <div className="inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-input bg-background px-3 py-1.5 text-sm font-medium shadow-xs hover:bg-accent hover:text-accent-foreground">
607
611
  <Checkbox className="size-4" defaultChecked />
608
612
  Social Media
609
- </Button>
613
+ </div>
610
614
  <Button variant="outline" size="sm">Search Engine</Button>
611
615
  <Button variant="outline" size="sm">Referral</Button>
612
616
  <Button variant="outline" size="sm">Other</Button>
@@ -618,12 +622,23 @@ function SurveyOptionsDemo() {
618
622
  function DesignSystemOverview() {
619
623
  return (
620
624
  <div className="mx-auto max-w-7xl p-6">
621
- <div className="flex flex-col gap-4 sm:flex-row">
622
- {/* Column 1 - wider for Payment Method */}
623
- <div className="flex w-full flex-col gap-4 sm:w-auto sm:min-w-[320px] xl:min-w-[340px]">
625
+ <header className="mb-10 text-center">
626
+ <h1 className="text-3xl font-bold tracking-tight">Design System</h1>
627
+ <p className="mt-2 text-muted-foreground">Reusable components that power your UI — explore the sidebar to see each in detail</p>
628
+ <p className="mt-2 text-s italic text-muted-foreground/70">Bring your own design system — coming soon!</p>
629
+ </header>
630
+ <div className="flex flex-col gap-4 sm:flex-row sm:items-start">
631
+ {/* Column 1 - Payment Method needs more space */}
632
+ <div className="flex flex-[1.3] flex-col gap-4">
624
633
  <Tile>
625
634
  <PaymentMethodDemo />
626
635
  </Tile>
636
+ <Tile>
637
+ <SourceSelectorDemo />
638
+ </Tile>
639
+ <Tile>
640
+ <CopilotDropdownDemo />
641
+ </Tile>
627
642
  </div>
628
643
 
629
644
  {/* Column 2 */}
@@ -631,12 +646,6 @@ function DesignSystemOverview() {
631
646
  <Tile>
632
647
  <EmptyAvatarGroupDemo />
633
648
  </Tile>
634
- <Tile>
635
- <SpinnerBadgeDemo />
636
- </Tile>
637
- <Tile>
638
- <NotionPromptDemo />
639
- </Tile>
640
649
  <Tile>
641
650
  <InputGroupDemo />
642
651
  </Tile>
@@ -654,7 +663,7 @@ function DesignSystemOverview() {
654
663
  <ItemDemo />
655
664
  </Tile>
656
665
  <Tile>
657
- <SourceSelectorDemo />
666
+ <SpinnerBadgeDemo />
658
667
  </Tile>
659
668
  <Tile>
660
669
  <AppearanceSettingsDemo />
@@ -662,7 +671,7 @@ function DesignSystemOverview() {
662
671
  </div>
663
672
 
664
673
  {/* Column 4 */}
665
- <div className="hidden flex-1 flex-col gap-4 xl:flex">
674
+ <div className="hidden flex-1 flex-col gap-4 2xl:flex">
666
675
  <Tile>
667
676
  <ButtonGroupDemo />
668
677
  </Tile>
@@ -670,10 +679,10 @@ function DesignSystemOverview() {
670
679
  <FieldCheckboxDemo />
671
680
  </Tile>
672
681
  <Tile>
673
- <PaginationDemo />
682
+ <NotionPromptDemo />
674
683
  </Tile>
675
684
  <Tile>
676
- <CopilotDropdownDemo />
685
+ <PaginationDemo />
677
686
  </Tile>
678
687
  <Tile>
679
688
  <SurveyOptionsDemo />
@@ -693,7 +702,7 @@ function DesignSystemOverview() {
693
702
  <ItemDemo />
694
703
  </Tile>
695
704
  <Tile>
696
- <SourceSelectorDemo />
705
+ <SpinnerBadgeDemo />
697
706
  </Tile>
698
707
  <Tile>
699
708
  <AppearanceSettingsDemo />
@@ -701,7 +710,7 @@ function DesignSystemOverview() {
701
710
  </div>
702
711
 
703
712
  {/* Overflow for column 4 on medium/large screens */}
704
- <div className="mt-4 grid grid-cols-2 gap-4 lg:grid-cols-3 xl:hidden">
713
+ <div className="mt-4 grid grid-cols-2 gap-4 lg:grid-cols-3 2xl:hidden">
705
714
  <Tile>
706
715
  <ButtonGroupDemo />
707
716
  </Tile>
@@ -709,10 +718,10 @@ function DesignSystemOverview() {
709
718
  <FieldCheckboxDemo />
710
719
  </Tile>
711
720
  <Tile>
712
- <PaginationDemo />
721
+ <NotionPromptDemo />
713
722
  </Tile>
714
723
  <Tile>
715
- <CopilotDropdownDemo />
724
+ <PaginationDemo />
716
725
  </Tile>
717
726
  <Tile>
718
727
  <SurveyOptionsDemo />