@shohojdhara/atomix 0.6.5 → 0.6.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.
Files changed (43) hide show
  1. package/dist/atomix.css +660 -658
  2. package/dist/atomix.css.map +1 -1
  3. package/dist/atomix.min.css +45 -45
  4. package/dist/atomix.min.css.map +1 -1
  5. package/dist/atomix.umd.js +1 -1
  6. package/dist/atomix.umd.js.map +1 -1
  7. package/dist/atomix.umd.min.js +1 -1
  8. package/dist/charts.js +65 -255
  9. package/dist/charts.js.map +1 -1
  10. package/dist/core.js +65 -255
  11. package/dist/core.js.map +1 -1
  12. package/dist/forms.js +65 -255
  13. package/dist/forms.js.map +1 -1
  14. package/dist/heavy.js +65 -255
  15. package/dist/heavy.js.map +1 -1
  16. package/dist/index.d.ts +6 -37
  17. package/dist/index.esm.js +66 -300
  18. package/dist/index.esm.js.map +1 -1
  19. package/dist/index.js +66 -300
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.min.js +1 -1
  22. package/dist/index.min.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/components/AtomixGlass/AtomixGlass.tsx +0 -9
  25. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +0 -2
  26. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +1 -1
  27. package/src/components/AtomixGlass/glass-utils.ts +82 -53
  28. package/src/components/AtomixGlass/shader-utils.ts +19 -77
  29. package/src/components/Form/Select.test.tsx +6 -6
  30. package/src/components/Form/Textarea.stories.tsx +5 -5
  31. package/src/layouts/Grid/Grid.stories.tsx +54 -2
  32. package/src/layouts/Grid/README.md +6 -2
  33. package/src/lib/composables/useAtomixGlass.ts +2 -134
  34. package/src/lib/composables/useAtomixGlassStyles.ts +3 -3
  35. package/src/lib/composables/usePerformanceMonitor.ts +0 -66
  36. package/src/lib/constants/components.ts +6 -1
  37. package/src/styles/01-settings/_settings.atomix-glass.scss +2 -2
  38. package/src/styles/01-settings/_settings.colors.scss +73 -73
  39. package/src/styles/02-tools/_tools.button.scss +51 -42
  40. package/src/styles/05-objects/_objects.grid.scss +4 -1
  41. package/src/styles/06-components/_components.atomix-glass.scss +2 -2
  42. package/src/components/AtomixGlass/PerformanceDashboard.tsx +0 -171
  43. package/src/components/AtomixGlass/animation-system.ts +0 -578
@@ -10,13 +10,11 @@ import { ATOMIX_GLASS } from '../constants/components';
10
10
  import { globalMouseTracker } from './shared-mouse-tracker';
11
11
  import {
12
12
  calculateElementCenter,
13
- calculateMouseInfluence,
14
13
  extractBorderRadiusFromChildren,
15
14
  extractBorderRadiusFromDOMElement,
16
- validateGlassSize,
15
+ getInteractionIntensity,
17
16
  lerp,
18
17
  calculateSpring,
19
- calculateVelocity,
20
18
  smoothstep,
21
19
  } from '../../components/AtomixGlass/glass-utils';
