@shohojdhara/atomix 0.5.0 → 0.5.1

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 (76) hide show
  1. package/dist/atomix.css +95 -69
  2. package/dist/atomix.css.map +1 -1
  3. package/dist/atomix.min.css +1 -1
  4. package/dist/atomix.min.css.map +1 -1
  5. package/dist/charts.d.ts +1 -0
  6. package/dist/charts.js +231 -332
  7. package/dist/charts.js.map +1 -1
  8. package/dist/core.d.ts +1 -0
  9. package/dist/core.js +232 -333
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.d.ts +1 -0
  12. package/dist/forms.js +231 -332
  13. package/dist/forms.js.map +1 -1
  14. package/dist/heavy.d.ts +11 -2
  15. package/dist/heavy.js +233 -334
  16. package/dist/heavy.js.map +1 -1
  17. package/dist/index.d.ts +13 -2
  18. package/dist/index.esm.js +228 -327
  19. package/dist/index.esm.js.map +1 -1
  20. package/dist/index.js +227 -326
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.min.js +1 -1
  23. package/dist/index.min.js.map +1 -1
  24. package/package.json +11 -1
  25. package/src/components/AtomixGlass/AtomixGlass.tsx +188 -128
  26. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +62 -90
  27. package/src/components/AtomixGlass/PerformanceDashboard.tsx +153 -201
  28. package/src/components/AtomixGlass/glass-utils.ts +50 -0
  29. package/src/components/AtomixGlass/stories/AnimationFeatures.stories.tsx +52 -46
  30. package/src/components/AtomixGlass/stories/Examples.stories.tsx +573 -236
  31. package/src/components/AtomixGlass/stories/Playground.stories.tsx +88 -41
  32. package/src/components/AtomixGlass/stories/argTypes.ts +19 -19
  33. package/src/components/AtomixGlass/stories/shared-components.tsx +7 -12
  34. package/src/components/AtomixGlass/stories/types.ts +3 -3
  35. package/src/lib/composables/useAtomixGlass.ts +108 -71
  36. package/src/lib/composables/useAtomixGlassStyles.ts +0 -2
  37. package/src/lib/constants/components.ts +1 -0
  38. package/src/lib/types/components.ts +1 -0
  39. package/src/lib/utils/displacement-generator.ts +1 -1
  40. package/src/styles/06-components/_components.atomix-glass.scss +158 -97
  41. package/scripts/cli/__tests__/README.md +0 -81
  42. package/scripts/cli/__tests__/basic.test.js +0 -116
  43. package/scripts/cli/__tests__/clean.test.js +0 -278
  44. package/scripts/cli/__tests__/component-generator.test.js +0 -332
  45. package/scripts/cli/__tests__/component-validator.test.js +0 -433
  46. package/scripts/cli/__tests__/generator.test.js +0 -613
  47. package/scripts/cli/__tests__/glass-motion.test.js +0 -256
  48. package/scripts/cli/__tests__/integration.test.js +0 -938
  49. package/scripts/cli/__tests__/migrate.test.js +0 -74
  50. package/scripts/cli/__tests__/security.test.js +0 -206
  51. package/scripts/cli/__tests__/test-setup.js +0 -135
  52. package/scripts/cli/__tests__/theme-bridge.test.js +0 -507
  53. package/scripts/cli/__tests__/token-manager.test.js +0 -251
  54. package/scripts/cli/__tests__/token-provider.test.js +0 -361
  55. package/scripts/cli/__tests__/utils.test.js +0 -165
  56. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +0 -216
  57. package/src/components/AtomixGlass/stories/AnimationTests.stories.tsx +0 -95
  58. package/src/components/AtomixGlass/stories/CardExamples.stories.tsx +0 -212
  59. package/src/components/AtomixGlass/stories/Customization.stories.tsx +0 -131
  60. package/src/components/AtomixGlass/stories/DashboardExamples.stories.tsx +0 -348
  61. package/src/components/AtomixGlass/stories/EcommerceExamples.stories.tsx +0 -410
  62. package/src/components/AtomixGlass/stories/FormExamples.stories.tsx +0 -436
  63. package/src/components/AtomixGlass/stories/HeroExamples.stories.tsx +0 -264
  64. package/src/components/AtomixGlass/stories/InteractivePlayground.stories.tsx +0 -247
  65. package/src/components/AtomixGlass/stories/MobileUIExamples.stories.tsx +0 -418
  66. package/src/components/AtomixGlass/stories/ModalExamples.stories.tsx +0 -402
  67. package/src/components/AtomixGlass/stories/Modes.stories.tsx +0 -1082
  68. package/src/components/AtomixGlass/stories/Overview.stories.tsx +0 -497
  69. package/src/components/AtomixGlass/stories/Performance.stories.tsx +0 -103
  70. package/src/components/AtomixGlass/stories/PresetGallery.stories.tsx +0 -335
  71. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +0 -395
  72. package/src/components/AtomixGlass/stories/WidgetExamples.stories.tsx +0 -441
  73. package/src/components/TypedButton/TypedButton.stories.tsx +0 -59
  74. package/src/components/TypedButton/TypedButton.tsx +0 -39
  75. package/src/components/TypedButton/index.ts +0 -2
  76. package/src/lib/composables/useTypedButton.ts +0 -66
@@ -1,247 +0,0 @@
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
- };
@@ -1,418 +0,0 @@
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
- };