@trebired/frontend 0.4.2 → 1.0.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 (223) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +112 -80
  3. package/dist/config/index.d.ts +6 -45
  4. package/dist/config/index.d.ts.map +1 -1
  5. package/dist/config/index.js +19 -252
  6. package/dist/config/index.js.map +1 -1
  7. package/dist/config/module.d.ts +5 -0
  8. package/dist/config/module.d.ts.map +1 -0
  9. package/dist/config/module.js +124 -0
  10. package/dist/config/module.js.map +1 -0
  11. package/dist/config/normalize.d.ts +9 -0
  12. package/dist/config/normalize.d.ts.map +1 -0
  13. package/dist/config/normalize.js +116 -0
  14. package/dist/config/normalize.js.map +1 -0
  15. package/dist/config/palette.d.ts +8 -0
  16. package/dist/config/palette.d.ts.map +1 -0
  17. package/dist/config/palette.js +104 -0
  18. package/dist/config/palette.js.map +1 -0
  19. package/dist/config/scales-css.d.ts +8 -0
  20. package/dist/config/scales-css.d.ts.map +1 -0
  21. package/dist/config/scales-css.js +99 -0
  22. package/dist/config/scales-css.js.map +1 -0
  23. package/dist/config/scales.d.ts +4 -0
  24. package/dist/config/scales.d.ts.map +1 -0
  25. package/dist/config/scales.js +55 -0
  26. package/dist/config/scales.js.map +1 -0
  27. package/dist/config/scss.d.ts +4 -0
  28. package/dist/config/scss.d.ts.map +1 -0
  29. package/dist/config/scss.js +134 -0
  30. package/dist/config/scss.js.map +1 -0
  31. package/dist/config/shared.d.ts +9 -0
  32. package/dist/config/shared.d.ts.map +1 -0
  33. package/dist/config/shared.js +27 -0
  34. package/dist/config/shared.js.map +1 -0
  35. package/dist/config/theme.d.ts +6 -0
  36. package/dist/config/theme.d.ts.map +1 -0
  37. package/dist/config/theme.js +133 -0
  38. package/dist/config/theme.js.map +1 -0
  39. package/dist/config/types.d.ts +127 -0
  40. package/dist/config/types.d.ts.map +1 -0
  41. package/dist/config/types.js +2 -0
  42. package/dist/config/types.js.map +1 -0
  43. package/dist/fullscreen/components/index.d.ts +20 -0
  44. package/dist/fullscreen/components/index.d.ts.map +1 -0
  45. package/dist/fullscreen/components/index.js +19 -0
  46. package/dist/fullscreen/components/index.js.map +1 -0
  47. package/dist/fullscreen/index.d.ts +24 -3
  48. package/dist/fullscreen/index.d.ts.map +1 -1
  49. package/dist/fullscreen/index.js +268 -7
  50. package/dist/fullscreen/index.js.map +1 -1
  51. package/dist/fullscreen/styles/index.scss +71 -0
  52. package/dist/index.d.ts +7 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +9 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/layout/components/index.d.ts +43 -0
  57. package/dist/layout/components/index.d.ts.map +1 -0
  58. package/dist/layout/components/index.js +53 -0
  59. package/dist/layout/components/index.js.map +1 -0
  60. package/dist/layout/index.d.ts +27 -0
  61. package/dist/layout/index.d.ts.map +1 -0
  62. package/dist/layout/index.js +80 -0
  63. package/dist/layout/index.js.map +1 -0
  64. package/dist/layout/styles/index.scss +137 -0
  65. package/dist/react/index.d.ts +14 -0
  66. package/dist/react/index.d.ts.map +1 -1
  67. package/dist/react/index.js +14 -0
  68. package/dist/react/index.js.map +1 -1
  69. package/dist/server/index.d.ts +5 -0
  70. package/dist/server/index.d.ts.map +1 -0
  71. package/dist/server/index.js +5 -0
  72. package/dist/server/index.js.map +1 -0
  73. package/dist/sidebar/components/index.d.ts +35 -0
  74. package/dist/sidebar/components/index.d.ts.map +1 -0
  75. package/dist/sidebar/components/index.js +49 -0
  76. package/dist/sidebar/components/index.js.map +1 -0
  77. package/dist/sidebar/index.d.ts +62 -0
  78. package/dist/sidebar/index.d.ts.map +1 -0
  79. package/dist/sidebar/index.js +247 -0
  80. package/dist/sidebar/index.js.map +1 -0
  81. package/dist/sidebar/styles/index.scss +205 -0
  82. package/dist/src/config/index.d.ts +6 -45
  83. package/dist/src/config/index.d.ts.map +1 -1
  84. package/dist/src/config/index.js +19 -252
  85. package/dist/src/config/index.js.map +1 -1
  86. package/dist/src/config/module.d.ts +5 -0
  87. package/dist/src/config/module.d.ts.map +1 -0
  88. package/dist/src/config/module.js +124 -0
  89. package/dist/src/config/module.js.map +1 -0
  90. package/dist/src/config/normalize.d.ts +9 -0
  91. package/dist/src/config/normalize.d.ts.map +1 -0
  92. package/dist/src/config/normalize.js +116 -0
  93. package/dist/src/config/normalize.js.map +1 -0
  94. package/dist/src/config/palette.d.ts +8 -0
  95. package/dist/src/config/palette.d.ts.map +1 -0
  96. package/dist/src/config/palette.js +104 -0
  97. package/dist/src/config/palette.js.map +1 -0
  98. package/dist/src/config/scales-css.d.ts +8 -0
  99. package/dist/src/config/scales-css.d.ts.map +1 -0
  100. package/dist/src/config/scales-css.js +99 -0
  101. package/dist/src/config/scales-css.js.map +1 -0
  102. package/dist/src/config/scales.d.ts +4 -0
  103. package/dist/src/config/scales.d.ts.map +1 -0
  104. package/dist/src/config/scales.js +55 -0
  105. package/dist/src/config/scales.js.map +1 -0
  106. package/dist/src/config/scss.d.ts +4 -0
  107. package/dist/src/config/scss.d.ts.map +1 -0
  108. package/dist/src/config/scss.js +134 -0
  109. package/dist/src/config/scss.js.map +1 -0
  110. package/dist/src/config/shared.d.ts +9 -0
  111. package/dist/src/config/shared.d.ts.map +1 -0
  112. package/dist/src/config/shared.js +27 -0
  113. package/dist/src/config/shared.js.map +1 -0
  114. package/dist/src/config/theme.d.ts +6 -0
  115. package/dist/src/config/theme.d.ts.map +1 -0
  116. package/dist/src/config/theme.js +133 -0
  117. package/dist/src/config/theme.js.map +1 -0
  118. package/dist/src/config/types.d.ts +127 -0
  119. package/dist/src/config/types.d.ts.map +1 -0
  120. package/dist/src/config/types.js +2 -0
  121. package/dist/src/config/types.js.map +1 -0
  122. package/dist/src/fullscreen/components/index.d.ts +20 -0
  123. package/dist/src/fullscreen/components/index.d.ts.map +1 -0
  124. package/dist/src/fullscreen/components/index.js +19 -0
  125. package/dist/src/fullscreen/components/index.js.map +1 -0
  126. package/dist/src/fullscreen/index.d.ts +24 -3
  127. package/dist/src/fullscreen/index.d.ts.map +1 -1
  128. package/dist/src/fullscreen/index.js +268 -7
  129. package/dist/src/fullscreen/index.js.map +1 -1
  130. package/dist/src/index.d.ts +7 -1
  131. package/dist/src/index.d.ts.map +1 -1
  132. package/dist/src/index.js +9 -1
  133. package/dist/src/index.js.map +1 -1
  134. package/dist/src/layout/components/index.d.ts +43 -0
  135. package/dist/src/layout/components/index.d.ts.map +1 -0
  136. package/dist/src/layout/components/index.js +53 -0
  137. package/dist/src/layout/components/index.js.map +1 -0
  138. package/dist/src/layout/index.d.ts +27 -0
  139. package/dist/src/layout/index.d.ts.map +1 -0
  140. package/dist/src/layout/index.js +80 -0
  141. package/dist/src/layout/index.js.map +1 -0
  142. package/dist/src/react/index.d.ts +14 -0
  143. package/dist/src/react/index.d.ts.map +1 -1
  144. package/dist/src/react/index.js +14 -0
  145. package/dist/src/react/index.js.map +1 -1
  146. package/dist/src/server/index.d.ts +5 -0
  147. package/dist/src/server/index.d.ts.map +1 -0
  148. package/dist/src/server/index.js +5 -0
  149. package/dist/src/server/index.js.map +1 -0
  150. package/dist/src/sidebar/components/index.d.ts +35 -0
  151. package/dist/src/sidebar/components/index.d.ts.map +1 -0
  152. package/dist/src/sidebar/components/index.js +49 -0
  153. package/dist/src/sidebar/components/index.js.map +1 -0
  154. package/dist/src/sidebar/index.d.ts +62 -0
  155. package/dist/src/sidebar/index.d.ts.map +1 -0
  156. package/dist/src/sidebar/index.js +247 -0
  157. package/dist/src/sidebar/index.js.map +1 -0
  158. package/dist/src/theme/apply.d.ts +26 -0
  159. package/dist/src/theme/apply.d.ts.map +1 -0
  160. package/dist/src/theme/apply.js +85 -0
  161. package/dist/src/theme/apply.js.map +1 -0
  162. package/dist/src/theme/boot.d.ts +4 -0
  163. package/dist/src/theme/boot.d.ts.map +1 -0
  164. package/dist/src/theme/boot.js +23 -0
  165. package/dist/src/theme/boot.js.map +1 -0
  166. package/dist/src/theme/components/index.d.ts +13 -5
  167. package/dist/src/theme/components/index.d.ts.map +1 -1
  168. package/dist/src/theme/components/index.js +22 -6
  169. package/dist/src/theme/components/index.js.map +1 -1
  170. package/dist/src/theme/constants.d.ts +12 -0
  171. package/dist/src/theme/constants.d.ts.map +1 -0
  172. package/dist/src/theme/constants.js +12 -0
  173. package/dist/src/theme/constants.js.map +1 -0
  174. package/dist/src/theme/controls.d.ts +15 -0
  175. package/dist/src/theme/controls.d.ts.map +1 -0
  176. package/dist/src/theme/controls.js +128 -0
  177. package/dist/src/theme/controls.js.map +1 -0
  178. package/dist/src/theme/index.d.ts +10 -24
  179. package/dist/src/theme/index.d.ts.map +1 -1
  180. package/dist/src/theme/index.js +15 -117
  181. package/dist/src/theme/index.js.map +1 -1
  182. package/dist/src/theme/modes.d.ts +36 -0
  183. package/dist/src/theme/modes.d.ts.map +1 -0
  184. package/dist/src/theme/modes.js +107 -0
  185. package/dist/src/theme/modes.js.map +1 -0
  186. package/dist/styles/utils.scss +193 -0
  187. package/dist/theme/apply.d.ts +26 -0
  188. package/dist/theme/apply.d.ts.map +1 -0
  189. package/dist/theme/apply.js +85 -0
  190. package/dist/theme/apply.js.map +1 -0
  191. package/dist/theme/boot.d.ts +4 -0
  192. package/dist/theme/boot.d.ts.map +1 -0
  193. package/dist/theme/boot.js +23 -0
  194. package/dist/theme/boot.js.map +1 -0
  195. package/dist/theme/components/index.d.ts +13 -5
  196. package/dist/theme/components/index.d.ts.map +1 -1
  197. package/dist/theme/components/index.js +22 -6
  198. package/dist/theme/components/index.js.map +1 -1
  199. package/dist/theme/constants.d.ts +12 -0
  200. package/dist/theme/constants.d.ts.map +1 -0
  201. package/dist/theme/constants.js +12 -0
  202. package/dist/theme/constants.js.map +1 -0
  203. package/dist/theme/controls.d.ts +15 -0
  204. package/dist/theme/controls.d.ts.map +1 -0
  205. package/dist/theme/controls.js +128 -0
  206. package/dist/theme/controls.js.map +1 -0
  207. package/dist/theme/index.d.ts +10 -24
  208. package/dist/theme/index.d.ts.map +1 -1
  209. package/dist/theme/index.js +15 -117
  210. package/dist/theme/index.js.map +1 -1
  211. package/dist/theme/modes.d.ts +36 -0
  212. package/dist/theme/modes.d.ts.map +1 -0
  213. package/dist/theme/modes.js +107 -0
  214. package/dist/theme/modes.js.map +1 -0
  215. package/package.json +4 -167
  216. package/dist/src/styles/index.d.ts +0 -3
  217. package/dist/src/styles/index.d.ts.map +0 -1
  218. package/dist/src/styles/index.js +0 -15
  219. package/dist/src/styles/index.js.map +0 -1
  220. package/dist/styles/index.d.ts +0 -3
  221. package/dist/styles/index.d.ts.map +0 -1
  222. package/dist/styles/index.js +0 -15
  223. package/dist/styles/index.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ const THEME_ATTR = "data-tbf-theme";
