@shohojdhara/atomix 0.2.2 → 0.2.4
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/dist/atomix.css +714 -646
- package/dist/atomix.min.css +5 -5
- package/dist/index.d.ts +794 -146
- package/dist/index.esm.js +12052 -6091
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +5133 -2674
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/themes/boomdevs.css +662 -594
- package/dist/themes/boomdevs.min.css +7 -7
- package/dist/themes/esrar.css +714 -646
- package/dist/themes/esrar.min.css +6 -6
- package/dist/themes/mashroom.css +707 -642
- package/dist/themes/mashroom.min.css +7 -7
- package/dist/themes/shaj-default.css +707 -642
- package/dist/themes/shaj-default.min.css +6 -6
- package/package.json +66 -15
- package/src/components/Accordion/Accordion.stories.tsx +800 -0
- package/src/components/Accordion/Accordion.tsx +33 -5
- package/src/components/AtomixGlass/AtomixGlass.stories.tsx +1230 -0
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +199 -0
- package/src/components/AtomixGlass/AtomixGlass.tsx +1343 -0
- package/src/components/AtomixGlass/README.md +134 -0
- package/src/components/AtomixGlass/index.ts +10 -0
- package/src/components/AtomixGlass/shader-utils.ts +696 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +5800 -0
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1065 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +1066 -0
- package/src/components/AtomixGlass/stories/ShaderVariants.stories.tsx +397 -0
- package/src/components/AtomixGlass/stories/shared-components.tsx +310 -0
- package/src/components/AtomixGlass/utils.ts +8 -0
- package/src/components/Badge/Badge.stories.tsx +170 -0
- package/src/components/Badge/Badge.tsx +31 -4
- package/src/components/Button/Button.stories.tsx +826 -0
- package/src/components/Button/Button.tsx +34 -3
- package/src/components/Button/README.md +216 -0
- package/src/components/Callout/Callout.stories.tsx +813 -78
- package/src/components/Callout/Callout.test.tsx +368 -0
- package/src/components/Callout/Callout.tsx +43 -6
- package/src/components/Callout/README.md +409 -0
- package/src/components/Card/Card.stories.tsx +699 -0
- package/src/components/Card/Card.tsx +19 -3
- package/src/components/DatePicker/DatePicker copy.tsx +551 -0
- package/src/components/DatePicker/DatePicker.stories.tsx +877 -1
- package/src/components/DatePicker/DatePicker.tsx +379 -332
- package/src/components/DatePicker/readme.md +110 -1
- package/src/components/DatePicker/types.ts +8 -0
- package/src/components/Dropdown/Dropdown.stories.tsx +145 -0
- package/src/components/Dropdown/Dropdown.tsx +34 -5
- package/src/components/EdgePanel/EdgePanel.stories.tsx +476 -3
- package/src/components/EdgePanel/EdgePanel.tsx +86 -13
- package/src/components/Form/Checkbox.stories.tsx +101 -0
- package/src/components/Form/Checkbox.tsx +26 -2
- package/src/components/Form/Input.stories.tsx +124 -0
- package/src/components/Form/Input.tsx +36 -7
- package/src/components/Form/Radio.stories.tsx +139 -0
- package/src/components/Form/Radio.tsx +26 -2
- package/src/components/Form/Select.stories.tsx +110 -0
- package/src/components/Form/Select.tsx +26 -2
- package/src/components/Form/Textarea.stories.tsx +104 -0
- package/src/components/Form/Textarea.tsx +36 -7
- package/src/components/Hero/Hero.stories.tsx +54 -1
- package/src/components/Hero/Hero.tsx +70 -11
- package/src/components/Messages/Messages.stories.tsx +113 -0
- package/src/components/Messages/Messages.tsx +51 -9
- package/src/components/Modal/Modal.stories.tsx +237 -0
- package/src/components/Modal/Modal.tsx +63 -35
- package/src/components/Navigation/Nav/Nav.stories.tsx +469 -0
- package/src/components/Navigation/Nav/Nav.tsx +17 -4
- package/src/components/Navigation/Navbar/Navbar.stories.tsx +413 -0
- package/src/components/Navigation/Navbar/Navbar.tsx +66 -28
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +340 -0
- package/src/components/Navigation/SideMenu/SideMenu.tsx +28 -2
- package/src/components/Pagination/Pagination.stories.tsx +101 -0
- package/src/components/Pagination/Pagination.tsx +25 -1
- package/src/components/Popover/Popover.stories.tsx +94 -0
- package/src/components/Popover/Popover.tsx +30 -4
- package/src/components/Progress/Progress.tsx +17 -2
- package/src/components/Rating/Rating.stories.tsx +112 -0
- package/src/components/Rating/Rating.tsx +25 -1
- package/src/components/Spinner/Spinner.tsx +17 -2
- package/src/components/Steps/Steps.stories.tsx +119 -0
- package/src/components/Steps/Steps.tsx +32 -1
- package/src/components/Tab/Tab.stories.tsx +88 -0
- package/src/components/Tab/Tab.tsx +32 -1
- package/src/components/Toggle/Toggle.stories.tsx +92 -0
- package/src/components/Toggle/Toggle.tsx +32 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +131 -0
- package/src/components/Tooltip/Tooltip.tsx +43 -7
- package/src/components/VideoPlayer/VideoPlayer.stories.tsx +1002 -196
- package/src/components/VideoPlayer/VideoPlayer.tsx +161 -4
- package/src/components/index.ts +1 -0
- package/src/lib/composables/index.ts +4 -0
- package/src/lib/composables/useAtomixGlass.ts +71 -0
- package/src/lib/composables/useBarChart.ts +14 -4
- package/src/lib/composables/useButton.ts +3 -1
- package/src/lib/composables/useCallout.ts +4 -1
- package/src/lib/composables/useChart.ts +223 -370
- package/src/lib/composables/useChartToolbar.ts +11 -20
- package/src/lib/composables/useEdgePanel.ts +81 -35
- package/src/lib/composables/useGlassContainer.ts +168 -0
- package/src/lib/composables/useLineChart.ts +4 -2
- package/src/lib/composables/usePieChart.ts +4 -14
- package/src/lib/constants/components.ts +89 -0
- package/src/lib/types/components.ts +448 -14
- package/src/lib/utils/displacement-generator.ts +86 -0
- package/src/styles/01-settings/_settings.background.scss +8 -7
- package/src/styles/01-settings/_settings.callout.scss +7 -7
- package/src/styles/01-settings/_settings.edge-panel.scss +1 -1
- package/src/styles/02-tools/_tools.animations.scss +19 -0
- package/src/styles/02-tools/_tools.background.scss +19 -17
- package/src/styles/02-tools/_tools.glass.scss +1 -0
- package/src/styles/02-tools/_tools.utility-api.scss +62 -27
- package/src/styles/03-generic/_generic.root.scss +3 -2
- package/src/styles/04-elements/_elements.body.scss +0 -18
- package/src/styles/06-components/_components.accordion.scss +16 -0
- package/src/styles/06-components/_components.atomix-glass.scss +72 -0
- package/src/styles/06-components/_components.badge.scss +21 -0
- package/src/styles/06-components/_components.button.scss +10 -0
- package/src/styles/06-components/_components.callout.scss +46 -2
- package/src/styles/06-components/_components.card.scss +17 -0
- package/src/styles/06-components/_components.chart.scss +1 -1
- package/src/styles/06-components/_components.datepicker.scss +18 -0
- package/src/styles/06-components/_components.dropdown.scss +7 -1
- package/src/styles/06-components/_components.edge-panel.scss +101 -0
- package/src/styles/06-components/_components.hero.scss +1 -2
- package/src/styles/06-components/_components.input.scss +31 -1
- package/src/styles/06-components/_components.messages.scss +176 -0
- package/src/styles/06-components/_components.modal.scss +13 -3
- package/src/styles/06-components/_components.navbar.scss +12 -1
- package/src/styles/06-components/_components.side-menu.scss +5 -0
- package/src/styles/06-components/_components.video-player.scss +48 -26
- package/src/styles/06-components/_index.scss +1 -0
- package/src/styles/99-utilities/_index.scss +1 -0
- package/src/styles/99-utilities/_utilities.glass-fixes.scss +49 -0
- package/src/styles/99-utilities/_utilities.opacity.scss +1 -1
- package/dist/themes/yabai.css +0 -15207
- package/dist/themes/yabai.min.css +0 -189
|
@@ -0,0 +1,1230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AtomixGlass.stories.tsx
|
|
3
|
+
*
|
|
4
|
+
* This file contains comprehensive Storybook stories for the AtomixGlass component, showcasing
|
|
5
|
+
* various use cases, configurations, and best practices. The stories demonstrate
|
|
6
|
+
* the component's versatility and provide examples for developers to reference.
|
|
7
|
+
*\
|
|
8
|
+
* @package Atomix
|
|
9
|
+
* @component AtomixGlass
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
13
|
+
import AtomixGlass from './AtomixGlass';
|
|
14
|
+
import Button from '../Button/Button';
|
|
15
|
+
import { useState, useEffect, useCallback, useMemo, useRef } from 'react';
|
|
16
|
+
import React from 'react';
|
|
17
|
+
import type { RefObject } from 'react';
|
|
18
|
+
import { BoxArrowDownIcon } from '@phosphor-icons/react';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Storybook meta configuration for AtomixGlass component
|
|
22
|
+
*
|
|
23
|
+
* This defines the component's metadata, documentation, and controls
|
|
24
|
+
* for the Storybook interface.
|
|
25
|
+
*/
|
|
26
|
+
const meta: Meta<typeof AtomixGlass> = {
|
|
27
|
+
title: 'Components/AtomixGlass',
|
|
28
|
+
component: AtomixGlass,
|
|
29
|
+
parameters: {
|
|
30
|
+
layout: 'centered',
|
|
31
|
+
docs: {
|
|
32
|
+
description: {
|
|
33
|
+
component:
|
|
34
|
+
'A glass-like component with chromatic aberration and displacement effects. The component provides a modern, frosted glass aesthetic with interactive hover effects. This component is ideal for creating modern UI elements with depth and visual interest.',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
tags: ['autodocs'],
|
|
39
|
+
argTypes: {
|
|
40
|
+
children: {
|
|
41
|
+
control: 'text',
|
|
42
|
+
description: 'Content to display inside the glass effect',
|
|
43
|
+
},
|
|
44
|
+
displacementScale: {
|
|
45
|
+
control: { type: 'range', min: 0, max: 100, step: 1 },
|
|
46
|
+
description: 'Displacement scale for the glass effect (default: 70)',
|
|
47
|
+
table: { defaultValue: { summary: '70' } },
|
|
48
|
+
},
|
|
49
|
+
blurAmount: {
|
|
50
|
+
control: { type: 'range', min: 0, max: 10, step: 0.5 },
|
|
51
|
+
description: 'Blur amount for the backdrop (default: 0.0625)',
|
|
52
|
+
table: { defaultValue: { summary: '0.0625' } },
|
|
53
|
+
},
|
|
54
|
+
saturation: {
|
|
55
|
+
control: { type: 'range', min: 100, max: 300, step: 5 },
|
|
56
|
+
description: 'Saturation percentage for the backdrop (default: 140)',
|
|
57
|
+
table: { defaultValue: { summary: '140' } },
|
|
58
|
+
},
|
|
59
|
+
aberrationIntensity: {
|
|
60
|
+
control: { type: 'range', min: 0, max: 10, step: 0.1 },
|
|
61
|
+
description: 'Chromatic aberration intensity (default: 2)',
|
|
62
|
+
table: { defaultValue: { summary: '2' } },
|
|
63
|
+
},
|
|
64
|
+
elasticity: {
|
|
65
|
+
control: { type: 'range', min: 0, max: 1, step: 0.01 },
|
|
66
|
+
description: 'Elasticity factor for mouse interactions (default: 0.15)',
|
|
67
|
+
table: { defaultValue: { summary: '0.15' } },
|
|
68
|
+
},
|
|
69
|
+
cornerRadius: {
|
|
70
|
+
control: { type: 'range', min: 0, max: 50, step: 1 },
|
|
71
|
+
description: 'Corner radius in pixels (default: 20)',
|
|
72
|
+
table: { defaultValue: { summary: '20' } },
|
|
73
|
+
},
|
|
74
|
+
globalMousePosition: {
|
|
75
|
+
control: 'object',
|
|
76
|
+
description: 'External global mouse position { x: number; y: number }',
|
|
77
|
+
},
|
|
78
|
+
mouseOffset: {
|
|
79
|
+
control: 'object',
|
|
80
|
+
description: 'External mouse offset { x: number; y: number }',
|
|
81
|
+
},
|
|
82
|
+
mouseContainer: {
|
|
83
|
+
control: false,
|
|
84
|
+
description: 'React ref object for mouse container element',
|
|
85
|
+
},
|
|
86
|
+
padding: {
|
|
87
|
+
control: 'text',
|
|
88
|
+
description: 'Padding for the glass container (default: "0 0")',
|
|
89
|
+
table: { defaultValue: { summary: '"0 0"' } },
|
|
90
|
+
},
|
|
91
|
+
overLight: {
|
|
92
|
+
control: 'boolean',
|
|
93
|
+
description: 'Whether the glass is over a light background (default: false)',
|
|
94
|
+
table: { defaultValue: { summary: 'false' } },
|
|
95
|
+
},
|
|
96
|
+
mode: {
|
|
97
|
+
control: 'select',
|
|
98
|
+
options: ['standard', 'polar', 'prominent', 'shader'],
|
|
99
|
+
description: 'Glass effect mode (default: "standard")',
|
|
100
|
+
table: { defaultValue: { summary: '"standard"' } },
|
|
101
|
+
},
|
|
102
|
+
onClick: {
|
|
103
|
+
action: 'clicked',
|
|
104
|
+
description: 'Click event handler',
|
|
105
|
+
},
|
|
106
|
+
className: {
|
|
107
|
+
control: 'text',
|
|
108
|
+
description: 'Additional CSS class names',
|
|
109
|
+
},
|
|
110
|
+
style: {
|
|
111
|
+
control: 'object',
|
|
112
|
+
description: 'CSS style object',
|
|
113
|
+
},
|
|
114
|
+
'aria-label': {
|
|
115
|
+
control: 'text',
|
|
116
|
+
description: 'ARIA label for accessibility',
|
|
117
|
+
},
|
|
118
|
+
'aria-describedby': {
|
|
119
|
+
control: 'text',
|
|
120
|
+
description: 'ARIA describedby attribute for accessibility',
|
|
121
|
+
},
|
|
122
|
+
role: {
|
|
123
|
+
control: 'text',
|
|
124
|
+
description: 'ARIA role attribute',
|
|
125
|
+
},
|
|
126
|
+
tabIndex: {
|
|
127
|
+
control: 'number',
|
|
128
|
+
description: 'Tab index for keyboard navigation',
|
|
129
|
+
},
|
|
130
|
+
reducedMotion: {
|
|
131
|
+
control: 'boolean',
|
|
132
|
+
description: 'Override for reduced motion preference (default: false)',
|
|
133
|
+
table: { defaultValue: { summary: 'false' } },
|
|
134
|
+
},
|
|
135
|
+
highContrast: {
|
|
136
|
+
control: 'boolean',
|
|
137
|
+
description: 'Override for high contrast preference (default: false)',
|
|
138
|
+
table: { defaultValue: { summary: 'false' } },
|
|
139
|
+
},
|
|
140
|
+
disableEffects: {
|
|
141
|
+
control: 'boolean',
|
|
142
|
+
description: 'Disable all visual effects (default: false)',
|
|
143
|
+
table: { defaultValue: { summary: 'false' } },
|
|
144
|
+
},
|
|
145
|
+
enablePerformanceMonitoring: {
|
|
146
|
+
control: 'boolean',
|
|
147
|
+
description: 'Enable performance monitoring (default: false)',
|
|
148
|
+
table: { defaultValue: { summary: 'false' } },
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export default meta;
|
|
154
|
+
type Story = StoryObj<typeof AtomixGlass>;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Enhanced BackgroundWrapper Component
|
|
158
|
+
*
|
|
159
|
+
* A utility component used throughout the stories to provide consistent background
|
|
160
|
+
* styling and overlay effects. This wrapper creates a visually appealing container
|
|
161
|
+
* for showcasing the AtomixGlass component in various scenarios.
|
|
162
|
+
*
|
|
163
|
+
* @component BackgroundWrapper
|
|
164
|
+
*/
|
|
165
|
+
interface BackgroundWrapperProps {
|
|
166
|
+
/** Child elements to render inside the wrapper */
|
|
167
|
+
children: React.ReactNode;
|
|
168
|
+
/** Background image URL or index from the backgroundImages array */
|
|
169
|
+
backgroundImage?: string;
|
|
170
|
+
/** Background index to use from the predefined array */
|
|
171
|
+
backgroundIndex?: number;
|
|
172
|
+
/** Optional overlay flag for quick overlay application */
|
|
173
|
+
overlay?: boolean;
|
|
174
|
+
/** Custom overlay color in CSS format */
|
|
175
|
+
overlayColor?: string;
|
|
176
|
+
/** Overlay opacity (0-1) */
|
|
177
|
+
overlayOpacity?: number;
|
|
178
|
+
/** Container height */
|
|
179
|
+
height?: string;
|
|
180
|
+
/** Container width */
|
|
181
|
+
width?: string;
|
|
182
|
+
/** Container border radius */
|
|
183
|
+
borderRadius?: string;
|
|
184
|
+
/** Container padding */
|
|
185
|
+
padding?: string;
|
|
186
|
+
/** Additional CSS class names */
|
|
187
|
+
className?: string;
|
|
188
|
+
/** Additional inline styles */
|
|
189
|
+
style?: React.CSSProperties;
|
|
190
|
+
/** Enable interactive background movement */
|
|
191
|
+
interactive?: boolean;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Interactive Story Container
|
|
196
|
+
*
|
|
197
|
+
* A container that provides mouse tracking and interactive background effects
|
|
198
|
+
* for enhanced storytelling and demonstration purposes.
|
|
199
|
+
*/
|
|
200
|
+
interface StoryContainerProps {
|
|
201
|
+
children: React.ReactNode;
|
|
202
|
+
style?: React.CSSProperties;
|
|
203
|
+
interactive?: boolean;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Interactive Wrapper Component
|
|
208
|
+
*
|
|
209
|
+
* Provides mouse position tracking and offset calculations for interactive stories
|
|
210
|
+
*/
|
|
211
|
+
interface InteractiveWrapperProps {
|
|
212
|
+
children: (
|
|
213
|
+
mousePos: { x: number; y: number },
|
|
214
|
+
mouseOffset: { x: number; y: number },
|
|
215
|
+
containerRef: RefObject<HTMLDivElement>
|
|
216
|
+
) => React.ReactNode;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* BackgroundWrapper Component Implementation
|
|
221
|
+
*
|
|
222
|
+
* Renders a container with a background image and optional overlay,
|
|
223
|
+
* providing a consistent environment for showcasing the AtomixGlass component.
|
|
224
|
+
*
|
|
225
|
+
* @param props - BackgroundWrapperProps
|
|
226
|
+
* @returns JSX.Element
|
|
227
|
+
*/
|
|
228
|
+
const BackgroundWrapper = ({
|
|
229
|
+
children,
|
|
230
|
+
backgroundImage,
|
|
231
|
+
backgroundIndex,
|
|
232
|
+
overlay = false,
|
|
233
|
+
overlayColor = 'rgba(0,0,0,0)',
|
|
234
|
+
overlayOpacity = 0,
|
|
235
|
+
height = '90vh',
|
|
236
|
+
width = '90vw',
|
|
237
|
+
borderRadius = '12px',
|
|
238
|
+
padding = '24px',
|
|
239
|
+
className = '',
|
|
240
|
+
style = {},
|
|
241
|
+
}: BackgroundWrapperProps) => {
|
|
242
|
+
// If backgroundIndex is provided, use it to select from the backgroundImages array
|
|
243
|
+
const bgImage =
|
|
244
|
+
backgroundIndex !== undefined ? backgroundImages[backgroundIndex] : backgroundImage;
|
|
245
|
+
|
|
246
|
+
// Apply default overlay settings if overlay flag is true using nullish coalescing
|
|
247
|
+
const finalOverlayColor = overlay ? 'rgba(0,0,0,0.5)' : (overlayColor ?? 'rgba(0,0,0,0)');
|
|
248
|
+
const finalOverlayOpacity = overlay ? 0.5 : (overlayOpacity ?? 0);
|
|
249
|
+
|
|
250
|
+
return (
|
|
251
|
+
<div
|
|
252
|
+
className={`atomix-glass-background ${className}`}
|
|
253
|
+
style={{
|
|
254
|
+
position: 'relative',
|
|
255
|
+
width: width,
|
|
256
|
+
minHeight: height,
|
|
257
|
+
height: '100%',
|
|
258
|
+
backgroundColor: !bgImage ? '#1a1a2e' : undefined, // Fallback color if no image
|
|
259
|
+
background: bgImage
|
|
260
|
+
? `url(${bgImage}) ${finalOverlayOpacity && ',' + finalOverlayColor}`
|
|
261
|
+
: undefined,
|
|
262
|
+
backgroundSize: 'cover',
|
|
263
|
+
backgroundPosition: 'center',
|
|
264
|
+
backgroundAttachment: 'fixed',
|
|
265
|
+
display: 'flex',
|
|
266
|
+
alignItems: 'center',
|
|
267
|
+
justifyContent: 'center',
|
|
268
|
+
borderRadius: borderRadius,
|
|
269
|
+
padding: padding,
|
|
270
|
+
...style,
|
|
271
|
+
}}
|
|
272
|
+
>
|
|
273
|
+
{/* Overlay for better contrast and visual appeal */}
|
|
274
|
+
{finalOverlayOpacity > 0 && (
|
|
275
|
+
<div
|
|
276
|
+
style={{
|
|
277
|
+
position: 'absolute',
|
|
278
|
+
top: 0,
|
|
279
|
+
left: 0,
|
|
280
|
+
right: 0,
|
|
281
|
+
bottom: 0,
|
|
282
|
+
backgroundColor: finalOverlayColor,
|
|
283
|
+
opacity: finalOverlayOpacity,
|
|
284
|
+
}}
|
|
285
|
+
/>
|
|
286
|
+
)}
|
|
287
|
+
<div
|
|
288
|
+
style={{
|
|
289
|
+
position: 'relative',
|
|
290
|
+
width: '100%',
|
|
291
|
+
height: '100%',
|
|
292
|
+
display: 'flex',
|
|
293
|
+
alignItems: 'center',
|
|
294
|
+
justifyContent: 'center',
|
|
295
|
+
color: 'white',
|
|
296
|
+
}}
|
|
297
|
+
>
|
|
298
|
+
{children}
|
|
299
|
+
</div>
|
|
300
|
+
</div>
|
|
301
|
+
);
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Interactive Story Container Component
|
|
306
|
+
*
|
|
307
|
+
* A container that provides mouse tracking and interactive background effects
|
|
308
|
+
* for enhanced storytelling and demonstration purposes.
|
|
309
|
+
*/
|
|
310
|
+
const StoryContainer = ({ children, style = {}, interactive = false }: StoryContainerProps) => {
|
|
311
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
312
|
+
const [backgroundPosition, setBackgroundPosition] = useState({ x: 0, y: 0 });
|
|
313
|
+
|
|
314
|
+
const handleMouseMove = useCallback(
|
|
315
|
+
(e: MouseEvent) => {
|
|
316
|
+
if (containerRef.current && interactive) {
|
|
317
|
+
const rect = containerRef.current.getBoundingClientRect();
|
|
318
|
+
const centerX = rect.left + rect.width / 2;
|
|
319
|
+
const centerY = rect.top + rect.height / 2;
|
|
320
|
+
|
|
321
|
+
// Calculate offset as a percentage
|
|
322
|
+
const offsetX = ((e.clientX - centerX) / rect.width) * 100;
|
|
323
|
+
const offsetY = ((e.clientY - centerY) / rect.height) * 100;
|
|
324
|
+
|
|
325
|
+
setBackgroundPosition({ x: offsetX, y: offsetY });
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
[interactive]
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
useEffect(() => {
|
|
332
|
+
const currentRef = containerRef.current;
|
|
333
|
+
if (currentRef && interactive) {
|
|
334
|
+
currentRef.addEventListener('mousemove', handleMouseMove);
|
|
335
|
+
return () => {
|
|
336
|
+
currentRef.removeEventListener('mousemove', handleMouseMove);
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
}, [handleMouseMove, interactive]);
|
|
340
|
+
|
|
341
|
+
return (
|
|
342
|
+
<div
|
|
343
|
+
ref={containerRef}
|
|
344
|
+
style={{
|
|
345
|
+
width: '100vw',
|
|
346
|
+
height: '100vh',
|
|
347
|
+
display: 'flex',
|
|
348
|
+
alignItems: 'center',
|
|
349
|
+
justifyContent: 'center',
|
|
350
|
+
backgroundImage: interactive
|
|
351
|
+
? 'url(https://images.unsplash.com/photo-1497366216548-37526070297c?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D)'
|
|
352
|
+
: undefined,
|
|
353
|
+
backgroundSize: interactive ? '160%' : 'cover',
|
|
354
|
+
backgroundPosition: interactive
|
|
355
|
+
? `calc(50% + ${backgroundPosition.x}px) calc(50% + ${backgroundPosition.y}px)`
|
|
356
|
+
: 'center',
|
|
357
|
+
...style,
|
|
358
|
+
}}
|
|
359
|
+
>
|
|
360
|
+
{children}
|
|
361
|
+
</div>
|
|
362
|
+
);
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Interactive Wrapper Component
|
|
367
|
+
*
|
|
368
|
+
* Provides mouse position tracking and offset calculations for interactive stories
|
|
369
|
+
*/
|
|
370
|
+
const InteractiveWrapper = ({ children }: InteractiveWrapperProps) => {
|
|
371
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
372
|
+
const [mousePos, setMousePos] = useState({ x: 0, y: 0 });
|
|
373
|
+
const [mouseOffset, setMouseOffset] = useState({ x: 0, y: 0 });
|
|
374
|
+
|
|
375
|
+
const handleMouseMove = useCallback((e: MouseEvent) => {
|
|
376
|
+
if (containerRef.current) {
|
|
377
|
+
const rect = containerRef.current.getBoundingClientRect();
|
|
378
|
+
const centerX = rect.left + rect.width / 2;
|
|
379
|
+
const centerY = rect.top + rect.height / 2;
|
|
380
|
+
|
|
381
|
+
setMouseOffset({
|
|
382
|
+
x: ((e.clientX - centerX) / rect.width) * 100,
|
|
383
|
+
y: ((e.clientY - centerY) / rect.height) * 100,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
setMousePos({ x: e.clientX, y: e.clientY });
|
|
387
|
+
}, []);
|
|
388
|
+
|
|
389
|
+
useEffect(() => {
|
|
390
|
+
const currentRef = containerRef.current;
|
|
391
|
+
currentRef?.addEventListener('mousemove', handleMouseMove);
|
|
392
|
+
return () => {
|
|
393
|
+
currentRef?.removeEventListener('mousemove', handleMouseMove);
|
|
394
|
+
};
|
|
395
|
+
}, [handleMouseMove]);
|
|
396
|
+
|
|
397
|
+
return (
|
|
398
|
+
<div ref={containerRef} style={{ width: '100%', height: '100%' }}>
|
|
399
|
+
{children(mousePos, mouseOffset, containerRef)}
|
|
400
|
+
</div>
|
|
401
|
+
);
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Collection of high-quality background images for different moods and scenarios
|
|
406
|
+
*
|
|
407
|
+
* This array provides a variety of background options that work well with the
|
|
408
|
+
* AtomixGlass component, showcasing different visual styles and contexts.
|
|
409
|
+
*/
|
|
410
|
+
const backgroundImages = [
|
|
411
|
+
// 0: Modern office interior with natural lighting
|
|
412
|
+
'https://images.unsplash.com/photo-1637825891028-564f672aa42c?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=2670',
|
|
413
|
+
// 1: Beautiful natural landscape - mountains and lake
|
|
414
|
+
'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
415
|
+
// 2: Urban cityscape with modern buildings
|
|
416
|
+
'https://images.unsplash.com/photo-1519681393784-d120267933ba?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=2670',
|
|
417
|
+
// 3: Forest path with sunlight filtering through trees
|
|
418
|
+
'https://images.unsplash.com/photo-1441974231531-c6227db76b6e?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
419
|
+
// 4: Ocean waves and beach scene
|
|
420
|
+
'https://images.unsplash.com/photo-1505142468610-359e7d316be0?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
421
|
+
// 5: Modern architecture with glass facades
|
|
422
|
+
'https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
423
|
+
// 6: Cozy café interior with warm lighting
|
|
424
|
+
'https://images.unsplash.com/photo-1554118811-1e0d58224f24?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
425
|
+
// 7: Desert landscape with dramatic sky
|
|
426
|
+
'https://images.unsplash.com/photo-1509316785289-025f5b846b35?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
427
|
+
// 8: Tropical paradise with palm trees and ocean
|
|
428
|
+
'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
429
|
+
// 9: Modern library or workspace with natural light
|
|
430
|
+
'https://images.unsplash.com/photo-1521587760476-6c12a4b040da?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
431
|
+
];
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Legacy backgrounds object for backward compatibility
|
|
435
|
+
* @deprecated Use backgroundImages array instead
|
|
436
|
+
*/
|
|
437
|
+
const backgrounds = {
|
|
438
|
+
// Office and workspace environments
|
|
439
|
+
blueGradient: backgroundImages[0], // Modern office interior
|
|
440
|
+
purpleGradient: backgroundImages[1], // Mountain landscape
|
|
441
|
+
greenGradient: backgroundImages[3], // Forest path
|
|
442
|
+
|
|
443
|
+
// Apple-inspired natural scenes
|
|
444
|
+
macosWallpaper: backgroundImages[1], // Mountain landscape
|
|
445
|
+
iosWallpaper: backgroundImages[4], // Ocean waves
|
|
446
|
+
|
|
447
|
+
// Nature scenes
|
|
448
|
+
mountains: backgroundImages[1], // Mountain landscape
|
|
449
|
+
ocean: backgroundImages[4], // Ocean waves
|
|
450
|
+
|
|
451
|
+
// Urban environments
|
|
452
|
+
cityNight: backgroundImages[2], // Urban cityscape
|
|
453
|
+
cityDay: backgroundImages[5], // Modern architecture
|
|
454
|
+
|
|
455
|
+
// Interior spaces
|
|
456
|
+
abstract1: backgroundImages[6], // Cozy café interior
|
|
457
|
+
abstract2: backgroundImages[9], // Modern library
|
|
458
|
+
|
|
459
|
+
// Video backgrounds
|
|
460
|
+
videoBackground:
|
|
461
|
+
'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4',
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Default showcase of the AtomixGlass component
|
|
466
|
+
*
|
|
467
|
+
* This story demonstrates the default configuration of the AtomixGlass component
|
|
468
|
+
* with carefully selected parameters to achieve an optimal glass effect. It serves
|
|
469
|
+
* as a reference implementation with balanced settings suitable for most use cases.
|
|
470
|
+
*
|
|
471
|
+
* Key features demonstrated:
|
|
472
|
+
* - Balanced displacement scale for subtle distortion
|
|
473
|
+
* - Moderate blur amount for the frosted glass effect
|
|
474
|
+
* - Enhanced saturation for visual appeal
|
|
475
|
+
* - Subtle chromatic aberration for depth
|
|
476
|
+
* - Interactive hover effects for engagement
|
|
477
|
+
*/
|
|
478
|
+
export const Default: Story = {
|
|
479
|
+
args: {
|
|
480
|
+
children: (
|
|
481
|
+
<div style={{ padding: '30px', textAlign: 'center', maxWidth: '400px' }}>
|
|
482
|
+
<h2 style={{ margin: '0 0 16px 0', fontSize: '24px', fontWeight: 600 }}>AtomixGlass</h2>
|
|
483
|
+
<p style={{ margin: '0 0 20px 0', fontSize: '16px', lineHeight: 1.6 }}>
|
|
484
|
+
A premium glass morphism component with realistic light refraction, chromatic aberration,
|
|
485
|
+
and interactive effects.
|
|
486
|
+
</p>
|
|
487
|
+
<div style={{ display: 'flex', justifyContent: 'center', gap: '12px', flexWrap: 'wrap' }}>
|
|
488
|
+
<Button variant="primary" glass>Explore</Button>
|
|
489
|
+
<Button variant="outline-primary" glass>Learn More</Button>
|
|
490
|
+
</div>
|
|
491
|
+
</div>
|
|
492
|
+
),
|
|
493
|
+
},
|
|
494
|
+
decorators: [
|
|
495
|
+
Story => (
|
|
496
|
+
<BackgroundWrapper
|
|
497
|
+
backgroundImage={backgroundImages[0]}
|
|
498
|
+
>
|
|
499
|
+
<Story />
|
|
500
|
+
</BackgroundWrapper>
|
|
501
|
+
),
|
|
502
|
+
],
|
|
503
|
+
parameters: {
|
|
504
|
+
docs: {
|
|
505
|
+
description: {
|
|
506
|
+
story:
|
|
507
|
+
'The default configuration of AtomixGlass with optimal parameters for a realistic glass effect. This component mimics the Apple-style liquid glass UI with chromatic aberration and displacement effects.',
|
|
508
|
+
},
|
|
509
|
+
},
|
|
510
|
+
},
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Mode Showcase - Demonstrates the visual differences between the various modes
|
|
515
|
+
*
|
|
516
|
+
* This story showcases all available modes of the AtomixGlass component with
|
|
517
|
+
* optimized settings for each mode to highlight their unique characteristics.
|
|
518
|
+
*/
|
|
519
|
+
/**
|
|
520
|
+
* Modes Story
|
|
521
|
+
*
|
|
522
|
+
* This story demonstrates the different modes available in the AtomixGlass component.
|
|
523
|
+
* Each mode provides a unique visual effect with different displacement patterns,
|
|
524
|
+
* blur amounts, and aberration intensities. This showcase allows users to compare
|
|
525
|
+
* the different modes side by side and understand their visual characteristics.
|
|
526
|
+
*
|
|
527
|
+
* Modes demonstrated:
|
|
528
|
+
* - standard: Balanced displacement and aberration
|
|
529
|
+
* - polar: Circular refraction pattern
|
|
530
|
+
* - prominent: Enhanced displacement with stronger edge effects
|
|
531
|
+
* - shader: Advanced shader-based displacement for maximum visual impact
|
|
532
|
+
*/
|
|
533
|
+
export const Modes: Story = {
|
|
534
|
+
parameters: {
|
|
535
|
+
docs: {
|
|
536
|
+
description: {
|
|
537
|
+
story:
|
|
538
|
+
'Showcases the different modes available in the AtomixGlass component, highlighting their unique visual characteristics.',
|
|
539
|
+
},
|
|
540
|
+
},
|
|
541
|
+
},
|
|
542
|
+
render: () => {
|
|
543
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
544
|
+
const [activeMode, setActiveMode] = useState<string | null>(null);
|
|
545
|
+
const modes = ['standard', 'polar', 'prominent', 'shader'] as const;
|
|
546
|
+
|
|
547
|
+
// Different settings for each mode to highlight their unique characteristics
|
|
548
|
+
const modeSettings = {
|
|
549
|
+
standard: {
|
|
550
|
+
displacementScale: 150,
|
|
551
|
+
blurAmount: 0,
|
|
552
|
+
shaderVariant: 'premiumGlass',
|
|
553
|
+
saturation: 140,
|
|
554
|
+
aberrationIntensity: 'default',
|
|
555
|
+
description: 'Standard glass effect with balanced displacement and aberration',
|
|
556
|
+
color: '#ffffff',
|
|
557
|
+
},
|
|
558
|
+
polar: {
|
|
559
|
+
displacementScale: 120,
|
|
560
|
+
blurAmount: 0,
|
|
561
|
+
shaderVariant: 'premiumGlass',
|
|
562
|
+
saturation: 140,
|
|
563
|
+
aberrationIntensity: 'default',
|
|
564
|
+
description: 'Polar displacement creates a circular refraction pattern',
|
|
565
|
+
color: '#f0f8ff',
|
|
566
|
+
},
|
|
567
|
+
prominent: {
|
|
568
|
+
shaderVariant: 'premiumGlass',
|
|
569
|
+
displacementScale: 100,
|
|
570
|
+
blurAmount: 0,
|
|
571
|
+
saturation: 140,
|
|
572
|
+
aberrationIntensity: 'default',
|
|
573
|
+
description: 'Enhanced displacement with stronger edge effects',
|
|
574
|
+
color: '#ffffff',
|
|
575
|
+
},
|
|
576
|
+
shader: {
|
|
577
|
+
displacementScale: 190,
|
|
578
|
+
shaderVariant: 'premiumGlass',
|
|
579
|
+
blurAmount: 0,
|
|
580
|
+
saturation: 140,
|
|
581
|
+
aberrationIntensity: 'default',
|
|
582
|
+
description: 'Advanced shader-based displacement for maximum visual impact',
|
|
583
|
+
color: '#e6f7ff',
|
|
584
|
+
},
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
// Handle mouse enter/leave for cards
|
|
588
|
+
const handleMouseEnter = (mode: string) => {
|
|
589
|
+
setActiveMode(mode);
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
const handleMouseLeave = () => {
|
|
593
|
+
setActiveMode(null);
|
|
594
|
+
};
|
|
595
|
+
|
|
596
|
+
return (
|
|
597
|
+
<BackgroundWrapper
|
|
598
|
+
backgroundImage="https://plus.unsplash.com/premium_photo-1728613098996-af5b4ee51be8?q=80&w=3269&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
|
599
|
+
overlay={true}
|
|
600
|
+
>
|
|
601
|
+
<div>
|
|
602
|
+
<div
|
|
603
|
+
style={{
|
|
604
|
+
padding: '20px 0',
|
|
605
|
+
textAlign: 'center',
|
|
606
|
+
marginBottom: '20px',
|
|
607
|
+
}}
|
|
608
|
+
>
|
|
609
|
+
<h2
|
|
610
|
+
style={{
|
|
611
|
+
margin: '0 0 10px 0',
|
|
612
|
+
fontSize: '32px',
|
|
613
|
+
fontWeight: 500,
|
|
614
|
+
color: '#ffffff',
|
|
615
|
+
textShadow: '0 2px 4px rgba(0,0,0,0.2)',
|
|
616
|
+
}}
|
|
617
|
+
>
|
|
618
|
+
AtomixGlass Modes
|
|
619
|
+
</h2>
|
|
620
|
+
<p
|
|
621
|
+
style={{
|
|
622
|
+
fontSize: '16px',
|
|
623
|
+
maxWidth: '500px',
|
|
624
|
+
margin: '0 auto',
|
|
625
|
+
color: '#ffffff',
|
|
626
|
+
textShadow: '0 1px 2px rgba(0,0,0,0.2)',
|
|
627
|
+
}}
|
|
628
|
+
>
|
|
629
|
+
Hover over each card to see how different modes affect the appearance and behavior of
|
|
630
|
+
the glass effect.
|
|
631
|
+
</p>
|
|
632
|
+
</div>
|
|
633
|
+
|
|
634
|
+
<div
|
|
635
|
+
style={{
|
|
636
|
+
display: 'flex',
|
|
637
|
+
flexWrap: 'wrap',
|
|
638
|
+
justifyContent: 'center',
|
|
639
|
+
alignContent: 'center',
|
|
640
|
+
gap: '24px',
|
|
641
|
+
width: '70vw',
|
|
642
|
+
}}
|
|
643
|
+
>
|
|
644
|
+
{modes.map(mode => {
|
|
645
|
+
const settings = modeSettings[mode];
|
|
646
|
+
const isActive = activeMode === mode;
|
|
647
|
+
|
|
648
|
+
return (
|
|
649
|
+
<AtomixGlass
|
|
650
|
+
key={mode}
|
|
651
|
+
mode={mode}
|
|
652
|
+
displacementScale={settings.displacementScale}
|
|
653
|
+
blurAmount={settings.blurAmount}
|
|
654
|
+
saturation={settings.saturation}
|
|
655
|
+
shaderVariant={settings.shaderVariant as any}
|
|
656
|
+
elasticity={0.2}
|
|
657
|
+
cornerRadius={40}
|
|
658
|
+
onClick={() => handleMouseEnter(mode)}
|
|
659
|
+
overLight={false}
|
|
660
|
+
>
|
|
661
|
+
<div
|
|
662
|
+
style={{
|
|
663
|
+
padding: '20px 40px',
|
|
664
|
+
textAlign: 'center',
|
|
665
|
+
maxWidth: '350px',
|
|
666
|
+
minHeight: '200px',
|
|
667
|
+
width: '100%',
|
|
668
|
+
textShadow: '1px 2px 6px rgba(0,0,0,0.7)',
|
|
669
|
+
}}
|
|
670
|
+
>
|
|
671
|
+
<h3
|
|
672
|
+
style={{
|
|
673
|
+
margin: '0 0 12px 0',
|
|
674
|
+
fontSize: '20px',
|
|
675
|
+
fontWeight: 500,
|
|
676
|
+
color: settings.color,
|
|
677
|
+
}}
|
|
678
|
+
>
|
|
679
|
+
{mode.charAt(0).toUpperCase() + mode.slice(1)} Mode
|
|
680
|
+
</h3>
|
|
681
|
+
<p
|
|
682
|
+
style={{
|
|
683
|
+
margin: '0 0 16px 0',
|
|
684
|
+
fontSize: '14px',
|
|
685
|
+
lineHeight: 1.5,
|
|
686
|
+
color: settings.color,
|
|
687
|
+
}}
|
|
688
|
+
>
|
|
689
|
+
{settings.description}
|
|
690
|
+
</p>
|
|
691
|
+
<div
|
|
692
|
+
style={{
|
|
693
|
+
display: 'flex',
|
|
694
|
+
justifyContent: 'center',
|
|
695
|
+
alignItems: 'center',
|
|
696
|
+
gap: '8px',
|
|
697
|
+
marginTop: '12px',
|
|
698
|
+
flexWrap: 'wrap',
|
|
699
|
+
}}
|
|
700
|
+
>
|
|
701
|
+
<span
|
|
702
|
+
style={{
|
|
703
|
+
fontSize: '12px',
|
|
704
|
+
padding: '4px 8px',
|
|
705
|
+
borderRadius: '4px',
|
|
706
|
+
backdropFilter: 'blur(2px)',
|
|
707
|
+
background: 'rgba(255,255,255,0.2)',
|
|
708
|
+
}}
|
|
709
|
+
>
|
|
710
|
+
Displacement: {settings.displacementScale}
|
|
711
|
+
</span>
|
|
712
|
+
<span
|
|
713
|
+
style={{
|
|
714
|
+
fontSize: '12px',
|
|
715
|
+
padding: '4px 8px',
|
|
716
|
+
borderRadius: '4px',
|
|
717
|
+
background: 'rgba(255,255,255,0.2)',
|
|
718
|
+
backdropFilter: 'blur(2px)',
|
|
719
|
+
}}
|
|
720
|
+
>
|
|
721
|
+
Blur: {settings.blurAmount}
|
|
722
|
+
</span>
|
|
723
|
+
<span
|
|
724
|
+
style={{
|
|
725
|
+
fontSize: '12px',
|
|
726
|
+
padding: '4px 8px',
|
|
727
|
+
borderRadius: '4px',
|
|
728
|
+
backdropFilter: 'blur(2px)',
|
|
729
|
+
background: 'rgba(255,255,255,0.2)',
|
|
730
|
+
}}
|
|
731
|
+
>
|
|
732
|
+
Aberration: {settings.aberrationIntensity}
|
|
733
|
+
</span>
|
|
734
|
+
</div>
|
|
735
|
+
</div>
|
|
736
|
+
</AtomixGlass>
|
|
737
|
+
);
|
|
738
|
+
})}
|
|
739
|
+
</div>
|
|
740
|
+
</div>
|
|
741
|
+
</BackgroundWrapper>
|
|
742
|
+
);
|
|
743
|
+
},
|
|
744
|
+
};
|
|
745
|
+
|
|
746
|
+
|
|
747
|
+
/**
|
|
748
|
+
* Performance Optimization Dashboard
|
|
749
|
+
*
|
|
750
|
+
* Demonstrates enterprise-grade performance optimization techniques with side-by-side
|
|
751
|
+
* comparisons of different configuration strategies and their impact on rendering efficiency.
|
|
752
|
+
*/
|
|
753
|
+
export const PerformanceOptimization: Story = {
|
|
754
|
+
parameters: {
|
|
755
|
+
docs: {
|
|
756
|
+
description: {
|
|
757
|
+
story:
|
|
758
|
+
'A comprehensive performance optimization guide showcasing three distinct configuration profiles: High Performance (mobile-optimized), Balanced (desktop standard), and Premium (high-end hardware). Each profile demonstrates the trade-offs between visual fidelity and rendering performance.',
|
|
759
|
+
},
|
|
760
|
+
},
|
|
761
|
+
},
|
|
762
|
+
render: () => (
|
|
763
|
+
<BackgroundWrapper backgroundImage={'https://images.unsplash.com/photo-1706705618478-505e088180c4?ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&q=80&w=2532'} padding="60px 20px">
|
|
764
|
+
<div style={{ margin: '0 auto', width: '100%' }}>
|
|
765
|
+
{/* Header Section */}
|
|
766
|
+
<div style={{ textAlign: 'center', marginBottom: '60px' }}>
|
|
767
|
+
<h1
|
|
768
|
+
style={{
|
|
769
|
+
color: '#fff',
|
|
770
|
+
fontSize: '3rem',
|
|
771
|
+
fontWeight: '700',
|
|
772
|
+
marginBottom: '16px',
|
|
773
|
+
letterSpacing: '-0.02em',
|
|
774
|
+
}}
|
|
775
|
+
>
|
|
776
|
+
Performance Optimization
|
|
777
|
+
</h1>
|
|
778
|
+
<p
|
|
779
|
+
style={{
|
|
780
|
+
color: 'rgba(255,255,255,0.85)',
|
|
781
|
+
fontSize: '1.25rem',
|
|
782
|
+
maxWidth: '700px',
|
|
783
|
+
margin: '0 auto',
|
|
784
|
+
lineHeight: '1.6',
|
|
785
|
+
}}
|
|
786
|
+
>
|
|
787
|
+
Fine-tune AtomixGlass for optimal performance across different device capabilities
|
|
788
|
+
</p>
|
|
789
|
+
</div>
|
|
790
|
+
|
|
791
|
+
{/* Performance Guidelines */}
|
|
792
|
+
<AtomixGlass
|
|
793
|
+
displacementScale={60}
|
|
794
|
+
blurAmount={3}
|
|
795
|
+
saturation={130}
|
|
796
|
+
aberrationIntensity={1.2}
|
|
797
|
+
elasticity={0}
|
|
798
|
+
cornerRadius={16}
|
|
799
|
+
mode="prominent"
|
|
800
|
+
style={{ marginBottom: '48px' }}
|
|
801
|
+
>
|
|
802
|
+
<div style={{ padding: '32px' }}>
|
|
803
|
+
<h2
|
|
804
|
+
style={{
|
|
805
|
+
color: '#fff',
|
|
806
|
+
fontSize: '1.75rem',
|
|
807
|
+
fontWeight: '600',
|
|
808
|
+
marginBottom: '24px',
|
|
809
|
+
marginTop: 0,
|
|
810
|
+
}}
|
|
811
|
+
>
|
|
812
|
+
Best Practices & Guidelines
|
|
813
|
+
</h2>
|
|
814
|
+
<div
|
|
815
|
+
style={{
|
|
816
|
+
display: 'grid',
|
|
817
|
+
gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))',
|
|
818
|
+
gap: '24px',
|
|
819
|
+
color: '#fff',
|
|
820
|
+
}}
|
|
821
|
+
>
|
|
822
|
+
<div>
|
|
823
|
+
<div
|
|
824
|
+
style={{
|
|
825
|
+
fontSize: '2rem',
|
|
826
|
+
marginBottom: '12px',
|
|
827
|
+
opacity: 0.9,
|
|
828
|
+
}}
|
|
829
|
+
>
|
|
830
|
+
⚡
|
|
831
|
+
</div>
|
|
832
|
+
<h3 style={{ fontSize: '1.125rem', fontWeight: '600', marginBottom: '8px' }}>
|
|
833
|
+
Limit Instances
|
|
834
|
+
</h3>
|
|
835
|
+
<p style={{ fontSize: '0.9375rem', lineHeight: '1.6', opacity: 0.85, margin: 0 }}>
|
|
836
|
+
Use 3-5 glass components maximum per view to maintain optimal frame rates
|
|
837
|
+
</p>
|
|
838
|
+
</div>
|
|
839
|
+
<div>
|
|
840
|
+
<div
|
|
841
|
+
style={{
|
|
842
|
+
fontSize: '2rem',
|
|
843
|
+
marginBottom: '12px',
|
|
844
|
+
opacity: 0.9,
|
|
845
|
+
}}
|
|
846
|
+
>
|
|
847
|
+
📱
|
|
848
|
+
</div>
|
|
849
|
+
<h3 style={{ fontSize: '1.125rem', fontWeight: '600', marginBottom: '8px' }}>
|
|
850
|
+
Mobile Optimization
|
|
851
|
+
</h3>
|
|
852
|
+
<p style={{ fontSize: '0.9375rem', lineHeight: '1.6', opacity: 0.85, margin: 0 }}>
|
|
853
|
+
Reduce complexity on mobile: lower displacement scale and disable hover effects
|
|
854
|
+
</p>
|
|
855
|
+
</div>
|
|
856
|
+
<div>
|
|
857
|
+
<div
|
|
858
|
+
style={{
|
|
859
|
+
fontSize: '2rem',
|
|
860
|
+
marginBottom: '12px',
|
|
861
|
+
opacity: 0.9,
|
|
862
|
+
}}
|
|
863
|
+
>
|
|
864
|
+
🎯
|
|
865
|
+
</div>
|
|
866
|
+
<h3 style={{ fontSize: '1.125rem', fontWeight: '600', marginBottom: '8px' }}>
|
|
867
|
+
Strategic Placement
|
|
868
|
+
</h3>
|
|
869
|
+
<p style={{ fontSize: '0.9375rem', lineHeight: '1.6', opacity: 0.85, margin: 0 }}>
|
|
870
|
+
Apply glass effects to focal points only—cards, modals, and navigation elements
|
|
871
|
+
</p>
|
|
872
|
+
</div>
|
|
873
|
+
</div>
|
|
874
|
+
</div>
|
|
875
|
+
</AtomixGlass>
|
|
876
|
+
|
|
877
|
+
{/* Configuration Comparison Grid */}
|
|
878
|
+
<div
|
|
879
|
+
style={{
|
|
880
|
+
display: 'grid',
|
|
881
|
+
gridTemplateColumns: 'repeat(auto-fit, minmax(350px, 1fr))',
|
|
882
|
+
gap: '32px',
|
|
883
|
+
}}
|
|
884
|
+
>
|
|
885
|
+
{/* High Performance Profile */}
|
|
886
|
+
<div>
|
|
887
|
+
<div
|
|
888
|
+
style={{
|
|
889
|
+
marginBottom: '16px',
|
|
890
|
+
display: 'flex',
|
|
891
|
+
alignItems: 'center',
|
|
892
|
+
gap: '12px',
|
|
893
|
+
}}
|
|
894
|
+
>
|
|
895
|
+
<div
|
|
896
|
+
style={{
|
|
897
|
+
width: '8px',
|
|
898
|
+
height: '8px',
|
|
899
|
+
borderRadius: '50%',
|
|
900
|
+
backgroundColor: '#34C759',
|
|
901
|
+
boxShadow: '0 0 12px rgba(52, 199, 89, 0.6)',
|
|
902
|
+
}}
|
|
903
|
+
/>
|
|
904
|
+
<h3 style={{ color: '#fff', fontSize: '1.5rem', fontWeight: '600', margin: 0 }}>
|
|
905
|
+
High Performance
|
|
906
|
+
</h3>
|
|
907
|
+
</div>
|
|
908
|
+
<AtomixGlass
|
|
909
|
+
displacementScale={25}
|
|
910
|
+
blurAmount={0.2}
|
|
911
|
+
saturation={120}
|
|
912
|
+
aberrationIntensity={0.8}
|
|
913
|
+
elasticity={0.8}
|
|
914
|
+
cornerRadius={12}
|
|
915
|
+
mode="standard"
|
|
916
|
+
style={{ height: '100%', minHeight: '400px' }}
|
|
917
|
+
>
|
|
918
|
+
<div
|
|
919
|
+
style={{
|
|
920
|
+
padding: '28px',
|
|
921
|
+
height: '100%',
|
|
922
|
+
display: 'flex',
|
|
923
|
+
flexDirection: 'column',
|
|
924
|
+
}}
|
|
925
|
+
>
|
|
926
|
+
<div
|
|
927
|
+
style={{
|
|
928
|
+
display: 'inline-flex',
|
|
929
|
+
alignItems: 'center',
|
|
930
|
+
gap: '8px',
|
|
931
|
+
padding: '6px 12px',
|
|
932
|
+
borderRadius: '20px',
|
|
933
|
+
backgroundColor: 'rgba(52, 199, 89, 0.2)',
|
|
934
|
+
color: '#34C759',
|
|
935
|
+
fontSize: '0.875rem',
|
|
936
|
+
fontWeight: '600',
|
|
937
|
+
marginBottom: '20px',
|
|
938
|
+
alignSelf: 'flex-start',
|
|
939
|
+
}}
|
|
940
|
+
>
|
|
941
|
+
<span>🚀</span>
|
|
942
|
+
<span>OPTIMIZED</span>
|
|
943
|
+
</div>
|
|
944
|
+
<h4
|
|
945
|
+
style={{
|
|
946
|
+
marginTop: 0,
|
|
947
|
+
marginBottom: '16px',
|
|
948
|
+
fontSize: '1.25rem',
|
|
949
|
+
fontWeight: '600',
|
|
950
|
+
}}
|
|
951
|
+
>
|
|
952
|
+
Mobile-First Configuration
|
|
953
|
+
</h4>
|
|
954
|
+
<div style={{ flex: 1 }}>
|
|
955
|
+
<div style={{ marginBottom: '24px' }}>
|
|
956
|
+
<div
|
|
957
|
+
style={{
|
|
958
|
+
display: 'grid',
|
|
959
|
+
gridTemplateColumns: '1fr auto',
|
|
960
|
+
gap: '12px',
|
|
961
|
+
fontSize: '0.9375rem',
|
|
962
|
+
lineHeight: '1.8',
|
|
963
|
+
}}
|
|
964
|
+
>
|
|
965
|
+
<span style={{ opacity: 0.85 }}>Displacement Scale:</span>
|
|
966
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>25</span>
|
|
967
|
+
<span style={{ opacity: 0.85 }}>Blur Amount:</span>
|
|
968
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>0.2</span>
|
|
969
|
+
<span style={{ opacity: 0.85 }}>Saturation:</span>
|
|
970
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>120%</span>
|
|
971
|
+
<span style={{ opacity: 0.85 }}>Aberration:</span>
|
|
972
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>0.8</span>
|
|
973
|
+
<span style={{ opacity: 0.85 }}>Elasticity:</span>
|
|
974
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>0.8</span>
|
|
975
|
+
</div>
|
|
976
|
+
</div>
|
|
977
|
+
<div
|
|
978
|
+
style={{
|
|
979
|
+
padding: '16px',
|
|
980
|
+
borderRadius: '8px',
|
|
981
|
+
backgroundColor: 'rgba(255, 255, 255, 0.08)',
|
|
982
|
+
fontSize: '0.875rem',
|
|
983
|
+
lineHeight: '1.6',
|
|
984
|
+
}}
|
|
985
|
+
>
|
|
986
|
+
<strong style={{ display: 'block', marginBottom: '8px' }}>Best For:</strong>
|
|
987
|
+
<ul style={{ margin: 0, paddingLeft: '20px', opacity: 0.85 }}>
|
|
988
|
+
<li>Mobile devices & tablets</li>
|
|
989
|
+
<li>Multiple glass instances</li>
|
|
990
|
+
<li>Battery-constrained devices</li>
|
|
991
|
+
<li>Background animations</li>
|
|
992
|
+
</ul>
|
|
993
|
+
</div>
|
|
994
|
+
</div>
|
|
995
|
+
</div>
|
|
996
|
+
</AtomixGlass>
|
|
997
|
+
</div>
|
|
998
|
+
|
|
999
|
+
{/* Balanced Profile */}
|
|
1000
|
+
<div>
|
|
1001
|
+
<div
|
|
1002
|
+
style={{
|
|
1003
|
+
marginBottom: '16px',
|
|
1004
|
+
display: 'flex',
|
|
1005
|
+
alignItems: 'center',
|
|
1006
|
+
gap: '12px',
|
|
1007
|
+
}}
|
|
1008
|
+
>
|
|
1009
|
+
<div
|
|
1010
|
+
style={{
|
|
1011
|
+
width: '8px',
|
|
1012
|
+
height: '8px',
|
|
1013
|
+
borderRadius: '50%',
|
|
1014
|
+
backgroundColor: '#FF9500',
|
|
1015
|
+
boxShadow: '0 0 12px rgba(255, 149, 0, 0.6)',
|
|
1016
|
+
}}
|
|
1017
|
+
/>
|
|
1018
|
+
<h3 style={{ color: '#fff', fontSize: '1.5rem', fontWeight: '600', margin: 0 }}>
|
|
1019
|
+
Balanced
|
|
1020
|
+
</h3>
|
|
1021
|
+
</div>
|
|
1022
|
+
<AtomixGlass
|
|
1023
|
+
displacementScale={55}
|
|
1024
|
+
blurAmount={0.4}
|
|
1025
|
+
saturation={150}
|
|
1026
|
+
aberrationIntensity={1.8}
|
|
1027
|
+
elasticity={0.15}
|
|
1028
|
+
cornerRadius={12}
|
|
1029
|
+
mode="standard"
|
|
1030
|
+
style={{ height: '100%', minHeight: '400px' }}
|
|
1031
|
+
>
|
|
1032
|
+
<div
|
|
1033
|
+
style={{
|
|
1034
|
+
padding: '28px',
|
|
1035
|
+
height: '100%',
|
|
1036
|
+
display: 'flex',
|
|
1037
|
+
flexDirection: 'column',
|
|
1038
|
+
}}
|
|
1039
|
+
>
|
|
1040
|
+
<div
|
|
1041
|
+
style={{
|
|
1042
|
+
display: 'inline-flex',
|
|
1043
|
+
alignItems: 'center',
|
|
1044
|
+
gap: '8px',
|
|
1045
|
+
padding: '6px 12px',
|
|
1046
|
+
borderRadius: '20px',
|
|
1047
|
+
backgroundColor: 'rgba(255, 149, 0, 0.2)',
|
|
1048
|
+
color: '#FF9500',
|
|
1049
|
+
fontSize: '0.875rem',
|
|
1050
|
+
fontWeight: '600',
|
|
1051
|
+
marginBottom: '20px',
|
|
1052
|
+
alignSelf: 'flex-start',
|
|
1053
|
+
}}
|
|
1054
|
+
>
|
|
1055
|
+
<span>⚖️</span>
|
|
1056
|
+
<span>RECOMMENDED</span>
|
|
1057
|
+
</div>
|
|
1058
|
+
<h4
|
|
1059
|
+
style={{
|
|
1060
|
+
marginTop: 0,
|
|
1061
|
+
marginBottom: '16px',
|
|
1062
|
+
fontSize: '1.25rem',
|
|
1063
|
+
fontWeight: '600',
|
|
1064
|
+
}}
|
|
1065
|
+
>
|
|
1066
|
+
Production Standard
|
|
1067
|
+
</h4>
|
|
1068
|
+
<div style={{ flex: 1 }}>
|
|
1069
|
+
<div style={{ marginBottom: '24px' }}>
|
|
1070
|
+
<div
|
|
1071
|
+
style={{
|
|
1072
|
+
display: 'grid',
|
|
1073
|
+
gridTemplateColumns: '1fr auto',
|
|
1074
|
+
gap: '12px',
|
|
1075
|
+
fontSize: '0.9375rem',
|
|
1076
|
+
lineHeight: '1.8',
|
|
1077
|
+
}}
|
|
1078
|
+
>
|
|
1079
|
+
<span style={{ opacity: 0.85 }}>Displacement Scale:</span>
|
|
1080
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>55</span>
|
|
1081
|
+
<span style={{ opacity: 0.85 }}>Blur Amount:</span>
|
|
1082
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>0.4</span>
|
|
1083
|
+
<span style={{ opacity: 0.85 }}>Saturation:</span>
|
|
1084
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>150%</span>
|
|
1085
|
+
<span style={{ opacity: 0.85 }}>Aberration:</span>
|
|
1086
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>1.8</span>
|
|
1087
|
+
<span style={{ opacity: 0.85 }}>Elasticity:</span>
|
|
1088
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>0.15</span>
|
|
1089
|
+
</div>
|
|
1090
|
+
</div>
|
|
1091
|
+
<div
|
|
1092
|
+
style={{
|
|
1093
|
+
padding: '16px',
|
|
1094
|
+
borderRadius: '8px',
|
|
1095
|
+
backgroundColor: 'rgba(255, 255, 255, 0.08)',
|
|
1096
|
+
fontSize: '0.875rem',
|
|
1097
|
+
lineHeight: '1.6',
|
|
1098
|
+
}}
|
|
1099
|
+
>
|
|
1100
|
+
<strong style={{ display: 'block', marginBottom: '8px' }}>Best For:</strong>
|
|
1101
|
+
<ul style={{ margin: 0, paddingLeft: '20px', opacity: 0.85 }}>
|
|
1102
|
+
<li>Desktop applications</li>
|
|
1103
|
+
<li>Modern web browsers</li>
|
|
1104
|
+
<li>Mid-range devices</li>
|
|
1105
|
+
<li>General use cases</li>
|
|
1106
|
+
</ul>
|
|
1107
|
+
</div>
|
|
1108
|
+
</div>
|
|
1109
|
+
</div>
|
|
1110
|
+
</AtomixGlass>
|
|
1111
|
+
</div>
|
|
1112
|
+
|
|
1113
|
+
{/* Premium Profile */}
|
|
1114
|
+
<div>
|
|
1115
|
+
<div
|
|
1116
|
+
style={{
|
|
1117
|
+
marginBottom: '16px',
|
|
1118
|
+
display: 'flex',
|
|
1119
|
+
alignItems: 'center',
|
|
1120
|
+
gap: '12px',
|
|
1121
|
+
}}
|
|
1122
|
+
>
|
|
1123
|
+
<div
|
|
1124
|
+
style={{
|
|
1125
|
+
width: '8px',
|
|
1126
|
+
height: '8px',
|
|
1127
|
+
borderRadius: '50%',
|
|
1128
|
+
backgroundColor: '#AF52DE',
|
|
1129
|
+
boxShadow: '0 0 12px rgba(175, 82, 222, 0.6)',
|
|
1130
|
+
}}
|
|
1131
|
+
/>
|
|
1132
|
+
<h3 style={{ color: '#fff', fontSize: '1.5rem', fontWeight: '600', margin: 0 }}>
|
|
1133
|
+
Premium
|
|
1134
|
+
</h3>
|
|
1135
|
+
</div>
|
|
1136
|
+
<AtomixGlass
|
|
1137
|
+
displacementScale={85}
|
|
1138
|
+
blurAmount={0.8}
|
|
1139
|
+
saturation={180}
|
|
1140
|
+
aberrationIntensity={3.2}
|
|
1141
|
+
elasticity={0.22}
|
|
1142
|
+
cornerRadius={12}
|
|
1143
|
+
mode="standard"
|
|
1144
|
+
style={{ height: '100%', minHeight: '400px' }}
|
|
1145
|
+
>
|
|
1146
|
+
<div
|
|
1147
|
+
style={{
|
|
1148
|
+
padding: '28px',
|
|
1149
|
+
height: '100%',
|
|
1150
|
+
display: 'flex',
|
|
1151
|
+
flexDirection: 'column',
|
|
1152
|
+
}}
|
|
1153
|
+
>
|
|
1154
|
+
<div
|
|
1155
|
+
style={{
|
|
1156
|
+
display: 'inline-flex',
|
|
1157
|
+
alignItems: 'center',
|
|
1158
|
+
gap: '8px',
|
|
1159
|
+
padding: '6px 12px',
|
|
1160
|
+
borderRadius: '20px',
|
|
1161
|
+
backgroundColor: 'rgba(175, 82, 222, 0.2)',
|
|
1162
|
+
color: '#AF52DE',
|
|
1163
|
+
fontSize: '0.875rem',
|
|
1164
|
+
fontWeight: '600',
|
|
1165
|
+
marginBottom: '20px',
|
|
1166
|
+
alignSelf: 'flex-start',
|
|
1167
|
+
}}
|
|
1168
|
+
>
|
|
1169
|
+
<span>✨</span>
|
|
1170
|
+
<span>PREMIUM</span>
|
|
1171
|
+
</div>
|
|
1172
|
+
<h4
|
|
1173
|
+
style={{
|
|
1174
|
+
marginTop: 0,
|
|
1175
|
+
marginBottom: '16px',
|
|
1176
|
+
fontSize: '1.25rem',
|
|
1177
|
+
fontWeight: '600',
|
|
1178
|
+
}}
|
|
1179
|
+
>
|
|
1180
|
+
High-Fidelity Visual
|
|
1181
|
+
</h4>
|
|
1182
|
+
<div style={{ flex: 1 }}>
|
|
1183
|
+
<div style={{ marginBottom: '24px' }}>
|
|
1184
|
+
<div
|
|
1185
|
+
style={{
|
|
1186
|
+
display: 'grid',
|
|
1187
|
+
gridTemplateColumns: '1fr auto',
|
|
1188
|
+
gap: '12px',
|
|
1189
|
+
fontSize: '0.9375rem',
|
|
1190
|
+
lineHeight: '1.8',
|
|
1191
|
+
}}
|
|
1192
|
+
>
|
|
1193
|
+
<span style={{ opacity: 0.85 }}>Displacement Scale:</span>
|
|
1194
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>85</span>
|
|
1195
|
+
<span style={{ opacity: 0.85 }}>Blur Amount:</span>
|
|
1196
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>0.8</span>
|
|
1197
|
+
<span style={{ opacity: 0.85 }}>Saturation:</span>
|
|
1198
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>180%</span>
|
|
1199
|
+
<span style={{ opacity: 0.85 }}>Aberration:</span>
|
|
1200
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>3.2</span>
|
|
1201
|
+
<span style={{ opacity: 0.85 }}>Elasticity:</span>
|
|
1202
|
+
<span style={{ fontWeight: '600', fontFamily: 'monospace' }}>0.22</span>
|
|
1203
|
+
</div>
|
|
1204
|
+
</div>
|
|
1205
|
+
<div
|
|
1206
|
+
style={{
|
|
1207
|
+
padding: '16px',
|
|
1208
|
+
borderRadius: '8px',
|
|
1209
|
+
backgroundColor: 'rgba(255, 255, 255, 0.08)',
|
|
1210
|
+
fontSize: '0.875rem',
|
|
1211
|
+
lineHeight: '1.6',
|
|
1212
|
+
}}
|
|
1213
|
+
>
|
|
1214
|
+
<strong style={{ display: 'block', marginBottom: '8px' }}>Best For:</strong>
|
|
1215
|
+
<ul style={{ margin: 0, paddingLeft: '20px', opacity: 0.85 }}>
|
|
1216
|
+
<li>High-end hardware</li>
|
|
1217
|
+
<li>Hero sections & CTAs</li>
|
|
1218
|
+
<li>Premium experiences</li>
|
|
1219
|
+
<li>Single focal elements</li>
|
|
1220
|
+
</ul>
|
|
1221
|
+
</div>
|
|
1222
|
+
</div>
|
|
1223
|
+
</div>
|
|
1224
|
+
</AtomixGlass>
|
|
1225
|
+
</div>
|
|
1226
|
+
</div>
|
|
1227
|
+
</div>
|
|
1228
|
+
</BackgroundWrapper>
|
|
1229
|
+
),
|
|
1230
|
+
};
|