@shohojdhara/atomix 0.3.14 → 0.3.15

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 (173) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build-tools/EXAMPLES.md +372 -0
  3. package/build-tools/README.md +242 -0
  4. package/build-tools/__tests__/error-handler.test.js +230 -0
  5. package/build-tools/__tests__/index.test.js +141 -0
  6. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  7. package/build-tools/__tests__/utils.test.js +161 -0
  8. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  9. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  10. package/build-tools/error-handler.js +308 -0
  11. package/build-tools/index.d.ts +43 -0
  12. package/build-tools/index.js +88 -0
  13. package/build-tools/package.json +67 -0
  14. package/build-tools/rollup-plugin.js +236 -0
  15. package/build-tools/types.d.ts +163 -0
  16. package/build-tools/utils.js +203 -0
  17. package/build-tools/vite-plugin.js +161 -0
  18. package/build-tools/webpack-loader.js +123 -0
  19. package/dist/atomix.css +203 -90
  20. package/dist/atomix.css.map +1 -1
  21. package/dist/atomix.min.css +3 -3
  22. package/dist/atomix.min.css.map +1 -1
  23. package/dist/build-tools/EXAMPLES.md +372 -0
  24. package/dist/build-tools/README.md +242 -0
  25. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  26. package/dist/build-tools/__tests__/index.test.js +141 -0
  27. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  28. package/dist/build-tools/__tests__/utils.test.js +161 -0
  29. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  30. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  31. package/dist/build-tools/error-handler.js +308 -0
  32. package/dist/build-tools/index.d.ts +43 -0
  33. package/dist/build-tools/index.js +88 -0
  34. package/dist/build-tools/package.json +67 -0
  35. package/dist/build-tools/rollup-plugin.js +236 -0
  36. package/dist/build-tools/types.d.ts +163 -0
  37. package/dist/build-tools/utils.js +203 -0
  38. package/dist/build-tools/vite-plugin.js +161 -0
  39. package/dist/build-tools/webpack-loader.js +123 -0
  40. package/dist/charts.d.ts +1 -1
  41. package/dist/charts.js +86 -57
  42. package/dist/charts.js.map +1 -1
  43. package/dist/core.d.ts +1 -1
  44. package/dist/core.js +136 -112
  45. package/dist/core.js.map +1 -1
  46. package/dist/forms.d.ts +2 -5
  47. package/dist/forms.js +140 -128
  48. package/dist/forms.js.map +1 -1
  49. package/dist/heavy.d.ts +1 -1
  50. package/dist/heavy.js +136 -112
  51. package/dist/heavy.js.map +1 -1
  52. package/dist/index.d.ts +9 -61
  53. package/dist/index.esm.js +237 -286
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/index.js +250 -299
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.min.js +1 -1
  58. package/dist/index.min.js.map +1 -1
  59. package/package.json +23 -8
  60. package/scripts/atomix-cli.js +170 -73
  61. package/scripts/cli/__tests__/README.md +81 -0
  62. package/scripts/cli/__tests__/basic.test.js +115 -0
  63. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  64. package/scripts/cli/__tests__/integration.test.js +327 -0
  65. package/scripts/cli/__tests__/test-setup.js +133 -0
  66. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  67. package/scripts/cli/__tests__/utils.test.js +161 -0
  68. package/scripts/cli/component-generator.js +253 -299
  69. package/scripts/cli/dependency-checker.js +355 -0
  70. package/scripts/cli/interactive-init.js +46 -5
  71. package/scripts/cli/template-manager.js +0 -2
  72. package/scripts/cli/templates/common-templates.js +636 -0
  73. package/scripts/cli/templates/composable-templates.js +148 -126
  74. package/scripts/cli/templates/index.js +23 -16
  75. package/scripts/cli/templates/project-templates.js +151 -23
  76. package/scripts/cli/templates/react-templates.js +280 -210
  77. package/scripts/cli/templates/scss-templates.js +90 -91
  78. package/scripts/cli/templates/testing-templates.js +206 -27
  79. package/scripts/cli/templates/testing-utils.js +278 -0
  80. package/scripts/cli/templates/types-templates.js +70 -56
  81. package/scripts/cli/theme-bridge.js +8 -2
  82. package/scripts/cli/token-manager.js +318 -206
  83. package/scripts/cli/utils.js +0 -1
  84. package/src/components/Accordion/Accordion.stories.tsx +369 -870
  85. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  86. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  87. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  88. package/src/components/AtomixGlass/glass-utils.ts +2 -2
  89. package/src/components/AtomixGlass/shader-utils.ts +5 -0
  90. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  91. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
  92. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  93. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  94. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  95. package/src/components/AtomixGlass/stories/Playground.stories.tsx +50 -35
  96. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +1 -1
  97. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  98. package/src/components/Avatar/Avatar.stories.tsx +213 -1
  99. package/src/components/Badge/Badge.stories.tsx +121 -362
  100. package/src/components/Block/Block.stories.tsx +21 -12
  101. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +141 -23
  102. package/src/components/Button/Button.stories.tsx +463 -1126
  103. package/src/components/Button/Button.test.tsx +107 -0
  104. package/src/components/Button/Button.tsx +46 -50
  105. package/src/components/Button/ButtonGroup.stories.tsx +373 -217
  106. package/src/components/Callout/Callout.stories.tsx +289 -634
  107. package/src/components/Card/Card.stories.tsx +248 -68
  108. package/src/components/Chart/Chart.stories.tsx +150 -8
  109. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +151 -69
  110. package/src/components/Countdown/Countdown.stories.tsx +115 -8
  111. package/src/components/DataTable/DataTable.stories.tsx +346 -146
  112. package/src/components/DatePicker/DatePicker.stories.tsx +325 -1066
  113. package/src/components/Dropdown/Dropdown.stories.tsx +153 -33
  114. package/src/components/EdgePanel/EdgePanel.stories.tsx +230 -21
  115. package/src/components/Footer/Footer.stories.tsx +392 -328
  116. package/src/components/Form/Checkbox.stories.tsx +140 -6
  117. package/src/components/Form/Checkbox.test.tsx +63 -0
  118. package/src/components/Form/Checkbox.tsx +87 -51
  119. package/src/components/Form/Form.stories.tsx +119 -20
  120. package/src/components/Form/FormGroup.stories.tsx +127 -4
  121. package/src/components/Form/Radio.stories.tsx +140 -5
  122. package/src/components/Form/Select.stories.tsx +140 -8
  123. package/src/components/Form/Textarea.stories.tsx +149 -6
  124. package/src/components/Hero/Hero.stories.tsx +333 -32
  125. package/src/components/List/List.stories.tsx +141 -3
  126. package/src/components/Modal/Modal.stories.tsx +181 -42
  127. package/src/components/Popover/Popover.stories.tsx +448 -98
  128. package/src/components/Progress/Progress.stories.tsx +167 -5
  129. package/src/components/River/River.stories.tsx +1 -1
  130. package/src/components/SectionIntro/SectionIntro.stories.tsx +240 -48
  131. package/src/components/Spinner/Spinner.stories.tsx +102 -8
  132. package/src/components/Steps/Steps.stories.tsx +172 -43
  133. package/src/components/Tabs/Tabs.stories.tsx +136 -10
  134. package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
  135. package/src/components/Todo/Todo.stories.tsx +198 -9
  136. package/src/components/Toggle/Toggle.stories.tsx +126 -39
  137. package/src/components/Tooltip/Tooltip.stories.tsx +194 -104
  138. package/src/components/Upload/Upload.stories.tsx +113 -24
  139. package/src/lib/README.md +2 -2
  140. package/src/lib/__tests__/theme-tools.test.ts +193 -0
  141. package/src/lib/composables/index.ts +2 -2
  142. package/src/lib/composables/useAtomixGlass.ts +28 -56
  143. package/src/lib/composables/useChartExport.ts +2 -7
  144. package/src/lib/composables/useDataTable.ts +46 -29
  145. package/src/lib/constants/components.ts +9 -32
  146. package/src/lib/theme/devtools/CLI.ts +1 -1
  147. package/src/lib/types/components.ts +1 -1
  148. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  149. package/src/lib/utils/csv.ts +17 -0
  150. package/src/lib/utils/dataTableExport.ts +1 -10
  151. package/src/styles/01-settings/_index.scss +2 -1
  152. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  153. package/src/styles/01-settings/_settings.colors.scss +11 -11
  154. package/src/styles/01-settings/_settings.typography.scss +5 -5
  155. package/src/styles/02-tools/_tools.utility-api.scss +14 -0
  156. package/src/styles/06-components/_components.accordion.scss +56 -14
  157. package/src/styles/06-components/_components.checkbox.scss +23 -17
  158. package/src/styles/99-utilities/_index.scss +2 -0
  159. package/src/styles/99-utilities/_utilities.scss +3 -1
  160. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  161. package/themes/dark-complementary/README.md +98 -0
  162. package/themes/dark-complementary/index.scss +158 -0
  163. package/themes/default-light/README.md +81 -0
  164. package/themes/default-light/index.scss +154 -0
  165. package/themes/high-contrast/README.md +105 -0
  166. package/themes/high-contrast/index.scss +172 -0
  167. package/themes/test-theme/README.md +38 -0
  168. package/themes/test-theme/index.scss +47 -0
  169. package/scripts/cli/templates-original-backup.js +0 -1655
  170. package/scripts/cli/templates_backup.js +0 -684
  171. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  172. package/src/lib/composables/useButton.ts +0 -93
  173. package/src/lib/composables/useCheckbox.ts +0 -70
