adminator-admin-dashboard 2.8.1 → 4.1.5

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 (179) hide show
  1. package/CHANGELOG.md +499 -0
  2. package/CLAUDE.md +126 -154
  3. package/README.md +321 -370
  4. package/dist/2026.js +8751 -0
  5. package/dist/2026.js.map +1 -0
  6. package/dist/404.html +36 -16
  7. package/dist/500.html +36 -16
  8. package/dist/assets/static/images/logo.svg +3 -3
  9. package/dist/basic-table.html +152 -699
  10. package/dist/blank.html +42 -507
  11. package/dist/buttons.html +152 -448
  12. package/dist/calendar.html +246 -658
  13. package/dist/charts.html +124 -658
  14. package/dist/chat.html +209 -706
  15. package/dist/compose.html +141 -618
  16. package/dist/datatable.html +467 -991
  17. package/dist/email.html +430 -943
  18. package/dist/forms.html +208 -733
  19. package/dist/google-maps.html +123 -513
  20. package/dist/index.html +436 -1041
  21. package/dist/runtime.js +1299 -0
  22. package/dist/runtime.js.map +1 -0
  23. package/dist/signin.html +92 -92
  24. package/dist/signup.html +106 -91
  25. package/dist/ui.html +268 -897
  26. package/dist/vector-maps.html +132 -511
  27. package/dist/vendor-chartjs.js +14593 -0
  28. package/dist/vendor-chartjs.js.map +1 -0
  29. package/dist/vendor-fullcalendar.js +14793 -0
  30. package/dist/vendor-fullcalendar.js.map +1 -0
  31. package/dist/vendors.js +3758 -0
  32. package/dist/vendors.js.map +1 -0
  33. package/package.json +50 -52
  34. package/src/404.html +35 -15
  35. package/src/500.html +35 -15
  36. package/src/assets/scripts/2026/Shell.js +312 -0
  37. package/src/assets/scripts/2026/calendar.js +123 -0
  38. package/src/assets/scripts/2026/charts.js +259 -0
  39. package/src/assets/scripts/2026/index.js +35 -0
  40. package/src/assets/scripts/2026/init.js +207 -0
  41. package/src/assets/scripts/2026/maps.js +78 -0
  42. package/src/assets/scripts/2026/palette.js +266 -0
  43. package/src/assets/static/images/logo.svg +3 -3
  44. package/src/assets/styles/2026/_animations.scss +14 -0
  45. package/src/assets/styles/2026/_auth.scss +215 -0
  46. package/src/assets/styles/2026/_base.scss +37 -0
  47. package/src/assets/styles/2026/_calendar.scss +380 -0
  48. package/src/assets/styles/2026/_charts.scss +44 -0
  49. package/src/assets/styles/2026/_chat.scss +350 -0
  50. package/src/assets/styles/2026/_components.scss +140 -0
  51. package/src/assets/styles/2026/_dashboard.scss +520 -0
  52. package/src/assets/styles/2026/_data.scss +130 -0
  53. package/src/assets/styles/2026/_dropdowns.scss +128 -0
  54. package/src/assets/styles/2026/_email.scss +599 -0
  55. package/src/assets/styles/2026/_error.scss +98 -0
  56. package/src/assets/styles/2026/_forms.scss +215 -0
  57. package/src/assets/styles/2026/_fullcalendar.scss +134 -0
  58. package/src/assets/styles/2026/_palette.scss +173 -0
  59. package/src/assets/styles/2026/_responsive.scss +229 -0
  60. package/src/assets/styles/2026/_shell.scss +290 -0
  61. package/src/assets/styles/2026/_tokens.scss +80 -0
  62. package/src/assets/styles/2026/_ui.scss +365 -0
  63. package/src/assets/styles/2026/index.scss +23 -0
  64. package/src/basic-table.html +153 -710
  65. package/src/blank.html +42 -517
  66. package/src/buttons.html +152 -458
  67. package/src/calendar.html +246 -668
  68. package/src/charts.html +124 -668
  69. package/src/chat.html +209 -716
  70. package/src/compose.html +142 -629
  71. package/src/datatable.html +466 -1000
  72. package/src/email.html +429 -952
  73. package/src/forms.html +207 -742
  74. package/src/google-maps.html +128 -523
  75. package/src/index.html +438 -1050
  76. package/src/signin.html +92 -92
  77. package/src/signup.html +106 -91
  78. package/src/ui.html +267 -906
  79. package/src/vector-maps.html +133 -522
  80. package/dist/1e59d2330b4c6deb84b3.ttf +0 -0
  81. package/dist/20fd1704ea223900efa9.woff2 +0 -0
  82. package/dist/29b39089170885ae2967.woff +0 -0
  83. package/dist/8b43027f47b20503057d.eot +0 -0
  84. package/dist/9bad94440d49256265a5.eot +0 -0
  85. package/dist/assets/fontawesome-webfont.svg +0 -2671
  86. package/dist/assets/themify.svg +0 -362
  87. package/dist/eda8b94308c6f538f04a.ttf +0 -0
  88. package/dist/f691f37e57f04c152e23.woff +0 -0
  89. package/dist/main.js +0 -61323
  90. package/dist/main.js.map +0 -1
  91. package/src/assets/scripts/app 2.js +0 -645
  92. package/src/assets/scripts/app.js +0 -645
  93. package/src/assets/scripts/charts/chartJS/index.js +0 -148
  94. package/src/assets/scripts/charts/easyPieChart/index.js +0 -200
  95. package/src/assets/scripts/charts/index.js +0 -3
  96. package/src/assets/scripts/charts/sparkline/index.js +0 -208
  97. package/src/assets/scripts/chat/index.js +0 -11
  98. package/src/assets/scripts/components/Chart.js +0 -1390
  99. package/src/assets/scripts/components/Sidebar.js +0 -241
  100. package/src/assets/scripts/constants/colors.js +0 -274
  101. package/src/assets/scripts/datatable/index.js +0 -379
  102. package/src/assets/scripts/datepicker/index.js +0 -302
  103. package/src/assets/scripts/email/index.js +0 -25
  104. package/src/assets/scripts/fullcalendar/index.js +0 -86
  105. package/src/assets/scripts/googleMaps/index.js +0 -93
  106. package/src/assets/scripts/index.js +0 -18
  107. package/src/assets/scripts/masonry/index.js +0 -14
  108. package/src/assets/scripts/popover/index.js +0 -109
  109. package/src/assets/scripts/scrollbar/index.js +0 -10
  110. package/src/assets/scripts/search/index.js +0 -15
  111. package/src/assets/scripts/sidebar/index.js +0 -140
  112. package/src/assets/scripts/skycons/index.js +0 -52
  113. package/src/assets/scripts/ui/index.js +0 -412
  114. package/src/assets/scripts/utils/date.js +0 -242
  115. package/src/assets/scripts/utils/dom.js +0 -349
  116. package/src/assets/scripts/utils/index.js +0 -45
  117. package/src/assets/scripts/utils/theme.js +0 -107
  118. package/src/assets/scripts/vectorMaps/index.js +0 -277
  119. package/src/assets/styles/index.scss +0 -801
  120. package/src/assets/styles/spec/components/easyPieChart.scss +0 -11
  121. package/src/assets/styles/spec/components/footer.scss +0 -4
  122. package/src/assets/styles/spec/components/forms.scss +0 -288
  123. package/src/assets/styles/spec/components/index.scss +0 -9
  124. package/src/assets/styles/spec/components/loader.scss +0 -46
  125. package/src/assets/styles/spec/components/masonry.scss +0 -1
  126. package/src/assets/styles/spec/components/pageContainer.scss +0 -255
  127. package/src/assets/styles/spec/components/progressBar.scss +0 -6
  128. package/src/assets/styles/spec/components/sidebar.scss +0 -642
  129. package/src/assets/styles/spec/components/topbar.scss +0 -455
  130. package/src/assets/styles/spec/generic/base.scss +0 -102
  131. package/src/assets/styles/spec/generic/index.scss +0 -1
  132. package/src/assets/styles/spec/index.scss +0 -4
  133. package/src/assets/styles/spec/screens/chat.scss +0 -147
  134. package/src/assets/styles/spec/screens/email.scss +0 -108
  135. package/src/assets/styles/spec/screens/index.scss +0 -2
  136. package/src/assets/styles/spec/settings/baseColors.scss +0 -103
  137. package/src/assets/styles/spec/settings/borders.scss +0 -6
  138. package/src/assets/styles/spec/settings/breakpoints.scss +0 -26
  139. package/src/assets/styles/spec/settings/fonts.scss +0 -4
  140. package/src/assets/styles/spec/settings/index.scss +0 -4
  141. package/src/assets/styles/spec/settings/materialColors.scss +0 -550
  142. package/src/assets/styles/spec/tools/index.scss +0 -1
  143. package/src/assets/styles/spec/tools/mixins/clearfix.scss +0 -15
  144. package/src/assets/styles/spec/tools/mixins/index.scss +0 -3
  145. package/src/assets/styles/spec/tools/mixins/mediaQueriesRanges.scss +0 -58
  146. package/src/assets/styles/spec/tools/mixins/placeholder.scss +0 -10
  147. package/src/assets/styles/spec/utils/colors.scss +0 -33
  148. package/src/assets/styles/spec/utils/index.scss +0 -2
  149. package/src/assets/styles/spec/utils/layout/helpers/border.scss +0 -78
  150. package/src/assets/styles/spec/utils/layout/helpers/flex.scss +0 -220
  151. package/src/assets/styles/spec/utils/layout/helpers/index.scss +0 -11
  152. package/src/assets/styles/spec/utils/layout/helpers/layout.scss +0 -137
  153. package/src/assets/styles/spec/utils/layout/helpers/lists.scss +0 -23
  154. package/src/assets/styles/spec/utils/layout/helpers/margin.scss +0 -266
  155. package/src/assets/styles/spec/utils/layout/helpers/objects.scss +0 -91
  156. package/src/assets/styles/spec/utils/layout/helpers/padding.scss +0 -147
  157. package/src/assets/styles/spec/utils/layout/helpers/positions.scss +0 -118
  158. package/src/assets/styles/spec/utils/layout/helpers/pseudo.scss +0 -6
  159. package/src/assets/styles/spec/utils/layout/helpers/sizes.scss +0 -157
  160. package/src/assets/styles/spec/utils/layout/helpers/typography.scss +0 -127
  161. package/src/assets/styles/spec/utils/layout/index.scss +0 -3
  162. package/src/assets/styles/spec/utils/layout/mixins/generateResponsive.scss +0 -25
  163. package/src/assets/styles/spec/utils/layout/mixins/index.scss +0 -2
  164. package/src/assets/styles/spec/utils/layout/mixins/mediaQueryCondition.scss +0 -28
  165. package/src/assets/styles/spec/utils/layout/utils/center.scss +0 -54
  166. package/src/assets/styles/spec/utils/layout/utils/gap.scss +0 -229
  167. package/src/assets/styles/spec/utils/layout/utils/index.scss +0 -5
  168. package/src/assets/styles/spec/utils/layout/utils/layers.scss +0 -5
  169. package/src/assets/styles/spec/utils/layout/utils/peers.scss +0 -35
  170. package/src/assets/styles/utils/mobile.scss +0 -954
  171. package/src/assets/styles/utils/theme.css +0 -97
  172. package/src/assets/styles/vendor/datepicker.scss +0 -183
  173. package/src/assets/styles/vendor/font-awesome.css +0 -2337
  174. package/src/assets/styles/vendor/fullcalendar.scss +0 -217
  175. package/src/assets/styles/vendor/index.scss +0 -8
  176. package/src/assets/styles/vendor/jquery.datatables.scss +0 -162
  177. package/src/assets/styles/vendor/perfectScrollbar.scss +0 -4
  178. package/src/assets/styles/vendor/sparkline.scss +0 -6
  179. package/src/assets/styles/vendor/themify-icons.css +0 -1081
