adminator-admin-dashboard 2.7.0

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 (191) hide show
  1. package/CLAUDE.md +162 -0
  2. package/LICENSE +21 -0
  3. package/README.md +376 -0
  4. package/RELEASE_NOTES.md +92 -0
  5. package/dist/1e59d2330b4c6deb84b3.ttf +0 -0
  6. package/dist/20fd1704ea223900efa9.woff2 +0 -0
  7. package/dist/29b39089170885ae2967.woff +0 -0
  8. package/dist/404.html +24 -0
  9. package/dist/500.html +24 -0
  10. package/dist/55b07f26c86c8e3d3754.svg +1 -0
  11. package/dist/8b43027f47b20503057d.eot +0 -0
  12. package/dist/9bad94440d49256265a5.eot +0 -0
  13. package/dist/9fad440d8ee7a949a9a9.svg +1 -0
  14. package/dist/assets/c1e38fd9e0e74ba58f7a2b77ef29fdd3.svg +2671 -0
  15. package/dist/assets/f0fc8c798eac5636249c4ea287832422.svg +362 -0
  16. package/dist/assets/static/fonts/icons/fontawesome/FontAwesome.otf +0 -0
  17. package/dist/assets/static/fonts/icons/fontawesome/fontawesome-webfont.eot +0 -0
  18. package/dist/assets/static/fonts/icons/fontawesome/fontawesome-webfont.svg +2671 -0
  19. package/dist/assets/static/fonts/icons/fontawesome/fontawesome-webfont.ttf +0 -0
  20. package/dist/assets/static/fonts/icons/fontawesome/fontawesome-webfont.woff +0 -0
  21. package/dist/assets/static/fonts/icons/fontawesome/fontawesome-webfont.woff2 +0 -0
  22. package/dist/assets/static/fonts/icons/themify/themify.eot +0 -0
  23. package/dist/assets/static/fonts/icons/themify/themify.svg +362 -0
  24. package/dist/assets/static/fonts/icons/themify/themify.ttf +0 -0
  25. package/dist/assets/static/fonts/icons/themify/themify.woff +0 -0
  26. package/dist/assets/static/images/404.png +0 -0
  27. package/dist/assets/static/images/500.png +0 -0
  28. package/dist/assets/static/images/bg.jpg +0 -0
  29. package/dist/assets/static/images/datatables/sort_asc.png +0 -0
  30. package/dist/assets/static/images/datatables/sort_asc_disabled.png +0 -0
  31. package/dist/assets/static/images/datatables/sort_both.png +0 -0
  32. package/dist/assets/static/images/datatables/sort_desc.png +0 -0
  33. package/dist/assets/static/images/datatables/sort_desc_disabled.png +0 -0
  34. package/dist/assets/static/images/logo-circle.svg +7 -0
  35. package/dist/assets/static/images/logo-gradient.svg +13 -0
  36. package/dist/assets/static/images/logo-outline.svg +7 -0
  37. package/dist/assets/static/images/logo.png +0 -0
  38. package/dist/assets/static/images/logo.svg +5 -0
  39. package/dist/basic-table.html +715 -0
  40. package/dist/blank.html +522 -0
  41. package/dist/buttons.html +467 -0
  42. package/dist/calendar.html +692 -0
  43. package/dist/charts.html +681 -0
  44. package/dist/chat.html +730 -0
  45. package/dist/compose.html +643 -0
  46. package/dist/datatable.html +1009 -0
  47. package/dist/eda8b94308c6f538f04a.ttf +0 -0
  48. package/dist/email.html +992 -0
  49. package/dist/f691f37e57f04c152e23.woff +0 -0
  50. package/dist/forms.html +760 -0
  51. package/dist/google-maps.html +530 -0
  52. package/dist/index.html +1090 -0
  53. package/dist/main.js +61239 -0
  54. package/dist/main.js.map +1 -0
  55. package/dist/signin.html +107 -0
  56. package/dist/signup.html +104 -0
  57. package/dist/test.html +91 -0
  58. package/dist/ui.html +931 -0
  59. package/dist/vector-maps.html +529 -0
  60. package/package.json +112 -0
  61. package/src/404.html +24 -0
  62. package/src/500.html +24 -0
  63. package/src/assets/scripts/app.js +644 -0
  64. package/src/assets/scripts/charts/chartJS/index.js +148 -0
  65. package/src/assets/scripts/charts/easyPieChart/index.js +200 -0
  66. package/src/assets/scripts/charts/index.js +3 -0
  67. package/src/assets/scripts/charts/sparkline/index.js +208 -0
  68. package/src/assets/scripts/chat/index.js +11 -0
  69. package/src/assets/scripts/components/Chart.js +1390 -0
  70. package/src/assets/scripts/components/Sidebar.js +241 -0
  71. package/src/assets/scripts/constants/colors.js +274 -0
  72. package/src/assets/scripts/datatable/index.js +379 -0
  73. package/src/assets/scripts/datepicker/index.js +302 -0
  74. package/src/assets/scripts/email/index.js +25 -0
  75. package/src/assets/scripts/fullcalendar/index.js +86 -0
  76. package/src/assets/scripts/googleMaps/index.js +93 -0
  77. package/src/assets/scripts/index.js +18 -0
  78. package/src/assets/scripts/masonry/index.js +14 -0
  79. package/src/assets/scripts/popover/index.js +109 -0
  80. package/src/assets/scripts/scrollbar/index.js +10 -0
  81. package/src/assets/scripts/search/index.js +15 -0
  82. package/src/assets/scripts/sidebar/index.js +140 -0
  83. package/src/assets/scripts/skycons/index.js +52 -0
  84. package/src/assets/scripts/ui/index.js +412 -0
  85. package/src/assets/scripts/utils/date.js +242 -0
  86. package/src/assets/scripts/utils/dom.js +349 -0
  87. package/src/assets/scripts/utils/index.js +45 -0
  88. package/src/assets/scripts/utils/theme.js +105 -0
  89. package/src/assets/scripts/vectorMaps/index.js +277 -0
  90. package/src/assets/static/fonts/icons/fontawesome/FontAwesome.otf +0 -0
  91. package/src/assets/static/fonts/icons/fontawesome/fontawesome-webfont.eot +0 -0
  92. package/src/assets/static/fonts/icons/fontawesome/fontawesome-webfont.svg +2671 -0
  93. package/src/assets/static/fonts/icons/fontawesome/fontawesome-webfont.ttf +0 -0
  94. package/src/assets/static/fonts/icons/fontawesome/fontawesome-webfont.woff +0 -0
  95. package/src/assets/static/fonts/icons/fontawesome/fontawesome-webfont.woff2 +0 -0
  96. package/src/assets/static/fonts/icons/themify/themify.eot +0 -0
  97. package/src/assets/static/fonts/icons/themify/themify.svg +362 -0
  98. package/src/assets/static/fonts/icons/themify/themify.ttf +0 -0
  99. package/src/assets/static/fonts/icons/themify/themify.woff +0 -0
  100. package/src/assets/static/images/404.png +0 -0
  101. package/src/assets/static/images/500.png +0 -0
  102. package/src/assets/static/images/bg.jpg +0 -0
  103. package/src/assets/static/images/datatables/sort_asc.png +0 -0
  104. package/src/assets/static/images/datatables/sort_asc_disabled.png +0 -0
  105. package/src/assets/static/images/datatables/sort_both.png +0 -0
  106. package/src/assets/static/images/datatables/sort_desc.png +0 -0
  107. package/src/assets/static/images/datatables/sort_desc_disabled.png +0 -0
  108. package/src/assets/static/images/logo-circle.svg +7 -0
  109. package/src/assets/static/images/logo-gradient.svg +13 -0
  110. package/src/assets/static/images/logo-outline.svg +7 -0
  111. package/src/assets/static/images/logo.png +0 -0
  112. package/src/assets/static/images/logo.svg +5 -0
  113. package/src/assets/styles/index.scss +801 -0
  114. package/src/assets/styles/spec/components/easyPieChart.scss +11 -0
  115. package/src/assets/styles/spec/components/footer.scss +4 -0
  116. package/src/assets/styles/spec/components/forms.scss +288 -0
  117. package/src/assets/styles/spec/components/index.scss +9 -0
  118. package/src/assets/styles/spec/components/loader.scss +46 -0
  119. package/src/assets/styles/spec/components/masonry.scss +1 -0
  120. package/src/assets/styles/spec/components/pageContainer.scss +255 -0
  121. package/src/assets/styles/spec/components/progressBar.scss +6 -0
  122. package/src/assets/styles/spec/components/sidebar.scss +642 -0
  123. package/src/assets/styles/spec/components/topbar.scss +455 -0
  124. package/src/assets/styles/spec/generic/base.scss +102 -0
  125. package/src/assets/styles/spec/generic/index.scss +1 -0
  126. package/src/assets/styles/spec/index.scss +4 -0
  127. package/src/assets/styles/spec/screens/chat.scss +147 -0
  128. package/src/assets/styles/spec/screens/email.scss +108 -0
  129. package/src/assets/styles/spec/screens/index.scss +2 -0
  130. package/src/assets/styles/spec/settings/baseColors.scss +103 -0
  131. package/src/assets/styles/spec/settings/borders.scss +6 -0
  132. package/src/assets/styles/spec/settings/breakpoints.scss +26 -0
  133. package/src/assets/styles/spec/settings/fonts.scss +4 -0
  134. package/src/assets/styles/spec/settings/index.scss +4 -0
  135. package/src/assets/styles/spec/settings/materialColors.scss +550 -0
  136. package/src/assets/styles/spec/tools/index.scss +1 -0
  137. package/src/assets/styles/spec/tools/mixins/clearfix.scss +15 -0
  138. package/src/assets/styles/spec/tools/mixins/index.scss +3 -0
  139. package/src/assets/styles/spec/tools/mixins/mediaQueriesRanges.scss +58 -0
  140. package/src/assets/styles/spec/tools/mixins/placeholder.scss +10 -0
  141. package/src/assets/styles/spec/utils/colors.scss +33 -0
  142. package/src/assets/styles/spec/utils/index.scss +2 -0
  143. package/src/assets/styles/spec/utils/layout/helpers/border.scss +78 -0
  144. package/src/assets/styles/spec/utils/layout/helpers/flex.scss +220 -0
  145. package/src/assets/styles/spec/utils/layout/helpers/index.scss +11 -0
  146. package/src/assets/styles/spec/utils/layout/helpers/layout.scss +137 -0
  147. package/src/assets/styles/spec/utils/layout/helpers/lists.scss +23 -0
  148. package/src/assets/styles/spec/utils/layout/helpers/margin.scss +266 -0
  149. package/src/assets/styles/spec/utils/layout/helpers/objects.scss +91 -0
  150. package/src/assets/styles/spec/utils/layout/helpers/padding.scss +147 -0
  151. package/src/assets/styles/spec/utils/layout/helpers/positions.scss +118 -0
  152. package/src/assets/styles/spec/utils/layout/helpers/pseudo.scss +6 -0
  153. package/src/assets/styles/spec/utils/layout/helpers/sizes.scss +157 -0
  154. package/src/assets/styles/spec/utils/layout/helpers/typography.scss +127 -0
  155. package/src/assets/styles/spec/utils/layout/index.scss +3 -0
  156. package/src/assets/styles/spec/utils/layout/mixins/generateResponsive.scss +25 -0
  157. package/src/assets/styles/spec/utils/layout/mixins/index.scss +2 -0
  158. package/src/assets/styles/spec/utils/layout/mixins/mediaQueryCondition.scss +28 -0
  159. package/src/assets/styles/spec/utils/layout/utils/center.scss +54 -0
  160. package/src/assets/styles/spec/utils/layout/utils/gap.scss +229 -0
  161. package/src/assets/styles/spec/utils/layout/utils/index.scss +5 -0
  162. package/src/assets/styles/spec/utils/layout/utils/layers.scss +5 -0
  163. package/src/assets/styles/spec/utils/layout/utils/peers.scss +35 -0
  164. package/src/assets/styles/utils/mobile.scss +954 -0
  165. package/src/assets/styles/utils/theme.css +97 -0
  166. package/src/assets/styles/vendor/datepicker.scss +183 -0
  167. package/src/assets/styles/vendor/font-awesome.css +2337 -0
  168. package/src/assets/styles/vendor/fullcalendar.scss +217 -0
  169. package/src/assets/styles/vendor/index.scss +8 -0
  170. package/src/assets/styles/vendor/jquery.datatables.scss +162 -0
  171. package/src/assets/styles/vendor/perfectScrollbar.scss +4 -0
  172. package/src/assets/styles/vendor/sparkline.scss +6 -0
  173. package/src/assets/styles/vendor/themify-icons.css +1081 -0
  174. package/src/basic-table.html +725 -0
  175. package/src/blank.html +532 -0
  176. package/src/buttons.html +477 -0
  177. package/src/calendar.html +702 -0
  178. package/src/charts.html +691 -0
  179. package/src/chat.html +740 -0
  180. package/src/compose.html +653 -0
  181. package/src/datatable.html +1019 -0
  182. package/src/email.html +1002 -0
  183. package/src/forms.html +770 -0
  184. package/src/google-maps.html +540 -0
  185. package/src/index.html +1100 -0
  186. package/src/signin.html +107 -0
  187. package/src/signup.html +104 -0
  188. package/src/test.html +96 -0
  189. package/src/ui.html +941 -0
  190. package/src/vector-maps.html +539 -0
  191. package/webpack.config.js +3 -0
