@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.
- package/atomix.config.ts +58 -1
- package/dist/atomix.css +148 -120
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +1 -1
- package/dist/atomix.min.css.map +1 -1
- package/dist/charts.d.ts +33 -0
- package/dist/charts.js +1227 -122
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +33 -10
- package/dist/core.js +1052 -41
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +33 -0
- package/dist/forms.js +2086 -1035
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +42 -1
- package/dist/heavy.js +1620 -600
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +441 -270
- package/dist/index.esm.js +1900 -638
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1935 -670
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +6 -3
- package/scripts/atomix-cli.js +148 -4
- package/scripts/cli/__tests__/basic.test.js +3 -2
- package/scripts/cli/__tests__/clean.test.js +278 -0
- package/scripts/cli/__tests__/component-validator.test.js +433 -0
- package/scripts/cli/__tests__/generator.test.js +613 -0
- package/scripts/cli/__tests__/glass-motion.test.js +256 -0
- package/scripts/cli/__tests__/integration.test.js +719 -108
- package/scripts/cli/__tests__/migrate.test.js +74 -0
- package/scripts/cli/__tests__/security.test.js +206 -0
- package/scripts/cli/__tests__/test-setup.js +3 -1
- package/scripts/cli/__tests__/theme-bridge.test.js +507 -0
- package/scripts/cli/__tests__/token-provider.test.js +361 -0
- package/scripts/cli/__tests__/utils.test.js +5 -5
- package/scripts/cli/commands/benchmark.js +105 -0
- package/scripts/cli/commands/build-theme.js +4 -1
- package/scripts/cli/commands/clean.js +109 -0
- package/scripts/cli/commands/doctor.js +88 -0
- package/scripts/cli/commands/generate.js +135 -14
- package/scripts/cli/commands/init.js +45 -18
- package/scripts/cli/commands/migrate.js +106 -0
- package/scripts/cli/commands/sync-tokens.js +206 -0
- package/scripts/cli/commands/theme-bridge.js +248 -0
- package/scripts/cli/commands/tokens.js +157 -0
- package/scripts/cli/commands/validate.js +194 -0
- package/scripts/cli/internal/ai-engine.js +156 -0
- package/scripts/cli/internal/component-validator.js +443 -0
- package/scripts/cli/internal/config-loader.js +162 -0
- package/scripts/cli/internal/filesystem.js +102 -2
- package/scripts/cli/internal/generator.js +359 -39
- package/scripts/cli/internal/glass-generator.js +398 -0
- package/scripts/cli/internal/hook-generator.js +369 -0
- package/scripts/cli/internal/hooks.js +61 -0
- package/scripts/cli/internal/itcss-generator.js +565 -0
- package/scripts/cli/internal/motion-generator.js +679 -0
- package/scripts/cli/internal/template-engine.js +301 -0
- package/scripts/cli/internal/theme-bridge.js +664 -0
- package/scripts/cli/internal/tokens/engine.js +122 -0
- package/scripts/cli/internal/tokens/provider.js +34 -0
- package/scripts/cli/internal/tokens/providers/figma.js +50 -0
- package/scripts/cli/internal/tokens/providers/style-dictionary.js +48 -0
- package/scripts/cli/internal/tokens/providers/w3c.js +48 -0
- package/scripts/cli/internal/tokens/token-provider.js +443 -0
- package/scripts/cli/internal/tokens/token-validator.js +513 -0
- package/scripts/cli/internal/validator.js +276 -0
- package/scripts/cli/internal/wizard.js +60 -6
- package/scripts/cli/mappings.js +23 -0
- package/scripts/cli/migration-tools.js +164 -94
- package/scripts/cli/plugins/style-dictionary.js +46 -0
- package/scripts/cli/templates/README.md +525 -95
- package/scripts/cli/templates/common-templates.js +40 -14
- package/scripts/cli/templates/components/react-component.ts +282 -0
- package/scripts/cli/templates/config/project-config.ts +112 -0
- package/scripts/cli/templates/hooks/use-component.ts +477 -0
- package/scripts/cli/templates/index.js +19 -4
- package/scripts/cli/templates/index.ts +171 -0
- package/scripts/cli/templates/next-templates.js +72 -0
- package/scripts/cli/templates/react-templates.js +70 -126
- package/scripts/cli/templates/scss-templates.js +35 -35
- package/scripts/cli/templates/stories/storybook-story.ts +241 -0
- package/scripts/cli/templates/styles/scss-component.ts +255 -0
- package/scripts/cli/templates/tests/vitest-test.ts +229 -0
- package/scripts/cli/templates/token-templates.js +337 -1
- package/scripts/cli/templates/tokens/token-generators.ts +1088 -0
- package/scripts/cli/templates/types/component-types.ts +145 -0
- package/scripts/cli/templates/utils/testing-utils.ts +144 -0
- package/scripts/cli/templates/vanilla-templates.js +39 -0
- package/scripts/cli/token-manager.js +8 -2
- package/scripts/cli/utils/cache-manager.js +240 -0
- package/scripts/cli/utils/detector.js +46 -0
- package/scripts/cli/utils/diagnostics.js +289 -0
- package/scripts/cli/utils/error.js +45 -3
- package/scripts/cli/utils/helpers.js +24 -0
- package/scripts/cli/utils/logger.js +1 -1
- package/scripts/cli/utils/security.js +302 -0
- package/scripts/cli/utils/telemetry.js +115 -0
- package/scripts/cli/utils/validation.js +4 -38
- package/scripts/cli/utils.js +46 -0
- package/src/components/Accordion/Accordion.stories.tsx +0 -18
- package/src/components/Accordion/Accordion.test.tsx +0 -17
- package/src/components/Accordion/Accordion.tsx +0 -4
- package/src/components/AtomixGlass/AtomixGlass.tsx +102 -2
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +125 -12
- package/src/components/AtomixGlass/PerformanceDashboard.tsx +219 -0
- package/src/components/AtomixGlass/README.md +25 -10
- package/src/components/AtomixGlass/animation-system.ts +578 -0
- package/src/components/AtomixGlass/shader-utils.ts +3 -0
- package/src/components/AtomixGlass/stories/AnimationFeatures.stories.tsx +653 -0
- package/src/components/AtomixGlass/stories/AnimationTests.stories.tsx +95 -0
- package/src/components/AtomixGlass/stories/CardExamples.stories.tsx +212 -0
- package/src/components/AtomixGlass/stories/DashboardExamples.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/EcommerceExamples.stories.tsx +410 -0
- package/src/components/AtomixGlass/stories/FormExamples.stories.tsx +436 -0
- package/src/components/AtomixGlass/stories/HeroExamples.stories.tsx +264 -0
- package/src/components/AtomixGlass/stories/InteractivePlayground.stories.tsx +247 -0
- package/src/components/AtomixGlass/stories/MobileUIExamples.stories.tsx +418 -0
- package/src/components/AtomixGlass/stories/ModalExamples.stories.tsx +402 -0
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +157 -6
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +658 -93
- package/src/components/AtomixGlass/stories/PresetGallery.stories.tsx +335 -0
- package/src/components/AtomixGlass/stories/WidgetExamples.stories.tsx +441 -0
- package/src/components/AtomixGlass/stories/argTypes.ts +384 -0
- package/src/components/AtomixGlass/stories/shared-components.tsx +91 -1
- package/src/components/AtomixGlass/stories/types.ts +127 -0
- package/src/components/Avatar/Avatar.tsx +1 -1
- package/src/components/Button/Button.stories.disabled-link.tsx +10 -0
- package/src/components/Button/Button.stories.tsx +10 -0
- package/src/components/Button/Button.test.tsx +16 -11
- package/src/components/Button/Button.tsx +4 -4
- package/src/components/Card/Card.tsx +1 -1
- package/src/components/Dropdown/Dropdown.tsx +12 -12
- package/src/components/Form/Select.tsx +62 -3
- package/src/components/Modal/Modal.tsx +14 -3
- package/src/components/Navigation/Navbar/Navbar.tsx +44 -0
- package/src/components/Slider/Slider.stories.tsx +3 -3
- package/src/components/Slider/Slider.tsx +38 -0
- package/src/components/Steps/Steps.tsx +3 -3
- package/src/components/Tabs/Tabs.tsx +77 -8
- package/src/components/Testimonial/Testimonial.tsx +1 -1
- package/src/components/TypedButton/TypedButton.stories.tsx +59 -0
- package/src/components/TypedButton/TypedButton.tsx +39 -0
- package/src/components/TypedButton/index.ts +2 -0
- package/src/components/VideoPlayer/VideoPlayer.tsx +11 -4
- package/src/lib/composables/index.ts +4 -7
- package/src/lib/composables/types.ts +45 -0
- package/src/lib/composables/useAccordion.ts +0 -7
- package/src/lib/composables/useAtomixGlass.ts +144 -5
- package/src/lib/composables/useChartExport.ts +3 -13
- package/src/lib/composables/useDropdown.ts +66 -0
- package/src/lib/composables/useFocusTrap.ts +80 -0
- package/src/lib/composables/usePerformanceMonitor.ts +448 -0
- package/src/lib/composables/useResponsiveGlass.presets.ts +192 -0
- package/src/lib/composables/useResponsiveGlass.ts +441 -0
- package/src/lib/composables/useTooltip.ts +16 -0
- package/src/lib/composables/useTypedButton.ts +66 -0
- package/src/lib/config/index.ts +62 -5
- package/src/lib/constants/components.ts +55 -0
- package/src/lib/theme/devtools/__tests__/useHistory.test.tsx +150 -0
- package/src/lib/theme/tokens/centralized-tokens.ts +120 -0
- package/src/lib/theme/utils/__tests__/domUtils.test.ts +101 -0
- package/src/lib/types/components.ts +37 -11
- package/src/lib/types/glass.ts +35 -0
- package/src/lib/types/index.ts +1 -0
- package/src/lib/utils/displacement-generator.ts +1 -1
- package/src/styles/01-settings/_settings.testtypecheck.scss +53 -0
- package/src/styles/01-settings/_settings.typedbutton.scss +53 -0
- package/src/styles/06-components/_components.testbutton.scss +212 -0
- package/src/styles/06-components/_components.testtypecheck.scss +212 -0
- package/src/styles/06-components/_components.typedbutton.scss +212 -0
- package/src/styles/99-utilities/_index.scss +1 -0
- package/src/styles/99-utilities/_utilities.text.scss +1 -1
- package/src/styles/99-utilities/_utilities.touch-target.scss +36 -0
- 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' | '
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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', '
|
|
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-
|
|
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-
|
|
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-
|
|
1009
|
+
<label className="u-text-xs u-font-medium u-opacity-80">
|
|
922
1010
|
{label}
|
|
923
1011
|
</label>
|
|
924
1012
|
<span
|
|
925
|
-
className="u-
|
|
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:
|
|
972
|
-
{controlTab === '
|
|
973
|
-
|
|
974
|
-
<div className="u-
|
|
975
|
-
<div
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
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
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
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-
|
|
1002
|
-
|
|
1199
|
+
<label className="u-text-xs u-font-medium u-opacity-80">
|
|
1200
|
+
Animation Speed
|
|
1003
1201
|
</label>
|
|
1004
1202
|
<span
|
|
1005
|
-
className="u-
|
|
1203
|
+
className="u-text-xs u-font-bold u-px-2 u-py-1 u-rounded"
|
|
1006
1204
|
style={{
|
|
1007
|
-
background: 'rgba(
|
|
1008
|
-
color: '#
|
|
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
|
-
{
|
|
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={
|
|
1022
|
-
step={
|
|
1023
|
-
value={
|
|
1219
|
+
max={3}
|
|
1220
|
+
step={0.1}
|
|
1221
|
+
value={settings.animationSpeed}
|
|
1024
1222
|
onChange={e =>
|
|
1025
1223
|
setSettings(prev => ({
|
|
1026
1224
|
...prev,
|
|
1027
|
-
|
|
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, #
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
2291
|
+
<span className="u-text-xs u-opacity-60 u-font-medium">Mode</span>
|
|
1727
2292
|
<span
|
|
1728
|
-
className="u-
|
|
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-
|
|
2300
|
+
<span className="u-text-xs u-opacity-60 u-font-medium">Shader</span>
|
|
1736
2301
|
<span
|
|
1737
|
-
className="u-
|
|
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-
|
|
2309
|
+
<span className="u-text-xs u-opacity-60 u-font-medium">
|
|
1745
2310
|
Displacement
|
|
1746
2311
|
</span>
|
|
1747
|
-
<span className="u-
|
|
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-
|
|
2317
|
+
<span className="u-text-xs u-opacity-60 u-font-medium">
|
|
1753
2318
|
Aberration
|
|
1754
2319
|
</span>
|
|
1755
|
-
<span className="u-
|
|
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-
|
|
1761
|
-
<span className="u-
|
|
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-
|
|
2331
|
+
<span className="u-text-xs u-opacity-60 u-font-medium">
|
|
1767
2332
|
Elasticity
|
|
1768
2333
|
</span>
|
|
1769
|
-
<span className="u-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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'}
|