@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.
- package/atomix.config.ts +58 -1
- package/dist/atomix.css +172 -157
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +4 -4
- package/dist/atomix.min.css.map +1 -1
- package/dist/charts.d.ts +33 -0
- package/dist/charts.js +1274 -164
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +33 -10
- package/dist/core.js +1099 -83
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +33 -0
- package/dist/forms.js +2106 -1050
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +42 -1
- package/dist/heavy.js +1663 -638
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +442 -270
- package/dist/index.esm.js +1947 -680
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1982 -712
- 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 +6 -3
- package/scripts/atomix-cli.js +136 -1827
- package/scripts/cli/__tests__/basic.test.js +3 -2
- package/scripts/cli/__tests__/clean.test.js +278 -0
- package/scripts/cli/__tests__/component-validator.test.js +433 -0
- package/scripts/cli/__tests__/generator.test.js +613 -0
- package/scripts/cli/__tests__/glass-motion.test.js +256 -0
- package/scripts/cli/__tests__/integration.test.js +719 -108
- package/scripts/cli/__tests__/migrate.test.js +74 -0
- package/scripts/cli/__tests__/security.test.js +206 -0
- package/scripts/cli/__tests__/test-setup.js +3 -1
- package/scripts/cli/__tests__/theme-bridge.test.js +507 -0
- package/scripts/cli/__tests__/token-provider.test.js +361 -0
- package/scripts/cli/__tests__/utils.test.js +5 -5
- package/scripts/cli/commands/benchmark.js +105 -0
- package/scripts/cli/commands/build-theme.js +115 -0
- package/scripts/cli/commands/clean.js +109 -0
- package/scripts/cli/commands/doctor.js +88 -0
- package/scripts/cli/commands/generate.js +218 -0
- package/scripts/cli/commands/init.js +73 -0
- package/scripts/cli/commands/migrate.js +106 -0
- package/scripts/cli/commands/sync-tokens.js +206 -0
- package/scripts/cli/commands/theme-bridge.js +248 -0
- package/scripts/cli/commands/tokens.js +157 -0
- package/scripts/cli/commands/validate.js +194 -0
- package/scripts/cli/internal/ai-engine.js +156 -0
- package/scripts/cli/internal/compiler.js +114 -0
- package/scripts/cli/internal/component-validator.js +443 -0
- package/scripts/cli/internal/config-loader.js +162 -0
- package/scripts/cli/internal/filesystem.js +158 -0
- package/scripts/cli/internal/generator.js +430 -0
- package/scripts/cli/internal/glass-generator.js +398 -0
- package/scripts/cli/internal/hook-generator.js +369 -0
- package/scripts/cli/internal/hooks.js +61 -0
- package/scripts/cli/internal/itcss-generator.js +565 -0
- package/scripts/cli/internal/motion-generator.js +679 -0
- package/scripts/cli/internal/template-engine.js +301 -0
- package/scripts/cli/internal/theme-bridge.js +664 -0
- package/scripts/cli/internal/tokens/engine.js +122 -0
- package/scripts/cli/internal/tokens/provider.js +34 -0
- package/scripts/cli/internal/tokens/providers/figma.js +50 -0
- package/scripts/cli/internal/tokens/providers/style-dictionary.js +48 -0
- package/scripts/cli/internal/tokens/providers/w3c.js +48 -0
- package/scripts/cli/internal/tokens/token-provider.js +443 -0
- package/scripts/cli/internal/tokens/token-validator.js +513 -0
- package/scripts/cli/internal/validator.js +276 -0
- package/scripts/cli/internal/wizard.js +115 -0
- package/scripts/cli/mappings.js +23 -0
- package/scripts/cli/migration-tools.js +164 -94
- package/scripts/cli/plugins/style-dictionary.js +46 -0
- package/scripts/cli/templates/README.md +525 -95
- package/scripts/cli/templates/common-templates.js +40 -14
- package/scripts/cli/templates/components/react-component.ts +282 -0
- package/scripts/cli/templates/config/project-config.ts +112 -0
- package/scripts/cli/templates/hooks/use-component.ts +477 -0
- package/scripts/cli/templates/index.js +19 -4
- package/scripts/cli/templates/index.ts +171 -0
- package/scripts/cli/templates/next-templates.js +72 -0
- package/scripts/cli/templates/react-templates.js +70 -126
- package/scripts/cli/templates/scss-templates.js +35 -35
- package/scripts/cli/templates/stories/storybook-story.ts +241 -0
- package/scripts/cli/templates/styles/scss-component.ts +255 -0
- package/scripts/cli/templates/tests/vitest-test.ts +229 -0
- package/scripts/cli/templates/token-templates.js +337 -1
- package/scripts/cli/templates/tokens/token-generators.ts +1088 -0
- package/scripts/cli/templates/types/component-types.ts +145 -0
- package/scripts/cli/templates/utils/testing-utils.ts +144 -0
- package/scripts/cli/templates/vanilla-templates.js +39 -0
- package/scripts/cli/token-manager.js +8 -2
- package/scripts/cli/utils/cache-manager.js +240 -0
- package/scripts/cli/utils/detector.js +46 -0
- package/scripts/cli/utils/diagnostics.js +289 -0
- package/scripts/cli/utils/error.js +89 -0
- package/scripts/cli/utils/helpers.js +67 -0
- package/scripts/cli/utils/logger.js +75 -0
- package/scripts/cli/utils/security.js +302 -0
- package/scripts/cli/utils/telemetry.js +115 -0
- package/scripts/cli/utils/validation.js +37 -0
- package/scripts/cli/utils.js +28 -341
- package/src/components/Accordion/Accordion.stories.tsx +0 -18
- package/src/components/Accordion/Accordion.test.tsx +0 -17
- package/src/components/Accordion/Accordion.tsx +0 -4
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +37 -3
- package/src/components/AtomixGlass/AtomixGlass.tsx +143 -31
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +129 -31
- package/src/components/AtomixGlass/PerformanceDashboard.tsx +219 -0
- package/src/components/AtomixGlass/README.md +25 -10
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +216 -0
- package/src/components/AtomixGlass/animation-system.ts +578 -0
- package/src/components/AtomixGlass/shader-utils.ts +4 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +157 -6
- package/src/components/AtomixGlass/stories/Phase1-Animation.stories.tsx +653 -0
- package/src/components/AtomixGlass/stories/Phase1-Test.stories.tsx +95 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -51
- package/src/components/AtomixGlass/stories/shared-components.tsx +6 -0
- package/src/components/Avatar/Avatar.tsx +1 -1
- package/src/components/Button/Button.stories.disabled-link.tsx +10 -0
- package/src/components/Button/Button.stories.tsx +10 -0
- package/src/components/Button/Button.test.tsx +16 -11
- package/src/components/Button/Button.tsx +4 -4
- package/src/components/Card/Card.tsx +1 -1
- package/src/components/Dropdown/Dropdown.tsx +12 -12
- package/src/components/Form/Select.tsx +62 -3
- package/src/components/Modal/Modal.tsx +14 -3
- package/src/components/Navigation/Navbar/Navbar.tsx +44 -0
- package/src/components/Slider/Slider.stories.tsx +3 -3
- package/src/components/Slider/Slider.tsx +38 -0
- package/src/components/Steps/Steps.tsx +3 -3
- package/src/components/Tabs/Tabs.tsx +77 -8
- package/src/components/Testimonial/Testimonial.tsx +1 -1
- package/src/components/TypedButton/TypedButton.stories.tsx +59 -0
- package/src/components/TypedButton/TypedButton.tsx +39 -0
- package/src/components/TypedButton/index.ts +2 -0
- package/src/components/VideoPlayer/VideoPlayer.tsx +11 -4
- package/src/lib/composables/index.ts +4 -7
- package/src/lib/composables/types.ts +45 -0
- package/src/lib/composables/useAccordion.ts +0 -7
- package/src/lib/composables/useAtomixGlass.ts +148 -6
- package/src/lib/composables/useAtomixGlassStyles.ts +9 -7
- package/src/lib/composables/useChartExport.ts +3 -13
- package/src/lib/composables/useDropdown.ts +66 -0
- package/src/lib/composables/useFocusTrap.ts +80 -0
- package/src/lib/composables/usePerformanceMonitor.ts +448 -0
- package/src/lib/composables/useResponsiveGlass.presets.ts +192 -0
- package/src/lib/composables/useResponsiveGlass.ts +441 -0
- package/src/lib/composables/useTooltip.ts +16 -0
- package/src/lib/composables/useTypedButton.ts +66 -0
- package/src/lib/config/index.ts +62 -5
- package/src/lib/constants/components.ts +62 -7
- package/src/lib/theme/devtools/__tests__/useHistory.test.tsx +150 -0
- package/src/lib/theme/tokens/centralized-tokens.ts +120 -0
- package/src/lib/theme/utils/__tests__/domUtils.test.ts +101 -0
- package/src/lib/types/components.ts +37 -11
- package/src/lib/types/glass.ts +35 -0
- package/src/lib/types/index.ts +1 -0
- package/src/lib/utils/displacement-generator.ts +1 -1
- package/src/styles/01-settings/_settings.testtypecheck.scss +53 -0
- package/src/styles/01-settings/_settings.typedbutton.scss +53 -0
- package/src/styles/06-components/_components.atomix-glass.scss +17 -21
- package/src/styles/06-components/_components.edge-panel.scss +1 -5
- package/src/styles/06-components/_components.modal.scss +1 -4
- package/src/styles/06-components/_components.navbar.scss +1 -1
- package/src/styles/06-components/_components.testbutton.scss +212 -0
- package/src/styles/06-components/_components.testtypecheck.scss +212 -0
- package/src/styles/06-components/_components.tooltip.scss +9 -5
- package/src/styles/06-components/_components.typedbutton.scss +212 -0
- package/src/styles/99-utilities/_index.scss +1 -0
- package/src/styles/99-utilities/_utilities.text.scss +1 -1
- package/src/styles/99-utilities/_utilities.touch-target.scss +36 -0
- package/scripts/cli/component-generator.js +0 -564
- package/scripts/cli/interactive-init.js +0 -357
- package/src/styles/06-components/old.chart.styles.scss +0 -2788
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glassmorphism & Motion Generator Tests
|
|
3
|
+
* Tests for Phase 3: Premium UI & Animation System
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
7
|
+
import {
|
|
8
|
+
GLASS_PRESETS,
|
|
9
|
+
generateGlassStyles,
|
|
10
|
+
getGlassPresets,
|
|
11
|
+
validateGlassConfig
|
|
12
|
+
} from '../internal/glass-generator.js';
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
ANIMATION_PRESETS,
|
|
16
|
+
generateMotionTokens,
|
|
17
|
+
getAnimationPresets
|
|
18
|
+
} from '../internal/motion-generator.js';
|
|
19
|
+
|
|
20
|
+
describe('Glass Generator', () => {
|
|
21
|
+
describe('Glass Presets', () => {
|
|
22
|
+
it('should have all predefined presets', () => {
|
|
23
|
+
const presets = getGlassPresets();
|
|
24
|
+
|
|
25
|
+
expect(presets).toContain('subtle');
|
|
26
|
+
expect(presets).toContain('default');
|
|
27
|
+
expect(presets).toContain('strong');
|
|
28
|
+
expect(presets).toContain('frost');
|
|
29
|
+
expect(presets).toContain('crystal');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should have valid preset configurations', () => {
|
|
33
|
+
for (const [name, config] of Object.entries(GLASS_PRESETS)) {
|
|
34
|
+
expect(config).toHaveProperty('displacementScale');
|
|
35
|
+
expect(config).toHaveProperty('blurAmount');
|
|
36
|
+
expect(config).toHaveProperty('saturation');
|
|
37
|
+
expect(config).toHaveProperty('opacity');
|
|
38
|
+
expect(config).toHaveProperty('borderOpacity');
|
|
39
|
+
|
|
40
|
+
// Validate ranges
|
|
41
|
+
expect(config.displacementScale).toBeGreaterThanOrEqual(0);
|
|
42
|
+
expect(config.displacementScale).toBeLessThanOrEqual(100);
|
|
43
|
+
expect(config.blurAmount).toBeGreaterThanOrEqual(0);
|
|
44
|
+
expect(config.blurAmount).toBeLessThanOrEqual(50);
|
|
45
|
+
expect(config.opacity).toBeGreaterThanOrEqual(0);
|
|
46
|
+
expect(config.opacity).toBeLessThanOrEqual(1);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
describe('Glass Styles Generation', () => {
|
|
52
|
+
it('should generate glass styles with default preset', () => {
|
|
53
|
+
const styles = generateGlassStyles('Button', 'default');
|
|
54
|
+
|
|
55
|
+
expect(styles).toContain('.button--glass');
|
|
56
|
+
expect(styles).toContain('backdrop-filter');
|
|
57
|
+
expect(styles).toContain('background: rgba');
|
|
58
|
+
expect(styles).toContain('&:hover');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should include dark mode styles', () => {
|
|
62
|
+
const styles = generateGlassStyles('Card', 'strong');
|
|
63
|
+
|
|
64
|
+
expect(styles).toContain('.dark .card--glass');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should include accessibility features', () => {
|
|
68
|
+
const styles = generateGlassStyles('Modal', 'subtle');
|
|
69
|
+
|
|
70
|
+
expect(styles).toContain('prefers-reduced-transparency');
|
|
71
|
+
expect(styles).toContain('prefers-reduced-motion');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('should generate different styles for different presets', () => {
|
|
75
|
+
const subtleStyles = generateGlassStyles('Button', 'subtle');
|
|
76
|
+
const crystalStyles = generateGlassStyles('Button', 'crystal');
|
|
77
|
+
|
|
78
|
+
expect(subtleStyles).not.toBe(crystalStyles);
|
|
79
|
+
expect(crystalStyles).toContain('blur(40px)');
|
|
80
|
+
expect(subtleStyles).toContain('blur(5px)');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe('Glass Config Validation', () => {
|
|
85
|
+
it('should validate correct configuration', () => {
|
|
86
|
+
const result = validateGlassConfig({
|
|
87
|
+
displacementScale: 20,
|
|
88
|
+
blurAmount: 10,
|
|
89
|
+
saturation: 200,
|
|
90
|
+
opacity: 0.15
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
expect(result.valid).toBe(true);
|
|
94
|
+
expect(result.issues).toHaveLength(0);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('should reject invalid displacement scale', () => {
|
|
98
|
+
const result = validateGlassConfig({
|
|
99
|
+
displacementScale: 150 // Out of range
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
expect(result.valid).toBe(false);
|
|
103
|
+
expect(result.issues).toContain('displacementScale must be between 0 and 100');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('should reject invalid blur amount', () => {
|
|
107
|
+
const result = validateGlassConfig({
|
|
108
|
+
blurAmount: -5 // Negative
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
expect(result.valid).toBe(false);
|
|
112
|
+
expect(result.issues).toContain('blurAmount must be between 0 and 50');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should reject invalid opacity', () => {
|
|
116
|
+
const result = validateGlassConfig({
|
|
117
|
+
opacity: 1.5 // > 1
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
expect(result.valid).toBe(false);
|
|
121
|
+
expect(result.issues).toContain('opacity must be between 0 and 1');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('should accept multiple validation errors', () => {
|
|
125
|
+
const result = validateGlassConfig({
|
|
126
|
+
displacementScale: 200,
|
|
127
|
+
blurAmount: 100,
|
|
128
|
+
opacity: 2
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
expect(result.valid).toBe(false);
|
|
132
|
+
expect(result.issues.length).toBeGreaterThan(2);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('Motion Generator', () => {
|
|
138
|
+
describe('Animation Presets', () => {
|
|
139
|
+
it('should have all animation presets', () => {
|
|
140
|
+
const presets = getAnimationPresets();
|
|
141
|
+
|
|
142
|
+
expect(presets).toContain('fade');
|
|
143
|
+
expect(presets).toContain('fadeIn');
|
|
144
|
+
expect(presets).toContain('fadeOut');
|
|
145
|
+
expect(presets).toContain('slideInUp');
|
|
146
|
+
expect(presets).toContain('slideInDown');
|
|
147
|
+
expect(presets).toContain('scaleIn');
|
|
148
|
+
expect(presets).toContain('bounce');
|
|
149
|
+
expect(presets).toContain('spin');
|
|
150
|
+
expect(presets).toContain('shake');
|
|
151
|
+
expect(presets).toContain('pulse');
|
|
152
|
+
expect(presets).toContain('shimmer');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('should have valid preset structure', () => {
|
|
156
|
+
for (const [name, preset] of Object.entries(ANIMATION_PRESETS)) {
|
|
157
|
+
expect(preset).toHaveProperty('keyframes');
|
|
158
|
+
expect(preset).toHaveProperty('duration');
|
|
159
|
+
expect(preset).toHaveProperty('easing');
|
|
160
|
+
|
|
161
|
+
// Keyframes should be non-empty string
|
|
162
|
+
expect(typeof preset.keyframes).toBe('string');
|
|
163
|
+
expect(preset.keyframes.length).toBeGreaterThan(0);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
describe('Motion Tokens Generation', () => {
|
|
169
|
+
it('should generate duration scale tokens', () => {
|
|
170
|
+
const tokens = generateMotionTokens();
|
|
171
|
+
|
|
172
|
+
expect(tokens).toContain('--atomix-duration-instant');
|
|
173
|
+
expect(tokens).toContain('--atomix-duration-fast');
|
|
174
|
+
expect(tokens).toContain('--atomix-duration-base');
|
|
175
|
+
expect(tokens).toContain('--atomix-duration-slow');
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('should generate easing tokens', () => {
|
|
179
|
+
const tokens = generateMotionTokens();
|
|
180
|
+
|
|
181
|
+
expect(tokens).toContain('--atomix-easing-linear');
|
|
182
|
+
expect(tokens).toContain('--atomix-ease-in');
|
|
183
|
+
expect(tokens).toContain('--atomix-ease-out');
|
|
184
|
+
expect(tokens).toContain('--atomix-ease-in-out');
|
|
185
|
+
expect(tokens).toContain('--atomix-easing-smooth');
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('should generate keyframe definitions', () => {
|
|
189
|
+
const tokens = generateMotionTokens();
|
|
190
|
+
|
|
191
|
+
expect(tokens).toContain('@keyframes atomix-fade-in');
|
|
192
|
+
expect(tokens).toContain('@keyframes atomix-slide-in-up');
|
|
193
|
+
expect(tokens).toContain('@keyframes atomix-scale-in');
|
|
194
|
+
expect(tokens).toContain('@keyframes atomix-bounce');
|
|
195
|
+
expect(tokens).toContain('@keyframes atomix-spin');
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('should generate utility classes', () => {
|
|
199
|
+
const tokens = generateMotionTokens();
|
|
200
|
+
|
|
201
|
+
expect(tokens).toContain('.atomix-animate-fade-in');
|
|
202
|
+
expect(tokens).toContain('.atomix-animate-slide-in-up');
|
|
203
|
+
expect(tokens).toContain('.atomix-animate-scale-in');
|
|
204
|
+
expect(tokens).toContain('.atomix-animate-spin');
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('should include reduced motion media query', () => {
|
|
208
|
+
const tokens = generateMotionTokens();
|
|
209
|
+
|
|
210
|
+
expect(tokens).toContain('@media (prefers-reduced-motion: reduce)');
|
|
211
|
+
expect(tokens).toContain('animation-duration: 0.01ms !important');
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('should generate transition presets', () => {
|
|
215
|
+
const tokens = generateMotionTokens();
|
|
216
|
+
|
|
217
|
+
expect(tokens).toContain('--atomix-transition-fast');
|
|
218
|
+
expect(tokens).toContain('--atomix-transition-base');
|
|
219
|
+
expect(tokens).toContain('--atomix-transition-colors');
|
|
220
|
+
expect(tokens).toContain('--atomix-transition-opacity');
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
describe('Component Animation Generation', () => {
|
|
225
|
+
it('should generate component-specific animation config', () => {
|
|
226
|
+
// This would be tested through generateComponentAnimation
|
|
227
|
+
// which is exported but we're testing the pattern here
|
|
228
|
+
expect(ANIMATION_PRESETS.fade).toBeDefined();
|
|
229
|
+
expect(ANIMATION_PRESETS.fade.duration).toBe('var(--atomix-duration-base)');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
describe('Integration Tests', () => {
|
|
235
|
+
it('should work together for premium components', () => {
|
|
236
|
+
// Verify both generators can be used together
|
|
237
|
+
const glassStyles = generateGlassStyles('PremiumCard', 'crystal');
|
|
238
|
+
const motionTokens = generateMotionTokens();
|
|
239
|
+
|
|
240
|
+
expect(glassStyles).toBeDefined();
|
|
241
|
+
expect(motionTokens).toBeDefined();
|
|
242
|
+
|
|
243
|
+
// Both should include accessibility features
|
|
244
|
+
expect(glassStyles).toContain('prefers-reduced');
|
|
245
|
+
expect(motionTokens).toContain('prefers-reduced-motion');
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it('should provide consistent design tokens', () => {
|
|
249
|
+
const glassConfig = GLASS_PRESETS.default;
|
|
250
|
+
const fadeAnimation = ANIMATION_PRESETS.fade;
|
|
251
|
+
|
|
252
|
+
// Both should use CSS custom properties for theming
|
|
253
|
+
expect(fadeAnimation.duration).toContain('var(--');
|
|
254
|
+
expect(fadeAnimation.easing).toContain('var(--');
|
|
255
|
+
});
|
|
256
|
+
});
|