@shohojdhara/atomix 0.4.5 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atomix.css +70 -33
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +2 -2
- package/dist/atomix.min.css.map +1 -1
- package/dist/charts.d.ts +93 -109
- package/dist/charts.js +273 -371
- package/dist/charts.js.map +1 -1
- package/dist/core.js +183 -184
- package/dist/core.js.map +1 -1
- package/dist/forms.js +183 -184
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js +183 -184
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +7 -51
- package/dist/index.esm.js +281 -470
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +287 -476
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
- package/src/components/AtomixGlass/AtomixGlass.tsx +60 -38
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +6 -35
- package/src/components/AtomixGlass/glass-utils.ts +27 -14
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +19 -21
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +1162 -515
- package/src/components/AtomixGlass/stories/shared-components.tsx +11 -3
- package/src/components/Chart/BubbleChart.tsx +6 -2
- package/src/components/Chart/Chart.stories.tsx +108 -96
- package/src/components/Chart/ChartToolbar.tsx +6 -4
- package/src/components/Chart/ChartTooltip.tsx +5 -4
- package/src/components/Chart/GaugeChart.tsx +20 -12
- package/src/components/Chart/HeatmapChart.tsx +53 -23
- package/src/components/Chart/TreemapChart.tsx +44 -15
- package/src/components/Chart/index.ts +0 -2
- package/src/components/Chart/types.ts +4 -4
- package/src/components/Navigation/Navbar/Navbar.tsx +13 -5
- package/src/components/index.ts +0 -1
- package/src/lib/composables/index.ts +1 -2
- package/src/lib/composables/useAtomixGlass.ts +246 -222
- package/src/lib/composables/useAtomixGlassStyles.ts +46 -23
- package/src/lib/constants/components.ts +3 -1
- package/src/styles/01-settings/_settings.chart.scss +13 -13
- package/src/styles/06-components/_components.atomix-glass.scss +45 -20
- package/src/styles/06-components/_components.chart.scss +23 -5
- package/src/components/Chart/AnimatedChart.tsx +0 -230
- package/src/lib/composables/atomix-glass/useGlassBackgroundDetection.ts +0 -329
- package/src/lib/composables/atomix-glass/useGlassCornerRadius.ts +0 -82
- package/src/lib/composables/atomix-glass/useGlassMouseTracking.ts +0 -153
- package/src/lib/composables/atomix-glass/useGlassOverLight.ts +0 -198
- package/src/lib/composables/atomix-glass/useGlassState.ts +0 -112
- package/src/lib/composables/atomix-glass/useGlassTransforms.ts +0 -160
- package/src/lib/composables/glass-styles.ts +0 -302
- package/src/lib/composables/useGlassContainer.ts +0 -177
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import React, { useMemo, useRef
|
|
2
|
-
import type { AtomixGlassProps
|
|
1
|
+
import React, { useMemo, useRef } from 'react';
|
|
2
|
+
import type { AtomixGlassProps } from '../../lib/types/components';
|
|
3
3
|
import { ATOMIX_GLASS } from '../../lib/constants/components';
|
|
4
4
|
import { AtomixGlassContainer } from './AtomixGlassContainer';
|
|
5
5
|
import { useAtomixGlass } from '../../lib/composables/useAtomixGlass';
|
|
@@ -155,20 +155,48 @@ export function AtomixGlass({
|
|
|
155
155
|
style,
|
|
156
156
|
});
|
|
157
157
|
|
|
158
|
-
|
|
159
|
-
// overLightConfig recalculates with hover/active states, but displacement should remain stable
|
|
160
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
161
|
-
const isOverLight = useMemo(() => overLightConfig?.isOverLight, [overLight]);
|
|
158
|
+
const isOverLight = useMemo(() => overLightConfig.isOverLight, [overLightConfig.isOverLight]);
|
|
162
159
|
|
|
163
160
|
const shouldRenderOverLightLayers = withOverLightLayers && isOverLight;
|
|
164
161
|
|
|
162
|
+
// ── Layout hoisting ──────────────────────────────────────────────────
|
|
163
|
+
// When position is fixed/sticky the layout props must live on the ROOT
|
|
164
|
+
// `.c-atomix-glass` element so that every decorative layer (borders,
|
|
165
|
+
// backgrounds, hover effects) stays in the same stacking context.
|
|
166
|
+
|
|
167
|
+
// Extract zIndex from style so it becomes the base for ALL internal
|
|
168
|
+
// layers via --atomix-glass-base-z-index. It must NOT be applied as a
|
|
169
|
+
// real z-index on the root element — that would break the glass effect.
|
|
170
|
+
const { zIndex: customZIndex, ...restStyle } = style;
|
|
171
|
+
const isFixedOrSticky = restStyle.position === 'fixed' || restStyle.position === 'sticky';
|
|
172
|
+
|
|
173
|
+
const rootLayoutStyle = useMemo<React.CSSProperties>(() => {
|
|
174
|
+
if (!isFixedOrSticky) return {};
|
|
175
|
+
const { position: p, top: t, left: l, right: r, bottom: b } = restStyle;
|
|
176
|
+
return {
|
|
177
|
+
...(p && { position: p }),
|
|
178
|
+
...(t !== undefined && { top: t }),
|
|
179
|
+
...(l !== undefined && { left: l }),
|
|
180
|
+
...(r !== undefined && { right: r }),
|
|
181
|
+
...(b !== undefined && { bottom: b }),
|
|
182
|
+
};
|
|
183
|
+
}, [isFixedOrSticky, restStyle]);
|
|
184
|
+
|
|
165
185
|
// Calculate base style with transforms
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
186
|
+
// When layout is hoisted to the root, strip those props from the container
|
|
187
|
+
const baseStyle = useMemo(() => {
|
|
188
|
+
if (isFixedOrSticky) {
|
|
189
|
+
const { position: _p, top: _t, left: _l, right: _r, bottom: _b, ...visualStyle } = restStyle;
|
|
190
|
+
return {
|
|
191
|
+
...visualStyle,
|
|
192
|
+
...(!effectiveWithoutEffects && { transform: transformStyle }),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
...restStyle,
|
|
197
|
+
...(!effectiveWithoutEffects && { transform: transformStyle }),
|
|
198
|
+
};
|
|
199
|
+
}, [isFixedOrSticky, restStyle, effectiveWithoutEffects, transformStyle]);
|
|
172
200
|
|
|
173
201
|
// Build className with state modifiers
|
|
174
202
|
const componentClassName = [
|
|
@@ -181,14 +209,17 @@ export function AtomixGlass({
|
|
|
181
209
|
.filter(Boolean)
|
|
182
210
|
.join(' ');
|
|
183
211
|
|
|
184
|
-
// Calculate position and size styles
|
|
212
|
+
// Calculate position and size styles for internal layers
|
|
213
|
+
// When root is fixed/sticky, internal layers use absolute (relative to root)
|
|
185
214
|
const positionStyles = useMemo(
|
|
186
215
|
() => ({
|
|
187
|
-
position: (
|
|
188
|
-
|
|
189
|
-
|
|
216
|
+
position: (isFixedOrSticky
|
|
217
|
+
? 'absolute'
|
|
218
|
+
: restStyle.position || 'absolute') as React.CSSProperties['position'],
|
|
219
|
+
top: isFixedOrSticky ? 0 : restStyle.top || 0,
|
|
220
|
+
left: isFixedOrSticky ? 0 : restStyle.left || 0,
|
|
190
221
|
}),
|
|
191
|
-
[
|
|
222
|
+
[isFixedOrSticky, restStyle.position, restStyle.top, restStyle.left]
|
|
192
223
|
);
|
|
193
224
|
|
|
194
225
|
const adjustedSize = useMemo(() => {
|
|
@@ -205,14 +236,14 @@ export function AtomixGlass({
|
|
|
205
236
|
};
|
|
206
237
|
|
|
207
238
|
return {
|
|
208
|
-
width: resolveSize(width,
|
|
209
|
-
height: resolveSize(height,
|
|
239
|
+
width: resolveSize(width, restStyle.width, glassSize.width),
|
|
240
|
+
height: resolveSize(height, restStyle.height, glassSize.height),
|
|
210
241
|
};
|
|
211
242
|
}, [
|
|
212
243
|
width,
|
|
213
244
|
height,
|
|
214
|
-
|
|
215
|
-
|
|
245
|
+
restStyle.width,
|
|
246
|
+
restStyle.height,
|
|
216
247
|
positionStyles.position,
|
|
217
248
|
glassSize.width,
|
|
218
249
|
glassSize.height,
|
|
@@ -304,6 +335,7 @@ export function AtomixGlass({
|
|
|
304
335
|
const configBorderOpacity = overLightConfig?.borderOpacity ?? 1;
|
|
305
336
|
|
|
306
337
|
return {
|
|
338
|
+
...(customZIndex !== undefined && { '--atomix-glass-base-z-index': customZIndex }),
|
|
307
339
|
'--atomix-glass-radius': `${effectiveBorderRadius}px`,
|
|
308
340
|
'--atomix-glass-transform': transformStyle || 'none',
|
|
309
341
|
'--atomix-glass-position': positionStyles.position,
|
|
@@ -335,6 +367,9 @@ export function AtomixGlass({
|
|
|
335
367
|
'--atomix-glass-overlay-gradient': isOverLight
|
|
336
368
|
? `radial-gradient(circle at ${basePosition.x}% ${basePosition.y}%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_START_BASE + absMx * ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_START_MULTIPLIER}) 0%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_MID_STOP}%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_END_BASE + absMy * ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_END_MULTIPLIER}) 100%)`
|
|
337
369
|
: `rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.WHITE_OPACITY})`,
|
|
370
|
+
'--atomix-glass-overlay-highlight-opacity':
|
|
371
|
+
opacityValues.over * ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.OPACITY_MULTIPLIER,
|
|
372
|
+
'--atomix-glass-overlay-highlight-bg': `radial-gradient(circle at ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.POSITION_X}% ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.POSITION_Y}%, rgba(255, 255, 255, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.WHITE_OPACITY}) 0%, transparent ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.STOP}%)`,
|
|
338
373
|
} as React.CSSProperties;
|
|
339
374
|
}, [
|
|
340
375
|
gradientValues,
|
|
@@ -345,6 +380,7 @@ export function AtomixGlass({
|
|
|
345
380
|
adjustedSize,
|
|
346
381
|
isOverLight,
|
|
347
382
|
overLightConfig.borderOpacity,
|
|
383
|
+
customZIndex,
|
|
348
384
|
]);
|
|
349
385
|
|
|
350
386
|
// Helper function to render background layers
|
|
@@ -361,13 +397,6 @@ export function AtomixGlass({
|
|
|
361
397
|
]
|
|
362
398
|
.filter(Boolean)
|
|
363
399
|
.join(' ')}
|
|
364
|
-
style={{
|
|
365
|
-
...positionStyles,
|
|
366
|
-
height: adjustedSize.height,
|
|
367
|
-
width: adjustedSize.width,
|
|
368
|
-
borderRadius: `${effectiveBorderRadius}px`,
|
|
369
|
-
transform: baseStyle.transform,
|
|
370
|
-
}}
|
|
371
400
|
/>
|
|
372
401
|
);
|
|
373
402
|
|
|
@@ -375,7 +404,7 @@ export function AtomixGlass({
|
|
|
375
404
|
<div
|
|
376
405
|
{...rest}
|
|
377
406
|
className={componentClassName}
|
|
378
|
-
style={glassVars}
|
|
407
|
+
style={{ ...glassVars }}
|
|
379
408
|
role={role || (onClick ? 'button' : undefined)}
|
|
380
409
|
tabIndex={onClick ? (tabIndex ?? 0) : tabIndex}
|
|
381
410
|
aria-label={ariaLabel}
|
|
@@ -388,7 +417,7 @@ export function AtomixGlass({
|
|
|
388
417
|
ref={glassRef}
|
|
389
418
|
contentRef={contentRef}
|
|
390
419
|
className={className}
|
|
391
|
-
style={
|
|
420
|
+
style={rootLayoutStyle}
|
|
392
421
|
borderRadius={effectiveBorderRadius}
|
|
393
422
|
displacementScale={
|
|
394
423
|
effectiveWithoutEffects
|
|
@@ -460,14 +489,7 @@ export function AtomixGlass({
|
|
|
460
489
|
<div className={ATOMIX_GLASS.BASE_LAYER_CLASS} />
|
|
461
490
|
<div className={ATOMIX_GLASS.OVERLAY_LAYER_CLASS} />
|
|
462
491
|
{/* Overlay highlight - opacity and background are dynamic, calculated inline */}
|
|
463
|
-
<div
|
|
464
|
-
className={ATOMIX_GLASS.OVERLAY_HIGHLIGHT_CLASS}
|
|
465
|
-
style={{
|
|
466
|
-
opacity:
|
|
467
|
-
opacityValues.over * ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.OPACITY_MULTIPLIER,
|
|
468
|
-
background: `radial-gradient(circle at ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.POSITION_X}% ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.POSITION_Y}%, rgba(255, 255, 255, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.WHITE_OPACITY}) 0%, transparent ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.STOP}%)`,
|
|
469
|
-
}}
|
|
470
|
-
/>
|
|
492
|
+
<div className={ATOMIX_GLASS.OVERLAY_HIGHLIGHT_CLASS} />
|
|
471
493
|
</>
|
|
472
494
|
)}
|
|
473
495
|
{withBorder && (
|
|
@@ -489,18 +489,12 @@ export const AtomixGlassContainer = forwardRef<HTMLDivElement, AtomixGlassContai
|
|
|
489
489
|
>
|
|
490
490
|
<div
|
|
491
491
|
className={ATOMIX_GLASS.INNER_CLASS}
|
|
492
|
-
style={
|
|
493
|
-
{
|
|
494
|
-
padding: `var(--atomix-glass-container-padding)`,
|
|
495
|
-
boxShadow: `var(--atomix-glass-container-box-shadow)`,
|
|
496
|
-
} as CSSProperties
|
|
497
|
-
}
|
|
498
492
|
onMouseEnter={onMouseEnter}
|
|
499
493
|
onMouseLeave={onMouseLeave}
|
|
500
494
|
onMouseDown={onMouseDown}
|
|
501
495
|
onMouseUp={onMouseUp}
|
|
502
496
|
>
|
|
503
|
-
<div className={ATOMIX_GLASS.FILTER_CLASS}
|
|
497
|
+
<div className={ATOMIX_GLASS.FILTER_CLASS}>
|
|
504
498
|
<GlassFilter
|
|
505
499
|
blurAmount={blurAmount}
|
|
506
500
|
mode={mode}
|
|
@@ -521,37 +515,14 @@ export const AtomixGlassContainer = forwardRef<HTMLDivElement, AtomixGlassContai
|
|
|
521
515
|
<div
|
|
522
516
|
ref={setForceNoTransition}
|
|
523
517
|
className={ATOMIX_GLASS.FILTER_OVERLAY_CLASS}
|
|
524
|
-
style={
|
|
525
|
-
{
|
|
526
|
-
|
|
527
|
-
backdropFilter: `var(--atomix-glass-container-backdrop)`,
|
|
528
|
-
borderRadius: `var(--atomix-glass-container-radius)`,
|
|
529
|
-
} as CSSProperties
|
|
530
|
-
}
|
|
531
|
-
/>
|
|
532
|
-
<div
|
|
533
|
-
className={ATOMIX_GLASS.FILTER_SHADOW_CLASS}
|
|
534
|
-
style={
|
|
535
|
-
{
|
|
536
|
-
boxShadow: `var(--atomix-glass-container-shadow)`,
|
|
537
|
-
opacity: `var(--atomix-glass-container-shadow-opacity)`,
|
|
538
|
-
background: `var(--atomix-glass-container-bg)`,
|
|
539
|
-
borderRadius: `var(--atomix-glass-container-radius)`,
|
|
540
|
-
} as CSSProperties
|
|
541
|
-
}
|
|
518
|
+
style={{
|
|
519
|
+
filter: `url(#${filterId})`,
|
|
520
|
+
}}
|
|
542
521
|
/>
|
|
522
|
+
<div className={ATOMIX_GLASS.FILTER_SHADOW_CLASS} />
|
|
543
523
|
</div>
|
|
544
524
|
|
|
545
|
-
<div
|
|
546
|
-
ref={contentRef}
|
|
547
|
-
className={ATOMIX_GLASS.CONTENT_CLASS}
|
|
548
|
-
style={
|
|
549
|
-
{
|
|
550
|
-
position: 'relative',
|
|
551
|
-
textShadow: `var(--atomix-glass-container-text-shadow)`,
|
|
552
|
-
} as CSSProperties
|
|
553
|
-
}
|
|
554
|
-
>
|
|
525
|
+
<div ref={contentRef} className={ATOMIX_GLASS.CONTENT_CLASS}>
|
|
555
526
|
{children}
|
|
556
527
|
</div>
|
|
557
528
|
</div>
|
|
@@ -51,21 +51,8 @@ export const calculateMouseInfluence = (mouseOffset: MousePosition): number => {
|
|
|
51
51
|
return Math.min(0.8, influence); // Tighter cap to prevent blur/filter blow-out
|
|
52
52
|
};
|
|
53
53
|
|
|
54
|
-
/**
|
|
55
|
-
* Calculate overlight intensity based on background and mouse position
|
|
56
|
-
*/
|
|
57
|
-
export const calculateOverLightIntensity = (
|
|
58
|
-
mouseOffset: MousePosition,
|
|
59
|
-
baseIntensity: number
|
|
60
|
-
): number => {
|
|
61
|
-
if (!mouseOffset || typeof mouseOffset.x !== 'number' || typeof mouseOffset.y !== 'number') {
|
|
62
|
-
return baseIntensity;
|
|
63
|
-
}
|
|
64
54
|
|
|
65
|
-
|
|
66
|
-
const mouseInfluence = calculateMouseInfluence(mouseOffset);
|
|
67
|
-
return Math.min(1.0, baseIntensity * (1 + mouseInfluence * 0.3));
|
|
68
|
-
};
|
|
55
|
+
|
|
69
56
|
|
|
70
57
|
/**
|
|
71
58
|
* Clamp blur value to minimum and maximum with overlight consideration
|
|
@@ -238,6 +225,32 @@ export const extractBorderRadiusFromChildren = (children: React.ReactNode): numb
|
|
|
238
225
|
return CONSTANTS.DEFAULT_CORNER_RADIUS;
|
|
239
226
|
};
|
|
240
227
|
|
|
228
|
+
/**
|
|
229
|
+
* Smoothstep interpolation — hermite S-curve
|
|
230
|
+
* Creates a smooth ease-in / ease-out transition from 0 to 1.
|
|
231
|
+
* `t` is clamped to [0, 1] before evaluation.
|
|
232
|
+
*/
|
|
233
|
+
export const smoothstep = (t: number): number => {
|
|
234
|
+
const clamped = Math.max(0, Math.min(1, t));
|
|
235
|
+
return clamped * clamped * (3 - 2 * clamped);
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Linear interpolation between `a` and `b` by factor `t` ∈ [0, 1]
|
|
240
|
+
*/
|
|
241
|
+
export const lerp = (a: number, b: number, t: number): number => {
|
|
242
|
+
return a + (b - a) * t;
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Soft clamp — exponentially approaches `max` without a hard cutoff.
|
|
247
|
+
* Gives a natural deceleration curve near the limit.
|
|
248
|
+
*/
|
|
249
|
+
export const softClamp = (value: number, max: number): number => {
|
|
250
|
+
if (max <= 0) return 0;
|
|
251
|
+
return max * (1 - Math.exp(-value / max));
|
|
252
|
+
};
|
|
253
|
+
|
|
241
254
|
/**
|
|
242
255
|
* Get displacement map URL based on mode
|
|
243
256
|
*/
|
|
@@ -272,9 +272,9 @@ type Story = StoryObj<typeof meta>;
|
|
|
272
272
|
export const BasicUsage: Story = {
|
|
273
273
|
args: {
|
|
274
274
|
children: (
|
|
275
|
-
<div className="u-text-center">
|
|
276
|
-
<h2 className="u-mb-4 u-mt-0 u-text-white u-
|
|
277
|
-
<p className="u-mb-6 u-mt-0 u-text-white u-opacity-90">
|
|
275
|
+
<div className="u-text-center u-flex u-flex-column u-items-center u-justify-center">
|
|
276
|
+
<h2 className="u-mb-4 u-mt-0 u-text-white u-fs-2xl u-font-bold">Basic Glass Effect</h2>
|
|
277
|
+
<p className="u-mb-6 u-mt-0 u-text-white u-opacity-90 u-fs-base">
|
|
278
278
|
This is a basic AtomixGlass component with default settings.
|
|
279
279
|
</p>
|
|
280
280
|
<Button variant="primary" glass>
|
|
@@ -284,15 +284,13 @@ export const BasicUsage: Story = {
|
|
|
284
284
|
),
|
|
285
285
|
padding: '32px', // Increased padding for better visual appearance
|
|
286
286
|
},
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
<
|
|
290
|
-
<
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
</div>
|
|
295
|
-
),
|
|
287
|
+
decorators: [
|
|
288
|
+
Story => (
|
|
289
|
+
<BackgroundWrapper backgroundImage={backgroundImages[2]} overlay overlayOpacity={0.2}>
|
|
290
|
+
<Story />
|
|
291
|
+
</BackgroundWrapper>
|
|
292
|
+
),
|
|
293
|
+
],
|
|
296
294
|
parameters: {
|
|
297
295
|
docs: {
|
|
298
296
|
description: {
|
|
@@ -306,8 +304,8 @@ export const WithAllProps: Story = {
|
|
|
306
304
|
args: {
|
|
307
305
|
children: (
|
|
308
306
|
<div className="u-text-center">
|
|
309
|
-
<h2 className="u-mb-4 u-mt-0 u-text-white u-
|
|
310
|
-
<p className="u-mb-6 u-mt-0 u-text-white u-opacity-90 u-
|
|
307
|
+
<h2 className="u-mb-4 u-mt-0 u-text-white u-fs-2xl u-font-bold">Fully Configured Glass</h2>
|
|
308
|
+
<p className="u-mb-6 u-mt-0 u-text-white u-opacity-90 u-fs-base">
|
|
311
309
|
This glass component uses all configurable properties.
|
|
312
310
|
</p>
|
|
313
311
|
<div className="u-flex u-gap-4 u-justify-center">
|
|
@@ -331,13 +329,13 @@ export const WithAllProps: Story = {
|
|
|
331
329
|
padding: '32px', // Increased padding for better visual appearance
|
|
332
330
|
onClick: mockHandlers.onClick,
|
|
333
331
|
},
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
<
|
|
337
|
-
<
|
|
338
|
-
</
|
|
339
|
-
|
|
340
|
-
|
|
332
|
+
decorators: [
|
|
333
|
+
Story => (
|
|
334
|
+
<BackgroundWrapper backgroundImage={backgroundImages[0]} overlay overlayOpacity={0.3}>
|
|
335
|
+
<Story />
|
|
336
|
+
</BackgroundWrapper>
|
|
337
|
+
),
|
|
338
|
+
],
|
|
341
339
|
parameters: {
|
|
342
340
|
docs: {
|
|
343
341
|
description: {
|