@auto-engineer/generate-react-client 1.64.0 → 1.66.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 (145) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/dist/starter/.storybook/main.ts +17 -22
  3. package/dist/starter/.storybook/manager-head.html +31 -31
  4. package/dist/starter/.storybook/manager.ts +133 -133
  5. package/dist/starter/.storybook/preview-head.html +12 -12
  6. package/dist/starter/.storybook/preview.tsx +79 -79
  7. package/dist/starter/biome.json +126 -0
  8. package/dist/starter/codegen.ts +11 -11
  9. package/dist/starter/components.json +27 -27
  10. package/dist/starter/package.json +86 -80
  11. package/dist/starter/public/mockServiceWorker.js +261 -261
  12. package/dist/starter/scripts/build-component-db.ts +17 -20
  13. package/dist/starter/src/App.tsx +15 -17
  14. package/dist/starter/src/components/ui/Accordion.stories.tsx +35 -35
  15. package/dist/starter/src/components/ui/Accordion.tsx +33 -33
  16. package/dist/starter/src/components/ui/Alert.stories.tsx +15 -15
  17. package/dist/starter/src/components/ui/Alert.tsx +32 -32
  18. package/dist/starter/src/components/ui/AlertDialog.stories.tsx +50 -50
  19. package/dist/starter/src/components/ui/AlertDialog.tsx +114 -115
  20. package/dist/starter/src/components/ui/AspectRatio.stories.tsx +20 -20
  21. package/dist/starter/src/components/ui/AspectRatio.tsx +1 -1
  22. package/dist/starter/src/components/ui/Avatar.stories.tsx +27 -27
  23. package/dist/starter/src/components/ui/Avatar.tsx +63 -63
  24. package/dist/starter/src/components/ui/Badge.stories.tsx +14 -14
  25. package/dist/starter/src/components/ui/Badge.tsx +27 -27
  26. package/dist/starter/src/components/ui/Breadcrumb.stories.tsx +38 -38
  27. package/dist/starter/src/components/ui/Breadcrumb.tsx +63 -62
  28. package/dist/starter/src/components/ui/Button.stories.tsx +55 -55
  29. package/dist/starter/src/components/ui/Button.tsx +49 -49
  30. package/dist/starter/src/components/ui/ButtonGroup.stories.tsx +17 -17
  31. package/dist/starter/src/components/ui/ButtonGroup.tsx +52 -53
  32. package/dist/starter/src/components/ui/Calendar.stories.tsx +20 -19
  33. package/dist/starter/src/components/ui/Calendar.tsx +142 -143
  34. package/dist/starter/src/components/ui/Card.stories.tsx +29 -29
  35. package/dist/starter/src/components/ui/Card.tsx +31 -31
  36. package/dist/starter/src/components/ui/Carousel.stories.tsx +41 -41
  37. package/dist/starter/src/components/ui/Carousel.tsx +171 -172
  38. package/dist/starter/src/components/ui/Chart.stories.tsx +21 -21
  39. package/dist/starter/src/components/ui/Chart.tsx +244 -247
  40. package/dist/starter/src/components/ui/Checkbox.stories.tsx +11 -11
  41. package/dist/starter/src/components/ui/Checkbox.tsx +18 -18
  42. package/dist/starter/src/components/ui/Collapsible.stories.tsx +40 -40
  43. package/dist/starter/src/components/ui/Collapsible.tsx +3 -3
  44. package/dist/starter/src/components/ui/Combobox.stories.tsx +48 -48
  45. package/dist/starter/src/components/ui/Combobox.tsx +204 -205
  46. package/dist/starter/src/components/ui/Command.stories.tsx +55 -55
  47. package/dist/starter/src/components/ui/Command.tsx +102 -103
  48. package/dist/starter/src/components/ui/ContextMenu.stories.tsx +52 -52
  49. package/dist/starter/src/components/ui/ContextMenu.tsx +151 -151
  50. package/dist/starter/src/components/ui/DesignSystem-Colors.stories.tsx +92 -92
  51. package/dist/starter/src/components/ui/DesignSystem-Layout.stories.tsx +139 -139
  52. package/dist/starter/src/components/ui/DesignSystem-Overview.stories.tsx +676 -657
  53. package/dist/starter/src/components/ui/DesignSystem-Typography.stories.tsx +59 -59
  54. package/dist/starter/src/components/ui/Dialog.stories.tsx +56 -56
  55. package/dist/starter/src/components/ui/Dialog.tsx +97 -98
  56. package/dist/starter/src/components/ui/Direction.stories.tsx +20 -20
  57. package/dist/starter/src/components/ui/Direction.tsx +7 -7
  58. package/dist/starter/src/components/ui/Drawer.stories.tsx +54 -54
  59. package/dist/starter/src/components/ui/Drawer.tsx +70 -70
  60. package/dist/starter/src/components/ui/DropdownMenu.stories.tsx +58 -58
  61. package/dist/starter/src/components/ui/DropdownMenu.tsx +157 -157
  62. package/dist/starter/src/components/ui/Empty.stories.tsx +22 -22
  63. package/dist/starter/src/components/ui/Empty.tsx +58 -58
  64. package/dist/starter/src/components/ui/Field.stories.tsx +31 -31
  65. package/dist/starter/src/components/ui/Field.tsx +180 -181
  66. package/dist/starter/src/components/ui/Form.stories.tsx +29 -29
  67. package/dist/starter/src/components/ui/Form.tsx +93 -96
  68. package/dist/starter/src/components/ui/HoverCard.stories.tsx +34 -34
  69. package/dist/starter/src/components/ui/HoverCard.tsx +21 -21
  70. package/dist/starter/src/components/ui/Input.stories.tsx +18 -18
  71. package/dist/starter/src/components/ui/Input.tsx +14 -14
  72. package/dist/starter/src/components/ui/InputGroup.stories.tsx +34 -34
  73. package/dist/starter/src/components/ui/InputGroup.tsx +110 -111
  74. package/dist/starter/src/components/ui/InputOTP.stories.tsx +28 -28
  75. package/dist/starter/src/components/ui/InputOTP.tsx +43 -43
  76. package/dist/starter/src/components/ui/Item.stories.tsx +45 -45
  77. package/dist/starter/src/components/ui/Item.tsx +113 -114
  78. package/dist/starter/src/components/ui/Kbd.stories.tsx +31 -31
  79. package/dist/starter/src/components/ui/Kbd.tsx +11 -11
  80. package/dist/starter/src/components/ui/Label.stories.tsx +62 -62
  81. package/dist/starter/src/components/ui/Label.tsx +26 -25
  82. package/dist/starter/src/components/ui/Menubar.stories.tsx +62 -62
  83. package/dist/starter/src/components/ui/Menubar.tsx +173 -173
  84. package/dist/starter/src/components/ui/NativeSelect.stories.tsx +26 -26
  85. package/dist/starter/src/components/ui/NativeSelect.tsx +29 -29
  86. package/dist/starter/src/components/ui/NavigationMenu.stories.tsx +64 -64
  87. package/dist/starter/src/components/ui/NavigationMenu.tsx +103 -103
  88. package/dist/starter/src/components/ui/Pagination.stories.tsx +61 -61
  89. package/dist/starter/src/components/ui/Pagination.tsx +69 -71
  90. package/dist/starter/src/components/ui/Popover.stories.tsx +38 -38
  91. package/dist/starter/src/components/ui/Popover.tsx +25 -25
  92. package/dist/starter/src/components/ui/Progress.stories.tsx +9 -9
  93. package/dist/starter/src/components/ui/Progress.tsx +14 -14
  94. package/dist/starter/src/components/ui/RadioGroup.stories.tsx +35 -35
  95. package/dist/starter/src/components/ui/RadioGroup.tsx +19 -19
  96. package/dist/starter/src/components/ui/Resizable.stories.tsx +54 -54
  97. package/dist/starter/src/components/ui/Resizable.tsx +29 -29
  98. package/dist/starter/src/components/ui/ScrollArea.stories.tsx +27 -27
  99. package/dist/starter/src/components/ui/ScrollArea.tsx +34 -34
  100. package/dist/starter/src/components/ui/Select.stories.tsx +43 -43
  101. package/dist/starter/src/components/ui/Select.tsx +120 -120
  102. package/dist/starter/src/components/ui/Separator.stories.tsx +27 -27
  103. package/dist/starter/src/components/ui/Separator.tsx +17 -17
  104. package/dist/starter/src/components/ui/Sheet.stories.tsx +53 -53
  105. package/dist/starter/src/components/ui/Sheet.tsx +69 -69
  106. package/dist/starter/src/components/ui/Sidebar.stories.tsx +77 -77
  107. package/dist/starter/src/components/ui/Sidebar.tsx +563 -564
  108. package/dist/starter/src/components/ui/Skeleton.stories.tsx +25 -25
  109. package/dist/starter/src/components/ui/Skeleton.tsx +1 -1
  110. package/dist/starter/src/components/ui/Slider.stories.tsx +5 -5
  111. package/dist/starter/src/components/ui/Slider.tsx +45 -44
  112. package/dist/starter/src/components/ui/Sonner.stories.tsx +32 -32
  113. package/dist/starter/src/components/ui/Sonner.tsx +23 -23
  114. package/dist/starter/src/components/ui/Spinner.stories.tsx +8 -8
  115. package/dist/starter/src/components/ui/Spinner.tsx +1 -1
  116. package/dist/starter/src/components/ui/Switch.stories.tsx +16 -17
  117. package/dist/starter/src/components/ui/Switch.tsx +24 -24
  118. package/dist/starter/src/components/ui/Table.stories.tsx +50 -50
  119. package/dist/starter/src/components/ui/Table.tsx +45 -45
  120. package/dist/starter/src/components/ui/Tabs.stories.tsx +39 -39
  121. package/dist/starter/src/components/ui/Tabs.tsx +47 -47
  122. package/dist/starter/src/components/ui/Textarea.stories.tsx +9 -9
  123. package/dist/starter/src/components/ui/Textarea.tsx +11 -11
  124. package/dist/starter/src/components/ui/Toast.stories.tsx +77 -77
  125. package/dist/starter/src/components/ui/Toast.tsx +75 -75
  126. package/dist/starter/src/components/ui/Toaster.tsx +17 -19
  127. package/dist/starter/src/components/ui/Toggle.stories.tsx +20 -20
  128. package/dist/starter/src/components/ui/Toggle.tsx +26 -26
  129. package/dist/starter/src/components/ui/ToggleGroup.stories.tsx +41 -41
  130. package/dist/starter/src/components/ui/ToggleGroup.tsx +61 -62
  131. package/dist/starter/src/components/ui/Tooltip.stories.tsx +26 -26
  132. package/dist/starter/src/components/ui/Tooltip.tsx +24 -24
  133. package/dist/starter/src/gql/execute.ts +1 -1
  134. package/dist/starter/src/gql/fragment-masking.ts +1 -1
  135. package/dist/starter/src/gql/graphql.ts +3 -0
  136. package/dist/starter/src/hooks/use-mobile.ts +11 -11
  137. package/dist/starter/src/hooks/use-toast.ts +135 -135
  138. package/dist/starter/src/index.css +105 -105
  139. package/dist/starter/src/lib/utils.ts +1 -1
  140. package/dist/starter/src/main.tsx +4 -1
  141. package/dist/starter/tsconfig.app.json +24 -24
  142. package/dist/starter/tsconfig.json +8 -8
  143. package/dist/starter/vite.config.ts +38 -37
  144. package/dist/tsconfig.tsbuildinfo +1 -1
  145. package/package.json +3 -3
