@shohojdhara/atomix 0.5.0 → 0.5.2

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 (168) hide show
  1. package/atomix.config.ts +12 -0
  2. package/build-tools/webpack-loader.js +5 -4
  3. package/dist/atomix.css +230 -83
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +1 -1
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/build-tools/webpack-loader.js +5 -4
  8. package/dist/charts.d.ts +24 -23
  9. package/dist/charts.js +271 -369
  10. package/dist/charts.js.map +1 -1
  11. package/dist/config.d.ts +624 -0
  12. package/dist/config.js +59 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/core.d.ts +3 -2
  15. package/dist/core.js +342 -382
  16. package/dist/core.js.map +1 -1
  17. package/dist/forms.d.ts +4 -6
  18. package/dist/forms.js +233 -334
  19. package/dist/forms.js.map +1 -1
  20. package/dist/heavy.d.ts +11 -2
  21. package/dist/heavy.js +406 -445
  22. package/dist/heavy.js.map +1 -1
  23. package/dist/index.d.ts +109 -65
  24. package/dist/index.esm.js +654 -748
  25. package/dist/index.esm.js.map +1 -1
  26. package/dist/index.js +621 -717
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.min.js +1 -1
  29. package/dist/index.min.js.map +1 -1
  30. package/dist/layout.js +59 -60
  31. package/dist/layout.js.map +1 -1
  32. package/dist/theme.js +4 -4
  33. package/dist/theme.js.map +1 -1
  34. package/package.json +24 -9
  35. package/scripts/atomix-cli.js +15 -1
  36. package/scripts/cli/__tests__/complexity-utils.test.js +24 -0
  37. package/scripts/cli/__tests__/detector.test.js +50 -0
  38. package/scripts/cli/__tests__/template-engine.test.js +23 -0
  39. package/scripts/cli/__tests__/test-setup.js +1 -133
  40. package/scripts/cli/commands/doctor.js +15 -3
  41. package/scripts/cli/commands/generate.js +113 -51
  42. package/scripts/cli/internal/ai-engine.js +30 -10
  43. package/scripts/cli/internal/complexity-utils.js +60 -0
  44. package/scripts/cli/internal/component-validator.js +49 -16
  45. package/scripts/cli/internal/generator.js +89 -36
  46. package/scripts/cli/internal/hook-generator.js +5 -2
  47. package/scripts/cli/internal/itcss-generator.js +16 -12
  48. package/scripts/cli/templates/next-templates.js +81 -30
  49. package/scripts/cli/templates/storybook-templates.js +12 -2
  50. package/scripts/cli/utils/detector.js +45 -7
  51. package/scripts/cli/utils/diagnostics.js +78 -0
  52. package/scripts/cli/utils/telemetry.js +13 -0
  53. package/src/components/Accordion/Accordion.stories.tsx +4 -0
  54. package/src/components/AtomixGlass/AtomixGlass.tsx +188 -128
  55. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +63 -91
  56. package/src/components/AtomixGlass/PerformanceDashboard.tsx +153 -201
  57. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +9 -6
  58. package/src/components/AtomixGlass/glass-utils.ts +51 -1
  59. package/src/components/AtomixGlass/stories/AnimationFeatures.stories.tsx +52 -46
  60. package/src/components/AtomixGlass/stories/Examples.stories.tsx +573 -236
  61. package/src/components/AtomixGlass/stories/Playground.stories.tsx +88 -41
  62. package/src/components/AtomixGlass/stories/argTypes.ts +19 -19
  63. package/src/components/AtomixGlass/stories/shared-components.tsx +7 -12
  64. package/src/components/AtomixGlass/stories/types.ts +3 -3
  65. package/src/components/Button/Button.tsx +114 -57
  66. package/src/components/Callout/Callout.tsx +4 -4
  67. package/src/components/Chart/ChartRenderer.tsx +1 -1
  68. package/src/components/Chart/DonutChart.tsx +11 -8
  69. package/src/components/EdgePanel/EdgePanel.tsx +119 -115
  70. package/src/components/Form/Select.tsx +4 -4
  71. package/src/components/List/List.tsx +4 -4
  72. package/src/components/Navigation/SideMenu/SideMenu.tsx +6 -6
  73. package/src/components/PhotoViewer/PhotoViewerImage.tsx +1 -1
  74. package/src/components/ProductReview/ProductReview.tsx +4 -2
  75. package/src/components/Rating/Rating.tsx +4 -2
  76. package/src/components/SectionIntro/SectionIntro.tsx +4 -2
  77. package/src/components/Steps/Steps.tsx +1 -1
  78. package/src/components/Tabs/Tabs.tsx +5 -5
  79. package/src/components/Testimonial/Testimonial.tsx +4 -2
  80. package/src/components/VideoPlayer/VideoPlayer.tsx +4 -2
  81. package/src/layouts/CssGrid/CssGrid.stories.tsx +464 -0
  82. package/src/layouts/CssGrid/CssGrid.tsx +215 -0
  83. package/src/layouts/CssGrid/index.ts +8 -0
  84. package/src/layouts/CssGrid/scripts/CssGrid.js +284 -0
  85. package/src/layouts/CssGrid/scripts/index.js +43 -0
  86. package/src/layouts/Grid/scripts/Container.js +139 -0
  87. package/src/layouts/Grid/scripts/Grid.js +184 -0
  88. package/src/layouts/Grid/scripts/GridCol.js +273 -0
  89. package/src/layouts/Grid/scripts/Row.js +154 -0
  90. package/src/layouts/Grid/scripts/index.js +48 -0
  91. package/src/layouts/MasonryGrid/MasonryGrid.tsx +71 -59
  92. package/src/lib/composables/atomix-glass/useGlassSize.ts +1 -1
  93. package/src/lib/composables/useAccordion.ts +5 -5
  94. package/src/lib/composables/useAtomixGlass.ts +111 -74
  95. package/src/lib/composables/useAtomixGlassStyles.ts +0 -2
  96. package/src/lib/composables/useBarChart.ts +2 -2
  97. package/src/lib/composables/useChart.ts +3 -2
  98. package/src/lib/composables/useChartToolbar.ts +48 -66
  99. package/src/lib/composables/useDataTable.ts +1 -1
  100. package/src/lib/composables/useDatePicker.ts +2 -2
  101. package/src/lib/composables/useEdgePanel.ts +45 -54
  102. package/src/lib/composables/useHeroBackgroundSlider.ts +5 -5
  103. package/src/lib/composables/usePhotoViewer.ts +2 -3
  104. package/src/lib/composables/usePieChart.ts +1 -1
  105. package/src/lib/composables/usePopover.ts +151 -139
  106. package/src/lib/composables/useSideMenu.ts +28 -41
  107. package/src/lib/composables/useSlider.ts +2 -6
  108. package/src/lib/composables/useTooltip.ts +2 -2
  109. package/src/lib/config/index.ts +39 -0
  110. package/src/lib/constants/components.ts +1 -0
  111. package/src/lib/theme/devtools/Comparator.tsx +1 -1
  112. package/src/lib/theme/devtools/Inspector.tsx +1 -1
  113. package/src/lib/theme/devtools/LiveEditor.tsx +1 -1
  114. package/src/lib/theme/runtime/ThemeProvider.tsx +1 -1
  115. package/src/lib/types/components.ts +1 -0
  116. package/src/styles/01-settings/_index.scss +1 -0
  117. package/src/styles/01-settings/_settings.atomix-glass.scss +174 -0
  118. package/src/styles/01-settings/_settings.masonry-grid.scss +42 -6
  119. package/src/styles/02-tools/_tools.glass.scss +6 -0
  120. package/src/styles/05-objects/_objects.masonry-grid.scss +162 -24
  121. package/src/styles/06-components/_components.atomix-glass.scss +160 -99
  122. package/scripts/cli/__tests__/README.md +0 -81
  123. package/scripts/cli/__tests__/basic.test.js +0 -116
  124. package/scripts/cli/__tests__/clean.test.js +0 -278
  125. package/scripts/cli/__tests__/component-generator.test.js +0 -332
  126. package/scripts/cli/__tests__/component-validator.test.js +0 -433
  127. package/scripts/cli/__tests__/generator.test.js +0 -613
  128. package/scripts/cli/__tests__/glass-motion.test.js +0 -256
  129. package/scripts/cli/__tests__/integration.test.js +0 -938
  130. package/scripts/cli/__tests__/migrate.test.js +0 -74
  131. package/scripts/cli/__tests__/security.test.js +0 -206
  132. package/scripts/cli/__tests__/theme-bridge.test.js +0 -507
  133. package/scripts/cli/__tests__/token-manager.test.js +0 -251
  134. package/scripts/cli/__tests__/token-provider.test.js +0 -361
  135. package/scripts/cli/__tests__/utils.test.js +0 -165
  136. package/src/components/AtomixGlass/stories/AnimationTests.stories.tsx +0 -95
  137. package/src/components/AtomixGlass/stories/CardExamples.stories.tsx +0 -212
  138. package/src/components/AtomixGlass/stories/Customization.stories.tsx +0 -131
  139. package/src/components/AtomixGlass/stories/DashboardExamples.stories.tsx +0 -348
  140. package/src/components/AtomixGlass/stories/EcommerceExamples.stories.tsx +0 -410
  141. package/src/components/AtomixGlass/stories/FormExamples.stories.tsx +0 -436
  142. package/src/components/AtomixGlass/stories/HeroExamples.stories.tsx +0 -264
  143. package/src/components/AtomixGlass/stories/InteractivePlayground.stories.tsx +0 -247
  144. package/src/components/AtomixGlass/stories/MobileUIExamples.stories.tsx +0 -418
  145. package/src/components/AtomixGlass/stories/ModalExamples.stories.tsx +0 -402
  146. package/src/components/AtomixGlass/stories/Modes.stories.tsx +0 -1082
  147. package/src/components/AtomixGlass/stories/Overview.stories.tsx +0 -497
  148. package/src/components/AtomixGlass/stories/Performance.stories.tsx +0 -103
  149. package/src/components/AtomixGlass/stories/PresetGallery.stories.tsx +0 -335
  150. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +0 -395
  151. package/src/components/AtomixGlass/stories/WidgetExamples.stories.tsx +0 -441
  152. package/src/components/TypedButton/TypedButton.stories.tsx +0 -59
  153. package/src/components/TypedButton/TypedButton.tsx +0 -39
  154. package/src/components/TypedButton/index.ts +0 -2
  155. package/src/lib/composables/useBreadcrumb.ts +0 -81
  156. package/src/lib/composables/useChartInteractions.ts +0 -123
  157. package/src/lib/composables/useChartPerformance.ts +0 -347
  158. package/src/lib/composables/useDropdown.ts +0 -338
  159. package/src/lib/composables/useModal.ts +0 -110
  160. package/src/lib/composables/useTypedButton.ts +0 -66
  161. package/src/lib/hooks/usePerformanceMonitor.ts +0 -148
  162. package/src/lib/utils/displacement-generator.ts +0 -92
  163. package/src/lib/utils/memoryMonitor.ts +0 -191
  164. package/src/styles/01-settings/_settings.testtypecheck.scss +0 -53
  165. package/src/styles/01-settings/_settings.typedbutton.scss +0 -53
  166. package/src/styles/06-components/_components.testbutton.scss +0 -212
  167. package/src/styles/06-components/_components.testtypecheck.scss +0 -212
  168. package/src/styles/06-components/_components.typedbutton.scss +0 -212
