@shohojdhara/atomix 0.4.4 → 0.4.6
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 +50 -11
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +1 -1
- package/dist/atomix.min.css.map +1 -1
- package/dist/charts.js +184 -189
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +4 -4
- package/dist/core.js +194 -199
- package/dist/core.js.map +1 -1
- package/dist/forms.js +184 -189
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js +189 -194
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +44 -47
- package/dist/index.esm.js +496 -613
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +528 -631
- 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 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +8 -42
- 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/Breadcrumb/Breadcrumb.tsx +5 -5
- package/src/components/Breadcrumb/BreadcrumbCompound.test.tsx +2 -2
- package/src/components/Button/Button.tsx +6 -6
- package/src/components/Card/Card.tsx +3 -3
- package/src/components/Dropdown/Dropdown.tsx +5 -3
- package/src/components/Footer/Footer.tsx +124 -166
- package/src/components/Footer/FooterLink.tsx +16 -19
- package/src/components/Footer/FooterSection.tsx +40 -39
- package/src/components/Footer/FooterSocialLink.tsx +59 -58
- package/src/components/Footer/README.md +1 -1
- package/src/components/Hero/Hero.tsx +72 -142
- package/src/components/Navigation/Menu/MegaMenu.tsx +17 -12
- package/src/components/Navigation/Menu/Menu.tsx +49 -24
- package/src/components/Navigation/Nav/NavItem.tsx +5 -3
- package/src/components/Navigation/Navbar/Navbar.tsx +13 -5
- package/src/components/Navigation/SideMenu/SideMenu.tsx +2 -2
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -4
- package/src/components/Slider/Slider.tsx +7 -4
- 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/composables/useFooter.ts +117 -20
- package/src/lib/composables/useSlider.ts +3 -1
- package/src/lib/constants/components.ts +3 -1
- package/src/lib/types/components.ts +44 -12
- package/src/styles/06-components/_components.atomix-glass.scss +72 -14
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +0 -222
- 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
|
|
@@ -437,7 +466,6 @@ export function AtomixGlass({
|
|
|
437
466
|
effectiveWithoutEffects={effectiveWithoutEffects}
|
|
438
467
|
effectiveReducedMotion={effectiveReducedMotion}
|
|
439
468
|
shaderVariant={shaderVariant}
|
|
440
|
-
elasticity={elasticity}
|
|
441
469
|
withLiquidBlur={withLiquidBlur}
|
|
442
470
|
>
|
|
443
471
|
{children}
|
|
@@ -461,14 +489,7 @@ export function AtomixGlass({
|
|
|
461
489
|
<div className={ATOMIX_GLASS.BASE_LAYER_CLASS} />
|
|
462
490
|
<div className={ATOMIX_GLASS.OVERLAY_LAYER_CLASS} />
|
|
463
491
|
{/* Overlay highlight - opacity and background are dynamic, calculated inline */}
|
|
464
|
-
<div
|
|
465
|
-
className={ATOMIX_GLASS.OVERLAY_HIGHLIGHT_CLASS}
|
|
466
|
-
style={{
|
|
467
|
-
opacity:
|
|
468
|
-
opacityValues.over * ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.OPACITY_MULTIPLIER,
|
|
469
|
-
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}%)`,
|
|
470
|
-
}}
|
|
471
|
-
/>
|
|
492
|
+
<div className={ATOMIX_GLASS.OVERLAY_HIGHLIGHT_CLASS} />
|
|
472
493
|
</>
|
|
473
494
|
)}
|
|
474
495
|
{withBorder && (
|
|
@@ -91,7 +91,7 @@ interface AtomixGlassContainerProps {
|
|
|
91
91
|
effectiveReducedMotion?: boolean;
|
|
92
92
|
shaderVariant?: FragmentShaderType;
|
|
93
93
|
withLiquidBlur?: boolean;
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
contentRef?: React.RefObject<HTMLDivElement>;
|
|
96
96
|
children?: React.ReactNode;
|
|
97
97
|
}
|
|
@@ -129,7 +129,7 @@ export const AtomixGlassContainer = forwardRef<HTMLDivElement, AtomixGlassContai
|
|
|
129
129
|
effectiveReducedMotion = false,
|
|
130
130
|
shaderVariant = 'liquidGlass',
|
|
131
131
|
withLiquidBlur = false,
|
|
132
|
-
|
|
132
|
+
|
|
133
133
|
contentRef,
|
|
134
134
|
},
|
|
135
135
|
ref
|
|
@@ -489,21 +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
|
|
504
|
-
className={ATOMIX_GLASS.FILTER_CLASS}
|
|
505
|
-
style={{ zIndex: 1, position: 'absolute', inset: 0 }}
|
|
506
|
-
>
|
|
497
|
+
<div className={ATOMIX_GLASS.FILTER_CLASS}>
|
|
507
498
|
<GlassFilter
|
|
508
499
|
blurAmount={blurAmount}
|
|
509
500
|
mode={mode}
|
|
@@ -524,39 +515,14 @@ export const AtomixGlassContainer = forwardRef<HTMLDivElement, AtomixGlassContai
|
|
|
524
515
|
<div
|
|
525
516
|
ref={setForceNoTransition}
|
|
526
517
|
className={ATOMIX_GLASS.FILTER_OVERLAY_CLASS}
|
|
527
|
-
style={
|
|
528
|
-
{
|
|
529
|
-
|
|
530
|
-
backdropFilter: `var(--atomix-glass-container-backdrop)`,
|
|
531
|
-
borderRadius: `var(--atomix-glass-container-radius)`,
|
|
532
|
-
} as CSSProperties
|
|
533
|
-
}
|
|
534
|
-
/>
|
|
535
|
-
<div
|
|
536
|
-
className={ATOMIX_GLASS.FILTER_SHADOW_CLASS}
|
|
537
|
-
style={
|
|
538
|
-
{
|
|
539
|
-
boxShadow: `var(--atomix-glass-container-shadow)`,
|
|
540
|
-
opacity: `var(--atomix-glass-container-shadow-opacity)`,
|
|
541
|
-
background: `var(--atomix-glass-container-bg)`,
|
|
542
|
-
borderRadius: `var(--atomix-glass-container-radius)`,
|
|
543
|
-
} as CSSProperties
|
|
544
|
-
}
|
|
518
|
+
style={{
|
|
519
|
+
filter: `url(#${filterId})`,
|
|
520
|
+
}}
|
|
545
521
|
/>
|
|
522
|
+
<div className={ATOMIX_GLASS.FILTER_SHADOW_CLASS} />
|
|
546
523
|
</div>
|
|
547
524
|
|
|
548
|
-
<div
|
|
549
|
-
ref={contentRef}
|
|
550
|
-
className={ATOMIX_GLASS.CONTENT_CLASS}
|
|
551
|
-
style={
|
|
552
|
-
{
|
|
553
|
-
position: 'relative',
|
|
554
|
-
textShadow: `var(--atomix-glass-container-text-shadow)`,
|
|
555
|
-
// Ensure content is always above the filter layer (zIndex 1)
|
|
556
|
-
zIndex: elasticity > 0 ? 100 : 2,
|
|
557
|
-
} as CSSProperties
|
|
558
|
-
}
|
|
559
|
-
>
|
|
525
|
+
<div ref={contentRef} className={ATOMIX_GLASS.CONTENT_CLASS}>
|
|
560
526
|
{children}
|
|
561
527
|
</div>
|
|
562
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: {
|