@shohojdhara/atomix 0.5.1 → 0.5.2
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/atomix.config.ts +12 -0
- package/build-tools/webpack-loader.js +5 -4
- package/dist/atomix.css +138 -17
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +1 -1
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/webpack-loader.js +5 -4
- package/dist/charts.d.ts +23 -23
- package/dist/charts.js +40 -37
- package/dist/charts.js.map +1 -1
- package/dist/config.d.ts +624 -0
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -0
- package/dist/core.d.ts +2 -2
- package/dist/core.js +111 -50
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +3 -6
- package/dist/forms.js +2 -2
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +173 -111
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +98 -65
- package/dist/index.esm.js +427 -422
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +394 -391
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.js +59 -60
- package/dist/layout.js.map +1 -1
- package/dist/theme.js +4 -4
- package/dist/theme.js.map +1 -1
- package/package.json +14 -9
- package/scripts/atomix-cli.js +15 -1
- package/scripts/cli/__tests__/complexity-utils.test.js +24 -0
- package/scripts/cli/__tests__/detector.test.js +50 -0
- package/scripts/cli/__tests__/template-engine.test.js +23 -0
- package/scripts/cli/__tests__/test-setup.js +3 -0
- package/scripts/cli/commands/doctor.js +15 -3
- package/scripts/cli/commands/generate.js +113 -51
- package/scripts/cli/internal/ai-engine.js +30 -10
- package/scripts/cli/internal/complexity-utils.js +60 -0
- package/scripts/cli/internal/component-validator.js +49 -16
- package/scripts/cli/internal/generator.js +89 -36
- package/scripts/cli/internal/hook-generator.js +5 -2
- package/scripts/cli/internal/itcss-generator.js +16 -12
- package/scripts/cli/templates/next-templates.js +81 -30
- package/scripts/cli/templates/storybook-templates.js +12 -2
- package/scripts/cli/utils/detector.js +45 -7
- package/scripts/cli/utils/diagnostics.js +78 -0
- package/scripts/cli/utils/telemetry.js +13 -0
- package/src/components/Accordion/Accordion.stories.tsx +4 -0
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +1 -1
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +219 -0
- package/src/components/AtomixGlass/glass-utils.ts +1 -1
- package/src/components/Button/Button.tsx +114 -57
- package/src/components/Callout/Callout.tsx +4 -4
- package/src/components/Chart/ChartRenderer.tsx +1 -1
- package/src/components/Chart/DonutChart.tsx +11 -8
- package/src/components/EdgePanel/EdgePanel.tsx +119 -115
- package/src/components/Form/Select.tsx +4 -4
- package/src/components/List/List.tsx +4 -4
- package/src/components/Navigation/SideMenu/SideMenu.tsx +6 -6
- package/src/components/PhotoViewer/PhotoViewerImage.tsx +1 -1
- package/src/components/ProductReview/ProductReview.tsx +4 -2
- package/src/components/Rating/Rating.tsx +4 -2
- package/src/components/SectionIntro/SectionIntro.tsx +4 -2
- package/src/components/Steps/Steps.tsx +1 -1
- package/src/components/Tabs/Tabs.tsx +5 -5
- package/src/components/Testimonial/Testimonial.tsx +4 -2
- package/src/components/VideoPlayer/VideoPlayer.tsx +4 -2
- package/src/layouts/CssGrid/CssGrid.stories.tsx +464 -0
- package/src/layouts/CssGrid/CssGrid.tsx +215 -0
- package/src/layouts/CssGrid/index.ts +8 -0
- package/src/layouts/CssGrid/scripts/CssGrid.js +284 -0
- package/src/layouts/CssGrid/scripts/index.js +43 -0
- package/src/layouts/Grid/scripts/Container.js +139 -0
- package/src/layouts/Grid/scripts/Grid.js +184 -0
- package/src/layouts/Grid/scripts/GridCol.js +273 -0
- package/src/layouts/Grid/scripts/Row.js +154 -0
- package/src/layouts/Grid/scripts/index.js +48 -0
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +71 -59
- package/src/lib/composables/atomix-glass/useGlassSize.ts +1 -1
- package/src/lib/composables/useAccordion.ts +5 -5
- package/src/lib/composables/useAtomixGlass.ts +3 -3
- package/src/lib/composables/useBarChart.ts +2 -2
- package/src/lib/composables/useChart.ts +3 -2
- package/src/lib/composables/useChartToolbar.ts +48 -66
- package/src/lib/composables/useDataTable.ts +1 -1
- package/src/lib/composables/useDatePicker.ts +2 -2
- package/src/lib/composables/useEdgePanel.ts +45 -54
- package/src/lib/composables/useHeroBackgroundSlider.ts +5 -5
- package/src/lib/composables/usePhotoViewer.ts +2 -3
- package/src/lib/composables/usePieChart.ts +1 -1
- package/src/lib/composables/usePopover.ts +151 -139
- package/src/lib/composables/useSideMenu.ts +28 -41
- package/src/lib/composables/useSlider.ts +2 -6
- package/src/lib/composables/useTooltip.ts +2 -2
- package/src/lib/config/index.ts +39 -0
- package/src/lib/theme/devtools/Comparator.tsx +1 -1
- package/src/lib/theme/devtools/Inspector.tsx +1 -1
- package/src/lib/theme/devtools/LiveEditor.tsx +1 -1
- package/src/lib/theme/runtime/ThemeProvider.tsx +1 -1
- package/src/styles/01-settings/_index.scss +1 -0
- package/src/styles/01-settings/_settings.atomix-glass.scss +174 -0
- package/src/styles/01-settings/_settings.masonry-grid.scss +42 -6
- package/src/styles/02-tools/_tools.glass.scss +6 -0
- package/src/styles/05-objects/_objects.masonry-grid.scss +162 -24
- package/src/styles/06-components/_components.atomix-glass.scss +4 -4
- package/src/lib/composables/useBreadcrumb.ts +0 -81
- package/src/lib/composables/useChartInteractions.ts +0 -123
- package/src/lib/composables/useChartPerformance.ts +0 -347
- package/src/lib/composables/useDropdown.ts +0 -338
- package/src/lib/composables/useModal.ts +0 -110
- package/src/lib/hooks/usePerformanceMonitor.ts +0 -148
- package/src/lib/utils/displacement-generator.ts +0 -92
- package/src/lib/utils/memoryMonitor.ts +0 -191
- package/src/styles/01-settings/_settings.testtypecheck.scss +0 -53
- package/src/styles/01-settings/_settings.typedbutton.scss +0 -53
- package/src/styles/06-components/_components.testbutton.scss +0 -212
- package/src/styles/06-components/_components.testtypecheck.scss +0 -212
- package/src/styles/06-components/_components.typedbutton.scss +0 -212
|
@@ -8,20 +8,18 @@ import { SIDE_MENU } from '../constants/components';
|
|
|
8
8
|
* @returns SideMenu state and methods
|
|
9
9
|
*/
|
|
10
10
|
export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
};
|
|
11
|
+
const {
|
|
12
|
+
collapsible = true,
|
|
13
|
+
collapsibleDesktop = false,
|
|
14
|
+
defaultCollapsedDesktop = false,
|
|
15
|
+
isOpen,
|
|
16
|
+
onToggle,
|
|
17
|
+
disabled = false,
|
|
18
|
+
} = initialProps || {};
|
|
19
19
|
|
|
20
20
|
// Local open state for when not controlled externally
|
|
21
21
|
const [isOpenState, setIsOpenState] = useState(
|
|
22
|
-
|
|
23
|
-
? !defaultProps.defaultCollapsedDesktop
|
|
24
|
-
: defaultProps.isOpen || false
|
|
22
|
+
defaultCollapsedDesktop !== undefined ? !defaultCollapsedDesktop : isOpen || false
|
|
25
23
|
);
|
|
26
24
|
|
|
27
25
|
// Refs for managing responsive behavior
|
|
@@ -31,19 +29,18 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
|
|
|
31
29
|
|
|
32
30
|
// Update local state when external state changes
|
|
33
31
|
useEffect(() => {
|
|
34
|
-
if (typeof
|
|
35
|
-
setIsOpenState(
|
|
36
|
-
} else if (
|
|
37
|
-
setIsOpenState(!
|
|
32
|
+
if (typeof isOpen !== 'undefined') {
|
|
33
|
+
setIsOpenState(isOpen);
|
|
34
|
+
} else if (defaultCollapsedDesktop !== undefined) {
|
|
35
|
+
setIsOpenState(!defaultCollapsedDesktop);
|
|
38
36
|
}
|
|
39
|
-
}, [
|
|
37
|
+
}, [isOpen, defaultCollapsedDesktop]);
|
|
40
38
|
|
|
41
39
|
// Set initial height on mount
|
|
42
40
|
useEffect(() => {
|
|
43
41
|
const isMobile = window.innerWidth < 768;
|
|
44
|
-
const shouldCollapse = isMobile ?
|
|
45
|
-
const currentOpen =
|
|
46
|
-
typeof defaultProps.isOpen !== 'undefined' ? defaultProps.isOpen : isOpenState;
|
|
42
|
+
const shouldCollapse = isMobile ? collapsible : collapsibleDesktop;
|
|
43
|
+
const currentOpen = typeof isOpen !== 'undefined' ? isOpen : isOpenState;
|
|
47
44
|
|
|
48
45
|
if (shouldCollapse && wrapperRef.current && innerRef.current) {
|
|
49
46
|
// Use setTimeout to ensure DOM is fully rendered
|
|
@@ -62,13 +59,13 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
|
|
|
62
59
|
wrapperRef.current.style.height = 'auto';
|
|
63
60
|
}
|
|
64
61
|
return undefined;
|
|
65
|
-
}, []);
|
|
62
|
+
}, [collapsible, collapsibleDesktop, isOpen, isOpenState]);
|
|
66
63
|
|
|
67
64
|
// Handle responsive behavior - vertical collapse for both mobile and desktop
|
|
68
65
|
useEffect(() => {
|
|
69
66
|
const handleResize = () => {
|
|
70
67
|
const isMobile = window.innerWidth < 768; // MD breakpoint
|
|
71
|
-
const shouldCollapse = isMobile ?
|
|
68
|
+
const shouldCollapse = isMobile ? collapsible : collapsibleDesktop;
|
|
72
69
|
|
|
73
70
|
if (!shouldCollapse) {
|
|
74
71
|
// Not collapsible - always show content
|
|
@@ -77,8 +74,7 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
|
|
|
77
74
|
}
|
|
78
75
|
} else if (wrapperRef.current && innerRef.current) {
|
|
79
76
|
// Set proper height for vertical animation (both mobile and desktop)
|
|
80
|
-
const currentOpen =
|
|
81
|
-
typeof defaultProps.isOpen !== 'undefined' ? defaultProps.isOpen : isOpenState;
|
|
77
|
+
const currentOpen = typeof isOpen !== 'undefined' ? isOpen : isOpenState;
|
|
82
78
|
|
|
83
79
|
// Use requestAnimationFrame to ensure DOM is ready
|
|
84
80
|
requestAnimationFrame(() => {
|
|
@@ -101,22 +97,15 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
|
|
|
101
97
|
clearTimeout(timeoutId);
|
|
102
98
|
window.removeEventListener('resize', handleResize);
|
|
103
99
|
};
|
|
104
|
-
}, [
|
|
105
|
-
defaultProps.collapsible,
|
|
106
|
-
defaultProps.collapsibleDesktop,
|
|
107
|
-
defaultProps.isOpen,
|
|
108
|
-
defaultProps.onToggle,
|
|
109
|
-
isOpenState,
|
|
110
|
-
]);
|
|
100
|
+
}, [collapsible, collapsibleDesktop, isOpen, onToggle, isOpenState]);
|
|
111
101
|
|
|
112
102
|
// Update wrapper height when open state changes (both mobile and desktop)
|
|
113
103
|
useEffect(() => {
|
|
114
104
|
const isMobile = window.innerWidth < 768;
|
|
115
|
-
const shouldCollapse = isMobile ?
|
|
105
|
+
const shouldCollapse = isMobile ? collapsible : collapsibleDesktop;
|
|
116
106
|
|
|
117
107
|
if (shouldCollapse && wrapperRef.current && innerRef.current) {
|
|
118
|
-
const currentOpen =
|
|
119
|
-
typeof defaultProps.isOpen !== 'undefined' ? defaultProps.isOpen : isOpenState;
|
|
108
|
+
const currentOpen = typeof isOpen !== 'undefined' ? isOpen : isOpenState;
|
|
120
109
|
|
|
121
110
|
// Use requestAnimationFrame to ensure DOM is ready
|
|
122
111
|
requestAnimationFrame(() => {
|
|
@@ -132,7 +121,7 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
|
|
|
132
121
|
// Not collapsible - always show content
|
|
133
122
|
wrapperRef.current.style.height = 'auto';
|
|
134
123
|
}
|
|
135
|
-
}, [
|
|
124
|
+
}, [isOpen, isOpenState, collapsible, collapsibleDesktop]);
|
|
136
125
|
|
|
137
126
|
/**
|
|
138
127
|
* Generate side menu class based on properties
|
|
@@ -159,14 +148,13 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
|
|
|
159
148
|
* Handle toggle click (mobile)
|
|
160
149
|
*/
|
|
161
150
|
const handleToggle = () => {
|
|
162
|
-
if (
|
|
151
|
+
if (disabled) return;
|
|
163
152
|
|
|
164
|
-
const newState =
|
|
165
|
-
typeof defaultProps.isOpen !== 'undefined' ? !defaultProps.isOpen : !isOpenState;
|
|
153
|
+
const newState = typeof isOpen !== 'undefined' ? !isOpen : !isOpenState;
|
|
166
154
|
|
|
167
|
-
if (typeof
|
|
155
|
+
if (typeof onToggle === 'function') {
|
|
168
156
|
// Controlled component
|
|
169
|
-
|
|
157
|
+
onToggle(newState);
|
|
170
158
|
} else {
|
|
171
159
|
// Uncontrolled component
|
|
172
160
|
setIsOpenState(newState);
|
|
@@ -185,11 +173,10 @@ export function useSideMenu(initialProps?: Partial<SideMenuProps>) {
|
|
|
185
173
|
* @returns Current open state
|
|
186
174
|
*/
|
|
187
175
|
const getCurrentOpenState = (): boolean => {
|
|
188
|
-
return typeof
|
|
176
|
+
return typeof isOpen !== 'undefined' ? isOpen : isOpenState;
|
|
189
177
|
};
|
|
190
178
|
|
|
191
179
|
return {
|
|
192
|
-
defaultProps,
|
|
193
180
|
isOpenState: getCurrentOpenState(),
|
|
194
181
|
wrapperRef,
|
|
195
182
|
innerRef,
|
|
@@ -39,7 +39,7 @@ export function useSlider(options: UseSliderOptions): UseSliderReturn {
|
|
|
39
39
|
onSlideChange,
|
|
40
40
|
} = options;
|
|
41
41
|
|
|
42
|
-
const slides = Array.isArray(rawSlides) ? rawSlides : [];
|
|
42
|
+
const slides = useMemo(() => (Array.isArray(rawSlides) ? rawSlides : []), [rawSlides]);
|
|
43
43
|
|
|
44
44
|
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
45
45
|
const wrapperRef = useRef<HTMLDivElement | null>(null);
|
|
@@ -364,8 +364,6 @@ export function useSlider(options: UseSliderOptions): UseSliderReturn {
|
|
|
364
364
|
isTransitioning,
|
|
365
365
|
speed,
|
|
366
366
|
onSlideChange,
|
|
367
|
-
allSlides.length,
|
|
368
|
-
loopedSlides,
|
|
369
367
|
autoplay,
|
|
370
368
|
]);
|
|
371
369
|
|
|
@@ -426,8 +424,6 @@ export function useSlider(options: UseSliderOptions): UseSliderReturn {
|
|
|
426
424
|
isTransitioning,
|
|
427
425
|
speed,
|
|
428
426
|
onSlideChange,
|
|
429
|
-
allSlides.length,
|
|
430
|
-
loopedSlides,
|
|
431
427
|
autoplay,
|
|
432
428
|
]);
|
|
433
429
|
|
|
@@ -458,7 +454,7 @@ export function useSlider(options: UseSliderOptions): UseSliderReturn {
|
|
|
458
454
|
onSlideChange?.(index);
|
|
459
455
|
}, speed);
|
|
460
456
|
},
|
|
461
|
-
[realIndex, isTransitioning, speed, onSlideChange, loop,
|
|
457
|
+
[realIndex, isTransitioning, speed, onSlideChange, loop, slides.length, autoplay]
|
|
462
458
|
);
|
|
463
459
|
|
|
464
460
|
const handleTouchStart = useCallback(
|
|
@@ -28,8 +28,8 @@ interface UseTooltipResult {
|
|
|
28
28
|
isVisible: boolean;
|
|
29
29
|
isPositioned: boolean;
|
|
30
30
|
tooltipId: string;
|
|
31
|
-
triggerRef: RefObject<HTMLDivElement>;
|
|
32
|
-
tooltipRef: RefObject<HTMLDivElement>;
|
|
31
|
+
triggerRef: RefObject<HTMLDivElement | null>;
|
|
32
|
+
tooltipRef: RefObject<HTMLDivElement | null>;
|
|
33
33
|
tooltipStyle: React.CSSProperties;
|
|
34
34
|
arrowStyle: React.CSSProperties;
|
|
35
35
|
showTooltip: () => void;
|
package/src/lib/config/index.ts
CHANGED
|
@@ -206,6 +206,29 @@ export interface TokenEngineConfig {
|
|
|
206
206
|
};
|
|
207
207
|
}
|
|
208
208
|
|
|
209
|
+
/**
|
|
210
|
+
* CLI component generator defaults (merged before CLI flags; flags win).
|
|
211
|
+
*/
|
|
212
|
+
export interface GeneratorConfig {
|
|
213
|
+
/** Default output directory for generated components */
|
|
214
|
+
outputPath?: string;
|
|
215
|
+
/** Override detected framework */
|
|
216
|
+
framework?: 'react' | 'next' | 'vanilla';
|
|
217
|
+
/** Per-feature defaults (CLI --no-* flags override) */
|
|
218
|
+
features?: {
|
|
219
|
+
storybook?: boolean;
|
|
220
|
+
hook?: boolean;
|
|
221
|
+
styles?: boolean;
|
|
222
|
+
tests?: boolean;
|
|
223
|
+
};
|
|
224
|
+
/** Composable hooks directory relative to project root */
|
|
225
|
+
hookOutputDir?: string;
|
|
226
|
+
/** Story file: side-effect import for global Atomix styles */
|
|
227
|
+
storybookCssImport?: string;
|
|
228
|
+
/** Barrel file strategy for new components */
|
|
229
|
+
barrel?: 'index' | 'none';
|
|
230
|
+
}
|
|
231
|
+
|
|
209
232
|
/**
|
|
210
233
|
* Atomix Configuration Interface
|
|
211
234
|
*
|
|
@@ -241,6 +264,17 @@ export interface AtomixConfig {
|
|
|
241
264
|
model?: string;
|
|
242
265
|
/** API key for the provider */
|
|
243
266
|
apiKey?: string;
|
|
267
|
+
/** Temperature for AI creativity (0.0-1.0, default: 0.7) */
|
|
268
|
+
temperature?: number;
|
|
269
|
+
/** Maximum tokens per AI response (default: 4000) */
|
|
270
|
+
maxTokens?: number;
|
|
271
|
+
/** Rate limiting configuration */
|
|
272
|
+
rateLimit?: {
|
|
273
|
+
/** Maximum requests allowed */
|
|
274
|
+
requests: number;
|
|
275
|
+
/** Time window in milliseconds */
|
|
276
|
+
windowMs: number;
|
|
277
|
+
};
|
|
244
278
|
};
|
|
245
279
|
|
|
246
280
|
/**
|
|
@@ -255,6 +289,11 @@ export interface AtomixConfig {
|
|
|
255
289
|
anonymize?: boolean;
|
|
256
290
|
};
|
|
257
291
|
|
|
292
|
+
/**
|
|
293
|
+
* `atomix generate` defaults (CLI overrides these)
|
|
294
|
+
*/
|
|
295
|
+
generator?: GeneratorConfig;
|
|
296
|
+
|
|
258
297
|
/**
|
|
259
298
|
* Theme customization (Tailwind-like)
|
|
260
299
|
*
|
|
@@ -48,7 +48,7 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
48
48
|
const [debouncedSearchQuery, setDebouncedSearchQuery] = useState<string>('');
|
|
49
49
|
const [filterType, setFilterType] = useState<'all' | 'added' | 'removed' | 'changed'>('all');
|
|
50
50
|
const [filterCategory, setFilterCategory] = useState<string>('all');
|
|
51
|
-
const searchTimeoutRef = useRef<NodeJS.Timeout>();
|
|
51
|
+
const searchTimeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);
|
|
52
52
|
|
|
53
53
|
// Debounce search query
|
|
54
54
|
useEffect(() => {
|
|
@@ -57,7 +57,7 @@ export const ThemeInspector: React.FC<ThemeInspectorProps> = ({
|
|
|
57
57
|
const [searchQuery, setSearchQuery] = useState<string>('');
|
|
58
58
|
const [debouncedSearchQuery, setDebouncedSearchQuery] = useState<string>('');
|
|
59
59
|
const [copiedPath, setCopiedPath] = useState<string | null>(null);
|
|
60
|
-
const searchTimeoutRef = useRef<NodeJS.Timeout>();
|
|
60
|
+
const searchTimeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);
|
|
61
61
|
|
|
62
62
|
// Debounce search query
|
|
63
63
|
useEffect(() => {
|
|
@@ -200,7 +200,7 @@ export const ThemeLiveEditor: React.FC<ThemeLiveEditorProps> = ({
|
|
|
200
200
|
);
|
|
201
201
|
|
|
202
202
|
// Debounced JSON update to history
|
|
203
|
-
const jsonUpdateTimeoutRef = useRef<NodeJS.Timeout>();
|
|
203
|
+
const jsonUpdateTimeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);
|
|
204
204
|
useEffect(() => {
|
|
205
205
|
if (error) return;
|
|
206
206
|
|
|
@@ -91,7 +91,7 @@ export const ThemeProvider: React.FC<ThemeProviderProps> = ({
|
|
|
91
91
|
|
|
92
92
|
// Default fallback
|
|
93
93
|
return 'default';
|
|
94
|
-
}, [defaultTheme, enablePersistence, storageKey]);
|
|
94
|
+
}, [defaultTheme, enablePersistence, storageKey, storageAdapter]);
|
|
95
95
|
|
|
96
96
|
// Initialize state - handle both string and DesignTokens for defaultTheme
|
|
97
97
|
const [currentTheme, setCurrentTheme] = useState<string>(() => {
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// AtomixGlass Settings
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// Default values for glass component styling
|
|
4
|
+
// These can be overridden at any level via CSS custom properties
|
|
5
|
+
|
|
6
|
+
@use 'sass:map';
|
|
7
|
+
@use 'settings.spacing' as *;
|
|
8
|
+
@use 'settings.config' as config;
|
|
9
|
+
@use 'settings.border-radius' as *;
|
|
10
|
+
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Border Radius
|
|
13
|
+
// ============================================================================
|
|
14
|
+
$glass-radius: var(#{config.$prefix}radius-md, 0.75rem) !default;
|
|
15
|
+
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Position
|
|
18
|
+
// ============================================================================
|
|
19
|
+
$glass-position: absolute !default;
|
|
20
|
+
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Border Width
|
|
23
|
+
// ============================================================================
|
|
24
|
+
$glass-border-width: var(#{config.$prefix}spacing-0-5, 0.125rem) !default;
|
|
25
|
+
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Z-Index Layers
|
|
28
|
+
// ============================================================================
|
|
29
|
+
$glass-base-z-index: 0 !default;
|
|
30
|
+
$glass-z-index-background: 0 !default;
|
|
31
|
+
$glass-z-index-overlay: 1 !default;
|
|
32
|
+
$glass-z-index-content: 2 !default;
|
|
33
|
+
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Opacity Values
|
|
36
|
+
// ============================================================================
|
|
37
|
+
$glass-hover-1-opacity: 0 !default;
|
|
38
|
+
$glass-hover-2-opacity: 0 !default;
|
|
39
|
+
$glass-hover-3-opacity: 0 !default;
|
|
40
|
+
$glass-base-opacity: 0.6 !default;
|
|
41
|
+
$glass-overlay-opacity: 0.35 !default;
|
|
42
|
+
$glass-overlay-highlight-opacity: 0.25 !default;
|
|
43
|
+
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Border Opacity
|
|
46
|
+
// ============================================================================
|
|
47
|
+
$glass-border-1-opacity: 0.18 !default;
|
|
48
|
+
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Over-Light Mode Opacity
|
|
51
|
+
// ============================================================================
|
|
52
|
+
$glass-over-light-dark-opacity: 0.5 !default;
|
|
53
|
+
$glass-over-light-black-opacity: 0.25 !default;
|
|
54
|
+
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// Gradient Colors - Hover 1 (White mode)
|
|
57
|
+
// ============================================================================
|
|
58
|
+
$glass-hover-1-start-color: rgba(255, 255, 255, 0.18) !default;
|
|
59
|
+
$glass-hover-1-end-color: rgba(255, 255, 255, 0) !default;
|
|
60
|
+
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Gradient Colors - Hover 1 (Dark/Over-light mode)
|
|
63
|
+
// ============================================================================
|
|
64
|
+
$glass-hover-1-black-start: 0.12 !default;
|
|
65
|
+
$glass-hover-1-black-mid: 0.06 !default;
|
|
66
|
+
$glass-hover-1-black-stop: 60% !default;
|
|
67
|
+
$glass-hover-1-black-end: 100% !default;
|
|
68
|
+
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// Gradient Colors - Hover 2 (White mode)
|
|
71
|
+
// ============================================================================
|
|
72
|
+
$glass-hover-2-start-color: rgba(0, 0, 0, 0.12) !default;
|
|
73
|
+
$glass-hover-2-end-color: rgba(0, 0, 0, 0) !default;
|
|
74
|
+
|
|
75
|
+
// ============================================================================
|
|
76
|
+
// Gradient Colors - Hover 2 (Dark/Over-light mode)
|
|
77
|
+
// ============================================================================
|
|
78
|
+
$glass-hover-2-black-start: 0.08 !default;
|
|
79
|
+
$glass-hover-2-black-mid: 0.04 !default;
|
|
80
|
+
$glass-hover-2-black-stop: 60% !default;
|
|
81
|
+
$glass-hover-2-black-end: 100% !default;
|
|
82
|
+
|
|
83
|
+
// ============================================================================
|
|
84
|
+
// Gradient Colors - Hover 3 (White mode)
|
|
85
|
+
// ============================================================================
|
|
86
|
+
$glass-hover-3-start-color: rgba(255, 255, 255, 0.06) !default;
|
|
87
|
+
$glass-hover-3-end-color: rgba(255, 255, 255, 0) !default;
|
|
88
|
+
|
|
89
|
+
// ============================================================================
|
|
90
|
+
// Gradient Colors - Hover 3 (Dark/Over-light mode)
|
|
91
|
+
// ============================================================================
|
|
92
|
+
$glass-hover-3-black-start: 0.06 !default;
|
|
93
|
+
$glass-hover-3-black-mid: 0.03 !default;
|
|
94
|
+
$glass-hover-3-black-stop: 60% !default;
|
|
95
|
+
$glass-hover-3-black-end: 100% !default;
|
|
96
|
+
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// Base Layer (White mode)
|
|
99
|
+
// ============================================================================
|
|
100
|
+
$glass-base-start-color: rgba(255, 255, 255, 0.08) !default;
|
|
101
|
+
$glass-base-end-color: rgba(255, 255, 255, 0.02) !default;
|
|
102
|
+
$glass-base-white-opacity: 0.08 !default;
|
|
103
|
+
|
|
104
|
+
// ============================================================================
|
|
105
|
+
// Base Layer (Dark/Over-light mode)
|
|
106
|
+
// ============================================================================
|
|
107
|
+
$glass-base-black-start: 0.08 !default;
|
|
108
|
+
$glass-base-black-mid: 0.06 !default;
|
|
109
|
+
$glass-base-black-end: 0.02 !default;
|
|
110
|
+
|
|
111
|
+
// ============================================================================
|
|
112
|
+
// Overlay Layer (White mode)
|
|
113
|
+
// ============================================================================
|
|
114
|
+
$glass-overlay-start-color: rgba(255, 255, 255, 0.12) !default;
|
|
115
|
+
$glass-overlay-end-color: rgba(255, 255, 255, 0) !default;
|
|
116
|
+
$glass-overlay-white-opacity: 0.12 !default;
|
|
117
|
+
|
|
118
|
+
// ============================================================================
|
|
119
|
+
// Overlay Layer (Dark/Over-light mode)
|
|
120
|
+
// ============================================================================
|
|
121
|
+
$glass-overlay-black-start: 0.1 !default;
|
|
122
|
+
$glass-overlay-black-mid: 0.05 !default;
|
|
123
|
+
$glass-overlay-black-stop: 40% !default;
|
|
124
|
+
$glass-overlay-black-end: 0 !default;
|
|
125
|
+
|
|
126
|
+
// ============================================================================
|
|
127
|
+
// Overlay Highlight
|
|
128
|
+
// ============================================================================
|
|
129
|
+
$glass-highlight-start-color: rgba(255, 255, 255, 0.24) !default;
|
|
130
|
+
$glass-highlight-end-color: rgba(255, 255, 255, 0) !default;
|
|
131
|
+
$glass-highlight-opacity-multiplier: 1.1 !default;
|
|
132
|
+
|
|
133
|
+
// ============================================================================
|
|
134
|
+
// Border Shadow
|
|
135
|
+
// ============================================================================
|
|
136
|
+
$glass-border-color: rgba(255, 255, 255, 0.45) !default;
|
|
137
|
+
$glass-inner-shadow-color: rgba(255, 255, 255, 0.18) !default;
|
|
138
|
+
$glass-outer-shadow-color: rgba(0, 0, 0, 0.28) !default;
|
|
139
|
+
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// Backdrop Filter
|
|
142
|
+
// ============================================================================
|
|
143
|
+
$glass-backdrop-filter: blur(30px) saturate(140%) brightness(110%) !default;
|
|
144
|
+
|
|
145
|
+
// ============================================================================
|
|
146
|
+
// Transition
|
|
147
|
+
// ============================================================================
|
|
148
|
+
$glass-transition: var(#{config.$prefix}transition-base) !default;
|
|
149
|
+
$glass-transition-duration: 0.3s !default;
|
|
150
|
+
$glass-easing: cubic-bezier(0.23, 1, 0.32, 1) !default;
|
|
151
|
+
|
|
152
|
+
// ============================================================================
|
|
153
|
+
// Blend Modes
|
|
154
|
+
// ============================================================================
|
|
155
|
+
$glass-hover-blend-mode: overlay !default;
|
|
156
|
+
$glass-base-blend-mode: soft-light !default;
|
|
157
|
+
$glass-overlay-blend-mode: overlay !default;
|
|
158
|
+
$glass-overlay-highlight-blend-mode: screen !default;
|
|
159
|
+
$glass-border-backdrop-blend-mode: overlay !default;
|
|
160
|
+
$glass-border-1-blend-mode: screen !default;
|
|
161
|
+
$glass-border-2-blend-mode: overlay !default;
|
|
162
|
+
|
|
163
|
+
// ============================================================================
|
|
164
|
+
// Background Layer Colors
|
|
165
|
+
// ============================================================================
|
|
166
|
+
$glass-background-dark-color: var(#{config.$prefix}gray-9, #1f2937) !default;
|
|
167
|
+
$glass-background-black-color: var(#{config.$prefix}black, #000000) !default;
|
|
168
|
+
|
|
169
|
+
// ============================================================================
|
|
170
|
+
// Border Backdrop
|
|
171
|
+
// ============================================================================
|
|
172
|
+
$glass-border-backdrop-blur: 30px !default;
|
|
173
|
+
$glass-border-backdrop-saturate: 140% !default;
|
|
174
|
+
$glass-border-backdrop-brightness: 110% !default;
|
|
@@ -1,17 +1,53 @@
|
|
|
1
1
|
@use 'settings.config' as config;
|
|
2
2
|
@use 'settings.breakpoints' as breakpoints;
|
|
3
|
+
@use 'settings.design-tokens' as tokens;
|
|
4
|
+
@use 'settings.colors' as colors;
|
|
3
5
|
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
// === MASONRY GRID DESIGN TOKENS ===
|
|
7
|
+
// Integrated with Atomix design system using CSS custom properties
|
|
8
|
+
|
|
9
|
+
// Core spacing and layout tokens
|
|
10
|
+
$masonry-grid-gap: var(--#{config.$prefix}spacing-16) !default;
|
|
11
|
+
$masonry-grid-gap-sm: var(--#{config.$prefix}spacing-8) !default;
|
|
12
|
+
$masonry-grid-gap-lg: var(--#{config.$prefix}spacing-24) !default;
|
|
13
|
+
$masonry-grid-gap-xl: var(--#{config.$prefix}spacing-32) !default;
|
|
14
|
+
|
|
15
|
+
// Responsive column configuration using design system breakpoints
|
|
8
16
|
$masonry-grid-columns-xs: 1 !default;
|
|
9
17
|
$masonry-grid-columns-sm: 2 !default;
|
|
10
18
|
$masonry-grid-columns-md: 3 !default;
|
|
11
19
|
$masonry-grid-columns-lg: 4 !default;
|
|
12
20
|
$masonry-grid-columns-xl: 4 !default;
|
|
13
21
|
$masonry-grid-columns-xxl: 5 !default;
|
|
14
|
-
$masonry-grid-item-transition: all 0.3s ease-in-out !default;
|
|
15
22
|
|
|
16
|
-
//
|
|
23
|
+
// Animation and transition tokens
|
|
24
|
+
$masonry-grid-item-transition:
|
|
25
|
+
opacity var(--#{config.$prefix}transition-duration-base) var(--#{config.$prefix}transition-timing-base),
|
|
26
|
+
top var(--#{config.$prefix}transition-duration-base) var(--#{config.$prefix}transition-timing-base),
|
|
27
|
+
left var(--#{config.$prefix}transition-duration-base) var(--#{config.$prefix}transition-timing-base) !default;
|
|
28
|
+
|
|
29
|
+
$masonry-grid-item-animation-duration: var(--#{config.$prefix}transition-duration-base) !default;
|
|
30
|
+
$masonry-grid-item-animation-timing: var(--#{config.$prefix}transition-timing-base) !default;
|
|
31
|
+
|
|
32
|
+
// Loading state tokens
|
|
33
|
+
$masonry-grid-loading-indicator-size: var(--#{config.$prefix}spacing-24) !default;
|
|
34
|
+
$masonry-grid-loading-indicator-border-width: var(--#{config.$prefix}border-width-2) !default;
|
|
35
|
+
$masonry-grid-loading-indicator-color: var(--#{config.$prefix}brand-border-subtle) !default;
|
|
36
|
+
|
|
37
|
+
// Dark mode specific tokens (will automatically switch with design system)
|
|
17
38
|
$masonry-grid-item-bg-dark: var(--#{config.$prefix}gray-9) !default;
|
|
39
|
+
$masonry-grid-loading-overlay-dark: var(--#{config.$prefix}gray-20) !default;
|
|
40
|
+
|
|
41
|
+
// Accessibility and focus management
|
|
42
|
+
$masonry-grid-focus-ring-width: var(--#{config.$prefix}focus-ring-width) !default;
|
|
43
|
+
$masonry-grid-focus-ring-color: var(--#{config.$prefix}focus-ring-color) !default;
|
|
44
|
+
$masonry-grid-focus-ring-offset: var(--#{config.$prefix}focus-ring-offset) !default;
|
|
45
|
+
|
|
46
|
+
// Mobile-first responsive design tokens
|
|
47
|
+
$masonry-grid-min-height-mobile: var(--#{config.$prefix}spacing-200) !default;
|
|
48
|
+
$masonry-grid-min-height-desktop: var(--#{config.$prefix}spacing-100) !default;
|
|
49
|
+
|
|
50
|
+
// Z-index layering
|
|
51
|
+
$masonry-grid-z-index-base: var(--#{config.$prefix}z-index-1) !default;
|
|
52
|
+
$masonry-grid-z-index-loading: var(--#{config.$prefix}z-index-10) !default;
|
|
53
|
+
$masonry-grid-z-index-focus: var(--#{config.$prefix}z-index-5) !default;
|