@shohojdhara/atomix 0.3.14 → 0.3.15
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/CHANGELOG.md +20 -0
- package/build-tools/EXAMPLES.md +372 -0
- package/build-tools/README.md +242 -0
- package/build-tools/__tests__/error-handler.test.js +230 -0
- package/build-tools/__tests__/index.test.js +141 -0
- package/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/build-tools/__tests__/utils.test.js +161 -0
- package/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/build-tools/error-handler.js +308 -0
- package/build-tools/index.d.ts +43 -0
- package/build-tools/index.js +88 -0
- package/build-tools/package.json +67 -0
- package/build-tools/rollup-plugin.js +236 -0
- package/build-tools/types.d.ts +163 -0
- package/build-tools/utils.js +203 -0
- package/build-tools/vite-plugin.js +161 -0
- package/build-tools/webpack-loader.js +123 -0
- package/dist/atomix.css +203 -90
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +3 -3
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/EXAMPLES.md +372 -0
- package/dist/build-tools/README.md +242 -0
- package/dist/build-tools/__tests__/error-handler.test.js +230 -0
- package/dist/build-tools/__tests__/index.test.js +141 -0
- package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/dist/build-tools/__tests__/utils.test.js +161 -0
- package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/dist/build-tools/error-handler.js +308 -0
- package/dist/build-tools/index.d.ts +43 -0
- package/dist/build-tools/index.js +88 -0
- package/dist/build-tools/package.json +67 -0
- package/dist/build-tools/rollup-plugin.js +236 -0
- package/dist/build-tools/types.d.ts +163 -0
- package/dist/build-tools/utils.js +203 -0
- package/dist/build-tools/vite-plugin.js +161 -0
- package/dist/build-tools/webpack-loader.js +123 -0
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +86 -57
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +136 -112
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +2 -5
- package/dist/forms.js +140 -128
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +136 -112
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +9 -61
- package/dist/index.esm.js +237 -286
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +250 -299
- 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 +23 -8
- package/scripts/atomix-cli.js +170 -73
- package/scripts/cli/__tests__/README.md +81 -0
- package/scripts/cli/__tests__/basic.test.js +115 -0
- package/scripts/cli/__tests__/component-generator.test.js +332 -0
- package/scripts/cli/__tests__/integration.test.js +327 -0
- package/scripts/cli/__tests__/test-setup.js +133 -0
- package/scripts/cli/__tests__/token-manager.test.js +251 -0
- package/scripts/cli/__tests__/utils.test.js +161 -0
- package/scripts/cli/component-generator.js +253 -299
- package/scripts/cli/dependency-checker.js +355 -0
- package/scripts/cli/interactive-init.js +46 -5
- package/scripts/cli/template-manager.js +0 -2
- package/scripts/cli/templates/common-templates.js +636 -0
- package/scripts/cli/templates/composable-templates.js +148 -126
- package/scripts/cli/templates/index.js +23 -16
- package/scripts/cli/templates/project-templates.js +151 -23
- package/scripts/cli/templates/react-templates.js +280 -210
- package/scripts/cli/templates/scss-templates.js +90 -91
- package/scripts/cli/templates/testing-templates.js +206 -27
- package/scripts/cli/templates/testing-utils.js +278 -0
- package/scripts/cli/templates/types-templates.js +70 -56
- package/scripts/cli/theme-bridge.js +8 -2
- package/scripts/cli/token-manager.js +318 -206
- package/scripts/cli/utils.js +0 -1
- package/src/components/Accordion/Accordion.stories.tsx +369 -870
- package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
- package/src/components/AtomixGlass/glass-utils.ts +2 -2
- package/src/components/AtomixGlass/shader-utils.ts +5 -0
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +50 -35
- package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +1 -1
- package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
- package/src/components/Avatar/Avatar.stories.tsx +213 -1
- package/src/components/Badge/Badge.stories.tsx +121 -362
- package/src/components/Block/Block.stories.tsx +21 -12
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +141 -23
- package/src/components/Button/Button.stories.tsx +463 -1126
- package/src/components/Button/Button.test.tsx +107 -0
- package/src/components/Button/Button.tsx +46 -50
- package/src/components/Button/ButtonGroup.stories.tsx +373 -217
- package/src/components/Callout/Callout.stories.tsx +289 -634
- package/src/components/Card/Card.stories.tsx +248 -68
- package/src/components/Chart/Chart.stories.tsx +150 -8
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +151 -69
- package/src/components/Countdown/Countdown.stories.tsx +115 -8
- package/src/components/DataTable/DataTable.stories.tsx +346 -146
- package/src/components/DatePicker/DatePicker.stories.tsx +325 -1066
- package/src/components/Dropdown/Dropdown.stories.tsx +153 -33
- package/src/components/EdgePanel/EdgePanel.stories.tsx +230 -21
- package/src/components/Footer/Footer.stories.tsx +392 -328
- package/src/components/Form/Checkbox.stories.tsx +140 -6
- package/src/components/Form/Checkbox.test.tsx +63 -0
- package/src/components/Form/Checkbox.tsx +87 -51
- package/src/components/Form/Form.stories.tsx +119 -20
- package/src/components/Form/FormGroup.stories.tsx +127 -4
- package/src/components/Form/Radio.stories.tsx +140 -5
- package/src/components/Form/Select.stories.tsx +140 -8
- package/src/components/Form/Textarea.stories.tsx +149 -6
- package/src/components/Hero/Hero.stories.tsx +333 -32
- package/src/components/List/List.stories.tsx +141 -3
- package/src/components/Modal/Modal.stories.tsx +181 -42
- package/src/components/Popover/Popover.stories.tsx +448 -98
- package/src/components/Progress/Progress.stories.tsx +167 -5
- package/src/components/River/River.stories.tsx +1 -1
- package/src/components/SectionIntro/SectionIntro.stories.tsx +240 -48
- package/src/components/Spinner/Spinner.stories.tsx +102 -8
- package/src/components/Steps/Steps.stories.tsx +172 -43
- package/src/components/Tabs/Tabs.stories.tsx +136 -10
- package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
- package/src/components/Todo/Todo.stories.tsx +198 -9
- package/src/components/Toggle/Toggle.stories.tsx +126 -39
- package/src/components/Tooltip/Tooltip.stories.tsx +194 -104
- package/src/components/Upload/Upload.stories.tsx +113 -24
- package/src/lib/README.md +2 -2
- package/src/lib/__tests__/theme-tools.test.ts +193 -0
- package/src/lib/composables/index.ts +2 -2
- package/src/lib/composables/useAtomixGlass.ts +28 -56
- package/src/lib/composables/useChartExport.ts +2 -7
- package/src/lib/composables/useDataTable.ts +46 -29
- package/src/lib/constants/components.ts +9 -32
- package/src/lib/theme/devtools/CLI.ts +1 -1
- package/src/lib/types/components.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +45 -0
- package/src/lib/utils/csv.ts +17 -0
- package/src/lib/utils/dataTableExport.ts +1 -10
- package/src/styles/01-settings/_index.scss +2 -1
- package/src/styles/01-settings/_settings.accordion.scss +28 -7
- package/src/styles/01-settings/_settings.colors.scss +11 -11
- package/src/styles/01-settings/_settings.typography.scss +5 -5
- package/src/styles/02-tools/_tools.utility-api.scss +14 -0
- package/src/styles/06-components/_components.accordion.scss +56 -14
- package/src/styles/06-components/_components.checkbox.scss +23 -17
- package/src/styles/99-utilities/_index.scss +2 -0
- package/src/styles/99-utilities/_utilities.scss +3 -1
- package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
- package/themes/dark-complementary/README.md +98 -0
- package/themes/dark-complementary/index.scss +158 -0
- package/themes/default-light/README.md +81 -0
- package/themes/default-light/index.scss +154 -0
- package/themes/high-contrast/README.md +105 -0
- package/themes/high-contrast/index.scss +172 -0
- package/themes/test-theme/README.md +38 -0
- package/themes/test-theme/index.scss +47 -0
- package/scripts/cli/templates-original-backup.js +0 -1655
- package/scripts/cli/templates_backup.js +0 -684
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
- package/src/lib/composables/useButton.ts +0 -93
- package/src/lib/composables/useCheckbox.ts +0 -70
package/dist/forms.d.ts
CHANGED
|
@@ -347,7 +347,7 @@ interface AtomixGlassProps {
|
|
|
347
347
|
/**
|
|
348
348
|
* Shader variant for shader mode
|
|
349
349
|
*/
|
|
350
|
-
shaderVariant?: 'liquidGlass' | 'premiumGlass';
|
|
350
|
+
shaderVariant?: 'liquidGlass' | 'premiumGlass' | 'appleFluid' | 'liquidMetal' | 'plasma' | 'waves' | 'noise';
|
|
351
351
|
/**
|
|
352
352
|
* Accessibility props
|
|
353
353
|
*/
|
|
@@ -1063,10 +1063,7 @@ interface TextareaProps extends BaseComponentProps {
|
|
|
1063
1063
|
fullWidth?: boolean;
|
|
1064
1064
|
}
|
|
1065
1065
|
|
|
1066
|
-
|
|
1067
|
-
* Checkbox - A component for checkbox inputs
|
|
1068
|
-
*/
|
|
1069
|
-
declare const Checkbox: React$1.FC<CheckboxProps>;
|
|
1066
|
+
declare const Checkbox: React$1.MemoExoticComponent<React$1.ForwardRefExoticComponent<CheckboxProps & React$1.RefAttributes<HTMLInputElement>>>;
|
|
1070
1067
|
|
|
1071
1068
|
/**
|
|
1072
1069
|
* Form - A component for creating form layouts
|
package/dist/forms.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
2
|
|
|
3
|
-
import React, {
|
|
3
|
+
import React, { memo, forwardRef, useMemo, useState, useRef, useEffect, useCallback, useImperativeHandle } from "react";
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Default theme colors for components
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Form-specific constants
|
|
10
|
+
*/ const FORM_CLASSES_BASE = "c-form", FORM_CLASSES_DISABLED = "c-form--disabled", FORM_GROUP_CLASSES_BASE = "c-form-group", FORM_GROUP_CLASSES_SMALL = "c-form-group--sm", FORM_GROUP_CLASSES_LARGE = "c-form-group--lg", FORM_GROUP_CLASSES_INVALID = "c-form-group--invalid", FORM_GROUP_CLASSES_VALID = "c-form-group--valid", FORM_GROUP_CLASSES_DISABLED = "c-form-group--disabled", INPUT_CLASSES_BASE = "c-input", INPUT_CLASSES_SMALL = "c-input--sm", INPUT_CLASSES_LARGE = "c-input--lg", INPUT_CLASSES_INVALID = "is-invalid", INPUT_CLASSES_VALID = "is-valid", INPUT_CLASSES_DISABLED = "is-disabled", INPUT_CLASSES_FULL_WIDTH = "c-input--full-width", INPUT_CLASSES_PREFIX_ICON = "c-input--prefix-icon", INPUT_CLASSES_SUFFIX_ICON = "c-input--suffix-icon", INPUT_CLASSES_CLEARABLE = "c-input--clearable", INPUT_CLASSES_WITH_COUNTER = "c-input--with-counter", INPUT_CLASSES_PASSWORD_TOGGLE = "c-input--password-toggle", INPUT_ELEMENTS_WRAPPER = "c-input-wrapper", RADIO_CLASSES_BASE = "c-radio", RADIO_CLASSES_INVALID = "is-error", RADIO_CLASSES_VALID = "is-valid", RADIO_CLASSES_DISABLED = "is-disabled", SELECT_CLASSES_BASE = "c-select", SELECT_CLASSES_SELECTED = "c-select__selected", SELECT_CLASSES_SELECT_BODY = "c-select__body", SELECT_CLASSES_SELECT_PANEL = "c-select__panel", SELECT_CLASSES_SELECT_ITEMS = "c-select__items", SELECT_CLASSES_SELECT_ITEM = "c-select__item", SELECT_CLASSES_TOGGLE_ICON = "c-select__toggle-icon", SELECT_CLASSES_ICON_CARET = "icon-atomix-caret-down", SELECT_CLASSES_SMALL = "c-select--sm", SELECT_CLASSES_LARGE = "c-select--lg", SELECT_CLASSES_INVALID = "is-invalid", SELECT_CLASSES_VALID = "is-valid", SELECT_CLASSES_DISABLED = "is-disabled", SELECT_CLASSES_IS_OPEN = "is-open", TEXTAREA_CLASSES_BASE = "c-input c-input--textarea", TEXTAREA_CLASSES_SMALL = "c-input--sm", TEXTAREA_CLASSES_LARGE = "c-input--lg", TEXTAREA_CLASSES_INVALID = "is-invalid", TEXTAREA_CLASSES_VALID = "is-valid", TEXTAREA_CLASSES_DISABLED = "is-disabled", ATOMIX_GLASS = {
|
|
7
11
|
BASE_CLASS: "c-atomix-glass",
|
|
8
12
|
CONTAINER_CLASS: "c-atomix-glass__container",
|
|
9
13
|
INNER_CLASS: "c-atomix-glass__inner",
|
|
@@ -58,10 +62,16 @@ const FORM_CLASSES_BASE = "c-form", FORM_CLASSES_DISABLED = "c-form--disabled",
|
|
|
58
62
|
MIN_BLUR: .1,
|
|
59
63
|
MOUSE_INFLUENCE_DIVISOR: 100,
|
|
60
64
|
EDGE_FADE_PIXELS: 2,
|
|
65
|
+
// Note: This default must match the SCSS variable --atomix-radius-md
|
|
66
|
+
// @see src/styles/01-settings/_settings.global.scss
|
|
61
67
|
DEFAULT_CORNER_RADIUS: 16,
|
|
62
|
-
// Fallback value matching design system
|
|
63
68
|
MAX_SIZE: 4096,
|
|
64
69
|
// Maximum width/height for glass size
|
|
70
|
+
// Palette for internal calculations (matches design system base colors)
|
|
71
|
+
PALETTE: {
|
|
72
|
+
WHITE: "255, 255, 255",
|
|
73
|
+
BLACK: "0, 0, 0"
|
|
74
|
+
},
|
|
65
75
|
// Gradient calculation constants
|
|
66
76
|
GRADIENT: {
|
|
67
77
|
BASE_ANGLE: 135,
|
|
@@ -220,10 +230,10 @@ const FORM_CLASSES_BASE = "c-form", FORM_CLASSES_DISABLED = "c-form--disabled",
|
|
|
220
230
|
y: 0
|
|
221
231
|
}, calculateMouseInfluence = mouseOffset => {
|
|
222
232
|
if (!mouseOffset || "number" != typeof mouseOffset.x || "number" != typeof mouseOffset.y) return 0;
|
|
223
|
-
//
|
|
233
|
+
// Bounded calculation — keeps the glass effect subtle and stable
|
|
224
234
|
const influence = Math.sqrt(mouseOffset.x * mouseOffset.x + mouseOffset.y * mouseOffset.y) / CONSTANTS$1.MOUSE_INFLUENCE_DIVISOR;
|
|
225
|
-
return Math.min(
|
|
226
|
-
//
|
|
235
|
+
return Math.min(.8, influence);
|
|
236
|
+
// Tighter cap to prevent blur/filter blow-out
|
|
227
237
|
}, clampBlur = value => "number" != typeof value || isNaN(value) ? CONSTANTS$1.MIN_BLUR : Math.max(CONSTANTS$1.MIN_BLUR, Math.min(50, value)), validateGlassSize = size => size && "number" == typeof size.width && "number" == typeof size.height && size.width > 0 && size.height > 0 && size.width <= CONSTANTS$1.MAX_SIZE && size.height <= CONSTANTS$1.MAX_SIZE, parseBorderRadiusValue = value => {
|
|
228
238
|
if ("number" == typeof value) return Math.max(0, value);
|
|
229
239
|
if ("string" != typeof value || !value.trim()) return CONSTANTS$1.DEFAULT_CORNER_RADIUS;
|
|
@@ -438,9 +448,7 @@ const FORM_CLASSES_BASE = "c-form", FORM_CLASSES_DISABLED = "c-form--disabled",
|
|
|
438
448
|
});
|
|
439
449
|
|
|
440
450
|
/**
|
|
441
|
-
*
|
|
442
|
-
* @param initialProps - Initial checkbox properties
|
|
443
|
-
* @returns Checkbox state and methods
|
|
451
|
+
* Form Group-specific constants
|
|
444
452
|
*/ GlassFilterComponent.displayName = "GlassFilter";
|
|
445
453
|
|
|
446
454
|
// Memoize component to prevent unnecessary re-renders
|
|
@@ -456,7 +464,7 @@ const sharedShaderCache = new Map, AtomixGlassContainer = forwardRef((({childre
|
|
|
456
464
|
}, globalMousePosition: globalMousePosition = {
|
|
457
465
|
x: 0,
|
|
458
466
|
y: 0
|
|
459
|
-
}, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onMouseUp: onMouseUp,
|
|
467
|
+
}, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onMouseUp: onMouseUp, isHovered: isHovered = !1, isActive: isActive = !1, overLight: overLight = !1, overLightConfig: overLightConfig = {}, cornerRadius: cornerRadius = 0, padding: padding = "0 0", glassSize: glassSize = {
|
|
460
468
|
width: 0,
|
|
461
469
|
height: 0
|
|
462
470
|
}, onClick: onClick, mode: mode = "standard", effectiveDisableEffects: effectiveDisableEffects = !1, effectiveReducedMotion: effectiveReducedMotion = !1, shaderVariant: shaderVariant = "liquidGlass", enableLiquidBlur: enableLiquidBlur = !1, elasticity: elasticity = 0, contentRef: contentRef}, ref) => {
|
|
@@ -569,28 +577,29 @@ const sharedShaderCache = new Map, AtomixGlassContainer = forwardRef((({childre
|
|
|
569
577
|
flowBlur: 1.2 * blurAmount
|
|
570
578
|
};
|
|
571
579
|
// Enhanced validation for liquid blur
|
|
572
|
-
if (!enableLiquidBlur || !rectCache || !
|
|
580
|
+
if (!enableLiquidBlur || !rectCache || !mouseOffset || "number" != typeof mouseOffset.x || "number" != typeof mouseOffset.y || isNaN(mouseOffset.x) || isNaN(mouseOffset.y)) return defaultBlur;
|
|
573
581
|
try {
|
|
574
|
-
|
|
575
|
-
|
|
582
|
+
const mouseInfluence = calculateMouseInfluence(mouseOffset), maxBlur = 2 * blurAmount, baseBlur = Math.min(maxBlur, blurAmount + mouseInfluence * blurAmount * .15), edgeIntensity = .15 * mouseInfluence, edgeBlur = Math.min(maxBlur, baseBlur * (.8 + .4 * edgeIntensity)), centerIntensity = .1 * mouseInfluence, centerBlur = Math.min(maxBlur, baseBlur * (.3 + .3 * centerIntensity)), flowBlur = Math.min(maxBlur, 1.2 * baseBlur);
|
|
583
|
+
// NOTE: hover/active multipliers intentionally omitted here —
|
|
584
|
+
// they belong on opacity layers, not the blur filter itself.
|
|
576
585
|
return {
|
|
577
|
-
baseBlur: clampBlur(baseBlur
|
|
578
|
-
edgeBlur: clampBlur(edgeBlur
|
|
579
|
-
centerBlur: clampBlur(centerBlur
|
|
580
|
-
flowBlur: clampBlur(flowBlur
|
|
586
|
+
baseBlur: clampBlur(baseBlur),
|
|
587
|
+
edgeBlur: clampBlur(edgeBlur),
|
|
588
|
+
centerBlur: clampBlur(centerBlur),
|
|
589
|
+
flowBlur: clampBlur(flowBlur)
|
|
581
590
|
};
|
|
582
591
|
} catch (error) {
|
|
583
592
|
return console.warn("AtomixGlassContainer: Error calculating liquid blur", error),
|
|
584
593
|
defaultBlur;
|
|
585
594
|
}
|
|
586
|
-
}), [ enableLiquidBlur, blurAmount,
|
|
595
|
+
}), [ enableLiquidBlur, blurAmount, mouseOffset, rectCache ]), backdropStyle = useMemo((() => {
|
|
587
596
|
try {
|
|
588
597
|
const dynamicSaturation = saturation + 20 * (liquidBlur.baseBlur || 0), validatedBaseBlur = "number" != typeof liquidBlur.baseBlur || isNaN(liquidBlur.baseBlur) ? 0 : liquidBlur.baseBlur, validatedEdgeBlur = "number" != typeof liquidBlur.edgeBlur || isNaN(liquidBlur.edgeBlur) ? 0 : liquidBlur.edgeBlur, validatedCenterBlur = "number" != typeof liquidBlur.centerBlur || isNaN(liquidBlur.centerBlur) ? 0 : liquidBlur.centerBlur, validatedFlowBlur = "number" != typeof liquidBlur.flowBlur || isNaN(liquidBlur.flowBlur) ? 0 : liquidBlur.flowBlur, area = rectCache ? rectCache.width * rectCache.height : 0;
|
|
589
598
|
// Validate blur values before using them
|
|
590
599
|
return !enableLiquidBlur || effectiveReducedMotion || effectiveDisableEffects || area > 18e4 ? {
|
|
591
|
-
backdropFilter: `blur(${clampBlur(Math.max(validatedBaseBlur, .8 * validatedEdgeBlur, 1.1 * validatedCenterBlur, .9 * validatedFlowBlur))}px) saturate(${Math.min(dynamicSaturation, 200)}%) contrast(1.05) brightness(1.05)`
|
|
600
|
+
backdropFilter: `blur(${clampBlur(Math.max(validatedBaseBlur, .8 * validatedEdgeBlur, 1.1 * validatedCenterBlur, .9 * validatedFlowBlur))}px) saturate(${Math.min(dynamicSaturation, 200)}%) contrast(${overLightConfig?.contrast || 1.05}) brightness(${overLightConfig?.brightness || 1.05})`
|
|
592
601
|
} : {
|
|
593
|
-
backdropFilter:
|
|
602
|
+
backdropFilter: `blur(${clampBlur(.4 * validatedBaseBlur + .25 * validatedEdgeBlur + .15 * validatedCenterBlur + .2 * validatedFlowBlur)}px) saturate(${Math.min(dynamicSaturation, 200)}%) contrast(${overLightConfig?.contrast || 1.05}) brightness(${overLightConfig?.brightness || 1.05})`
|
|
594
603
|
};
|
|
595
604
|
// Single-pass fallback: stronger radius to match perceived blur of multi-pass
|
|
596
605
|
} catch (error) {
|
|
@@ -609,7 +618,7 @@ const sharedShaderCache = new Map, AtomixGlassContainer = forwardRef((({childre
|
|
|
609
618
|
"--atomix-glass-container-padding": padding || "0 0",
|
|
610
619
|
"--atomix-glass-container-radius": `${"number" != typeof cornerRadius || isNaN(cornerRadius) ? 0 : cornerRadius}px`,
|
|
611
620
|
"--atomix-glass-container-backdrop": backdropStyle?.backdropFilter || "none",
|
|
612
|
-
"--atomix-glass-container-shadow": overLight ? [ `inset 0 1px 0 rgba(255, 255, 255, ${.4 + .002 * mx})`, `inset 0 -1px 0 rgba(0, 0, 0, ${.2 + .001 * Math.abs(my)})`, `inset 0 0 20px rgba(0, 0, 0, ${.08 + .001 * Math.abs(mx + my)})`, `0 2px 12px rgba(0, 0, 0, ${.12 + .002 * Math.abs(my)})` ].join(", ") : "0 0 20px rgba(0, 0, 0, 0.15) inset, 0 4px 8px rgba(0, 0, 0, 0.08) inset",
|
|
621
|
+
"--atomix-glass-container-shadow": overLight ? [ `inset 0 1px 0 rgba(255, 255, 255, ${(.4 + .002 * mx) * (overLightConfig?.shadowIntensity || 1)})`, `inset 0 -1px 0 rgba(0, 0, 0, ${(.2 + .001 * Math.abs(my)) * (overLightConfig?.shadowIntensity || 1)})`, `inset 0 0 20px rgba(0, 0, 0, ${(.08 + .001 * Math.abs(mx + my)) * (overLightConfig?.shadowIntensity || 1)})`, `0 2px 12px rgba(0, 0, 0, ${(.12 + .002 * Math.abs(my)) * (overLightConfig?.shadowIntensity || 1)})` ].join(", ") : "0 0 20px rgba(0, 0, 0, 0.15) inset, 0 4px 8px rgba(0, 0, 0, 0.08) inset",
|
|
613
622
|
"--atomix-glass-container-shadow-opacity": effectiveDisableEffects ? 0 : 1,
|
|
614
623
|
// Background and shadow values use design token-aligned RGB values
|
|
615
624
|
"--atomix-glass-container-bg": overLight ? `linear-gradient(${180 + .5 * mx}deg, rgba(255, 255, 255, 0.1) 0%, transparent 20%, transparent 80%, rgba(0, 0, 0, 0.05) 100%)` : "none",
|
|
@@ -628,10 +637,18 @@ const sharedShaderCache = new Map, AtomixGlassContainer = forwardRef((({childre
|
|
|
628
637
|
"--atomix-glass-container-text-shadow": "none"
|
|
629
638
|
};
|
|
630
639
|
}
|
|
631
|
-
}), [ glassSize, padding, cornerRadius, backdropStyle, mouseOffset, overLight, effectiveDisableEffects ])
|
|
640
|
+
}), [ glassSize, padding, cornerRadius, backdropStyle, mouseOffset, overLight, effectiveDisableEffects ]), setForceNoTransition = el => {
|
|
641
|
+
el && (el.style.setProperty("transition-duration", "0s", "important"), el.style.setProperty("animation-duration", "0s", "important"),
|
|
642
|
+
el.style.setProperty("transition-delay", "0s", "important"));
|
|
643
|
+
};
|
|
632
644
|
return jsx("div", {
|
|
633
|
-
ref:
|
|
634
|
-
|
|
645
|
+
ref: el => {
|
|
646
|
+
// Apply force no-transition
|
|
647
|
+
setForceNoTransition(el),
|
|
648
|
+
// Handle forwarded ref
|
|
649
|
+
"function" == typeof ref ? ref(el) : ref && (ref.current = el);
|
|
650
|
+
},
|
|
651
|
+
className: `${ATOMIX_GLASS.CONTAINER_CLASS} ${className} ${isActive ? ATOMIX_GLASS.CLASSES.ACTIVE : ""} ${overLight ? ATOMIX_GLASS.CLASSES.OVER_LIGHT : ""}`,
|
|
635
652
|
style: {
|
|
636
653
|
...style,
|
|
637
654
|
...containerVars
|
|
@@ -649,6 +666,11 @@ const sharedShaderCache = new Map, AtomixGlassContainer = forwardRef((({childre
|
|
|
649
666
|
onMouseUp: onMouseUp,
|
|
650
667
|
children: [ jsxs("div", {
|
|
651
668
|
className: ATOMIX_GLASS.FILTER_CLASS,
|
|
669
|
+
style: {
|
|
670
|
+
zIndex: 1,
|
|
671
|
+
position: "absolute",
|
|
672
|
+
inset: 0
|
|
673
|
+
},
|
|
652
674
|
children: [ jsx(GlassFilter, {
|
|
653
675
|
blurAmount: blurAmount,
|
|
654
676
|
mode: mode,
|
|
@@ -657,6 +679,7 @@ const sharedShaderCache = new Map, AtomixGlassContainer = forwardRef((({childre
|
|
|
657
679
|
aberrationIntensity: "number" != typeof aberrationIntensity || isNaN(aberrationIntensity) ? 0 : aberrationIntensity,
|
|
658
680
|
shaderMapUrl: shaderMapUrl
|
|
659
681
|
}), jsx("div", {
|
|
682
|
+
ref: setForceNoTransition,
|
|
660
683
|
className: ATOMIX_GLASS.FILTER_OVERLAY_CLASS,
|
|
661
684
|
style: {
|
|
662
685
|
filter: `url(#${filterId})`,
|
|
@@ -678,9 +701,8 @@ const sharedShaderCache = new Map, AtomixGlassContainer = forwardRef((({childre
|
|
|
678
701
|
style: {
|
|
679
702
|
position: "relative",
|
|
680
703
|
textShadow: "var(--atomix-glass-container-text-shadow)",
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
} : {}
|
|
704
|
+
// Ensure content is always above the filter layer (zIndex 1)
|
|
705
|
+
zIndex: elasticity > 0 ? 100 : 2
|
|
684
706
|
},
|
|
685
707
|
children: children
|
|
686
708
|
}) ]
|
|
@@ -798,12 +820,12 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
798
820
|
}), [internalMouseOffset, setInternalMouseOffset] = useState({
|
|
799
821
|
x: 0,
|
|
800
822
|
y: 0
|
|
801
|
-
}), [dynamicCornerRadius, setDynamicCornerRadius] = useState(CONSTANTS.DEFAULT_CORNER_RADIUS), [userPrefersReducedMotion, setUserPrefersReducedMotion] = useState(!1), [userPrefersHighContrast, setUserPrefersHighContrast] = useState(!1), [detectedOverLight, setDetectedOverLight] = useState(!1), effectiveCornerRadius = useMemo((() => void 0 !== cornerRadius ? Math.max(0, cornerRadius) : Math.max(0, dynamicCornerRadius)), [ cornerRadius, dynamicCornerRadius
|
|
823
|
+
}), [dynamicCornerRadius, setDynamicCornerRadius] = useState(CONSTANTS.DEFAULT_CORNER_RADIUS), [userPrefersReducedMotion, setUserPrefersReducedMotion] = useState(!1), [userPrefersHighContrast, setUserPrefersHighContrast] = useState(!1), [detectedOverLight, setDetectedOverLight] = useState(!1), effectiveCornerRadius = useMemo((() => void 0 !== cornerRadius ? Math.max(0, cornerRadius) : Math.max(0, dynamicCornerRadius)), [ cornerRadius, dynamicCornerRadius ]), effectiveReducedMotion = useMemo((() => reducedMotion || userPrefersReducedMotion), [ reducedMotion, userPrefersReducedMotion ]), effectiveHighContrast = useMemo((() => highContrast || userPrefersHighContrast), [ highContrast, userPrefersHighContrast ]), effectiveDisableEffects = useMemo((() => disableEffects || effectiveReducedMotion), [ disableEffects, effectiveReducedMotion ]), globalMousePosition = useMemo((() => externalGlobalMousePosition || internalGlobalMousePosition), [ externalGlobalMousePosition, internalGlobalMousePosition ]), mouseOffset = useMemo((() => externalMouseOffset || internalMouseOffset), [ externalMouseOffset, internalMouseOffset ]);
|
|
802
824
|
// Extract border-radius from children
|
|
803
825
|
useEffect((() => {
|
|
804
826
|
const extractRadius = () => {
|
|
805
827
|
try {
|
|
806
|
-
let extractedRadius = null
|
|
828
|
+
let extractedRadius = null;
|
|
807
829
|
if (contentRef.current) {
|
|
808
830
|
const firstChild = contentRef.current.firstElementChild;
|
|
809
831
|
if (firstChild) {
|
|
@@ -820,15 +842,14 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
820
842
|
return null;
|
|
821
843
|
}
|
|
822
844
|
})(firstChild);
|
|
823
|
-
null !== domRadius && domRadius > 0 && (extractedRadius = domRadius
|
|
845
|
+
null !== domRadius && domRadius > 0 && (extractedRadius = domRadius);
|
|
824
846
|
}
|
|
825
847
|
}
|
|
826
848
|
if (null === extractedRadius) {
|
|
827
849
|
const childRadius = extractBorderRadiusFromChildren(children);
|
|
828
|
-
childRadius > 0 && childRadius !== CONSTANTS.DEFAULT_CORNER_RADIUS && (extractedRadius = childRadius
|
|
829
|
-
extractionSource = "React children");
|
|
850
|
+
childRadius > 0 && childRadius !== CONSTANTS.DEFAULT_CORNER_RADIUS && (extractedRadius = childRadius);
|
|
830
851
|
}
|
|
831
|
-
null !== extractedRadius && extractedRadius > 0
|
|
852
|
+
null !== extractedRadius && extractedRadius > 0 && setDynamicCornerRadius(extractedRadius);
|
|
832
853
|
} catch (error) {
|
|
833
854
|
"undefined" != typeof process && "production" === process.env?.NODE_ENV || !debugCornerRadius || console.error("[AtomixGlass] Error extracting corner radius:", error);
|
|
834
855
|
}
|
|
@@ -957,7 +978,6 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
957
978
|
}
|
|
958
979
|
if ("boolean" == typeof overLight &&
|
|
959
980
|
// For boolean values, disable auto-detection
|
|
960
|
-
// Cache is automatically managed by WeakMap (no manual clearing needed)
|
|
961
981
|
setDetectedOverLight(!1), "function" == typeof window.matchMedia) try {
|
|
962
982
|
const mediaQueryReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)"), mediaQueryHighContrast = window.matchMedia("(prefers-contrast: high)");
|
|
963
983
|
setUserPrefersReducedMotion(mediaQueryReducedMotion.matches), setUserPrefersHighContrast(mediaQueryHighContrast.matches);
|
|
@@ -1027,6 +1047,7 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1027
1047
|
}), [ handleGlobalMousePosition, mouseContainer, glassRef, externalGlobalMousePosition, externalMouseOffset, effectiveDisableEffects ]);
|
|
1028
1048
|
// Transform calculations
|
|
1029
1049
|
const calculateDirectionalScale = useCallback((() => {
|
|
1050
|
+
if (!0 === overLight || "auto" === overLight && detectedOverLight || "object" == typeof overLight && null !== overLight && detectedOverLight) return "scale(1)";
|
|
1030
1051
|
if (!(globalMousePosition.x && globalMousePosition.y && glassRef.current && validateGlassSize(glassSize))) return "scale(1)";
|
|
1031
1052
|
const rect = glassRef.current.getBoundingClientRect(), center = calculateElementCenter(rect), deltaX = globalMousePosition.x - center.x, deltaY = globalMousePosition.y - center.y, edgeDistanceX = Math.max(0, Math.abs(deltaX) - glassSize.width / 2), edgeDistanceY = Math.max(0, Math.abs(deltaY) - glassSize.height / 2), edgeDistance = calculateDistance({
|
|
1032
1053
|
x: edgeDistanceX,
|
|
@@ -1040,7 +1061,7 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1040
1061
|
if (0 === centerDistance) return "scale(1)";
|
|
1041
1062
|
const normalizedX = deltaX / centerDistance, normalizedY = deltaY / centerDistance, stretchIntensity = Math.min(centerDistance / 300, 1) * elasticity * fadeInFactor, scaleX = 1 + Math.abs(normalizedX) * stretchIntensity * .3 - Math.abs(normalizedY) * stretchIntensity * .15, scaleY = 1 + Math.abs(normalizedY) * stretchIntensity * .3 - Math.abs(normalizedX) * stretchIntensity * .15;
|
|
1042
1063
|
return `scaleX(${Math.max(.8, scaleX)}) scaleY(${Math.max(.8, scaleY)})`;
|
|
1043
|
-
}), [ globalMousePosition, elasticity, glassSize, glassRef ]), calculateFadeInFactor = useCallback((() => {
|
|
1064
|
+
}), [ globalMousePosition, elasticity, glassSize, glassRef, overLight, detectedOverLight ]), calculateFadeInFactor = useCallback((() => {
|
|
1044
1065
|
if (!(globalMousePosition.x && globalMousePosition.y && glassRef.current && validateGlassSize(glassSize))) return 0;
|
|
1045
1066
|
const rect = glassRef.current.getBoundingClientRect(), center = calculateElementCenter(rect), edgeDistanceX = Math.max(0, Math.abs(globalMousePosition.x - center.x) - glassSize.width / 2), edgeDistanceY = Math.max(0, Math.abs(globalMousePosition.y - center.y) - glassSize.height / 2), edgeDistance = calculateDistance({
|
|
1046
1067
|
x: edgeDistanceX,
|
|
@@ -1125,20 +1146,21 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1125
1146
|
isOverLight: isOverLight,
|
|
1126
1147
|
threshold: .7,
|
|
1127
1148
|
opacity: isOverLight ? Math.min(.6, Math.max(.2, .5 * hoverIntensity * activeIntensity)) : 0,
|
|
1128
|
-
contrast: Math.min(1.
|
|
1129
|
-
brightness: Math.min(1.
|
|
1130
|
-
saturationBoost:
|
|
1131
|
-
|
|
1132
|
-
|
|
1149
|
+
contrast: Math.min(1.6, Math.max(1, 1.4 + .1 * mouseInfluence)),
|
|
1150
|
+
brightness: Math.min(1.1, Math.max(.8, .9 + .05 * mouseInfluence)),
|
|
1151
|
+
saturationBoost: 1.3,
|
|
1152
|
+
// Fixed value — dynamic saturation amplifies perceived displacement
|
|
1153
|
+
shadowIntensity: Math.min(1.2, Math.max(.5, .9 + .2 * mouseInfluence)),
|
|
1154
|
+
borderOpacity: Math.min(1, Math.max(.3, .7 + .1 * mouseInfluence))
|
|
1133
1155
|
};
|
|
1134
1156
|
if ("object" == typeof overLight && null !== overLight) {
|
|
1135
1157
|
const objConfig = overLight, validatedThreshold = validateConfigValue(objConfig.threshold, .1, 1, baseConfig.threshold), validatedOpacity = validateConfigValue(objConfig.opacity, .1, 1, baseConfig.opacity), validatedContrast = validateConfigValue(objConfig.contrast, .5, 2.5, baseConfig.contrast), validatedBrightness = validateConfigValue(objConfig.brightness, .5, 2, baseConfig.brightness), validatedSaturationBoost = validateConfigValue(objConfig.saturationBoost, .5, 3, baseConfig.saturationBoost), finalConfig = {
|
|
1136
1158
|
...baseConfig,
|
|
1137
1159
|
threshold: validatedThreshold,
|
|
1138
1160
|
opacity: validatedOpacity * hoverIntensity * activeIntensity,
|
|
1139
|
-
contrast: validatedContrast + .
|
|
1140
|
-
brightness: validatedBrightness + .
|
|
1141
|
-
saturationBoost: validatedSaturationBoost
|
|
1161
|
+
contrast: Math.min(1.6, validatedContrast + .1 * mouseInfluence),
|
|
1162
|
+
brightness: Math.min(1.1, validatedBrightness + .05 * mouseInfluence),
|
|
1163
|
+
saturationBoost: validatedSaturationBoost
|
|
1142
1164
|
};
|
|
1143
1165
|
// Validate and apply object config values with proper clamping
|
|
1144
1166
|
return "undefined" == typeof process || process.env, finalConfig;
|
|
@@ -1272,19 +1294,19 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1272
1294
|
debugOverLight: debugOverLight,
|
|
1273
1295
|
enablePerformanceMonitoring: enablePerformanceMonitoring,
|
|
1274
1296
|
children: children
|
|
1275
|
-
}), isOverLight = overLightConfig
|
|
1297
|
+
}), isOverLight = useMemo((() => overLightConfig?.isOverLight), [ overLight ]), shouldRenderOverLightLayers = enableOverLightLayers && isOverLight, baseStyle = {
|
|
1276
1298
|
...style,
|
|
1277
|
-
|
|
1299
|
+
...!effectiveDisableEffects && {
|
|
1278
1300
|
transform: transformStyle
|
|
1279
1301
|
}
|
|
1280
|
-
}, componentClassName = [ ATOMIX_GLASS.BASE_CLASS, effectiveReducedMotion && `${ATOMIX_GLASS.BASE_CLASS}--reduced-motion`, effectiveHighContrast && `${ATOMIX_GLASS.BASE_CLASS}--high-contrast`, effectiveDisableEffects && `${ATOMIX_GLASS.BASE_CLASS}--disabled-effects`, className ].filter(Boolean).join(" "), positionStyles = {
|
|
1302
|
+
}, componentClassName = [ ATOMIX_GLASS.BASE_CLASS, effectiveReducedMotion && `${ATOMIX_GLASS.BASE_CLASS}--reduced-motion`, effectiveHighContrast && `${ATOMIX_GLASS.BASE_CLASS}--high-contrast`, effectiveDisableEffects && `${ATOMIX_GLASS.BASE_CLASS}--disabled-effects`, className ].filter(Boolean).join(" "), positionStyles = useMemo((() => ({
|
|
1281
1303
|
position: style.position || "absolute",
|
|
1282
1304
|
top: style.top || 0,
|
|
1283
1305
|
left: style.left || 0
|
|
1284
|
-
}, adjustedSize = {
|
|
1306
|
+
})), [ style.position, style.top, style.left ]), adjustedSize = useMemo((() => ({
|
|
1285
1307
|
width: "fixed" !== style.position ? "100%" : style.width ? style.width : Math.max(glassSize.width, 0),
|
|
1286
1308
|
height: "fixed" !== style.position ? "100%" : style.height ? style.height : Math.max(glassSize.height, 0)
|
|
1287
|
-
}, gradientValues = useMemo((() => {
|
|
1309
|
+
})), [ style.position, style.width, style.height, glassSize.width, glassSize.height ]), gradientValues = useMemo((() => {
|
|
1288
1310
|
const mx = mouseOffset.x, my = mouseOffset.y, absMx = Math.abs(mx), absMy = Math.abs(my), GRADIENT = ATOMIX_GLASS.CONSTANTS.GRADIENT;
|
|
1289
1311
|
return {
|
|
1290
1312
|
borderGradientAngle: GRADIENT.BASE_ANGLE + mx * GRADIENT.ANGLE_MULTIPLIER,
|
|
@@ -1324,7 +1346,7 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1324
1346
|
over: isOverLight ? 1.1 * (overLightOpacity || .4) : 0
|
|
1325
1347
|
};
|
|
1326
1348
|
}), [ isHovered, isActive, isOverLight, overLightConfig.opacity ]), glassVars = useMemo((() => {
|
|
1327
|
-
const whiteColor =
|
|
1349
|
+
const whiteColor = ATOMIX_GLASS.CONSTANTS.PALETTE.WHITE, blackColor = ATOMIX_GLASS.CONSTANTS.PALETTE.BLACK, {borderGradientAngle: borderGradientAngle, borderStop1: borderStop1, borderStop2: borderStop2, borderOpacities: borderOpacities, hoverPositions: hoverPositions, basePosition: basePosition, mx: mx, my: my, absMx: absMx, absMy: absMy} = gradientValues, configBorderOpacity = overLightConfig?.borderOpacity ?? 1;
|
|
1328
1350
|
return {
|
|
1329
1351
|
"--atomix-glass-radius": `${effectiveCornerRadius}px`,
|
|
1330
1352
|
"--atomix-glass-transform": transformStyle || "none",
|
|
@@ -1335,20 +1357,20 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1335
1357
|
"--atomix-glass-height": "fixed" !== style.position ? adjustedSize.height : `${adjustedSize.height}px`,
|
|
1336
1358
|
"--atomix-glass-border-width": "var(--atomix-spacing-0-5, 0.09375rem)",
|
|
1337
1359
|
"--atomix-glass-blend-mode": isOverLight ? "multiply" : "overlay",
|
|
1338
|
-
"--atomix-glass-border-gradient-1": `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${borderOpacities[0]}) ${borderStop1}%, rgba(${whiteColor}, ${borderOpacities[1]}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
|
|
1339
|
-
"--atomix-glass-border-gradient-2": `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${borderOpacities[2]}) ${borderStop1}%, rgba(${whiteColor}, ${borderOpacities[3]}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
|
|
1360
|
+
"--atomix-glass-border-gradient-1": `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${(borderOpacities[0] ?? 1) * configBorderOpacity}) ${borderStop1}%, rgba(${whiteColor}, ${(borderOpacities[1] ?? 1) * configBorderOpacity}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
|
|
1361
|
+
"--atomix-glass-border-gradient-2": `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${(borderOpacities[2] ?? 1) * configBorderOpacity}) ${borderStop1}%, rgba(${whiteColor}, ${(borderOpacities[3] ?? 1) * configBorderOpacity}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
|
|
1340
1362
|
"--atomix-glass-hover-1-opacity": opacityValues.hover1,
|
|
1341
|
-
"--atomix-glass-hover-1-gradient": isOverLight ? `radial-gradient(circle at ${hoverPositions.hover1.x}% ${hoverPositions.hover1.y}%, rgba(
|
|
1363
|
+
"--atomix-glass-hover-1-gradient": isOverLight ? `radial-gradient(circle at ${hoverPositions.hover1.x}% ${hoverPositions.hover1.y}%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_START}) 0%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_STOP}%, rgba(${blackColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_END}%)` : `radial-gradient(circle at ${hoverPositions.hover1.x}% ${hoverPositions.hover1.y}%, rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.WHITE_START}) 0%, rgba(${whiteColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.WHITE_STOP}%)`,
|
|
1342
1364
|
"--atomix-glass-hover-2-opacity": opacityValues.hover2,
|
|
1343
|
-
"--atomix-glass-hover-2-gradient": isOverLight ? `radial-gradient(circle at ${hoverPositions.hover2.x}% ${hoverPositions.hover2.y}%, rgba(
|
|
1365
|
+
"--atomix-glass-hover-2-gradient": isOverLight ? `radial-gradient(circle at ${hoverPositions.hover2.x}% ${hoverPositions.hover2.y}%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_START}) 0%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_STOP}%, rgba(${blackColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_END}%)` : `radial-gradient(circle at ${hoverPositions.hover2.x}% ${hoverPositions.hover2.y}%, rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.WHITE_START}) 0%, rgba(${whiteColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.WHITE_STOP}%)`,
|
|
1344
1366
|
"--atomix-glass-hover-3-opacity": opacityValues.hover3,
|
|
1345
|
-
"--atomix-glass-hover-3-gradient": isOverLight ? `radial-gradient(circle at ${hoverPositions.hover3.x}% ${hoverPositions.hover3.y}%, rgba(
|
|
1367
|
+
"--atomix-glass-hover-3-gradient": isOverLight ? `radial-gradient(circle at ${hoverPositions.hover3.x}% ${hoverPositions.hover3.y}%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_START}) 0%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_STOP}%, rgba(${blackColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_END}%)` : `radial-gradient(circle at ${hoverPositions.hover3.x}% ${hoverPositions.hover3.y}%, rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.WHITE_START}) 0%, rgba(${whiteColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.WHITE_STOP}%)`,
|
|
1346
1368
|
"--atomix-glass-base-opacity": opacityValues.base,
|
|
1347
|
-
"--atomix-glass-base-gradient": isOverLight ? `linear-gradient(${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.ANGLE}deg, rgba(
|
|
1369
|
+
"--atomix-glass-base-gradient": isOverLight ? `linear-gradient(${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.ANGLE}deg, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_START_BASE + mx * ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_START_MULTIPLIER}) 0%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_MID_BASE + my * ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_MID_MULTIPLIER}) ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_MID_STOP}%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_END_BASE + absMx * ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_END_MULTIPLIER}) 100%)` : `rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.WHITE_OPACITY})`,
|
|
1348
1370
|
"--atomix-glass-overlay-opacity": opacityValues.over,
|
|
1349
|
-
"--atomix-glass-overlay-gradient": isOverLight ? `radial-gradient(circle at ${basePosition.x}% ${basePosition.y}%, rgba(
|
|
1371
|
+
"--atomix-glass-overlay-gradient": isOverLight ? `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%)` : `rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.WHITE_OPACITY})`
|
|
1350
1372
|
};
|
|
1351
|
-
}), [ gradientValues, opacityValues, effectiveCornerRadius, transformStyle, positionStyles, adjustedSize, style.position, isOverLight ]), renderBackgroundLayer = layerType => jsx("div", {
|
|
1373
|
+
}), [ gradientValues, opacityValues, effectiveCornerRadius, transformStyle, positionStyles, adjustedSize, style.position, isOverLight, overLightConfig.borderOpacity ]), renderBackgroundLayer = layerType => jsx("div", {
|
|
1352
1374
|
className: [ ATOMIX_GLASS.BACKGROUND_LAYER_CLASS, "dark" === layerType ? ATOMIX_GLASS.BACKGROUND_LAYER_DARK_CLASS : ATOMIX_GLASS.BACKGROUND_LAYER_BLACK_CLASS, isOverLight ? ATOMIX_GLASS.BACKGROUND_LAYER_OVER_LIGHT_CLASS : ATOMIX_GLASS.BACKGROUND_LAYER_HIDDEN_CLASS ].filter(Boolean).join(" "),
|
|
1353
1375
|
style: {
|
|
1354
1376
|
...positionStyles,
|
|
@@ -1374,9 +1396,9 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1374
1396
|
className: className,
|
|
1375
1397
|
style: baseStyle,
|
|
1376
1398
|
cornerRadius: effectiveCornerRadius,
|
|
1377
|
-
displacementScale: effectiveDisableEffects ? 0 : "shader" === mode ? displacementScale * ATOMIX_GLASS.CONSTANTS.MULTIPLIERS.SHADER_DISPLACEMENT :
|
|
1399
|
+
displacementScale: effectiveDisableEffects ? 0 : "shader" === mode ? displacementScale * ATOMIX_GLASS.CONSTANTS.MULTIPLIERS.SHADER_DISPLACEMENT : isOverLight ? displacementScale * ATOMIX_GLASS.CONSTANTS.MULTIPLIERS.OVER_LIGHT_DISPLACEMENT : displacementScale,
|
|
1378
1400
|
blurAmount: effectiveDisableEffects ? 0 : blurAmount,
|
|
1379
|
-
saturation: effectiveHighContrast ? ATOMIX_GLASS.CONSTANTS.SATURATION.HIGH_CONTRAST :
|
|
1401
|
+
saturation: effectiveHighContrast ? ATOMIX_GLASS.CONSTANTS.SATURATION.HIGH_CONTRAST : isOverLight ? saturation * overLightConfig.saturationBoost : saturation,
|
|
1380
1402
|
aberrationIntensity: effectiveDisableEffects ? 0 : "shader" === mode ? aberrationIntensity * ATOMIX_GLASS.CONSTANTS.MULTIPLIERS.SHADER_ABERRATION : aberrationIntensity,
|
|
1381
1403
|
glassSize: glassSize,
|
|
1382
1404
|
padding: padding,
|
|
@@ -1392,10 +1414,15 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1392
1414
|
onMouseLeave: handleMouseLeave,
|
|
1393
1415
|
onMouseDown: handleMouseDown,
|
|
1394
1416
|
onMouseUp: handleMouseUp,
|
|
1395
|
-
active: isActive,
|
|
1396
1417
|
isHovered: isHovered,
|
|
1397
1418
|
isActive: isActive,
|
|
1398
|
-
overLight:
|
|
1419
|
+
overLight: isOverLight,
|
|
1420
|
+
overLightConfig: {
|
|
1421
|
+
contrast: overLightConfig.contrast,
|
|
1422
|
+
brightness: overLightConfig.brightness,
|
|
1423
|
+
shadowIntensity: overLightConfig.shadowIntensity,
|
|
1424
|
+
borderOpacity: overLightConfig.borderOpacity
|
|
1425
|
+
},
|
|
1399
1426
|
onClick: onClick,
|
|
1400
1427
|
mode: mode,
|
|
1401
1428
|
transform: baseStyle.transform,
|
|
@@ -1435,75 +1462,56 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1435
1462
|
});
|
|
1436
1463
|
}
|
|
1437
1464
|
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
const {disabled: disabled = defaultProps.disabled, invalid: invalid = defaultProps.invalid, valid: valid = defaultProps.valid, indeterminate: indeterminate = defaultProps.indeterminate, className: className = ""} = props;
|
|
1458
|
-
let validationClass = "";
|
|
1459
|
-
return invalid ? validationClass = "is-error" : valid && (validationClass = "is-valid"),
|
|
1460
|
-
`c-checkbox ${validationClass} ${disabled ? "is-disabled" : ""} ${indeterminate ? "c-checkbox--mixed" : ""} ${className}`.trim();
|
|
1461
|
-
},
|
|
1462
|
-
checkboxRef: checkboxRef
|
|
1463
|
-
};
|
|
1464
|
-
}
|
|
1465
|
-
/**
|
|
1466
|
-
* Default theme colors for components
|
|
1467
|
-
*/
|
|
1468
|
-
/**
|
|
1469
|
-
* Form-specific constants
|
|
1470
|
-
*/ ({
|
|
1471
|
-
indeterminate: indeterminate,
|
|
1472
|
-
disabled: disabled,
|
|
1473
|
-
invalid: invalid,
|
|
1474
|
-
valid: valid
|
|
1475
|
-
}), checkboxClass = generateCheckboxClass({
|
|
1476
|
-
className: `${className} ${glass ? "c-checkbox--glass" : ""}`.trim(),
|
|
1465
|
+
const Checkbox = React.memo( forwardRef((({label: label, checked: checked, onChange: onChange, className: className = "", style: style, disabled: disabled = !1, required: required = !1, id: id, name: name, value: value, invalid: invalid = !1, valid: valid = !1, indeterminate: indeterminate = !1, "aria-label": ariaLabel, "aria-describedby": ariaDescribedBy, onClick: onClick, glass: glass, ...props}, ref) => {
|
|
1466
|
+
// Local ref to handle indeterminate state
|
|
1467
|
+
const localRef = useRef(null);
|
|
1468
|
+
// Merge refs
|
|
1469
|
+
useImperativeHandle(ref, (() => localRef.current)),
|
|
1470
|
+
// Handle indeterminate
|
|
1471
|
+
useEffect((() => {
|
|
1472
|
+
localRef.current && (localRef.current.indeterminate = Boolean(indeterminate));
|
|
1473
|
+
}), [ indeterminate ]);
|
|
1474
|
+
// Generate classes
|
|
1475
|
+
let validationClass = "";
|
|
1476
|
+
invalid ? validationClass = "is-error" : valid && (validationClass = "is-valid");
|
|
1477
|
+
const checkboxClass = `c-checkbox ${validationClass} ${disabled ? "is-disabled" : ""} ${indeterminate ? "c-checkbox--mixed" : ""} ${glass ? "c-checkbox--glass" : ""} ${className}`.trim(), inputElement = jsx("input", {
|
|
1478
|
+
ref: localRef,
|
|
1479
|
+
type: "checkbox",
|
|
1480
|
+
className: "c-checkbox__input",
|
|
1481
|
+
checked: checked,
|
|
1482
|
+
onChange: onChange,
|
|
1483
|
+
onClick: onClick,
|
|
1477
1484
|
disabled: disabled,
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1485
|
+
required: required,
|
|
1486
|
+
id: id,
|
|
1487
|
+
name: name,
|
|
1488
|
+
value: value,
|
|
1489
|
+
"aria-label": label ? void 0 : ariaLabel,
|
|
1490
|
+
"aria-describedby": ariaDescribedBy,
|
|
1491
|
+
"aria-invalid": invalid,
|
|
1492
|
+
...props
|
|
1493
|
+
});
|
|
1494
|
+
let content;
|
|
1495
|
+
if (content = id && label ? jsxs("div", {
|
|
1482
1496
|
className: checkboxClass,
|
|
1483
1497
|
style: style,
|
|
1484
|
-
children: [ jsx("
|
|
1485
|
-
ref: checkboxRef,
|
|
1486
|
-
type: "checkbox",
|
|
1487
|
-
className: "c-checkbox__input",
|
|
1488
|
-
checked: checked,
|
|
1489
|
-
onChange: onChange,
|
|
1490
|
-
onClick: onClick,
|
|
1491
|
-
disabled: disabled,
|
|
1492
|
-
required: required,
|
|
1493
|
-
id: id,
|
|
1494
|
-
name: name,
|
|
1495
|
-
value: value,
|
|
1496
|
-
"aria-label": label ? void 0 : ariaLabel,
|
|
1497
|
-
"aria-describedby": ariaDescribedBy,
|
|
1498
|
-
"aria-invalid": invalid
|
|
1499
|
-
}), label && jsx("label", {
|
|
1498
|
+
children: [ inputElement, jsx("label", {
|
|
1500
1499
|
className: "c-checkbox__label",
|
|
1501
1500
|
htmlFor: id,
|
|
1502
1501
|
children: label
|
|
1503
1502
|
}) ]
|
|
1504
|
-
})
|
|
1505
|
-
|
|
1506
|
-
|
|
1503
|
+
}) : label ? jsxs("label", {
|
|
1504
|
+
className: checkboxClass,
|
|
1505
|
+
style: style,
|
|
1506
|
+
children: [ inputElement, jsx("span", {
|
|
1507
|
+
className: "c-checkbox__label",
|
|
1508
|
+
children: label
|
|
1509
|
+
}) ]
|
|
1510
|
+
}) : jsx("div", {
|
|
1511
|
+
className: checkboxClass,
|
|
1512
|
+
style: style,
|
|
1513
|
+
children: inputElement
|
|
1514
|
+
}), glass) {
|
|
1507
1515
|
const defaultGlassProps = {
|
|
1508
1516
|
displacementScale: 40,
|
|
1509
1517
|
blurAmount: 1,
|
|
@@ -1517,11 +1525,11 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
1517
1525
|
};
|
|
1518
1526
|
return jsx(AtomixGlass, {
|
|
1519
1527
|
...glassProps,
|
|
1520
|
-
children:
|
|
1528
|
+
children: content
|
|
1521
1529
|
});
|
|
1522
1530
|
}
|
|
1523
|
-
return
|
|
1524
|
-
}));
|
|
1531
|
+
return content;
|
|
1532
|
+
})));
|
|
1525
1533
|
|
|
1526
1534
|
Checkbox.displayName = "Checkbox";
|
|
1527
1535
|
|
|
@@ -2310,7 +2318,11 @@ const smoothStep = (a, b, t) => {
|
|
|
2310
2318
|
// Add input validation
|
|
2311
2319
|
"number" != typeof x || "number" != typeof y || "number" != typeof time || isNaN(x) || isNaN(y) || isNaN(time) ? .5 : .5 * (.7 * fbm(40 * x + .3 * time, 40 * y - .3 * time, 6) + .3 * fbm(80 * x, 80 * y, 4)))(ix, iy, time), microDetailX = .008 * (microSurface - .5), microDetailY = .008 * (microSurface - .5), centerDistance = calculateLength(ix, iy), dynamicRefraction = .35 * Math.pow(Math.min(centerDistance, 1), 1.8) * (1 + mouseFalloff * mouseDistance * .8), refractionX = Math.cos(refractionAngle) * dynamicRefraction, refractionY = Math.sin(refractionAngle) * dynamicRefraction, vortexAngle = Math.atan2(iy - mouseY, ix - mouseX), vortexDistance = calculateLength(ix - mouseX, iy - mouseY), vortexStrength = mouseFalloff * Math.sin(10 * vortexDistance - 3 * time) * .025, vortexX = Math.cos(vortexAngle + 2 * time) * vortexStrength, vortexY = Math.sin(vortexAngle + 2 * time) * vortexStrength, fluidX = Math.sin(10 * ix + 5 * mouseX + 2.5 * time) * Math.cos(8 * iy - 2 * time) * .018, fluidY = Math.cos(8 * ix - 2 * time) * Math.sin(10 * iy + 5 * mouseY + 2.5 * time) * .018, rippleEffect = (.012 * Math.sin(15 * Math.min(centerDistance, 10) - 4 * time) + .008 * Math.cos(20 * Math.min(centerDistance, 10) + 3 * time)) * mouseFalloff, rippleX = Math.cos(refractionAngle) * rippleEffect, rippleY = Math.sin(refractionAngle) * rippleEffect, distanceToEdge = roundedRectSDF(ix, iy, .44, .34, .39), edgeMask = smoothStep(.92, -.12, distanceToEdge), edgeSoftness = smoothStep(.85, .1, distanceToEdge), finalY = iy + (1.2 * refractionY + .8 * spectralY + 1.5 * parallaxY + .9 * scatteringY + 1 * turbulenceY + .6 * microDetailY + 1.3 * vortexY + 1.1 * fluidY + .7 * rippleY + .8 * causticDistortion) * edgeMask * edgeSoftness * .85;
|
|
2312
2320
|
return createTexture(clampValue(ix + (1.2 * refractionX + .8 * spectralX + 1.5 * parallaxX + .9 * scatteringX + 1 * turbulenceX + .6 * microDetailX + 1.3 * vortexX + 1.1 * fluidX + .7 * rippleX + causticDistortion) * edgeMask * edgeSoftness * .85 + .5, 0, 1), clampValue(finalY + .5, 0, 1));
|
|
2313
|
-
}
|
|
2321
|
+
},
|
|
2322
|
+
// Aliases for compatibility
|
|
2323
|
+
plasma: (uv, mousePosition) => fragmentShaders.premiumGlass(uv, mousePosition),
|
|
2324
|
+
waves: (uv, mousePosition) => fragmentShaders.liquidMetal(uv, mousePosition),
|
|
2325
|
+
noise: (uv, mousePosition) => fragmentShaders.appleFluid(uv, mousePosition)
|
|
2314
2326
|
}, shaderUtils = Object.freeze( Object.defineProperty({
|
|
2315
2327
|
__proto__: null,
|
|
2316
2328
|
ShaderDisplacementGenerator: class {
|