@shohojdhara/atomix 0.3.4 → 0.3.6

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 (237) hide show
  1. package/README.md +101 -199
  2. package/atomix.config.ts +241 -0
  3. package/dist/atomix.css +269 -189
  4. package/dist/atomix.css.map +1 -0
  5. package/dist/atomix.min.css +15179 -11
  6. package/dist/atomix.min.css.map +1 -0
  7. package/dist/charts.d.ts +1929 -0
  8. package/dist/charts.js +6477 -0
  9. package/dist/charts.js.map +1 -0
  10. package/dist/core.d.ts +1289 -0
  11. package/dist/core.js +3373 -0
  12. package/dist/core.js.map +1 -0
  13. package/dist/forms.d.ts +1085 -0
  14. package/dist/forms.js +2466 -0
  15. package/dist/forms.js.map +1 -0
  16. package/dist/heavy.d.ts +636 -0
  17. package/dist/heavy.js +4566 -0
  18. package/dist/heavy.js.map +1 -0
  19. package/dist/index.d.ts +5171 -4792
  20. package/dist/index.esm.js +6098 -4563
  21. package/dist/index.esm.js.map +1 -1
  22. package/dist/index.js +6291 -4747
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.min.js +1 -1
  25. package/dist/index.min.js.map +1 -1
  26. package/dist/layout.d.ts +300 -0
  27. package/dist/layout.js +336 -0
  28. package/dist/layout.js.map +1 -0
  29. package/dist/theme.d.ts +2122 -0
  30. package/dist/theme.js +6084 -0
  31. package/dist/theme.js.map +1 -0
  32. package/package.json +59 -27
  33. package/scripts/atomix-cli.js +544 -16
  34. package/scripts/cli/__tests__/cli-commands.test.js +204 -0
  35. package/scripts/cli/__tests__/utils.test.js +201 -0
  36. package/scripts/cli/__tests__/vitest.config.js +26 -0
  37. package/scripts/cli/interactive-init.js +1 -1
  38. package/scripts/cli/token-manager.js +32 -7
  39. package/scripts/cli/utils.js +347 -0
  40. package/src/components/Accordion/Accordion.stories.tsx +50 -17
  41. package/src/components/Accordion/Accordion.tsx +5 -54
  42. package/src/components/Accordion/index.ts +1 -1
  43. package/src/components/AtomixGlass/AtomixGlass.tsx +65 -31
  44. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +11 -4
  45. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +1 -32
  46. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2 -2
  47. package/src/components/AtomixGlass/stories/shared-components.tsx +0 -31
  48. package/src/components/Avatar/Avatar.stories.tsx +7 -0
  49. package/src/components/Avatar/Avatar.tsx +3 -3
  50. package/src/components/Badge/Badge.stories.tsx +91 -13
  51. package/src/components/Badge/Badge.tsx +3 -3
  52. package/src/components/Block/Block.stories.tsx +7 -23
  53. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +7 -0
  54. package/src/components/Breadcrumb/Breadcrumb.tsx +3 -3
  55. package/src/components/Button/Button.stories.tsx +141 -22
  56. package/src/components/Button/ButtonGroup.stories.tsx +315 -0
  57. package/src/components/Button/ButtonGroup.tsx +67 -0
  58. package/src/components/Button/index.ts +2 -0
  59. package/src/components/Callout/Callout.stories.tsx +8 -6
  60. package/src/components/Card/Card.stories.tsx +82 -28
  61. package/src/components/Card/ElevationCard.tsx +1 -1
  62. package/src/components/Chart/AnimatedChart.tsx +19 -18
  63. package/src/components/Chart/AreaChart.tsx +5 -2
  64. package/src/components/Chart/BarChart.tsx +1 -1
  65. package/src/components/Chart/BubbleChart.tsx +6 -6
  66. package/src/components/Chart/CandlestickChart.tsx +0 -1
  67. package/src/components/Chart/Chart.stories.tsx +5 -7
  68. package/src/components/Chart/Chart.tsx +0 -16
  69. package/src/components/Chart/ChartRenderer.tsx +1 -1
  70. package/src/components/Chart/ChartToolbar.tsx +1 -0
  71. package/src/components/Chart/DonutChart.tsx +0 -1
  72. package/src/components/Chart/FunnelChart.tsx +1 -2
  73. package/src/components/Chart/GaugeChart.tsx +0 -1
  74. package/src/components/Chart/HeatmapChart.tsx +0 -1
  75. package/src/components/Chart/LineChart.tsx +0 -1
  76. package/src/components/Chart/MultiAxisChart.tsx +0 -1
  77. package/src/components/Chart/PieChart.tsx +0 -1
  78. package/src/components/Chart/RadarChart.tsx +19 -13
  79. package/src/components/Chart/ScatterChart.tsx +3 -4
  80. package/src/components/Chart/TreemapChart.tsx +2 -1
  81. package/src/components/Chart/WaterfallChart.tsx +0 -2
  82. package/src/components/Chart/types.ts +12 -2
  83. package/src/components/Chart/utils.ts +4 -3
  84. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +7 -0
  85. package/src/components/DataTable/DataTable.stories.tsx +23 -16
  86. package/src/components/DataTable/DataTable.tsx +3 -3
  87. package/src/components/DatePicker/DatePicker.stories.tsx +27 -19
  88. package/src/components/Dropdown/Dropdown.stories.tsx +11 -19
  89. package/src/components/Dropdown/Dropdown.tsx +12 -9
  90. package/src/components/EdgePanel/EdgePanel.stories.tsx +1 -0
  91. package/src/components/Footer/Footer.stories.tsx +8 -6
  92. package/src/components/Footer/FooterLink.tsx +9 -2
  93. package/src/components/Footer/FooterSection.tsx +3 -3
  94. package/src/components/Form/Checkbox.stories.tsx +7 -0
  95. package/src/components/Form/Checkbox.tsx +3 -3
  96. package/src/components/Form/Form.stories.tsx +7 -0
  97. package/src/components/Form/FormGroup.stories.tsx +9 -1
  98. package/src/components/Form/Input.stories.tsx +69 -16
  99. package/src/components/Form/Input.tsx +4 -2
  100. package/src/components/Form/Radio.stories.tsx +9 -1
  101. package/src/components/Form/Radio.tsx +3 -3
  102. package/src/components/Form/Select.stories.tsx +9 -1
  103. package/src/components/Form/Select.tsx +3 -3
  104. package/src/components/Form/Textarea.stories.tsx +10 -2
  105. package/src/components/Form/Textarea.tsx +4 -2
  106. package/src/components/Hero/Hero.stories.tsx +7 -0
  107. package/src/components/List/List.stories.tsx +10 -3
  108. package/src/components/List/List.tsx +3 -3
  109. package/src/components/List/ListGroup.tsx +3 -1
  110. package/src/components/Messages/Messages.stories.tsx +8 -7
  111. package/src/components/Modal/Modal.stories.tsx +17 -6
  112. package/src/components/Modal/Modal.tsx +3 -3
  113. package/src/components/Navigation/Menu/MegaMenu.tsx +9 -3
  114. package/src/components/Navigation/Menu/Menu.stories.tsx +7 -0
  115. package/src/components/Navigation/Menu/Menu.tsx +9 -3
  116. package/src/components/Navigation/Nav/Nav.stories.tsx +7 -0
  117. package/src/components/Navigation/Navbar/Navbar.stories.tsx +1 -0
  118. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +1 -1
  119. package/src/components/Pagination/Pagination.stories.tsx +188 -111
  120. package/src/components/Pagination/Pagination.tsx +88 -7
  121. package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -5
  122. package/src/components/PhotoViewer/PhotoViewerImage.tsx +2 -2
  123. package/src/components/Popover/Popover.stories.tsx +191 -115
  124. package/src/components/Popover/Popover.tsx +4 -4
  125. package/src/components/ProductReview/ProductReview.stories.tsx +80 -58
  126. package/src/components/Progress/Progress.stories.tsx +79 -49
  127. package/src/components/Progress/Progress.tsx +6 -2
  128. package/src/components/Rating/Rating.stories.tsx +109 -84
  129. package/src/components/Rating/Rating.tsx +5 -2
  130. package/src/components/River/River.stories.tsx +194 -114
  131. package/src/components/SectionIntro/SectionIntro.stories.tsx +19 -9
  132. package/src/components/Slider/Slider.stories.tsx +7 -0
  133. package/src/components/Slider/Slider.tsx +10 -9
  134. package/src/components/Spinner/Spinner.stories.tsx +15 -11
  135. package/src/components/Spinner/Spinner.tsx +3 -3
  136. package/src/components/Steps/Steps.stories.tsx +132 -98
  137. package/src/components/Tabs/Tabs.stories.tsx +163 -112
  138. package/src/components/Tabs/Tabs.tsx +3 -3
  139. package/src/components/Testimonial/Testimonial.stories.tsx +114 -68
  140. package/src/components/Todo/Todo.stories.tsx +38 -12
  141. package/src/components/Toggle/Toggle.stories.tsx +61 -28
  142. package/src/components/Tooltip/Tooltip.stories.tsx +318 -200
  143. package/src/components/Tooltip/Tooltip.tsx +3 -3
  144. package/src/components/Upload/Upload.stories.tsx +122 -84
  145. package/src/components/VideoPlayer/VideoPlayer.stories.tsx +7 -24
  146. package/src/components/index.ts +6 -2
  147. package/src/layouts/MasonryGrid/MasonryGrid.tsx +2 -2
  148. package/src/lib/composables/useAtomixGlass.ts +2 -3
  149. package/src/lib/composables/useChartPerformance.ts +102 -78
  150. package/src/lib/composables/useChartScale.ts +10 -0
  151. package/src/lib/composables/useHero.ts +9 -2
  152. package/src/lib/composables/useHeroBackgroundSlider.ts +5 -3
  153. package/src/lib/composables/useNavbar.ts +0 -10
  154. package/src/lib/composables/useSideMenu.ts +1 -0
  155. package/src/lib/composables/useVideoPlayer.ts +3 -2
  156. package/src/lib/config/loader.ts +57 -14
  157. package/src/lib/constants/components.ts +10 -0
  158. package/src/lib/hooks/index.ts +0 -1
  159. package/src/lib/hooks/useComponentCustomization.ts +11 -15
  160. package/src/lib/hooks/usePerformanceMonitor.ts +149 -0
  161. package/src/lib/patterns/index.ts +2 -2
  162. package/src/lib/patterns/slots.tsx +2 -2
  163. package/src/lib/theme/README.md +174 -0
  164. package/src/lib/theme/adapters/index.ts +31 -0
  165. package/src/lib/theme/adapters/themeAdapter.ts +287 -0
  166. package/src/lib/theme/config/__tests__/configLoader.test.ts +207 -0
  167. package/src/lib/theme/config/configLoader.ts +254 -0
  168. package/src/lib/theme/config/loader.ts +37 -48
  169. package/src/lib/theme/config/types.ts +2 -2
  170. package/src/lib/theme/config/validator.ts +15 -91
  171. package/src/lib/theme/{constants.ts → constants/constants.ts} +0 -18
  172. package/src/lib/theme/constants/index.ts +8 -0
  173. package/src/lib/theme/core/ThemeRegistry.ts +19 -6
  174. package/src/lib/theme/core/__tests__/createTheme.test.ts +132 -0
  175. package/src/lib/theme/core/composeTheme.ts +155 -0
  176. package/src/lib/theme/core/createTheme.ts +94 -0
  177. package/src/lib/theme/{createTheme.ts → core/createThemeObject.ts} +10 -6
  178. package/src/lib/theme/core/index.ts +5 -19
  179. package/src/lib/theme/devtools/Comparator.tsx +346 -22
  180. package/src/lib/theme/devtools/IMPROVEMENTS.md +139 -38
  181. package/src/lib/theme/devtools/Inspector.tsx +335 -51
  182. package/src/lib/theme/devtools/LiveEditor.tsx +489 -112
  183. package/src/lib/theme/devtools/Preview.tsx +471 -221
  184. package/src/lib/theme/{core → devtools}/ThemeValidator.ts +6 -3
  185. package/src/lib/theme/devtools/index.ts +14 -4
  186. package/src/lib/theme/devtools/useHistory.ts +130 -0
  187. package/src/lib/theme/errors/index.ts +12 -0
  188. package/src/lib/theme/generators/cssFile.ts +79 -0
  189. package/src/lib/theme/generators/generateCSS.ts +89 -0
  190. package/src/lib/theme/{generateCSSVariables.ts → generators/generateCSSVariables.ts} +4 -14
  191. package/src/lib/theme/generators/index.ts +19 -0
  192. package/src/lib/theme/i18n/rtl.ts +7 -7
  193. package/src/lib/theme/index.ts +120 -15
  194. package/src/lib/theme/runtime/ThemeApplicator.ts +53 -95
  195. package/src/lib/theme/{ThemeContext.tsx → runtime/ThemeContext.tsx} +1 -1
  196. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +4 -4
  197. package/src/lib/theme/runtime/ThemeProvider.tsx +456 -179
  198. package/src/lib/theme/runtime/index.ts +1 -2
  199. package/src/lib/theme/runtime/useTheme.ts +1 -2
  200. package/src/lib/theme/test/testTheme.ts +385 -0
  201. package/src/lib/theme/tokens/index.ts +12 -0
  202. package/src/lib/theme/tokens/tokens.ts +721 -0
  203. package/src/lib/theme/types.ts +6 -42
  204. package/src/lib/theme/{utils.ts → utils/domUtils.ts} +2 -2
  205. package/src/lib/theme/utils/index.ts +11 -0
  206. package/src/lib/theme/utils/injectCSS.ts +90 -0
  207. package/src/lib/theme/utils/themeHelpers.ts +78 -0
  208. package/src/lib/theme/{themeUtils.ts → utils/themeUtils.ts} +1 -1
  209. package/src/lib/theme-tools.ts +8 -9
  210. package/src/lib/types/components.ts +93 -34
  211. package/src/lib/types/partProps.ts +0 -16
  212. package/src/lib/utils/componentUtils.ts +1 -1
  213. package/src/lib/utils/fontPreloader.ts +148 -0
  214. package/src/lib/utils/index.ts +11 -0
  215. package/src/lib/utils/memoryMonitor.ts +189 -0
  216. package/src/styles/01-settings/_settings.design-tokens.scss +4 -1
  217. package/src/styles/01-settings/_settings.fonts.scss +2 -5
  218. package/src/styles/02-tools/_tools.button.scss +66 -79
  219. package/src/styles/06-components/_components.atomix-glass.scss +13 -3
  220. package/src/styles/06-components/_components.navbar.scss +0 -6
  221. package/src/styles/06-components/_components.pagination.scss +88 -0
  222. package/scripts/build-themes.js +0 -208
  223. package/scripts/sync-theme-config.js +0 -309
  224. package/src/components/AtomixGlass/atomixGLass.old.tsx +0 -1263
  225. package/src/lib/theme/composeTheme.ts +0 -370
  226. package/src/lib/theme/core/ThemeCache.ts +0 -283
  227. package/src/lib/theme/core/ThemeEngine.test.ts +0 -146
  228. package/src/lib/theme/core/ThemeEngine.ts +0 -657
  229. package/src/lib/theme/createThemeFromConfig.ts +0 -132
  230. package/src/lib/theme/devtools/CLI.ts +0 -364
  231. package/src/lib/theme/runtime/ThemeManager.test.ts +0 -192
  232. package/src/lib/theme/runtime/ThemeManager.ts +0 -442
  233. package/src/styles/03-generic/_generated-root.css +0 -5
  234. package/src/themes/README.md +0 -442
  235. package/src/themes/themes.config.js +0 -35
  236. /package/src/lib/theme/{cssVariableMapper.ts → adapters/cssVariableMapper.ts} +0 -0
  237. /package/src/lib/theme/{errors.ts → errors/errors.ts} +0 -0
