@shohojdhara/atomix 0.2.1 → 0.2.3
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/README.md +1 -28
- package/dist/atomix.css +1500 -241
- package/dist/atomix.min.css +6 -6
- package/dist/index.d.ts +1052 -194
- package/dist/index.esm.js +12201 -6066
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +5481 -2827
- 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 +1500 -301
- package/dist/themes/boomdevs.min.css +60 -8
- package/dist/themes/esrar.css +1500 -241
- package/dist/themes/esrar.min.css +6 -6
- package/dist/themes/mashroom.css +1496 -237
- package/dist/themes/mashroom.min.css +8 -8
- package/dist/themes/shaj-default.css +1451 -192
- package/dist/themes/shaj-default.min.css +6 -6
- package/package.json +66 -15
- package/src/components/Accordion/Accordion.stories.tsx +137 -0
- package/src/components/Accordion/Accordion.tsx +33 -3
- package/src/components/AtomixGlass/AtomixGlass.stories.tsx +3011 -0
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +199 -0
- package/src/components/AtomixGlass/AtomixGlass.tsx +1281 -0
- package/src/components/AtomixGlass/AtomixGlassComprehensivePreview.stories.tsx +1369 -0
- package/src/components/AtomixGlass/README.md +134 -0
- package/src/components/AtomixGlass/index.ts +10 -0
- package/src/components/AtomixGlass/shader-utils.ts +140 -0
- package/src/components/AtomixGlass/utils.ts +8 -0
- package/src/components/Badge/Badge.stories.tsx +169 -0
- package/src/components/Badge/Badge.tsx +27 -2
- package/src/components/Button/Button.stories.tsx +345 -0
- package/src/components/Button/Button.tsx +35 -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 +26 -7
- package/src/components/Callout/README.md +409 -0
- package/src/components/Card/Card.stories.tsx +140 -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 +188 -0
- 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/Footer/Footer.stories.tsx +388 -0
- package/src/components/Footer/Footer.tsx +197 -0
- package/src/components/Footer/FooterLink.tsx +72 -0
- package/src/components/Footer/FooterSection.tsx +87 -0
- package/src/components/Footer/FooterSocialLink.tsx +117 -0
- package/src/components/Footer/README.md +261 -0
- package/src/components/Footer/index.ts +13 -0
- 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/Modal/Modal.stories.tsx +235 -0
- package/src/components/Modal/Modal.tsx +64 -35
- 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/Rating/Rating.stories.tsx +112 -0
- package/src/components/Rating/Rating.tsx +25 -1
- package/src/components/SectionIntro/SectionIntro.tsx +9 -11
- package/src/components/Slider/Slider.stories.tsx +634 -50
- package/src/components/Slider/Slider.tsx +5 -3
- 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 +14 -0
- package/src/layouts/Grid/Grid.stories.tsx +226 -159
- package/src/lib/composables/index.ts +4 -0
- package/src/lib/composables/useAtomixGlass.ts +71 -0
- package/src/lib/composables/useButton.ts +3 -1
- package/src/lib/composables/useCallout.ts +4 -1
- package/src/lib/composables/useFooter.ts +85 -0
- package/src/lib/composables/useGlassContainer.ts +168 -0
- package/src/lib/composables/useSlider.ts +191 -4
- package/src/lib/constants/components.ts +173 -0
- package/src/lib/types/components.ts +622 -0
- package/src/lib/utils/displacement-generator.ts +86 -0
- package/src/styles/01-settings/_index.scss +1 -0
- package/src/styles/01-settings/_settings.accordion.scss +20 -19
- package/src/styles/01-settings/_settings.animations.scss +5 -5
- package/src/styles/01-settings/_settings.avatar-group.scss +1 -1
- package/src/styles/01-settings/_settings.avatar.scss +17 -18
- package/src/styles/01-settings/_settings.background.scss +10 -0
- package/src/styles/01-settings/_settings.badge.scss +1 -1
- package/src/styles/01-settings/_settings.breadcrumb.scss +8 -2
- package/src/styles/01-settings/_settings.callout.scss +7 -7
- package/src/styles/01-settings/_settings.card.scss +2 -2
- package/src/styles/01-settings/_settings.chart.scss +7 -7
- package/src/styles/01-settings/_settings.checkbox-group.scss +5 -2
- package/src/styles/01-settings/_settings.checkbox.scss +10 -4
- package/src/styles/01-settings/_settings.countdown.scss +6 -4
- package/src/styles/01-settings/_settings.dropdown.scss +9 -7
- package/src/styles/01-settings/_settings.edge-panel.scss +3 -2
- package/src/styles/01-settings/_settings.footer.scss +125 -0
- package/src/styles/01-settings/_settings.form-group.scss +3 -1
- package/src/styles/01-settings/_settings.form.scss +4 -2
- package/src/styles/01-settings/_settings.hero.scss +9 -7
- package/src/styles/01-settings/_settings.input.scss +9 -7
- package/src/styles/01-settings/_settings.list-group.scss +4 -2
- package/src/styles/01-settings/_settings.list.scss +4 -2
- package/src/styles/01-settings/_settings.menu.scss +10 -8
- package/src/styles/01-settings/_settings.messages.scss +19 -17
- package/src/styles/01-settings/_settings.modal.scss +6 -4
- package/src/styles/01-settings/_settings.nav.scss +6 -4
- package/src/styles/01-settings/_settings.navbar.scss +8 -5
- package/src/styles/01-settings/_settings.pagination.scss +5 -3
- package/src/styles/01-settings/_settings.popover.scss +6 -4
- package/src/styles/01-settings/_settings.rating.scss +5 -3
- package/src/styles/01-settings/_settings.river.scss +8 -6
- package/src/styles/01-settings/_settings.sectionintro.scss +8 -6
- package/src/styles/01-settings/_settings.select.scss +7 -5
- package/src/styles/01-settings/_settings.side-menu.scss +15 -13
- package/src/styles/01-settings/_settings.spacing.scss +4 -0
- package/src/styles/01-settings/_settings.steps.scss +7 -5
- package/src/styles/01-settings/_settings.tabs.scss +7 -5
- package/src/styles/01-settings/_settings.testimonials.scss +6 -4
- package/src/styles/01-settings/_settings.toggle.scss +3 -1
- package/src/styles/01-settings/_settings.tooltip.scss +5 -3
- package/src/styles/01-settings/_settings.upload.scss +22 -20
- package/src/styles/02-tools/_tools.animations.scss +19 -0
- package/src/styles/02-tools/_tools.background.scss +87 -0
- package/src/styles/02-tools/_tools.glass.scss +1 -0
- package/src/styles/02-tools/_tools.rem.scss +18 -5
- package/src/styles/02-tools/_tools.utility-api.scss +32 -26
- package/src/styles/03-generic/_generic.root.scss +15 -2
- package/src/styles/04-elements/_elements.body.scss +6 -0
- package/src/styles/06-components/_components.accordion.scss +24 -4
- package/src/styles/06-components/_components.atomix-glass.scss +0 -0
- package/src/styles/06-components/_components.avatar-group.scss +2 -1
- package/src/styles/06-components/_components.avatar.scss +2 -1
- package/src/styles/06-components/_components.badge.scss +36 -1
- package/src/styles/06-components/_components.breadcrumb.scss +2 -1
- package/src/styles/06-components/_components.button.scss +14 -3
- package/src/styles/06-components/_components.callout.scss +44 -4
- package/src/styles/06-components/_components.card.scss +21 -2
- package/src/styles/06-components/_components.chart.scss +3 -2
- package/src/styles/06-components/_components.checkbox.scss +2 -1
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -2
- package/src/styles/06-components/_components.countdown.scss +2 -1
- package/src/styles/06-components/_components.data-table.scss +7 -6
- package/src/styles/06-components/_components.datepicker.scss +20 -1
- package/src/styles/06-components/_components.dropdown.scss +11 -4
- package/src/styles/06-components/_components.edge-panel.scss +4 -3
- package/src/styles/06-components/_components.footer.scss +825 -0
- package/src/styles/06-components/_components.form-group.scss +1 -0
- package/src/styles/06-components/_components.hero.scss +4 -4
- package/src/styles/06-components/_components.image-gallery.scss +1 -0
- package/src/styles/06-components/_components.input.scss +33 -2
- package/src/styles/06-components/_components.list-group.scss +3 -2
- package/src/styles/06-components/_components.list.scss +2 -1
- package/src/styles/06-components/_components.menu.scss +5 -4
- package/src/styles/06-components/_components.messages.scss +8 -7
- package/src/styles/06-components/_components.modal.scss +3 -2
- package/src/styles/06-components/_components.nav.scss +6 -5
- package/src/styles/06-components/_components.navbar.scss +4 -3
- package/src/styles/06-components/_components.pagination.scss +2 -1
- package/src/styles/06-components/_components.photoviewer.scss +4 -3
- package/src/styles/06-components/_components.popover.scss +3 -2
- package/src/styles/06-components/_components.product-review.scss +3 -2
- package/src/styles/06-components/_components.progress.scss +3 -2
- package/src/styles/06-components/_components.river.scss +3 -2
- package/src/styles/06-components/_components.sectionintro.scss +2 -1
- package/src/styles/06-components/_components.select.scss +5 -4
- package/src/styles/06-components/_components.side-menu.scss +8 -7
- package/src/styles/06-components/_components.skeleton.scss +3 -2
- package/src/styles/06-components/_components.slider.scss +7 -6
- package/src/styles/06-components/_components.spinner.scss +1 -0
- package/src/styles/06-components/_components.steps.scss +3 -2
- package/src/styles/06-components/_components.tabs.scss +4 -3
- package/src/styles/06-components/_components.testimonials.scss +2 -1
- package/src/styles/06-components/_components.todo.scss +3 -2
- package/src/styles/06-components/_components.toggle.scss +5 -4
- package/src/styles/06-components/_components.tooltip.scss +3 -2
- package/src/styles/06-components/_components.upload.scss +4 -3
- package/src/styles/06-components/_components.video-player.scss +50 -27
- package/src/styles/06-components/_index.scss +2 -0
- package/src/styles/99-utilities/_utilities.glass-fixes.scss +48 -0
- package/dist/themes/yabai.css +0 -13711
- package/dist/themes/yabai.min.css +0 -189
|
@@ -46,6 +46,10 @@ const meta = {
|
|
|
46
46
|
control: 'boolean',
|
|
47
47
|
description: 'Whether the textarea is valid',
|
|
48
48
|
},
|
|
49
|
+
glass: {
|
|
50
|
+
control: 'boolean',
|
|
51
|
+
description: 'Enable glass morphism effect',
|
|
52
|
+
},
|
|
49
53
|
},
|
|
50
54
|
} satisfies Meta<typeof Textarea>;
|
|
51
55
|
|
|
@@ -121,3 +125,103 @@ export const States: Story = {
|
|
|
121
125
|
</div>
|
|
122
126
|
),
|
|
123
127
|
};
|
|
128
|
+
|
|
129
|
+
// Glass Effect
|
|
130
|
+
export const Glass: Story = {
|
|
131
|
+
args: {
|
|
132
|
+
placeholder: 'Glass Textarea',
|
|
133
|
+
rows: 4,
|
|
134
|
+
glass: true,
|
|
135
|
+
},
|
|
136
|
+
render: (args) => (
|
|
137
|
+
<div
|
|
138
|
+
style={{
|
|
139
|
+
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
|
140
|
+
padding: '2rem',
|
|
141
|
+
borderRadius: '12px',
|
|
142
|
+
minHeight: '200px',
|
|
143
|
+
display: 'flex',
|
|
144
|
+
alignItems: 'center',
|
|
145
|
+
justifyContent: 'center',
|
|
146
|
+
}}
|
|
147
|
+
>
|
|
148
|
+
<Textarea {...args} />
|
|
149
|
+
</div>
|
|
150
|
+
),
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Glass Variants
|
|
154
|
+
export const GlassVariants: Story = {
|
|
155
|
+
render: () => (
|
|
156
|
+
<div
|
|
157
|
+
style={{
|
|
158
|
+
background: 'linear-gradient(45deg, #f093fb 0%, #f5576c 100%)',
|
|
159
|
+
padding: '2rem',
|
|
160
|
+
borderRadius: '12px',
|
|
161
|
+
}}
|
|
162
|
+
>
|
|
163
|
+
<h3 style={{ color: 'white', marginBottom: '1rem', fontSize: '1.2rem' }}>
|
|
164
|
+
Glass Textarea Variants
|
|
165
|
+
</h3>
|
|
166
|
+
<div className="u-d-flex u-flex-column u-gap-3" style={{ width: '400px' }}>
|
|
167
|
+
<Textarea placeholder="Small Glass" size="sm" rows={3} glass />
|
|
168
|
+
<Textarea placeholder="Medium Glass" size="md" rows={3} glass />
|
|
169
|
+
<Textarea placeholder="Large Glass" size="lg" rows={3} glass />
|
|
170
|
+
<Textarea placeholder="Primary Glass" variant="primary" rows={3} glass />
|
|
171
|
+
<Textarea placeholder="Success Glass" variant="success" rows={3} glass />
|
|
172
|
+
<Textarea placeholder="Custom Glass" rows={4} glass={{
|
|
173
|
+
displacementScale: 80,
|
|
174
|
+
blurAmount: 2,
|
|
175
|
+
saturation: 200,
|
|
176
|
+
aberrationIntensity: 2,
|
|
177
|
+
cornerRadius: 12,
|
|
178
|
+
}} />
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
),
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// Glass Showcase
|
|
185
|
+
export const GlassShowcase: Story = {
|
|
186
|
+
render: () => (
|
|
187
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
|
188
|
+
{/* Basic Glass */}
|
|
189
|
+
<div
|
|
190
|
+
style={{
|
|
191
|
+
background: 'url(https://cdn.pixabay.com/photo/2021/11/13/08/50/athens-6790780_1280.jpg)',
|
|
192
|
+
backgroundSize: 'cover',
|
|
193
|
+
backgroundPosition: 'center',
|
|
194
|
+
padding: '2rem',
|
|
195
|
+
borderRadius: '12px',
|
|
196
|
+
}}
|
|
197
|
+
>
|
|
198
|
+
<h3 style={{ color: 'white', marginBottom: '1rem', fontSize: '1.2rem' }}>
|
|
199
|
+
Glass Textarea on Background
|
|
200
|
+
</h3>
|
|
201
|
+
<div className="u-d-flex u-flex-column u-gap-3" style={{ width: '400px' }}>
|
|
202
|
+
<Textarea placeholder="Write your message..." rows={4} glass />
|
|
203
|
+
<Textarea placeholder="Additional notes..." rows={3} glass />
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
|
|
207
|
+
{/* Different Glass Modes */}
|
|
208
|
+
<div
|
|
209
|
+
style={{
|
|
210
|
+
background: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)',
|
|
211
|
+
padding: '2rem',
|
|
212
|
+
borderRadius: '12px',
|
|
213
|
+
}}
|
|
214
|
+
>
|
|
215
|
+
<h3 style={{ color: 'white', marginBottom: '1rem', fontSize: '1.2rem' }}>
|
|
216
|
+
Glass Modes
|
|
217
|
+
</h3>
|
|
218
|
+
<div className="u-d-flex u-flex-column u-gap-3" style={{ width: '400px' }}>
|
|
219
|
+
<Textarea placeholder="Standard Mode" rows={3} glass={{ mode: 'standard' }} />
|
|
220
|
+
<Textarea placeholder="Polar Mode" rows={3} glass={{ mode: 'polar' }} />
|
|
221
|
+
<Textarea placeholder="Prominent Mode" rows={3} glass={{ mode: 'prominent' }} />
|
|
222
|
+
<Textarea placeholder="Shader Mode" rows={3} glass={{ mode: 'shader' }} />
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
),
|
|
227
|
+
};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
2
|
import { TextareaProps } from '../../lib/types/components';
|
|
3
3
|
import { useTextarea } from '../../lib/composables/useTextarea';
|
|
4
|
+
import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Textarea - A component for multiline text input
|
|
7
8
|
*/
|
|
8
|
-
export const Textarea
|
|
9
|
+
export const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(({
|
|
9
10
|
value,
|
|
10
11
|
onChange,
|
|
11
12
|
onBlur,
|
|
@@ -28,7 +29,8 @@ export const Textarea: React.FC<TextareaProps> = ({
|
|
|
28
29
|
autoFocus = false,
|
|
29
30
|
ariaLabel,
|
|
30
31
|
ariaDescribedBy,
|
|
31
|
-
|
|
32
|
+
glass,
|
|
33
|
+
}, ref) => {
|
|
32
34
|
const { generateTextareaClass } = useTextarea({
|
|
33
35
|
size,
|
|
34
36
|
variant,
|
|
@@ -38,7 +40,7 @@ export const Textarea: React.FC<TextareaProps> = ({
|
|
|
38
40
|
});
|
|
39
41
|
|
|
40
42
|
const textareaClass = generateTextareaClass({
|
|
41
|
-
className,
|
|
43
|
+
className: `${className} ${glass ? 'c-input--glass' : ''}`.trim(),
|
|
42
44
|
size,
|
|
43
45
|
variant,
|
|
44
46
|
disabled,
|
|
@@ -46,8 +48,12 @@ export const Textarea: React.FC<TextareaProps> = ({
|
|
|
46
48
|
valid,
|
|
47
49
|
});
|
|
48
50
|
|
|
49
|
-
|
|
51
|
+
// Custom styles for glass effect
|
|
52
|
+
const glassStyles = glass ? {} : {};
|
|
53
|
+
|
|
54
|
+
const textareaElement = (
|
|
50
55
|
<textarea
|
|
56
|
+
ref={ref}
|
|
51
57
|
className={textareaClass}
|
|
52
58
|
value={value}
|
|
53
59
|
onChange={onChange}
|
|
@@ -67,12 +73,35 @@ export const Textarea: React.FC<TextareaProps> = ({
|
|
|
67
73
|
aria-label={ariaLabel}
|
|
68
74
|
aria-describedby={ariaDescribedBy}
|
|
69
75
|
aria-invalid={invalid}
|
|
76
|
+
style={glass ? glassStyles : undefined}
|
|
70
77
|
/>
|
|
71
78
|
);
|
|
72
|
-
};
|
|
73
79
|
|
|
74
|
-
|
|
80
|
+
if (glass) {
|
|
81
|
+
// Default glass settings for textareas
|
|
82
|
+
const defaultGlassProps = {
|
|
83
|
+
displacementScale: 60,
|
|
84
|
+
blurAmount: 1,
|
|
85
|
+
saturation: 180,
|
|
86
|
+
aberrationIntensity: 1,
|
|
87
|
+
cornerRadius: 8,
|
|
88
|
+
mode: 'shader' as const,
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<AtomixGlass {...glassProps}>
|
|
95
|
+
{textareaElement}
|
|
96
|
+
</AtomixGlass>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return textareaElement;
|
|
101
|
+
});
|
|
75
102
|
|
|
76
103
|
Textarea.displayName = 'Textarea';
|
|
77
104
|
|
|
105
|
+
export type { TextareaProps };
|
|
106
|
+
|
|
78
107
|
export default Textarea;
|
|
@@ -92,6 +92,10 @@ const meta = {
|
|
|
92
92
|
control: 'text',
|
|
93
93
|
description: 'Video background URL',
|
|
94
94
|
},
|
|
95
|
+
glass: {
|
|
96
|
+
control: 'object',
|
|
97
|
+
description: 'Glass effect properties or boolean to enable/disable',
|
|
98
|
+
},
|
|
95
99
|
videoOptions: {
|
|
96
100
|
control: 'object',
|
|
97
101
|
description: 'Video background options',
|
|
@@ -138,6 +142,55 @@ export const Default: Story = {
|
|
|
138
142
|
},
|
|
139
143
|
};
|
|
140
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Hero with glass effect
|
|
147
|
+
*/
|
|
148
|
+
export const WithGlassEffect: Story = {
|
|
149
|
+
args: {
|
|
150
|
+
title: 'Hero with Glass Effect',
|
|
151
|
+
subtitle: 'Modern UI with Glassmorphism',
|
|
152
|
+
text: 'This hero content is wrapped in a glass effect container for a modern look.',
|
|
153
|
+
backgroundImageSrc: 'https://picsum.photos/id/106/1920/1080',
|
|
154
|
+
showOverlay: true,
|
|
155
|
+
alignment: 'center',
|
|
156
|
+
glass: true,
|
|
157
|
+
contentWidth: '800px',
|
|
158
|
+
actions: primaryActionButtons,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Hero with custom glass effect
|
|
164
|
+
*/
|
|
165
|
+
export const WithCustomGlassEffect: Story = {
|
|
166
|
+
args: {
|
|
167
|
+
title: 'Hero with Custom Glass Effect',
|
|
168
|
+
subtitle: 'Fully Customizable Glass Properties',
|
|
169
|
+
text: 'This hero uses custom glass effect properties for a unique visual style.',
|
|
170
|
+
backgroundImageSrc: 'https://picsum.photos/id/15/1920/1080',
|
|
171
|
+
showOverlay: true,
|
|
172
|
+
fullViewportHeight: true,
|
|
173
|
+
alignment: 'center',
|
|
174
|
+
glass: {
|
|
175
|
+
displacementScale: 40,
|
|
176
|
+
blurAmount: -0.1,
|
|
177
|
+
saturation: 130,
|
|
178
|
+
aberrationIntensity: 0,
|
|
179
|
+
cornerRadius: 45,
|
|
180
|
+
mode: 'standard',
|
|
181
|
+
elasticity: .2,
|
|
182
|
+
showBorderEffects: true,
|
|
183
|
+
showHoverEffects: true,
|
|
184
|
+
onClick: () => {
|
|
185
|
+
console.log('Clicked!');
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
contentWidth: '800px',
|
|
189
|
+
actions: primaryActionButtons,
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
|
|
141
194
|
/**
|
|
142
195
|
* Hero with left-aligned content and image on right
|
|
143
196
|
*/
|
|
@@ -292,4 +345,4 @@ export const VideoBackgroundWithImage: Story = {
|
|
|
292
345
|
imageSrc: 'https://picsum.photos/id/180/712/500',
|
|
293
346
|
imageAlt: 'Product showcase',
|
|
294
347
|
},
|
|
295
|
-
};
|
|
348
|
+
};
|
|
@@ -2,6 +2,7 @@ import React, { CSSProperties, useEffect } from 'react';
|
|
|
2
2
|
import { HeroProps, HeroAlignment } from '../../lib/types/components';
|
|
3
3
|
import { useHero } from '../../lib/composables/useHero';
|
|
4
4
|
import { HERO } from '../../lib/constants/components';
|
|
5
|
+
import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
|
|
5
6
|
|
|
6
7
|
export const Hero: React.FC<HeroProps> = ({
|
|
7
8
|
title,
|
|
@@ -21,6 +22,8 @@ export const Hero: React.FC<HeroProps> = ({
|
|
|
21
22
|
parallax = false,
|
|
22
23
|
parallaxIntensity = 0.5,
|
|
23
24
|
videoBackground,
|
|
25
|
+
children,
|
|
26
|
+
glass,
|
|
24
27
|
videoOptions = {
|
|
25
28
|
autoplay: true,
|
|
26
29
|
loop: true,
|
|
@@ -64,7 +67,7 @@ export const Hero: React.FC<HeroProps> = ({
|
|
|
64
67
|
|
|
65
68
|
return (
|
|
66
69
|
<video
|
|
67
|
-
ref={videoRef}
|
|
70
|
+
ref={videoRef as React.LegacyRef<HTMLVideoElement>}
|
|
68
71
|
className="c-hero__video"
|
|
69
72
|
autoPlay={autoplay}
|
|
70
73
|
loop={loop}
|
|
@@ -96,14 +99,68 @@ export const Hero: React.FC<HeroProps> = ({
|
|
|
96
99
|
);
|
|
97
100
|
};
|
|
98
101
|
|
|
99
|
-
const renderContent = () =>
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
102
|
+
const renderContent = () => {
|
|
103
|
+
const content = (
|
|
104
|
+
<div className={HERO.SELECTORS.CONTENT.replace('.', '')}>
|
|
105
|
+
{subtitle && <p className={HERO.SELECTORS.SUBTITLE.replace('.', '')}>{subtitle}</p>}
|
|
106
|
+
<h1 className={HERO.SELECTORS.TITLE.replace('.', '')}>{title}</h1>
|
|
107
|
+
{text && <p className={HERO.SELECTORS.TEXT.replace('.', '')}>{text}</p>}
|
|
108
|
+
{actions && <div className={HERO.SELECTORS.ACTIONS.replace('.', '')}>{actions}</div>}
|
|
109
|
+
</div>
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
// If glass is explicitly set to false, don't apply glass effect
|
|
113
|
+
if (glass === false) {
|
|
114
|
+
return content;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// If glass is true or an object, apply glass effect
|
|
118
|
+
if (glass) {
|
|
119
|
+
// If glass is true, use default glass props
|
|
120
|
+
if (glass === true) {
|
|
121
|
+
return (
|
|
122
|
+
<div className={HERO.SELECTORS.CONTENT.replace('.', '')}>
|
|
123
|
+
<AtomixGlass
|
|
124
|
+
displacementScale={60}
|
|
125
|
+
blurAmount={3}
|
|
126
|
+
saturation={180}
|
|
127
|
+
aberrationIntensity={0}
|
|
128
|
+
cornerRadius={8}
|
|
129
|
+
overLight={false}
|
|
130
|
+
mode="standard"
|
|
131
|
+
|
|
132
|
+
>
|
|
133
|
+
<div className="u-p-4">
|
|
134
|
+
{subtitle && <p className={HERO.SELECTORS.SUBTITLE.replace('.', '')}>{subtitle}</p>}
|
|
135
|
+
<h1 className={HERO.SELECTORS.TITLE.replace('.', '')}>{title}</h1>
|
|
136
|
+
{text && <p className={HERO.SELECTORS.TEXT.replace('.', '')}>{text}</p>}
|
|
137
|
+
{actions && (
|
|
138
|
+
<div className={HERO.SELECTORS.ACTIONS.replace('.', '')}>{actions}</div>
|
|
139
|
+
)}
|
|
140
|
+
</div>
|
|
141
|
+
</AtomixGlass>
|
|
142
|
+
</div>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// If glass is an object, use provided glass props
|
|
147
|
+
return (
|
|
148
|
+
<div className={HERO.SELECTORS.CONTENT.replace('.', '')}>
|
|
149
|
+
<AtomixGlass {...glass}>
|
|
150
|
+
<div className="u-p-4">
|
|
151
|
+
{subtitle && <p className={HERO.SELECTORS.SUBTITLE.replace('.', '')}>{subtitle}</p>}
|
|
152
|
+
<h1 className={HERO.SELECTORS.TITLE.replace('.', '')}>{title}</h1>
|
|
153
|
+
{text && <p className={HERO.SELECTORS.TEXT.replace('.', '')}>{text}</p>}
|
|
154
|
+
{actions && <div className={HERO.SELECTORS.ACTIONS.replace('.', '')}>{actions}</div>}
|
|
155
|
+
</div>
|
|
156
|
+
</AtomixGlass>
|
|
157
|
+
</div>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Default behavior - no glass effect
|
|
162
|
+
return content;
|
|
163
|
+
};
|
|
107
164
|
|
|
108
165
|
const renderForegroundImage = () => {
|
|
109
166
|
if (!hasForegroundImage) return null;
|
|
@@ -145,7 +202,7 @@ export const Hero: React.FC<HeroProps> = ({
|
|
|
145
202
|
|
|
146
203
|
return (
|
|
147
204
|
<div
|
|
148
|
-
ref={heroRef}
|
|
205
|
+
ref={heroRef as React.LegacyRef<HTMLDivElement>}
|
|
149
206
|
className={generateHeroClassNames(className)}
|
|
150
207
|
style={heroStyle}
|
|
151
208
|
data-parallax={parallax ? 'true' : undefined}
|
|
@@ -153,7 +210,9 @@ export const Hero: React.FC<HeroProps> = ({
|
|
|
153
210
|
>
|
|
154
211
|
{renderBackground()}
|
|
155
212
|
<div className={`${HERO.SELECTORS.CONTAINER.replace('.', '')} o-container`}>
|
|
156
|
-
{
|
|
213
|
+
{children ? (
|
|
214
|
+
<div className={HERO.SELECTORS.GRID.replace('.', '')}>{children}</div>
|
|
215
|
+
) : useGridLayout ? (
|
|
157
216
|
<div className={`${HERO.SELECTORS.GRID.replace('.', '')} o-grid`}>
|
|
158
217
|
{renderGridContent()}
|
|
159
218
|
</div>
|
|
@@ -30,6 +30,10 @@ const meta: Meta<typeof Modal> = {
|
|
|
30
30
|
description: 'Whether to show the close button',
|
|
31
31
|
defaultValue: true,
|
|
32
32
|
},
|
|
33
|
+
glass: {
|
|
34
|
+
control: 'boolean',
|
|
35
|
+
description: 'Enable glass morphism effect',
|
|
36
|
+
},
|
|
33
37
|
},
|
|
34
38
|
};
|
|
35
39
|
|
|
@@ -282,3 +286,234 @@ export const Sizes: Story = {
|
|
|
282
286
|
);
|
|
283
287
|
},
|
|
284
288
|
};
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Glass morphism modal example.
|
|
292
|
+
*/
|
|
293
|
+
export const GlassModal: Story = {
|
|
294
|
+
render: args => {
|
|
295
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
296
|
+
|
|
297
|
+
return (
|
|
298
|
+
<>
|
|
299
|
+
<div
|
|
300
|
+
className="c-btn c-btn--primary"
|
|
301
|
+
onClick={() => setIsOpen(true)}
|
|
302
|
+
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
303
|
+
>
|
|
304
|
+
Open Glass Modal
|
|
305
|
+
</div>
|
|
306
|
+
|
|
307
|
+
<Modal
|
|
308
|
+
{...args}
|
|
309
|
+
isOpen={isOpen}
|
|
310
|
+
onOpenChange={setIsOpen}
|
|
311
|
+
title="Glass Modal"
|
|
312
|
+
subtitle="This modal features a beautiful glass morphism effect."
|
|
313
|
+
glass={true}
|
|
314
|
+
>
|
|
315
|
+
<p>
|
|
316
|
+
This modal demonstrates the glass morphism effect with a translucent, frosted appearance.
|
|
317
|
+
The glass effect creates a modern, elegant look that works well over colorful backgrounds.
|
|
318
|
+
</p>
|
|
319
|
+
<p>
|
|
320
|
+
The glass effect includes displacement, blur, and chromatic aberration for a premium feel.
|
|
321
|
+
</p>
|
|
322
|
+
</Modal>
|
|
323
|
+
</>
|
|
324
|
+
);
|
|
325
|
+
},
|
|
326
|
+
decorators: [
|
|
327
|
+
(Story) => (
|
|
328
|
+
<div style={{
|
|
329
|
+
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
|
330
|
+
minHeight: '100vh',
|
|
331
|
+
padding: '2rem'
|
|
332
|
+
}}>
|
|
333
|
+
<Story />
|
|
334
|
+
</div>
|
|
335
|
+
),
|
|
336
|
+
],
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Glass modal with custom settings.
|
|
341
|
+
*/
|
|
342
|
+
export const GlassModalCustom: Story = {
|
|
343
|
+
render: args => {
|
|
344
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
345
|
+
|
|
346
|
+
return (
|
|
347
|
+
<>
|
|
348
|
+
<div
|
|
349
|
+
className="c-btn c-btn--primary"
|
|
350
|
+
onClick={() => setIsOpen(true)}
|
|
351
|
+
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
352
|
+
>
|
|
353
|
+
Open Custom Glass Modal
|
|
354
|
+
</div>
|
|
355
|
+
|
|
356
|
+
<Modal
|
|
357
|
+
{...args}
|
|
358
|
+
isOpen={isOpen}
|
|
359
|
+
onOpenChange={setIsOpen}
|
|
360
|
+
title="Custom Glass Modal"
|
|
361
|
+
subtitle="This modal has customized glass effect settings."
|
|
362
|
+
glass={{
|
|
363
|
+
displacementScale: 120,
|
|
364
|
+
blurAmount: 3,
|
|
365
|
+
saturation: 200,
|
|
366
|
+
aberrationIntensity: 2,
|
|
367
|
+
cornerRadius: 20,
|
|
368
|
+
mode: 'polar',
|
|
369
|
+
}}
|
|
370
|
+
footer={
|
|
371
|
+
<>
|
|
372
|
+
<div
|
|
373
|
+
className="c-btn c-btn--outline-secondary"
|
|
374
|
+
onClick={() => setIsOpen(false)}
|
|
375
|
+
style={{
|
|
376
|
+
cursor: 'pointer',
|
|
377
|
+
padding: '8px 16px',
|
|
378
|
+
display: 'inline-block',
|
|
379
|
+
marginRight: '8px',
|
|
380
|
+
}}
|
|
381
|
+
>
|
|
382
|
+
Cancel
|
|
383
|
+
</div>
|
|
384
|
+
<div
|
|
385
|
+
className="c-btn c-btn--primary"
|
|
386
|
+
onClick={() => setIsOpen(false)}
|
|
387
|
+
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
388
|
+
>
|
|
389
|
+
Confirm
|
|
390
|
+
</div>
|
|
391
|
+
</>
|
|
392
|
+
}
|
|
393
|
+
>
|
|
394
|
+
<p>
|
|
395
|
+
This modal uses custom glass settings with enhanced displacement, blur, and chromatic aberration.
|
|
396
|
+
The polar mode creates a different visual effect compared to the standard shader mode.
|
|
397
|
+
</p>
|
|
398
|
+
</Modal>
|
|
399
|
+
</>
|
|
400
|
+
);
|
|
401
|
+
},
|
|
402
|
+
decorators: [
|
|
403
|
+
(Story) => (
|
|
404
|
+
<div style={{
|
|
405
|
+
background: 'linear-gradient(45deg, #f093fb 0%, #f5576c 100%)',
|
|
406
|
+
minHeight: '100vh',
|
|
407
|
+
padding: '2rem'
|
|
408
|
+
}}>
|
|
409
|
+
<Story />
|
|
410
|
+
</div>
|
|
411
|
+
),
|
|
412
|
+
],
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Glass modal with different sizes.
|
|
417
|
+
*/
|
|
418
|
+
export const GlassModalSizes: Story = {
|
|
419
|
+
render: () => {
|
|
420
|
+
const [size, setSize] = useState<'sm' | 'md' | 'lg' | 'xl'>('md');
|
|
421
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
422
|
+
|
|
423
|
+
return (
|
|
424
|
+
<div className="u-d-flex u-flex-column u-gap-4">
|
|
425
|
+
<div className="u-d-flex u-gap-4">
|
|
426
|
+
<div
|
|
427
|
+
className={`c-btn ${size === 'sm' ? 'c-btn--primary' : 'c-btn--secondary'}`}
|
|
428
|
+
onClick={() => {
|
|
429
|
+
setSize('sm');
|
|
430
|
+
setIsOpen(true);
|
|
431
|
+
}}
|
|
432
|
+
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
433
|
+
>
|
|
434
|
+
Small Glass Modal
|
|
435
|
+
</div>
|
|
436
|
+
|
|
437
|
+
<div
|
|
438
|
+
className={`c-btn ${size === 'md' ? 'c-btn--primary' : 'c-btn--secondary'}`}
|
|
439
|
+
onClick={() => {
|
|
440
|
+
setSize('md');
|
|
441
|
+
setIsOpen(true);
|
|
442
|
+
}}
|
|
443
|
+
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
444
|
+
>
|
|
445
|
+
Medium Glass Modal
|
|
446
|
+
</div>
|
|
447
|
+
|
|
448
|
+
<div
|
|
449
|
+
className={`c-btn ${size === 'lg' ? 'c-btn--primary' : 'c-btn--secondary'}`}
|
|
450
|
+
onClick={() => {
|
|
451
|
+
setSize('lg');
|
|
452
|
+
setIsOpen(true);
|
|
453
|
+
}}
|
|
454
|
+
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
455
|
+
>
|
|
456
|
+
Large Glass Modal
|
|
457
|
+
</div>
|
|
458
|
+
|
|
459
|
+
<div
|
|
460
|
+
className={`c-btn ${size === 'xl' ? 'c-btn--primary' : 'c-btn--secondary'}`}
|
|
461
|
+
onClick={() => {
|
|
462
|
+
setSize('xl');
|
|
463
|
+
setIsOpen(true);
|
|
464
|
+
}}
|
|
465
|
+
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
466
|
+
>
|
|
467
|
+
Extra Large Glass Modal
|
|
468
|
+
</div>
|
|
469
|
+
</div>
|
|
470
|
+
|
|
471
|
+
<Modal
|
|
472
|
+
isOpen={isOpen}
|
|
473
|
+
onOpenChange={setIsOpen}
|
|
474
|
+
title={`${size.toUpperCase()} Glass Modal`}
|
|
475
|
+
subtitle="This modal demonstrates glass effect with different sizes."
|
|
476
|
+
size={size}
|
|
477
|
+
glass={true}
|
|
478
|
+
footer={
|
|
479
|
+
<>
|
|
480
|
+
<div
|
|
481
|
+
className="c-btn c-btn--outline-secondary"
|
|
482
|
+
onClick={() => setIsOpen(false)}
|
|
483
|
+
style={{
|
|
484
|
+
cursor: 'pointer',
|
|
485
|
+
padding: '8px 16px',
|
|
486
|
+
display: 'inline-block',
|
|
487
|
+
marginRight: '8px',
|
|
488
|
+
}}
|
|
489
|
+
>
|
|
490
|
+
Cancel
|
|
491
|
+
</div>
|
|
492
|
+
<div
|
|
493
|
+
className="c-btn c-btn--primary"
|
|
494
|
+
onClick={() => setIsOpen(false)}
|
|
495
|
+
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
496
|
+
>
|
|
497
|
+
Confirm
|
|
498
|
+
</div>
|
|
499
|
+
</>
|
|
500
|
+
}
|
|
501
|
+
>
|
|
502
|
+
<p>This is a {size.toUpperCase()} sized glass modal.</p>
|
|
503
|
+
<p>The glass effect adapts to different modal sizes while maintaining its visual appeal.</p>
|
|
504
|
+
</Modal>
|
|
505
|
+
</div>
|
|
506
|
+
);
|
|
507
|
+
},
|
|
508
|
+
decorators: [
|
|
509
|
+
(Story) => (
|
|
510
|
+
<div style={{
|
|
511
|
+
background: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)',
|
|
512
|
+
minHeight: '100vh',
|
|
513
|
+
padding: '2rem'
|
|
514
|
+
}}>
|
|
515
|
+
<Story />
|
|
516
|
+
</div>
|
|
517
|
+
),
|
|
518
|
+
],
|
|
519
|
+
};
|