22
20
  import {
@@ -24,13 +22,6 @@ import {
24
22
  type ResolvedGlassBorderConfig,
25
23
  } from '../../components/AtomixGlass/glass-border-styles';
26
24
  import { updateAtomixGlassStyles } from './useAtomixGlassStyles';
27
- // Phase 1: Time-Based Animation System
28
- import {
29
- createAnimationLoop,
30
- createFBMEngine,
31
- getFBMConfigForQuality,
32
- liquidGlassWithTime,
33
- } from '../../components/AtomixGlass/animation-system';
34
25
 
35
26
  const { CONSTANTS } = ATOMIX_GLASS;
36
27
 
@@ -157,13 +148,7 @@ interface UseAtomixGlassOptions extends Omit<AtomixGlassProps, 'children'> {
157
148
  children?: React.ReactNode;
158
149
  isFixedOrSticky?: boolean;
159
150
  priority?: number; // Priority for z-index ordering
160
- // Phase 1: Time-Based Animation System
161
151
  withLiquidBlur?: boolean;
162
- animationQuality?: 'low' | 'medium' | 'high';
163
- timeSpeed?: number;
164
- noiseAmplitude?: number;
165
- noiseFrequency?: number;
166
- displacementStrength?: number;
167
152
  }
168
153
 
169
154
  interface UseAtomixGlassReturn {
@@ -198,10 +183,6 @@ interface UseAtomixGlassReturn {
198
183
  /** Resolved liquid glass rim configuration */
199
184
  resolvedBorder: ResolvedGlassBorderConfig;
200
185
 
201
- // Phase 1: Animation System - Shader time control
202
- getShaderTime: () => number;
203
- applyTimeBasedDistortion: (uv: { x: number; y: number }) => { x: number; y: number };
204
-
205
186
  // Event handlers
206
187
  handleMouseEnter: () => void;
207
188
  handleMouseLeave: () => void;
@@ -241,14 +222,6 @@ export function useAtomixGlass({
241
222
  withLiquidBlur,
242
223
  isFixedOrSticky = false,
243
224
  priority = 1, // Default priority
244
- // Phase 1: Animation System Props
245
- withTimeAnimation = ATOMIX_GLASS.DEFAULTS.WITH_TIME_ANIMATION,
246
- animationSpeed = ATOMIX_GLASS.DEFAULTS.ANIMATION_SPEED,
247
- withMultiLayerDistortion = ATOMIX_GLASS.DEFAULTS.WITH_MULTI_LAYER_DISTORTION,
248
- distortionOctaves = ATOMIX_GLASS.DEFAULTS.DISTORTION_OCTAVES,
249
- distortionLacunarity = ATOMIX_GLASS.DEFAULTS.DISTORTION_LACUNARITY,
250
- distortionGain = ATOMIX_GLASS.DEFAULTS.DISTORTION_GAIN,
251
- distortionQuality = ATOMIX_GLASS.DEFAULTS.DISTORTION_QUALITY,
252
225
  }: UseAtomixGlassOptions): UseAtomixGlassReturn {
253
226
  // State
254
227
  const [isHovered, setIsHovered] = useState(false);
@@ -281,46 +254,12 @@ export function useAtomixGlass({
281
254
  const elasticVelocityRef = useRef<MousePosition>({ x: 0, y: 0 });
282
255
  const directionalScaleRef = useRef<{ x: number; y: number }>({ x: 1, y: 1 });
283
256
  const scaleVelocityRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });
284
- const lastMouseTimeRef = useRef<number>(0);
285
257
  const mouseVelocityRef = useRef<MousePosition>({ x: 0, y: 0 });
286
258
 
287
259
  const [userPrefersReducedMotion, setUserPrefersReducedMotion] = useState(false);
288
260
  const [userPrefersHighContrast, setUserPrefersHighContrast] = useState(false);
289
261
  const [detectedOverLight, setDetectedOverLight] = useState(false);
290
262
 
291
- // ============================================================================
292
- // Phase 1: Time-Based Animation System (Feature 1.1)
293
- // ============================================================================
294
-
295
- // Animation state refs
296
- const animationFrameIdRef = useRef<number | null>(null);
297
- const animationStartTimeRef = useRef<number>(0);
298
- const elapsedTimeRef = useRef<number>(0);
299
- const shaderTimeRef = useRef<number>(0);
300
-
301
- /**
302
- * Get FBM configuration based on quality preset or custom values
303
- */
304
- const fbmConfig = useMemo(() => {
305
- // If quality preset is provided, use it as base
306
- const preset = getFBMConfigForQuality(distortionQuality);
307
-
308
- // Override with custom values if provided
309
- return {
310
- octaves: distortionOctaves ?? preset.octaves,
311
- lacunarity: distortionLacunarity ?? preset.lacunarity,
312
- gain: distortionGain ?? preset.gain,
313
- };
314
- }, [distortionQuality, distortionOctaves, distortionLacunarity, distortionGain]);
315
-
316
- /**
317
- * Create FBM engine for multi-layer distortion
318
- */
319
- const fbmEngine = useMemo(() => {
320
- if (!withMultiLayerDistortion) return null;
321
- return createFBMEngine(fbmConfig);
322
- }, [withMultiLayerDistortion, fbmConfig]);
323
-
324
263
  /**
325
264
  * Determine effective animation settings
326
265
  */
@@ -329,74 +268,6 @@ export function useAtomixGlass({
329
268
  [reducedMotion, userPrefersReducedMotion]
330
269
  );
331
270
 
332
- const effectiveWithTimeAnimation = useMemo(() => {
333
- return withTimeAnimation && !effectiveReducedMotion;
334
- }, [withTimeAnimation, effectiveReducedMotion]);
335
-
336
- /**
337
- * Animation loop for time-based effects
338
- */
339
- useEffect(() => {
340
- if (!effectiveWithTimeAnimation || typeof window === 'undefined') {
341
- return undefined;
342
- }
343
-
344
- let lastFrameTime = performance.now();
345
-
346
- /**
347
- * Animation frame handler
348
- */
349
- const animate = (currentTime: number) => {
350
- // Calculate delta time
351
- const deltaTime = currentTime - lastFrameTime;
352
- lastFrameTime = currentTime;
353
-
354
- // Apply animation speed multiplier
355
- const scaledDelta = deltaTime * animationSpeed;
356
- elapsedTimeRef.current += scaledDelta;
357
- shaderTimeRef.current = elapsedTimeRef.current;
358
-
359
- // Continue animation loop
360
- animationFrameIdRef.current = requestAnimationFrame(animate);
361
- };
362
-
363
- // Start animation
364
- animationStartTimeRef.current = performance.now();
365
- animationFrameIdRef.current = requestAnimationFrame(animate);
366
-
367
- // Cleanup
368
- return () => {
369
- if (animationFrameIdRef.current !== null) {
370
- cancelAnimationFrame(animationFrameIdRef.current);
371
- animationFrameIdRef.current = null;
372
- }
373
- };
374
- }, [effectiveWithTimeAnimation, animationSpeed]);
375
-
376
- /**
377
- * Get current shader time for animations
378
- */
379
- const getShaderTime = useCallback(() => {
380
- return shaderTimeRef.current;
381
- }, []);
382
-
383
- /**
384
- * Apply time-based distortion to UV coordinates
385
- */
386
- const applyTimeBasedDistortion = useCallback(
387
- (uv: { x: number; y: number }): { x: number; y: number } => {
388
- if (!effectiveWithTimeAnimation || !fbmEngine) {
389
- return uv;
390
- }
391
-
392
- const time = shaderTimeRef.current;
393
-
394
- // Apply liquid glass distortion with time
395
- return liquidGlassWithTime(uv, time, fbmConfig);
396
- },
397
- [effectiveWithTimeAnimation, fbmEngine, fbmConfig]
398
- );
399
-
400
271
  // Memoized derived values
401
272
  const effectiveBorderRadius = useMemo(() => {
402
273
  if (borderRadius !== undefined) {
@@ -680,8 +551,7 @@ export function useAtomixGlass({
680
551
 
681
552
  const overLightConfig = useMemo(() => {
682
553
  const isOverLight = getEffectiveOverLight();
683
- const hoverIntensity = isHovered ? 1.4 : 1;
684
- const activeIntensity = isActive ? 1.6 : 1;
554
+ const { hoverIntensity, activeIntensity } = getInteractionIntensity(isHovered, isActive);
685
555
 
686
556
  // More robust overlight configuration with better defaults and clamping
687
557
  const baseOpacity = isOverLight
@@ -1223,8 +1093,6 @@ export function useAtomixGlass({
1223
1093
  overLightConfig,
1224
1094
  resolvedBorder,
1225
1095
  transformStyle,
1226
- getShaderTime,
1227
- applyTimeBasedDistortion,
1228
1096
  handleMouseEnter,
1229
1097
  handleMouseLeave,
1230
1098
  handleMouseDown,
@@ -5,6 +5,7 @@ import {
5
5
  } from '../../components/AtomixGlass/glass-border-styles';
6
6
  import {
7
7
  calculateMouseInfluence,
8
+ getInteractionIntensity,
8
9
  validateGlassSize,
9
10
  clampBlur,
10
11
  smoothstep,
@@ -84,8 +85,7 @@ export const updateAtomixGlassStyles = (
84
85
 
85
86
  // Calculate mouse influence
86
87
  const mouseInfluence = calculateMouseInfluence(mouseOffset);
87
- const hoverIntensity = isHovered ? 1.4 : 1;
88
- const activeIntensity = isActive ? 1.6 : 1;
88
+ const { hoverIntensity, activeIntensity } = getInteractionIntensity(isHovered, isActive);
89
89
 
90
90
  // Calculate dynamic OverLight config
91
91
  const overLightConfig = {
@@ -360,7 +360,7 @@ export const updateAtomixGlassStyles = (
360
360
  '--atomix-glass-container-box-shadow',
361
361
  isOverLight
362
362
  ? '0px 16px 70px rgba(0, 0, 0, 0.75)'
363
- : '0 8px 32px rgba(0, 0, 0, 0.32), 0 2px 8px rgba(0, 0, 0, 0.18)'
363
+ : '0 4px 16px rgba(0, 0, 0, 0.14), 0 1px 4px rgba(0, 0, 0, 0.10)'
364
364
  );
365
365
  }
366
366
  };
@@ -385,69 +385,3 @@ export function usePerformanceMonitor(
385
385
  toggleMonitoring,
386
386
  };
387
387
  }
388
-
389
- /**
390
- * Debug Overlay Component (Optional)
391
- *
392
- * Shows real-time performance metrics on screen.
393
- * Only rendered when showOverlay is enabled.
394
- */
395
- export function PerformanceOverlay({ metrics }: { metrics: PerformanceMetrics }) {
396
- if (typeof window === 'undefined') return null;
397
-
398
- const overlayStyle: React.CSSProperties = {
399
- position: 'fixed',
400
- top: '10px',
401
- right: '10px',
402
- padding: '10px',
403
- backgroundColor: 'rgba(0, 0, 0, 0.8)',
404
- color: '#fff',
405
- fontFamily: 'monospace',
406
- fontSize: '12px',
407
- borderRadius: '4px',
408
- zIndex: 9999,
409
- pointerEvents: 'none',
410
- minWidth: '150px',
411
- };
412
-
413
- const getFpsColor = (fps: number) => {
414
- if (fps >= 58) return '#4ade80'; // Green
415
- if (fps >= 45) return '#fbbf24'; // Yellow
416
- return '#ef4444'; // Red
417
- };
418
-
419
- // Performance overlay removed - will be implemented as separate component
420
- return null;
421
- }
422
-
423
- /**
424
- * Utility to get quality multipliers for glass parameters
425
- */
426
- export function getQualityMultipliers(quality: 'low' | 'medium' | 'high') {
427
- switch (quality) {
428
- case 'low':
429
- return {
430
- distortionOctaves: 2,
431
- displacementScale: 0.6,
432
- blurAmount: 0.7,
433
- animationSpeed: 0.8,
434
- chromaticIntensity: 0.5,
435
- };
436
- case 'medium':
437
- return {
438
- distortionOctaves: 4,
439
- displacementScale: 0.85,
440
- blurAmount: 0.9,
441
- animationSpeed: 0.95,
442
- chromaticIntensity: 0.75,
443
- };
444
- case 'high':
445
- return {
446
- distortionOctaves: 5,
447
- displacementScale: 1.0,
448
- blurAmount: 1.0,
449
- animationSpeed: 1.0,
450
- chromaticIntensity: 1.0,
451
- };
452
- }
453
- }
@@ -2015,6 +2015,11 @@ export const ATOMIX_GLASS = {
2015
2015
  MIN_BLUR: 0.1,
2016
2016
  MOUSE_INFLUENCE_DIVISOR: 100,
2017
2017
  EDGE_FADE_PIXELS: 2,
2018
+ // Interaction intensity multipliers shared by the hook and the imperative style updater
2019
+ INTERACTION: {
2020
+ HOVER_INTENSITY: 1.4,
2021
+ ACTIVE_INTENSITY: 1.6,
2022
+ },
2018
2023
  // Elasticity physics constants — Apple-tuned: soft springs, fast settling, minimal stretch
2019
2024
  ELASTICITY_TRANSLATION_FACTOR: 0.06, // Subtler elastic shift (was 0.1)
2020
2025
  ELASTICITY_DISTANCE_THRESHOLD: 200,
@@ -2131,7 +2136,7 @@ export const ATOMIX_GLASS = {
2131
2136
  // Container shadows — hairline inner catch + soft floating lift (Apple player bar)
2132
2137
  CONTAINER_SHADOW: {
2133
2138
  LIGHT:
2134
- 'inset 0 0.5px 0 rgba(255, 255, 255, 0.32), inset 0 1px 2px rgba(255, 255, 255, 0.06), 0 8px 32px rgba(0, 0, 0, 0.28), 0 2px 8px rgba(0, 0, 0, 0.16)',
2139
+ 'inset 0 0.5px 0 rgba(255, 255, 255, 0.32), inset 0 1px 2px rgba(255, 255, 255, 0.06), 0 4px 16px rgba(0, 0, 0, 0.12), 0 1px 4px rgba(0, 0, 0, 0.08)',
2135
2140
  },
2136
2141
 
2137
2142
  // Phase 1: Animation System Constants
@@ -29,8 +29,8 @@ $glass-border-1-opacity: 0.08 !default;
29
29
 
30
30
  // Rim shadow tokens (inset hairline + inner catch + outer lift)
31
31
  $glass-border-color: rgba(255, 255, 255, 0.28) !default;
32
- $glass-inner-shadow-color: rgba(255, 255, 255, 0.30) !default;
33
- $glass-outer-shadow-color: rgba(0, 0, 0, 0.18) !default;
32
+ $glass-inner-shadow-color: rgba(255, 255, 255, 0.20) !default;
33
+ $glass-outer-shadow-color: rgba(0, 0, 0, 0.08) !default;
34
34
 
35
35
  // Border-only backdrop (ring sampling)
36
36
  $glass-border-backdrop-blur: 40px !default;
@@ -11,81 +11,81 @@ $black: #000000 !default;
11
11
  $color-contrast-dark: #000000 !default;
12
12
  $color-contrast-light: #ffffff !default;
13
13
 
14
- // Primitives Primary Colors (Purple Scale)
15
- $primary-1: #f5f3ff !default;
16
- $primary-2: #ede9fe !default;
17
- $primary-3: #ddd6fe !default;
18
- $primary-4: #c4b5fd !default;
19
- $primary-5: #a78bfa !default;
20
- $primary-6: #8b5cf6 !default; // Balanced primary - main brand color (WCAG AA compliant)
21
- $primary-7: #7c3aed !default;
22
- $primary-8: #6d28d9 !default;
23
- $primary-9: #5b21b6 !default;
24
- $primary-10: #4c1d95 !default;
25
-
26
- // Primitives Red Colors
27
- $red-1: #fef2f2 !default;
28
- $red-2: #fee2e2 !default;
29
- $red-3: #fecaca !default;
30
- $red-4: #fca5a5 !default;
31
- $red-5: #f87171 !default;
32
- $red-6: #ef4444 !default; // Vibrant, accessible red
33
- $red-7: #dc2626 !default;
34
- $red-8: #b91c1c !default;
35
- $red-9: #991b1b !default;
36
- $red-10: #7f1d1d !default;
37
-
38
- // Primitives Green Colors
39
- $green-1: #f0fdf4 !default;
40
- $green-2: #dcfce7 !default;
41
- $green-3: #bbf7d0 !default;
42
- $green-4: #86efac !default;
43
- $green-5: #4ade80 !default;
44
- $green-6: #22c55e !default; // Balanced, accessible green
45
- $green-7: #16a34a !default;
46
- $green-8: #15803d !default;
47
- $green-9: #166534 !default;
48
- $green-10: #14532d !default;
49
-
50
- // Primitives Yellow Colors
51
- $yellow-1: #fefce8 !default;
52
- $yellow-2: #fef9c3 !default;
53
- $yellow-3: #fef08a !default;
54
- $yellow-4: #fde047 !default;
55
- $yellow-5: #facc15 !default;
56
- $yellow-6: #eab308 !default; // Accessible, high-visibility yellow
57
- $yellow-7: #ca8a04 !default;
58
- $yellow-8: #a16207 !default;
59
- $yellow-9: #854d0e !default;
60
- $yellow-10: #713f12 !default;
61
-
62
- // Primitives Blue Colors
63
- $blue-1: #eff6ff !default;
64
- $blue-2: #dbeafe !default;
65
- $blue-3: #bfdbfe !default;
66
- $blue-4: #93c5fd !default;
67
- $blue-5: #60a5fa !default;
68
- $blue-6: #3b82f6 !default; // Balanced, accessible blue
69
- $blue-7: #2563eb !default;
70
- $blue-8: #1d4ed8 !default;
71
- $blue-9: #1e40af !default;
72
- $blue-10: #1e3a8a !default;
73
-
74
- // Primitives Gray Colors
75
- $gray-1: #f9fafb !default;
76
- $gray-2: #f3f4f6 !default;
77
- $gray-3: #e5e7eb !default;
78
- $gray-4: #d1d5db !default;
79
- $gray-5: #9ca3af !default;
80
- $gray-6: #6b7280 !default;
81
- $gray-7: #4b5563 !default;
82
- $gray-8: #374151 !default;
83
- $gray-9: #1f2937 !default;
84
- $gray-10: #111827 !default;
14
+ // Primitives Primary Colors (Premium Violet Scale)
15
+ $primary-1: #f6f4ff !default;
16
+ $primary-2: #ece7ff !default;
17
+ $primary-3: #dccfff !default;
18
+ $primary-4: #c1aafd !default;
19
+ $primary-5: #a07ff9 !default;
20
+ $primary-6: #7c4dff !default; // Premium brand violet - rich, refined main brand color
21
+ $primary-7: #6b3ae8 !default;
22
+ $primary-8: #5a2bc9 !default;
23
+ $primary-9: #47209f !default;
24
+ $primary-10: #341776 !default;
25
+
26
+ // Primitives Red Colors (Premium Rose Scale)
27
+ $red-1: #fff1f2 !default;
28
+ $red-2: #ffe4e6 !default;
29
+ $red-3: #fecdd3 !default;
30
+ $red-4: #fda4af !default;
31
+ $red-5: #fb7185 !default;
32
+ $red-6: #f43f5e !default; // Refined, accessible rose-red
33
+ $red-7: #e11d48 !default;
34
+ $red-8: #be123c !default;
35
+ $red-9: #9f1239 !default;
36
+ $red-10: #881337 !default;
37
+
38
+ // Primitives Green Colors (Premium Emerald Scale)
39
+ $green-1: #ecfdf5 !default;
40
+ $green-2: #d1fae5 !default;
41
+ $green-3: #a7f3d0 !default;
42
+ $green-4: #6ee7b7 !default;
43
+ $green-5: #34d399 !default;
44
+ $green-6: #10b981 !default; // Refined, accessible emerald
45
+ $green-7: #059669 !default;
46
+ $green-8: #047857 !default;
47
+ $green-9: #065f46 !default;
48
+ $green-10: #064e3b !default;
49
+
50
+ // Primitives Yellow Colors (Premium Amber Scale)
51
+ $yellow-1: #fffbeb !default;
52
+ $yellow-2: #fef3c7 !default;
53
+ $yellow-3: #fde68a !default;
54
+ $yellow-4: #fcd34d !default;
55
+ $yellow-5: #fbbf24 !default;
56
+ $yellow-6: #f59e0b !default; // Warm, accessible amber
57
+ $yellow-7: #d97706 !default;
58
+ $yellow-8: #b45309 !default;
59
+ $yellow-9: #92400e !default;
60
+ $yellow-10: #78350f !default;
61
+
62
+ // Primitives Blue Colors (Premium Azure Scale)
63
+ $blue-1: #eff8ff !default;
64
+ $blue-2: #d8edff !default;
65
+ $blue-3: #b6ddff !default;
66
+ $blue-4: #84c5ff !default;
67
+ $blue-5: #52a6fa !default;
68
+ $blue-6: #2f80ed !default; // Refined, accessible azure blue
69
+ $blue-7: #1f66d4 !default;
70
+ $blue-8: #1a4fad !default;
71
+ $blue-9: #1a428a !default;
72
+ $blue-10: #173770 !default;
73
+
74
+ // Primitives Gray Colors (Premium Cool Slate Scale)
75
+ $gray-1: #f8fafc !default;
76
+ $gray-2: #f1f5f9 !default;
77
+ $gray-3: #e2e8f0 !default;
78
+ $gray-4: #cbd5e1 !default;
79
+ $gray-5: #94a3b8 !default;
80
+ $gray-6: #64748b !default;
81
+ $gray-7: #475569 !default;
82
+ $gray-8: #334155 !default;
83
+ $gray-9: #1e293b !default;
84
+ $gray-10: #0f172a !default;
85
85
 
86
86
  // Primitives Overlay
87
- $overlay-1: rgba(20, 20, 20, 0.302) !default;
88
- $overlay-2: rgba($gray-6, 0.6) !default;
87
+ $overlay-1: rgba($gray-10, 0.32) !default;
88
+ $overlay-2: rgba($gray-9, 0.6) !default;
89
89
 
90
90
  //Text colors emphasis
91
91
  $primary-text: $gray-10 !default;
@@ -65,54 +65,63 @@
65
65
  $active-border: null
66
66
  ) {
67
67
  $btn-color: var(--#{config.$prefix}#{$color}, #{map.get(tokens.$theme-colors, $color)});
68
- $btn-hover-color: if(
69
- $color-hover,
70
- var(--#{config.$prefix}#{$color-hover}, #{map.get(tokens.$theme-colors, $color-hover)}),
71
- var(--#{config.$prefix}white, #{colors.$white})
68
+ $btn-hover-color: var(--#{config.$prefix}white, #{colors.$white});
69
+ $btn-hover-bg: var(
70
+ --#{config.$prefix}#{$color}-hover,
71
+ #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -15%)}
72
72
  );
73
- $btn-hover-bg: if(
74
- $hover-background,
75
- var(
76
- --#{config.$prefix}#{$hover-background},
77
- #{map.get(tokens.$theme-colors, $hover-background)}
78
- ),
79
- var(
80
- --#{config.$prefix}#{$color}-hover,
81
- #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -15%)}
82
- )
73
+ $btn-hover-border: var(
74
+ --#{config.$prefix}#{$color}-hover,
75
+ #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -10%)}
83
76
  );
84
- $btn-hover-border: if(
85
- $hover-border,
86
- var(--#{config.$prefix}#{$hover-border}, #{map.get(tokens.$theme-colors, $hover-border)}),
87
- var(
88
- --#{config.$prefix}#{$color}-hover,
89
- #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -10%)}
90
- )
77
+ $btn-active-color: var(--#{config.$prefix}white, #{colors.$white});
78
+ $btn-active-bg: var(
79
+ --#{config.$prefix}#{$color}-hover,
80
+ #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -20%)}
91
81
  );
92
- $btn-active-color: if(
93
- $color-hover,
94
- var(--#{config.$prefix}#{$color-hover}, #{map.get(tokens.$theme-colors, $color-hover)}),
95
- var(--#{config.$prefix}white, #{colors.$white})
82
+ $btn-active-border: var(
83
+ --#{config.$prefix}#{$color}-hover,
84
+ #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -25%)}
96
85
  );
97
- $btn-active-bg: if(
98
- $active-background,
99
- var(
86
+
87
+ @if $color-hover {
88
+ $btn-hover-color: var(
89
+ --#{config.$prefix}#{$color-hover},
90
+ #{map.get(tokens.$theme-colors, $color-hover)}
91
+ );
92
+ $btn-active-color: var(
93
+ --#{config.$prefix}#{$color-hover},
94
+ #{map.get(tokens.$theme-colors, $color-hover)}
95
+ );
96
+ }
97
+
98
+ @if $hover-background {
99
+ $btn-hover-bg: var(
100
+ --#{config.$prefix}#{$hover-background},
101
+ #{map.get(tokens.$theme-colors, $hover-background)}
102
+ );
103
+ }
104
+
105
+ @if $hover-border {
106
+ $btn-hover-border: var(
107
+ --#{config.$prefix}#{$hover-border},
108
+ #{map.get(tokens.$theme-colors, $hover-border)}
109
+ );
110
+ }
111
+
112
+ @if $active-background {
113
+ $btn-active-bg: var(
100
114
  --#{config.$prefix}#{$active-background},
101
115
  #{map.get(tokens.$theme-colors, $active-background)}
102
- ),
103
- var(
104
- --#{config.$prefix}#{$color}-hover,
105
- #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -20%)}
106
- )
107
- );
108
- $btn-active-border: if(
109
- $active-border,
110
- var(--#{config.$prefix}#{$active-border}, #{map.get(tokens.$theme-colors, $active-border)}),
111
- var(
112
- --#{config.$prefix}#{$color}-hover,
113
- #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -25%)}
114
- )
115
- );
116
+ );
117
+ }
118
+
119
+ @if $active-border {
120
+ $btn-active-border: var(
121
+ --#{config.$prefix}#{$active-border},
122
+ #{map.get(tokens.$theme-colors, $active-border)}
123
+ );
124
+ }
116
125
 
117
126
  --#{config.$prefix}btn-color: #{$btn-color};
118
127
  --#{config.$prefix}btn-bg: transparent;
@@ -2,16 +2,19 @@
2
2
  @use '../01-settings/settings.grid' as grid;
3
3
  @use '../02-tools/tools.grid' as *;
4
4
  @use '../02-tools/tools.breakpoints' as *;
5
+ @use '../02-tools/tools.rem' as *;
5
6
 
6
7
  .o-grid {
7
- --#{config.$prefix}gutter-y: #{grid.$grid-gutter-width};
8
+ --#{config.$prefix}gutter-y: #{rem(grid.$grid-gutter-width)};
8
9
  @include make-row();
10
+ row-gap: var(--#{config.$prefix}gutter-y);
9
11
 
10
12
  &__col {
11
13
  @include make-col-ready();
12
14
  }
13
15
 
14
16
  &--no-gutters {
17
+ --#{config.$prefix}gutter-y: 0;
15
18
  margin-right: 0;
16
19
  margin-left: 0;
17
20
 
@@ -76,8 +76,8 @@
76
76
 
77
77
  --atomix-glass-border-shadow:
78
78
  0 0 0 0.5px var(--atomix-glass-border-color, #{$glass-border-color}) inset,
79
- 0 1px 2px var(--atomix-glass-inner-shadow-color, #{$glass-inner-shadow-color}) inset,
80
- 0 2px 6px var(--atomix-glass-outer-shadow-color, #{$glass-outer-shadow-color});
79
+ 0 1px 1px var(--atomix-glass-inner-shadow-color, #{$glass-inner-shadow-color}) inset,
80
+ 0 1px 3px var(--atomix-glass-outer-shadow-color, #{$glass-outer-shadow-color});
81
81
 
82
82
  // ── Over-light decorative layers (base, overlay) ─────────────────────────
83
83
  // These use var-based positioning so they correctly follow the container in