@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.
Files changed (76) hide show
  1. package/dist/atomix.css +95 -69
  2. package/dist/atomix.css.map +1 -1
  3. package/dist/atomix.min.css +1 -1
  4. package/dist/atomix.min.css.map +1 -1
  5. package/dist/charts.d.ts +1 -0
  6. package/dist/charts.js +231 -332
  7. package/dist/charts.js.map +1 -1
  8. package/dist/core.d.ts +1 -0
  9. package/dist/core.js +232 -333
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.d.ts +1 -0
  12. package/dist/forms.js +231 -332
  13. package/dist/forms.js.map +1 -1
  14. package/dist/heavy.d.ts +11 -2
  15. package/dist/heavy.js +233 -334
  16. package/dist/heavy.js.map +1 -1
  17. package/dist/index.d.ts +13 -2
  18. package/dist/index.esm.js +228 -327
  19. package/dist/index.esm.js.map +1 -1
  20. package/dist/index.js +227 -326
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.min.js +1 -1
  23. package/dist/index.min.js.map +1 -1
  24. package/package.json +11 -1
  25. package/src/components/AtomixGlass/AtomixGlass.tsx +188 -128
  26. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +62 -90
  27. package/src/components/AtomixGlass/PerformanceDashboard.tsx +153 -201
  28. package/src/components/AtomixGlass/glass-utils.ts +50 -0
  29. package/src/components/AtomixGlass/stories/AnimationFeatures.stories.tsx +52 -46
  30. package/src/components/AtomixGlass/stories/Examples.stories.tsx +573 -236
  31. package/src/components/AtomixGlass/stories/Playground.stories.tsx +88 -41
  32. package/src/components/AtomixGlass/stories/argTypes.ts +19 -19
  33. package/src/components/AtomixGlass/stories/shared-components.tsx +7 -12
  34. package/src/components/AtomixGlass/stories/types.ts +3 -3
  35. package/src/lib/composables/useAtomixGlass.ts +108 -71
  36. package/src/lib/composables/useAtomixGlassStyles.ts +0 -2
  37. package/src/lib/constants/components.ts +1 -0
  38. package/src/lib/types/components.ts +1 -0
  39. package/src/lib/utils/displacement-generator.ts +1 -1
  40. package/src/styles/06-components/_components.atomix-glass.scss +158 -97
  41. package/scripts/cli/__tests__/README.md +0 -81
  42. package/scripts/cli/__tests__/basic.test.js +0 -116
  43. package/scripts/cli/__tests__/clean.test.js +0 -278
  44. package/scripts/cli/__tests__/component-generator.test.js +0 -332
  45. package/scripts/cli/__tests__/component-validator.test.js +0 -433
  46. package/scripts/cli/__tests__/generator.test.js +0 -613
  47. package/scripts/cli/__tests__/glass-motion.test.js +0 -256
  48. package/scripts/cli/__tests__/integration.test.js +0 -938
  49. package/scripts/cli/__tests__/migrate.test.js +0 -74
  50. package/scripts/cli/__tests__/security.test.js +0 -206
  51. package/scripts/cli/__tests__/test-setup.js +0 -135
  52. package/scripts/cli/__tests__/theme-bridge.test.js +0 -507
  53. package/scripts/cli/__tests__/token-manager.test.js +0 -251
  54. package/scripts/cli/__tests__/token-provider.test.js +0 -361
  55. package/scripts/cli/__tests__/utils.test.js +0 -165
  56. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +0 -216
  57. package/src/components/AtomixGlass/stories/AnimationTests.stories.tsx +0 -95
  58. package/src/components/AtomixGlass/stories/CardExamples.stories.tsx +0 -212
  59. package/src/components/AtomixGlass/stories/Customization.stories.tsx +0 -131
  60. package/src/components/AtomixGlass/stories/DashboardExamples.stories.tsx +0 -348
  61. package/src/components/AtomixGlass/stories/EcommerceExamples.stories.tsx +0 -410
  62. package/src/components/AtomixGlass/stories/FormExamples.stories.tsx +0 -436
  63. package/src/components/AtomixGlass/stories/HeroExamples.stories.tsx +0 -264
  64. package/src/components/AtomixGlass/stories/InteractivePlayground.stories.tsx +0 -247
  65. package/src/components/AtomixGlass/stories/MobileUIExamples.stories.tsx +0 -418
  66. package/src/components/AtomixGlass/stories/ModalExamples.stories.tsx +0 -402
  67. package/src/components/AtomixGlass/stories/Modes.stories.tsx +0 -1082
  68. package/src/components/AtomixGlass/stories/Overview.stories.tsx +0 -497
  69. package/src/components/AtomixGlass/stories/Performance.stories.tsx +0 -103
  70. package/src/components/AtomixGlass/stories/PresetGallery.stories.tsx +0 -335
  71. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +0 -395
  72. package/src/components/AtomixGlass/stories/WidgetExamples.stories.tsx +0 -441
  73. package/src/components/TypedButton/TypedButton.stories.tsx +0 -59
  74. package/src/components/TypedButton/TypedButton.tsx +0 -39
  75. package/src/components/TypedButton/index.ts +0 -2
  76. package/src/lib/composables/useTypedButton.ts +0 -66
