@shohojdhara/atomix 0.4.7 → 0.4.9

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 (176) hide show
  1. package/atomix.config.ts +58 -1
  2. package/dist/atomix.css +172 -157
  3. package/dist/atomix.css.map +1 -1
  4. package/dist/atomix.min.css +4 -4
  5. package/dist/atomix.min.css.map +1 -1
  6. package/dist/charts.d.ts +33 -0
  7. package/dist/charts.js +1274 -164
  8. package/dist/charts.js.map +1 -1
  9. package/dist/core.d.ts +33 -10
  10. package/dist/core.js +1099 -83
  11. package/dist/core.js.map +1 -1
  12. package/dist/forms.d.ts +33 -0
  13. package/dist/forms.js +2106 -1050
  14. package/dist/forms.js.map +1 -1
  15. package/dist/heavy.d.ts +42 -1
  16. package/dist/heavy.js +1663 -638
  17. package/dist/heavy.js.map +1 -1
  18. package/dist/index.d.ts +442 -270
  19. package/dist/index.esm.js +1947 -680
  20. package/dist/index.esm.js.map +1 -1
  21. package/dist/index.js +1982 -712
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.min.js +1 -1
  24. package/dist/index.min.js.map +1 -1
  25. package/package.json +6 -3
  26. package/scripts/atomix-cli.js +136 -1827
  27. package/scripts/cli/__tests__/basic.test.js +3 -2
  28. package/scripts/cli/__tests__/clean.test.js +278 -0
  29. package/scripts/cli/__tests__/component-validator.test.js +433 -0
  30. package/scripts/cli/__tests__/generator.test.js +613 -0
  31. package/scripts/cli/__tests__/glass-motion.test.js +256 -0
  32. package/scripts/cli/__tests__/integration.test.js +719 -108
  33. package/scripts/cli/__tests__/migrate.test.js +74 -0
  34. package/scripts/cli/__tests__/security.test.js +206 -0
  35. package/scripts/cli/__tests__/test-setup.js +3 -1
  36. package/scripts/cli/__tests__/theme-bridge.test.js +507 -0
  37. package/scripts/cli/__tests__/token-provider.test.js +361 -0
  38. package/scripts/cli/__tests__/utils.test.js +5 -5
  39. package/scripts/cli/commands/benchmark.js +105 -0
  40. package/scripts/cli/commands/build-theme.js +115 -0
  41. package/scripts/cli/commands/clean.js +109 -0
  42. package/scripts/cli/commands/doctor.js +88 -0
  43. package/scripts/cli/commands/generate.js +218 -0
  44. package/scripts/cli/commands/init.js +73 -0
  45. package/scripts/cli/commands/migrate.js +106 -0
  46. package/scripts/cli/commands/sync-tokens.js +206 -0
  47. package/scripts/cli/commands/theme-bridge.js +248 -0
  48. package/scripts/cli/commands/tokens.js +157 -0
  49. package/scripts/cli/commands/validate.js +194 -0
  50. package/scripts/cli/internal/ai-engine.js +156 -0
  51. package/scripts/cli/internal/compiler.js +114 -0
  52. package/scripts/cli/internal/component-validator.js +443 -0
  53. package/scripts/cli/internal/config-loader.js +162 -0
  54. package/scripts/cli/internal/filesystem.js +158 -0
  55. package/scripts/cli/internal/generator.js +430 -0
  56. package/scripts/cli/internal/glass-generator.js +398 -0
  57. package/scripts/cli/internal/hook-generator.js +369 -0
  58. package/scripts/cli/internal/hooks.js +61 -0
  59. package/scripts/cli/internal/itcss-generator.js +565 -0
  60. package/scripts/cli/internal/motion-generator.js +679 -0
  61. package/scripts/cli/internal/template-engine.js +301 -0
  62. package/scripts/cli/internal/theme-bridge.js +664 -0
  63. package/scripts/cli/internal/tokens/engine.js +122 -0
  64. package/scripts/cli/internal/tokens/provider.js +34 -0
  65. package/scripts/cli/internal/tokens/providers/figma.js +50 -0
  66. package/scripts/cli/internal/tokens/providers/style-dictionary.js +48 -0
  67. package/scripts/cli/internal/tokens/providers/w3c.js +48 -0
  68. package/scripts/cli/internal/tokens/token-provider.js +443 -0
  69. package/scripts/cli/internal/tokens/token-validator.js +513 -0
  70. package/scripts/cli/internal/validator.js +276 -0
  71. package/scripts/cli/internal/wizard.js +115 -0
  72. package/scripts/cli/mappings.js +23 -0
  73. package/scripts/cli/migration-tools.js +164 -94
  74. package/scripts/cli/plugins/style-dictionary.js +46 -0
  75. package/scripts/cli/templates/README.md +525 -95
  76. package/scripts/cli/templates/common-templates.js +40 -14
  77. package/scripts/cli/templates/components/react-component.ts +282 -0
  78. package/scripts/cli/templates/config/project-config.ts +112 -0
  79. package/scripts/cli/templates/hooks/use-component.ts +477 -0
  80. package/scripts/cli/templates/index.js +19 -4
  81. package/scripts/cli/templates/index.ts +171 -0
  82. package/scripts/cli/templates/next-templates.js +72 -0
  83. package/scripts/cli/templates/react-templates.js +70 -126
  84. package/scripts/cli/templates/scss-templates.js +35 -35
  85. package/scripts/cli/templates/stories/storybook-story.ts +241 -0
  86. package/scripts/cli/templates/styles/scss-component.ts +255 -0
  87. package/scripts/cli/templates/tests/vitest-test.ts +229 -0
  88. package/scripts/cli/templates/token-templates.js +337 -1
  89. package/scripts/cli/templates/tokens/token-generators.ts +1088 -0
  90. package/scripts/cli/templates/types/component-types.ts +145 -0
  91. package/scripts/cli/templates/utils/testing-utils.ts +144 -0
  92. package/scripts/cli/templates/vanilla-templates.js +39 -0
  93. package/scripts/cli/token-manager.js +8 -2
  94. package/scripts/cli/utils/cache-manager.js +240 -0
  95. package/scripts/cli/utils/detector.js +46 -0
  96. package/scripts/cli/utils/diagnostics.js +289 -0
  97. package/scripts/cli/utils/error.js +89 -0
  98. package/scripts/cli/utils/helpers.js +67 -0
  99. package/scripts/cli/utils/logger.js +75 -0
  100. package/scripts/cli/utils/security.js +302 -0
  101. package/scripts/cli/utils/telemetry.js +115 -0
  102. package/scripts/cli/utils/validation.js +37 -0
  103. package/scripts/cli/utils.js +28 -341
  104. package/src/components/Accordion/Accordion.stories.tsx +0 -18
  105. package/src/components/Accordion/Accordion.test.tsx +0 -17
  106. package/src/components/Accordion/Accordion.tsx +0 -4
  107. package/src/components/AtomixGlass/AtomixGlass.test.tsx +37 -3
  108. package/src/components/AtomixGlass/AtomixGlass.tsx +143 -31
  109. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +129 -31
  110. package/src/components/AtomixGlass/PerformanceDashboard.tsx +219 -0
  111. package/src/components/AtomixGlass/README.md +25 -10
  112. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +216 -0
  113. package/src/components/AtomixGlass/animation-system.ts +578 -0
  114. package/src/components/AtomixGlass/shader-utils.ts +4 -1
  115. package/src/components/AtomixGlass/stories/Overview.stories.tsx +157 -6
  116. package/src/components/AtomixGlass/stories/Phase1-Animation.stories.tsx +653 -0
  117. package/src/components/AtomixGlass/stories/Phase1-Test.stories.tsx +95 -0
  118. package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -51
  119. package/src/components/AtomixGlass/stories/shared-components.tsx +6 -0
  120. package/src/components/Avatar/Avatar.tsx +1 -1
  121. package/src/components/Button/Button.stories.disabled-link.tsx +10 -0
  122. package/src/components/Button/Button.stories.tsx +10 -0
  123. package/src/components/Button/Button.test.tsx +16 -11
  124. package/src/components/Button/Button.tsx +4 -4
  125. package/src/components/Card/Card.tsx +1 -1
  126. package/src/components/Dropdown/Dropdown.tsx +12 -12
  127. package/src/components/Form/Select.tsx +62 -3
  128. package/src/components/Modal/Modal.tsx +14 -3
  129. package/src/components/Navigation/Navbar/Navbar.tsx +44 -0
  130. package/src/components/Slider/Slider.stories.tsx +3 -3
  131. package/src/components/Slider/Slider.tsx +38 -0
  132. package/src/components/Steps/Steps.tsx +3 -3
  133. package/src/components/Tabs/Tabs.tsx +77 -8
  134. package/src/components/Testimonial/Testimonial.tsx +1 -1
  135. package/src/components/TypedButton/TypedButton.stories.tsx +59 -0
  136. package/src/components/TypedButton/TypedButton.tsx +39 -0
  137. package/src/components/TypedButton/index.ts +2 -0
  138. package/src/components/VideoPlayer/VideoPlayer.tsx +11 -4
  139. package/src/lib/composables/index.ts +4 -7
  140. package/src/lib/composables/types.ts +45 -0
  141. package/src/lib/composables/useAccordion.ts +0 -7
  142. package/src/lib/composables/useAtomixGlass.ts +148 -6
  143. package/src/lib/composables/useAtomixGlassStyles.ts +9 -7
  144. package/src/lib/composables/useChartExport.ts +3 -13
  145. package/src/lib/composables/useDropdown.ts +66 -0
  146. package/src/lib/composables/useFocusTrap.ts +80 -0
  147. package/src/lib/composables/usePerformanceMonitor.ts +448 -0
  148. package/src/lib/composables/useResponsiveGlass.presets.ts +192 -0
  149. package/src/lib/composables/useResponsiveGlass.ts +441 -0
  150. package/src/lib/composables/useTooltip.ts +16 -0
  151. package/src/lib/composables/useTypedButton.ts +66 -0
  152. package/src/lib/config/index.ts +62 -5
  153. package/src/lib/constants/components.ts +62 -7
  154. package/src/lib/theme/devtools/__tests__/useHistory.test.tsx +150 -0
  155. package/src/lib/theme/tokens/centralized-tokens.ts +120 -0
  156. package/src/lib/theme/utils/__tests__/domUtils.test.ts +101 -0
  157. package/src/lib/types/components.ts +37 -11
  158. package/src/lib/types/glass.ts +35 -0
  159. package/src/lib/types/index.ts +1 -0
  160. package/src/lib/utils/displacement-generator.ts +1 -1
  161. package/src/styles/01-settings/_settings.testtypecheck.scss +53 -0
  162. package/src/styles/01-settings/_settings.typedbutton.scss +53 -0
  163. package/src/styles/06-components/_components.atomix-glass.scss +17 -21
  164. package/src/styles/06-components/_components.edge-panel.scss +1 -5
  165. package/src/styles/06-components/_components.modal.scss +1 -4
  166. package/src/styles/06-components/_components.navbar.scss +1 -1
  167. package/src/styles/06-components/_components.testbutton.scss +212 -0
  168. package/src/styles/06-components/_components.testtypecheck.scss +212 -0
  169. package/src/styles/06-components/_components.tooltip.scss +9 -5
  170. package/src/styles/06-components/_components.typedbutton.scss +212 -0
  171. package/src/styles/99-utilities/_index.scss +1 -0
  172. package/src/styles/99-utilities/_utilities.text.scss +1 -1
  173. package/src/styles/99-utilities/_utilities.touch-target.scss +36 -0
  174. package/scripts/cli/component-generator.js +0 -564
  175. package/scripts/cli/interactive-init.js +0 -357
  176. package/src/styles/06-components/old.chart.styles.scss +0 -2788