@@ -1,20 +1,20 @@
1
+ import { UPDATE_DARK_MODE_EVENT_NAME } from '@vueless/storybook-dark-mode';
2
+ import { STORY_CHANGED } from 'storybook/internal/core-events';
1
3
  import { addons } from 'storybook/manager-api';
2
4
  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
5
 
6
6
  // Get initial theme from localStorage (dark mode addon) or URL parameter
7
7
  const urlParams = new URLSearchParams(window.location.search);
8
8
  const urlTheme = urlParams.get('theme');
9
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;
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
18
  };
19
19
  const initialIsDark = urlTheme ? urlTheme === 'dark' : getStoredDarkMode();
20
20
 
@@ -22,143 +22,143 @@ const initialIsDark = urlTheme ? urlTheme === 'dark' : getStoredDarkMode();
22
22
  // Analyzed from screenshots - app has slight blue undertone in grays
23
23
 
24
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',
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
67
  });
68
68
 
69
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',
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
112
  });
113
113
 
114
114
  const customTheme = initialIsDark ? darkTheme : lightTheme;
115
115
 
116
116
  addons.setConfig({
117
- theme: customTheme,
118
- sidebar: {
119
- collapsedRoots: ['ui-components'],
120
- },
121
- showPanel: false,
117
+ theme: customTheme,
118
+ sidebar: {
119
+ collapsedRoots: ['ui-components'],
120
+ },
121
+ showPanel: false,
122
122
  });