@@ -6,59 +6,82 @@
6
6
  .c-atomix-glass {
7
7
  position: relative;
8
8
 
9
- // CSS custom property defaults
10
- --atomix-glass-transition: all 0.15s ease;
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.09375rem);
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 (local scale, scoped to this component)
24
+ // Z-INDEX STACKING ORDER (based on design token system)
16
25
  // =========================================================================
17
- // 0: background layers
18
- // 1: container (wraps filter + content)
19
- // 2: base / overlay effect layers
20
- // 3: hover effect layers
21
- // 4: overlay-highlight
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(var(--atomix-glass-base-z-index) + 0);
32
- --_glass-z-container: calc(var(--atomix-glass-base-z-index) + 1);
33
- --_glass-z-filter: calc(var(--atomix-glass-base-z-index) + 1);
34
- --_glass-z-effect: calc(var(--atomix-glass-base-z-index) + 2);
35
- --_glass-z-hover: calc(var(--atomix-glass-base-z-index) + 3);
36
- --_glass-z-overlay-highlight: calc(var(--atomix-glass-base-z-index) + 4);
37
- --_glass-z-border-1: calc(var(--atomix-glass-base-z-index) + 5);
38
- --_glass-z-border-2: calc(var(--atomix-glass-base-z-index) + 6);
39
- --_glass-z-content: calc(var(--atomix-glass-base-z-index) + 7);
40
- position: relative;
41
-
42
- // Base layer styles for all effect layers (hover, border, overlay)
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(--atomix-glass-radius);
51
- transform: var(--atomix-glass-transform);
52
- transition: var(--atomix-glass-transition);
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
- opacity 0.2s cubic-bezier(0.22, 1, 0.36, 1),
78
- background 0.35s cubic-bezier(0.22, 1, 0.36, 1);
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(--atomix-glass-hover-1-gradient, none);
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
- opacity 0.35s cubic-bezier(0.22, 1, 0.36, 1),
86
- background 0.45s cubic-bezier(0.22, 1, 0.36, 1);
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(--atomix-glass-hover-2-gradient, none);
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(--atomix-glass-hover-3-gradient, none);
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
- // Dynamic opacity and background are set via inline styles using CSS variables
103
- opacity: var(--atomix-glass-base-opacity, 0);
104
- background: var(--atomix-glass-base-gradient, none);
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
- // Dynamic opacity and background are set via inline styles using CSS variables
110
- opacity: var(--atomix-glass-overlay-opacity, 0);
111
- background: var(--atomix-glass-overlay-gradient, none);
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(--atomix-glass-radius);
119
- transform: var(--atomix-glass-transform);
120
- transition: var(--atomix-glass-transition);
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(--atomix-glass-overlay-highlight-bg, none);
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(--atomix-glass-radius);
154
- transform: var(--atomix-glass-transform);
155
- transition: var(--atomix-glass-transition);
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-20, 0.2);
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-1);
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-2);
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: var(--atomix-glass-position);
242
+ position: relative;
186
243
  top: var(--atomix-glass-top);
187
244
  left: var(--atomix-glass-left);
188
- border-radius: var(--atomix-glass-radius);
189
- transition: var(--atomix-glass-transition);
190
- transform: var(--atomix-glass-transform);
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(--atomix-glass-radius);
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(--atomix-glass-radius);
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(--atomix-glass-container-radius);
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(--atomix-glass-container-radius);
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(--atomix-glass-radius);
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(--atomix-glass-radius);
253
- transform: var(--atomix-glass-transform);
254
- transition: var(--atomix-glass-transition);
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, 2px) solid currentColor;
289
- outline: var(--atomix-spacing-0-5, 2px) solid transparent;
290
- outline-offset: var(--atomix-spacing-0-5, 2px);
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
- });