@@ -19,3 +19,14 @@ export {
19
19
  export type {
20
20
  MergePropsOptions,
21
21
  } from './componentUtils';
22
+
23
+ export {
24
+ createFontPreloadLink,
25
+ preloadFonts,
26
+ generateFontPreloadTags,
27
+ DEFAULT_ATOMIX_FONTS,
28
+ } from './fontPreloader';
29
+
30
+ export type {
31
+ FontPreloadConfig,
32
+ } from './fontPreloader';
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Memory Monitoring Utilities
3
+ *
4
+ * Detects memory leaks and tracks component lifecycle memory usage
5
+ * Only available in development mode
6
+ */
7
+
8
+ /**
9
+ * Memory snapshot for comparison
10
+ */
11
+ export interface MemorySnapshot {
12
+ /**
13
+ * Used JavaScript heap size in bytes
14
+ */
15
+ usedJSHeapSize: number;
16
+ /**
17
+ * Total JavaScript heap size in bytes
18
+ */
19
+ totalJSHeapSize: number;
20
+ /**
21
+ * JavaScript heap size limit in bytes
22
+ */
23
+ jsHeapSizeLimit: number;
24
+ /**
25
+ * Timestamp of the snapshot
26
+ */
27
+ timestamp: number;
28
+ }
29
+
30
+ /**
31
+ * Check if memory monitoring is available
32
+ */
33
+ export function isMemoryMonitoringAvailable(): boolean {
34
+ return (
35
+ typeof performance !== 'undefined' &&
36
+ 'memory' in performance &&
37
+ process.env.NODE_ENV === 'development'
38
+ );
39
+ }
40
+
41
+ /**
42
+ * Get current memory usage snapshot
43
+ *
44
+ * @returns Memory snapshot or null if not available
45
+ */
46
+ export function getMemorySnapshot(): MemorySnapshot | null {
47
+ if (!isMemoryMonitoringAvailable()) {
48
+ return null;
49
+ }
50
+
51
+ const memory = (performance as any).memory;
52
+
53
+ return {
54
+ usedJSHeapSize: memory.usedJSHeapSize,
55
+ totalJSHeapSize: memory.totalJSHeapSize,
56
+ jsHeapSizeLimit: memory.jsHeapSizeLimit,
57
+ timestamp: performance.now(),
58
+ };
59
+ }
60
+
61
+ /**
62
+ * Format bytes to human-readable string
63
+ *
64
+ * @param bytes - Number of bytes
65
+ * @returns Formatted string (e.g., "1.5 MB")
66
+ */
67
+ export function formatBytes(bytes: number): string {
68
+ if (bytes === 0) return '0 Bytes';
69
+
70
+ const k = 1024;
71
+ const sizes = ['Bytes', 'KB', 'MB', 'GB'];
72
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
73
+
74
+ return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
75
+ }
76
+
77
+ /**
78
+ * Compare two memory snapshots and detect potential leaks
79
+ *
80
+ * @param before - Snapshot before operation
81
+ * @param after - Snapshot after operation
82
+ * @param threshold - Threshold in bytes to consider a leak (default: 5MB)
83
+ * @returns Object with leak detection results
84
+ */
85
+ export function detectMemoryLeak(
86
+ before: MemorySnapshot | null,
87
+ after: MemorySnapshot | null,
88
+ threshold: number = 5 * 1024 * 1024 // 5MB
89
+ ): {
90
+ hasLeak: boolean;
91
+ memoryIncrease: number;
92
+ formattedIncrease: string;
93
+ percentageIncrease: number;
94
+ } {
95
+ if (!before || !after) {
96
+ return {
97
+ hasLeak: false,
98
+ memoryIncrease: 0,
99
+ formattedIncrease: '0 Bytes',
100
+ percentageIncrease: 0,
101
+ };
102
+ }
103
+
104
+ const memoryIncrease = after.usedJSHeapSize - before.usedJSHeapSize;
105
+ const percentageIncrease = (memoryIncrease / before.usedJSHeapSize) * 100;
106
+
107
+ return {
108
+ hasLeak: memoryIncrease > threshold,
109
+ memoryIncrease,
110
+ formattedIncrease: formatBytes(memoryIncrease),
111
+ percentageIncrease,
112
+ };
113
+ }
114
+
115
+ /**
116
+ * Monitor memory usage over time
117
+ *
118
+ * @param interval - Interval in milliseconds to check memory
119
+ * @param callback - Callback function called with each snapshot
120
+ * @returns Function to stop monitoring
121
+ */
122
+ export function monitorMemoryUsage(
123
+ interval: number = 5000,
124
+ callback?: (snapshot: MemorySnapshot) => void
125
+ ): () => void {
126
+ if (!isMemoryMonitoringAvailable()) {
127
+ console.warn('[Memory Monitor] Memory monitoring is not available');
128
+ return () => {};
129
+ }
130
+
131
+ const checkMemory = () => {
132
+ const snapshot = getMemorySnapshot();
133
+ if (snapshot) {
134
+ if (callback) {
135
+ callback(snapshot);
136
+ } else if (process.env.NODE_ENV === 'development') {
137
+ console.log('[Memory Monitor]', {
138
+ used: formatBytes(snapshot.usedJSHeapSize),
139
+ total: formatBytes(snapshot.totalJSHeapSize),
140
+ limit: formatBytes(snapshot.jsHeapSizeLimit),
141
+ });
142
+ }
143
+ }
144
+ };
145
+
146
+ const intervalId = setInterval(checkMemory, interval);
147
+
148
+ // Initial check
149
+ checkMemory();
150
+
151
+ // Return cleanup function
152
+ return () => {
153
+ clearInterval(intervalId);
154
+ };
155
+ }
156
+
157
+ /**
158
+ * Track component lifecycle memory usage
159
+ *
160
+ * @param componentName - Name of the component
161
+ * @returns Object with start and end tracking functions
162
+ */
163
+ export function trackComponentMemory(componentName: string) {
164
+ const before = getMemorySnapshot();
165
+
166
+ return {
167
+ /**
168
+ * Get memory snapshot at component mount
169
+ */
170
+ getBeforeSnapshot: () => before,
171
+ /**
172
+ * Get memory snapshot at component unmount and detect leaks
173
+ */
174
+ getAfterSnapshot: () => {
175
+ const after = getMemorySnapshot();
176
+ if (before && after) {
177
+ const leakInfo = detectMemoryLeak(before, after);
178
+ if (leakInfo.hasLeak && process.env.NODE_ENV === 'development') {
179
+ console.warn(
180
+ `[Memory Monitor] Potential memory leak detected in ${componentName}:`,
181
+ leakInfo
182
+ );
183
+ }
184
+ }
185
+ return after;
186
+ },
187
+ };
188
+ }
189
+
@@ -195,7 +195,10 @@ $theme-font-weight: (
195
195
 
196
196
  // scss-docs-start utilities-colors
197
197
 
198
- // @TODO: Replace $theme-colors with css var
198
+ // Note: Future enhancement - Consider using CSS custom properties (--atomix-*)
199
+ // generated from $theme-colors instead of SCSS maps for utilities generation.
200
+ // This would enable runtime theme switching for utility classes.
201
+ // Current implementation uses SCSS maps which is correct for build-time generation.
199
202
 
200
203
  $utilities-colors: $theme-colors !default;
201
204
 
@@ -3,15 +3,12 @@ $assets-fonts-path: '../assets/fonts/' !default;
3
3
  @mixin font-face($name, $foldername, $filename, $weight: normal, $style: normal) {
4
4
  @font-face {
5
5
  font-family: $name;
6
- src: url('#{$assets-fonts-path}/#{$foldername}/#{$filename}.eot');
7
6
  src:
8
- url('#{$assets-fonts-path}/#{$foldername}/#{$filename}.eot?#iefix')
9
- format('embedded-opentype'),
10
7
  url('#{$assets-fonts-path}/#{$foldername}/#{$filename}.woff2') format('woff2'),
11
- url('#{$assets-fonts-path}/#{$foldername}/#{$filename}.woff') format('woff'),
12
- url('#{$assets-fonts-path}/#{$foldername}/#{$filename}.ttf') format('truetype');
8
+ url('#{$assets-fonts-path}/#{$foldername}/#{$filename}.woff') format('woff');
13
9
  font-weight: $weight;
14
10
  font-style: $style;
11
+ font-display: swap;
15
12
  text-rendering: optimizeLegibility;
16
13
  }
17
14
  }
@@ -1,7 +1,9 @@
1
1
  @use 'sass:color';
2
+ @use 'sass:map';
2
3
  @use '../01-settings/settings.config' as config;
3
4
  @use '../01-settings/settings.button' as button;
4
5
  @use '../01-settings/settings.colors' as colors;
6
+ @use '../01-settings/settings.design-tokens' as tokens;
5
7
  @use '../01-settings/settings.border-radius' as *;
6
8
  @use 'tools.to-rgb' as *;
7
9
  @use 'tools.border-radius' as *;
@@ -16,99 +18,84 @@
16
18
  $active-background: null,
17
19
  $active-border: null
18
20
  ) {
19
- $btn-text-color: colors.$white;
20
- $btn-text-hover-color: colors.$white;
21
+ $btn-text-color: var(--#{config.$prefix}white, #{colors.$white});
22
+ $btn-text-hover-color: var(--#{config.$prefix}white, #{colors.$white});
21
23
 
22
24
  @if ($color == 'light') {
23
- $btn-text-color: var(--#{config.$prefix}dark-text-emphasis);
24
- $btn-text-hover-color: var(--#{config.$prefix}dark-text-emphasis);
25
- }
26
-
27
- @if ($color == 'secondary') {
28
- $btn-text-color: var(--#{config.$prefix}dark-text-emphasis);
29
- $btn-text-hover-color: var(--#{config.$prefix}dark-text-emphasis);
25
+ $btn-text-color: var(--#{config.$prefix}dark-text-emphasis, #{colors.$dark-text});
26
+ $btn-text-hover-color: var(--#{config.$prefix}dark-text-emphasis, #{colors.$dark-text});
27
+ } @else if ($color == 'secondary') {
28
+ $btn-text-color: var(--#{config.$prefix}dark-text-emphasis, #{colors.$dark-text});
29
+ $btn-text-hover-color: var(--#{config.$prefix}dark-text-emphasis, #{colors.$dark-text});
30
30
  }
31
31
 
32
32
  --#{config.$prefix}btn-color: #{$btn-text-color};
33
- --#{config.$prefix}btn-bg: #{$background};
34
- --#{config.$prefix}btn-border-color: #{$border};
33
+ --#{config.$prefix}btn-bg: var(--#{config.$prefix}#{$color}, #{$background});
34
+ --#{config.$prefix}btn-border-color: var(--#{config.$prefix}#{$color}, #{$border});
35
35
  --#{config.$prefix}btn-hover-color: #{$btn-text-hover-color};
36
- --#{config.$prefix}btn-hover-bg: #{if(
37
- $hover-background,
38
- $hover-background,
39
- color.scale($background, $lightness: -15%)
40
- )};
41
- --#{config.$prefix}btn-hover-border-color: #{if(
42
- $hover-border,
43
- $hover-border,
44
- color.scale($border, $lightness: -10%)
45
- )};
46
- --#{config.$prefix}btn-active-color: #{colors.$white};
47
- --#{config.$prefix}btn-active-bg: #{if(
48
- $active-background,
49
- $active-background,
50
- color.scale($background, $lightness: -20%)
51
- )};
52
- --#{config.$prefix}btn-active-border-color: #{if(
53
- $active-border,
54
- $active-border,
55
- color.scale($border, $lightness: -25%)
56
- )};
57
- --#{config.$prefix}btn-disabled-color: #{colors.$white};
58
- --#{config.$prefix}btn-disabled-bg: #{$background};
59
- --#{config.$prefix}btn-disabled-border-color: #{$background};
36
+ --#{config.$prefix}btn-hover-bg: var(--#{config.$prefix}#{$color}-hover, #{color.scale($background, $lightness: -15%)});
37
+ --#{config.$prefix}btn-hover-border-color: var(--#{config.$prefix}#{$color}-hover, #{color.scale($border, $lightness: -10%)});
38
+ --#{config.$prefix}btn-active-color: var(--#{config.$prefix}white, #{colors.$white});
39
+ --#{config.$prefix}btn-active-bg: var(--#{config.$prefix}#{$color}-hover, #{color.scale($background, $lightness: -20%)});
40
+ --#{config.$prefix}btn-active-border-color: var(--#{config.$prefix}#{$color}-hover, #{color.scale($border, $lightness: -25%)});
41
+ --#{config.$prefix}btn-disabled-color: var(--#{config.$prefix}white, #{colors.$white});
42
+ --#{config.$prefix}btn-disabled-bg: var(--#{config.$prefix}#{$color}, #{$background});
43
+ --#{config.$prefix}btn-disabled-border-color: var(--#{config.$prefix}#{$color}, #{$border});
60
44
  }
61
45
 
62
46
  // Button outline variant mixin
63
47
  @mixin btn-outline-variant(
64
48
  $color,
65
- $color-hover: 'light',
66
- $hover-background: $color,
67
- $hover-border: $color,
68
- $active-background: $color,
69
- $active-border: $color
49
+ $color-hover: null,
50
+ $hover-background: null,
51
+ $hover-border: null,
52
+ $active-background: null,
53
+ $active-border: null
70
54
  ) {
71
- @if ($hover-background == 'primary') {
72
- $hover-background: 'primary';
73
- }
74
-
75
- @if ($hover-background == 'light') {
76
- $hover-background: 'secondary';
77
- }
78
-
79
- @if ($hover-background == 'dark') {
80
- $hover-background: 'secondary';
81
- }
82
-
83
- $btn-color: $color;
84
-
85
- @if ($color == 'secondary') {
86
- $btn-color: 'invert';
87
- $color-hover: 'invert';
88
- }
89
-
90
- @if ($color == 'dark') {
91
- $btn-color: 'invert';
92
- $color-hover: 'invert';
93
- }
55
+ $btn-color: var(--#{config.$prefix}#{$color}, #{map.get(tokens.$theme-colors, $color)});
56
+ $btn-hover-color: if(
57
+ $color-hover,
58
+ var(--#{config.$prefix}#{$color-hover}, #{map.get(tokens.$theme-colors, $color-hover)}),
59
+ var(--#{config.$prefix}white, #{colors.$white})
60
+ );
61
+ $btn-hover-bg: if(
62
+ $hover-background,
63
+ var(--#{config.$prefix}#{$hover-background}, #{map.get(tokens.$theme-colors, $hover-background)}),
64
+ var(--#{config.$prefix}#{$color}-hover, #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -15%)})
65
+ );
66
+ $btn-hover-border: if(
67
+ $hover-border,
68
+ var(--#{config.$prefix}#{$hover-border}, #{map.get(tokens.$theme-colors, $hover-border)}),
69
+ var(--#{config.$prefix}#{$color}-hover, #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -10%)})
70
+ );
71
+ $btn-active-color: if(
72
+ $color-hover,
73
+ var(--#{config.$prefix}#{$color-hover}, #{map.get(tokens.$theme-colors, $color-hover)}),
74
+ var(--#{config.$prefix}white, #{colors.$white})
75
+ );
76
+ $btn-active-bg: if(
77
+ $active-background,
78
+ var(--#{config.$prefix}#{$active-background}, #{map.get(tokens.$theme-colors, $active-background)}),
79
+ var(--#{config.$prefix}#{$color}-hover, #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -20%)})
80
+ );
81
+ $btn-active-border: if(
82
+ $active-border,
83
+ var(--#{config.$prefix}#{$active-border}, #{map.get(tokens.$theme-colors, $active-border)}),
84
+ var(--#{config.$prefix}#{$color}-hover, #{color.scale(map.get(tokens.$theme-colors, $color), $lightness: -25%)})
85
+ );
94
86
 
95
- @if ($color == 'light') {
96
- $btn-color: 'invert';
97
- $color-hover: 'invert';
98
- }
99
-
100
- --#{config.$prefix}btn-color: var(--#{config.$prefix}#{$btn-color});
87
+ --#{config.$prefix}btn-color: #{$btn-color};
101
88
  --#{config.$prefix}btn-bg: transparent;
102
- --#{config.$prefix}btn-border-color: var(--#{config.$prefix}#{$color});
103
- --#{config.$prefix}btn-hover-color: var(--#{config.$prefix}#{$color-hover});
104
- --#{config.$prefix}btn-hover-bg: var(--#{config.$prefix}#{$hover-background});
105
- --#{config.$prefix}btn-hover-border-color: var(--#{config.$prefix}#{$hover-border});
106
- --#{config.$prefix}btn-active-color: var(--#{config.$prefix}#{$color-hover});
107
- --#{config.$prefix}btn-active-bg: var(--#{config.$prefix}#{$active-background});
108
- --#{config.$prefix}btn-active-border-color: var(--#{config.$prefix}#{$active-border});
109
- --#{config.$prefix}btn-disabled-color: var(--#{config.$prefix}#{$color});
89
+ --#{config.$prefix}btn-border-color: #{$btn-color};
90
+ --#{config.$prefix}btn-hover-color: #{$btn-hover-color};
91
+ --#{config.$prefix}btn-hover-bg: #{$btn-hover-bg};
92
+ --#{config.$prefix}btn-hover-border-color: #{$btn-hover-border};
93
+ --#{config.$prefix}btn-active-color: #{$btn-active-color};
94
+ --#{config.$prefix}btn-active-bg: #{$btn-active-bg};
95
+ --#{config.$prefix}btn-active-border-color: #{$btn-active-border};
96
+ --#{config.$prefix}btn-disabled-color: #{$btn-color};
110
97
  --#{config.$prefix}btn-disabled-bg: transparent;
111
- --#{config.$prefix}btn-disabled-border-color: var(--#{config.$prefix}#{$color});
98
+ --#{config.$prefix}btn-disabled-border-color: #{$btn-color};
112
99
  }
113
100
 
114
101
  // Button size mixin
@@ -117,4 +104,4 @@
117
104
  --#{config.$prefix}btn-padding-x: #{$padding-x};
118
105
  --#{config.$prefix}btn-font-size: #{$font-size};
119
106
  --#{config.$prefix}btn-border-radius: #{$border-radius};
120
- }
107
+ }
@@ -1,6 +1,8 @@
1
1
  // Component: AtomixGlass
2
2
  // =============================================================================
3
3
 
4
+ @use '../02-tools/tools.component' as *;
5
+
4
6
  .c-atomix-glass {
5
7
  position: relative;
6
8
 
@@ -38,19 +40,19 @@
38
40
  }
39
41
 
40
42
  &__hover-1 {
41
- transition: opacity 0.2s ease-out;
43
+ transition: opacity var(--atomix-transition-duration-fast, 0.15s) ease-out;
42
44
  opacity: var(--atomix-glass-hover-1-opacity, 0);
43
45
  background: var(--atomix-glass-hover-1-gradient, none);
44
46
  }
45
47
 
46
48
  &__hover-2 {
47
- transition: opacity 0.4s ease-out;
49
+ transition: opacity var(--atomix-transition-duration-base, 0.3s) ease-out;
48
50
  opacity: var(--atomix-glass-hover-2-opacity, 0);
49
51
  background: var(--atomix-glass-hover-2-gradient, none);
50
52
  }
51
53
 
52
54
  &__hover-3 {
53
- transition: opacity 0.6s ease-out;
55
+ transition: opacity var(--atomix-transition-duration-slow, 0.5s) ease-out;
54
56
  opacity: var(--atomix-glass-hover-3-opacity, 0);
55
57
  background: var(--atomix-glass-hover-3-gradient, none);
56
58
  }
@@ -91,6 +93,7 @@
91
93
  box-sizing: border-box;
92
94
  overflow: hidden;
93
95
  pointer-events: none;
96
+ /* postcss-ignore-start */
94
97
  -webkit-mask:
95
98
  linear-gradient(var(--atomix-black, #000000) 0 0) content-box,
96
99
  linear-gradient(var(--atomix-black, #000000) 0 0);
@@ -99,6 +102,7 @@
99
102
  linear-gradient(var(--atomix-black, #000000) 0 0) content-box,
100
103
  linear-gradient(var(--atomix-black, #000000) 0 0);
101
104
  mask-composite: exclude;
105
+ /* postcss-ignore-end */
102
106
 
103
107
  position: var(--atomix-glass-position);
104
108
  top: var(--atomix-glass-top);
@@ -233,6 +237,12 @@
233
237
  --atomix-glass-transition: none;
234
238
  }
235
239
 
240
+ // Focus ring for interactive elements (when onClick is provided)
241
+ &[role='button'],
242
+ &[tabindex]:not([tabindex='-1']) {
243
+ @include focus-ring;
244
+ }
245
+
236
246
  // Responsive and accessibility
237
247
  @media (prefers-reduced-motion: reduce) {
238
248
  --atomix-glass-transition: none;
@@ -48,12 +48,6 @@
48
48
  max-width: var(--#{$prefix}navbar-container-max-width);
49
49
  padding: 0 var(--#{$prefix}navbar-padding-x);
50
50
  margin: 0 auto;
51
- gap: var(--#{$prefix}navbar-padding-x);
52
-
53
- @include media.media-down('md') {
54
- flex-wrap: nowrap;
55
- gap: 0.5rem;
56
- }
57
51
  }
58
52
 
59
53
  // 3. Element Styles (BEM Elements)
@@ -153,4 +153,92 @@
153
153
  &__icon-skip-forward::before {
154
154
  content: '⏭';
155
155
  }
156
+
157
+ // Search functionality
158
+ &__search {
159
+ margin-top: 1rem;
160
+ display: flex;
161
+ flex-direction: column;
162
+ align-items: center;
163
+ gap: 0.5rem;
164
+ }
165
+
166
+ &__search-wrapper {
167
+ display: flex;
168
+ align-items: center;
169
+ gap: 0.5rem;
170
+ }
171
+
172
+ &__search-label {
173
+ display: flex;
174
+ align-items: center;
175
+ gap: 0.5rem;
176
+ }
177
+
178
+ &__search-label-text {
179
+ font-size: var(--#{config.$prefix}pagination-font-size);
180
+ color: var(--#{config.$prefix}pagination-color);
181
+ white-space: nowrap;
182
+ }
183
+
184
+ &__search-input {
185
+ width: 80px;
186
+ padding: var(--#{config.$prefix}pagination-padding-y)
187
+ var(--#{config.$prefix}pagination-padding-x);
188
+ font-size: var(--#{config.$prefix}pagination-font-size);
189
+ text-align: center;
190
+ border: 1px solid var(--#{config.$prefix}pagination-color);
191
+ border-radius: var(--#{config.$prefix}pagination-border-radius);
192
+ @include dynamic-background(var(--#{config.$prefix}pagination-bg));
193
+ color: var(--#{config.$prefix}pagination-color);
194
+ transition: all 0.2s ease-in-out;
195
+
196
+ &:focus {
197
+ outline: none;
198
+ border-color: var(--#{config.$prefix}pagination-focus-border-color);
199
+ border-width: var(--#{config.$prefix}pagination-focus-border-width);
200
+ }
201
+
202
+ &.is-error {
203
+ border-color: var(--#{config.$prefix}error-color, #dc3545);
204
+ background-color: var(--#{config.$prefix}error-bg-subtle, rgba(220, 53, 69, 0.1));
205
+ }
206
+ }
207
+
208
+ &__search-button {
209
+ display: flex;
210
+ align-items: center;
211
+ justify-content: center;
212
+ @include size.square(var(--#{config.$prefix}pagination-size));
213
+ padding: var(--#{config.$prefix}pagination-padding-y)
214
+ var(--#{config.$prefix}pagination-padding-x);
215
+ @include dynamic-background(var(--#{config.$prefix}pagination-bg));
216
+ border: 1px solid var(--#{config.$prefix}pagination-color);
217
+ border-radius: var(--#{config.$prefix}pagination-border-radius);
218
+ color: var(--#{config.$prefix}pagination-color);
219
+ cursor: pointer;
220
+ transition: all 0.2s ease-in-out;
221
+
222
+ &:hover {
223
+ --#{config.$prefix}pagination-color: var(--#{config.$prefix}pagination-hover-color);
224
+ --#{config.$prefix}pagination-bg: var(--#{config.$prefix}pagination-hover-bg);
225
+ }
226
+
227
+ &:focus-visible {
228
+ outline: none;
229
+ border-color: var(--#{config.$prefix}pagination-focus-border-color);
230
+ border-width: var(--#{config.$prefix}pagination-focus-border-width);
231
+ }
232
+
233
+ .c-icon {
234
+ color: inherit;
235
+ }
236
+ }
237
+
238
+ &__search-error {
239
+ font-size: 0.75rem;
240
+ color: var(--#{config.$prefix}error-color, #dc3545);
241
+ text-align: center;
242
+ margin-top: 0.25rem;
243
+ }
156
244
  }