@@ -51,20 +51,25 @@ export const HeroExample: Story = {
51
51
  }
52
52
  >
53
53
  <div>
54
- <div style={{ maxWidth: '900px' }} className="u-mx-auto">
54
+ <div className="u-max-w-4xl u-mx-auto">
55
55
  <AtomixGlass
56
- displacementScale={100}
57
- blurAmount={1}
56
+ displacementScale={150}
57
+ blurAmount={2.5}
58
+ saturation={160}
59
+ aberrationIntensity={4}
58
60
  borderRadius={30}
59
- mode="shader"
60
- shaderVariant="premiumGlass"
61
+ mode="prominent"
62
+ withLiquidBlur={true}
63
+ withTimeAnimation={true}
64
+ withMultiLayerDistortion={true}
61
65
  onClick={() => {}}
62
66
  >
63
67
  <div
64
- className="u-p-6 u-text-white"
68
+ className="u-p-12 u-text-white u-text-center"
65
69
  style={{ padding: '48px 40px', textAlign: 'center' }}
66
70
  >
67
71
  <div
72
+ className="u-w-24 u-h-24 u-mx-auto u-mb-8 u-flex u-items-center u-justify-center u-rounded-xl"
68
73
  style={{
69
74
  width: '96px',
70
75
  height: '96px',
@@ -81,7 +86,7 @@ export const HeroExample: Story = {
81
86
 
82
87
  </div>
83
88
  <h1
84
- className="u-mt-0 u-text-1 u-font-bold"
89
+ className="u-mt-0 u-mb-5 u-text-6xl u-font-bold u-text-gradient-primary"
85
90
  style={{
86
91
  fontSize: '48px',
87
92
  marginBottom: '20px',
@@ -95,7 +100,7 @@ export const HeroExample: Story = {
95
100
  Modern Glass UI
96
101
  </h1>
97
102
  <p
98
- className="u-text-4 u-mb-4"
103
+ className="u-text-lg u-mb-8 u-opacity-90"
99
104
  style={{
100
105
  fontSize: '18px',
101
106
  lineHeight: 1.7,
@@ -107,7 +112,7 @@ export const HeroExample: Story = {
107
112
  Create stunning interfaces with the AtomixGlass component. Perfect for modern, sleek
108
113
  designs that stand out.
109
114
  </p>
110
- <div className="u-flex u-gap-3 u-justify-center u-flex-wrap" style={{ gap: '16px' }}>
115
+ <div className="u-flex u-gap-6 u-justify-center u-flex-wrap" style={{ gap: '16px' }}>
111
116
  <Button glass size="lg">
112
117
  Get Started
113
118
  </Button>
@@ -156,13 +161,14 @@ export const VideoBackground: Story = {
156
161
  };
157
162
 
158
163
  return (
159
- <div style={{ position: 'relative', height: '100vh', width: '100vw', overflow: 'hidden' }}>
164
+ <div className="u-relative u-h-screen u-w-screen u-overflow-hidden" style={{ position: 'relative', height: '100vh', width: '100vw', overflow: 'hidden' }}>
160
165
  {/* Video Background */}
161
166
  <video
162
167
  autoPlay
163
168
  loop
164
169
  muted
165
170
  playsInline
171
+ className="u-absolute u-inset-0 u-object-cover"
166
172
  style={{
167
173
  position: 'absolute',
168
174
  top: 0,
@@ -180,6 +186,7 @@ export const VideoBackground: Story = {
180
186
  </video>
181
187
 
182
188
  <div
189
+ className="u-flex u-items-center u-justify-center u-h-full u-p-10 u-gap-10 u-flex-wrap"
183
190
  style={{
184
191
  display: 'flex',
185
192
  alignItems: 'center',
@@ -198,18 +205,20 @@ export const VideoBackground: Story = {
198
205
  aberrationIntensity={glassSettings.aberrationIntensity}
199
206
  borderRadius={glassSettings.borderRadius}
200
207
  mode={glassSettings.mode}
208
+ className="u-w-80 u-max-w-full"
201
209
  style={{ width: '400px', maxWidth: '100%' }}
202
210
  >
203
- <div style={{ padding: '32px', textAlign: 'center' }}>
204
- <h2 style={{ marginTop: 0, fontSize: '28px', fontWeight: 600, marginBottom: '16px' }}>
211
+ <div className="u-p-8 u-text-center" style={{ padding: '32px', textAlign: 'center' }}>
212
+ <h2 className="u-mt-0 u-text-2xl u-font-bold u-mb-4" style={{ marginTop: 0, fontSize: '28px', fontWeight: 600, marginBottom: '16px' }}>
205
213
  Glass Over Video
206
214
  </h2>
207
- <p style={{ fontSize: '16px', lineHeight: 1.6, marginBottom: '24px', opacity: 0.9 }}>
215
+ <p className="u-text-base u-leading-6 u-mb-6 u-opacity-90" style={{ fontSize: '16px', lineHeight: 1.6, marginBottom: '24px', opacity: 0.9 }}>
208
216
  Experience the stunning glass morphism effect overlaid on dynamic video content. The
209
217
  glass element creates a sophisticated focal point while maintaining visual harmony
210
218
  with the moving background.
211
219
  </p>
212
220
  <div
221
+ className="u-flex u-justify-center u-gap-3 u-flex-wrap"
213
222
  style={{
214
223
  display: 'flex',
215
224
  justifyContent: 'center',
@@ -217,8 +226,8 @@ export const VideoBackground: Story = {
217
226
  flexWrap: 'wrap',
218
227
  }}
219
228
  >
220
- <button className="c-btn c-btn--primary">Get Started</button>
221
- <button className="c-btn c-btn--outline">Learn More</button>
229
+ <Button glass>Get Started</Button>
230
+ <Button glass variant={'light'}>Learn More</Button>
222
231
  </div>
223
232
  </div>
224
233
  </AtomixGlass>
@@ -231,15 +240,16 @@ export const VideoBackground: Story = {
231
240
  aberrationIntensity={1.5}
232
241
  borderRadius={16}
233
242
  mode="standard"
243
+ className="u-w-60 u-max-w-full"
234
244
  style={{ width: '300px', maxWidth: '100%' }}
235
245
  >
236
- <div style={{ padding: '24px' }}>
237
- <h3 style={{ marginTop: 0, fontSize: '18px', marginBottom: '20px' }}>
246
+ <div className="u-p-6" style={{ padding: '24px' }}>
247
+ <h3 className="u-mt-0 u-text-base u-mb-5" style={{ marginTop: 0, fontSize: '18px', marginBottom: '20px' }}>
238
248
  Live Controls
239
249
  </h3>
240
250
 
241
- <div style={{ marginBottom: '16px' }}>
242
- <label style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
251
+ <div className="u-mb-4" style={{ marginBottom: '16px' }}>
252
+ <label className="u-block u-text-xs u-mb-1" style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
243
253
  Displacement: {glassSettings.displacementScale}
244
254
  </label>
245
255
  <input
@@ -248,12 +258,13 @@ export const VideoBackground: Story = {
248
258
  max="150"
249
259
  value={glassSettings.displacementScale}
250
260
  onChange={e => updateSettings('displacementScale', parseInt(e.target.value))}
261
+ className="u-w-full u-accent-indigo-500"
251
262
  style={{ width: '100%', accentColor: '#6366f1' }}
252
263
  />
253
264
  </div>
254
265
 
255
- <div style={{ marginBottom: '16px' }}>
256
- <label style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
266
+ <div className="u-mb-4" style={{ marginBottom: '16px' }}>
267
+ <label className="u-block u-text-xs u-mb-1" style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
257
268
  Blur: {glassSettings.blurAmount}
258
269
  </label>
259
270
  <input
@@ -263,12 +274,13 @@ export const VideoBackground: Story = {
263
274
  step="0.5"
264
275
  value={glassSettings.blurAmount}
265
276
  onChange={e => updateSettings('blurAmount', parseFloat(e.target.value))}
277
+ className="u-w-full u-accent-indigo-500"
266
278
  style={{ width: '100%', accentColor: '#6366f1' }}
267
279
  />
268
280
  </div>
269
281
 
270
- <div style={{ marginBottom: '16px' }}>
271
- <label style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
282
+ <div className="u-mb-4" style={{ marginBottom: '16px' }}>
283
+ <label className="u-block u-text-xs u-mb-1" style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
272
284
  Saturation: {glassSettings.saturation}%
273
285
  </label>
274
286
  <input
@@ -277,12 +289,13 @@ export const VideoBackground: Story = {
277
289
  max="300"
278
290
  value={glassSettings.saturation}
279
291
  onChange={e => updateSettings('saturation', parseInt(e.target.value))}
292
+ className="u-w-full u-accent-indigo-500"
280
293
  style={{ width: '100%', accentColor: '#6366f1' }}
281
294
  />
282
295
  </div>
283
296
 
284
- <div style={{ marginBottom: '16px' }}>
285
- <label style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
297
+ <div className="u-mb-4" style={{ marginBottom: '16px' }}>
298
+ <label className="u-block u-text-xs u-mb-1" style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
286
299
  Aberration: {glassSettings.aberrationIntensity}
287
300
  </label>
288
301
  <input
@@ -292,12 +305,13 @@ export const VideoBackground: Story = {
292
305
  step="0.1"
293
306
  value={glassSettings.aberrationIntensity}
294
307
  onChange={e => updateSettings('aberrationIntensity', parseFloat(e.target.value))}
308
+ className="u-w-full u-accent-indigo-500"
295
309
  style={{ width: '100%', accentColor: '#6366f1' }}
296
310
  />
297
311
  </div>
298
312
 
299
- <div style={{ marginBottom: '16px' }}>
300
- <label style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
313
+ <div className="u-mb-4" style={{ marginBottom: '16px' }}>
314
+ <label className="u-block u-text-xs u-mb-1" style={{ display: 'block', fontSize: '14px', marginBottom: '6px' }}>
301
315
  Corner Radius: {glassSettings.borderRadius}px
302
316
  </label>
303
317
  <input
@@ -306,12 +320,13 @@ export const VideoBackground: Story = {
306
320
  max="100"
307
321
  value={glassSettings.borderRadius}
308
322
  onChange={e => updateSettings('borderRadius', parseInt(e.target.value))}
323
+ className="u-w-full u-accent-indigo-500"
309
324
  style={{ width: '100%', accentColor: '#6366f1' }}
310
325
  />
311
326
  </div>
312
327
 
313
- <button
314
- className="c-btn c-btn--secondary"
328
+ <Button
329
+ className="u-w-full"
315
330
  style={{ width: '100%' }}
316
331
  onClick={() => {
317
332
  setGlassSettings({
@@ -325,7 +340,7 @@ export const VideoBackground: Story = {
325
340
  }}
326
341
  >
327
342
  Reset Defaults
328
- </button>
343
+ </Button>
329
344
  </div>
330
345
  </AtomixGlass>
331
346
  </div>
@@ -391,19 +406,25 @@ export const DashboardCards: Story = {
391
406
  backgroundImage={
392
407
  'https://images.unsplash.com/photo-1614188973043-4ed7d383de37?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=1470'
393
408
  }
409
+ className="u-p-10"
394
410
  style={{ padding: '40px' }}
395
411
  >
396
- <div style={{ maxWidth: '1200px', margin: '0 auto', color: 'white' }}>
412
+ <div className="u-max-w-6xl u-mx-auto u-text-white" style={{ maxWidth: '1200px', margin: '0 auto', color: 'white' }}>
397
413
  <AtomixGlass
398
- displacementScale={30}
399
- blurAmount={5}
400
- saturation={140}
401
- borderRadius={20}
402
- mode="standard"
414
+ displacementScale={80}
415
+ blurAmount={2.5}
416
+ saturation={160}
417
+ aberrationIntensity={3}
418
+ borderRadius={24}
419
+ mode="prominent"
420
+ withLiquidBlur={true}
421
+ withTimeAnimation={true}
422
+ withMultiLayerDistortion={true}
403
423
  padding="24px 32px"
404
424
  >
405
- <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>
425
+ <div className="u-flex u-items-center u-gap-4" style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>
406
426
  <div
427
+ className="u-w-14 u-h-14 u-rounded-xl u-flex u-items-center u-justify-center u-text-3xl"
407
428
  style={{
408
429
  width: '56px',
409
430
  height: '56px',
@@ -420,7 +441,7 @@ export const DashboardCards: Story = {
420
441
  </div>
421
442
  <div>
422
443
  <h1
423
- className="u-m-0 u-text-2 u-font-bold"
444
+ className="u-m-0 u-text-3xl u-font-bold u-mb-1"
424
445
  style={{
425
446
  fontSize: '28px',
426
447
  marginBottom: '6px',
@@ -433,7 +454,7 @@ export const DashboardCards: Story = {
433
454
  Analytics Dashboard
434
455
  </h1>
435
456
  <p
436
- className="u-m-0 u-opacity-80 u-text-6"
457
+ className="u-m-0 u-opacity-80 u-text-base"
437
458
  style={{
438
459
  fontSize: '15px',
439
460
  color: 'rgba(255, 255, 255, 0.85)',
@@ -450,6 +471,7 @@ export const DashboardCards: Story = {
450
471
  <GridCol md={6} className="u-mb-4">
451
472
  <div
452
473
  key={index}
474
+ className="u-cursor-pointer"
453
475
  style={{
454
476
  cursor: 'pointer',
455
477
  }}
@@ -457,15 +479,19 @@ export const DashboardCards: Story = {
457
479
  onMouseLeave={() => setSelectedCard(null)}
458
480
  >
459
481
  <AtomixGlass
460
- displacementScale={selectedCard === index ? 50 : 35}
461
- blurAmount={selectedCard === index ? 1.5 : 1}
462
- saturation={selectedCard === index ? 132 : 130}
463
- aberrationIntensity={selectedCard === index ? 2 : 1}
482
+ displacementScale={selectedCard === index ? 120 : 60}
483
+ blurAmount={selectedCard === index ? 3 : 1.5}
484
+ saturation={selectedCard === index ? 180 : 140}
485
+ aberrationIntensity={selectedCard === index ? 4 : 2}
464
486
  borderRadius={16}
465
- mode="standard"
487
+ mode="polar"
488
+ withLiquidBlur={true}
489
+ withTimeAnimation={selectedCard === index}
490
+ withMultiLayerDistortion={selectedCard === index}
466
491
  >
467
492
  <div className="u-p-4">
468
493
  <div
494
+ className="u-flex u-items-center u-justify-between u-mb-4"
469
495
  style={{
470
496
  display: 'flex',
471
497
  alignItems: 'center',
@@ -474,6 +500,7 @@ export const DashboardCards: Story = {
474
500
  }}
475
501
  >
476
502
  <div
503
+ className="u-w-12 u-h-12 u-rounded-lg u-flex u-items-center u-justify-center u-text-2xl"
477
504
  style={{
478
505
  width: '48px',
479
506
  height: '48px',
@@ -488,6 +515,7 @@ export const DashboardCards: Story = {
488
515
  {stat.icon}
489
516
  </div>
490
517
  <div
518
+ className={`u-p-1 u-rounded-full u-text-xs u-font-semibold ${stat.trend === 'up' ? 'u-bg-green-500/20 u-text-green-400' : 'u-bg-red-500/20 u-text-red-400'}`}
491
519
  style={{
492
520
  padding: '4px 12px',
493
521
  borderRadius: '20px',
@@ -504,10 +532,10 @@ export const DashboardCards: Story = {
504
532
  </div>
505
533
  </div>
506
534
 
507
- <div style={{ fontSize: '14px', opacity: 0.7, marginBottom: '8px' }}>
535
+ <div className="u-text-xs u-opacity-70 u-mb-2" style={{ fontSize: '14px', opacity: 0.7, marginBottom: '8px' }}>
508
536
  {stat.title}
509
537
  </div>
510
- <div style={{ fontSize: '28px', fontWeight: 700 }}>{stat.value}</div>
538
+ <div className="u-text-3xl u-font-bold" style={{ fontSize: '28px', fontWeight: 700 }}>{stat.value}</div>
511
539
  </div>
512
540
  </AtomixGlass>
513
541
  </div>
@@ -556,12 +584,12 @@ export const ProductCard: Story = {
556
584
  'https://images.unsplash.com/photo-1711779321812-59cdf38ab31f?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=3132'
557
585
  }
558
586
  >
559
- <div style={{ width: '300px' }} className="u-mx-auto">
587
+ <div className="u-w-75 u-mx-auto" style={{ width: '300px' }}>
560
588
  <AtomixGlass displacementScale={50} blurAmount={1.5} mode="standard" elasticity={0}>
561
589
  <div className="u-p-3">
562
590
  {/* Product Image */}
563
591
  <div
564
- className="u-w-100 u-rounded-3"
592
+ className="u-w-full u-h-50 u-rounded-3 u-mb-6 u-backdrop-blur-md u-relative u-overflow-hidden u-opacity-85 u-flex u-items-center u-justify-center u-text-5xl"
565
593
  style={{
566
594
  height: '200px',
567
595
  background:
@@ -579,6 +607,7 @@ export const ProductCard: Story = {
579
607
  >
580
608
  👕
581
609
  <div
610
+ className="u-absolute u-top-4 u-right-4 u-bg-red-500/85 u-text-white u-p-1.5 u-rounded-2 u-text-xs u-font-bold"
582
611
  style={{
583
612
  position: 'absolute',
584
613
  top: '16px',
@@ -596,20 +625,20 @@ export const ProductCard: Story = {
596
625
  </div>
597
626
 
598
627
  {/* Product Info */}
599
- <h2 className="u-m-0 u-mb-1 u-text-6 u-font-bold">Premium Cotton T-Shirt</h2>
600
- <p className="u-m-0 u-mb-2 u-opacity-70 u-text-7">
628
+ <h2 className="u-m-0 u-mb-1 u-text-2xl u-font-bold">Premium Cotton T-Shirt</h2>
629
+ <p className="u-m-0 u-mb-2 u-opacity-70 u-text-lg">
601
630
  Ultra-soft fabric with a modern fit. Perfect for everyday wear.
602
631
  </p>
603
632
 
604
633
  {/* Price */}
605
634
  <div className="u-flex u-items-center u-gap-2 u-mb-2">
606
- <span className="u-text-4 u-font-bold u-text-success">$49.99</span>
607
- <span className="u-text-4 u-text-decoration-line-through u-opacity-50">$71.99</span>
635
+ <span className="u-text-lg u-font-bold u-text-success">$49.99</span>
636
+ <span className="u-text-lg u-line-through u-opacity-50">$71.99</span>
608
637
  </div>
609
638
 
610
639
  {/* Size Selection */}
611
640
  <div className="u-mb-2">
612
- <label className="u-block u-text-7 u-font-semibold u-mb-2">Select Size</label>
641
+ <label className="u-block u-text-lg u-font-semibold u-mb-2">Select Size</label>
613
642
  <div className="u-flex u-gap-2">
614
643
  {sizes.map(size => (
615
644
  <Button
@@ -627,7 +656,7 @@ export const ProductCard: Story = {
627
656
 
628
657
  {/* Quantity */}
629
658
  <div className="u-mb-2">
630
- <label className="u-block u-text-7 u-font-semibold u-mb-1 u-text-white">
659
+ <label className="u-block u-text-lg u-font-semibold u-mb-1 u-text-white">
631
660
  Quantity
632
661
  </label>
633
662
  <div className="u-flex u-items-center u-gap-2">
@@ -635,6 +664,7 @@ export const ProductCard: Story = {
635
664
 
636
665
  </Button>
637
666
  <span
667
+ className="u-text-xl u-font-bold u-min-w-10 u-text-center"
638
668
  style={{
639
669
  fontSize: '18px',
640
670
  fontWeight: 600,
@@ -656,6 +686,7 @@ export const ProductCard: Story = {
656
686
  variant="primary"
657
687
  glass={{ borderRadius: 8 }}
658
688
  size="sm"
689
+ className="u-w-full"
659
690
  style={{ width: '100%' }}
660
691
  icon={addedToCart ? <Icon name="Check" /> : <Icon name="ShoppingCart" />}
661
692
  >
@@ -726,161 +757,122 @@ export const NotificationCenter: Story = {
726
757
 
727
758
  const markAsRead = (id: number) => {
728
759
  setNotifications(prev =>
729
- prev.map(notif => (notif.id === id ? { ...notif, read: true } : notif))
760
+ prev.map(notification =>
761
+ notification.id === id ? { ...notification, read: true } : notification
762
+ )
730
763
  );
731
764
  };
732
765
 
733
- const clearAll = () => {
734
- setNotifications([]);
766
+ const clearNotification = (id: number) => {
767
+ setNotifications(prev => prev.filter(notification => notification.id !== id));
735
768
  };
736
769
 
737
- const unreadCount = notifications.filter(n => !n.read).length;
738
-
739
770
  return (
740
771
  <BackgroundWrapper
772
+ overlay={true}
741
773
  backgroundImage={
742
- 'https://images.unsplash.com/photo-1712230983973-6bf75ad1476e?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=3132'
774
+ 'https://images.unsplash.com/photo-1516996020930-4ce772760821?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=2070'
743
775
  }
744
776
  >
745
- <div style={{ maxWidth: '400px', width: '100%' }} className="u-mx-auto">
746
- <AtomixGlass displacementScale={70} blurAmount={1} elasticity={0} mode="prominent">
747
- <div
748
- className="u-rounded-4 u-overflow-hidden u-text-success-emphasis"
749
- style={{ background: 'color-mix(in srgb, var(--atomix-success) 10%, transparent)' }}
750
- >
751
- {/* Header */}
752
- <div
753
- className="u-p-4 u-flex u-justify-between u-items-center"
754
- style={{
755
- borderBottom:
756
- '1px solid color-mix(in srgb, var(--atomix-success) 10%, transparent)',
757
- }}
758
- >
759
- <div className="u-flex u-items-center u-gap-2">
760
- <h2 className="u-m-0 u-text-4 u-font-bold">Notifications</h2>
761
- {unreadCount > 0 && (
762
- <span
763
- style={{
764
- background: 'var(--atomix-error)',
765
- color: 'white',
766
- padding: '2px 8px',
767
- borderRadius: '10px',
768
- fontSize: '12px',
769
- fontWeight: 600,
770
- }}
771
- >
772
- {unreadCount}
773
- </span>
774
- )}
775
- </div>
776
- {notifications.length > 0 && (
777
- <button
778
- onClick={clearAll}
779
- style={{
780
- background: 'none',
781
- border: 'none',
782
- color: 'var(--atomix-error-color-text-emphasis)',
783
- fontSize: '13px',
784
- fontWeight: 600,
785
- cursor: 'pointer',
786
- padding: '4px 8px',
787
- }}
788
- >
789
- Clear All
790
- </button>
791
- )}
777
+ <div className="u-w-90 u-max-w-md u-mx-auto" style={{ width: '360px', maxWidth: 'none', margin: '0 auto' }}>
778
+ <AtomixGlass
779
+ displacementScale={100}
780
+ blurAmount={2}
781
+ saturation={150}
782
+ aberrationIntensity={2.5}
783
+ borderRadius={20}
784
+ mode="polar"
785
+ withLiquidBlur={true}
786
+ withTimeAnimation={true}
787
+ withMultiLayerDistortion={true}
788
+ >
789
+ <div className="u-p-5">
790
+ <div className="u-flex u-items-center u-justify-between u-mb-5 u-pb-3 u-border-b u-border-white/10" style={{ marginBottom: '24px', paddingBottom: '20px', borderBottom: '1px solid rgba(255, 255, 255, 0.1)' }}>
791
+ <h2 className="u-m-0 u-text-xl u-font-bold u-text-white">Notifications</h2>
792
+ <Button variant="ghost" glass size="sm">
793
+ Clear All
794
+ </Button>
792
795
  </div>
793
796
 
794
- {/* Notifications List */}
795
- <div className="u-overflow-y-auto" style={{ maxHeight: '500px' }}>
796
- {notifications.length === 0 ? (
797
+ <div className="u-space-y-3">
798
+ {notifications.map(notification => (
797
799
  <div
800
+ key={notification.id}
801
+ className={`u-p-3 u-rounded-lg ${notification.read ? 'u-bg-white/5' : 'u-bg-white/10'}`}
798
802
  style={{
799
- padding: '60px 24px',
800
- textAlign: 'center',
801
- opacity: 0.6,
803
+ padding: '16px',
804
+ borderRadius: '8px',
805
+ background: notification.read
806
+ ? 'rgba(255, 255, 255, 0.05)'
807
+ : 'rgba(255, 255, 255, 0.1)',
808
+ backdropFilter: 'blur(10px)',
802
809
  }}
803
810
  >
804
- <div style={{ fontSize: '48px', marginBottom: '16px' }}>
805
- <Icon name="Bell" />
806
- </div>
807
- <div style={{ fontSize: '16px' }}>No notifications</div>
808
- </div>
809
- ) : (
810
- notifications.map(notification => (
811
- <div
812
- key={notification.id}
813
- onClick={() => markAsRead(notification.id)}
814
- style={{
815
- padding: '16px 24px',
816
- borderBottom:
817
- '1px solid color-mix(in srgb, var(--atomix-success) 10%, transparent)',
818
- cursor: 'pointer',
819
- background: notification.read
820
- ? 'transparent'
821
- : 'color-mix(in srgb, var(--atomix-success) 10%, transparent)',
822
- transition: 'background 0.2s ease',
823
- }}
824
- onMouseEnter={e => {
825
- e.currentTarget.style.background =
826
- 'color-mix(in srgb, var(--atomix-success) 10%, transparent)';
827
- }}
828
- onMouseLeave={e => {
829
- e.currentTarget.style.background = notification.read
830
- ? 'transparent'
831
- : 'color-mix(in srgb, var(--atomix-success) 10%, transparent)';
832
- }}
833
- >
834
- <div style={{ display: 'flex', gap: '12px' }}>
835
- <div style={{ fontSize: '24px', flexShrink: 0 }}>{notification.icon}</div>
836
- <div style={{ flex: 1, minWidth: 0 }}>
837
- <div
838
- style={{
839
- display: 'flex',
840
- justifyContent: 'space-between',
841
- alignItems: 'flex-start',
842
- marginBottom: '4px',
843
- }}
844
- >
845
- <span
846
- style={{
847
- fontSize: '15px',
848
- fontWeight: notification.read ? 500 : 700,
849
- }}
850
- >
811
+ <div className="u-flex u-gap-3">
812
+ <div
813
+ className={`u-w-10 u-h-10 u-rounded-lg u-flex u-items-center u-justify-center ${
814
+ notification.type === 'success'
815
+ ? 'u-bg-green-500/20'
816
+ : notification.type === 'warning'
817
+ ? 'u-bg-yellow-500/20'
818
+ : notification.type === 'info'
819
+ ? 'u-bg-blue-500/20'
820
+ : 'u-bg-purple-500/20'
821
+ }`}
822
+ style={{
823
+ width: '40px',
824
+ height: '40px',
825
+ borderRadius: '8px',
826
+ display: 'flex',
827
+ alignItems: 'center',
828
+ justifyContent: 'center',
829
+ background:
830
+ notification.type === 'success'
831
+ ? 'rgba(16, 185, 129, 0.2)'
832
+ : notification.type === 'warning'
833
+ ? 'rgba(234, 179, 8, 0.2)'
834
+ : notification.type === 'info'
835
+ ? 'rgba(59, 130, 246, 0.2)'
836
+ : 'rgba(139, 92, 246, 0.2)',
837
+ }}
838
+ >
839
+ {notification.icon}
840
+ </div>
841
+ <div className="u-flex-1 u-min-w-0">
842
+ <div className="u-flex u-items-start u-justify-between">
843
+ <div>
844
+ <h3 className={`u-m-0 u-text-sm u-font-semibold ${notification.read ? 'u-text-white/80' : 'u-text-white'}`}>
851
845
  {notification.title}
852
- </span>
853
- {!notification.read && (
854
- <div
855
- style={{
856
- width: '8px',
857
- height: '8px',
858
- borderRadius: '50%',
859
- background: 'var(--atomix-success)',
860
- flexShrink: 0,
861
- marginTop: '4px',
862
- }}
863
- />
864
- )}
846
+ </h3>
847
+ <p className="u-m-0 u-text-xs u-opacity-70 u-mt-1">{notification.message}</p>
865
848
  </div>
866
- <p
867
- style={{
868
- margin: '0 0 6px 0',
869
- fontSize: '13px',
870
- opacity: 0.7,
871
- lineHeight: 1.4,
872
- }}
873
- >
874
- {notification.message}
875
- </p>
876
- <span style={{ fontSize: '12px', opacity: 0.5 }}>
877
- {notification.time}
878
- </span>
849
+ <span className="u-text-xs u-opacity-50 u-whitespace-nowrap u-ml-2">{notification.time}</span>
879
850
  </div>
880
851
  </div>
852
+ {!notification.read && (
853
+ <Button
854
+ variant="ghost"
855
+ size="xs"
856
+ glass
857
+ onClick={() => markAsRead(notification.id)}
858
+ className="u-ml-2"
859
+ >
860
+ <Icon name="X" />
861
+ </Button>
862
+ )}
881
863
  </div>
882
- ))
883
- )}
864
+ <div className="u-flex u-justify-end u-mt-2">
865
+ <Button
866
+ variant="ghost"
867
+ size="xs"
868
+ glass
869
+ onClick={() => clearNotification(notification.id)}
870
+ >
871
+ Clear
872
+ </Button>
873
+ </div>
874
+ </div>
875
+ ))}
884
876
  </div>
885
877
  </div>
886
878
  </AtomixGlass>
@@ -892,7 +884,7 @@ export const NotificationCenter: Story = {
892
884
  docs: {
893
885
  description: {
894
886
  story:
895
- 'A notification center example showing how to build modern notification panels with AtomixGlass. Features read/unread states, different notification types, and interactive clearing functionality.',
887
+ 'A notification center example demonstrating how to use AtomixGlass for modern app interfaces. Features categorized notifications, status indicators, and interactive controls for managing alerts.',
896
888
  },
897
889
  },
898
890
  },
@@ -926,10 +918,11 @@ export const LoginForm: Story = {
926
918
  'https://images.unsplash.com/photo-1585937318604-b1f6c789a877?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=1548'
927
919
  }
928
920
  overlayOpacity={0.3}
921
+ className="u-overflow-auto"
929
922
  style={{ overflow: 'auto' }}
930
923
  >
931
- <div className="u-py-6 u-text-white">
932
- <div style={{ maxWidth: '380px' }} className="u-mx-auto">
924
+ <div className="u-py-16 u-text-white">
925
+ <div className="u-max-w-md u-mx-auto" style={{ maxWidth: '380px' }}>
933
926
  <AtomixGlass
934
927
  displacementScale={50}
935
928
  blurAmount={1}
@@ -938,10 +931,11 @@ export const LoginForm: Story = {
938
931
  borderRadius={24}
939
932
  mode="standard"
940
933
  >
941
- <div className="u-p-4">
934
+ <div className="u-p-6">
942
935
  {/* Logo/Header */}
943
936
  <div className="u-text-center u-mb-5">
944
937
  <div
938
+ className="u-w-18 u-h-18 u-mx-auto u-mb-6 u-rounded-xl u-flex u-items-center u-justify-center u-text-4xl u-relative"
945
939
  style={{
946
940
  width: '72px',
947
941
  height: '72px',
@@ -957,6 +951,7 @@ export const LoginForm: Story = {
957
951
  }}
958
952
  >
959
953
  <div
954
+ className="u-absolute u-inset--1 u-rounded-xl"
960
955
  style={{
961
956
  position: 'absolute',
962
957
  inset: '-4px',
@@ -966,10 +961,10 @@ export const LoginForm: Story = {
966
961
  filter: 'blur(16px)',
967
962
  }}
968
963
  />
969
- <Icon name="Lock" style={{ position: 'relative', zIndex: 1 }} />
964
+ <Icon name="Lock" className="u-relative u-z-10" style={{ position: 'relative', zIndex: 1 }} />
970
965
  </div>
971
966
  <h2
972
- className="u-m-0 u-mb-2 u-text-3 u-font-bold"
967
+ className="u-m-0 u-mb-3 u-text-3xl u-font-bold u-text-gradient-primary"
973
968
  style={{
974
969
  fontSize: '32px',
975
970
  marginBottom: '12px',
@@ -982,7 +977,7 @@ export const LoginForm: Story = {
982
977
  Welcome Back
983
978
  </h2>
984
979
  <p
985
- className="u-m-0 u-opacity-70 u-text-7"
980
+ className="u-m-0 u-opacity-70 u-text-lg"
986
981
  style={{
987
982
  fontSize: '15px',
988
983
  color: 'rgba(255, 255, 255, 0.85)',
@@ -994,8 +989,8 @@ export const LoginForm: Story = {
994
989
 
995
990
  {/* Form */}
996
991
  <form onSubmit={handleSubmit}>
997
- <div className="u-mb-3">
998
- <label className="u-block u-text-7 u-font-semibold u-mb-2">Email Address</label>
992
+ <div className="u-mb-4">
993
+ <label className="u-block u-text-lg u-font-semibold u-mb-2">Email Address</label>
999
994
  <Input
1000
995
  type="email"
1001
996
  value={email}
@@ -1008,8 +1003,8 @@ export const LoginForm: Story = {
1008
1003
  />
1009
1004
  </div>
1010
1005
 
1011
- <div className="u-mb-3">
1012
- <label className="u-block u-text-7 u-font-semibold u-mb-2">Password</label>
1006
+ <div className="u-mb-4">
1007
+ <label className="u-block u-text-lg u-font-semibold u-mb-2">Password</label>
1013
1008
  <Input
1014
1009
  type="password"
1015
1010
  value={password}
@@ -1023,6 +1018,7 @@ export const LoginForm: Story = {
1023
1018
  </div>
1024
1019
 
1025
1020
  <div
1021
+ className="u-flex u-justify-between u-items-center u-mb-5"
1026
1022
  style={{
1027
1023
  display: 'flex',
1028
1024
  justifyContent: 'space-between',
@@ -1031,6 +1027,7 @@ export const LoginForm: Story = {
1031
1027
  }}
1032
1028
  >
1033
1029
  <label
1030
+ className="u-flex u-items-center u-gap-2 u-text-xs u-cursor-pointer"
1034
1031
  style={{
1035
1032
  display: 'flex',
1036
1033
  alignItems: 'center',
@@ -1043,12 +1040,14 @@ export const LoginForm: Story = {
1043
1040
  type="checkbox"
1044
1041
  checked={rememberMe}
1045
1042
  onChange={e => setRememberMe(e.target.checked)}
1043
+ className="u-accent-indigo-500"
1046
1044
  style={{ accentColor: '#667eea' }}
1047
1045
  />
1048
1046
  Remember me
1049
1047
  </label>
1050
1048
  <a
1051
1049
  href="#"
1050
+ className="u-text-xs u-text-indigo-500 u-no-underline u-font-bold"
1052
1051
  style={{
1053
1052
  fontSize: '12px',
1054
1053
  color: '#667eea',
@@ -1067,15 +1066,16 @@ export const LoginForm: Story = {
1067
1066
  glass={{
1068
1067
  elasticity: 0,
1069
1068
  }}
1070
- className="u-block u-w-100"
1069
+ className="u-block u-w-full"
1071
1070
  >
1072
1071
  {isLoading ? 'Signing in...' : 'Sign In'}
1073
1072
  </Button>
1074
1073
  </form>
1075
1074
 
1076
1075
  {/* Social Login */}
1077
- <div style={{ marginTop: '20px' }}>
1076
+ <div className="u-mt-5">
1078
1077
  <div
1078
+ className="u-relative u-text-center u-mb-5"
1079
1079
  style={{
1080
1080
  position: 'relative',
1081
1081
  textAlign: 'center',
@@ -1083,6 +1083,7 @@ export const LoginForm: Story = {
1083
1083
  }}
1084
1084
  >
1085
1085
  <div
1086
+ className="u-absolute u-top-1/2 u-left-0 u-right-0 u-h-px u-bg-white/10"
1086
1087
  style={{
1087
1088
  position: 'absolute',
1088
1089
  top: '50%',
@@ -1093,6 +1094,7 @@ export const LoginForm: Story = {
1093
1094
  }}
1094
1095
  />
1095
1096
  <span
1097
+ className="u-relative u-px-4 u-bg-inherit u-text-xs u-opacity-60"
1096
1098
  style={{
1097
1099
  position: 'relative',
1098
1100
  padding: '0 16px',
@@ -1105,8 +1107,9 @@ export const LoginForm: Story = {
1105
1107
  </span>
1106
1108
  </div>
1107
1109
 
1108
- <div style={{ display: 'flex', gap: '12px' }}>
1110
+ <div className="u-flex u-gap-3">
1109
1111
  <button
1112
+ className="u-flex-1 u-p-2.5 u-rounded-lg u-border u-border-white/20 u-bg-white/5 u-text-inherit u-cursor-pointer u-text-xs u-font-bold u-flex u-items-center u-justify-center u-gap-2"
1110
1113
  style={{
1111
1114
  flex: 1,
1112
1115
  padding: '10px',
@@ -1126,6 +1129,7 @@ export const LoginForm: Story = {
1126
1129
  <span>🔵</span> Google
1127
1130
  </button>
1128
1131
  <button
1132
+ className="u-flex-1 u-p-2.5 u-rounded-lg u-border u-border-white/20 u-bg-white/5 u-text-inherit u-cursor-pointer u-text-xs u-font-bold u-flex u-items-center u-justify-center u-gap-2"
1129
1133
  style={{
1130
1134
  flex: 1,
1131
1135
  padding: '10px',
@@ -1148,10 +1152,11 @@ export const LoginForm: Story = {
1148
1152
  </div>
1149
1153
 
1150
1154
  {/* Sign Up Link */}
1151
- <div style={{ marginTop: '20px', textAlign: 'center', fontSize: '12px' }}>
1155
+ <div className="u-mt-5 u-text-center u-text-xs">
1152
1156
  Don't have an account?{' '}
1153
1157
  <a
1154
1158
  href="#"
1159
+ className="u-text-indigo-500 u-no-underline u-font-bold"
1155
1160
  style={{
1156
1161
  color: '#667eea',
1157
1162
  textDecoration: 'none',
@@ -1183,7 +1188,7 @@ export const LoginForm: Story = {
1183
1188
  *
1184
1189
  * Demonstrates a media player interface using AtomixGlass for a premium look.
1185
1190
  */
1186
- export const MusicPlayer: Story = {
1191
+ export const SimpleMusicPlayer: Story = {
1187
1192
  render: () => {
1188
1193
  // eslint-disable-next-line react-hooks/rules-of-hooks
1189
1194
  const [isPlaying, setIsPlaying] = useState(false);
@@ -1416,29 +1421,355 @@ export const MusicPlayer: Story = {
1416
1421
  </div>
1417
1422
 
1418
1423
  {/* Volume Control */}
1419
- <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
1420
- <span style={{ fontSize: '18px', opacity: 0.7 }}>
1421
- {volume === 0 ? (
1422
- <Icon name="SpeakerLow" />
1423
- ) : volume < 50 ? (
1424
- <Icon name="SpeakerX" />
1425
- ) : (
1426
- <Icon name="SpeakerHigh" />
1427
- )}
1428
- </span>
1429
- <input
1430
- type="range"
1431
- min="0"
1432
- max="100"
1433
- value={volume}
1434
- onChange={e => setVolume(parseInt(e.target.value))}
1424
+ <div className="u-flex u-justify-between u-items-center">
1425
+ <Icon name="Volume" />
1426
+ <div
1435
1427
  style={{
1436
- flex: 1,
1437
- accentColor: '#667eea',
1428
+ width: '100px',
1429
+ height: '6px',
1430
+ background: 'rgba(255,255,255,0.1)',
1431
+ borderRadius: '3px',
1432
+ overflow: 'hidden',
1438
1433
  cursor: 'pointer',
1439
1434
  }}
1435
+ onClick={e => {
1436
+ const rect = e.currentTarget.getBoundingClientRect();
1437
+ const x = e.clientX - rect.left;
1438
+ const percentage = x / rect.width;
1439
+ setVolume(Math.floor(100 * percentage));
1440
+ }}
1441
+ >
1442
+ <div
1443
+ style={{
1444
+ height: '100%',
1445
+ width: `${volume}%`,
1446
+ background:
1447
+ 'linear-gradient(90deg, rgba(var(--atomix-primary-rgb),0.5) 0%, rgba(var(--atomix-secondary-rgb),0.5) 100%)',
1448
+ transition: 'width 0.1s ease',
1449
+ }}
1450
+ />
1451
+ </div>
1452
+ </div>
1453
+ </div>
1454
+ </AtomixGlass>
1455
+ </div>
1456
+ </BackgroundWrapper>
1457
+ );
1458
+ },
1459
+ parameters: {
1460
+ docs: {
1461
+ description: {
1462
+ story:
1463
+ 'A media player example demonstrating a premium look using AtomixGlass. Features album art, track information, progress bar, playback controls, and volume control.',
1464
+ },
1465
+ },
1466
+ },
1467
+ };
1468
+
1469
+ /**
1470
+ * Music Player Example
1471
+ *
1472
+ * This story demonstrates a modern music player interface using AtomixGlass,
1473
+ * featuring album art, track information, progress bar, and playback controls.
1474
+ */
1475
+ export const MusicPlayer: Story = {
1476
+ render: () => {
1477
+ // eslint-disable-next-line react-hooks/rules-of-hooks
1478
+ const [isPlaying, setIsPlaying] = useState(false);
1479
+ // eslint-disable-next-line react-hooks/rules-of-hooks
1480
+ const [currentTime, setCurrentTime] = useState(125); // seconds
1481
+ // eslint-disable-next-line react-hooks/rules-of-hooks
1482
+ const [duration, setDuration] = useState(240); // seconds
1483
+ // eslint-disable-next-line react-hooks/rules-of-hooks
1484
+ const [volume, setVolume] = useState(80);
1485
+ // eslint-disable-next-line react-hooks/rules-of-hooks
1486
+ const [shuffle, setShuffle] = useState(false);
1487
+ // eslint-disable-next-line react-hooks/rules-of-hooks
1488
+ const [repeatMode, setRepeatMode] = useState<'off' | 'all' | 'one'>('all');
1489
+
1490
+ const formatTime = (seconds: number) => {
1491
+ const mins = Math.floor(seconds / 60);
1492
+ const secs = Math.floor(seconds % 60);
1493
+ return `${mins}:${secs.toString().padStart(2, '0')}`;
1494
+ };
1495
+
1496
+ const togglePlayPause = () => setIsPlaying(!isPlaying);
1497
+
1498
+ const skipForward = () => setCurrentTime(prev => Math.min(duration, prev + 10));
1499
+ const skipBackward = () => setCurrentTime(prev => Math.max(0, prev - 10));
1500
+
1501
+ const modes = ['off', 'all', 'one'] as const;
1502
+
1503
+ return (
1504
+ <BackgroundWrapper
1505
+ backgroundImage={
1506
+ 'https://images.unsplash.com/photo-1614188973043-4ed7d383de37?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=1470'
1507
+ }
1508
+ className="u-p-10"
1509
+ >
1510
+ <div className="u-max-w-lg u-mx-auto" style={{ maxWidth: '500px', margin: '0 auto' }}>
1511
+ <AtomixGlass
1512
+ displacementScale={100}
1513
+ blurAmount={3}
1514
+ saturation={170}
1515
+ aberrationIntensity={3}
1516
+ borderRadius={30}
1517
+ mode="polar"
1518
+ withLiquidBlur={true}
1519
+ withTimeAnimation={true}
1520
+ withMultiLayerDistortion={true}
1521
+ >
1522
+ <div className="u-p-6" style={{ padding: '24px' }}>
1523
+ {/* Album Art */}
1524
+ <div
1525
+ className="u-mx-auto u-mb-6 u-relative"
1526
+ style={{
1527
+ width: '220px',
1528
+ height: '220px',
1529
+ margin: '0 auto 24px',
1530
+ borderRadius: '20px',
1531
+ overflow: 'hidden',
1532
+ boxShadow: '0 20px 50px rgba(0, 0, 0, 0.3)',
1533
+ }}
1534
+ >
1535
+ <img
1536
+ src="https://images.unsplash.com/photo-1470225620780-dba8ba36b745?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=600&q=80"
1537
+ alt="Album cover"
1538
+ style={{
1539
+ width: '100%',
1540
+ height: '100%',
1541
+ objectFit: 'cover',
1542
+ }}
1440
1543
  />
1441
- <span style={{ fontSize: '14px', opacity: 0.6, minWidth: '35px' }}>{volume}%</span>
1544
+ <div
1545
+ className="u-absolute u-inset-0"
1546
+ style={{
1547
+ position: 'absolute',
1548
+ inset: 0,
1549
+ background:
1550
+ 'linear-gradient(135deg, rgba(102,126,234,0.3) 0%, rgba(140,185,60,0.3) 100%)',
1551
+ }}
1552
+ />
1553
+ </div>
1554
+
1555
+ {/* Track Info */}
1556
+ <div className="u-text-center u-mb-6" style={{ marginBottom: '24px' }}>
1557
+ <h3
1558
+ className="u-mt-0 u-mb-1 u-text-xl u-font-bold"
1559
+ style={{ margin: '0 0 4px', fontSize: '20px', fontWeight: 700 }}
1560
+ >
1561
+ Midnight City
1562
+ </h3>
1563
+ <p
1564
+ className="u-m-0 u-opacity-70 u-text-base"
1565
+ style={{ margin: 0, fontSize: '16px', opacity: 0.7 }}
1566
+ >
1567
+ M83
1568
+ </p>
1569
+ <p
1570
+ className="u-mt-2 u-mb-0 u-opacity-50 u-text-sm"
1571
+ style={{ margin: '8px 0 0', fontSize: '14px', opacity: 0.5 }}
1572
+ >
1573
+ Digital Single • 2011
1574
+ </p>
1575
+ </div>
1576
+
1577
+ {/* Progress Bar */}
1578
+ <div className="u-mb-6" style={{ marginBottom: '24px' }}>
1579
+ <div
1580
+ className="u-w-full u-h-1 u-bg-white u-opacity-20 u-rounded-full u-overflow-hidden u-mb-2"
1581
+ style={{
1582
+ width: '100%',
1583
+ height: '4px',
1584
+ background: 'rgba(255,255,255,0.2)',
1585
+ borderRadius: '2px',
1586
+ overflow: 'hidden',
1587
+ marginBottom: '8px',
1588
+ }}
1589
+ onClick={e => {
1590
+ const rect = e.currentTarget.getBoundingClientRect();
1591
+ const percent = (e.clientX - rect.left) / rect.width;
1592
+ setCurrentTime(Math.floor(duration * percent));
1593
+ }}
1594
+ >
1595
+ <div
1596
+ className="u-h-full u-bg-white u-rounded-full"
1597
+ style={{
1598
+ height: '100%',
1599
+ width: `${(currentTime / duration) * 100}%`,
1600
+ background: 'rgba(255,255,255,0.8)',
1601
+ borderRadius: '2px',
1602
+ transition: 'width 0.1s ease',
1603
+ }}
1604
+ />
1605
+ </div>
1606
+ <div
1607
+ className="u-flex u-justify-between u-text-xs u-opacity-70"
1608
+ style={{
1609
+ display: 'flex',
1610
+ justifyContent: 'space-between',
1611
+ fontSize: '12px',
1612
+ opacity: 0.7,
1613
+ }}
1614
+ >
1615
+ <span>{formatTime(currentTime)}</span>
1616
+ <span>{formatTime(duration)}</span>
1617
+ </div>
1618
+ </div>
1619
+
1620
+ {/* Controls */}
1621
+ <div
1622
+ className="u-flex u-items-center u-justify-center u-mb-6"
1623
+ style={{
1624
+ display: 'flex',
1625
+ alignItems: 'center',
1626
+ justifyContent: 'center',
1627
+ marginBottom: '24px',
1628
+ }}
1629
+ >
1630
+ <button
1631
+ onClick={() => setShuffle(!shuffle)}
1632
+ className="u-w-10 u-h-10 u-flex u-items-center u-justify-center u-rounded-full u-bg-transparent u-border-none u-text-white u-opacity-70 u-mr-4"
1633
+ style={{
1634
+ width: '40px',
1635
+ height: '40px',
1636
+ borderRadius: '50%',
1637
+ border: 'none',
1638
+ background: shuffle ? 'rgba(102, 126, 234, 0.3)' : 'transparent',
1639
+ color: 'inherit',
1640
+ cursor: 'pointer',
1641
+ fontSize: '16px',
1642
+ display: 'flex',
1643
+ alignItems: 'center',
1644
+ justifyContent: 'center',
1645
+ marginRight: '16px',
1646
+ }}
1647
+ >
1648
+ <Icon name="Shuffle" />
1649
+ </button>
1650
+
1651
+ <button
1652
+ onClick={skipBackward}
1653
+ className="u-w-12 u-h-12 u-flex u-items-center u-justify-center u-rounded-full u-bg-white u-bg-opacity-10 u-border-none u-text-white u-mr-4"
1654
+ style={{
1655
+ width: '48px',
1656
+ height: '48px',
1657
+ borderRadius: '50%',
1658
+ border: 'none',
1659
+ background: 'rgba(255,255,255,0.1)',
1660
+ color: 'inherit',
1661
+ cursor: 'pointer',
1662
+ fontSize: '20px',
1663
+ display: 'flex',
1664
+ alignItems: 'center',
1665
+ justifyContent: 'center',
1666
+ marginRight: '16px',
1667
+ }}
1668
+ >
1669
+ <Icon name="SkipBack" />
1670
+ </button>
1671
+
1672
+ <button
1673
+ onClick={togglePlayPause}
1674
+ className="u-w-16 u-h-16 u-flex u-items-center u-justify-center u-rounded-full u-bg-white u-text-black u-mr-4"
1675
+ style={{
1676
+ width: '64px',
1677
+ height: '64px',
1678
+ borderRadius: '50%',
1679
+ border: 'none',
1680
+ background: 'white',
1681
+ color: 'black',
1682
+ cursor: 'pointer',
1683
+ fontSize: '24px',
1684
+ display: 'flex',
1685
+ alignItems: 'center',
1686
+ justifyContent: 'center',
1687
+ marginRight: '16px',
1688
+ boxShadow: '0 10px 25px rgba(0, 0, 0, 0.2)',
1689
+ }}
1690
+ >
1691
+ {isPlaying ? <Icon name="Pause" /> : <Icon name="Play" />}
1692
+ </button>
1693
+
1694
+ <button
1695
+ onClick={skipForward}
1696
+ className="u-w-12 u-h-12 u-flex u-items-center u-justify-center u-rounded-full u-bg-white u-bg-opacity-10 u-border-none u-text-white u-mr-4"
1697
+ style={{
1698
+ width: '48px',
1699
+ height: '48px',
1700
+ borderRadius: '50%',
1701
+ border: 'none',
1702
+ background: 'rgba(255,255,255,0.1)',
1703
+ color: 'inherit',
1704
+ cursor: 'pointer',
1705
+ fontSize: '20px',
1706
+ display: 'flex',
1707
+ alignItems: 'center',
1708
+ justifyContent: 'center',
1709
+ marginRight: '16px',
1710
+ }}
1711
+ >
1712
+ <Icon name="SkipForward" />
1713
+ </button>
1714
+
1715
+ <button
1716
+ onClick={() => {
1717
+ const currentIndex = modes.indexOf(repeatMode);
1718
+ setRepeatMode(modes[(currentIndex + 1) % modes.length]);
1719
+ }}
1720
+ className={`u-w-10 u-h-10 u-flex u-items-center u-justify-center u-rounded-full u-border-none u-text-white u-opacity-70 ${
1721
+ repeatMode !== 'off' ? 'u-bg-blue-500 u-bg-opacity-30' : 'u-bg-transparent'
1722
+ }`}
1723
+ style={{
1724
+ width: '40px',
1725
+ height: '40px',
1726
+ borderRadius: '50%',
1727
+ border: 'none',
1728
+ background:
1729
+ repeatMode !== 'off' ? 'rgba(102, 126, 234, 0.3)' : 'rgba(255,255,255,0.1)',
1730
+ color: 'inherit',
1731
+ cursor: 'pointer',
1732
+ fontSize: '16px',
1733
+ display: 'flex',
1734
+ alignItems: 'center',
1735
+ justifyContent: 'center',
1736
+ }}
1737
+ >
1738
+ {repeatMode === 'one' ? <Icon name="RepeatOnce" /> : <Icon name="Repeat" />}
1739
+ </button>
1740
+ </div>
1741
+
1742
+ {/* Volume Control */}
1743
+ <div className="u-flex u-justify-between u-items-center">
1744
+ <Icon name="Volume" />
1745
+ <div
1746
+ className="u-w-24 u-h-1.5 u-bg-white u-bg-opacity-20 u-rounded-full u-overflow-hidden u-cursor-pointer"
1747
+ style={{
1748
+ width: '100px',
1749
+ height: '6px',
1750
+ background: 'rgba(255,255,255,0.1)',
1751
+ borderRadius: '3px',
1752
+ overflow: 'hidden',
1753
+ cursor: 'pointer',
1754
+ }}
1755
+ onClick={e => {
1756
+ const rect = e.currentTarget.getBoundingClientRect();
1757
+ const x = e.clientX - rect.left;
1758
+ const percentage = x / rect.width;
1759
+ setVolume(Math.floor(100 * percentage));
1760
+ }}
1761
+ >
1762
+ <div
1763
+ className="u-h-full u-bg-white u-bg-opacity-80"
1764
+ style={{
1765
+ height: '100%',
1766
+ width: `${volume}%`,
1767
+ background:
1768
+ 'linear-gradient(90deg, rgba(var(--atomix-primary-rgb),0.5) 0%, rgba(var(--atomix-secondary-rgb),0.5) 100%)',
1769
+ transition: 'width 0.1s ease',
1770
+ }}
1771
+ />
1772
+ </div>
1442
1773
  </div>
1443
1774
  </div>
1444
1775
  </AtomixGlass>
@@ -1466,7 +1797,7 @@ export const PricingTable: Story = {
1466
1797
  render: () => {
1467
1798
  // eslint-disable-next-line react-hooks/rules-of-hooks
1468
1799
  const [billingCycle, setBillingCycle] = useState<'monthly' | 'yearly'>('monthly');
1469
-
1800
+
1470
1801
  const plans = [
1471
1802
  {
1472
1803
  name: 'Starter',
@@ -1527,7 +1858,7 @@ export const PricingTable: Story = {
1527
1858
  backgroundAttachment: 'fixed',
1528
1859
  }}
1529
1860
  >
1530
- <Container className="u-py-6 u-text-white">
1861
+ <Container className="u-pb-6">
1531
1862
  {/* Header */}
1532
1863
  <div style={{ textAlign: 'center', marginBottom: '40px' }}>
1533
1864
  <div
@@ -1599,24 +1930,30 @@ export const PricingTable: Story = {
1599
1930
  fontSize: '16px',
1600
1931
  fontWeight: billingCycle === 'yearly' ? 600 : 400,
1601
1932
  transition: 'all 0.3s ease',
1602
- position: 'relative',
1603
1933
  }}
1604
1934
  >
1605
1935
  Yearly
1606
1936
  <span
1607
1937
  style={{
1608
- position: 'absolute',
1609
- top: '-8px',
1610
- right: '-8px',
1611
- background: '#10b981',
1612
- color: 'white',
1613
- fontSize: '11px',
1614
- padding: '2px 6px',
1615
- borderRadius: '8px',
1616
- fontWeight: 700,
1938
+ position: 'relative',
1617
1939
  }}
1618
1940
  >
1619
- Save {savings}%
1941
+ Yearly
1942
+ <span
1943
+ style={{
1944
+ position: 'absolute',
1945
+ top: '-8px',
1946
+ right: '-8px',
1947
+ background: '#10b981',
1948
+ color: 'white',
1949
+ fontSize: '11px',
1950
+ padding: '2px 6px',
1951
+ borderRadius: '8px',
1952
+ fontWeight: 700,
1953
+ }}
1954
+ >
1955
+ Save {savings}%
1956
+ </span>
1620
1957
  </span>
1621
1958
  </button>
1622
1959
  </AtomixGlass>