@shohojdhara/atomix 0.4.8 → 0.5.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 (177) hide show
  1. package/atomix.config.ts +58 -1
  2. package/dist/atomix.css +148 -120
  3. package/dist/atomix.css.map +1 -1
  4. package/dist/atomix.min.css +1 -1
  5. package/dist/atomix.min.css.map +1 -1
  6. package/dist/charts.d.ts +33 -0
  7. package/dist/charts.js +1227 -122
  8. package/dist/charts.js.map +1 -1
  9. package/dist/core.d.ts +33 -10
  10. package/dist/core.js +1052 -41
  11. package/dist/core.js.map +1 -1
  12. package/dist/forms.d.ts +33 -0
  13. package/dist/forms.js +2086 -1035
  14. package/dist/forms.js.map +1 -1
  15. package/dist/heavy.d.ts +42 -1
  16. package/dist/heavy.js +1620 -600
  17. package/dist/heavy.js.map +1 -1
  18. package/dist/index.d.ts +441 -270
  19. package/dist/index.esm.js +1900 -638
  20. package/dist/index.esm.js.map +1 -1
  21. package/dist/index.js +1935 -670
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.min.js +1 -1
  24. package/dist/index.min.js.map +1 -1
  25. package/package.json +6 -3
  26. package/scripts/atomix-cli.js +148 -4
  27. package/scripts/cli/__tests__/basic.test.js +3 -2
  28. package/scripts/cli/__tests__/clean.test.js +278 -0
  29. package/scripts/cli/__tests__/component-validator.test.js +433 -0
  30. package/scripts/cli/__tests__/generator.test.js +613 -0
  31. package/scripts/cli/__tests__/glass-motion.test.js +256 -0
  32. package/scripts/cli/__tests__/integration.test.js +719 -108
  33. package/scripts/cli/__tests__/migrate.test.js +74 -0
  34. package/scripts/cli/__tests__/security.test.js +206 -0
  35. package/scripts/cli/__tests__/test-setup.js +3 -1
  36. package/scripts/cli/__tests__/theme-bridge.test.js +507 -0
  37. package/scripts/cli/__tests__/token-provider.test.js +361 -0
  38. package/scripts/cli/__tests__/utils.test.js +5 -5
  39. package/scripts/cli/commands/benchmark.js +105 -0
  40. package/scripts/cli/commands/build-theme.js +4 -1
  41. package/scripts/cli/commands/clean.js +109 -0
  42. package/scripts/cli/commands/doctor.js +88 -0
  43. package/scripts/cli/commands/generate.js +135 -14
  44. package/scripts/cli/commands/init.js +45 -18
  45. package/scripts/cli/commands/migrate.js +106 -0
  46. package/scripts/cli/commands/sync-tokens.js +206 -0
  47. package/scripts/cli/commands/theme-bridge.js +248 -0
  48. package/scripts/cli/commands/tokens.js +157 -0
  49. package/scripts/cli/commands/validate.js +194 -0
  50. package/scripts/cli/internal/ai-engine.js +156 -0
  51. package/scripts/cli/internal/component-validator.js +443 -0
  52. package/scripts/cli/internal/config-loader.js +162 -0
  53. package/scripts/cli/internal/filesystem.js +102 -2
  54. package/scripts/cli/internal/generator.js +359 -39
  55. package/scripts/cli/internal/glass-generator.js +398 -0
  56. package/scripts/cli/internal/hook-generator.js +369 -0
  57. package/scripts/cli/internal/hooks.js +61 -0
  58. package/scripts/cli/internal/itcss-generator.js +565 -0
  59. package/scripts/cli/internal/motion-generator.js +679 -0
  60. package/scripts/cli/internal/template-engine.js +301 -0
  61. package/scripts/cli/internal/theme-bridge.js +664 -0
  62. package/scripts/cli/internal/tokens/engine.js +122 -0
  63. package/scripts/cli/internal/tokens/provider.js +34 -0
  64. package/scripts/cli/internal/tokens/providers/figma.js +50 -0
  65. package/scripts/cli/internal/tokens/providers/style-dictionary.js +48 -0
  66. package/scripts/cli/internal/tokens/providers/w3c.js +48 -0
  67. package/scripts/cli/internal/tokens/token-provider.js +443 -0
  68. package/scripts/cli/internal/tokens/token-validator.js +513 -0
  69. package/scripts/cli/internal/validator.js +276 -0
  70. package/scripts/cli/internal/wizard.js +60 -6
  71. package/scripts/cli/mappings.js +23 -0
  72. package/scripts/cli/migration-tools.js +164 -94
  73. package/scripts/cli/plugins/style-dictionary.js +46 -0
  74. package/scripts/cli/templates/README.md +525 -95
  75. package/scripts/cli/templates/common-templates.js +40 -14
  76. package/scripts/cli/templates/components/react-component.ts +282 -0
  77. package/scripts/cli/templates/config/project-config.ts +112 -0
  78. package/scripts/cli/templates/hooks/use-component.ts +477 -0
  79. package/scripts/cli/templates/index.js +19 -4
  80. package/scripts/cli/templates/index.ts +171 -0
  81. package/scripts/cli/templates/next-templates.js +72 -0
  82. package/scripts/cli/templates/react-templates.js +70 -126
  83. package/scripts/cli/templates/scss-templates.js +35 -35
  84. package/scripts/cli/templates/stories/storybook-story.ts +241 -0
  85. package/scripts/cli/templates/styles/scss-component.ts +255 -0
  86. package/scripts/cli/templates/tests/vitest-test.ts +229 -0
  87. package/scripts/cli/templates/token-templates.js +337 -1
  88. package/scripts/cli/templates/tokens/token-generators.ts +1088 -0
  89. package/scripts/cli/templates/types/component-types.ts +145 -0
  90. package/scripts/cli/templates/utils/testing-utils.ts +144 -0
  91. package/scripts/cli/templates/vanilla-templates.js +39 -0
  92. package/scripts/cli/token-manager.js +8 -2
  93. package/scripts/cli/utils/cache-manager.js +240 -0
  94. package/scripts/cli/utils/detector.js +46 -0
  95. package/scripts/cli/utils/diagnostics.js +289 -0
  96. package/scripts/cli/utils/error.js +45 -3
  97. package/scripts/cli/utils/helpers.js +24 -0
  98. package/scripts/cli/utils/logger.js +1 -1
  99. package/scripts/cli/utils/security.js +302 -0
  100. package/scripts/cli/utils/telemetry.js +115 -0
  101. package/scripts/cli/utils/validation.js +4 -38
  102. package/scripts/cli/utils.js +46 -0
  103. package/src/components/Accordion/Accordion.stories.tsx +0 -18
  104. package/src/components/Accordion/Accordion.test.tsx +0 -17
  105. package/src/components/Accordion/Accordion.tsx +0 -4
  106. package/src/components/AtomixGlass/AtomixGlass.tsx +102 -2
  107. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +125 -12
  108. package/src/components/AtomixGlass/PerformanceDashboard.tsx +219 -0
  109. package/src/components/AtomixGlass/README.md +25 -10
  110. package/src/components/AtomixGlass/animation-system.ts +578 -0
  111. package/src/components/AtomixGlass/shader-utils.ts +3 -0
  112. package/src/components/AtomixGlass/stories/AnimationFeatures.stories.tsx +653 -0
  113. package/src/components/AtomixGlass/stories/AnimationTests.stories.tsx +95 -0
  114. package/src/components/AtomixGlass/stories/CardExamples.stories.tsx +212 -0
  115. package/src/components/AtomixGlass/stories/DashboardExamples.stories.tsx +348 -0
  116. package/src/components/AtomixGlass/stories/EcommerceExamples.stories.tsx +410 -0
  117. package/src/components/AtomixGlass/stories/FormExamples.stories.tsx +436 -0
  118. package/src/components/AtomixGlass/stories/HeroExamples.stories.tsx +264 -0
  119. package/src/components/AtomixGlass/stories/InteractivePlayground.stories.tsx +247 -0
  120. package/src/components/AtomixGlass/stories/MobileUIExamples.stories.tsx +418 -0
  121. package/src/components/AtomixGlass/stories/ModalExamples.stories.tsx +402 -0
  122. package/src/components/AtomixGlass/stories/Overview.stories.tsx +157 -6
  123. package/src/components/AtomixGlass/stories/Playground.stories.tsx +658 -93
  124. package/src/components/AtomixGlass/stories/PresetGallery.stories.tsx +335 -0
  125. package/src/components/AtomixGlass/stories/WidgetExamples.stories.tsx +441 -0
  126. package/src/components/AtomixGlass/stories/argTypes.ts +384 -0
  127. package/src/components/AtomixGlass/stories/shared-components.tsx +91 -1
  128. package/src/components/AtomixGlass/stories/types.ts +127 -0
  129. package/src/components/Avatar/Avatar.tsx +1 -1
  130. package/src/components/Button/Button.stories.disabled-link.tsx +10 -0
  131. package/src/components/Button/Button.stories.tsx +10 -0
  132. package/src/components/Button/Button.test.tsx +16 -11
  133. package/src/components/Button/Button.tsx +4 -4
  134. package/src/components/Card/Card.tsx +1 -1
  135. package/src/components/Dropdown/Dropdown.tsx +12 -12
  136. package/src/components/Form/Select.tsx +62 -3
  137. package/src/components/Modal/Modal.tsx +14 -3
  138. package/src/components/Navigation/Navbar/Navbar.tsx +44 -0
  139. package/src/components/Slider/Slider.stories.tsx +3 -3
  140. package/src/components/Slider/Slider.tsx +38 -0
  141. package/src/components/Steps/Steps.tsx +3 -3
  142. package/src/components/Tabs/Tabs.tsx +77 -8
  143. package/src/components/Testimonial/Testimonial.tsx +1 -1
  144. package/src/components/TypedButton/TypedButton.stories.tsx +59 -0
  145. package/src/components/TypedButton/TypedButton.tsx +39 -0
  146. package/src/components/TypedButton/index.ts +2 -0
  147. package/src/components/VideoPlayer/VideoPlayer.tsx +11 -4
  148. package/src/lib/composables/index.ts +4 -7
  149. package/src/lib/composables/types.ts +45 -0
  150. package/src/lib/composables/useAccordion.ts +0 -7
  151. package/src/lib/composables/useAtomixGlass.ts +144 -5
  152. package/src/lib/composables/useChartExport.ts +3 -13
  153. package/src/lib/composables/useDropdown.ts +66 -0
  154. package/src/lib/composables/useFocusTrap.ts +80 -0
  155. package/src/lib/composables/usePerformanceMonitor.ts +448 -0
  156. package/src/lib/composables/useResponsiveGlass.presets.ts +192 -0
  157. package/src/lib/composables/useResponsiveGlass.ts +441 -0
  158. package/src/lib/composables/useTooltip.ts +16 -0
  159. package/src/lib/composables/useTypedButton.ts +66 -0
  160. package/src/lib/config/index.ts +62 -5
  161. package/src/lib/constants/components.ts +55 -0
  162. package/src/lib/theme/devtools/__tests__/useHistory.test.tsx +150 -0
  163. package/src/lib/theme/tokens/centralized-tokens.ts +120 -0
  164. package/src/lib/theme/utils/__tests__/domUtils.test.ts +101 -0
  165. package/src/lib/types/components.ts +37 -11
  166. package/src/lib/types/glass.ts +35 -0
  167. package/src/lib/types/index.ts +1 -0
  168. package/src/lib/utils/displacement-generator.ts +1 -1
  169. package/src/styles/01-settings/_settings.testtypecheck.scss +53 -0
  170. package/src/styles/01-settings/_settings.typedbutton.scss +53 -0
  171. package/src/styles/06-components/_components.testbutton.scss +212 -0
  172. package/src/styles/06-components/_components.testtypecheck.scss +212 -0
  173. package/src/styles/06-components/_components.typedbutton.scss +212 -0
  174. package/src/styles/99-utilities/_index.scss +1 -0
  175. package/src/styles/99-utilities/_utilities.text.scss +1 -1
  176. package/src/styles/99-utilities/_utilities.touch-target.scss +36 -0
  177. package/src/styles/06-components/old.chart.styles.scss +0 -2788