@@ -0,0 +1,349 @@
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;
@@ -0,0 +1,45 @@
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
+ }());
@@ -0,0 +1,105 @@
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
+ window.dispatchEvent(new CustomEvent('adminator:themeChanged', { detail: { theme } }));
45
+ },
46
+ toggle() {
47
+ const next = this.current() === 'dark' ? 'light' : 'dark';
48
+ this.apply(next);
49
+ },
50
+ current() {
51
+ try {
52
+ return localStorage.getItem(THEME_KEY) || 'light';
53
+ } catch (_) {
54
+ return 'light';
55
+ }
56
+ },
57
+ init() {
58
+ // Detect OS preference first time
59
+ if (!localStorage.getItem(THEME_KEY)) {
60
+ const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
61
+ this.apply(prefersDark ? 'dark' : 'light');
62
+ } else {
63
+ this.apply(this.current());
64
+ }
65
+ },
66
+ getCSSVar(varName) {
67
+ return getComputedStyle(document.documentElement).getPropertyValue(varName).trim();
68
+ },
69
+ getVectorMapColors() {
70
+ return {
71
+ backgroundColor: this.getCSSVar('--vmap-bg-color'),
72
+ borderColor: this.getCSSVar('--vmap-border-color'),
73
+ regionColor: this.getCSSVar('--vmap-region-color'),
74
+ markerFill: this.getCSSVar('--vmap-marker-fill'),
75
+ markerStroke: this.getCSSVar('--vmap-marker-stroke'),
76
+ hoverColor: this.getCSSVar('--vmap-hover-color'),
77
+ selectedColor: this.getCSSVar('--vmap-selected-color'),
78
+ scaleStart: this.getCSSVar('--vmap-scale-start'),
79
+ scaleEnd: this.getCSSVar('--vmap-scale-end'),
80
+ scaleLight: this.getCSSVar('--vmap-scale-light'),
81
+ scaleDark: this.getCSSVar('--vmap-scale-dark'),
82
+ };
83
+ },
84
+ getSparklineColors() {
85
+ return {
86
+ success: this.getCSSVar('--sparkline-success'),
87
+ purple: this.getCSSVar('--sparkline-purple'),
88
+ info: this.getCSSVar('--sparkline-info'),
89
+ danger: this.getCSSVar('--sparkline-danger'),
90
+ light: this.getCSSVar('--sparkline-light'),
91
+ };
92
+ },
93
+ getChartColors() {
94
+ const isDark = this.current() === 'dark';
95
+ return {
96
+ textColor: isDark ? '#FFFFFF' : '#212529',
97
+ mutedColor: isDark ? '#D1D5DB' : '#6C757D',
98
+ borderColor: isDark ? '#374151' : '#E2E5E8',
99
+ gridColor: isDark ? 'rgba(209, 213, 219, 0.15)' : 'rgba(0, 0, 0, 0.05)',
100
+ tooltipBg: isDark ? '#1F2937' : 'rgba(255, 255, 255, 0.95)',
101
+ };
102
+ },
103
+ };
104
+
105
+ export default Theme;