2
+ const THEME_BOUND_ATTR = "data-tbf-theme-bound";
3
+ const THEME_CURRENT_ATTR = "data-tbf-theme-current";
4
+ const THEME_VALUE_ATTR = "data-tbf-theme-value";
5
+ const THEME_CHANGE_EVENT = "tbf:themechange";
6
+ const THEME_MODES_GLOBAL_KEY = "tbf.frontend.theme.modes";
7
+ const THEME_TOGGLE_SELECTOR = "[data-tbf-theme-button]";
8
+ const THEME_SELECT_SELECTOR = "[data-tbf-theme-select]";
9
+ const THEME_OPTION_SELECTOR = "[data-tbf-theme-value]";
10
+ const THEME_LABEL_SELECTOR = "[data-tbf-theme-label]";
11
+ export { THEME_ATTR, THEME_BOUND_ATTR, THEME_CHANGE_EVENT, THEME_CURRENT_ATTR, THEME_LABEL_SELECTOR, THEME_MODES_GLOBAL_KEY, THEME_OPTION_SELECTOR, THEME_SELECT_SELECTOR, THEME_TOGGLE_SELECTOR, THEME_VALUE_ATTR, };
12
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/theme/constants.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC;AACpC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAChD,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AACpD,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAChD,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAC7C,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAC1D,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AACxD,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AACxD,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AACvD,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAEtD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,GACjB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type BindRoot } from "../dom/index.d.ts";
2
+ import type { ThemeRuntimeOptions } from "./apply.js";
3
+ declare const THEME_ACTIVE_ATTR = "data-tbf-theme-active";
4
+ declare function syncThemeToggle(button: HTMLElement, options?: ThemeRuntimeOptions): void;
5
+ declare function syncThemeSelect(element: HTMLElement, options?: ThemeRuntimeOptions): void;
6
+ declare function syncThemeToggles(root?: BindRoot, options?: ThemeRuntimeOptions): void;
7
+ declare function syncThemeSelects(root?: BindRoot, options?: ThemeRuntimeOptions): void;
8
+ declare function syncThemeControls(root?: BindRoot, options?: ThemeRuntimeOptions): void;
9
+ declare function bindThemeToggle(button: HTMLElement | null, options?: ThemeRuntimeOptions): boolean;
10
+ declare function bindThemeSelect(element: HTMLElement | null, options?: ThemeRuntimeOptions): boolean;
11
+ declare function bindThemeToggles(root?: BindRoot, options?: ThemeRuntimeOptions): void;
12
+ declare function bindThemeSelects(root?: BindRoot, options?: ThemeRuntimeOptions): void;
13
+ declare function bindThemeControls(root?: BindRoot, options?: ThemeRuntimeOptions): void;
14
+ export { THEME_ACTIVE_ATTR, bindThemeControls, bindThemeSelect, bindThemeSelects, bindThemeToggle, bindThemeToggles, syncThemeControls, syncThemeSelect, syncThemeSelects, syncThemeToggle, syncThemeToggles, };
15
+ //# sourceMappingURL=controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../../src/theme/controls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAWxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,QAAA,MAAM,iBAAiB,0BAA0B,CAAC;AAmBlD,iBAAS,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAarF;AAYD,iBAAS,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAUtF;AAED,iBAAS,gBAAgB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAE5F;AAED,iBAAS,gBAAgB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAE5F;AAED,iBAAS,iBAAiB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAG7F;AASD,iBAAS,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAS/F;AASD,iBAAS,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAahG;AAED,iBAAS,gBAAgB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAI5F;AAED,iBAAS,gBAAgB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAI5F;AAED,iBAAS,iBAAiB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAG7F;AAED,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,CAAC"}
@@ -0,0 +1,128 @@
1
+ import { queryAll } from "../dom/index.js";
2
+ import { THEME_BOUND_ATTR, THEME_CURRENT_ATTR, THEME_LABEL_SELECTOR, THEME_OPTION_SELECTOR, THEME_SELECT_SELECTOR, THEME_TOGGLE_SELECTOR, THEME_VALUE_ATTR, } from "./constants.js";
3
+ import { getEffectiveTheme, nextTheme, registerThemeSync, setTheme } from "./apply.js";
4
+ import { configureThemeModes, findThemeMode, getThemeModes, hasThemeModeOptions, themeModeKeyOf } from "./modes.js";
5
+ const THEME_ACTIVE_ATTR = "data-tbf-theme-active";
6
+ let themeSyncRegistered = false;
7
+ function ensureThemeSync() {
8
+ if (themeSyncRegistered)
9
+ return;
10
+ themeSyncRegistered = true;
11
+ registerThemeSync((root) => syncThemeControls(root));
12
+ }
13
+ /* Controls sync against the registered modes, so a caller-supplied list has to become the registry. */
14
+ function adoptThemeModes(options) {
15
+ if (hasThemeModeOptions(options))
16
+ configureThemeModes(options);
17
+ }
18
+ function isTag(element, tagName) {
19
+ return element.tagName.toLowerCase() === tagName;
20
+ }
21
+ function syncThemeToggle(button, options = {}) {
22
+ const registry = getThemeModes(options);
23
+ const key = getEffectiveTheme(undefined, options);
24
+ const label = button.getAttribute(`data-tbf-theme-${key}-label`) || "";
25
+ if (registry.modes.length === 2) {
26
+ button.setAttribute("aria-pressed", key === registry.dark ? "true" : "false");
27
+ }
28
+ else {
29
+ button.removeAttribute("aria-pressed");
30
+ }
31
+ button.setAttribute(THEME_CURRENT_ATTR, key);
32
+ if (label)
33
+ button.setAttribute("aria-label", label);
34
+ const text = button.querySelector(THEME_LABEL_SELECTOR);
35
+ if (text)
36
+ text.textContent = label || findThemeMode(key, options)?.label || key;
37
+ }
38
+ function syncThemeOption(option, active) {
39
+ option.setAttribute(THEME_ACTIVE_ATTR, active ? "true" : "false");
40
+ if (isTag(option, "input")) {
41
+ option.checked = active;
42
+ return;
43
+ }
44
+ if (option.getAttribute("role") === "radio")
45
+ option.setAttribute("aria-checked", active ? "true" : "false");
46
+ else
47
+ option.setAttribute("aria-pressed", active ? "true" : "false");
48
+ }
49
+ function syncThemeSelect(element, options = {}) {
50
+ const key = getEffectiveTheme(undefined, options);
51
+ element.setAttribute(THEME_CURRENT_ATTR, key);
52
+ if (isTag(element, "select")) {
53
+ element.value = key;
54
+ return;
55
+ }
56
+ queryAll(element, THEME_OPTION_SELECTOR).forEach((option) => {
57
+ syncThemeOption(option, themeModeKeyOf(option.getAttribute(THEME_VALUE_ATTR)) === key);
58
+ });
59
+ }
60
+ function syncThemeToggles(root = document, options = {}) {
61
+ queryAll(root, THEME_TOGGLE_SELECTOR).forEach((button) => syncThemeToggle(button, options));
62
+ }
63
+ function syncThemeSelects(root = document, options = {}) {
64
+ queryAll(root, THEME_SELECT_SELECTOR).forEach((element) => syncThemeSelect(element, options));
65
+ }
66
+ function syncThemeControls(root = document, options = {}) {
67
+ syncThemeToggles(root, options);
68
+ syncThemeSelects(root, options);
69
+ }
70
+ function claimThemeControl(element) {
71
+ if (!(element instanceof HTMLElement) || element.hasAttribute(THEME_BOUND_ATTR))
72
+ return false;
73
+ ensureThemeSync();
74
+ element.setAttribute(THEME_BOUND_ATTR, "true");
75
+ return true;
76
+ }
77
+ function bindThemeToggle(button, options = {}) {
78
+ adoptThemeModes(options);
79
+ if (!claimThemeControl(button))
80
+ return false;
81
+ button.addEventListener("click", async (event) => {
82
+ event.preventDefault();
83
+ await setTheme(nextTheme(options), options);
84
+ });
85
+ syncThemeToggle(button, options);
86
+ return true;
87
+ }
88
+ function resolveOptionValue(element, event) {
89
+ if (isTag(element, "select"))
90
+ return element.value;
91
+ const target = event.target;
92
+ const option = target instanceof Element ? target.closest(THEME_OPTION_SELECTOR) : null;
93
+ return option ? option.getAttribute(THEME_VALUE_ATTR) || "" : "";
94
+ }
95
+ function bindThemeSelect(element, options = {}) {
96
+ adoptThemeModes(options);
97
+ if (!claimThemeControl(element))
98
+ return false;
99
+ const handle = async (event) => {
100
+ const value = resolveOptionValue(element, event);
101
+ if (!value)
102
+ return;
103
+ if (event.type === "click")
104
+ event.preventDefault();
105
+ await setTheme(value, options);
106
+ };
107
+ element.addEventListener("change", handle);
108
+ if (!isTag(element, "select"))
109
+ element.addEventListener("click", handle);
110
+ syncThemeSelect(element, options);
111
+ return true;
112
+ }
113
+ function bindThemeToggles(root = document, options = {}) {
114
+ queryAll(root, THEME_TOGGLE_SELECTOR).forEach((button) => {
115
+ bindThemeToggle(button, options);
116
+ });
117
+ }
118
+ function bindThemeSelects(root = document, options = {}) {
119
+ queryAll(root, THEME_SELECT_SELECTOR).forEach((element) => {
120
+ bindThemeSelect(element, options);
121
+ });
122
+ }
123
+ function bindThemeControls(root = document, options = {}) {
124
+ bindThemeToggles(root, options);
125
+ bindThemeSelects(root, options);
126
+ }
127
+ export { THEME_ACTIVE_ATTR, bindThemeControls, bindThemeSelect, bindThemeSelects, bindThemeToggle, bindThemeToggles, syncThemeControls, syncThemeSelect, syncThemeSelects, syncThemeToggle, syncThemeToggles, };
128
+ //# sourceMappingURL=controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../src/theme/controls.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,12 @@
1
- import { type BindRoot } from "../dom/index.d.ts";
2
- type ThemeValue = "dark" | "light" | "";
3
- type ThemePersistenceAdapter = {
4
- get?: () => Promise<string | null | undefined> | string | null | undefined;
5
- set?: (theme: ThemeValue) => Promise<unknown> | unknown;
6
- };
7
- type ThemeRuntimeOptions = {
8
- defaultTheme?: ThemeValue;
9
- persistence?: ThemePersistenceAdapter;
10
- };
11
- declare const THEME_TOGGLE_SELECTOR = "[data-tbf-theme-button]";
12
- declare const THEME_ATTR = "data-tbf-theme";
13
- declare function normalizeTheme(value: unknown): ThemeValue;
14
- declare function systemThemeKey(): Exclude<ThemeValue, "">;
15
- declare function currentDomTheme(): ThemeValue;
16
- declare function getEffectiveTheme(value?: unknown): Exclude<ThemeValue, "">;
17
- declare function applyTheme(theme: ThemeValue): "dark" | "light";
18
- declare function setTheme(theme: ThemeValue, options?: ThemeRuntimeOptions): Promise<"dark" | "light">;
19
- declare function syncThemeToggles(root?: BindRoot): void;
20
- declare function bindThemeToggle(button: HTMLElement | null, options?: ThemeRuntimeOptions): boolean;
21
- declare function bindThemeToggles(root?: BindRoot, options?: ThemeRuntimeOptions): void;
1
+ import type { BindRoot } from "../dom/index.d.ts";
2
+ import type { ThemeRuntimeOptions } from "./apply.js";
22
3
  declare function bindThemeRuntime(root?: BindRoot, options?: ThemeRuntimeOptions): Promise<void>;