@@ -0,0 +1,247 @@
1
+ /**
2
+ * InteractivePlayground.stories.tsx
3
+ *
4
+ * Simplified interactive playground for AtomixGlass with essential controls.
5
+ * Provides real-time adjustment of key parameters without the complexity
6
+ * of the full-featured playground.
7
+ *
8
+ * @package Atomix
9
+ * @component AtomixGlass
10
+ */
11
+ import React from 'react';
12
+ import { useState } from 'react';
13
+ import { Meta, StoryObj } from '@storybook/react';
14
+ import AtomixGlass from '../AtomixGlass';
15
+ import { BackgroundWrapper, backgroundImages, StoryErrorBoundary } from './shared-components';
16
+ import { advancedArgTypes } from './argTypes';
17
+
18
+ import { Button } from '../../Button/Button';
19
+
20
+ const meta: Meta<typeof AtomixGlass> = {
21
+ title: 'Components/AtomixGlass/Interactive Playground',
22
+ component: AtomixGlass,
23
+ parameters: {
24
+ layout: 'fullscreen',
25
+ docs: {
26
+ description: {
27
+ component:
28
+ 'Interactive playground for experimenting with AtomixGlass parameters in real-time. Adjust displacement, blur, saturation, and other effects to find the perfect glass aesthetic.',
29
+ },
30
+ },
31
+ },
32
+ tags: ['autodocs'],
33
+ argTypes: advancedArgTypes,
34
+ };
35
+
36
+ export default meta;
37
+ type Story = StoryObj<typeof AtomixGlass>;
38
+
39
+ /**
40
+ * Main Interactive Playground
41
+ *
42
+ * Full-featured playground with live controls for all major parameters.
43
+ */
44
+ export const Interactive: Story = {
45
+ render: () => {
46
+ const [displacementScale, setDisplacementScale] = useState(70);
47
+ const [blurAmount, setBlurAmount] = useState(0.5);
48
+ const [saturation, setSaturation] = useState(140);
49
+ const [aberrationIntensity, setAberrationIntensity] = useState(2);
50
+ const [borderRadius, setBorderRadius] = useState(20);
51
+ const [mode, setMode] = useState<'standard' | 'polar' | 'prominent' | 'shader'>('standard');
52
+
53
+ return (
54
+ <StoryErrorBoundary>
55
+ <BackgroundWrapper backgroundImage={backgroundImages[0]} overlay overlayOpacity={0.3}>
56
+ <div style={{ display: 'flex', gap: '32px', padding: '40px', flexWrap: 'wrap' }}>
57
+ {/* Controls Panel */}
58
+ <div
59
+ style={{
60
+ width: '320px',
61
+ flexShrink: 0,
62
+ }}
63
+ >
64
+ <AtomixGlass
65
+ displacementScale={50}
66
+ blurAmount={0.4}
67
+ saturation={130}
68
+ borderRadius={16}
69
+ mode="standard"
70
+ padding="24px"
71
+ >
72
+ <div className="u-text-white">
73
+ <h3 className="u-mt-0 u-text-lg u-font-bold u-mb-4">Live Controls</h3>
74
+
75
+ {/* Displacement Control */}
76
+ <div className="u-mb-4">
77
+ <label className="u-block u-text-sm u-font-semibold u-mb-2">
78
+ Displacement: {displacementScale}
79
+ </label>
80
+ <input
81
+ type="range"
82
+ min="0"
83
+ max="100"
84
+ value={displacementScale}
85
+ onChange={(e) => setDisplacementScale(Number(e.target.value))}
86
+ style={{ width: '100%', accentColor: '#667eea' }}
87
+ />
88
+ </div>
89
+
90
+ {/* Blur Control */}
91
+ <div className="u-mb-4">
92
+ <label className="u-block u-text-sm u-font-semibold u-mb-2">
93
+ Blur: {blurAmount}
94
+ </label>
95
+ <input
96
+ type="range"
97
+ min="0"
98
+ max="10"
99
+ step="0.5"
100
+ value={blurAmount}
101
+ onChange={(e) => setBlurAmount(Number(e.target.value))}
102
+ style={{ width: '100%', accentColor: '#667eea' }}
103
+ />
104
+ </div>
105
+
106
+ {/* Saturation Control */}
107
+ <div className="u-mb-4">
108
+ <label className="u-block u-text-sm u-font-semibold u-mb-2">
109
+ Saturation: {saturation}%
110
+ </label>
111
+ <input
112
+ type="range"
113
+ min="100"
114
+ max="300"
115
+ value={saturation}
116
+ onChange={(e) => setSaturation(Number(e.target.value))}
117
+ style={{ width: '100%', accentColor: '#667eea' }}
118
+ />
119
+ </div>
120
+
121
+ {/* Aberration Control */}
122
+ <div className="u-mb-4">
123
+ <label className="u-block u-text-sm u-font-semibold u-mb-2">
124
+ Aberration: {aberrationIntensity}
125
+ </label>
126
+ <input
127
+ type="range"
128
+ min="0"
129
+ max="10"
130
+ step="0.1"
131
+ value={aberrationIntensity}
132
+ onChange={(e) => setAberrationIntensity(Number(e.target.value))}
133
+ style={{ width: '100%', accentColor: '#667eea' }}
134
+ />
135
+ </div>
136
+
137
+ {/* Border Radius Control */}
138
+ <div className="u-mb-4">
139
+ <label className="u-block u-text-sm u-font-semibold u-mb-2">
140
+ Border Radius: {borderRadius}px
141
+ </label>
142
+ <input
143
+ type="range"
144
+ min="0"
145
+ max="50"
146
+ value={borderRadius}
147
+ onChange={(e) => setBorderRadius(Number(e.target.value))}
148
+ style={{ width: '100%', accentColor: '#667eea' }}
149
+ />
150
+ </div>
151
+
152
+ {/* Mode Selection */}
153
+ <div className="u-mb-4">
154
+ <label className="u-block u-text-sm u-font-semibold u-mb-2">Mode</label>
155
+ <select
156
+ value={mode}
157
+ onChange={(e) => setMode(e.target.value as any)}
158
+ style={{
159
+ width: '100%',
160
+ padding: '8px',
161
+ borderRadius: '8px',
162
+ border: '1px solid rgba(255,255,255,0.2)',
163
+ background: 'rgba(255,255,255,0.1)',
164
+ color: 'white',
165
+ fontSize: '14px',
166
+ }}
167
+ >
168
+ <option value="standard">Standard</option>
169
+ <option value="polar">Polar</option>
170
+ <option value="prominent">Prominent</option>
171
+ <option value="shader">Shader</option>
172
+ </select>
173
+ </div>
174
+
175
+ {/* Reset Button */}
176
+ <Button
177
+ variant="outline-light"
178
+ glass={{ elasticity: 0 }}
179
+ onClick={() => {
180
+ setDisplacementScale(70);
181
+ setBlurAmount(0.5);
182
+ setSaturation(140);
183
+ setAberrationIntensity(2);
184
+ setBorderRadius(20);
185
+ setMode('standard');
186
+ }}
187
+ size="sm"
188
+ className="u-w-full"
189
+ >
190
+ Reset to Defaults
191
+ </Button>
192
+ </div>
193
+ </AtomixGlass>
194
+ </div>
195
+
196
+ {/* Preview Area */}
197
+ <div style={{ flex: 1, minWidth: '400px' }}>
198
+ <AtomixGlass
199
+ displacementScale={displacementScale}
200
+ blurAmount={blurAmount}
201
+ saturation={saturation}
202
+ aberrationIntensity={aberrationIntensity}
203
+ borderRadius={borderRadius}
204
+ mode={mode}
205
+ padding="40px"
206
+ style={{ minHeight: '400px' }}
207
+ >
208
+ <div className="u-text-center u-text-white">
209
+ <h2 className="u-mt-0 u-text-3xl u-font-bold u-mb-3">
210
+ Live Preview
211
+ </h2>
212
+ <p className="u-text-lg u-opacity-90 u-mb-4">
213
+ Adjust the controls to see real-time changes
214
+ </p>
215
+ <div
216
+ style={{
217
+ fontSize: '64px',
218
+ margin: '24px 0',
219
+ filter: 'drop-shadow(0 4px 8px rgba(0,0,0,0.3))',
220
+ }}
221
+ aria-hidden="true"
222
+ >
223
+ 🎨
224
+ </div>
225
+ <p className="u-text-sm u-opacity-80">
226
+ Current settings:{' '}
227
+ <code style={{ background: 'rgba(255,255,255,0.2)', padding: '4px 8px', borderRadius: '4px' }}>
228
+ {mode} mode
229
+ </code>
230
+ </p>
231
+ </div>
232
+ </AtomixGlass>
233
+ </div>
234
+ </div>
235
+ </BackgroundWrapper>
236
+ </StoryErrorBoundary>
237
+ );
238
+ },
239
+ parameters: {
240
+ docs: {
241
+ description: {
242
+ story:
243
+ 'Interactive playground with live controls for displacement, blur, saturation, aberration, border radius, and rendering mode.',
244
+ },
245
+ },
246
+ },
247
+ };
@@ -0,0 +1,418 @@
1
+ /**
2
+ * MobileUIExamples.stories.tsx
3
+ *
4
+ * Mobile-specific UI examples for AtomixGlass including phone frames,
5
+ * mobile navigation, and responsive layouts.
6
+ *
7
+ * @package Atomix
8
+ * @component AtomixGlass
9
+ */
10
+ import React from 'react';
11
+ import { useState } from 'react';
12
+ import { Meta, StoryObj } from '@storybook/react';
13
+ import AtomixGlass from '../AtomixGlass';
14
+ import { BackgroundWrapper, backgroundImages, StoryErrorBoundary } from './shared-components';
15
+ import { baseArgTypes } from './argTypes';
16
+
17
+ import { Button } from '../../Button';
18
+ import { Badge } from '../../Badge';
19
+
20
+ const meta: Meta<typeof AtomixGlass> = {
21
+ title: 'Components/AtomixGlass/Examples/Mobile UI Examples',
22
+ component: AtomixGlass,
23
+ parameters: {
24
+ layout: 'centered',
25
+ docs: {
26
+ description: {
27
+ component:
28
+ 'Mobile-specific UI examples demonstrating AtomixGlass for smartphone interfaces, mobile navigation, and responsive designs.',
29
+ },
30
+ },
31
+ },
32
+ tags: ['!autodocs'],
33
+ argTypes: {
34
+ ...baseArgTypes,
35
+ children: { control: false },
36
+ },
37
+ };
38
+
39
+ export default meta;
40
+ type Story = StoryObj<typeof AtomixGlass>;
41
+
42
+ /**
43
+ * Mobile App Interface
44
+ *
45
+ * Complete mobile app interface with phone frame, header, content, and tab bar.
46
+ */
47
+ export const MobileAppInterface: Story = {
48
+ render: () => {
49
+ const [activeTab, setActiveTab] = useState('home');
50
+
51
+ return (
52
+ <StoryErrorBoundary>
53
+ <BackgroundWrapper backgroundImage={backgroundImages[5]} overlay overlayOpacity={0.3}>
54
+ {/* Phone Frame */}
55
+ <div
56
+ style={{
57
+ width: '375px',
58
+ height: '812px',
59
+ borderRadius: '40px',
60
+ padding: '12px',
61
+ background: 'linear-gradient(135deg, #1f2937 0%, #111827 100%)',
62
+ boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5)',
63
+ position: 'relative',
64
+ }}
65
+ role="img"
66
+ aria-label="Mobile phone frame"
67
+ >
68
+ {/* Phone Notch */}
69
+ <div
70
+ style={{
71
+ position: 'absolute',
72
+ top: '12px',
73
+ left: '50%',
74
+ transform: 'translateX(-50%)',
75
+ width: '150px',
76
+ height: '30px',
77
+ borderBottomLeftRadius: '16px',
78
+ borderBottomRightRadius: '16px',
79
+ background: '#000',
80
+ zIndex: 100,
81
+ }}
82
+ aria-hidden="true"
83
+ />
84
+
85
+ {/* Screen */}
86
+ <div
87
+ style={{
88
+ width: '100%',
89
+ height: '100%',
90
+ borderRadius: '32px',
91
+ overflow: 'hidden',
92
+ position: 'relative',
93
+ }}
94
+ >
95
+ <AtomixGlass
96
+ displacementScale={60}
97
+ blurAmount={0}
98
+ borderRadius={32}
99
+ mode="standard"
100
+ style={{ height: '100%' }}
101
+ >
102
+ <div className="u-text-white" style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
103
+ {/* Status Bar */}
104
+ <div
105
+ style={{
106
+ padding: '44px 20px 12px',
107
+ display: 'flex',
108
+ justifyContent: 'space-between',
109
+ alignItems: 'center',
110
+ fontSize: '12px',
111
+ fontWeight: 600,
112
+ }}
113
+ >
114
+ <span>9:41</span>
115
+ <div className="u-flex u-items-center u-gap-1">
116
+ <span>📶</span>
117
+ <span>🔋</span>
118
+ </div>
119
+ </div>
120
+
121
+ {/* Header */}
122
+ <div
123
+ style={{
124
+ padding: '16px 20px',
125
+ borderBottom: '1px solid rgba(255,255,255,0.1)',
126
+ }}
127
+ >
128
+ <h1 className="u-m-0 u-text-2xl u-font-bold">Home</h1>
129
+ <p className="u-m-0 u-text-sm u-opacity-70">Welcome back!</p>
130
+ </div>
131
+
132
+ {/* Content */}
133
+ <div style={{ flex: 1, padding: '20px', overflowY: 'auto' }}>
134
+ {activeTab === 'home' && (
135
+ <>
136
+ {/* Profile Card */}
137
+ <AtomixGlass
138
+ displacementScale={50}
139
+ blurAmount={0.5}
140
+ borderRadius={20}
141
+ mode="standard"
142
+ padding="20px"
143
+ className="u-mb-3"
144
+ >
145
+ <div className="u-flex u-items-center u-gap-3">
146
+ <div
147
+ style={{
148
+ width: '50px',
149
+ height: '50px',
150
+ borderRadius: '50%',
151
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
152
+ display: 'flex',
153
+ alignItems: 'center',
154
+ justifyContent: 'center',
155
+ fontSize: '24px',
156
+ }}
157
+ aria-hidden="true"
158
+ >
159
+ 👤
160
+ </div>
161
+ <div className="u-flex-1">
162
+ <p className="u-m-0 u-font-semibold">John Doe</p>
163
+ <p className="u-m-0 u-text-xs u-opacity-70">Premium Member</p>
164
+ </div>
165
+ <Badge variant="primary">Pro</Badge>
166
+ </div>
167
+ </AtomixGlass>
168
+
169
+ {/* Stats Grid */}
170
+ <div
171
+ style={{
172
+ display: 'grid',
173
+ gridTemplateColumns: 'repeat(2, 1fr)',
174
+ gap: '12px',
175
+ marginBottom: '16px',
176
+ }}
177
+ >
178
+ {[
179
+ { label: 'Balance', value: '$2,450', icon: '💰' },
180
+ { label: 'Points', value: '1,200', icon: '⭐' },
181
+ ].map((stat, index) => (
182
+ <AtomixGlass
183
+ key={index}
184
+ displacementScale={40}
185
+ blurAmount={0.4}
186
+ borderRadius={16}
187
+ mode="standard"
188
+ padding="16px"
189
+ >
190
+ <div className="u-text-center">
191
+ <div style={{ fontSize: '24px', marginBottom: '8px' }}>{stat.icon}</div>
192
+ <p className="u-m-0 u-text-lg u-font-bold">{stat.value}</p>
193
+ <p className="u-m-0 u-text-xs u-opacity-70">{stat.label}</p>
194
+ </div>
195
+ </AtomixGlass>
196
+ ))}
197
+ </div>
198
+
199
+ {/* Recent Activity */}
200
+ <AtomixGlass
201
+ displacementScale={45}
202
+ blurAmount={0.5}
203
+ borderRadius={20}
204
+ mode="standard"
205
+ padding="20px"
206
+ >
207
+ <h3 className="u-mt-0 u-text-base u-font-bold u-mb-3">Recent Activity</h3>
208
+ {[1, 2, 3].map((item) => (
209
+ <div
210
+ key={item}
211
+ className="u-flex u-items-center u-gap-3 u-py-2"
212
+ style={{ borderBottom: item < 3 ? '1px solid rgba(255,255,255,0.1)' : 'none' }}
213
+ >
214
+ <div
215
+ style={{
216
+ width: '36px',
217
+ height: '36px',
218
+ borderRadius: '10px',
219
+ background: 'rgba(255,255,255,0.1)',
220
+ display: 'flex',
221
+ alignItems: 'center',
222
+ justifyContent: 'center',
223
+ fontSize: '18px',
224
+ }}
225
+ aria-hidden="true"
226
+ >
227
+ {item === 1 ? '📄' : item === 2 ? '🔔' : '💬'}
228
+ </div>
229
+ <div className="u-flex-1">
230
+ <p className="u-m-0 u-text-sm">
231
+ {item === 1 ? 'Document created' : item === 2 ? 'New notification' : 'Message received'}
232
+ </p>
233
+ <p className="u-m-0 u-text-xs u-opacity-60">
234
+ {item === 1 ? '5 min ago' : item === 2 ? '1 hour ago' : '3 hours ago'}
235
+ </p>
236
+ </div>
237
+ </div>
238
+ ))}
239
+ </AtomixGlass>
240
+ </>
241
+ )}
242
+
243
+ {activeTab === 'search' && (
244
+ <div>
245
+ <AtomixGlass
246
+ displacementScale={50}
247
+ blurAmount={0.5}
248
+ borderRadius={16}
249
+ mode="standard"
250
+ padding="12px"
251
+ className="u-mb-3"
252
+ >
253
+ <div className="u-flex u-items-center u-gap-2">
254
+ <span style={{ fontSize: '20px' }}>🔍</span>
255
+ <input
256
+ type="text"
257
+ placeholder="Search..."
258
+ style={{
259
+ background: 'transparent',
260
+ border: 'none',
261
+ outline: 'none',
262
+ color: 'white',
263
+ width: '100%',
264
+ fontSize: '14px',
265
+ }}
266
+ />
267
+ </div>
268
+ </AtomixGlass>
269
+
270
+ <div className="u-text-center u-opacity-70 u-mt-5">
271
+ <p>Start typing to search</p>
272
+ </div>
273
+ </div>
274
+ )}
275
+
276
+ {activeTab === 'profile' && (
277
+ <div className="u-text-center">
278
+ <div
279
+ style={{
280
+ width: '80px',
281
+ height: '80px',
282
+ borderRadius: '50%',
283
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
284
+ display: 'flex',
285
+ alignItems: 'center',
286
+ justifyContent: 'center',
287
+ fontSize: '40px',
288
+ margin: '0 auto 16px',
289
+ }}
290
+ aria-label="Profile picture"
291
+ >
292
+ 👤
293
+ </div>
294
+ <h2 className="u-m-0 u-text-xl u-font-bold">John Doe</h2>
295
+ <p className="u-m-0 u-text-sm u-opacity-70 u-mb-4">john@example.com</p>
296
+ <Button glass variant="primary" size="sm">Edit Profile</Button>
297
+ </div>
298
+ )}
299
+ </div>
300
+
301
+ {/* Tab Bar */}
302
+ <div
303
+ style={{
304
+ padding: '16px',
305
+ borderTop: '1px solid rgba(255,255,255,0.1)',
306
+ display: 'flex',
307
+ justifyContent: 'space-around',
308
+ }}
309
+ >
310
+ {[
311
+ { id: 'home', icon: '🏠', label: 'Home' },
312
+ { id: 'search', icon: '🔍', label: 'Search' },
313
+ { id: 'profile', icon: '👤', label: 'Profile' },
314
+ ].map((tab) => (
315
+ <button
316
+ key={tab.id}
317
+ onClick={() => setActiveTab(tab.id)}
318
+ style={{
319
+ background: 'transparent',
320
+ border: 'none',
321
+ color: activeTab === tab.id ? '#667eea' : 'rgba(255,255,255,0.5)',
322
+ cursor: 'pointer',
323
+ display: 'flex',
324
+ flexDirection: 'column',
325
+ alignItems: 'center',
326
+ gap: '4px',
327
+ padding: '8px',
328
+ fontSize: '20px',
329
+ }}
330
+ aria-label={tab.label}
331
+ aria-pressed={activeTab === tab.id}
332
+ >
333
+ <span>{tab.icon}</span>
334
+ <span style={{ fontSize: '10px' }}>{tab.label}</span>
335
+ </button>
336
+ ))}
337
+ </div>
338
+ </div>
339
+ </AtomixGlass>
340
+ </div>
341
+ </div>
342
+ </BackgroundWrapper>
343
+ </StoryErrorBoundary>
344
+ );
345
+ },
346
+ parameters: {
347
+ docs: {
348
+ description: {
349
+ story:
350
+ 'Complete mobile app interface with realistic phone frame, status bar, header, scrollable content, and bottom tab navigation.',
351
+ },
352
+ },
353
+ },
354
+ };
355
+
356
+ /**
357
+ * Mobile Notification Card
358
+ *
359
+ * Push notification style card optimized for mobile displays.
360
+ */
361
+ export const MobileNotification: Story = {
362
+ render: () => (
363
+ <StoryErrorBoundary>
364
+ <BackgroundWrapper backgroundImage={backgroundImages[4]} overlay overlayOpacity={0.4}>
365
+ <div style={{ maxWidth: '340px' }}>
366
+ <AtomixGlass
367
+ displacementScale={50}
368
+ blurAmount={0.75}
369
+ saturation={130}
370
+ borderRadius={20}
371
+ mode="standard"
372
+ padding="20px"
373
+ >
374
+ <div className="u-flex u-items-start u-gap-3 u-text-white">
375
+ <div
376
+ style={{
377
+ width: '40px',
378
+ height: '40px',
379
+ borderRadius: '12px',
380
+ background: 'rgba(99, 102, 241, 0.2)',
381
+ display: 'flex',
382
+ alignItems: 'center',
383
+ justifyContent: 'center',
384
+ fontSize: '20px',
385
+ flexShrink: 0,
386
+ }}
387
+ aria-hidden="true"
388
+ >
389
+ 💬
390
+ </div>
391
+ <div className="u-flex-1">
392
+ <div className="u-flex u-items-center u-justify-between u-mb-1">
393
+ <h3 className="u-m-0 u-text-sm u-font-semibold">New Message</h3>
394
+ <span className="u-text-xs u-opacity-60">2m ago</span>
395
+ </div>
396
+ <p className="u-m-0 u-text-sm u-opacity-90 u-mb-2">
397
+ Sarah sent you a message: "Hey! Are you free for a quick call?"
398
+ </p>
399
+ <div className="u-flex u-gap-2">
400
+ <Button glass size="sm" variant="primary">Reply</Button>
401
+ <Button glass size="sm" variant="outline-light">Dismiss</Button>
402
+ </div>
403
+ </div>
404
+ </div>
405
+ </AtomixGlass>
406
+ </div>
407
+ </BackgroundWrapper>
408
+ </StoryErrorBoundary>
409
+ ),
410
+ parameters: {
411
+ docs: {
412
+ description: {
413
+ story:
414
+ 'Mobile push notification card with icon, title, message preview, timestamp, and action buttons.',
415
+ },
416
+ },
417
+ },
418
+ };