123
123
 
124
124
  // Set default story to Design System Overview if no path specified
125
125
  if (!urlParams.has('path')) {
126
- const newUrl = new URL(window.location.href);
127
- newUrl.searchParams.set('path', '/story/design-system-overview--default');
128
- window.history.replaceState({}, '', newUrl.toString());
126
+ const newUrl = new URL(window.location.href);
127
+ newUrl.searchParams.set('path', '/story/design-system-overview--default');
128
+ window.history.replaceState({}, '', newUrl.toString());
129
129
  }
130
130
 
131
131
  // Register addon to handle navigation sync and theme after Storybook is ready
132
132
  addons.register('url-sync', (api) => {
133
- const channel = api.getChannel();
134
- if (!channel) return;
135
-
136
- // Set initial dark mode state (pass string "dark" or "light", not boolean)
137
- if (initialIsDark) {
138
- channel.emit(UPDATE_DARK_MODE_EVENT_NAME, 'dark');
139
- }
140
-
141
- // Report navigation changes to parent window for URL bar sync
142
- channel.on(STORY_CHANGED, (storyId: string) => {
143
- if (window.parent !== window) {
144
- window.parent.postMessage({ type: 'storybook-navigation', storyId }, '*');
145
- }
146
- });
147
-
148
- // Listen for theme changes from parent window
149
- window.addEventListener('message', (event) => {
150
- if (event.data?.type === 'storybook-theme-change' && event.data?.theme) {
151
- const isDark = event.data.theme === 'dark';
152
- // Update the dark mode addon
153
- channel.emit(UPDATE_DARK_MODE_EVENT_NAME, event.data.theme);
154
- // Update the Storybook manager theme
155
- addons.setConfig({
156
- theme: isDark ? darkTheme : lightTheme,
157
- });
158
- // Update CSS theme selector and background
159
- document.documentElement.dataset.theme = isDark ? 'dark' : 'light';
160
- document.documentElement.style.backgroundColor = isDark ? '#1a1f2e' : '#f0f3f9';
161
- document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
162
- }
163
- });
133
+ const channel = api.getChannel();
134
+ if (!channel) return;
135
+
136
+ // Set initial dark mode state (pass string "dark" or "light", not boolean)
137
+ if (initialIsDark) {
138
+ channel.emit(UPDATE_DARK_MODE_EVENT_NAME, 'dark');
139
+ }
140
+
141
+ // Report navigation changes to parent window for URL bar sync
142
+ channel.on(STORY_CHANGED, (storyId: string) => {
143
+ if (window.parent !== window) {
144
+ window.parent.postMessage({ type: 'storybook-navigation', storyId }, '*');
145
+ }
146
+ });
147
+
148
+ // Listen for theme changes from parent window
149
+ window.addEventListener('message', (event) => {
150
+ if (event.data?.type === 'storybook-theme-change' && event.data?.theme) {
151
+ const isDark = event.data.theme === 'dark';
152
+ // Update the dark mode addon
153
+ channel.emit(UPDATE_DARK_MODE_EVENT_NAME, event.data.theme);
154
+ // Update the Storybook manager theme
155
+ addons.setConfig({
156
+ theme: isDark ? darkTheme : lightTheme,
157
+ });
158
+ // Update CSS theme selector and background
159
+ document.documentElement.dataset.theme = isDark ? 'dark' : 'light';
160
+ document.documentElement.style.backgroundColor = isDark ? '#1a1f2e' : '#f0f3f9';
161
+ document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
162
+ }
163
+ });
164
164
  });