23
- declare function createThemeBootScript(theme?: ThemeValue): string;
24
- export { THEME_ATTR, THEME_TOGGLE_SELECTOR, applyTheme, bindThemeRuntime, bindThemeToggle, bindThemeToggles, createThemeBootScript, currentDomTheme, getEffectiveTheme, normalizeTheme, setTheme, syncThemeToggles, systemThemeKey, };
25
- export type { ThemePersistenceAdapter, ThemeRuntimeOptions, ThemeValue };
4
+ export { THEME_ATTR, THEME_CHANGE_EVENT, THEME_CURRENT_ATTR, THEME_OPTION_SELECTOR, THEME_SELECT_SELECTOR, THEME_TOGGLE_SELECTOR, THEME_VALUE_ATTR, } from "./constants.js";
5
+ export { DEFAULT_THEME_MODE_KEYS, DEFAULT_THEME_MODE_REGISTRY, configureThemeModes, findThemeMode, getThemeModes, hasThemeModeOptions, isThemeMode, normalizeThemeMode, normalizeThemeModeRegistry, themeModeKeys, } from "./modes.js";
6
+ export { applyTheme, currentDomTheme, getEffectiveTheme, nextTheme, normalizeTheme, registerThemeSync, setTheme, systemThemeKey, themeScheme, } from "./apply.js";
7
+ export { bindThemeControls, bindThemeSelect, bindThemeSelects, bindThemeToggle, bindThemeToggles, syncThemeControls, syncThemeSelect, syncThemeSelects, syncThemeToggle, syncThemeToggles, } from "./controls.js";
8
+ export { createThemeBootScript } from "./boot.js";
9
+ export { bindThemeRuntime };
10
+ export type { ThemeMode, ThemeModeDescriptor, ThemeModeInput, ThemeModeOptions, ThemeModeRegistry, ThemeModeScheme, } from "./modes.js";
11
+ export type { ThemePersistenceAdapter, ThemeRuntimeOptions, ThemeValue } from "./apply.js";
26
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAExD,KAAK,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,EAAE,CAAC;AACxC,KAAK,uBAAuB,GAAG;IAC7B,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3E,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACzD,CAAC;AACF,KAAK,mBAAmB,GAAG;IACzB,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC;AAEF,QAAA,MAAM,qBAAqB,4BAA4B,CAAC;AACxD,QAAA,MAAM,UAAU,mBAAmB,CAAC;AAEpC,iBAAS,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAGlD;AAED,iBAAS,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAQjD;AAED,iBAAS,eAAe,eAGvB;AAED,iBAAS,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAEnE;AAWD,iBAAS,UAAU,CAAC,KAAK,EAAE,UAAU,oBAWpC;AAWD,iBAAe,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,mBAAwB,6BAS3E;AAeD,iBAAS,gBAAgB,CAAC,IAAI,GAAE,QAAmB,QAElD;AAED,iBAAS,eAAe,CACtB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,GAAE,mBAAwB,WAYlC;AAED,iBAAS,gBAAgB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,mBAAwB,QAIrF;AAED,iBAAe,gBAAgB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,mBAAwB,iBAI3F;AAED,iBAAS,qBAAqB,CAAC,KAAK,GAAE,UAAe,UAWpD;AAED,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,cAAc,GACf,CAAC;AACF,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAItD,iBAAe,gBAAgB,CAC7B,IAAI,GAAE,QAAmB,EACzB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,0BAA0B,EAC1B,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,YAAY,EACV,SAAS,EACT,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -1,119 +1,17 @@
1
- import { queryAll } from "../dom/index.js";
2
- const THEME_TOGGLE_SELECTOR = "[data-tbf-theme-button]";
3
- const THEME_ATTR = "data-tbf-theme";
4
- function normalizeTheme(value) {
5
- const text = String(value || "").trim().toLowerCase();
6
- return text === "dark" || text === "light" ? text : "";
7
- }
8
- function systemThemeKey() {
9
- try {
10
- return window.matchMedia?.("(prefers-color-scheme: light)").matches
11
- ? "light"
12
- : "dark";
13
- }
14
- catch {
15
- return "dark";
16
- }
17
- }
18
- function currentDomTheme() {
19
- if (typeof document === "undefined")
20
- return "";
21
- return normalizeTheme(document.documentElement.getAttribute(THEME_ATTR));
22
- }
23
- function getEffectiveTheme(value) {
24
- return normalizeTheme(value) || currentDomTheme() || systemThemeKey();
25
- }
26
- function dispatchThemeChange(theme, themeKey) {
27
- if (typeof window === "undefined")
28
- return;
29
- window.dispatchEvent(new CustomEvent("tbf:themechange", {
30
- detail: { theme, themeKey },
31
- }));
32
- }
33
- function applyTheme(theme) {
34
- if (typeof document === "undefined")
35
- return getEffectiveTheme(theme);
36
- const normalized = normalizeTheme(theme);
37
- const next = normalized || systemThemeKey();
38
- const previous = currentDomTheme();
39
- document.documentElement.setAttribute(THEME_ATTR, next);
40
- document.documentElement.style.colorScheme = next;
41
- document.body?.setAttribute(THEME_ATTR, next);
42
- if (previous !== next)
43
- dispatchThemeChange(normalized, next);
44
- syncThemeToggles(document);
45
- return next;
46
- }
47
- async function readPersistedTheme(adapter) {
48
- if (!adapter?.get)
49
- return "";
50
- try {
51
- return normalizeTheme(await adapter.get());
52
- }
53
- catch {
54
- return "";
55
- }
56
- }
57
- async function setTheme(theme, options = {}) {
58
- const normalized = normalizeTheme(theme);
59
- applyTheme(normalized);
60
- if (options.persistence?.set) {
61
- try {
62
- await options.persistence.set(normalized);
63
- }
64
- catch { }
65
- }
66
- return getEffectiveTheme(normalized);
67
- }
68
- function nextTheme() {
69
- return getEffectiveTheme() === "light" ? "dark" : "light";
70
- }
71
- function syncThemeToggle(button) {
72
- const theme = getEffectiveTheme();
73
- button.setAttribute("aria-pressed", theme === "dark" ? "true" : "false");
74
- const label = button.getAttribute(`data-tbf-theme-${theme}-label`);
75
- if (label)
76
- button.setAttribute("aria-label", label);
77
- const text = button.querySelector("[data-tbf-theme-label]");
78
- if (text)
79
- text.textContent = label || theme;
80
- }
81
- function syncThemeToggles(root = document) {
82
- queryAll(root, THEME_TOGGLE_SELECTOR).forEach(syncThemeToggle);
83
- }
84
- function bindThemeToggle(button, options = {}) {
85
- if (!(button instanceof HTMLElement) || button.hasAttribute("data-tbf-theme-bound")) {
86
- return false;
87
- }
88
- button.setAttribute("data-tbf-theme-bound", "true");
89
- button.addEventListener("click", async (event) => {
90
- event.preventDefault();
91
- await setTheme(nextTheme(), options);
92
- });
93
- syncThemeToggle(button);
94
- return true;
95
- }
96
- function bindThemeToggles(root = document, options = {}) {
97
- queryAll(root, THEME_TOGGLE_SELECTOR).forEach((button) => {
98
- bindThemeToggle(button, options);
99
- });
100
- }
1
+ import { applyTheme, normalizeTheme, readPersistedTheme } from "./apply.js";
2
+ import { bindThemeControls } from "./controls.js";
3
+ import { configureThemeModes, hasThemeModeOptions } from "./modes.js";
101
4
  async function bindThemeRuntime(root = document, options = {}) {
102
- const persisted = await readPersistedTheme(options.persistence);
103
- applyTheme(persisted || normalizeTheme(options.defaultTheme));
104
- bindThemeToggles(root, options);
105
- }
106
- function createThemeBootScript(theme = "") {
107
- return [
108
- "(function(){",
109
- "function n(v){v=String(v||'').trim().toLowerCase();return v==='dark'||v==='light'?v:''}",
110
- "function s(){try{return window.matchMedia&&window.matchMedia('(prefers-color-scheme: light)').matches?'light':'dark'}catch{return 'dark'}}",
111
- `var t=n(${JSON.stringify(theme)});`,
112
- "var k=t||s();",
113
- "document.documentElement.setAttribute('data-tbf-theme',k);",
114
- "document.documentElement.style.colorScheme=k;",
115
- "})();",
116
- ].join("");
117
- }
118
- export { THEME_ATTR, THEME_TOGGLE_SELECTOR, applyTheme, bindThemeRuntime, bindThemeToggle, bindThemeToggles, createThemeBootScript, currentDomTheme, getEffectiveTheme, normalizeTheme, setTheme, syncThemeToggles, systemThemeKey, };
5
+ if (hasThemeModeOptions(options))
6
+ configureThemeModes(options);
7
+ const persisted = await readPersistedTheme(options.persistence, options);
8
+ applyTheme(persisted || normalizeTheme(options.defaultTheme, options), options);
9
+ bindThemeControls(root, options);
10
+ }
11
+ export { THEME_ATTR, THEME_CHANGE_EVENT, THEME_CURRENT_ATTR, THEME_OPTION_SELECTOR, THEME_SELECT_SELECTOR, THEME_TOGGLE_SELECTOR, THEME_VALUE_ATTR, } from "./constants.js";
12
+ export { DEFAULT_THEME_MODE_KEYS, DEFAULT_THEME_MODE_REGISTRY, configureThemeModes, findThemeMode, getThemeModes, hasThemeModeOptions, isThemeMode, normalizeThemeMode, normalizeThemeModeRegistry, themeModeKeys, } from "./modes.js";
13
+ export { applyTheme, currentDomTheme, getEffectiveTheme, nextTheme, normalizeTheme, registerThemeSync, setTheme, systemThemeKey, themeScheme, } from "./apply.js";
14
+ export { bindThemeControls, bindThemeSelect, bindThemeSelects, bindThemeToggle, bindThemeToggles, syncThemeControls, syncThemeSelect, syncThemeSelects, syncThemeToggle, syncThemeToggles, } from "./controls.js";
15
+ export { createThemeBootScript } from "./boot.js";
16
+ export { bindThemeRuntime };
119
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAiB,MAAM,eAAe,CAAC;AAYxD,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AACxD,MAAM,UAAU,GAAG,gBAAgB,CAAC;AAEpC,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC,+BAA+B,CAAC,CAAC,OAAO;YACjE,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,MAAM,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC/C,OAAO,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAe;IACxC,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,eAAe,EAAE,IAAI,cAAc,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAiB,EAAE,QAAiC;IAC/E,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,iBAAiB,EAAE;QACjC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;KAC5B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB;IACnC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,UAAU,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,IAAI;QAAE,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7D,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAiC;IACjE,IAAI,CAAC,OAAO,EAAE,GAAG;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,KAAiB,EAAE,UAA+B,EAAE;IAC1E,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,UAAU,CAAC,UAAU,CAAC,CAAC;IACvB,IAAI,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,iBAAiB,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB;IAC1C,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAClC,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC;IACnE,IAAI,KAAK;QAAE,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAC5D,IAAI,IAAI;QAAE,IAAI,CAAC,WAAW,GAAG,KAAK,IAAI,KAAK,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAiB,QAAQ;IACjD,QAAQ,CAAc,IAAI,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,eAAe,CACtB,MAA0B,EAC1B,UAA+B,EAAE;IAEjC,IAAI,CAAC,CAAC,MAAM,YAAY,WAAW,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACpF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,CAAC,YAAY,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC/C,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,QAAQ,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAiB,QAAQ,EAAE,UAA+B,EAAE;IACpF,QAAQ,CAAc,IAAI,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACpE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAiB,QAAQ,EAAE,UAA+B,EAAE;IAC1F,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAChE,UAAU,CAAC,SAAS,IAAI,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAoB,EAAE;IACnD,OAAO;QACL,cAAc;QACd,yFAAyF;QACzF,4IAA4I;QAC5I,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI;QACpC,eAAe;QACf,4DAA4D;QAC5D,+CAA+C;QAC/C,OAAO;KACR,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC;AAED,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,cAAc,GACf,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/theme/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtE,KAAK,UAAU,gBAAgB,CAC7B,OAAiB,QAAQ,EACzB,UAA+B,EAAE;IAEjC,IAAI,mBAAmB,CAAC,OAAO,CAAC;QAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACzE,UAAU,CAAC,SAAS,IAAI,cAAc,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAChF,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,0BAA0B,EAC1B,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,36 @@
1
+ type ThemeModeScheme = "dark" | "light";
2
+ type ThemeModeDescriptor = {
3
+ key: string;
4
+ label?: string;
5
+ scheme?: ThemeModeScheme;
6
+ };
7
+ type ThemeModeInput = string | ThemeModeDescriptor;
8
+ type ThemeMode = {
9
+ key: string;
10
+ label: string;
11
+ scheme: ThemeModeScheme;
12
+ };
13
+ type ThemeModeOptions = {
14
+ dark?: string;
15
+ light?: string;
16
+ modes?: readonly ThemeModeInput[];
17
+ };
18
+ type ThemeModeRegistry = {
19
+ dark: string;
20
+ light: string;
21
+ modes: readonly ThemeMode[];
22
+ };
23
+ declare const DEFAULT_THEME_MODE_KEYS: readonly string[];
24
+ declare function themeModeKeyOf(value: unknown): string;
25
+ declare function normalizeThemeMode(input: ThemeModeInput): ThemeMode | null;
26
+ declare function normalizeThemeModeRegistry(options?: ThemeModeOptions): ThemeModeRegistry;
27
+ declare const DEFAULT_THEME_MODE_REGISTRY: ThemeModeRegistry;
28
+ declare function configureThemeModes(options?: ThemeModeOptions | null): ThemeModeRegistry;
29
+ declare function hasThemeModeOptions(options?: ThemeModeOptions): boolean;
30
+ declare function getThemeModes(options?: ThemeModeOptions): ThemeModeRegistry;
31
+ declare function themeModeKeys(options?: ThemeModeOptions): string[];
32
+ declare function findThemeMode(key: unknown, options?: ThemeModeOptions): ThemeMode | undefined;
33
+ declare function isThemeMode(key: unknown, options?: ThemeModeOptions): boolean;
34
+ export { DEFAULT_THEME_MODE_KEYS, DEFAULT_THEME_MODE_REGISTRY, configureThemeModes, findThemeMode, getThemeModes, hasThemeModeOptions, isThemeMode, normalizeThemeMode, normalizeThemeModeRegistry, themeModeKeyOf, themeModeKeys, };
35
+ export type { ThemeMode, ThemeModeDescriptor, ThemeModeInput, ThemeModeOptions, ThemeModeRegistry, ThemeModeScheme, };
36
+ //# sourceMappingURL=modes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../../src/theme/modes.ts"],"names":[],"mappings":"AAEA,KAAK,eAAe,GAAG,MAAM,GAAG,OAAO,CAAC;AAExC,KAAK,mBAAmB,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF,KAAK,cAAc,GAAG,MAAM,GAAG,mBAAmB,CAAC;AAEnD,KAAK,SAAS,GAAG;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACnC,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7B,CAAC;AAEF,QAAA,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAAsB,CAAC;AAQrE,iBAAS,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG9C;AAeD,iBAAS,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CASnE;AAkBD,iBAAS,0BAA0B,CAAC,OAAO,GAAE,gBAAqB,GAAG,iBAAiB,CAOrF;AAED,QAAA,MAAM,2BAA2B,EAAE,iBAAgD,CAAC;AAYpF,iBAAS,mBAAmB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,iBAAiB,CAajF;AAED,iBAAS,mBAAmB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAEpE;AAED,iBAAS,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,iBAAiB,CAGxE;AAED,iBAAS,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,EAAE,CAE/D;AAED,iBAAS,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,GAAG,SAAS,CAK1F;AAED,iBAAS,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAE1E;AAED,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACd,aAAa,GACd,CAAC;AACF,YAAY,EACV,SAAS,EACT,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { THEME_MODES_GLOBAL_KEY } from "./constants.js";
2
+ const DEFAULT_THEME_MODE_KEYS = ["dark", "light"];
3
+ const THEME_MODE_KEY_RE = /^[a-z0-9][a-z0-9_-]*$/u;
4
+ const DARK_KEY_RE = /(^|[-_])dark([-_]|$)/u;
5
+ const registryHolderKey = Symbol.for(THEME_MODES_GLOBAL_KEY);
6
+ let cachedSource = null;
7
+ let cachedRegistry = null;
8
+ function themeModeKeyOf(value) {
9
+ const text = String(value ?? "").trim().toLowerCase();
10
+ return THEME_MODE_KEY_RE.test(text) ? text : "";
11
+ }
12
+ function themeModeLabelOf(key, label) {
13
+ const text = String(label ?? "").trim();
14
+ if (text)
15
+ return text;
16
+ const words = key.replace(/[-_]+/gu, " ").trim();
17
+ return words.charAt(0).toUpperCase() + words.slice(1);
18
+ }
19
+ function themeModeSchemeOf(key, scheme) {
20
+ const text = String(scheme ?? "").trim().toLowerCase();
21
+ if (text === "dark" || text === "light")
22
+ return text;
23
+ return DARK_KEY_RE.test(key) ? "dark" : "light";
24
+ }
25
+ function normalizeThemeMode(input) {
26
+ const source = typeof input === "string" ? { key: input } : input;
27
+ const key = themeModeKeyOf(source?.key);
28
+ if (!key)
29
+ return null;
30
+ return {
31
+ key,
32
+ label: themeModeLabelOf(key, source?.label),
33
+ scheme: themeModeSchemeOf(key, source?.scheme),
34
+ };
35
+ }
36
+ function normalizeThemeModes(inputs) {
37
+ const source = Array.isArray(inputs) && inputs.length ? inputs : DEFAULT_THEME_MODE_KEYS;
38
+ const modes = [];
39
+ for (const input of source) {
40
+ const mode = normalizeThemeMode(input);
41
+ if (mode && !modes.some((item) => item.key === mode.key))
42
+ modes.push(mode);
43
+ }
44
+ return modes.length ? modes : normalizeThemeModes(DEFAULT_THEME_MODE_KEYS);
45
+ }
46
+ function resolveSchemeKey(modes, requested, scheme) {
47
+ const key = themeModeKeyOf(requested);
48
+ if (key && modes.some((mode) => mode.key === key))
49
+ return key;
50
+ return (modes.find((mode) => mode.scheme === scheme) || modes[0]).key;
51
+ }
52
+ function normalizeThemeModeRegistry(options = {}) {
53
+ const modes = normalizeThemeModes(options.modes);
54
+ return {
55
+ dark: resolveSchemeKey(modes, options.dark, "dark"),
56
+ light: resolveSchemeKey(modes, options.light, "light"),
57
+ modes,
58
+ };
59
+ }
60
+ const DEFAULT_THEME_MODE_REGISTRY = normalizeThemeModeRegistry();
61
+ function readRegistryHolder() {
62
+ const holder = globalThis;
63
+ const source = holder[registryHolderKey];
64
+ if (!source || typeof source !== "object")
65
+ return null;
66
+ if (source === cachedSource && cachedRegistry)
67
+ return cachedRegistry;
68
+ cachedSource = source;
69
+ cachedRegistry = normalizeThemeModeRegistry(source);
70
+ return cachedRegistry;
71
+ }
72
+ function configureThemeModes(options) {
73
+ const holder = globalThis;
74
+ if (!options) {
75
+ delete holder[registryHolderKey];
76
+ cachedSource = null;
77
+ cachedRegistry = null;
78
+ return DEFAULT_THEME_MODE_REGISTRY;
79
+ }
80
+ const registry = normalizeThemeModeRegistry(options);
81
+ holder[registryHolderKey] = registry;
82
+ cachedSource = registry;
83
+ cachedRegistry = registry;
84
+ return registry;
85
+ }
86
+ function hasThemeModeOptions(options = {}) {
87
+ return Boolean(options.modes?.length || options.dark || options.light);
88
+ }
89
+ function getThemeModes(options = {}) {
90
+ if (hasThemeModeOptions(options))
91
+ return normalizeThemeModeRegistry(options);
92
+ return readRegistryHolder() || DEFAULT_THEME_MODE_REGISTRY;
93
+ }
94
+ function themeModeKeys(options = {}) {
95
+ return getThemeModes(options).modes.map((mode) => mode.key);
96
+ }
97
+ function findThemeMode(key, options = {}) {
98
+ const normalized = themeModeKeyOf(key);
99
+ return normalized
100
+ ? getThemeModes(options).modes.find((mode) => mode.key === normalized)
101
+ : undefined;
102
+ }
103
+ function isThemeMode(key, options = {}) {
104
+ return findThemeMode(key, options) !== undefined;
105
+ }
106
+ export { DEFAULT_THEME_MODE_KEYS, DEFAULT_THEME_MODE_REGISTRY, configureThemeModes, findThemeMode, getThemeModes, hasThemeModeOptions, isThemeMode, normalizeThemeMode, normalizeThemeModeRegistry, themeModeKeyOf, themeModeKeys, };
107
+ //# sourceMappingURL=modes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.js","sourceRoot":"","sources":["../../../src/theme/modes.ts"],"names":[],"mappings":"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"}