@@ -1,349 +0,0 @@
1
- /**
2
- * DOM Utility Functions
3
- * Provides jQuery-like functionality using vanilla JavaScript
4
- */
5
-
6
- export const DOM = {
7
- /**
8
- * Select single element (replaces $('selector'))
9
- */
10
- select: (selector, context = document) => {
11
- return context.querySelector(selector);
12
- },
13
-
14
- /**
15
- * Select multiple elements (replaces $('selector'))
16
- */
17
- selectAll: (selector, context = document) => {
18
- return Array.from(context.querySelectorAll(selector));
19
- },
20
-
21
- /**
22
- * Check if element exists
23
- */
24
- exists: (selector) => {
25
- return document.querySelector(selector) !== null;
26
- },
27
-
28
- /**
29
- * Add event listener (replaces $.on())
30
- */
31
- on: (element, event, handler, options = {}) => {
32
- if (typeof element === 'string') {
33
- element = document.querySelector(element);
34
- }
35
- if (element) {
36
- element.addEventListener(event, handler, options);
37
- }
38
- },
39
-
40
- /**
41
- * Remove event listener (replaces $.off())
42
- */
43
- off: (element, event, handler) => {
44
- if (typeof element === 'string') {
45
- element = document.querySelector(element);
46
- }
47
- if (element) {
48
- element.removeEventListener(event, handler);
49
- }
50
- },
51
-
52
- /**
53
- * Add class (replaces $.addClass())
54
- */
55
- addClass: (element, className) => {
56
- if (typeof element === 'string') {
57
- element = document.querySelector(element);
58
- }
59
- if (element) {
60
- element.classList.add(className);
61
- }
62
- },
63
-
64
- /**
65
- * Remove class (replaces $.removeClass())
66
- */
67
- removeClass: (element, className) => {
68
- if (typeof element === 'string') {
69
- element = document.querySelector(element);
70
- }
71
- if (element) {
72
- element.classList.remove(className);
73
- }
74
- },
75
-
76
- /**
77
- * Toggle class (replaces $.toggleClass())
78
- */
79
- toggleClass: (element, className) => {
80
- if (typeof element === 'string') {
81
- element = document.querySelector(element);
82
- }
83
- if (element) {
84
- element.classList.toggle(className);
85
- }
86
- },
87
-
88
- /**
89
- * Check if element has class (replaces $.hasClass())
90
- */
91
- hasClass: (element, className) => {
92
- if (typeof element === 'string') {
93
- element = document.querySelector(element);
94
- }
95
- return element ? element.classList.contains(className) : false;
96
- },
97
-
98
- /**
99
- * Get/Set attribute (replaces $.attr())
100
- */
101
- attr: (element, name, value) => {
102
- if (typeof element === 'string') {
103
- element = document.querySelector(element);
104
- }
105
- if (!element) return null;
106
-
107
- if (value === undefined) {
108
- return element.getAttribute(name);
109
- } else {
110
- element.setAttribute(name, value);
111
- return element;
112
- }
113
- },
114
-
115
- /**
116
- * Get/Set data attribute (replaces $.data())
117
- */
118
- data: (element, name, value) => {
119
- if (typeof element === 'string') {
120
- element = document.querySelector(element);
121
- }
122
- if (!element) return null;
123
-
124
- const dataName = `data-${name}`;
125
-
126
- if (value === undefined) {
127
- return element.getAttribute(dataName);
128
- } else {
129
- element.setAttribute(dataName, value);
130
- return element;
131
- }
132
- },
133
-
134
- /**
135
- * Get/Set text content (replaces $.text())
136
- */
137
- text: (element, content) => {
138
- if (typeof element === 'string') {
139
- element = document.querySelector(element);
140
- }
141
- if (!element) return null;
142
-
143
- if (content === undefined) {
144
- return element.textContent;
145
- } else {
146
- element.textContent = content;
147
- return element;
148
- }
149
- },
150
-
151
- /**
152
- * Get/Set HTML content (replaces $.html())
153
- */
154
- html: (element, content) => {
155
- if (typeof element === 'string') {
156
- element = document.querySelector(element);
157
- }
158
- if (!element) return null;
159
-
160
- if (content === undefined) {
161
- return element.innerHTML;
162
- } else {
163
- element.innerHTML = content;
164
- return element;
165
- }
166
- },
167
-
168
- /**
169
- * Hide element (replaces $.hide())
170
- */
171
- hide: (element) => {
172
- if (typeof element === 'string') {
173
- element = document.querySelector(element);
174
- }
175
- if (element) {
176
- element.style.display = 'none';
177
- }
178
- },
179
-
180
- /**
181
- * Show element (replaces $.show())
182
- */
183
- show: (element, display = 'block') => {
184
- if (typeof element === 'string') {
185
- element = document.querySelector(element);
186
- }
187
- if (element) {
188
- element.style.display = display;
189
- }
190
- },
191
-
192
- /**
193
- * Toggle visibility (replaces $.toggle())
194
- */
195
- toggle: (element, display = 'block') => {
196
- if (typeof element === 'string') {
197
- element = document.querySelector(element);
198
- }
199
- if (element) {
200
- if (element.style.display === 'none') {
201
- element.style.display = display;
202
- } else {
203
- element.style.display = 'none';
204
- }
205
- }
206
- },
207
-
208
- /**
209
- * Slide up animation (replaces $.slideUp())
210
- */
211
- slideUp: (element, duration = 300) => {
212
- if (typeof element === 'string') {
213
- element = document.querySelector(element);
214
- }
215
- if (!element) return Promise.resolve();
216
-
217
- return new Promise((resolve) => {
218
- const height = element.scrollHeight;
219
- element.style.height = `${height}px`;
220
- element.style.overflow = 'hidden';
221
-
222
- element.animate([
223
- { height: `${height}px` },
224
- { height: '0px' },
225
- ], {
226
- duration,
227
- easing: 'ease-in-out',
228
- }).onfinish = () => {
229
- element.style.display = 'none';
230
- element.style.height = '';
231
- element.style.overflow = '';
232
- resolve();
233
- };
234
- });
235
- },
236
-
237
- /**
238
- * Slide down animation (replaces $.slideDown())
239
- */
240
- slideDown: (element, duration = 300) => {
241
- if (typeof element === 'string') {
242
- element = document.querySelector(element);
243
- }
244
- if (!element) return Promise.resolve();
245
-
246
- return new Promise((resolve) => {
247
- element.style.display = 'block';
248
- element.style.height = '0px';
249
- element.style.overflow = 'hidden';
250
-
251
- const height = element.scrollHeight;
252
-
253
- element.animate([
254
- { height: '0px' },
255
- { height: `${height}px` },
256
- ], {
257
- duration,
258
- easing: 'ease-in-out',
259
- }).onfinish = () => {
260
- element.style.height = 'auto';
261
- element.style.overflow = 'visible';
262
- resolve();
263
- };
264
- });
265
- },
266
-
267
- /**
268
- * Fade in animation (replaces $.fadeIn())
269
- */
270
- fadeIn: (element, duration = 300) => {
271
- if (typeof element === 'string') {
272
- element = document.querySelector(element);
273
- }
274
- if (!element) return Promise.resolve();
275
-
276
- return new Promise((resolve) => {
277
- element.style.opacity = '0';
278
- element.style.display = 'block';
279
-
280
- element.animate([
281
- { opacity: 0 },
282
- { opacity: 1 },
283
- ], {
284
- duration,
285
- easing: 'ease-in-out',
286
- }).onfinish = () => {
287
- element.style.opacity = '';
288
- resolve();
289
- };
290
- });
291
- },
292
-
293
- /**
294
- * Fade out animation (replaces $.fadeOut())
295
- */
296
- fadeOut: (element, duration = 300) => {
297
- if (typeof element === 'string') {
298
- element = document.querySelector(element);
299
- }
300
- if (!element) return Promise.resolve();
301
-
302
- return new Promise((resolve) => {
303
- element.animate([
304
- { opacity: 1 },
305
- { opacity: 0 },
306
- ], {
307
- duration,
308
- easing: 'ease-in-out',
309
- }).onfinish = () => {
310
- element.style.display = 'none';
311
- element.style.opacity = '';
312
- resolve();
313
- };
314
- });
315
- },
316
-
317
- /**
318
- * Get element dimensions and position
319
- */
320
- dimensions: (element) => {
321
- if (typeof element === 'string') {
322
- element = document.querySelector(element);
323
- }
324
- if (!element) return null;
325
-
326
- const rect = element.getBoundingClientRect();
327
- return {
328
- width: rect.width,
329
- height: rect.height,
330
- top: rect.top,
331
- left: rect.left,
332
- bottom: rect.bottom,
333
- right: rect.right,
334
- };
335
- },
336
-
337
- /**
338
- * Wait for DOM to be ready (replaces $(document).ready())
339
- */
340
- ready: (callback) => {
341
- if (document.readyState === 'loading') {
342
- document.addEventListener('DOMContentLoaded', callback);
343
- } else {
344
- callback();
345
- }
346
- },
347
- };
348
-
349
- export default DOM;
@@ -1,45 +0,0 @@
1
- export default (function () {
2
- // ------------------------------------------------------
3
- // @Window Resize
4
- // ------------------------------------------------------
5
-
6
- /**
7
- * NOTE: Register resize event for Masonry layout
8
- */
9
- const EVENT = document.createEvent('UIEvents');
10
- window.EVENT = EVENT;
11
- EVENT.initUIEvent('resize', true, false, window, 0);
12
-
13
-
14
- window.addEventListener('load', () => {
15
- /**
16
- * Trigger window resize event after page load
17
- * for recalculation of masonry layout.
18
- */
19
- window.dispatchEvent(EVENT);
20
- });
21
-
22
- // ------------------------------------------------------
23
- // @External Links
24
- // ------------------------------------------------------
25
-
26
- // Open external links in new window
27
- const externalLinks = document.querySelectorAll('a[href^="http"], a[href^="//"]');
28
-
29
- externalLinks.forEach(link => {
30
- const href = link.getAttribute('href');
31
- if (href && !href.includes(window.location.host)) {
32
- link.setAttribute('rel', 'noopener noreferrer');
33
- link.setAttribute('target', '_blank');
34
- }
35
- });
36
-
37
- // ------------------------------------------------------
38
- // @Resize Trigger
39
- // ------------------------------------------------------
40
-
41
- // Trigger resize on any element click
42
- document.addEventListener('click', () => {
43
- window.dispatchEvent(window.EVENT);
44
- });
45
- }());
@@ -1,107 +0,0 @@
1
- /* global Chart */
2
- const THEME_KEY = 'adminator-theme';
3
-
4
- const Theme = {
5
- apply(theme) {
6
- document.documentElement.setAttribute('data-theme', theme);
7
- if (window.Chart && Chart.defaults) {
8
- const isDark = theme === 'dark';
9
- const textColor = isDark ? '#FFFFFF' : '#212529';
10
- const mutedColor = isDark ? '#D1D5DB' : '#6C757D';
11
- const borderColor = isDark ? '#374151' : '#E2E5E8';
12
- const gridColor = isDark ? 'rgba(209, 213, 219, 0.15)' : 'rgba(0, 0, 0, 0.05)';
13
- const tooltipBg = isDark ? '#1F2937' : 'rgba(255, 255, 255, 0.95)';
14
-
15
- // Set global defaults
16
- Chart.defaults.color = textColor;
17
- Chart.defaults.borderColor = borderColor;
18
- Chart.defaults.backgroundColor = tooltipBg;
19
-
20
- // Set plugin defaults
21
- Chart.defaults.plugins.legend.labels.color = textColor;
22
- Chart.defaults.plugins.tooltip.backgroundColor = tooltipBg;
23
- Chart.defaults.plugins.tooltip.titleColor = textColor;
24
- Chart.defaults.plugins.tooltip.bodyColor = textColor;
25
- Chart.defaults.plugins.tooltip.borderColor = borderColor;
26
-
27
- // Set scale defaults
28
- Chart.defaults.scales.category.ticks.color = mutedColor;
29
- Chart.defaults.scales.category.grid.color = gridColor;
30
- Chart.defaults.scales.linear.ticks.color = mutedColor;
31
- Chart.defaults.scales.linear.grid.color = gridColor;
32
- Chart.defaults.scales.logarithmic.ticks.color = mutedColor;
33
- Chart.defaults.scales.logarithmic.grid.color = gridColor;
34
- Chart.defaults.scales.time.ticks.color = mutedColor;
35
- Chart.defaults.scales.time.grid.color = gridColor;
36
- Chart.defaults.scales.radialLinear.ticks.color = mutedColor;
37
- Chart.defaults.scales.radialLinear.grid.color = gridColor;
38
- Chart.defaults.scales.radialLinear.pointLabels.color = mutedColor;
39
- Chart.defaults.scales.radialLinear.angleLines.color = gridColor;
40
- }
41
- try {
42
- localStorage.setItem(THEME_KEY, theme);
43
- } catch {
44
- // Ignore errors
45
- }
46
- window.dispatchEvent(new CustomEvent('adminator:themeChanged', { detail: { theme } }));
47
- },
48
- toggle() {
49
- const next = this.current() === 'dark' ? 'light' : 'dark';
50
- this.apply(next);
51
- },
52
- current() {
53
- try {
54
- return localStorage.getItem(THEME_KEY) || 'light';
55
- } catch {
56
- return 'light';
57
- }
58
- },
59
- init() {
60
- // Detect OS preference first time
61
- if (!localStorage.getItem(THEME_KEY)) {
62
- const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
63
- this.apply(prefersDark ? 'dark' : 'light');
64
- } else {
65
- this.apply(this.current());
66
- }
67
- },
68
- getCSSVar(varName) {
69
- return getComputedStyle(document.documentElement).getPropertyValue(varName).trim();
70
- },
71
- getVectorMapColors() {
72
- return {
73
- backgroundColor: this.getCSSVar('--vmap-bg-color'),
74
- borderColor: this.getCSSVar('--vmap-border-color'),
75
- regionColor: this.getCSSVar('--vmap-region-color'),
76
- markerFill: this.getCSSVar('--vmap-marker-fill'),
77
- markerStroke: this.getCSSVar('--vmap-marker-stroke'),
78
- hoverColor: this.getCSSVar('--vmap-hover-color'),
79
- selectedColor: this.getCSSVar('--vmap-selected-color'),
80
- scaleStart: this.getCSSVar('--vmap-scale-start'),
81
- scaleEnd: this.getCSSVar('--vmap-scale-end'),
82
- scaleLight: this.getCSSVar('--vmap-scale-light'),
83
- scaleDark: this.getCSSVar('--vmap-scale-dark'),
84
- };
85
- },
86
- getSparklineColors() {
87
- return {
88
- success: this.getCSSVar('--sparkline-success'),
89
- purple: this.getCSSVar('--sparkline-purple'),
90
- info: this.getCSSVar('--sparkline-info'),
91
- danger: this.getCSSVar('--sparkline-danger'),
92
- light: this.getCSSVar('--sparkline-light'),
93
- };
94
- },
95
- getChartColors() {
96
- const isDark = this.current() === 'dark';
97
- return {
98
- textColor: isDark ? '#FFFFFF' : '#212529',
99
- mutedColor: isDark ? '#D1D5DB' : '#6C757D',
100
- borderColor: isDark ? '#374151' : '#E2E5E8',
101
- gridColor: isDark ? 'rgba(209, 213, 219, 0.15)' : 'rgba(0, 0, 0, 0.05)',
102
- tooltipBg: isDark ? '#1F2937' : 'rgba(255, 255, 255, 0.95)',
103
- };
104
- },
105
- };
106
-
107
- export default Theme;