@@ -1,7 +1,7 @@
1
1
  <style>
2
2
  /* Immediate CSS-based dark mode detection - no JS needed for initial paint */
3
3
  html, body {
4
- transition: none !important;
4
+ transition: none;
5
5
  background-color: #FFFFFF;
6
6
  color-scheme: light;
7
7
  }
@@ -14,13 +14,13 @@
14
14
  }
15
15
  /* When .dark class is set by JS */
16
16
  html.dark, html.dark body {
17
- background-color: #1a1f2e !important;
18
- color-scheme: dark !important;
17
+ background-color: #1a1f2e;
18
+ color-scheme: dark;
19
19
  }
20
20
  /* When .light class is set by JS (overrides prefers-color-scheme) */
21
21
  html.light, html.light body {
22
- background-color: #FFFFFF !important;
23
- color-scheme: light !important;
22
+ background-color: #FFFFFF;
23
+ color-scheme: light;
24
24
  }
25
25
 
26
26
  /* Fix inner iframe loading states */
@@ -29,8 +29,8 @@
29
29
  html.dark .sb-wrapper,
30
30
  html.dark #storybook-root,
31
31
  html.dark #storybook-docs {
32
- background-color: #1a1f2e !important;
33
- color-scheme: dark !important;
32
+ background-color: #1a1f2e;
33
+ color-scheme: dark;
34
34
  }
