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