@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.
Files changed (201) hide show
  1. package/README.md +1 -28
  2. package/dist/atomix.css +1500 -241
  3. package/dist/atomix.min.css +6 -6
  4. package/dist/index.d.ts +1052 -194
  5. package/dist/index.esm.js +12201 -6066
  6. package/dist/index.esm.js.map +1 -1
  7. package/dist/index.js +5481 -2827
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.min.js +1 -1
  10. package/dist/index.min.js.map +1 -1
  11. package/dist/themes/boomdevs.css +1500 -301
  12. package/dist/themes/boomdevs.min.css +60 -8
  13. package/dist/themes/esrar.css +1500 -241
  14. package/dist/themes/esrar.min.css +6 -6
  15. package/dist/themes/mashroom.css +1496 -237
  16. package/dist/themes/mashroom.min.css +8 -8
  17. package/dist/themes/shaj-default.css +1451 -192
  18. package/dist/themes/shaj-default.min.css +6 -6
  19. package/package.json +66 -15
  20. package/src/components/Accordion/Accordion.stories.tsx +137 -0
  21. package/src/components/Accordion/Accordion.tsx +33 -3
  22. package/src/components/AtomixGlass/AtomixGlass.stories.tsx +3011 -0
  23. package/src/components/AtomixGlass/AtomixGlass.test.tsx +199 -0
  24. package/src/components/AtomixGlass/AtomixGlass.tsx +1281 -0
  25. package/src/components/AtomixGlass/AtomixGlassComprehensivePreview.stories.tsx +1369 -0
  26. package/src/components/AtomixGlass/README.md +134 -0
  27. package/src/components/AtomixGlass/index.ts +10 -0
  28. package/src/components/AtomixGlass/shader-utils.ts +140 -0
  29. package/src/components/AtomixGlass/utils.ts +8 -0
  30. package/src/components/Badge/Badge.stories.tsx +169 -0
  31. package/src/components/Badge/Badge.tsx +27 -2
  32. package/src/components/Button/Button.stories.tsx +345 -0
  33. package/src/components/Button/Button.tsx +35 -3
  34. package/src/components/Button/README.md +216 -0
  35. package/src/components/Callout/Callout.stories.tsx +813 -78
  36. package/src/components/Callout/Callout.test.tsx +368 -0
  37. package/src/components/Callout/Callout.tsx +26 -7
  38. package/src/components/Callout/README.md +409 -0
  39. package/src/components/Card/Card.stories.tsx +140 -0
  40. package/src/components/Card/Card.tsx +19 -3
  41. package/src/components/DatePicker/DatePicker copy.tsx +551 -0
  42. package/src/components/DatePicker/DatePicker.stories.tsx +188 -0
  43. package/src/components/DatePicker/DatePicker.tsx +379 -332
  44. package/src/components/DatePicker/readme.md +110 -1
  45. package/src/components/DatePicker/types.ts +8 -0
  46. package/src/components/Dropdown/Dropdown.stories.tsx +145 -0
  47. package/src/components/Dropdown/Dropdown.tsx +34 -5
  48. package/src/components/Footer/Footer.stories.tsx +388 -0
  49. package/src/components/Footer/Footer.tsx +197 -0
  50. package/src/components/Footer/FooterLink.tsx +72 -0
  51. package/src/components/Footer/FooterSection.tsx +87 -0
  52. package/src/components/Footer/FooterSocialLink.tsx +117 -0
  53. package/src/components/Footer/README.md +261 -0
  54. package/src/components/Footer/index.ts +13 -0
  55. package/src/components/Form/Checkbox.stories.tsx +101 -0
  56. package/src/components/Form/Checkbox.tsx +26 -2
  57. package/src/components/Form/Input.stories.tsx +124 -0
  58. package/src/components/Form/Input.tsx +36 -7
  59. package/src/components/Form/Radio.stories.tsx +139 -0
  60. package/src/components/Form/Radio.tsx +26 -2
  61. package/src/components/Form/Select.stories.tsx +110 -0
  62. package/src/components/Form/Select.tsx +26 -2
  63. package/src/components/Form/Textarea.stories.tsx +104 -0
  64. package/src/components/Form/Textarea.tsx +36 -7
  65. package/src/components/Hero/Hero.stories.tsx +54 -1
  66. package/src/components/Hero/Hero.tsx +70 -11
  67. package/src/components/Modal/Modal.stories.tsx +235 -0
  68. package/src/components/Modal/Modal.tsx +64 -35
  69. package/src/components/Pagination/Pagination.stories.tsx +101 -0
  70. package/src/components/Pagination/Pagination.tsx +25 -1
  71. package/src/components/Popover/Popover.stories.tsx +94 -0
  72. package/src/components/Popover/Popover.tsx +30 -4
  73. package/src/components/Rating/Rating.stories.tsx +112 -0
  74. package/src/components/Rating/Rating.tsx +25 -1
  75. package/src/components/SectionIntro/SectionIntro.tsx +9 -11
  76. package/src/components/Slider/Slider.stories.tsx +634 -50
  77. package/src/components/Slider/Slider.tsx +5 -3
  78. package/src/components/Steps/Steps.stories.tsx +119 -0
  79. package/src/components/Steps/Steps.tsx +32 -1
  80. package/src/components/Tab/Tab.stories.tsx +88 -0
  81. package/src/components/Tab/Tab.tsx +32 -1
  82. package/src/components/Toggle/Toggle.stories.tsx +92 -0
  83. package/src/components/Toggle/Toggle.tsx +32 -1
  84. package/src/components/Tooltip/Tooltip.stories.tsx +131 -0
  85. package/src/components/Tooltip/Tooltip.tsx +43 -7
  86. package/src/components/VideoPlayer/VideoPlayer.stories.tsx +1002 -196
  87. package/src/components/VideoPlayer/VideoPlayer.tsx +161 -4
  88. package/src/components/index.ts +14 -0
  89. package/src/layouts/Grid/Grid.stories.tsx +226 -159
  90. package/src/lib/composables/index.ts +4 -0
  91. package/src/lib/composables/useAtomixGlass.ts +71 -0
  92. package/src/lib/composables/useButton.ts +3 -1
  93. package/src/lib/composables/useCallout.ts +4 -1
  94. package/src/lib/composables/useFooter.ts +85 -0
  95. package/src/lib/composables/useGlassContainer.ts +168 -0
  96. package/src/lib/composables/useSlider.ts +191 -4
  97. package/src/lib/constants/components.ts +173 -0
  98. package/src/lib/types/components.ts +622 -0
  99. package/src/lib/utils/displacement-generator.ts +86 -0
  100. package/src/styles/01-settings/_index.scss +1 -0
  101. package/src/styles/01-settings/_settings.accordion.scss +20 -19
  102. package/src/styles/01-settings/_settings.animations.scss +5 -5
  103. package/src/styles/01-settings/_settings.avatar-group.scss +1 -1
  104. package/src/styles/01-settings/_settings.avatar.scss +17 -18
  105. package/src/styles/01-settings/_settings.background.scss +10 -0
  106. package/src/styles/01-settings/_settings.badge.scss +1 -1
  107. package/src/styles/01-settings/_settings.breadcrumb.scss +8 -2
  108. package/src/styles/01-settings/_settings.callout.scss +7 -7
  109. package/src/styles/01-settings/_settings.card.scss +2 -2
  110. package/src/styles/01-settings/_settings.chart.scss +7 -7
  111. package/src/styles/01-settings/_settings.checkbox-group.scss +5 -2
  112. package/src/styles/01-settings/_settings.checkbox.scss +10 -4
  113. package/src/styles/01-settings/_settings.countdown.scss +6 -4
  114. package/src/styles/01-settings/_settings.dropdown.scss +9 -7
  115. package/src/styles/01-settings/_settings.edge-panel.scss +3 -2
  116. package/src/styles/01-settings/_settings.footer.scss +125 -0
  117. package/src/styles/01-settings/_settings.form-group.scss +3 -1
  118. package/src/styles/01-settings/_settings.form.scss +4 -2
  119. package/src/styles/01-settings/_settings.hero.scss +9 -7
  120. package/src/styles/01-settings/_settings.input.scss +9 -7
  121. package/src/styles/01-settings/_settings.list-group.scss +4 -2
  122. package/src/styles/01-settings/_settings.list.scss +4 -2
  123. package/src/styles/01-settings/_settings.menu.scss +10 -8
  124. package/src/styles/01-settings/_settings.messages.scss +19 -17
  125. package/src/styles/01-settings/_settings.modal.scss +6 -4
  126. package/src/styles/01-settings/_settings.nav.scss +6 -4
  127. package/src/styles/01-settings/_settings.navbar.scss +8 -5
  128. package/src/styles/01-settings/_settings.pagination.scss +5 -3
  129. package/src/styles/01-settings/_settings.popover.scss +6 -4
  130. package/src/styles/01-settings/_settings.rating.scss +5 -3
  131. package/src/styles/01-settings/_settings.river.scss +8 -6
  132. package/src/styles/01-settings/_settings.sectionintro.scss +8 -6
  133. package/src/styles/01-settings/_settings.select.scss +7 -5
  134. package/src/styles/01-settings/_settings.side-menu.scss +15 -13
  135. package/src/styles/01-settings/_settings.spacing.scss +4 -0
  136. package/src/styles/01-settings/_settings.steps.scss +7 -5
  137. package/src/styles/01-settings/_settings.tabs.scss +7 -5
  138. package/src/styles/01-settings/_settings.testimonials.scss +6 -4
  139. package/src/styles/01-settings/_settings.toggle.scss +3 -1
  140. package/src/styles/01-settings/_settings.tooltip.scss +5 -3
  141. package/src/styles/01-settings/_settings.upload.scss +22 -20
  142. package/src/styles/02-tools/_tools.animations.scss +19 -0
  143. package/src/styles/02-tools/_tools.background.scss +87 -0
  144. package/src/styles/02-tools/_tools.glass.scss +1 -0
  145. package/src/styles/02-tools/_tools.rem.scss +18 -5
  146. package/src/styles/02-tools/_tools.utility-api.scss +32 -26
  147. package/src/styles/03-generic/_generic.root.scss +15 -2
  148. package/src/styles/04-elements/_elements.body.scss +6 -0
  149. package/src/styles/06-components/_components.accordion.scss +24 -4
  150. package/src/styles/06-components/_components.atomix-glass.scss +0 -0
  151. package/src/styles/06-components/_components.avatar-group.scss +2 -1
  152. package/src/styles/06-components/_components.avatar.scss +2 -1
  153. package/src/styles/06-components/_components.badge.scss +36 -1
  154. package/src/styles/06-components/_components.breadcrumb.scss +2 -1
  155. package/src/styles/06-components/_components.button.scss +14 -3
  156. package/src/styles/06-components/_components.callout.scss +44 -4
  157. package/src/styles/06-components/_components.card.scss +21 -2
  158. package/src/styles/06-components/_components.chart.scss +3 -2
  159. package/src/styles/06-components/_components.checkbox.scss +2 -1
  160. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -2
  161. package/src/styles/06-components/_components.countdown.scss +2 -1
  162. package/src/styles/06-components/_components.data-table.scss +7 -6
  163. package/src/styles/06-components/_components.datepicker.scss +20 -1
  164. package/src/styles/06-components/_components.dropdown.scss +11 -4
  165. package/src/styles/06-components/_components.edge-panel.scss +4 -3
  166. package/src/styles/06-components/_components.footer.scss +825 -0
  167. package/src/styles/06-components/_components.form-group.scss +1 -0
  168. package/src/styles/06-components/_components.hero.scss +4 -4
  169. package/src/styles/06-components/_components.image-gallery.scss +1 -0
  170. package/src/styles/06-components/_components.input.scss +33 -2
  171. package/src/styles/06-components/_components.list-group.scss +3 -2
  172. package/src/styles/06-components/_components.list.scss +2 -1
  173. package/src/styles/06-components/_components.menu.scss +5 -4
  174. package/src/styles/06-components/_components.messages.scss +8 -7
  175. package/src/styles/06-components/_components.modal.scss +3 -2
  176. package/src/styles/06-components/_components.nav.scss +6 -5
  177. package/src/styles/06-components/_components.navbar.scss +4 -3
  178. package/src/styles/06-components/_components.pagination.scss +2 -1
  179. package/src/styles/06-components/_components.photoviewer.scss +4 -3
  180. package/src/styles/06-components/_components.popover.scss +3 -2
  181. package/src/styles/06-components/_components.product-review.scss +3 -2
  182. package/src/styles/06-components/_components.progress.scss +3 -2
  183. package/src/styles/06-components/_components.river.scss +3 -2
  184. package/src/styles/06-components/_components.sectionintro.scss +2 -1
  185. package/src/styles/06-components/_components.select.scss +5 -4
  186. package/src/styles/06-components/_components.side-menu.scss +8 -7
  187. package/src/styles/06-components/_components.skeleton.scss +3 -2
  188. package/src/styles/06-components/_components.slider.scss +7 -6
  189. package/src/styles/06-components/_components.spinner.scss +1 -0
  190. package/src/styles/06-components/_components.steps.scss +3 -2
  191. package/src/styles/06-components/_components.tabs.scss +4 -3
  192. package/src/styles/06-components/_components.testimonials.scss +2 -1
  193. package/src/styles/06-components/_components.todo.scss +3 -2
  194. package/src/styles/06-components/_components.toggle.scss +5 -4
  195. package/src/styles/06-components/_components.tooltip.scss +3 -2
  196. package/src/styles/06-components/_components.upload.scss +4 -3
  197. package/src/styles/06-components/_components.video-player.scss +50 -27
  198. package/src/styles/06-components/_index.scss +2 -0
  199. package/src/styles/99-utilities/_utilities.glass-fixes.scss +48 -0
  200. package/dist/themes/yabai.css +0 -13711
  201. 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: React.FC<TextareaProps> = ({
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
- return (
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
- export type { TextareaProps };
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
- <div className={HERO.SELECTORS.CONTENT.replace('.', '')}>
101
- {subtitle && <p className={HERO.SELECTORS.SUBTITLE.replace('.', '')}>{subtitle}</p>}
102
- <h1 className={HERO.SELECTORS.TITLE.replace('.', '')}>{title}</h1>
103
- {text && <p className={HERO.SELECTORS.TEXT.replace('.', '')}>{text}</p>}
104
- {actions && <div className={HERO.SELECTORS.ACTIONS.replace('.', '')}>{actions}</div>}
105
- </div>
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
- {useGridLayout ? (
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
+ };