@@ -1,84 +1,81 @@
1
1
  /**
2
- * SCSS Templates
3
- * Templates for styling components with SCSS
2
+ * SCSS Component and Settings Templates
3
+ * Templates for SCSS files generation following ITCSS methodology
4
4
  */
5
5
 
6
6
  /**
7
- * Main SCSS component template
7
+ * SCSS component template
8
8
  */
9
- export const scssTemplate = (name) => `// =============================================================================
10
- // ${name.toUpperCase()}
11
- // =============================================================================
9
+ export const scssComponentTemplate = (name) => `// ${name} Component Styles
10
+ // Generated by Atomix CLI
11
+ // Located in src/styles/06-components/_components.${name.toLowerCase()}.scss
12
12
 
13
- @use '../01-settings/settings.${name.toLowerCase()}' as ${name.toLowerCase()};
13
+ @use '../01-settings/settings.config' as config;
14
14
 
15
15
  .c-${name.toLowerCase()} {
16
- // CSS Custom Properties (from settings)
17
- --#{config.$prefix}${name.toLowerCase()}-width: #{${name.toLowerCase()}.$${name.toLowerCase()}-width};
18
- --#{config.$prefix}${name.toLowerCase()}-padding-x: #{${name.toLowerCase()}.$${name.toLowerCase()}-padding-x};
19
- --#{config.$prefix}${name.toLowerCase()}-padding-y: #{${name.toLowerCase()}.$${name.toLowerCase()}-padding-y};
20
- --#{config.$prefix}${name.toLowerCase()}-bg: #{${name.toLowerCase()}.$${name.toLowerCase()}-bg};
21
- --#{config.$prefix}${name.toLowerCase()}-color: #{${name.toLowerCase()}.$${name.toLowerCase()}-color};
22
- --#{config.$prefix}${name.toLowerCase()}-border: #{${name.toLowerCase()}.$${name.toLowerCase()}-border};
23
- --#{config.$prefix}${name.toLowerCase()}-border-radius: #{${name.toLowerCase()}.$${name.toLowerCase()}-border-radius};
24
- --#{config.$prefix}${name.toLowerCase()}-transition: #{${name.toLowerCase()}.$${name.toLowerCase()}-transition};
25
-
26
- // Base styles
27
- width: var(#{config.$prefix}${name.toLowerCase()}-width);
28
- padding: var(#{config.$prefix}${name.toLowerCase()}-padding-y) var(#{config.$prefix}${name.toLowerCase()}-padding-x);
29
- background-color: var(#{config.$prefix}${name.toLowerCase()}-bg);
30
- color: var(#{config.$prefix}${name.toLowerCase()}-color);
31
- border: var(#{config.$prefix}${name.toLowerCase()}-border);
32
- border-radius: var(#{config.$prefix}${name.toLowerCase()}-border-radius);
33
- transition: var(#{config.$prefix}${name.toLowerCase()}-transition);
16
+ // Using CSS custom properties defined in settings
17
+ --#{config.$prefix}${name.toLowerCase()}-padding: var(--atomix-spacing-4);
18
+ --#{config.$prefix}${name.toLowerCase()}-margin: var(--atomix-spacing-2);
19
+ --#{config.$prefix}${name.toLowerCase()}-border: var(--atomix-border-default);
20
+ --#{config.$prefix}${name.toLowerCase()}-border-radius: var(--atomix-border-radius-md);
21
+ --#{config.$prefix}${name.toLowerCase()}-bg: var(--atomix-bg-surface);
22
+ --#{config.$prefix}${name.toLowerCase()}-color: var(--atomix-text-primary);
23
+ --#{config.$prefix}${name.toLowerCase()}-font-size: var(--atomix-font-size-base);
24
+ --#{config.$prefix}${name.toLowerCase()}-transition: var(--atomix-transition-all);
34
25
 
35
- // Reset and base
36
- box-sizing: border-box;
37
- margin: 0;
38
- font-family: inherit;
39
- font-size: var(#{config.$prefix}${name.toLowerCase()}-font-size);
40
- line-height: var(#{config.$prefix}${name.toLowerCase()}-line-height);
41
- font-weight: var(#{config.$prefix}${name.toLowerCase()}-font-weight);
26
+ // State-specific properties
27
+ --#{config.$prefix}${name.toLowerCase()}-hover-bg: var(--atomix-bg-surface-hover);
28
+ --#{config.$prefix}${name.toLowerCase()}-focus-bg: var(--atomix-bg-surface-focus);
29
+ --#{config.$prefix}${name.toLowerCase()}-disabled-bg: var(--atomix-bg-surface-disabled);
30
+ --#{config.$prefix}${name.toLowerCase()}-disabled-color: var(--atomix-text-disabled);
31
+ --#{config.$prefix}${name.toLowerCase()}-disabled-opacity: var(--atomix-opacity-disabled);
32
+
33
+ padding: var(--#{config.$prefix}${name.toLowerCase()}-padding);
34
+ margin: var(--#{config.$prefix}${name.toLowerCase()}-margin);
35
+ border: var(--#{config.$prefix}${name.toLowerCase()}-border);
36
+ border-radius: var(--#{config.$prefix}${name.toLowerCase()}-border-radius);
37
+ background: var(--#{config.$prefix}${name.toLowerCase()}-bg);
38
+ color: var(--#{config.$prefix}${name.toLowerCase()}-color);
39
+ font-size: var(--#{config.$prefix}${name.toLowerCase()}-font-size);
40
+ transition: var(--#{config.$prefix}${name.toLowerCase()}-transition);
42
41
 
43
42
  // Size variants
44
43
  &--sm {
45
- --#{config.$prefix}${name.toLowerCase()}-padding-x: #{${name.toLowerCase()}.$${name.toLowerCase()}-sm-padding-x};
46
- --#{config.$prefix}${name.toLowerCase()}-padding-y: #{${name.toLowerCase()}.$${name.toLowerCase()}-sm-padding-y};
47
- --#{config.$prefix}${name.toLowerCase()}-font-size: #{${name.toLowerCase()}.$${name.toLowerCase()}-sm-font-size};
44
+ --#{config.$prefix}${name.toLowerCase()}-padding: var(--atomix-spacing-2);
45
+ --#{config.$prefix}${name.toLowerCase()}-font-size: var(--atomix-font-size-sm);
48
46
  }
49
47
 
50
48
  &--lg {
51
- --#{config.$prefix}${name.toLowerCase()}-padding-x: #{${name.toLowerCase()}.$${name.toLowerCase()}-lg-padding-x};
52
- --#{config.$prefix}${name.toLowerCase()}-padding-y: #{${name.toLowerCase()}.$${name.toLowerCase()}-lg-padding-y};
53
- --#{config.$prefix}${name.toLowerCase()}-font-size: #{${name.toLowerCase()}.$${name.toLowerCase()}-lg-font-size};
49
+ --#{config.$prefix}${name.toLowerCase()}-padding: var(--atomix-spacing-6);
50
+ --#{config.$prefix}${name.toLowerCase()}-font-size: var(--atomix-font-size-lg);
54
51
  }
55
52
 
56
53
  // Interactive states
57
54
  &:hover {
58
- --#{config.$prefix}${name.toLowerCase()}-bg: #{${name.toLowerCase()}.$${name.toLowerCase()}-hover-bg};
55
+ background: var(--#{config.$prefix}${name.toLowerCase()}-hover-bg);
59
56
  cursor: pointer;
60
57
  }
61
58
 
62
59
  &:focus {
63
- --#{config.$prefix}${name.toLowerCase()}-bg: #{${name.toLowerCase()}.$${name.toLowerCase()}-focus-bg};
60
+ background: var(--#{config.$prefix}${name.toLowerCase()}-focus-bg);
64
61
  outline: 2px solid var(--atomix-focus-color);
65
62
  outline-offset: 2px;
66
63
  }
67
64
 
68
65
  // Disabled state
69
66
  &.is-disabled {
70
- --#{config.$prefix}${name.toLowerCase()}-bg: #{${name.toLowerCase()}.$${name.toLowerCase()}-disabled-bg};
71
- --#{config.$prefix}${name.toLowerCase()}-color: #{${name.toLowerCase()}.$${name.toLowerCase()}-disabled-color};
72
- opacity: var(#{config.$prefix}${name.toLowerCase()}-disabled-opacity);
67
+ background: var(--#{config.$prefix}${name.toLowerCase()}-disabled-bg);
68
+ color: var(--#{config.$prefix}${name.toLowerCase()}-disabled-color);
69
+ opacity: var(--#{config.$prefix}${name.toLowerCase()}-disabled-opacity);
73
70
  cursor: not-allowed;
74
71
  pointer-events: none;
75
72
  }
76
73
 
77
74
  // Glass variant
78
75
  &--glass {
79
- background: #{${name.toLowerCase()}.$${name.toLowerCase()}-glass-bg};
80
- backdrop-filter: #{${name.toLowerCase()}.$${name.toLowerCase()}-glass-backdrop};
81
- border-color: #{${name.toLowerCase()}.$${name.toLowerCase()}-glass-border};
76
+ background: var(--#{config.$prefix}${name.toLowerCase()}-glass-bg, rgba(255, 255, 255, 0.1));
77
+ backdrop-filter: var(--#{config.$prefix}${name.toLowerCase()}-glass-backdrop, blur(10px));
78
+ border-color: var(--#{config.$prefix}${name.toLowerCase()}-glass-border, rgba(255, 255, 255, 0.2));
82
79
  }
83
80
 
84
81
  // Data states for JavaScript interaction
@@ -97,60 +94,62 @@ export const scssTemplate = (name) => `// ======================================
97
94
  */
98
95
  export const scssSettingsTemplate = (name) => `// ${name} Component Settings
99
96
  // Generated by Atomix CLI
100
-
101
- // Core component dimensions
102
- $${name.toLowerCase()}-width: 100% !default;
103
- $${name.toLowerCase()}-padding-x: map.get($spacing-sizes, 5) !default;
104
- $${name.toLowerCase()}-padding-y: map.get($spacing-sizes, 3) !default;
105
- $${name.toLowerCase()}-margin-bottom: map.get($spacing-sizes, 2) !default;
106
-
107
- // Typography settings
108
- $${name.toLowerCase()}-font-size: map.get($font-sizes, base) !default;
109
- $${name.toLowerCase()}-font-weight: map.get($font-weights, normal) !default;
110
- $${name.toLowerCase()}-line-height: map.get($line-heights, base) !default;
111
-
112
- // Border and radius
113
- $${name.toLowerCase()}-border: 1px solid var(--atomix-border-default) !default;
114
- $${name.toLowerCase()}-border-radius: var(--atomix-border-radius-md) !default;
115
- $${name.toLowerCase()}-border-style: solid !default;
116
-
117
- // Colors (using CSS custom properties)
118
- $${name.toLowerCase()}-bg: var(--atomix-bg-surface) !default;
119
- $${name.toLowerCase()}-color: var(--atomix-text-primary) !default;
120
- $${name.toLowerCase()}-border-color: var(--atomix-border-default) !default;
121
-
122
- // Transitions
123
- $${name.toLowerCase()}-transition: var(--atomix-transition-all) !default;
124
- $${name.toLowerCase()}-transition-duration: var(--atomix-duration-base) !default;
125
- $${name.toLowerCase()}-transition-timing: var(--atomix-easing-smooth) !default;
126
-
127
- // State-specific settings
128
- $${name.toLowerCase()}-hover-bg: var(--atomix-bg-surface-hover) !default;
129
- $${name.toLowerCase()}-focus-bg: var(--atomix-bg-surface-focus) !default;
130
- $${name.toLowerCase()}-disabled-bg: var(--atomix-bg-surface-disabled) !default;
131
- $${name.toLowerCase()}-disabled-color: var(--atomix-text-disabled) !default;
132
- $${name.toLowerCase()}-disabled-opacity: var(--atomix-opacity-disabled) !default;
97
+ // Located in src/styles/01-settings/_settings.${name.toLowerCase()}.scss
98
+
99
+ @use 'sass:map';
100
+ @use 'settings.colors' as *;
101
+ @use 'settings.spacing' as spacing;
102
+ @use 'settings.border-radius' as *;
103
+ @use 'settings.typography' as *;
104
+ @use '../02-tools/tools.color-functions' as *;
105
+
106
+ // Component-specific variables
107
+ $${name.toLowerCase()}-padding-x: map.get(spacing.$spacing-sizes, 3) !default;
108
+ $${name.toLowerCase()}-padding-y: map.get(spacing.$spacing-sizes, 2) !default;
109
+ $${name.toLowerCase()}-gap: map.get(spacing.$spacing-sizes, 2) !default;
110
+ $${name.toLowerCase()}-border-radius: $border-radius-md !default;
111
+ $${name.toLowerCase()}-transition: all 0.2s ease !default;
133
112
 
134
113
  // Size variants
135
- $${name.toLowerCase()}-sm-padding-x: map.get($spacing-sizes, 3) !default;
136
- $${name.toLowerCase()}-sm-padding-y: map.get($spacing-sizes, 2) !default;
137
- $${name.toLowerCase()}-sm-font-size: map.get($font-sizes, sm) !default;
114
+ $${name.toLowerCase()}-sm-padding-x: map.get(spacing.$spacing-sizes, 2) !default;
115
+ $${name.toLowerCase()}-sm-padding-y: map.get(spacing.$spacing-sizes, 1) !default;
116
+ $${name.toLowerCase()}-sm-font-size: $font-size-sm !default;
117
+
118
+ $${name.toLowerCase()}-lg-padding-x: map.get(spacing.$spacing-sizes, 4) !default;
119
+ $${name.toLowerCase()}-lg-padding-y: map.get(spacing.$spacing-sizes, 3) !default;
120
+ $${name.toLowerCase()}-lg-font-size: $font-size-lg !default;
121
+
122
+ // Color variants
123
+ $${name.toLowerCase()}-primary-bg: $primary !default;
124
+ $${name.toLowerCase()}-primary-color: color-contrast($primary) !default;
125
+ $${name.toLowerCase()}-primary-border: shade($primary, 10%) !default;
138
126
 
139
- $${name.toLowerCase()}-lg-padding-x: map.get($spacing-sizes, 7) !default;
140
- $${name.toLowerCase()}-lg-padding-y: map.get($spacing-sizes, 4) !default;
141
- $${name.toLowerCase()}-lg-font-size: map.get($font-sizes, lg) !default;
127
+ $${name.toLowerCase()}-secondary-bg: $secondary !default;
128
+ $${name.toLowerCase()}-secondary-color: color-contrast($secondary) !default;
129
+ $${name.toLowerCase()}-secondary-border: shade($secondary, 10%) !default;
142
130
 
143
- // Glass variant settings
131
+ // State variables
132
+ $${name.toLowerCase()}-disabled-opacity: 0.6 !default;
133
+ $${name.toLowerCase()}-disabled-cursor: not-allowed !default;
134
+
135
+ // Glass variant
144
136
  $${name.toLowerCase()}-glass-bg: rgba(255, 255, 255, 0.1) !default;
145
- $${name.toLowerCase()}-glass-backdrop: blur(10px) !default;
146
137
  $${name.toLowerCase()}-glass-border: rgba(255, 255, 255, 0.2) !default;
138
+ $${name.toLowerCase()}-glass-backdrop: blur(10px) !default;
147
139
  `;
148
140
 
149
141
  /**
150
- * SCSS templates object
142
+ * SCSS template combining both
151
143
  */
144
+ export const scssTemplate = (name) => {
145
+ return {
146
+ component: scssComponentTemplate(name),
147
+ settings: scssSettingsTemplate(name)
148
+ };
149
+ };
150
+
152
151
  export const scssTemplates = {
153
- scss: scssTemplate,
154
- scssModule: () => '', // Disabled/Empty as we prefer global SCSS
155
- scssSettings: scssSettingsTemplate,
152
+ component: scssComponentTemplate,
153
+ settings: scssSettingsTemplate,
154
+ full: scssTemplate
156
155
  };
@@ -1,38 +1,217 @@
1
1
  /**
2
- * Testing Templates
3
- * Templates for component testing
2
+ * Enhanced Testing Templates
3
+ * Comprehensive test templates with accessibility and advanced patterns
4
4
  */
5
5
 
6
6
  /**
7
- * Vitest test template for React components
7
+ * Enhanced Vitest test template for React components
8
8
  */
9
- export const testTemplate = (name) => `import { describe, it, expect } from 'vitest';
10
- import { render, screen } from '@testing-library/react';
9
+ export const testTemplate = (name) => `import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
10
+ import { render, screen, fireEvent, act } from '@testing-library/react';
11
+ import { axe, toHaveNoViolations } from 'jest-axe';
11
12
  import { ${name} } from './${name}';
12
13
 
14
+ // Extend Vitest matchers
15
+ expect.extend(toHaveNoViolations);
16
+
17
+ // Mock IntersectionObserver
18
+ global.IntersectionObserver = vi.fn(() => ({
19
+ observe: vi.fn(),
20
+ unobserve: vi.fn(),
21
+ disconnect: vi.fn()
22
+ }));
23
+
24
+ // Mock ResizeObserver
25
+ global.ResizeObserver = vi.fn().mockImplementation(() => ({
26
+ observe: vi.fn(),
27
+ unobserve: vi.fn(),
28
+ disconnect: vi.fn()
29
+ }));
30
+
13
31
  describe('${name}', () => {
14
- it('renders children correctly', () => {
15
- render(<${name}>Test Content</${name}>);
16
- expect(screen.getByText('Test Content')).toBeInTheDocument();
17
- });
18
-
19
- it('applies size variant classes', () => {
20
- const { container } = render(<${name} size="lg">Content</${name}>);
21
- const element = container.firstChild;
22
- expect(element).toHaveClass('c-${name.toLowerCase()}--lg');
23
- });
24
-
25
- it('handles disabled state', () => {
26
- const { container } = render(<${name} disabled>Content</${name}>);
27
- const element = container.firstChild;
28
- expect(element).toHaveAttribute('aria-disabled', 'true');
29
- expect(element).toHaveClass('is-disabled');
30
- });
31
-
32
- it('forwards ref correctly', () => {
33
- const ref = React.createRef<HTMLDivElement>();
34
- render(<${name} ref={ref}>Content</${name}>);
35
- expect(ref.current).toBeInstanceOf(HTMLDivElement);
32
+ // Accessibility Tests
33
+ describe('Accessibility', () => {
34
+ it('should have no accessibility violations', async () => {
35
+ const { container } = render(<${name}>Accessible Content</${name}>);
36
+ const results = await axe(container);
37
+ expect(results).toHaveNoViolations();
38
+ });
39
+
40
+ it('should have proper aria attributes', () => {
41
+ render(<${name} aria-label="Test component">Content</${name}>);
42
+ const element = screen.getByLabelText('Test component');
43
+ expect(element).toBeInTheDocument();
44
+ });
45
+
46
+ it('should support keyboard navigation', () => {
47
+ render(<${name}>Focusable Content</${name}>);
48
+ const element = screen.getByText('Focusable Content');
49
+ element.focus();
50
+ expect(element).toHaveFocus();
51
+ });
52
+ });
53
+
54
+ // Rendering Tests
55
+ describe('Rendering', () => {
56
+ it('renders children correctly', () => {
57
+ render(<${name}>Test Content</${name}>);
58
+ expect(screen.getByText('Test Content')).toBeInTheDocument();
59
+ });
60
+
61
+ it('applies className prop', () => {
62
+ const { container } = render(<${name} className="custom-class">Content</${name}>);
63
+ const element = container.firstChild;
64
+ expect(element).toHaveClass('custom-class');
65
+ });
66
+
67
+ it('renders with custom attributes', () => {
68
+ render(<${name} data-testid="test-${name.toLowerCase()}">Content</${name}>);
69
+ expect(screen.getByTestId('test-${name.toLowerCase()}')).toBeInTheDocument();
70
+ });
71
+ });
72
+
73
+ // Props Tests
74
+ describe('Props', () => {
75
+ it('applies size variant classes', () => {
76
+ const { container } = render(<${name} size="lg">Content</${name}>);
77
+ const element = container.firstChild;
78
+ expect(element).toHaveClass('c-${name.toLowerCase()}--lg');
79
+ });
80
+
81
+ it('handles disabled state', () => {
82
+ const { container } = render(<${name} disabled>Content</${name}>);
83
+ const element = container.firstChild;
84
+ expect(element).toHaveAttribute('aria-disabled', 'true');
85
+ expect(element).toHaveClass('is-disabled');
86
+ });
87
+
88
+ it('passes through data attributes', () => {
89
+ const { container } = render(<${name} data-custom="value">Content</${name}>);
90
+ const element = container.firstChild;
91
+ expect(element).toHaveAttribute('data-custom', 'value');
92
+ });
93
+ });
94
+
95
+ // Event Handling Tests
96
+ describe('Event Handling', () => {
97
+ it('calls onClick handler when clicked', () => {
98
+ const handleClick = vi.fn();
99
+ render(<${name} onClick={handleClick}>Clickable</${name}>);
100
+
101
+ fireEvent.click(screen.getByText('Clickable'));
102
+ expect(handleClick).toHaveBeenCalledTimes(1);
103
+ });
104
+
105
+ it('does not call onClick when disabled', () => {
106
+ const handleClick = vi.fn();
107
+ render(<${name} onClick={handleClick} disabled>Disabled</${name}>);
108
+
109
+ fireEvent.click(screen.getByText('Disabled'));
110
+ expect(handleClick).not.toHaveBeenCalled();
111
+ });
112
+
113
+ it('handles mouse events', () => {
114
+ const handleMouseEnter = vi.fn();
115
+ const handleMouseLeave = vi.fn();
116
+
117
+ render(
118
+ <${name}
119
+ onMouseEnter={handleMouseEnter}
120
+ onMouseLeave={handleMouseLeave}
121
+ >
122
+ Hoverable
123
+ </${name}>
124
+ );
125
+
126
+ const element = screen.getByText('Hoverable');
127
+ fireEvent.mouseEnter(element);
128
+ fireEvent.mouseLeave(element);
129
+
130
+ expect(handleMouseEnter).toHaveBeenCalledTimes(1);
131
+ expect(handleMouseLeave).toHaveBeenCalledTimes(1);
132
+ });
133
+ });
134
+
135
+ // Ref Forwarding Tests
136
+ describe('Ref Forwarding', () => {
137
+ it('forwards ref correctly', () => {
138
+ const ref = React.createRef<HTMLDivElement>();
139
+ render(<${name} ref={ref}>Content</${name}>);
140
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
141
+ });
142
+
143
+ it('allows imperative methods access', () => {
144
+ const ref = React.createRef<{ focus: () => void }>();
145
+ render(<${name} ref={ref}>Focusable</${name}>);
146
+
147
+ // Assuming component exposes focus method
148
+ if (ref.current && ref.current.focus) {
149
+ const spy = vi.spyOn(ref.current, 'focus');
150
+ ref.current.focus();
151
+ expect(spy).toHaveBeenCalled();
152
+ }
153
+ });
154
+ });
155
+
156
+ // Performance Tests
157
+ describe('Performance', () => {
158
+ it('renders efficiently without unnecessary re-renders', () => {
159
+ const renderSpy = vi.fn();
160
+ const TestWrapper = () => {
161
+ renderSpy();
162
+ return <${name}>Performance Test</${name}>;
163
+ };
164
+
165
+ render(<TestWrapper />);
166
+ expect(renderSpy).toHaveBeenCalledTimes(1);
167
+ });
168
+ });
169
+
170
+ // Edge Cases
171
+ describe('Edge Cases', () => {
172
+ it('handles empty children gracefully', () => {
173
+ const { container } = render(<${name}></${name}>);
174
+ expect(container.firstChild).toBeInTheDocument();
175
+ });
176
+
177
+ it('handles null children', () => {
178
+ const { container } = render(<${name}>{null}</${name}>);
179
+ expect(container.firstChild).toBeInTheDocument();
180
+ });
181
+
182
+ it('handles undefined props', () => {
183
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
184
+
185
+ expect(() => {
186
+ render(<${name} size={undefined}>Content</${name}>);
187
+ }).not.toThrow();
188
+
189
+ consoleSpy.mockRestore();
190
+ });
191
+ });
192
+
193
+ // Async Behavior Tests
194
+ describe('Async Behavior', () => {
195
+ it('handles async state changes', async () => {
196
+ const AsyncComponent = () => {
197
+ const [loaded, setLoaded] = React.useState(false);
198
+
199
+ React.useEffect(() => {
200
+ setTimeout(() => setLoaded(true), 100);
201
+ }, []);
202
+
203
+ return <${name}>{loaded ? 'Loaded' : 'Loading...'}</${name}>;
204
+ };
205
+
206
+ render(<AsyncComponent />);
207
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
208
+
209
+ await act(async () => {
210
+ await new Promise(resolve => setTimeout(resolve, 150));
211
+ });
212
+
213
+ expect(screen.getByText('Loaded')).toBeInTheDocument();
214
+ });
36
215
  });
37
216
  });
38
217
  `;