@shohojdhara/atomix 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atomix.css +95 -69
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +1 -1
- package/dist/atomix.min.css.map +1 -1
- package/dist/charts.d.ts +1 -0
- package/dist/charts.js +231 -332
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +1 -0
- package/dist/core.js +232 -333
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +1 -0
- package/dist/forms.js +231 -332
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +11 -2
- package/dist/heavy.js +233 -334
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +13 -2
- package/dist/index.esm.js +228 -327
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +227 -326
- 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 +11 -1
- package/src/components/AtomixGlass/AtomixGlass.tsx +188 -128
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +62 -90
- package/src/components/AtomixGlass/PerformanceDashboard.tsx +153 -201
- package/src/components/AtomixGlass/glass-utils.ts +50 -0
- package/src/components/AtomixGlass/stories/AnimationFeatures.stories.tsx +52 -46
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +573 -236
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +88 -41
- package/src/components/AtomixGlass/stories/argTypes.ts +19 -19
- package/src/components/AtomixGlass/stories/shared-components.tsx +7 -12
- package/src/components/AtomixGlass/stories/types.ts +3 -3
- package/src/lib/composables/useAtomixGlass.ts +108 -71
- package/src/lib/composables/useAtomixGlassStyles.ts +0 -2
- package/src/lib/constants/components.ts +1 -0
- package/src/lib/types/components.ts +1 -0
- package/src/lib/utils/displacement-generator.ts +1 -1
- package/src/styles/06-components/_components.atomix-glass.scss +158 -97
- package/scripts/cli/__tests__/README.md +0 -81
- package/scripts/cli/__tests__/basic.test.js +0 -116
- package/scripts/cli/__tests__/clean.test.js +0 -278
- package/scripts/cli/__tests__/component-generator.test.js +0 -332
- package/scripts/cli/__tests__/component-validator.test.js +0 -433
- package/scripts/cli/__tests__/generator.test.js +0 -613
- package/scripts/cli/__tests__/glass-motion.test.js +0 -256
- package/scripts/cli/__tests__/integration.test.js +0 -938
- package/scripts/cli/__tests__/migrate.test.js +0 -74
- package/scripts/cli/__tests__/security.test.js +0 -206
- package/scripts/cli/__tests__/test-setup.js +0 -135
- package/scripts/cli/__tests__/theme-bridge.test.js +0 -507
- package/scripts/cli/__tests__/token-manager.test.js +0 -251
- package/scripts/cli/__tests__/token-provider.test.js +0 -361
- package/scripts/cli/__tests__/utils.test.js +0 -165
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +0 -216
- package/src/components/AtomixGlass/stories/AnimationTests.stories.tsx +0 -95
- package/src/components/AtomixGlass/stories/CardExamples.stories.tsx +0 -212
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +0 -131
- package/src/components/AtomixGlass/stories/DashboardExamples.stories.tsx +0 -348
- package/src/components/AtomixGlass/stories/EcommerceExamples.stories.tsx +0 -410
- package/src/components/AtomixGlass/stories/FormExamples.stories.tsx +0 -436
- package/src/components/AtomixGlass/stories/HeroExamples.stories.tsx +0 -264
- package/src/components/AtomixGlass/stories/InteractivePlayground.stories.tsx +0 -247
- package/src/components/AtomixGlass/stories/MobileUIExamples.stories.tsx +0 -418
- package/src/components/AtomixGlass/stories/ModalExamples.stories.tsx +0 -402
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +0 -1082
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +0 -497
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +0 -103
- package/src/components/AtomixGlass/stories/PresetGallery.stories.tsx +0 -335
- package/src/components/AtomixGlass/stories/Shaders.stories.tsx +0 -395
- package/src/components/AtomixGlass/stories/WidgetExamples.stories.tsx +0 -441
- package/src/components/TypedButton/TypedButton.stories.tsx +0 -59
- package/src/components/TypedButton/TypedButton.tsx +0 -39
- package/src/components/TypedButton/index.ts +0 -2
- package/src/lib/composables/useTypedButton.ts +0 -66
|
@@ -6,59 +6,82 @@
|
|
|
6
6
|
.c-atomix-glass {
|
|
7
7
|
position: relative;
|
|
8
8
|
|
|
9
|
-
//
|
|
10
|
-
--atomix-glass-
|
|
9
|
+
// Local, sane defaults (kept minimal)
|
|
10
|
+
--_glass-radius: var(--atomix-glass-radius, var(--atomix-radius-md, 0.75rem));
|
|
11
|
+
--_glass-transform: var(--atomix-glass-transform, translateZ(0));
|
|
12
|
+
--_glass-backdrop: var(--atomix-glass-border-backdrop, blur(14px) saturate(140%));
|
|
13
|
+
|
|
11
14
|
--atomix-glass-position: absolute;
|
|
12
|
-
--atomix-glass-border-width: var(--atomix-spacing-0-5, 0.
|
|
15
|
+
--atomix-glass-border-width: var(--atomix-spacing-0-5, 0.125rem);
|
|
16
|
+
--atomix-glass-top: 0;
|
|
17
|
+
--atomix-glass-left: 0;
|
|
18
|
+
--atomix-glass-right: auto;
|
|
19
|
+
--atomix-glass-bottom: auto;
|
|
20
|
+
|
|
21
|
+
--_glass-transition: var(--atomix-transition-base);
|
|
13
22
|
|
|
14
23
|
// =========================================================================
|
|
15
|
-
// Z-INDEX STACKING ORDER (
|
|
24
|
+
// Z-INDEX STACKING ORDER (based on design token system)
|
|
16
25
|
// =========================================================================
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
// 5: border-1
|
|
23
|
-
// 6: border-2
|
|
26
|
+
// Using the z-index layers mapping defined in the theme system
|
|
27
|
+
// Background: 0
|
|
28
|
+
// Overlay: 1
|
|
29
|
+
// Content: 2
|
|
30
|
+
// Floating: 10+
|
|
24
31
|
// =========================================================================
|
|
25
32
|
// Internal layers within the container:
|
|
26
33
|
// filter = base + 1
|
|
27
34
|
// content = base + 7
|
|
28
35
|
// =========================================================================
|
|
29
|
-
--atomix-glass-base-z-index: 0;
|
|
30
|
-
|
|
31
|
-
--_glass-z-background: calc(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
--_glass-z-
|
|
35
|
-
--_glass-z-
|
|
36
|
-
--_glass-z-
|
|
37
|
-
--_glass-z-
|
|
38
|
-
--_glass-z-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
--atomix-glass-base-z-index: var(--atomix-z-index-base, 0);
|
|
37
|
+
|
|
38
|
+
--_glass-z-background: calc(
|
|
39
|
+
var(--atomix-glass-base-z-index) + var(--atomix-z-index-background, 0)
|
|
40
|
+
);
|
|
41
|
+
--_glass-z-container: calc(var(--atomix-glass-base-z-index) + var(--atomix-z-index-overlay, 1));
|
|
42
|
+
--_glass-z-filter: calc(var(--atomix-glass-base-z-index) + var(--atomix-z-index-overlay, 1));
|
|
43
|
+
--_glass-z-effect: calc(var(--atomix-glass-base-z-index) + var(--atomix-z-index-overlay, 1));
|
|
44
|
+
--_glass-z-hover: calc(var(--atomix-glass-base-z-index) + var(--atomix-z-index-overlay, 1));
|
|
45
|
+
--_glass-z-overlay-highlight: calc(
|
|
46
|
+
var(--atomix-glass-base-z-index) + var(--atomix-z-index-overlay, 1)
|
|
47
|
+
);
|
|
48
|
+
--_glass-z-border-1: calc(var(--atomix-glass-base-z-index) + var(--atomix-z-index-overlay, 1));
|
|
49
|
+
--_glass-z-border-2: calc(var(--atomix-glass-base-z-index) + var(--atomix-z-index-overlay, 1));
|
|
50
|
+
--_glass-z-border-3: calc(var(--atomix-glass-base-z-index) + var(--atomix-z-index-content, 2));
|
|
51
|
+
--_glass-z-content: calc(var(--atomix-glass-base-z-index) + var(--atomix-z-index-content, 2));
|
|
52
|
+
|
|
53
|
+
--atomix-glass-border-shadow:
|
|
54
|
+
0 0 0 0.5px var(--atomix-glass-border-color, rgba(255, 255, 255, 0.45)) inset,
|
|
55
|
+
0 1px 2px var(--atomix-glass-inner-shadow-color, rgba(255, 255, 255, 0.18)) inset,
|
|
56
|
+
0 2px 6px var(--atomix-glass-outer-shadow-color, rgba(0, 0, 0, 0.28));
|
|
57
|
+
|
|
58
|
+
// Base layer styles for effect layers
|
|
43
59
|
&__hover-1,
|
|
44
60
|
&__hover-2,
|
|
45
|
-
&__hover-3
|
|
61
|
+
&__hover-3,
|
|
62
|
+
&__base,
|
|
63
|
+
&__overlay {
|
|
46
64
|
position: var(--atomix-glass-position);
|
|
47
65
|
top: var(--atomix-glass-top);
|
|
48
66
|
left: var(--atomix-glass-left);
|
|
67
|
+
right: var(--atomix-glass-right);
|
|
68
|
+
bottom: var(--atomix-glass-bottom);
|
|
69
|
+
width: var(--atomix-glass-width);
|
|
70
|
+
height: var(--atomix-glass-height);
|
|
49
71
|
pointer-events: none;
|
|
50
|
-
border-radius: var(--
|
|
51
|
-
transform: var(--
|
|
52
|
-
transition: var(--
|
|
72
|
+
border-radius: var(--_glass-radius);
|
|
73
|
+
transform: var(--_glass-transform);
|
|
74
|
+
transition: var(--_glass-transition);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
&__hover-1,
|
|
78
|
+
&__hover-2,
|
|
79
|
+
&__hover-3 {
|
|
53
80
|
z-index: var(--_glass-z-hover);
|
|
54
81
|
}
|
|
55
82
|
|
|
56
83
|
&__base,
|
|
57
84
|
&__overlay {
|
|
58
|
-
pointer-events: none;
|
|
59
|
-
border-radius: var(--atomix-glass-radius);
|
|
60
|
-
transform: var(--atomix-glass-transform);
|
|
61
|
-
transition: var(--atomix-glass-transition);
|
|
62
85
|
z-index: var(--_glass-z-effect);
|
|
63
86
|
}
|
|
64
87
|
|
|
@@ -67,64 +90,102 @@
|
|
|
67
90
|
&__hover-2,
|
|
68
91
|
&__hover-3 {
|
|
69
92
|
mix-blend-mode: overlay;
|
|
70
|
-
// Dynamic opacity and background are set via inline styles using CSS variables
|
|
71
|
-
opacity: var(--atomix-glass-hover-1-opacity, 0);
|
|
72
|
-
background: var(--atomix-glass-hover-1-gradient, none);
|
|
73
93
|
}
|
|
74
94
|
|
|
75
95
|
&__hover-1 {
|
|
76
96
|
transition:
|
|
77
|
-
|
|
78
|
-
background
|
|
97
|
+
var(--_glass-transition),
|
|
98
|
+
background var(--atomix-transition-duration-base, 0.3s)
|
|
99
|
+
var(--atomix-easing-base, cubic-bezier(0.23, 1, 0.32, 1));
|
|
79
100
|
opacity: var(--atomix-glass-hover-1-opacity, 0);
|
|
80
|
-
background: var(
|
|
101
|
+
background: var(
|
|
102
|
+
--atomix-glass-hover-1-gradient,
|
|
103
|
+
radial-gradient(
|
|
104
|
+
60% 60% at 50% 0%,
|
|
105
|
+
var(--atomix-glass-hover-1-start-color, rgba(255, 255, 255, 0.18)) 0%,
|
|
106
|
+
var(--atomix-glass-hover-1-end-color, rgba(255, 255, 255, 0)) 60%
|
|
107
|
+
)
|
|
108
|
+
);
|
|
81
109
|
}
|
|
82
110
|
|
|
83
111
|
&__hover-2 {
|
|
84
112
|
transition:
|
|
85
|
-
|
|
86
|
-
background
|
|
113
|
+
var(--_glass-transition),
|
|
114
|
+
background var(--atomix-transition-duration-base, 0.3s)
|
|
115
|
+
var(--atomix-easing-base, cubic-bezier(0.23, 1, 0.32, 1));
|
|
87
116
|
opacity: var(--atomix-glass-hover-2-opacity, 0);
|
|
88
|
-
background: var(
|
|
117
|
+
background: var(
|
|
118
|
+
--atomix-glass-hover-2-gradient,
|
|
119
|
+
radial-gradient(
|
|
120
|
+
80% 80% at 50% 100%,
|
|
121
|
+
var(--atomix-glass-hover-2-start-color, rgba(0, 0, 0, 0.12)) 0%,
|
|
122
|
+
var(--atomix-glass-hover-2-end-color, rgba(0, 0, 0, 0)) 60%
|
|
123
|
+
)
|
|
124
|
+
);
|
|
89
125
|
}
|
|
90
126
|
|
|
91
127
|
&__hover-3 {
|
|
92
|
-
transition:
|
|
93
|
-
opacity 0.55s cubic-bezier(0.22, 1, 0.36, 1),
|
|
94
|
-
background 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
|
128
|
+
transition: var(--_glass-transition);
|
|
95
129
|
opacity: var(--atomix-glass-hover-3-opacity, 0);
|
|
96
|
-
background: var(
|
|
130
|
+
background: var(
|
|
131
|
+
--atomix-glass-hover-3-gradient,
|
|
132
|
+
linear-gradient(
|
|
133
|
+
180deg,
|
|
134
|
+
var(--atomix-glass-hover-3-start-color, rgba(255, 255, 255, 0.06)) 0%,
|
|
135
|
+
var(--atomix-glass-hover-3-end-color, rgba(255, 255, 255, 0)) 100%
|
|
136
|
+
)
|
|
137
|
+
);
|
|
97
138
|
}
|
|
98
139
|
|
|
99
|
-
// Base and overlay layers for over-light mode
|
|
100
140
|
&__base {
|
|
101
141
|
mix-blend-mode: soft-light;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
142
|
+
opacity: var(--atomix-glass-base-opacity, 0.6);
|
|
143
|
+
background: var(
|
|
144
|
+
--atomix-glass-base-gradient,
|
|
145
|
+
linear-gradient(
|
|
146
|
+
180deg,
|
|
147
|
+
var(--atomix-glass-base-start-color, rgba(255, 255, 255, 0.08)) 0%,
|
|
148
|
+
var(--atomix-glass-base-end-color, rgba(255, 255, 255, 0.02)) 100%
|
|
149
|
+
)
|
|
150
|
+
);
|
|
105
151
|
}
|
|
106
152
|
|
|
107
153
|
&__overlay {
|
|
108
154
|
mix-blend-mode: overlay;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
155
|
+
opacity: var(--atomix-glass-overlay-opacity, 0.35);
|
|
156
|
+
background: var(
|
|
157
|
+
--atomix-glass-overlay-gradient,
|
|
158
|
+
radial-gradient(
|
|
159
|
+
120% 120% at 50% -10%,
|
|
160
|
+
var(--atomix-glass-overlay-start-color, rgba(255, 255, 255, 0.12)) 0%,
|
|
161
|
+
var(--atomix-glass-overlay-end-color, rgba(255, 255, 255, 0)) 40%
|
|
162
|
+
)
|
|
163
|
+
);
|
|
112
164
|
}
|
|
113
165
|
|
|
114
166
|
&__overlay-highlight {
|
|
115
167
|
position: absolute;
|
|
116
168
|
inset: var(--atomix-spacing-0-5, 0.125rem);
|
|
169
|
+
|
|
117
170
|
pointer-events: none;
|
|
118
|
-
border-radius: var(--
|
|
119
|
-
transform: var(--
|
|
120
|
-
transition: var(--
|
|
171
|
+
border-radius: var(--_glass-radius);
|
|
172
|
+
transform: var(--_glass-transform);
|
|
173
|
+
transition: var(--_glass-transition);
|
|
121
174
|
mix-blend-mode: screen;
|
|
122
175
|
z-index: var(--_glass-z-overlay-highlight);
|
|
123
|
-
opacity: var(--atomix-glass-overlay-highlight-opacity, 0);
|
|
124
|
-
background: var(
|
|
176
|
+
opacity: var(--atomix-glass-overlay-highlight-opacity, 0.25);
|
|
177
|
+
background: var(
|
|
178
|
+
--atomix-glass-overlay-highlight-bg,
|
|
179
|
+
linear-gradient(
|
|
180
|
+
180deg,
|
|
181
|
+
var(--atomix-glass-highlight-start-color, rgba(255, 255, 255, 0.24)) 0%,
|
|
182
|
+
var(--atomix-glass-highlight-end-color, rgba(255, 255, 255, 0)) 60%
|
|
183
|
+
)
|
|
184
|
+
);
|
|
125
185
|
}
|
|
126
186
|
|
|
127
187
|
// Border effect layers - matching old version exactly
|
|
188
|
+
&__border-backdrop,
|
|
128
189
|
&__border-1,
|
|
129
190
|
&__border-2 {
|
|
130
191
|
// Static styles
|
|
@@ -148,46 +209,44 @@
|
|
|
148
209
|
position: var(--atomix-glass-position);
|
|
149
210
|
top: var(--atomix-glass-top);
|
|
150
211
|
left: var(--atomix-glass-left);
|
|
212
|
+
right: var(--atomix-glass-right);
|
|
213
|
+
bottom: var(--atomix-glass-bottom);
|
|
151
214
|
width: var(--atomix-glass-width);
|
|
152
215
|
height: var(--atomix-glass-height);
|
|
153
|
-
border-radius: var(--
|
|
154
|
-
transform: var(--
|
|
155
|
-
transition: var(--
|
|
216
|
+
border-radius: var(--_glass-radius);
|
|
217
|
+
transform: var(--_glass-transform);
|
|
218
|
+
transition: var(--_glass-transition);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
&__border-backdrop {
|
|
222
|
+
mix-blend-mode: overlay;
|
|
223
|
+
z-index: var(--_glass-z-border-1);
|
|
224
|
+
backdrop-filter: var(--_glass-backdrop);
|
|
225
|
+
box-shadow: var(--atomix-glass-border-shadow);
|
|
156
226
|
}
|
|
157
227
|
|
|
158
228
|
&__border-1 {
|
|
159
|
-
opacity: var(--atomix-opacity-
|
|
229
|
+
opacity: var(--atomix-glass-border-1-opacity, var(--atomix-opacity-18, 0.18));
|
|
160
230
|
mix-blend-mode: screen;
|
|
161
|
-
z-index: var(--_glass-z-border-
|
|
231
|
+
z-index: var(--_glass-z-border-2);
|
|
162
232
|
background: var(--atomix-glass-border-gradient-1, none);
|
|
163
|
-
box-shadow: var(
|
|
164
|
-
--atomix-glass-border-shadow,
|
|
165
|
-
0 0 0 0.5px rgba(255, 255, 255, 0.5) inset,
|
|
166
|
-
0 1px 3px rgba(255, 255, 255, 0.25) inset,
|
|
167
|
-
0 1px 4px rgba(0, 0, 0, 0.35)
|
|
168
|
-
);
|
|
169
233
|
}
|
|
170
234
|
|
|
171
235
|
&__border-2 {
|
|
172
236
|
mix-blend-mode: overlay;
|
|
173
|
-
z-index: var(--_glass-z-border-
|
|
237
|
+
z-index: var(--_glass-z-border-3);
|
|
174
238
|
background: var(--atomix-glass-border-gradient-2, none);
|
|
175
|
-
box-shadow: var(
|
|
176
|
-
--atomix-glass-border-shadow,
|
|
177
|
-
0 0 0 0.5px rgba(255, 255, 255, 0.5) inset,
|
|
178
|
-
0 1px 3px rgba(255, 255, 255, 0.25) inset,
|
|
179
|
-
0 1px 4px rgba(0, 0, 0, 0.35)
|
|
180
|
-
);
|
|
181
239
|
}
|
|
182
240
|
|
|
183
|
-
// Container styles
|
|
184
241
|
&__container {
|
|
185
|
-
position:
|
|
242
|
+
position: relative;
|
|
186
243
|
top: var(--atomix-glass-top);
|
|
187
244
|
left: var(--atomix-glass-left);
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
245
|
+
right: var(--atomix-glass-right);
|
|
246
|
+
bottom: var(--atomix-glass-bottom);
|
|
247
|
+
border-radius: var(--_glass-radius);
|
|
248
|
+
transition: var(--_glass-transition);
|
|
249
|
+
transform: var(--_glass-transform);
|
|
191
250
|
z-index: var(--_glass-z-container);
|
|
192
251
|
}
|
|
193
252
|
|
|
@@ -195,9 +254,7 @@
|
|
|
195
254
|
width: 100%;
|
|
196
255
|
height: 100%;
|
|
197
256
|
position: relative;
|
|
198
|
-
border-radius: var(--
|
|
199
|
-
padding: var(--atomix-glass-container-padding);
|
|
200
|
-
box-shadow: var(--atomix-glass-container-box-shadow);
|
|
257
|
+
border-radius: var(--_glass-radius);
|
|
201
258
|
}
|
|
202
259
|
|
|
203
260
|
&__filter {
|
|
@@ -210,7 +267,7 @@
|
|
|
210
267
|
z-index: var(--_glass-z-filter);
|
|
211
268
|
|
|
212
269
|
svg {
|
|
213
|
-
border-radius: var(--
|
|
270
|
+
border-radius: var(--_glass-radius);
|
|
214
271
|
}
|
|
215
272
|
}
|
|
216
273
|
|
|
@@ -218,15 +275,15 @@
|
|
|
218
275
|
position: absolute;
|
|
219
276
|
inset: 0;
|
|
220
277
|
pointer-events: none;
|
|
221
|
-
border-radius: var(--
|
|
222
|
-
backdrop-filter: var(--atomix-glass-container-backdrop);
|
|
278
|
+
border-radius: var(--_glass-radius);
|
|
279
|
+
backdrop-filter: var(--atomix-glass-container-backdrop, var(--_glass-backdrop));
|
|
223
280
|
}
|
|
224
281
|
|
|
225
282
|
&__filter-shadow {
|
|
226
283
|
position: absolute;
|
|
227
284
|
inset: var(--atomix-glass-border-width);
|
|
228
285
|
pointer-events: none;
|
|
229
|
-
border-radius: var(--
|
|
286
|
+
border-radius: var(--_glass-radius);
|
|
230
287
|
box-shadow: var(--atomix-glass-container-shadow);
|
|
231
288
|
opacity: var(--atomix-glass-container-shadow-opacity);
|
|
232
289
|
background: var(--atomix-glass-container-bg);
|
|
@@ -236,9 +293,10 @@
|
|
|
236
293
|
position: relative;
|
|
237
294
|
width: var(--atomix-glass-container-width);
|
|
238
295
|
height: var(--atomix-glass-container-height);
|
|
239
|
-
border-radius: var(--
|
|
296
|
+
border-radius: var(--_glass-radius);
|
|
240
297
|
z-index: var(--_glass-z-content);
|
|
241
298
|
text-shadow: var(--atomix-glass-container-text-shadow);
|
|
299
|
+
box-shadow: var(--atomix-glass-container-box-shadow);
|
|
242
300
|
}
|
|
243
301
|
|
|
244
302
|
// Background layers for over-light mode
|
|
@@ -246,12 +304,14 @@
|
|
|
246
304
|
position: var(--atomix-glass-position);
|
|
247
305
|
top: var(--atomix-glass-top);
|
|
248
306
|
left: var(--atomix-glass-left);
|
|
307
|
+
right: var(--atomix-glass-right);
|
|
308
|
+
bottom: var(--atomix-glass-bottom);
|
|
249
309
|
width: var(--atomix-glass-width);
|
|
250
310
|
height: var(--atomix-glass-height);
|
|
251
311
|
pointer-events: none;
|
|
252
|
-
border-radius: var(--
|
|
253
|
-
transform: var(--
|
|
254
|
-
transition: var(--
|
|
312
|
+
border-radius: var(--_glass-radius);
|
|
313
|
+
transform: var(--_glass-transform);
|
|
314
|
+
transition: var(--_glass-transition);
|
|
255
315
|
z-index: var(--_glass-z-background);
|
|
256
316
|
|
|
257
317
|
&--dark {
|
|
@@ -264,11 +324,11 @@
|
|
|
264
324
|
}
|
|
265
325
|
|
|
266
326
|
&--dark#{&}--over-light {
|
|
267
|
-
opacity: var(--atomix-opacity-50, 0.5);
|
|
327
|
+
opacity: var(--atomix-glass-over-light-dark-opacity, var(--atomix-opacity-50, 0.5));
|
|
268
328
|
}
|
|
269
329
|
|
|
270
330
|
&--black#{&}--over-light {
|
|
271
|
-
opacity: var(--atomix-opacity-25, 0.25);
|
|
331
|
+
opacity: var(--atomix-glass-over-light-black-opacity, var(--atomix-opacity-25, 0.25));
|
|
272
332
|
}
|
|
273
333
|
|
|
274
334
|
&--hidden {
|
|
@@ -278,6 +338,7 @@
|
|
|
278
338
|
|
|
279
339
|
&--reduced-motion {
|
|
280
340
|
--atomix-glass-transition: none;
|
|
341
|
+
--_glass-transition: none;
|
|
281
342
|
|
|
282
343
|
* {
|
|
283
344
|
transition: none !important;
|
|
@@ -285,9 +346,9 @@
|
|
|
285
346
|
}
|
|
286
347
|
|
|
287
348
|
&--high-contrast {
|
|
288
|
-
border: var(--atomix-spacing-0-5
|
|
289
|
-
outline: var(--atomix-spacing-0-5
|
|
290
|
-
outline-offset: var(--atomix-spacing-0-5
|
|
349
|
+
border: var(--atomix-spacing-0-5) solid currentColor;
|
|
350
|
+
outline: var(--atomix-spacing-0-5) solid transparent;
|
|
351
|
+
outline-offset: var(--atomix-spacing-0-5);
|
|
291
352
|
}
|
|
292
353
|
|
|
293
354
|
&--disabled-effects {
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
# CLI Tests
|
|
2
|
-
|
|
3
|
-
This directory contains comprehensive tests for the Atomix CLI tools.
|
|
4
|
-
|
|
5
|
-
## Test Structure
|
|
6
|
-
|
|
7
|
-
### Files
|
|
8
|
-
- `basic.test.js` - Core utility functions (validatePath, validateComponentName, etc.)
|
|
9
|
-
- `utils.test.js` - Extended utility tests with file system operations
|
|
10
|
-
- `token-manager.test.js` - Token management functionality
|
|
11
|
-
- `component-generator.test.js` - Component generation and validation
|
|
12
|
-
- `integration.test.js` - End-to-end CLI command tests
|
|
13
|
-
- `test-setup.js` - Global test configuration and mocks
|
|
14
|
-
|
|
15
|
-
## Running Tests
|
|
16
|
-
|
|
17
|
-
### Run all CLI tests
|
|
18
|
-
```bash
|
|
19
|
-
npm run test:cli
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
### Run with watch mode
|
|
23
|
-
```bash
|
|
24
|
-
npm run test:cli:watch
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Run with coverage
|
|
28
|
-
```bash
|
|
29
|
-
npm run test:cli:coverage
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Run specific test file
|
|
33
|
-
```bash
|
|
34
|
-
npx vitest run scripts/cli/__tests__/basic.test.js
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Test Categories
|
|
38
|
-
|
|
39
|
-
### Unit Tests
|
|
40
|
-
- **Utils**: Path validation, name validation, input sanitization
|
|
41
|
-
- **Token Manager**: Token parsing, validation, export/import
|
|
42
|
-
- **Component Generator**: Component creation, validation, templates
|
|
43
|
-
|
|
44
|
-
### Integration Tests
|
|
45
|
-
- Full CLI command execution
|
|
46
|
-
- File system operations
|
|
47
|
-
- Error handling scenarios
|
|
48
|
-
|
|
49
|
-
## Coverage Goals
|
|
50
|
-
|
|
51
|
-
- **Overall Coverage**: 80%+
|
|
52
|
-
- **Functions**: 80%+
|
|
53
|
-
- **Branches**: 80%+
|
|
54
|
-
- **Lines**: 80%+
|
|
55
|
-
- **Statements**: 80%+
|
|
56
|
-
|
|
57
|
-
## Mock Strategy
|
|
58
|
-
|
|
59
|
-
- External dependencies (ora, chalk, inquirer) are mocked
|
|
60
|
-
- File system operations use temporary directories
|
|
61
|
-
- CLI commands are tested in isolated environments
|
|
62
|
-
|
|
63
|
-
## Adding New Tests
|
|
64
|
-
|
|
65
|
-
1. Create test file with `.test.js` extension
|
|
66
|
-
2. Use descriptive test names
|
|
67
|
-
3. Mock external dependencies
|
|
68
|
-
4. Clean up temporary files in afterEach
|
|
69
|
-
5. Follow existing patterns for consistency
|
|
70
|
-
|
|
71
|
-
## Debugging Failed Tests
|
|
72
|
-
|
|
73
|
-
Run tests with verbose output:
|
|
74
|
-
```bash
|
|
75
|
-
npx vitest run --reporter=verbose scripts/cli/__tests__/
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
For specific test debugging:
|
|
79
|
-
```bash
|
|
80
|
-
npx vitest run --no-coverage scripts/cli/__tests__/basic.test.js
|
|
81
|
-
```
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Basic CLI Tests - Core Functionality
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { describe, it, expect } from 'vitest';
|
|
6
|
-
import {
|
|
7
|
-
validatePath,
|
|
8
|
-
validateComponentName,
|
|
9
|
-
validateThemeName,
|
|
10
|
-
sanitizeInput,
|
|
11
|
-
AtomixCLIError
|
|
12
|
-
} from '../utils.js';
|
|
13
|
-
|
|
14
|
-
describe('CLI Core Utils', () => {
|
|
15
|
-
describe('validatePath', () => {
|
|
16
|
-
it('should accept valid relative paths', () => {
|
|
17
|
-
const result = validatePath('./src/components', '/project');
|
|
18
|
-
expect(result.isValid).toBe(true);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('should reject paths outside project directory', () => {
|
|
22
|
-
const result = validatePath('../../etc/passwd', '/project');
|
|
23
|
-
expect(result.isValid).toBe(false);
|
|
24
|
-
expect(result.error).toBeTruthy();
|
|
25
|
-
expect(result.error).toMatch(/outside|traversal/);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('should reject sensitive files', () => {
|
|
29
|
-
const result = validatePath('.env', '/project');
|
|
30
|
-
expect(result.isValid).toBe(false);
|
|
31
|
-
expect(result.error).toContain('sensitive path');
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
describe('validateComponentName', () => {
|
|
36
|
-
it('should accept valid PascalCase names', () => {
|
|
37
|
-
const validNames = ['Button', 'CardHeader', 'ModalDialog'];
|
|
38
|
-
|
|
39
|
-
validNames.forEach(name => {
|
|
40
|
-
const result = validateComponentName(name);
|
|
41
|
-
expect(result.isValid).toBe(true);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should reject invalid names', () => {
|
|
46
|
-
const invalidNames = ['123Button', '', '1', 'a'];
|
|
47
|
-
|
|
48
|
-
invalidNames.forEach(name => {
|
|
49
|
-
const result = validateComponentName(name);
|
|
50
|
-
expect(result.isValid).toBe(false);
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('should reject reserved words', () => {
|
|
55
|
-
const reservedWords = ['Component', 'React', 'Fragment'];
|
|
56
|
-
|
|
57
|
-
reservedWords.forEach(name => {
|
|
58
|
-
const result = validateComponentName(name);
|
|
59
|
-
expect(result.isValid).toBe(false);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe('validateThemeName', () => {
|
|
65
|
-
it('should accept valid kebab-case names', () => {
|
|
66
|
-
const validNames = ['dark-theme', 'light', 'high-contrast'];
|
|
67
|
-
|
|
68
|
-
validNames.forEach(name => {
|
|
69
|
-
const result = validateThemeName(name);
|
|
70
|
-
expect(result.isValid).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('should reject invalid theme names', () => {
|
|
75
|
-
const invalidNames = ['DarkTheme', 'theme_dark', 'Theme-Dark', '123theme', ''];
|
|
76
|
-
|
|
77
|
-
invalidNames.forEach(name => {
|
|
78
|
-
const result = validateThemeName(name);
|
|
79
|
-
expect(result.isValid).toBe(false);
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
describe('sanitizeInput', () => {
|
|
85
|
-
it('should remove dangerous shell characters', () => {
|
|
86
|
-
const dangerousInputs = [
|
|
87
|
-
'test; rm -rf /',
|
|
88
|
-
'input && malicious-command',
|
|
89
|
-
'command | pipe'
|
|
90
|
-
];
|
|
91
|
-
|
|
92
|
-
dangerousInputs.forEach(input => {
|
|
93
|
-
const sanitized = sanitizeInput(input);
|
|
94
|
-
expect(sanitized).not.toMatch(/[;&|`$<>]/);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it('should preserve safe characters', () => {
|
|
99
|
-
const safeInput = 'Button-Component_123';
|
|
100
|
-
const sanitized = sanitizeInput(safeInput);
|
|
101
|
-
expect(sanitized).toBe(safeInput);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
describe('AtomixCLIError', () => {
|
|
106
|
-
it('should create error with code and suggestions', () => {
|
|
107
|
-
const suggestions = ['Use PascalCase', 'Start with letter'];
|
|
108
|
-
const error = new AtomixCLIError('Invalid name', 'INVALID_NAME', suggestions);
|
|
109
|
-
|
|
110
|
-
expect(error.message).toBe('Invalid name');
|
|
111
|
-
expect(error.code).toBe('INVALID_NAME');
|
|
112
|
-
expect(error.suggestions).toEqual(suggestions);
|
|
113
|
-
expect(error.name).toBe('AtomixCLIError');
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
});
|