@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
@@ -289,7 +289,31 @@ const BackgroundWrapper = ({
289
289
  export const Playground: Story = {
290
290
  render: () => {
291
291
  // eslint-disable-next-line react-hooks/rules-of-hooks
292
- const [settings, setSettings] = useState({
292
+ const [settings, setSettings] = useState<{
293
+ displacementScale: number;
294
+ blurAmount: number;
295
+ saturation: number;
296
+ aberrationIntensity: number;
297
+ elasticity: number;
298
+ borderRadius: number;
299
+ overLight: boolean;
300
+ reducedMotion: boolean;
301
+ highContrast: boolean;
302
+ withoutEffects: boolean;
303
+ withLiquidBlur: boolean;
304
+ withBorder: boolean;
305
+ withTimeAnimation: boolean;
306
+ animationSpeed: number;
307
+ withMultiLayerDistortion: boolean;
308
+ distortionOctaves: number;
309
+ distortionLacunarity: number;
310
+ distortionGain: number;
311
+ distortionQuality: 'low' | 'medium' | 'high' | 'ultra';
312
+ devicePreset: 'performance' | 'balanced' | 'quality';
313
+ disableResponsiveBreakpoints: boolean;
314
+ debugPerformance: boolean;
315
+ debugOverLight: boolean;
316
+ }>({
293
317
  displacementScale: 40,
294
318
  blurAmount: 1,
295
319
  saturation: 140,
@@ -302,6 +326,17 @@ export const Playground: Story = {
302
326
  withoutEffects: false,
303
327
  withLiquidBlur: false,
304
328
  withBorder: true,
329
+ withTimeAnimation: true,
330
+ animationSpeed: 1.0,
331
+ withMultiLayerDistortion: false,
332
+ distortionOctaves: 3,
333
+ distortionLacunarity: 2.0,
334
+ distortionGain: 0.5,
335
+ distortionQuality: 'medium',
336
+ devicePreset: 'balanced',
337
+ disableResponsiveBreakpoints: false,
338
+ debugPerformance: false,
339
+ debugOverLight: false,
305
340
  });
306
341
 
307
342
  // eslint-disable-next-line react-hooks/rules-of-hooks
@@ -325,7 +360,7 @@ export const Playground: Story = {
325
360
  // eslint-disable-next-line react-hooks/rules-of-hooks
326
361
  const [copiedCode, setCopiedCode] = useState(false);
327
362
  // eslint-disable-next-line react-hooks/rules-of-hooks
328
- const [controlTab, setControlTab] = useState<'optics' | 'physics' | 'flags'>('optics');
363
+ const [controlTab, setControlTab] = useState<'optics' | 'animation' | 'responsive' | 'flags'>('optics');
329
364
  // eslint-disable-next-line react-hooks/rules-of-hooks
330
365
  const backgroundsArrayRef = useRef<typeof backgrounds | null>(null);
331
366
 
@@ -346,6 +381,17 @@ export const Playground: Story = {
346
381
  withoutEffects: false,
347
382
  withLiquidBlur: false,
348
383
  withBorder: true,
384
+ withTimeAnimation: false,
385
+ animationSpeed: 1.0,
386
+ withMultiLayerDistortion: false,
387
+ distortionOctaves: 3,
388
+ distortionLacunarity: 2.0,
389
+ distortionGain: 0.5,
390
+ distortionQuality: 'medium' as const,
391
+ devicePreset: 'balanced' as const,
392
+ disableResponsiveBreakpoints: false,
393
+ debugPerformance: false,
394
+ debugOverLight: false,
349
395
  },
350
396
  mode: 'standard' as const,
351
397
  shader: 'liquidGlass' as const,
@@ -366,6 +412,17 @@ export const Playground: Story = {
366
412
  withoutEffects: false,
367
413
  withLiquidBlur: false,
368
414
  withBorder: true,
415
+ withTimeAnimation: true,
416
+ animationSpeed: 1.0,
417
+ withMultiLayerDistortion: false,
418
+ distortionOctaves: 3,
419
+ distortionLacunarity: 2.0,
420
+ distortionGain: 0.5,
421
+ distortionQuality: 'medium' as const,
422
+ devicePreset: 'balanced' as const,
423
+ disableResponsiveBreakpoints: false,
424
+ debugPerformance: false,
425
+ debugOverLight: false,
369
426
  },
370
427
  mode: 'standard' as const,
371
428
  shader: 'liquidGlass' as const,
@@ -386,6 +443,17 @@ export const Playground: Story = {
386
443
  withoutEffects: false,
387
444
  withLiquidBlur: true,
388
445
  withBorder: true,
446
+ withTimeAnimation: true,
447
+ animationSpeed: 1.2,
448
+ withMultiLayerDistortion: true,
449
+ distortionOctaves: 5,
450
+ distortionLacunarity: 2.5,
451
+ distortionGain: 0.6,
452
+ distortionQuality: 'high' as const,
453
+ devicePreset: 'quality' as const,
454
+ disableResponsiveBreakpoints: false,
455
+ debugPerformance: false,
456
+ debugOverLight: false,
389
457
  },
390
458
  mode: 'prominent' as const,
391
459
  shader: 'plasma' as const,
@@ -406,6 +474,17 @@ export const Playground: Story = {
406
474
  withoutEffects: false,
407
475
  withLiquidBlur: true,
408
476
  withBorder: true,
477
+ withTimeAnimation: true,
478
+ animationSpeed: 1.5,
479
+ withMultiLayerDistortion: true,
480
+ distortionOctaves: 6,
481
+ distortionLacunarity: 3.0,
482
+ distortionGain: 0.7,
483
+ distortionQuality: 'ultra' as const,
484
+ devicePreset: 'quality' as const,
485
+ disableResponsiveBreakpoints: false,
486
+ debugPerformance: false,
487
+ debugOverLight: false,
409
488
  },
410
489
  mode: 'shader' as const,
411
490
  shader: 'waves' as const,
@@ -435,6 +514,15 @@ export const Playground: Story = {
435
514
  withoutEffects={${settings.withoutEffects}}
436
515
  withLiquidBlur={${settings.withLiquidBlur}}
437
516
  withBorder={${settings.withBorder}}
517
+ withTimeAnimation={${settings.withTimeAnimation}}
518
+ animationSpeed={${settings.animationSpeed}}
519
+ withMultiLayerDistortion={${settings.withMultiLayerDistortion}}
520
+ distortionOctaves={${settings.distortionOctaves}}
521
+ distortionLacunarity={${settings.distortionLacunarity}}
522
+ distortionGain={${settings.distortionGain}}
523
+ distortionQuality="${settings.distortionQuality}"
524
+ devicePreset="${settings.devicePreset}"
525
+ disableResponsiveBreakpoints={${settings.disableResponsiveBreakpoints}}
438
526
  >
439
527
  <div className="your-content">
440
528
  {/* Your content here */}
@@ -723,7 +811,7 @@ export const Playground: Story = {
723
811
  </div>
724
812
  <div>
725
813
  <div
726
- className="u-font-bold u-fs-sm"
814
+ className="u-font-bold u-text-sm"
727
815
  style={{
728
816
  background:
729
817
  'linear-gradient(90deg, #fff 0%, rgba(122,255,215,0.9) 100%)',
@@ -735,7 +823,7 @@ export const Playground: Story = {
735
823
  >
736
824
  AtomixGlass Playground
737
825
  </div>
738
- <div className="u-fs-xs u-opacity-60 u-mt-1">Live parameter editor</div>
826
+ <div className="u-text-xs u-opacity-60 u-mt-1">Live parameter editor</div>
739
827
  </div>
740
828
  </div>
741
829
  </div>
@@ -750,11 +838,11 @@ export const Playground: Story = {
750
838
  }}
751
839
  >
752
840
  <div className="u-flex u-justify-between u-items-center u-mb-2">
753
- <span className="u-text-white u-font-semibold u-fs-xs">
841
+ <span className="u-text-white u-font-semibold u-text-xs">
754
842
  Performance Score
755
843
  </span>
756
844
  <span
757
- className="u-font-bold u-fs-sm"
845
+ className="u-font-bold u-text-sm"
758
846
  style={{ color: getPerformanceColor() }}
759
847
  >
760
848
  {Math.round(performanceScore)}/100
@@ -792,7 +880,7 @@ export const Playground: Story = {
792
880
  {/* Quick Presets */}
793
881
  <div className="u-mb-4">
794
882
  <label
795
- className="u-block u-mb-2 u-text-white u-font-semibold u-fs-xs"
883
+ className="u-block u-mb-2 u-text-white u-font-semibold u-text-xs"
796
884
  style={{ letterSpacing: '0.5px' }}
797
885
  >
798
886
  ⚡ Quick Presets
@@ -851,11 +939,11 @@ export const Playground: Story = {
851
939
  border: '1px solid rgba(255,255,255,0.1)',
852
940
  }}
853
941
  >
854
- {(['optics', 'physics', 'flags'] as const).map(tab => (
942
+ {(['optics', 'animation', 'responsive', 'flags'] as const).map(tab => (
855
943
  <button
856
944
  key={tab}
857
945
  onClick={() => setControlTab(tab)}
858
- className="u-flex-grow-1 u-py-2 u-fs-xs u-font-bold u-rounded-pill u-cursor-pointer"
946
+ className="u-flex-grow-1 u-py-2 u-text-xs u-font-bold u-rounded-pill u-cursor-pointer"
859
947
  style={{
860
948
  background: controlTab === tab ? 'rgba(255,255,255,0.1)' : 'transparent',
861
949
  color: controlTab === tab ? '#fff' : 'rgba(255,255,255,0.5)',
@@ -885,7 +973,7 @@ export const Playground: Story = {
885
973
  }}
886
974
  />
887
975
  <span
888
- className="u-fs-xs u-font-bold u-opacity-60"
976
+ className="u-text-xs u-font-bold u-opacity-60"
889
977
  style={{ letterSpacing: '1px', textTransform: 'uppercase' }}
890
978
  >
891
979
  Optics
@@ -918,11 +1006,11 @@ export const Playground: Story = {
918
1006
  return (
919
1007
  <div key={key} className="u-mb-4">
920
1008
  <div className="u-flex u-justify-between u-items-baseline u-mb-1">
921
- <label className="u-fs-xs u-font-medium u-opacity-80">
1009
+ <label className="u-text-xs u-font-medium u-opacity-80">
922
1010
  {label}
923
1011
  </label>
924
1012
  <span
925
- className="u-fs-xs u-font-bold u-px-2 u-py-1 u-rounded"
1013
+ className="u-text-xs u-font-bold u-px-2 u-py-1 u-rounded"
926
1014
  style={{
927
1015
  background: 'rgba(122,255,215,0.12)',
928
1016
  color: '#7AFFD7',
@@ -968,69 +1056,179 @@ export const Playground: Story = {
968
1056
  </div>
969
1057
  )}
970
1058
 
971
- {/* === CONTROLS: PHYSICS === */}
972
- {controlTab === 'physics' && (
973
- <div className="u-mb-4 u-animation-fade-in">
974
- <div className="u-flex u-items-center u-gap-2 u-mb-3">
975
- <div
976
- style={{
977
- width: '3px',
978
- height: '14px',
979
- background: 'linear-gradient(180deg, #a78bfa 0%, #ec4899 100%)',
980
- borderRadius: '2px',
981
- flexShrink: 0,
982
- }}
983
- />
984
- <span
985
- className="u-fs-xs u-font-bold u-opacity-60"
986
- style={{ letterSpacing: '1px', textTransform: 'uppercase' }}
987
- >
988
- Physics
989
- </span>
1059
+ {/* === CONTROLS: ANIMATION (PHASE 1) === */}
1060
+ {controlTab === 'animation' && (
1061
+ <>
1062
+ <div className="u-mb-4 u-animation-fade-in">
1063
+ <div className="u-flex u-items-center u-gap-2 u-mb-3">
1064
+ <div
1065
+ style={{
1066
+ width: '3px',
1067
+ height: '14px',
1068
+ background: 'linear-gradient(180deg, #a78bfa 0%, #ec4899 100%)',
1069
+ borderRadius: '2px',
1070
+ flexShrink: 0,
1071
+ }}
1072
+ />
1073
+ <span
1074
+ className="u-text-xs u-font-bold u-opacity-60"
1075
+ style={{ letterSpacing: '1px', textTransform: 'uppercase' }}
1076
+ >
1077
+ Physics
1078
+ </span>
1079
+ </div>
1080
+ {(['elasticity', 'borderRadius'] as const).map(key => {
1081
+ const value = settings[key];
1082
+ const max = key === 'borderRadius' ? 100 : 1;
1083
+ const step = key === 'elasticity' ? 0.01 : 1;
1084
+ const label = key
1085
+ .replace(/([A-Z])/g, ' $1')
1086
+ .replace(/^./, s => s.toUpperCase());
1087
+ return (
1088
+ <div key={key} className="u-mb-4">
1089
+ <div className="u-flex u-justify-between u-items-baseline u-mb-1">
1090
+ <label className="u-text-xs u-font-medium u-opacity-80">
1091
+ {label}
1092
+ </label>
1093
+ <span
1094
+ className="u-text-xs u-font-bold u-px-2 u-py-1 u-rounded"
1095
+ style={{
1096
+ background: 'rgba(167,139,250,0.12)',
1097
+ color: '#a78bfa',
1098
+ fontVariantNumeric: 'tabular-nums',
1099
+ minWidth: '40px',
1100
+ textAlign: 'center',
1101
+ }}
1102
+ >
1103
+ {(value as number).toFixed(key === 'elasticity' ? 2 : 0)}
1104
+ </span>
1105
+ </div>
1106
+ <div className="u-relative" style={{ height: '20px' }}>
1107
+ <input
1108
+ type="range"
1109
+ min={0}
1110
+ max={max}
1111
+ step={step}
1112
+ value={value as number}
1113
+ onChange={e =>
1114
+ setSettings(prev => ({
1115
+ ...prev,
1116
+ [key]: parseFloat(e.target.value),
1117
+ }))
1118
+ }
1119
+ className="premium-slider u-absolute u-w-100 u-m-0"
1120
+ style={{
1121
+ height: '2px',
1122
+ background: `linear-gradient(to right, #a78bfa ${((value as number) / max) * 100}%, rgba(255,255,255,0.15) ${((value as number) / max) * 100}%)`,
1123
+ borderRadius: '2px',
1124
+ outline: 'none',
1125
+ appearance: 'none',
1126
+ WebkitAppearance: 'none',
1127
+ top: '50%',
1128
+ transform: 'translateY(-50%)',
1129
+ }}
1130
+ />
1131
+ </div>
1132
+ </div>
1133
+ );
1134
+ })}
990
1135
  </div>
991
- {(['elasticity', 'borderRadius'] as const).map(key => {
992
- const value = settings[key];
993
- const max = key === 'borderRadius' ? 100 : 1;
994
- const step = key === 'elasticity' ? 0.01 : 1;
995
- const label = key
996
- .replace(/([A-Z])/g, ' $1')
997
- .replace(/^./, s => s.toUpperCase());
998
- return (
999
- <div key={key} className="u-mb-4">
1136
+
1137
+ {/* Animation System Controls */}
1138
+ <div className="u-mb-4 u-animation-fade-in">
1139
+ <div className="u-flex u-items-center u-gap-2 u-mb-3">
1140
+ <div
1141
+ style={{
1142
+ width: '3px',
1143
+ height: '14px',
1144
+ background: 'linear-gradient(180deg, #f472b6 0%, #a78bfa 100%)',
1145
+ borderRadius: '2px',
1146
+ flexShrink: 0,
1147
+ }}
1148
+ />
1149
+ <span
1150
+ className="u-text-xs u-font-bold u-opacity-60"
1151
+ style={{ letterSpacing: '1px', textTransform: 'uppercase' }}
1152
+ >
1153
+ Animation System
1154
+ </span>
1155
+ </div>
1156
+
1157
+ {/* Time Animation Toggle */}
1158
+ <div className="u-mb-3">
1159
+ <button
1160
+ onClick={() => setSettings(prev => ({ ...prev, withTimeAnimation: !prev.withTimeAnimation }))}
1161
+ className="u-flex u-items-center u-gap-2 u-px-3 u-py-2 u-rounded u-text-start u-w-100"
1162
+ style={{
1163
+ background: settings.withTimeAnimation
1164
+ ? 'rgba(244,114,182,0.15)'
1165
+ : 'rgba(255,255,255,0.04)',
1166
+ border: settings.withTimeAnimation
1167
+ ? '1px solid rgba(244,114,182,0.45)'
1168
+ : '1px solid rgba(255,255,255,0.1)',
1169
+ cursor: 'pointer',
1170
+ transition: 'all 0.2s',
1171
+ }}
1172
+ >
1173
+ <div
1174
+ style={{
1175
+ width: '10px',
1176
+ height: '10px',
1177
+ borderRadius: '50%',
1178
+ background: settings.withTimeAnimation ? '#f472b6' : 'rgba(255,255,255,0.2)',
1179
+ flexShrink: 0,
1180
+ boxShadow: settings.withTimeAnimation ? '0 0 8px rgba(244,114,182,0.6)' : 'none',
1181
+ }}
1182
+ />
1183
+ <span
1184
+ className="u-text-xs u-font-medium"
1185
+ style={{
1186
+ color: settings.withTimeAnimation ? '#f472b6' : 'rgba(255,255,255,0.6)',
1187
+ flex: 1
1188
+ }}
1189
+ >
1190
+ Time Animation
1191
+ </span>
1192
+ </button>
1193
+ </div>
1194
+
1195
+ {/* Animation Speed */}
1196
+ {settings.withTimeAnimation && (
1197
+ <div className="u-mb-4">
1000
1198
  <div className="u-flex u-justify-between u-items-baseline u-mb-1">
1001
- <label className="u-fs-xs u-font-medium u-opacity-80">
1002
- {label}
1199
+ <label className="u-text-xs u-font-medium u-opacity-80">
1200
+ Animation Speed
1003
1201
  </label>
1004
1202
  <span
1005
- className="u-fs-xs u-font-bold u-px-2 u-py-1 u-rounded"
1203
+ className="u-text-xs u-font-bold u-px-2 u-py-1 u-rounded"
1006
1204
  style={{
1007
- background: 'rgba(167,139,250,0.12)',
1008
- color: '#a78bfa',
1205
+ background: 'rgba(244,114,182,0.12)',
1206
+ color: '#f472b6',
1009
1207
  fontVariantNumeric: 'tabular-nums',
1010
1208
  minWidth: '40px',
1011
1209
  textAlign: 'center',
1012
1210
  }}
1013
1211
  >
1014
- {(value as number).toFixed(key === 'elasticity' ? 2 : 0)}
1212
+ {settings.animationSpeed.toFixed(1)}x
1015
1213
  </span>
1016
1214
  </div>
1017
1215
  <div className="u-relative" style={{ height: '20px' }}>
1018
1216
  <input
1019
1217
  type="range"
1020
1218
  min={0}
1021
- max={max}
1022
- step={step}
1023
- value={value as number}
1219
+ max={3}
1220
+ step={0.1}
1221
+ value={settings.animationSpeed}
1024
1222
  onChange={e =>
1025
1223
  setSettings(prev => ({
1026
1224
  ...prev,
1027
- [key]: parseFloat(e.target.value),
1225
+ animationSpeed: parseFloat(e.target.value),
1028
1226
  }))
1029
1227
  }
1030
1228
  className="premium-slider u-absolute u-w-100 u-m-0"
1031
1229
  style={{
1032
1230
  height: '2px',
1033
- background: `linear-gradient(to right, #a78bfa ${((value as number) / max) * 100}%, rgba(255,255,255,0.15) ${((value as number) / max) * 100}%)`,
1231
+ background: `linear-gradient(to right, #f472b6 ${((settings.animationSpeed / 3) * 100)}%, rgba(255,255,255,0.15) ${((settings.animationSpeed / 3) * 100)}%)`,
1034
1232
  borderRadius: '2px',
1035
1233
  outline: 'none',
1036
1234
  appearance: 'none',
@@ -1041,11 +1239,357 @@ export const Playground: Story = {
1041
1239
  />
1042
1240
  </div>
1043
1241
  </div>
1044
- );
1045
- })}
1242
+ )}
1243
+
1244
+ {/* Multi-Layer Distortion Toggle */}
1245
+ <div className="u-mb-3">
1246
+ <button
1247
+ onClick={() => setSettings(prev => ({ ...prev, withMultiLayerDistortion: !prev.withMultiLayerDistortion }))}
1248
+ className="u-flex u-items-center u-gap-2 u-px-3 u-py-2 u-rounded u-text-start u-w-100"
1249
+ style={{
1250
+ background: settings.withMultiLayerDistortion
1251
+ ? 'rgba(167,139,250,0.15)'
1252
+ : 'rgba(255,255,255,0.04)',
1253
+ border: settings.withMultiLayerDistortion
1254
+ ? '1px solid rgba(167,139,250,0.45)'
1255
+ : '1px solid rgba(255,255,255,0.1)',
1256
+ cursor: 'pointer',
1257
+ transition: 'all 0.2s',
1258
+ }}
1259
+ >
1260
+ <div
1261
+ style={{
1262
+ width: '10px',
1263
+ height: '10px',
1264
+ borderRadius: '50%',
1265
+ background: settings.withMultiLayerDistortion ? '#a78bfa' : 'rgba(255,255,255,0.2)',
1266
+ flexShrink: 0,
1267
+ boxShadow: settings.withMultiLayerDistortion ? '0 0 8px rgba(167,139,250,0.6)' : 'none',
1268
+ }}
1269
+ />
1270
+ <span
1271
+ className="u-text-xs u-font-medium"
1272
+ style={{
1273
+ color: settings.withMultiLayerDistortion ? '#a78bfa' : 'rgba(255,255,255,0.6)',
1274
+ flex: 1
1275
+ }}
1276
+ >
1277
+ Multi-Layer Distortion
1278
+ </span>
1279
+ </button>
1280
+ </div>
1281
+
1282
+ {/* FBM Parameters */}
1283
+ {settings.withMultiLayerDistortion && (
1284
+ <>
1285
+ {/* Octaves */}
1286
+ <div className="u-mb-3">
1287
+ <div className="u-flex u-justify-between u-items-baseline u-mb-1">
1288
+ <label className="u-text-xs u-font-medium u-opacity-80">
1289
+ Octaves
1290
+ </label>
1291
+ <span
1292
+ className="u-text-xs u-font-bold u-px-2 u-py-1 u-rounded"
1293
+ style={{
1294
+ background: 'rgba(167,139,250,0.12)',
1295
+ color: '#a78bfa',
1296
+ fontVariantNumeric: 'tabular-nums',
1297
+ minWidth: '40px',
1298
+ textAlign: 'center',
1299
+ }}
1300
+ >
1301
+ {settings.distortionOctaves}
1302
+ </span>
1303
+ </div>
1304
+ <div className="u-relative" style={{ height: '20px' }}>
1305
+ <input
1306
+ type="range"
1307
+ min={1}
1308
+ max={8}
1309
+ step={1}
1310
+ value={settings.distortionOctaves}
1311
+ onChange={e =>
1312
+ setSettings(prev => ({
1313
+ ...prev,
1314
+ distortionOctaves: parseInt(e.target.value),
1315
+ }))
1316
+ }
1317
+ className="premium-slider u-absolute u-w-100 u-m-0"
1318
+ style={{
1319
+ height: '2px',
1320
+ background: `linear-gradient(to right, #a78bfa ${(settings.distortionOctaves / 8) * 100}%, rgba(255,255,255,0.15) ${(settings.distortionOctaves / 8) * 100}%)`,
1321
+ borderRadius: '2px',
1322
+ outline: 'none',
1323
+ appearance: 'none',
1324
+ WebkitAppearance: 'none',
1325
+ top: '50%',
1326
+ transform: 'translateY(-50%)',
1327
+ }}
1328
+ />
1329
+ </div>
1330
+ </div>
1331
+
1332
+ {/* Lacunarity */}
1333
+ <div className="u-mb-3">
1334
+ <div className="u-flex u-justify-between u-items-baseline u-mb-1">
1335
+ <label className="u-text-xs u-font-medium u-opacity-80">
1336
+ Lacunarity
1337
+ </label>
1338
+ <span
1339
+ className="u-text-xs u-font-bold u-px-2 u-py-1 u-rounded"
1340
+ style={{
1341
+ background: 'rgba(167,139,250,0.12)',
1342
+ color: '#a78bfa',
1343
+ fontVariantNumeric: 'tabular-nums',
1344
+ minWidth: '40px',
1345
+ textAlign: 'center',
1346
+ }}
1347
+ >
1348
+ {settings.distortionLacunarity.toFixed(1)}
1349
+ </span>
1350
+ </div>
1351
+ <div className="u-relative" style={{ height: '20px' }}>
1352
+ <input
1353
+ type="range"
1354
+ min={1}
1355
+ max={4}
1356
+ step={0.1}
1357
+ value={settings.distortionLacunarity}
1358
+ onChange={e =>
1359
+ setSettings(prev => ({
1360
+ ...prev,
1361
+ distortionLacunarity: parseFloat(e.target.value),
1362
+ }))
1363
+ }
1364
+ className="premium-slider u-absolute u-w-100 u-m-0"
1365
+ style={{
1366
+ height: '2px',
1367
+ background: `linear-gradient(to right, #a78bfa ${((settings.distortionLacunarity - 1) / 3) * 100}%, rgba(255,255,255,0.15) ${((settings.distortionLacunarity - 1) / 3) * 100}%)`,
1368
+ borderRadius: '2px',
1369
+ outline: 'none',
1370
+ appearance: 'none',
1371
+ WebkitAppearance: 'none',
1372
+ top: '50%',
1373
+ transform: 'translateY(-50%)',
1374
+ }}
1375
+ />
1376
+ </div>
1377
+ </div>
1378
+
1379
+ {/* Gain */}
1380
+ <div className="u-mb-3">
1381
+ <div className="u-flex u-justify-between u-items-baseline u-mb-1">
1382
+ <label className="u-text-xs u-font-medium u-opacity-80">
1383
+ Gain
1384
+ </label>
1385
+ <span
1386
+ className="u-text-xs u-font-bold u-px-2 u-py-1 u-rounded"
1387
+ style={{
1388
+ background: 'rgba(167,139,250,0.12)',
1389
+ color: '#a78bfa',
1390
+ fontVariantNumeric: 'tabular-nums',
1391
+ minWidth: '40px',
1392
+ textAlign: 'center',
1393
+ }}
1394
+ >
1395
+ {settings.distortionGain.toFixed(2)}
1396
+ </span>
1397
+ </div>
1398
+ <div className="u-relative" style={{ height: '20px' }}>
1399
+ <input
1400
+ type="range"
1401
+ min={0.1}
1402
+ max={1}
1403
+ step={0.01}
1404
+ value={settings.distortionGain}
1405
+ onChange={e =>
1406
+ setSettings(prev => ({
1407
+ ...prev,
1408
+ distortionGain: parseFloat(e.target.value),
1409
+ }))
1410
+ }
1411
+ className="premium-slider u-absolute u-w-100 u-m-0"
1412
+ style={{
1413
+ height: '2px',
1414
+ background: `linear-gradient(to right, #a78bfa ${((settings.distortionGain - 0.1) / 0.9) * 100}%, rgba(255,255,255,0.15) ${((settings.distortionGain - 0.1) / 0.9) * 100}%)`,
1415
+ borderRadius: '2px',
1416
+ outline: 'none',
1417
+ appearance: 'none',
1418
+ WebkitAppearance: 'none',
1419
+ top: '50%',
1420
+ transform: 'translateY(-50%)',
1421
+ }}
1422
+ />
1423
+ </div>
1424
+ </div>
1425
+ </>
1426
+ )}
1427
+ </div>
1428
+ </>
1429
+ )}
1430
+
1431
+ {/* === CONTROLS: RESPONSIVE & PERFORMANCE === */}
1432
+ {controlTab === 'responsive' && (
1433
+ <div className="u-mb-4 u-animation-fade-in">
1434
+ <div className="u-flex u-items-center u-gap-2 u-mb-3">
1435
+ <div
1436
+ style={{
1437
+ width: '3px',
1438
+ height: '14px',
1439
+ background: 'linear-gradient(180deg, #10b981 0%, #3b82f6 100%)',
1440
+ borderRadius: '2px',
1441
+ flexShrink: 0,
1442
+ }}
1443
+ />
1444
+ <span
1445
+ className="u-text-xs u-font-bold u-opacity-60"
1446
+ style={{ letterSpacing: '1px', textTransform: 'uppercase' }}
1447
+ >
1448
+ Responsive & Performance
1449
+ </span>
1450
+ </div>
1451
+
1452
+ {/* Device Preset Selector */}
1453
+ <div className="u-mb-4">
1454
+ <label className="u-block u-mb-2 u-text-white u-font-semibold u-text-xs">
1455
+ Device Preset
1456
+ </label>
1457
+ <div
1458
+ className="u-grid u-gap-2"
1459
+ style={{ gridTemplateColumns: 'repeat(3, 1fr)' }}
1460
+ >
1461
+ {(['performance', 'balanced', 'quality'] as const).map(preset => (
1462
+ <button
1463
+ key={preset}
1464
+ onClick={() => setSettings(prev => ({ ...prev, devicePreset: preset }))}
1465
+ className="u-py-2 u-rounded u-text-center u-text-xs u-font-bold"
1466
+ style={{
1467
+ background:
1468
+ settings.devicePreset === preset
1469
+ ? 'linear-gradient(135deg, rgba(16,185,129,0.3) 0%, rgba(59,130,246,0.2) 100%)'
1470
+ : 'rgba(255,255,255,0.05)',
1471
+ border:
1472
+ settings.devicePreset === preset
1473
+ ? '1px solid rgba(16,185,129,0.5)'
1474
+ : '1px solid rgba(255,255,255,0.1)',
1475
+ color: settings.devicePreset === preset ? '#10b981' : 'rgba(255,255,255,0.55)',
1476
+ cursor: 'pointer',
1477
+ transition: 'all 0.2s',
1478
+ outline: 'none',
1479
+ textTransform: 'capitalize',
1480
+ boxShadow:
1481
+ settings.devicePreset === preset ? '0 2px 12px rgba(16,185,129,0.15)' : 'none',
1482
+ }}
1483
+ >
1484
+ {preset}
1485
+ </button>
1486
+ ))}
1487
+ </div>
1488
+ <p className="u-mt-2 u-text-xs u-opacity-60">
1489
+ {settings.devicePreset === 'performance' && '⚡ Optimized for low-end devices with reduced quality'}
1490
+ {settings.devicePreset === 'balanced' && '⚖️ Balanced quality and performance (recommended)'}
1491
+ {settings.devicePreset === 'quality' && '💎 Maximum visual quality for high-end devices'}
1492
+ </p>
1493
+ </div>
1494
+
1495
+ {/* Disable Responsive Breakpoints Toggle */}
1496
+ <div className="u-mb-4">
1497
+ <button
1498
+ onClick={() => setSettings(prev => ({ ...prev, disableResponsiveBreakpoints: !prev.disableResponsiveBreakpoints }))}
1499
+ className="u-flex u-items-center u-gap-2 u-px-3 u-py-2 u-rounded u-text-start u-w-100"
1500
+ style={{
1501
+ background: settings.disableResponsiveBreakpoints
1502
+ ? 'rgba(239,68,68,0.15)'
1503
+ : 'rgba(255,255,255,0.04)',
1504
+ border: settings.disableResponsiveBreakpoints
1505
+ ? '1px solid rgba(239,68,68,0.45)'
1506
+ : '1px solid rgba(255,255,255,0.1)',
1507
+ cursor: 'pointer',
1508
+ transition: 'all 0.2s',
1509
+ }}
1510
+ >
1511
+ <div
1512
+ style={{
1513
+ width: '10px',
1514
+ height: '10px',
1515
+ borderRadius: '50%',
1516
+ background: settings.disableResponsiveBreakpoints ? '#ef4444' : 'rgba(255,255,255,0.2)',
1517
+ flexShrink: 0,
1518
+ boxShadow: settings.disableResponsiveBreakpoints ? '0 0 8px rgba(239,68,68,0.6)' : 'none',
1519
+ }}
1520
+ />
1521
+ <span
1522
+ className="u-text-xs u-font-medium"
1523
+ style={{
1524
+ color: settings.disableResponsiveBreakpoints ? '#ef4444' : 'rgba(255,255,255,0.6)',
1525
+ flex: 1
1526
+ }}
1527
+ >
1528
+ Disable Responsive Breakpoints
1529
+ </span>
1530
+ </button>
1531
+ <p className="u-mt-1 u-text-xs u-opacity-50">
1532
+ When enabled, prevents automatic parameter adjustment based on viewport size
1533
+ </p>
1534
+ </div>
1535
+
1536
+ {/* Debug Options */}
1537
+ <div className="u-mb-3">
1538
+ <label className="u-block u-mb-2 u-text-white u-font-semibold u-text-xs">
1539
+ 🔍 Debug Options
1540
+ </label>
1541
+ <div className="u-grid u-gap-3" style={{ gridTemplateColumns: '1fr 1fr' }}>
1542
+ {(
1543
+ [
1544
+ 'debugPerformance',
1545
+ 'debugOverLight',
1546
+ ] as const
1547
+ ).map(key => {
1548
+ const isOn = settings[key] as boolean;
1549
+ const label = key
1550
+ .replace(/([A-Z])/g, ' $1')
1551
+ .replace(/^./, s => s.toUpperCase());
1552
+ return (
1553
+ <button
1554
+ key={key}
1555
+ onClick={() => setSettings(prev => ({ ...prev, [key]: !isOn }))}
1556
+ className="u-flex u-items-center u-gap-2 u-px-3 u-py-2 u-rounded u-text-start"
1557
+ style={{
1558
+ background: isOn
1559
+ ? 'rgba(59,130,246,0.15)'
1560
+ : 'rgba(255,255,255,0.04)',
1561
+ border: isOn
1562
+ ? '1px solid rgba(59,130,246,0.45)'
1563
+ : '1px solid rgba(255,255,255,0.1)',
1564
+ cursor: 'pointer',
1565
+ transition: 'all 0.2s',
1566
+ }}
1567
+ >
1568
+ <div
1569
+ style={{
1570
+ width: '10px',
1571
+ height: '10px',
1572
+ borderRadius: '50%',
1573
+ background: isOn ? '#3b82f6' : 'rgba(255,255,255,0.2)',
1574
+ flexShrink: 0,
1575
+ boxShadow: isOn ? '0 0 8px rgba(59,130,246,0.6)' : 'none',
1576
+ transition: 'all 0.2s',
1577
+ }}
1578
+ />
1579
+ <span
1580
+ className="u-text-xs u-font-medium"
1581
+ style={{ color: isOn ? '#3b82f6' : 'rgba(255,255,255,0.6)' }}
1582
+ >
1583
+ {label}
1584
+ </span>
1585
+ </button>
1586
+ );
1587
+ })}
1588
+ </div>
1589
+ </div>
1046
1590
  </div>
1047
1591
  )}
1048
-
1592
+
1049
1593
  {/* === CONTROLS: ACCESSIBILITY FLAGS === */}
1050
1594
  {controlTab === 'flags' && (
1051
1595
  <div className="u-mb-4 u-animation-fade-in">
@@ -1060,7 +1604,7 @@ export const Playground: Story = {
1060
1604
  }}
1061
1605
  />
1062
1606
  <span
1063
- className="u-fs-xs u-font-bold u-opacity-60"
1607
+ className="u-text-xs u-font-bold u-opacity-60"
1064
1608
  style={{ letterSpacing: '1px', textTransform: 'uppercase' }}
1065
1609
  >
1066
1610
  Flags
@@ -1110,7 +1654,7 @@ export const Playground: Story = {
1110
1654
  }}
1111
1655
  />
1112
1656
  <span
1113
- className="u-fs-xs u-font-medium"
1657
+ className="u-text-xs u-font-medium"
1114
1658
  style={{ color: isOn ? '#7AFFD7' : 'rgba(255,255,255,0.6)' }}
1115
1659
  >
1116
1660
  {label}
@@ -1136,7 +1680,7 @@ export const Playground: Story = {
1136
1680
  }}
1137
1681
  />
1138
1682
  <span
1139
- className="u-fs-xs u-font-bold u-opacity-60"
1683
+ className="u-text-xs u-font-bold u-opacity-60"
1140
1684
  style={{ letterSpacing: '1px', textTransform: 'uppercase' }}
1141
1685
  >
1142
1686
  Glass Mode
@@ -1150,7 +1694,7 @@ export const Playground: Story = {
1150
1694
  <button
1151
1695
  key={mode}
1152
1696
  onClick={() => setSelectedMode(mode)}
1153
- className="u-py-2 u-rounded u-text-center u-fs-xs u-font-bold"
1697
+ className="u-py-2 u-rounded u-text-center u-text-xs u-font-bold"
1154
1698
  style={{
1155
1699
  background:
1156
1700
  selectedMode === mode
@@ -1189,7 +1733,7 @@ export const Playground: Story = {
1189
1733
  }}
1190
1734
  />
1191
1735
  <span
1192
- className="u-fs-xs u-font-bold u-opacity-60"
1736
+ className="u-text-xs u-font-bold u-opacity-60"
1193
1737
  style={{ letterSpacing: '1px', textTransform: 'uppercase' }}
1194
1738
  >
1195
1739
  Shader Variant
@@ -1200,7 +1744,7 @@ export const Playground: Story = {
1200
1744
  <button
1201
1745
  key={opt.value}
1202
1746
  onClick={() => setSelectedShader(opt.value as any)}
1203
- className="u-py-2 u-px-3 u-rounded u-text-start u-fs-xs u-font-medium"
1747
+ className="u-py-2 u-px-3 u-rounded u-text-start u-text-xs u-font-medium"
1204
1748
  style={{
1205
1749
  background:
1206
1750
  selectedShader === opt.value
@@ -1228,7 +1772,7 @@ export const Playground: Story = {
1228
1772
  <div className="u-mb-4">
1229
1773
  {/* Header row: label + nav controls */}
1230
1774
  <div className="u-flex u-items-center u-justify-between u-mb-2">
1231
- <label className="u-block u-text-white u-font-semibold u-fs-sm">
1775
+ <label className="u-block u-text-white u-font-semibold u-text-sm">
1232
1776
  🌄 Background
1233
1777
  </label>
1234
1778
  <div className="u-flex u-items-center u-gap-2">
@@ -1264,7 +1808,7 @@ export const Playground: Story = {
1264
1808
 
1265
1809
  </button>
1266
1810
  <span
1267
- className="u-fs-xs u-opacity-60"
1811
+ className="u-text-xs u-opacity-60"
1268
1812
  style={{
1269
1813
  minWidth: '36px',
1270
1814
  textAlign: 'center',
@@ -1454,17 +1998,17 @@ export const Playground: Story = {
1454
1998
  flexShrink: 0,
1455
1999
  }}
1456
2000
  />
1457
- <span className="u-fs-xs u-opacity-70" style={{ fontWeight: 600 }}>
2001
+ <span className="u-text-xs u-opacity-70" style={{ fontWeight: 600 }}>
1458
2002
  {backgrounds[backgroundIndex]?.label}
1459
2003
  </span>
1460
2004
  <span
1461
- className="u-fs-xs u-opacity-40"
2005
+ className="u-text-xs u-opacity-40"
1462
2006
  style={{ textTransform: 'capitalize', marginLeft: 'auto' }}
1463
2007
  >
1464
2008
  {backgrounds[backgroundIndex]?.tag}
1465
2009
  </span>
1466
2010
  </div>
1467
- <div className="u-mt-1 u-fs-xs u-opacity-35" style={{ letterSpacing: '0.3px' }}>
2011
+ <div className="u-mt-1 u-text-xs u-opacity-35" style={{ letterSpacing: '0.3px' }}>
1468
2012
  Use ← → arrow keys to navigate
1469
2013
  </div>
1470
2014
  </div>
@@ -1516,6 +2060,17 @@ export const Playground: Story = {
1516
2060
  withoutEffects: false,
1517
2061
  withLiquidBlur: false,
1518
2062
  withBorder: true,
2063
+ withTimeAnimation: true,
2064
+ animationSpeed: 1.0,
2065
+ withMultiLayerDistortion: false,
2066
+ distortionOctaves: 3,
2067
+ distortionLacunarity: 2.0,
2068
+ distortionGain: 0.5,
2069
+ distortionQuality: 'medium',
2070
+ devicePreset: 'balanced',
2071
+ disableResponsiveBreakpoints: false,
2072
+ debugPerformance: false,
2073
+ debugOverLight: false,
1519
2074
  });
1520
2075
  setSelectedMode('standard');
1521
2076
  setSelectedShader('liquidGlass');
@@ -1543,7 +2098,7 @@ export const Playground: Story = {
1543
2098
  <div className="u-flex u-justify-between u-items-center u-mb-6">
1544
2099
  <div>
1545
2100
  <h3
1546
- className="u-m-0 u-font-bold u-fs-xl"
2101
+ className="u-m-0 u-font-bold u-text-xl"
1547
2102
  style={{
1548
2103
  background:
1549
2104
  'linear-gradient(135deg, #fff 0%, rgba(255,255,255,0.8) 100%)',
@@ -1554,7 +2109,7 @@ export const Playground: Story = {
1554
2109
  >
1555
2110
  💻 Generated Code
1556
2111
  </h3>
1557
- <p className="u-m-0 u-fs-sm u-text-white u-opacity-70 u-mt-1">
2112
+ <p className="u-m-0 u-text-sm u-text-white u-opacity-70 u-mt-1">
1558
2113
  Copy this code to use in your project
1559
2114
  </p>
1560
2115
  </div>
@@ -1573,7 +2128,7 @@ export const Playground: Story = {
1573
2128
  </Button>
1574
2129
  </div>
1575
2130
  <pre
1576
- className="custom-scrollbar u-rounded u-fs-sm"
2131
+ className="custom-scrollbar u-rounded u-text-sm"
1577
2132
  style={{
1578
2133
  overflowX: 'auto',
1579
2134
  overflowY: 'auto',
@@ -1608,11 +2163,21 @@ export const Playground: Story = {
1608
2163
  withoutEffects={settings.withoutEffects}
1609
2164
  withLiquidBlur={settings.withLiquidBlur}
1610
2165
  withBorder={settings.withBorder}
2166
+ withTimeAnimation={settings.withTimeAnimation}
2167
+ animationSpeed={settings.animationSpeed}
2168
+ withMultiLayerDistortion={settings.withMultiLayerDistortion}
2169
+ distortionOctaves={settings.distortionOctaves}
2170
+ distortionLacunarity={settings.distortionLacunarity}
2171
+ distortionGain={settings.distortionGain}
2172
+ distortionQuality={settings.distortionQuality}
2173
+ devicePreset={settings.devicePreset}
2174
+ disableResponsiveBreakpoints={settings.disableResponsiveBreakpoints}
2175
+ debugPerformance={settings.debugPerformance}
1611
2176
  >
1612
2177
  <div className="u-h-100 u-w-100 custom-scrollbar" style={{ overflowY: 'auto' }}>
1613
2178
  <div className="u-p-4 u-p-lg-5 u-text-center">
1614
2179
  <div
1615
- className="u-inline-flex u-items-center u-gap-2 u-px-3 u-py-1 u-rounded-pill u-mb-4 u-fs-xs u-font-bold"
2180
+ className="u-inline-flex u-items-center u-gap-2 u-px-3 u-py-1 u-rounded-pill u-mb-4 u-text-xs u-font-bold"
1616
2181
  style={{
1617
2182
  background:
1618
2183
  'linear-gradient(135deg, rgba(122, 255, 215, 0.2) 0%, rgba(102, 126, 234, 0.2) 100%)',
@@ -1623,7 +2188,7 @@ export const Playground: Story = {
1623
2188
  backdropFilter: 'blur(8px)',
1624
2189
  }}
1625
2190
  >
1626
- <span className="u-fs-base">✨</span>
2191
+ <span className="u-text-base">✨</span>
1627
2192
  <span>LIVE PREVIEW</span>
1628
2193
  </div>
1629
2194
 
@@ -1713,7 +2278,7 @@ export const Playground: Story = {
1713
2278
  }}
1714
2279
  >
1715
2280
  <div
1716
- className="u-mb-3 u-font-bold u-fs-sm"
2281
+ className="u-mb-3 u-font-bold u-text-sm"
1717
2282
  style={{ color: '#7AFFD7', letterSpacing: '0.5px' }}
1718
2283
  >
1719
2284
  📊 Current Configuration Stack
@@ -1723,50 +2288,50 @@ export const Playground: Story = {
1723
2288
  style={{ gridTemplateColumns: 'repeat(6, 1fr)' }}
1724
2289
  >
1725
2290
  <div className="u-flex u-flex-column u-gap-1">
1726
- <span className="u-fs-xs u-opacity-60 u-font-medium">Mode</span>
2291
+ <span className="u-text-xs u-opacity-60 u-font-medium">Mode</span>
1727
2292
  <span
1728
- className="u-fs-sm u-font-bold u-text-white"
2293
+ className="u-text-sm u-font-bold u-text-white"
1729
2294
  style={{ textTransform: 'capitalize' }}
1730
2295
  >
1731
2296
  {selectedMode}
1732
2297
  </span>
1733
2298
  </div>
1734
2299
  <div className="u-flex u-flex-column u-gap-1">
1735
- <span className="u-fs-xs u-opacity-60 u-font-medium">Shader</span>
2300
+ <span className="u-text-xs u-opacity-60 u-font-medium">Shader</span>
1736
2301
  <span
1737
- className="u-fs-sm u-font-bold u-text-white"
2302
+ className="u-text-sm u-font-bold u-text-white"
1738
2303
  style={{ textTransform: 'capitalize' }}
1739
2304
  >
1740
2305
  {selectedShader}
1741
2306
  </span>
1742
2307
  </div>
1743
2308
  <div className="u-flex u-flex-column u-gap-1">
1744
- <span className="u-fs-xs u-opacity-60 u-font-medium">
2309
+ <span className="u-text-xs u-opacity-60 u-font-medium">
1745
2310
  Displacement
1746
2311
  </span>
1747
- <span className="u-fs-sm u-font-bold u-text-white">
2312
+ <span className="u-text-sm u-font-bold u-text-white">
1748
2313
  {settings.displacementScale}px
1749
2314
  </span>
1750
2315
  </div>
1751
2316
  <div className="u-flex u-flex-column u-gap-1">
1752
- <span className="u-fs-xs u-opacity-60 u-font-medium">
2317
+ <span className="u-text-xs u-opacity-60 u-font-medium">
1753
2318
  Aberration
1754
2319
  </span>
1755
- <span className="u-fs-sm u-font-bold u-text-white">
2320
+ <span className="u-text-sm u-font-bold u-text-white">
1756
2321
  {settings.aberrationIntensity.toFixed(1)}
1757
2322
  </span>
1758
2323
  </div>
1759
2324
  <div className="u-flex u-flex-column u-gap-1">
1760
- <span className="u-fs-xs u-opacity-60 u-font-medium">Blur</span>
1761
- <span className="u-fs-sm u-font-bold u-text-white">
2325
+ <span className="u-text-xs u-opacity-60 u-font-medium">Blur</span>
2326
+ <span className="u-text-sm u-font-bold u-text-white">
1762
2327
  {settings.blurAmount.toFixed(2)}
1763
2328
  </span>
1764
2329
  </div>
1765
2330
  <div className="u-flex u-flex-column u-gap-1">
1766
- <span className="u-fs-xs u-opacity-60 u-font-medium">
2331
+ <span className="u-text-xs u-opacity-60 u-font-medium">
1767
2332
  Elasticity
1768
2333
  </span>
1769
- <span className="u-fs-sm u-font-bold u-text-white">
2334
+ <span className="u-text-sm u-font-bold u-text-white">
1770
2335
  {settings.elasticity.toFixed(2)}
1771
2336
  </span>
1772
2337
  </div>
@@ -1783,14 +2348,14 @@ export const Playground: Story = {
1783
2348
  }}
1784
2349
  >
1785
2350
  <div
1786
- className="u-mb-3 u-font-bold u-fs-sm"
2351
+ className="u-mb-3 u-font-bold u-text-sm"
1787
2352
  style={{ color: '#7AFFD7', letterSpacing: '0.5px' }}
1788
2353
  >
1789
2354
  🎨 Visual Characteristics
1790
2355
  </div>
1791
2356
  <div className="u-flex u-flex-wrap u-gap-2">
1792
2357
  <div
1793
- className="u-px-3 u-py-1 u-rounded-pill u-fs-xs u-font-bold"
2358
+ className="u-px-3 u-py-1 u-rounded-pill u-text-xs u-font-bold"
1794
2359
  style={{
1795
2360
  background: settings.withLiquidBlur
1796
2361
  ? 'rgba(122, 255, 215, 0.15)'
@@ -1807,7 +2372,7 @@ export const Playground: Story = {
1807
2372
  {settings.withLiquidBlur ? '✓' : '○'} Liquid Blur
1808
2373
  </div>
1809
2374
  <div
1810
- className="u-px-3 u-py-1 u-rounded-pill u-fs-xs u-font-bold"
2375
+ className="u-px-3 u-py-1 u-rounded-pill u-text-xs u-font-bold"
1811
2376
  style={{
1812
2377
  background: settings.withBorder
1813
2378
  ? 'rgba(122, 255, 215, 0.15)'
@@ -1822,7 +2387,7 @@ export const Playground: Story = {
1822
2387
  {settings.withBorder ? '✓' : '○'} Border Effect
1823
2388
  </div>
1824
2389
  <div
1825
- className="u-px-3 u-py-1 u-rounded-pill u-fs-xs u-font-bold"
2390
+ className="u-px-3 u-py-1 u-rounded-pill u-text-xs u-font-bold"
1826
2391
  style={{
1827
2392
  background: settings.reducedMotion
1828
2393
  ? 'rgba(239, 68, 68, 0.15)'
@@ -1839,7 +2404,7 @@ export const Playground: Story = {
1839
2404
  {settings.reducedMotion ? '✓' : '○'} Reduced Motion
1840
2405
  </div>
1841
2406
  <div
1842
- className="u-px-3 u-py-1 u-rounded-pill u-fs-xs u-font-bold"
2407
+ className="u-px-3 u-py-1 u-rounded-pill u-text-xs u-font-bold"
1843
2408
  style={{
1844
2409
  background: settings.highContrast
1845
2410
  ? 'rgba(245, 158, 11, 0.15)'
@@ -1868,7 +2433,7 @@ export const Playground: Story = {
1868
2433
  }}
1869
2434
  >
1870
2435
  <div
1871
- className="u-mb-3 u-font-bold u-fs-sm"
2436
+ className="u-mb-3 u-font-bold u-text-sm"
1872
2437
  style={{ color: '#7AFFD7', letterSpacing: '0.5px' }}
1873
2438
  >
1874
2439
  📈 Quick Stats
@@ -1877,23 +2442,23 @@ export const Playground: Story = {
1877
2442
  className="u-grid u-gap-3"
1878
2443
  style={{ gridTemplateColumns: 'repeat(4, 1fr)' }}
1879
2444
  >
1880
- <div className="u-flex u-items-center u-fs-sm">
2445
+ <div className="u-flex u-items-center u-text-sm">
1881
2446
  <span className="u-opacity-60 u-font-medium">Saturation:</span>
1882
2447
  <span className="u-font-bold u-ml-2">{settings.saturation}%</span>
1883
2448
  </div>
1884
- <div className="u-flex u-items-center u-fs-sm">
2449
+ <div className="u-flex u-items-center u-text-sm">
1885
2450
  <span className="u-opacity-60 u-font-medium">Radius:</span>
1886
2451
  <span className="u-font-bold u-ml-2">
1887
2452
  {settings.borderRadius}px
1888
2453
  </span>
1889
2454
  </div>
1890
- <div className="u-flex u-items-center u-fs-sm">
2455
+ <div className="u-flex u-items-center u-text-sm">
1891
2456
  <span className="u-opacity-60 u-font-medium">Bg:</span>
1892
2457
  <span className="u-font-bold u-ml-2">
1893
2458
  {backgroundIndex + 1}/{backgrounds.length}
1894
2459
  </span>
1895
2460
  </div>
1896
- <div className="u-flex u-items-center u-fs-sm">
2461
+ <div className="u-flex u-items-center u-text-sm">
1897
2462
  <span className="u-opacity-60 u-font-medium">Effects:</span>
1898
2463
  <span className="u-font-bold u-ml-2">
1899
2464
  {settings.withoutEffects ? 'Off' : 'On'}