35
35
 
36
36
  /* Make spinner transparent in both light and dark mode */
@@ -38,18 +38,18 @@
38
38
  .sb-loader *,
39
39
  [class*="loader"],
40
40
  [class*="loader"] * {
41
- fill: transparent !important;
42
- background: transparent !important;
43
- background-color: transparent !important;
41
+ fill: transparent;
42
+ background: transparent;
43
+ background-color: transparent;
44
44
  }
45
45
 
46
46
  /* Set dark background on all iframes in dark mode to reduce flash from external content */
47
47
  html.dark iframe {
48
- background-color: #1a1f2e !important;
48
+ background-color: #1a1f2e;
49
49
  }
50
50
  </style>
51
51
  <script>
52
- (function() {
52
+ (() => {
53
53
  var isDark = false;
54
54
  var stored, parsed, urlParams, urlTheme;
55
55
  try {
@@ -1,42 +1,42 @@
1
+ import { DocsContainer } from '@storybook/addon-docs/blocks';
1
2
  import type { Preview } from '@storybook/react-vite';
3
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
4
+ import { DARK_MODE_EVENT_NAME } from '@vueless/storybook-dark-mode';
5
+ import { initialize, mswLoader } from 'msw-storybook-addon';
2
6
  import type { PropsWithChildren } from 'react';
3
7
  import { useEffect, useState } from 'react';
4
8
  import { addons } from 'storybook/preview-api';
5
9
  import { themes } from 'storybook/theming';
6
- import { DocsContainer } from '@storybook/addon-docs/blocks';
7
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
8
- import { DARK_MODE_EVENT_NAME } from '@vueless/storybook-dark-mode';
9
- import { initialize, mswLoader } from 'msw-storybook-addon';
10
10
  import '../src/index.css';
11
11
 
12
12
  initialize({
13
- onUnhandledRequest: 'bypass',
13
+ onUnhandledRequest: 'bypass',
14
14
  });
15
15
 
16
16
  // Apply theme to the preview iframe (for component styling and background)
17
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';
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
26
  };
27
27
 
28
28
  // Get initial theme from URL parameter or localStorage
29
29
  const urlParams = new URLSearchParams(window.location.search);
30
30
  const urlTheme = urlParams.get('theme');
31
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;
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
40
  };
41
41
  const initialIsDark = urlTheme ? urlTheme === 'dark' : getStoredDarkMode();
42
42
  applyTheme(initialIsDark);
@@ -44,77 +44,77 @@ applyTheme(initialIsDark);
44
44
  // Listen to dark mode addon changes and sync with our CSS class
45
45
  const channel = addons.getChannel();
46
46
  channel.on(DARK_MODE_EVENT_NAME, (isDark: boolean) => {
47
- applyTheme(isDark);
47
+ applyTheme(isDark);
48
48
  });
49
49
 
50
50
  const queryClient = new QueryClient({
51
- defaultOptions: {
52
- queries: {
53
- retry: false,
54
- },
55
- },
51
+ defaultOptions: {
52
+ queries: {
53
+ retry: false,
54
+ },
55
+ },
56
56
  });
57
57
 
58
58
  // Themed docs container that responds to dark mode
59
59
  function ThemedDocsContainer({
60
- children,
61
- context,
60
+ children,
61
+ context,
62
62
  }: PropsWithChildren<{ context: Parameters<typeof DocsContainer>[0]['context'] }>) {
63
- const [isDark, setIsDark] = useState(initialIsDark);
63
+ const [isDark, setIsDark] = useState(initialIsDark);
64
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
- }, []);
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
70
 
71
- return (
72
- <DocsContainer context={context} theme={isDark ? themes.dark : themes.light}>
73
- {children}
74
- </DocsContainer>
75
- );
71
+ return (
72
+ <DocsContainer context={context} theme={isDark ? themes.dark : themes.light}>
73
+ {children}
74
+ </DocsContainer>
75
+ );
76
76
  }
77
77
 
78
78
  const preview: Preview = {
79
- tags: ['autodocs'],
80
- decorators: [
81
- (Story) => (
82
- <QueryClientProvider client={queryClient}>
83
- <Story />
84
- </QueryClientProvider>
85
- ),
86
- ],
87
- parameters: {
88
- controls: {
89
- matchers: {
90
- color: /(background|color)$/i,
91
- date: /Date$/i,
92
- },
93
- },
94
- viewport: {
95
- defaultViewport: 'desktop',
96
- },
97
- layout: 'padded',
98
- options: {
99
- showPanel: false,
100
- storySort: {
101
- order: ['Design System', ['Overview', '*'], 'UI Components'],
102
- },
103
- },
104
- darkMode: {
105
- current: initialIsDark ? 'dark' : 'light',
106
- stylePreview: true,
107
- dark: themes.dark,
108
- light: themes.light,
109
- },
110
- docs: {
111
- container: ThemedDocsContainer,
112
- },
113
- },
114
- initialGlobals: {
115
- showPanel: false,
116
- },
117
- loaders: [mswLoader],
79
+ tags: ['autodocs'],
80
+ decorators: [
81
+ (Story) => (
82
+ <QueryClientProvider client={queryClient}>
83
+ <Story />
84
+ </QueryClientProvider>
85
+ ),
86
+ ],
87
+ parameters: {
88
+ controls: {
89
+ matchers: {
90
+ color: /(background|color)$/i,
91
+ date: /Date$/i,
92
+ },
93
+ },
94
+ viewport: {
95
+ defaultViewport: 'desktop',
96
+ },
97
+ layout: 'padded',
98
+ options: {
99
+ showPanel: false,
100
+ storySort: {
101
+ order: ['Design System', ['Overview', '*'], 'UI Components'],
102
+ },
103
+ },
104
+ darkMode: {
105
+ current: initialIsDark ? 'dark' : 'light',
106
+ stylePreview: true,
107
+ dark: themes.dark,
108
+ light: themes.light,
109
+ },
110
+ docs: {
111
+ container: ThemedDocsContainer,
112
+ },
113
+ },
114
+ initialGlobals: {
115
+ showPanel: false,
116
+ },
117
+ loaders: [mswLoader],
118
118
  };
119
119
 
120
120
  export default preview;