@@ -0,0 +1,219 @@
1
+ import React, { useMemo } from 'react';
2
+ import type { PerformanceMetrics } from '../../lib/composables/usePerformanceMonitor';
3
+
4
+ interface PerformanceDashboardProps {
5
+ metrics: PerformanceMetrics;
6
+ isVisible?: boolean;
7
+ onClose?: () => void;
8
+ }
9
+
10
+ /**
11
+ * PerformanceDashboard - Real-time performance monitoring overlay
12
+ *
13
+ * Displays:
14
+ * - Current FPS with color coding
15
+ * - Frame time statistics
16
+ * - Quality level indicator
17
+ * - GPU memory usage (if available)
18
+ * - Auto-scaling status
19
+ */
20
+ export const PerformanceDashboard: React.FC<PerformanceDashboardProps> = ({
21
+ metrics,
22
+ isVisible = true,
23
+ onClose
24
+ }) => {
25
+ // Get color for FPS display
26
+ const getFpsColor = (fps: number): string => {
27
+ if (fps >= 58) return '#4ade80'; // Green - good
28
+ if (fps >= 45) return '#fbbf24'; // Yellow - warning
29
+ return '#ef4444'; // Red - critical
30
+ };
31
+
32
+ // Get quality level badge color
33
+ const getQualityColor = (quality: string): string => {
34
+ switch (quality) {
35
+ case 'high': return '#4ade80';
36
+ case 'medium': return '#fbbf24';
37
+ case 'low': return '#ef4444';
38
+ default: return '#9ca3af';
39
+ }
40
+ };
41
+
42
+ // Dashboard styles
43
+ const dashboardStyle: React.CSSProperties = useMemo(() => ({
44
+ position: 'fixed',
45
+ top: '16px',
46
+ right: '16px',
47
+ padding: '12px 16px',
48
+ backgroundColor: 'rgba(17, 24, 39, 0.95)',
49
+ borderRadius: '8px',
50
+ boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',
51
+ fontFamily: 'monospace',
52
+ fontSize: '12px',
53
+ color: '#fff',
54
+ zIndex: 9999,
55
+ minWidth: '200px',
56
+ backdropFilter: 'blur(8px)',
57
+ border: '1px solid rgba(255, 255, 255, 0.1)',
58
+ transition: 'opacity 0.3s ease',
59
+ opacity: isVisible ? 1 : 0,
60
+ pointerEvents: isVisible ? 'auto' : 'none',
61
+ }), [isVisible]);
62
+
63
+ const headerStyle: React.CSSProperties = useMemo(() => ({
64
+ display: 'flex',
65
+ justifyContent: 'space-between',
66
+ alignItems: 'center',
67
+ marginBottom: '8px',
68
+ paddingBottom: '8px',
69
+ borderBottom: '1px solid rgba(255, 255, 255, 0.1)',
70
+ }), []);
71
+
72
+ const titleStyle: React.CSSProperties = useMemo(() => ({
73
+ fontWeight: 'bold',
74
+ fontSize: '13px',
75
+ color: '#fff',
76
+ }), []);
77
+
78
+ const closeButtonStyle: React.CSSProperties = useMemo(() => ({
79
+ background: 'transparent',
80
+ border: 'none',
81
+ color: '#9ca3af',
82
+ cursor: 'pointer',
83
+ fontSize: '16px',
84
+ padding: '0',
85
+ lineHeight: '1',
86
+ }), []);
87
+
88
+ const metricRowStyle: React.CSSProperties = useMemo(() => ({
89
+ display: 'flex',
90
+ justifyContent: 'space-between',
91
+ alignItems: 'center',
92
+ marginBottom: '6px',
93
+ }), []);
94
+
95
+ const labelStyle: React.CSSProperties = useMemo(() => ({
96
+ color: '#9ca3af',
97
+ marginRight: '12px',
98
+ }), []);
99
+
100
+ const valueStyle: React.CSSProperties = useMemo(() => ({
101
+ fontWeight: 'bold',
102
+ }), []);
103
+
104
+ if (!isVisible) return null;
105
+
106
+ return (
107
+ <div style={dashboardStyle}>
108
+ {/* Header */}
109
+ <div style={headerStyle}>
110
+ <span style={titleStyle}>Performance Monitor</span>
111
+ {onClose && (
112
+ <button
113
+ style={closeButtonStyle}
114
+ onClick={onClose}
115
+ aria-label="Close performance dashboard"
116
+ >
117
+ ×
118
+ </button>
119
+ )}
120
+ </div>
121
+
122
+ {/* FPS Display */}
123
+ <div style={metricRowStyle}>
124
+ <span style={labelStyle}>FPS</span>
125
+ <span
126
+ style={{
127
+ ...valueStyle,
128
+ color: getFpsColor(metrics.fps)
129
+ }}
130
+ >
131
+ {Math.round(metrics.fps)}
132
+ </span>
133
+ </div>
134
+
135
+ {/* Frame Time */}
136
+ <div style={metricRowStyle}>
137
+ <span style={labelStyle}>Frame Time</span>
138
+ <span style={valueStyle}>
139
+ {metrics.frameTime.toFixed(2)}ms
140
+ </span>
141
+ </div>
142
+
143
+ {/* Quality Level */}
144
+ <div style={metricRowStyle}>
145
+ <span style={labelStyle}>Quality</span>
146
+ <span
147
+ style={{
148
+ ...valueStyle,
149
+ color: getQualityColor(metrics.qualityLevel),
150
+ textTransform: 'uppercase',
151
+ fontSize: '11px',
152
+ }}
153
+ >
154
+ {metrics.qualityLevel}
155
+ </span>
156
+ </div>
157
+
158
+ {/* GPU Memory (if available) */}
159
+ {metrics.gpuMemory && (
160
+ <div style={metricRowStyle}>
161
+ <span style={labelStyle}>GPU Memory</span>
162
+ <span style={valueStyle}>
163
+ ~{Math.round(metrics.gpuMemory / 1024)}MB
164
+ </span>
165
+ </div>
166
+ )}
167
+
168
+ {/* Auto-scaling Status */}
169
+ {metrics.isAutoScaling && (
170
+ <div style={{
171
+ marginTop: '8px',
172
+ paddingTop: '8px',
173
+ borderTop: '1px solid rgba(255, 255, 255, 0.1)',
174
+ fontSize: '10px',
175
+ color: '#6b7280',
176
+ textAlign: 'center',
177
+ }}>
178
+ Auto-scaling active
179
+ </div>
180
+ )}
181
+
182
+ {/* Performance Status Indicator */}
183
+ <div style={{
184
+ marginTop: '8px',
185
+ paddingTop: '8px',
186
+ borderTop: '1px solid rgba(255, 255, 255, 0.1)',
187
+ display: 'flex',
188
+ alignItems: 'center',
189
+ gap: '6px',
190
+ }}>
191
+ <div style={{
192
+ width: '8px',
193
+ height: '8px',
194
+ borderRadius: '50%',
195
+ backgroundColor: getFpsColor(metrics.fps),
196
+ animation: metrics.fps < 45 ? 'pulse 1s infinite' : 'none',
197
+ }} />
198
+ <span style={{
199
+ fontSize: '10px',
200
+ color: metrics.fps >= 58 ? '#4ade80' : metrics.fps >= 45 ? '#fbbf24' : '#ef4444',
201
+ }}>
202
+ {metrics.fps >= 58 ? 'Optimal' : metrics.fps >= 45 ? 'Warning' : 'Critical'}
203
+ </span>
204
+ </div>
205
+ </div>
206
+ );
207
+ };
208
+
209
+ // Add pulse animation for critical FPS
210
+ if (typeof document !== 'undefined') {
211
+ const styleSheet = document.createElement('style');
212
+ styleSheet.textContent = `
213
+ @keyframes pulse {
214
+ 0%, 100% { opacity: 1; }
215
+ 50% { opacity: 0.5; }
216
+ }
217
+ `;
218
+ document.head.appendChild(styleSheet);
219
+ }
@@ -40,25 +40,38 @@ function MyComponent() {
40
40
  | Prop | Type | Default | Description |
41
41
  |------|------|---------|-------------|
42
42
  | `children` | ReactNode | - | Content to be rendered inside the glass container |
43
- | `displacementScale` | number | 20 | Controls the intensity of the displacement effect |
44
- | `blurAmount` | number | 10 | Controls the intensity of the blur effect |
45
- | `saturation` | number | 150 | Controls the color saturation (100 is normal) |
46
- | `aberrationIntensity` | number | 1.5 | Controls the chromatic aberration effect intensity |
47
- | `elasticity` | number | 0.5 | Controls how responsive the glass is to mouse movement |
43
+ | `displacementScale` | number | 70 | Controls the intensity of the displacement effect |
44
+ | `blurAmount` | number | 0 | Controls the intensity of the blur effect |
45
+ | `saturation` | number | 140 | Controls the color saturation (100 is normal) |
46
+ | `aberrationIntensity` | number | 2 | Controls the chromatic aberration effect intensity |
47
+ | `elasticity` | number | 0.15 | Controls how responsive the glass is to mouse movement |
48
48
  | `borderRadius` | number | 15 | Border radius of the glass container |
49
49
  | `globalMousePos` | boolean | false | Whether to use global mouse position instead of local |
50
50
  | `mouseOffset` | { x: number, y: number } | { x: 0, y: 0 } | Offset for mouse position calculation |
51
51
  | `mouseContainer` | RefObject<HTMLElement> | null | Container to use for mouse position calculation |
52
- | `padding` | number | 0 | Additional padding around the content |
52
+ | `padding` | string | '0' | Additional padding around the content |
53
+ | `height` | string \| number | undefined | Height of the glass component |
54
+ | `width` | string \| number | undefined | Width of the glass component |
53
55
  | `style` | CSSProperties | {} | Additional CSS styles |
54
56
  | `overLight` | boolean \| 'auto' \| OverLightObjectConfig | 'auto' | OverLight configuration. See [OverLight Configuration](#overlight-configuration) section for details |
55
57
  | `withOverLightLayers` | boolean | true | Whether to render additional overlay layers for overLight mode |
56
58
  | `debugOverLight` | boolean | false | Enable debug logging for overLight detection and configuration |
57
59
  | `mode` | 'standard' \| 'polar' \| 'prominent' \| 'shader' | 'standard' | The glass effect mode |
58
60
  | `onClick` | function | undefined | Click handler |
59
- | `showBorderEffects` | boolean | true | Whether to show border effects |
60
- | `showHoverEffects` | boolean | true | Whether to show hover effects |
61
- | `active` | boolean | false | Whether the glass is in active state |
61
+ | `withBorder` | boolean | true | Whether to show border effects |
62
+ | `withLiquidBlur` | boolean | false | Whether to enable liquid blur effects |
63
+ | `withoutEffects` | boolean | false | Whether to disable all visual effects |
64
+ | `reducedMotion` | boolean | false | Force reduced motion preference |
65
+ | `highContrast` | boolean | false | Force high contrast mode |
66
+ | `withTimeAnimation` | boolean | true | Enable time-based animation (Phase 1) |
67
+ | `animationSpeed` | number | 1.0 | Animation speed multiplier (Phase 1) |
68
+ | `withMultiLayerDistortion` | boolean | false | Enable multi-layer distortion using FBM (Phase 1) |
69
+ | `distortionOctaves` | number | 5 | Number of octaves for FBM (Phase 1) |
70
+ | `distortionLacunarity` | number | 2.0 | Lacunarity for FBM (Phase 1) |
71
+ | `distortionGain` | number | 0.5 | Gain for FBM (Phase 1) |
72
+ | `distortionQuality` | 'low' \| 'medium' \| 'high' \| 'ultra' | 'high' | Quality preset for FBM (Phase 1) |
73
+ | `debugPerformance` | boolean | false | Enable performance monitoring dashboard (development only) |
74
+ | `debugBorderRadius` | boolean | false | Debug mode for corner radius extraction |
62
75
 
63
76
  ## Glass Effect Modes
64
77
 
@@ -80,8 +93,10 @@ The AtomixGlass component uses several advanced CSS features and SVG filters tha
80
93
 
81
94
  1. Use sparingly on pages with many instances
82
95
  2. Consider disabling effects on lower-end devices
83
- 3. Use the `showBorderEffects` and `showHoverEffects` props to disable non-essential effects when needed
96
+ 3. Use the `withoutEffects` prop to disable non-essential effects when needed
84
97
  4. Avoid using very high values for `displacementScale` and `blurAmount`
98
+ 5. Use `reducedMotion` for users with vestibular disorders
99
+ 6. Consider using lower `distortionQuality` presets on mobile devices
85
100
 
86
101
  ## Accessibility
87
102
 
@@ -0,0 +1,216 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`AtomixGlass Visual Regression > matches snapshot with default props 1`] = `
4
+ <div>
5
+ <div
6
+ class="c-atomix-glass"
7
+ style="--atomix-glass-radius: 16px; --atomix-glass-transform: scale(1); --atomix-glass-top: 0px; --atomix-glass-left: 0px; --atomix-glass-width: 270px; --atomix-glass-height: 69px; --atomix-glass-border-width: var(--atomix-spacing-0-5, 0.09375rem); --atomix-glass-blend-mode: overlay; --atomix-glass-border-gradient-1: linear-gradient(135deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.08399999999999999) 33%, rgba(255, 255, 255, 0.27999999999999997) 66%, rgba(255, 255, 255, 0) 100%); --atomix-glass-border-gradient-2: linear-gradient(135deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.22399999999999998) 33%, rgba(255, 255, 255, 0.42) 66%, rgba(255, 255, 255, 0) 100%); --atomix-glass-hover-1-opacity: 0; --atomix-glass-hover-1-gradient: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.5) 0%, rgba(255, 255, 255, 0) 50%); --atomix-glass-hover-2-opacity: 0; --atomix-glass-hover-2-gradient: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 80%); --atomix-glass-hover-3-opacity: 0; --atomix-glass-hover-3-gradient: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%); --atomix-glass-base-opacity: 0; --atomix-glass-base-gradient: rgba(255, 255, 255, 0.1); --atomix-glass-overlay-opacity: 0; --atomix-glass-overlay-gradient: rgba(255, 255, 255, 0.05); --atomix-glass-overlay-highlight-opacity: 0; --atomix-glass-overlay-highlight-bg: radial-gradient(circle at 20% 20%, rgba(255, 255, 255, 0.4) 0%, transparent 60%);"
8
+ >
9
+ <div
10
+ class="c-atomix-glass__container "
11
+ style="position: relative; --atomix-glass-container-radius: 16px; --atomix-glass-container-backdrop: blur(0.1px) saturate(140%) contrast(1.4) brightness(0.9); --atomix-glass-container-shadow: 0 0 20px rgba(0, 0, 0, 0.15) inset, 0 4px 8px rgba(0, 0, 0, 0.08) inset; --atomix-glass-container-shadow-opacity: 1; --atomix-glass-container-bg: none; --atomix-glass-container-text-shadow: 0px 2px 12px rgba(0, 0, 0, 0.4); --atomix-glass-container-box-shadow: 0px 12px 40px rgba(0, 0, 0, 0.25); --atomix-glass-container-width: 100%; --atomix-glass-container-height: 100%; --atomix-glass-container-padding: 0;"
12
+ >
13
+ <div
14
+ class="c-atomix-glass__inner"
15
+ >
16
+ <div
17
+ class="c-atomix-glass__filter"
18
+ >
19
+ <svg
20
+ aria-hidden="true"
21
+ style="position: absolute; width: 100%; height: 100%; inset: 0;"
22
+ >
23
+ <defs>
24
+ <radialgradient
25
+ cx="50%"
26
+ cy="50%"
27
+ id="atomix-glass-filter-16-edge-mask"
28
+ r="50%"
29
+ >
30
+ <stop
31
+ offset="0%"
32
+ stop-color="black"
33
+ stop-opacity="0"
34
+ />
35
+ <stop
36
+ offset="76%"
37
+ stop-color="black"
38
+ stop-opacity="0"
39
+ />
40
+ <stop
41
+ offset="100%"
42
+ stop-color="white"
43
+ stop-opacity="1"
44
+ />
45
+ </radialgradient>
46
+ <filter
47
+ color-interpolation-filters="sRGB"
48
+ height="170%"
49
+ id="atomix-glass-filter-16"
50
+ width="170%"
51
+ x="-35%"
52
+ y="-35%"
53
+ >
54
+ <feimage
55
+ height="100%"
56
+ href="data:image/jpeg;base64,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cUAUAkEkziomgGgkoxZGgxZFQFQlYnQHRdPfj/10KCSCKESCNiVkViPSLpD0h6I0Q0I0A2IoBWBIJIBKBIJoJIJ2R2J0JWBUJ0JUB0XTv479dFZDYiglYigkhEgjZFQjRFQjRFQjQigFYigHYigmgEgmglYlYnQlQlYlQHQlQnQ9P/kf1yVkNiNCNkNiVENiNiViNEViNkVCVgKCViViViSCViSCVgdCViVCViVCdgVCVCdD1D+U/XBWQ2I0I2Q2JUQ2I0JWQ0I2JUQ2JUI2JUI2J0JWJWJWA2R0BWJ0I2JUJ2BUJUJ0P//EABkQAQEBAQEBAAAAAAAAAAAAAAECABEDEP/aAAgBAQABAgB1atWrVq1atWrVq1atWrVq1atWrVq1atWrVq+OrVq1atWrVq1atWrVq1atWrVq1atWrVq1atXxVppppppdWrVq1atWrVq1NNNNNNNNNNNPVWmmmmms6tWrVq1atWpppppppppppppp6q0000uc51atWrVq1ammmmmmmmmmmmmt1Vpppc5znVq1atWrVqaaaaaaaaaaaaaeqtNLnOc51atWrVq1ammmmmmmmmmmmmnqrS5znOc6tWrVq16222mmmmmmlVppp6tKuc5znOrVq1a9TbbbbTTTTTSq000qtLnOc5zq1atWrW0222200000qqqtKqrnOc5zq1atTbbbbbbbbTTTSqqqqqq5znOc6tTTTbbbbbbbbTTTSqqqqrlVznOctNNNtttttttttNNNNKqqqrqznKqrTTTTbbbbbbbbbTTTSqqqqrqznOc5aaaabbbbbbbbbaaaaVVVVVdWc5znVq1NNttttttttttNNKqqqqudWc5znVq16tbbbbbbbbbbTTSqqqq5XVnOc6tWrVrb1tttttttttNNKqqqqrWrK5VWmmm2230bbbbbbaaaXOc5zlVa1KuVVppptttt9G22222mmlzlVznK6tWVVWmmmm2222222222mlznOc5znLWppVVWmmm22222229bTWrOc5znOcq1qaaVpWmm222222229erVqznOc5znKtatStK0rTbTTbbbberXr1as5znOc5aVpppppWlabaabbbb1ta9WrVnOc5znU0rTTTTTTTTTbTTbbbTWvVq1as5znOdTTStNNNNNNNNNtNNtttN6tWvVq1ZznOrU00rTTTTTTTTTTTTTbTWvVq1atWrOc6tTTTStNNNNNNNNNNtNNtNa9WrVq1Z1Z1NNNNNK1q1NNNNNNNNNNNtNatWrVq1atWrU00000rWrVq1atWrVq1alaaa1atWrVq1NNNammmmla1atWrVq1aterVq16tWrVnVqa1NK1qaaaVX/xAAWEAADAAAAAAAAAAAAAAAAAAAhgJD/2gAIAQEAAz8AaExf/8QAGhEBAQEBAQEBAAAAAAAAAAAAAQISEQADEP/aAAgBAgEBAgDx48ePHjx48ePHjx48ePHjx48ePHjx48ePHj86IiIiIiInjx48ePHjx48IiIiIj0oooooooooRERER73ve60UUUUUUVrWiiiiiihERERER73ve97ooooorRWiiiiihKERERER73ve973RRRRWtFFFFFFCIiIiIiPe973ve60UUVrRRRRRRQiIlCIiI973ve973pRRWiiiiiiiiiiiiiiihEe973ve973RRWtFFFFFFFFFFFFFFFFFFa13ve973WitaKKKKKKKKKKKKKKKKKK1rWtd1rutFa1oooooooooooosssooorWta1rWta1rRRRRRRRRRRZZZZZZZZZWta1rWta1rRRRRRRRRZZZZZZZZZZZZe9a1rWta1rWitaKLLLLLLLLLLLLLLLLL3rWta1rWtFbLLLLLLLLLLLLLLLLLLLL3vWta1rWita1ssssssss+hZZZZZZZZe961rWta0Vre97LLLLLLLLLLLPoWWWWWXrWta1oorWta3ssss+hZZZZ9Cyyyyyyyyiita1orWta1ve9llllllllllllllllFFa0VorWta1ve9llllllllllllllllllFFFaK1rWta1rWiyyyyyyyyyyyyiiiiiiitFFa1rWta1oosoosssssoooosoooorRRRWta1rWta0UUUUUWUUUUUUUUUUUVoooorWta1rWtaKKKKKKmiiiiiiiiiiiiiiitd73ve61oSiiipoqaKKKKKKKKKK0UUUVrve973vREREZoSihEooooorRRRRWtd73ve9EREREREoSiiiiitFllllla73ve9ERERERESiiiiiitH0PoWWWWVrXe96IiIiMoiJRRRRRRWjwlFFllllFFd6IiIiIlCUUUUUUUUUePHjx48ePCIiIiIiIiUUUUUUUUUUUePHjx48ePHjx48ePHjx48IiUUUUUUJRRRX//xAAWEQADAAAAAAAAAAAAAAAAAAABYJD/2gAIAQIBAz8AtEV7/8QAFxEBAQEBAAAAAAAAAAAAAAAAAAECEP/aAAgBAwEBAgCtNNNNNNNNNNNNNNNNNNNNNNNNNNNNNcrTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXKrTTTTTTTU000000000000000000001FVpppppqampqaaaaaaaaaaaaaaaaaaaa5Vaaaaampqampqammmmmmmmmmmlaaaaaaiq0001NTU1NTU1NTTTTTTTTTTSqqtNNNcqtNNSyzU1LNTU1NTTTTTTTTTSqqq001ytNLLLLNTU1NTU1NTbbbTTTTTSqqq001ytNLLLLLNTU1NTU3NttttNNNNNKqq001KrSyyyyyzU1NTU3Nzc02220000qqqqrSqqyyyyyzU1NTU3Nzc3NttttNNNKqqqqqqssssss1NTU3Nzc3NzbbbbTTTSqqqqqqrLLLLLNTU1Nzc3Nzc22220000qqqqqqqqssss1NTU3Nzc3NzbbbbbTTSqqqqqqqqqqzU1NTc3Nzc3Nzbc22000qqqqqqqqqqqtTU3Nzc3Nzc3NtzbTTSqqqqrKqqqqqtNNzc23Nzc3Nzc3NTU1KqqqrKqqqqqtNNNNttzc3Nzc3NzU1NLLLLLKqqqqqqqq0022223Nzc3NzU1NSyyyyyyqqqqqqqrTTbbbbc3Nzc3NTU1LLLLLLKsqqqqqqrTTTTbbbc3Nzc1NTUsssssssqqqqqqrTTTTTbbbTc3NTU1NTUsssssqqqqqqqq0000222023NTU1NTUsssssqqqqqqqq000000003NTU1NTU1LLLLLNKrTSqqqqtNNNNNNtNNTU1NSzUssss00qq0qqqqrTTTTTTTTTU1NTUs1LLLNNNKrTTTSqqq00000000001NTU1LNTU0000qtNNNKqqqtNNNNNNNNTU1NTUs1NNNNNKss1NNNK00qtK0000001NNTU0s000000qq000001NKrStNNNNK1NNNNStNNNNNKqtNNNNNNNK0000000rU0000rTTTTTSq00000rTTTTTTTTTTTTTTTTStNNNNKr/xAAUEQEAAAAAAAAAAAAAAAAAAACg/9oACAEDAQM/AAAf/9k="
57
+ id="atomix-glass-filter-16-image"
58
+ preserveAspectRatio="xMidYMid slice"
59
+ result="DISPLACEMENT_MAP"
60
+ width="100%"
61
+ x="0"
62
+ y="0"
63
+ />
64
+ <fecolormatrix
65
+ in="DISPLACEMENT_MAP"
66
+ result="EDGE_INTENSITY"
67
+ type="matrix"
68
+ values="0.3 0.3 0.3 0 0
69
+ 0.3 0.3 0.3 0 0
70
+ 0.3 0.3 0.3 0 0
71
+ 0 0 0 1 0"
72
+ />
73
+ <fecomponenttransfer
74
+ in="EDGE_INTENSITY"
75
+ result="EDGE_MASK"
76
+ >
77
+ <fefunca
78
+ tableValues="0 0.1 1"
79
+ type="discrete"
80
+ />
81
+ </fecomponenttransfer>
82
+ <feoffset
83
+ dx="0"
84
+ dy="0"
85
+ in="SourceGraphic"
86
+ result="CENTER_ORIGINAL"
87
+ />
88
+ <fedisplacementmap
89
+ in="SourceGraphic"
90
+ in2="DISPLACEMENT_MAP"
91
+ result="RED_DISPLACED"
92
+ scale="-70"
93
+ xChannelSelector="R"
94
+ yChannelSelector="B"
95
+ />
96
+ <fecolormatrix
97
+ in="RED_DISPLACED"
98
+ result="RED_CHANNEL"
99
+ type="matrix"
100
+ values="1 0 0 0 0
101
+ 0 0 0 0 0
102
+ 0 0 0 0 0
103
+ 0 0 0 1 0"
104
+ />
105
+ <fedisplacementmap
106
+ in="SourceGraphic"
107
+ in2="DISPLACEMENT_MAP"
108
+ result="GREEN_DISPLACED"
109
+ scale="-72.8"
110
+ xChannelSelector="R"
111
+ yChannelSelector="B"
112
+ />
113
+ <fecolormatrix
114
+ in="GREEN_DISPLACED"
115
+ result="GREEN_CHANNEL"
116
+ type="matrix"
117
+ values="0 0 0 0 0
118
+ 0 1 0 0 0
119
+ 0 0 0 0 0
120
+ 0 0 0 1 0"
121
+ />
122
+ <fedisplacementmap
123
+ in="SourceGraphic"
124
+ in2="DISPLACEMENT_MAP"
125
+ result="BLUE_DISPLACED"
126
+ scale="-74.2"
127
+ xChannelSelector="R"
128
+ yChannelSelector="B"
129
+ />
130
+ <fecolormatrix
131
+ in="BLUE_DISPLACED"
132
+ result="BLUE_CHANNEL"
133
+ type="matrix"
134
+ values="0 0 0 0 0
135
+ 0 0 0 0 0
136
+ 0 0 1 0 0
137
+ 0 0 0 1 0"
138
+ />
139
+ <feblend
140
+ in="GREEN_CHANNEL"
141
+ in2="BLUE_CHANNEL"
142
+ mode="screen"
143
+ result="GB_COMBINED"
144
+ />
145
+ <feblend
146
+ in="RED_CHANNEL"
147
+ in2="GB_COMBINED"
148
+ mode="screen"
149
+ result="RGB_COMBINED"
150
+ />
151
+ <fegaussianblur
152
+ in="RGB_COMBINED"
153
+ result="ABERRATED_BLURRED"
154
+ stdDeviation="0"
155
+ />
156
+ <fecomposite
157
+ in="ABERRATED_BLURRED"
158
+ in2="EDGE_MASK"
159
+ operator="in"
160
+ result="EDGE_ABERRATION"
161
+ />
162
+ <fecomponenttransfer
163
+ in="EDGE_MASK"
164
+ result="INVERTED_MASK"
165
+ >
166
+ <fefunca
167
+ tableValues="1 0"
168
+ type="table"
169
+ />
170
+ </fecomponenttransfer>
171
+ <fecomposite
172
+ in="CENTER_ORIGINAL"
173
+ in2="INVERTED_MASK"
174
+ operator="in"
175
+ result="CENTER_CLEAN"
176
+ />
177
+ <fecomposite
178
+ in="EDGE_ABERRATION"
179
+ in2="CENTER_CLEAN"
180
+ operator="over"
181
+ />
182
+ </filter>
183
+ </defs>
184
+ </svg>
185
+ <div
186
+ class="c-atomix-glass__filter-overlay"
187
+ style="filter: url(#atomix-glass-filter-16);"
188
+ />
189
+ <div
190
+ class="c-atomix-glass__filter-shadow"
191
+ />
192
+ </div>
193
+ <div
194
+ class="c-atomix-glass__content"
195
+ >
196
+ <div>
197
+ Default Glass
198
+ </div>
199
+ </div>
200
+ </div>
201
+ </div>
202
+ <div
203
+ class="c-atomix-glass__background-layer c-atomix-glass__background-layer--dark c-atomix-glass__background-layer--hidden"
204
+ />
205
+ <div
206
+ class="c-atomix-glass__background-layer c-atomix-glass__background-layer--black c-atomix-glass__background-layer--hidden"
207
+ />
208
+ <span
209
+ class="c-atomix-glass__border-1"
210
+ />
211
+ <span
212
+ class="c-atomix-glass__border-2"
213
+ />
214
+ </div>
215
+ </div>
216
+ `;