@lgtm-hq/turbo-themes 0.12.16

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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +231 -0
  3. package/assets/css/adapters/bulma.css +26 -0
  4. package/assets/css/themes/bulma-dark.css +90 -0
  5. package/assets/css/themes/bulma-light.css +90 -0
  6. package/assets/css/themes/catppuccin-frappe.css +58 -0
  7. package/assets/css/themes/catppuccin-latte.css +58 -0
  8. package/assets/css/themes/catppuccin-macchiato.css +58 -0
  9. package/assets/css/themes/catppuccin-mocha.css +58 -0
  10. package/assets/css/themes/dracula.css +90 -0
  11. package/assets/css/themes/github-dark.css +58 -0
  12. package/assets/css/themes/github-light.css +58 -0
  13. package/assets/css/turbo-core.css +92 -0
  14. package/dist/adapters/bootstrap/_utilities.scss +178 -0
  15. package/dist/adapters/bootstrap/_variables.scss +99 -0
  16. package/dist/adapters/tailwind/colors.js +133 -0
  17. package/dist/adapters/tailwind/preset.js +136 -0
  18. package/dist/index.d.ts +12 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +14 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/themes/bulma.d.ts +31 -0
  23. package/dist/themes/bulma.d.ts.map +1 -0
  24. package/dist/themes/bulma.js +160 -0
  25. package/dist/themes/bulma.js.map +1 -0
  26. package/dist/themes/css.d.ts +4 -0
  27. package/dist/themes/css.d.ts.map +1 -0
  28. package/dist/themes/css.js +617 -0
  29. package/dist/themes/css.js.map +1 -0
  30. package/dist/themes/packs/bulma.d.ts +12 -0
  31. package/dist/themes/packs/bulma.d.ts.map +1 -0
  32. package/dist/themes/packs/bulma.js +285 -0
  33. package/dist/themes/packs/bulma.js.map +1 -0
  34. package/dist/themes/packs/catppuccin.synced.d.ts +3 -0
  35. package/dist/themes/packs/catppuccin.synced.d.ts.map +1 -0
  36. package/dist/themes/packs/catppuccin.synced.js +340 -0
  37. package/dist/themes/packs/catppuccin.synced.js.map +1 -0
  38. package/dist/themes/packs/dracula.d.ts +8 -0
  39. package/dist/themes/packs/dracula.d.ts.map +1 -0
  40. package/dist/themes/packs/dracula.js +145 -0
  41. package/dist/themes/packs/dracula.js.map +1 -0
  42. package/dist/themes/packs/github.synced.d.ts +10 -0
  43. package/dist/themes/packs/github.synced.d.ts.map +1 -0
  44. package/dist/themes/packs/github.synced.js +281 -0
  45. package/dist/themes/packs/github.synced.js.map +1 -0
  46. package/dist/themes/registry.d.ts +3 -0
  47. package/dist/themes/registry.d.ts.map +1 -0
  48. package/dist/themes/registry.js +16 -0
  49. package/dist/themes/registry.js.map +1 -0
  50. package/dist/themes/types.d.ts +172 -0
  51. package/dist/themes/types.d.ts.map +1 -0
  52. package/dist/themes/types.js +4 -0
  53. package/dist/themes/types.js.map +1 -0
  54. package/dist/tokens/index.d.ts +8 -0
  55. package/dist/tokens/index.d.ts.map +1 -0
  56. package/dist/tokens/index.js +9 -0
  57. package/dist/tokens/index.js.map +1 -0
  58. package/dist/tokens/style-dictionary/bulma-dark.json +410 -0
  59. package/dist/tokens/style-dictionary/bulma-light.json +410 -0
  60. package/dist/tokens/style-dictionary/catppuccin-frappe.json +264 -0
  61. package/dist/tokens/style-dictionary/catppuccin-latte.json +264 -0
  62. package/dist/tokens/style-dictionary/catppuccin-macchiato.json +264 -0
  63. package/dist/tokens/style-dictionary/catppuccin-mocha.json +264 -0
  64. package/dist/tokens/style-dictionary/dracula.json +409 -0
  65. package/dist/tokens/style-dictionary/github-dark.json +264 -0
  66. package/dist/tokens/style-dictionary/github-light.json +264 -0
  67. package/dist/tokens/style-dictionary/themes.json +2526 -0
  68. package/dist/tokens/style-dictionary/tokens.json +1050 -0
  69. package/dist/tokens/tokens-typed.json +218 -0
  70. package/package.json +180 -0
  71. package/packages/adapters/bulma/dist/bulma-adapter.css +153 -0
  72. package/packages/adapters/bulma/dist/index.d.ts +60 -0
  73. package/packages/adapters/bulma/dist/index.d.ts.map +1 -0
  74. package/packages/adapters/bulma/dist/index.js +343 -0
  75. package/packages/adapters/bulma/dist/index.js.map +1 -0
  76. package/packages/adapters/tailwind/dist/colors.d.ts +32 -0
  77. package/packages/adapters/tailwind/dist/colors.d.ts.map +1 -0
  78. package/packages/adapters/tailwind/dist/colors.js +133 -0
  79. package/packages/adapters/tailwind/dist/colors.js.map +1 -0
  80. package/packages/adapters/tailwind/dist/preset.d.ts +117 -0
  81. package/packages/adapters/tailwind/dist/preset.d.ts.map +1 -0
  82. package/packages/adapters/tailwind/dist/preset.js +136 -0
  83. package/packages/adapters/tailwind/dist/preset.js.map +1 -0
  84. package/packages/adapters/tailwind/dist/tsconfig.tsbuildinfo +1 -0
  85. package/packages/css/dist/base.d.ts +27 -0
  86. package/packages/css/dist/base.d.ts.map +1 -0
  87. package/packages/css/dist/base.js +277 -0
  88. package/packages/css/dist/base.js.map +1 -0
  89. package/packages/css/dist/components/buttons.css +141 -0
  90. package/packages/css/dist/components/cards.css +157 -0
  91. package/packages/css/dist/components/forms.css +109 -0
  92. package/packages/css/dist/components/navigation.css +175 -0
  93. package/packages/css/dist/components/notifications.css +192 -0
  94. package/packages/css/dist/components/progress.css +113 -0
  95. package/packages/css/dist/components/sidebar.css +537 -0
  96. package/packages/css/dist/components/tables.css +157 -0
  97. package/packages/css/dist/components/tabs.css +106 -0
  98. package/packages/css/dist/components/tags.css +121 -0
  99. package/packages/css/dist/generator.d.ts +60 -0
  100. package/packages/css/dist/generator.d.ts.map +1 -0
  101. package/packages/css/dist/generator.js +267 -0
  102. package/packages/css/dist/generator.js.map +1 -0
  103. package/packages/css/dist/index.d.ts +13 -0
  104. package/packages/css/dist/index.d.ts.map +1 -0
  105. package/packages/css/dist/index.js +16 -0
  106. package/packages/css/dist/index.js.map +1 -0
  107. package/packages/css/dist/syntax.d.ts +29 -0
  108. package/packages/css/dist/syntax.d.ts.map +1 -0
  109. package/packages/css/dist/syntax.js +341 -0
  110. package/packages/css/dist/syntax.js.map +1 -0
  111. package/packages/css/dist/themes/bulma-dark.css +86 -0
  112. package/packages/css/dist/themes/bulma-light.css +86 -0
  113. package/packages/css/dist/themes/catppuccin-frappe.css +61 -0
  114. package/packages/css/dist/themes/catppuccin-latte.css +61 -0
  115. package/packages/css/dist/themes/catppuccin-macchiato.css +61 -0
  116. package/packages/css/dist/themes/catppuccin-mocha.css +61 -0
  117. package/packages/css/dist/themes/dracula.css +85 -0
  118. package/packages/css/dist/themes/github-dark.css +61 -0
  119. package/packages/css/dist/themes/github-light.css +61 -0
  120. package/packages/css/dist/turbo-base.css +246 -0
  121. package/packages/css/dist/turbo-components.css +1833 -0
  122. package/packages/css/dist/turbo-core.css +92 -0
  123. package/packages/css/dist/turbo-syntax.css +242 -0
  124. package/packages/css/dist/turbo.css +727 -0
  125. package/packages/theme-selector/dist/accessibility.d.ts +8 -0
  126. package/packages/theme-selector/dist/accessibility.d.ts.map +1 -0
  127. package/packages/theme-selector/dist/accessibility.js +19 -0
  128. package/packages/theme-selector/dist/accessibility.js.map +1 -0
  129. package/packages/theme-selector/dist/apply-theme.d.ts +12 -0
  130. package/packages/theme-selector/dist/apply-theme.d.ts.map +1 -0
  131. package/packages/theme-selector/dist/apply-theme.js +60 -0
  132. package/packages/theme-selector/dist/apply-theme.js.map +1 -0
  133. package/packages/theme-selector/dist/constants.d.ts +28 -0
  134. package/packages/theme-selector/dist/constants.d.ts.map +1 -0
  135. package/packages/theme-selector/dist/constants.js +29 -0
  136. package/packages/theme-selector/dist/constants.js.map +1 -0
  137. package/packages/theme-selector/dist/dropdown/events.d.ts +9 -0
  138. package/packages/theme-selector/dist/dropdown/events.d.ts.map +1 -0
  139. package/packages/theme-selector/dist/dropdown/events.js +120 -0
  140. package/packages/theme-selector/dist/dropdown/events.js.map +1 -0
  141. package/packages/theme-selector/dist/dropdown/helpers.d.ts +12 -0
  142. package/packages/theme-selector/dist/dropdown/helpers.d.ts.map +1 -0
  143. package/packages/theme-selector/dist/dropdown/helpers.js +25 -0
  144. package/packages/theme-selector/dist/dropdown/helpers.js.map +1 -0
  145. package/packages/theme-selector/dist/dropdown/state.d.ts +26 -0
  146. package/packages/theme-selector/dist/dropdown/state.d.ts.map +1 -0
  147. package/packages/theme-selector/dist/dropdown/state.js +50 -0
  148. package/packages/theme-selector/dist/dropdown/state.js.map +1 -0
  149. package/packages/theme-selector/dist/dropdown/ui.d.ts +46 -0
  150. package/packages/theme-selector/dist/dropdown/ui.d.ts.map +1 -0
  151. package/packages/theme-selector/dist/dropdown/ui.js +179 -0
  152. package/packages/theme-selector/dist/dropdown/ui.js.map +1 -0
  153. package/packages/theme-selector/dist/errors.d.ts +59 -0
  154. package/packages/theme-selector/dist/errors.d.ts.map +1 -0
  155. package/packages/theme-selector/dist/errors.js +127 -0
  156. package/packages/theme-selector/dist/errors.js.map +1 -0
  157. package/packages/theme-selector/dist/index.d.ts +25 -0
  158. package/packages/theme-selector/dist/index.d.ts.map +1 -0
  159. package/packages/theme-selector/dist/index.js +114 -0
  160. package/packages/theme-selector/dist/index.js.map +1 -0
  161. package/packages/theme-selector/dist/navbar.d.ts +13 -0
  162. package/packages/theme-selector/dist/navbar.d.ts.map +1 -0
  163. package/packages/theme-selector/dist/navbar.js +75 -0
  164. package/packages/theme-selector/dist/navbar.js.map +1 -0
  165. package/packages/theme-selector/dist/storage.d.ts +32 -0
  166. package/packages/theme-selector/dist/storage.d.ts.map +1 -0
  167. package/packages/theme-selector/dist/storage.js +100 -0
  168. package/packages/theme-selector/dist/storage.js.map +1 -0
  169. package/packages/theme-selector/dist/theme-loader.d.ts +37 -0
  170. package/packages/theme-selector/dist/theme-loader.d.ts.map +1 -0
  171. package/packages/theme-selector/dist/theme-loader.js +142 -0
  172. package/packages/theme-selector/dist/theme-loader.js.map +1 -0
  173. package/packages/theme-selector/dist/theme-mapper.d.ts +25 -0
  174. package/packages/theme-selector/dist/theme-mapper.d.ts.map +1 -0
  175. package/packages/theme-selector/dist/theme-mapper.js +99 -0
  176. package/packages/theme-selector/dist/theme-mapper.js.map +1 -0
  177. package/packages/theme-selector/dist/theme-resolver.d.ts +50 -0
  178. package/packages/theme-selector/dist/theme-resolver.d.ts.map +1 -0
  179. package/packages/theme-selector/dist/theme-resolver.js +84 -0
  180. package/packages/theme-selector/dist/theme-resolver.js.map +1 -0
  181. package/packages/theme-selector/dist/types.d.ts +7 -0
  182. package/packages/theme-selector/dist/types.d.ts.map +1 -0
  183. package/packages/theme-selector/dist/types.js +6 -0
  184. package/packages/theme-selector/dist/types.js.map +1 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Accessibility enhancements
3
+ */
4
+ /**
5
+ * Enhances accessibility for code blocks
6
+ */
7
+ export declare function enhanceAccessibility(documentObj: Document): void;
8
+ //# sourceMappingURL=accessibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../src/accessibility.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,QAAQ,GAAG,IAAI,CAMhE"}
@@ -0,0 +1,19 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Accessibility enhancements
4
+ */
5
+ import { DOM_SELECTORS } from './constants.js';
6
+ /**
7
+ * Enhances accessibility for code blocks
8
+ */
9
+ export function enhanceAccessibility(documentObj) {
10
+ documentObj.querySelectorAll(DOM_SELECTORS.HIGHLIGHT_PRE).forEach((pre) => {
11
+ if (!pre.hasAttribute('tabindex'))
12
+ pre.setAttribute('tabindex', '0');
13
+ if (!pre.hasAttribute('role'))
14
+ pre.setAttribute('role', 'region');
15
+ if (!pre.hasAttribute('aria-label'))
16
+ pre.setAttribute('aria-label', 'Code block');
17
+ });
18
+ }
19
+ //# sourceMappingURL=accessibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessibility.js","sourceRoot":"","sources":["../src/accessibility.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAqB;IACxD,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACxE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Theme application logic
3
+ */
4
+ /**
5
+ * Applies a theme to the document
6
+ */
7
+ export declare function applyTheme(doc: Document, themeId: string): Promise<void>;
8
+ /**
9
+ * Gets the current theme from classes or returns default
10
+ */
11
+ export declare function getCurrentTheme(doc: Document, defaultTheme: string): string;
12
+ //# sourceMappingURL=apply-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-theme.d.ts","sourceRoot":"","sources":["../src/apply-theme.ts"],"names":[],"mappings":"AACA;;GAEG;AAQH;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3E"}
@@ -0,0 +1,60 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Theme application logic
4
+ */
5
+ import { DOM_IDS, DOM_SELECTORS, THEME_FAMILIES } from './constants.js';
6
+ import { getBaseUrl, applyThemeClass, loadThemeCSS, resolveAssetPath, getCurrentThemeFromClasses } from './theme-loader.js';
7
+ import { setItemActiveState } from './dropdown/helpers.js';
8
+ import { ThemeErrors, logThemeError } from './errors.js';
9
+ import { resolveTheme } from './theme-resolver.js';
10
+ /**
11
+ * Applies a theme to the document
12
+ */
13
+ export async function applyTheme(doc, themeId) {
14
+ const theme = resolveTheme(themeId);
15
+ if (!theme) {
16
+ logThemeError(ThemeErrors.NO_THEMES_AVAILABLE());
17
+ return;
18
+ }
19
+ const baseUrl = getBaseUrl(doc);
20
+ // Add loading state to trigger button
21
+ const trigger = doc.getElementById(DOM_IDS.THEME_FLAVOR_TRIGGER);
22
+ if (trigger) {
23
+ trigger.classList.add('is-loading');
24
+ }
25
+ try {
26
+ // Apply theme class immediately (before CSS loading)
27
+ applyThemeClass(doc, theme.id);
28
+ // Load theme CSS
29
+ await loadThemeCSS(doc, theme, baseUrl);
30
+ // Update trigger button icon
31
+ const triggerIcon = doc.getElementById(DOM_IDS.THEME_FLAVOR_TRIGGER_ICON);
32
+ if (triggerIcon && theme.icon) {
33
+ try {
34
+ triggerIcon.src = resolveAssetPath(theme.icon, baseUrl);
35
+ const familyName = THEME_FAMILIES[theme.family].name;
36
+ triggerIcon.alt = `${familyName} ${theme.name}`;
37
+ triggerIcon.title = `${familyName} ${theme.name}`;
38
+ }
39
+ catch {
40
+ logThemeError(ThemeErrors.INVALID_ICON_PATH(theme.id));
41
+ }
42
+ }
43
+ // Update active state in dropdown
44
+ doc.querySelectorAll(DOM_SELECTORS.DROPDOWN_ITEMS).forEach((item) => {
45
+ setItemActiveState(item, item.getAttribute('data-theme-id') === theme.id);
46
+ });
47
+ }
48
+ finally {
49
+ if (trigger) {
50
+ trigger.classList.remove('is-loading');
51
+ }
52
+ }
53
+ }
54
+ /**
55
+ * Gets the current theme from classes or returns default
56
+ */
57
+ export function getCurrentTheme(doc, defaultTheme) {
58
+ return getCurrentThemeFromClasses(doc.documentElement) || defaultTheme;
59
+ }
60
+ //# sourceMappingURL=apply-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-theme.js","sourceRoot":"","sources":["../src/apply-theme.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC5H,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAa,EAAE,OAAe;IAC7D,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,aAAa,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAEhC,sCAAsC;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,oBAAoB,CAA6B,CAAC;IAC7F,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC;QACH,qDAAqD;QACrD,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAE/B,iBAAiB;QACjB,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAExC,6BAA6B;QAC7B,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,CACpC,OAAO,CAAC,yBAAyB,CACP,CAAC;QAE7B,IAAI,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,WAAW,CAAC,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACxD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;gBACrD,WAAW,CAAC,GAAG,GAAG,GAAG,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChD,WAAW,CAAC,KAAK,GAAG,GAAG,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,GAAG,CAAC,gBAAgB,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAClE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAa,EAAE,YAAoB;IACjE,OAAO,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,YAAY,CAAC;AACzE,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Constants for theme selector component
3
+ */
4
+ import type { ThemeFamily } from './types.js';
5
+ export type { ThemeFamily } from './types.js';
6
+ export declare const STORAGE_KEY = "turbo-theme";
7
+ export declare const LEGACY_STORAGE_KEYS: string[];
8
+ export declare const DEFAULT_THEME = "catppuccin-mocha";
9
+ export declare const DOM_IDS: {
10
+ readonly THEME_FLAVOR_TRIGGER: "theme-flavor-trigger";
11
+ readonly THEME_FLAVOR_TRIGGER_ICON: "theme-flavor-trigger-icon";
12
+ readonly THEME_FLAVOR_MENU: "theme-flavor-menu";
13
+ readonly THEME_FLAVOR_SELECT: "theme-flavor-select";
14
+ };
15
+ export declare const DOM_SELECTORS: {
16
+ readonly DROPDOWN_ITEMS: "#theme-flavor-menu .dropdown-item.theme-item";
17
+ readonly NAVBAR_DROPDOWN: ".navbar-item.has-dropdown";
18
+ readonly NAV_REPORTS: "[data-testid=\"nav-reports\"]";
19
+ readonly NAVBAR_ITEM: ".navbar-item";
20
+ readonly HIGHLIGHT_PRE: ".highlight > pre";
21
+ readonly THEME_CSS_LINKS: "link[id^=\"theme-\"][id$=\"-css\"]";
22
+ };
23
+ export interface ThemeFamilyMeta {
24
+ name: string;
25
+ description: string;
26
+ }
27
+ export declare const THEME_FAMILIES: Record<ThemeFamily, ThemeFamilyMeta>;
28
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,mBAAmB,UAAyB,CAAC;AAC1D,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAGhD,eAAO,MAAM,OAAO;;;;;CAKV,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;CAOhB,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,CAK/D,CAAC"}
@@ -0,0 +1,29 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Constants for theme selector component
4
+ */
5
+ export const STORAGE_KEY = 'turbo-theme';
6
+ export const LEGACY_STORAGE_KEYS = ['bulma-theme-flavor'];
7
+ export const DEFAULT_THEME = 'catppuccin-mocha';
8
+ // DOM element IDs and selectors - centralized to avoid magic strings
9
+ export const DOM_IDS = {
10
+ THEME_FLAVOR_TRIGGER: 'theme-flavor-trigger',
11
+ THEME_FLAVOR_TRIGGER_ICON: 'theme-flavor-trigger-icon',
12
+ THEME_FLAVOR_MENU: 'theme-flavor-menu',
13
+ THEME_FLAVOR_SELECT: 'theme-flavor-select',
14
+ };
15
+ export const DOM_SELECTORS = {
16
+ DROPDOWN_ITEMS: `#${DOM_IDS.THEME_FLAVOR_MENU} .dropdown-item.theme-item`,
17
+ NAVBAR_DROPDOWN: '.navbar-item.has-dropdown',
18
+ NAV_REPORTS: '[data-testid="nav-reports"]',
19
+ NAVBAR_ITEM: '.navbar-item',
20
+ HIGHLIGHT_PRE: '.highlight > pre',
21
+ THEME_CSS_LINKS: 'link[id^="theme-"][id$="-css"]',
22
+ };
23
+ export const THEME_FAMILIES = {
24
+ bulma: { name: 'Bulma', description: 'Classic Bulma themes' },
25
+ catppuccin: { name: 'Catppuccin', description: 'Soothing pastel themes' },
26
+ github: { name: 'GitHub', description: 'GitHub-inspired themes' },
27
+ dracula: { name: 'Dracula', description: 'Dark vampire aesthetic' },
28
+ };
29
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAOH,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEhD,qEAAqE;AACrE,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,oBAAoB,EAAE,sBAAsB;IAC5C,yBAAyB,EAAE,2BAA2B;IACtD,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;CAClC,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc,EAAE,IAAI,OAAO,CAAC,iBAAiB,4BAA4B;IACzE,eAAe,EAAE,2BAA2B;IAC5C,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EAAE,cAAc;IAC3B,aAAa,EAAE,kBAAkB;IACjC,eAAe,EAAE,gCAAgC;CACzC,CAAC;AAOX,MAAM,CAAC,MAAM,cAAc,GAAyC;IAClE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC7D,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACzE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACjE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wBAAwB,EAAE;CACpE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Dropdown event handlers
3
+ */
4
+ import type { DropdownElements, DropdownState, DropdownStateManager } from './state.js';
5
+ /**
6
+ * Wires up all event handlers for the dropdown.
7
+ */
8
+ export declare function wireDropdownEventHandlers(documentObj: Document, elements: DropdownElements, state: DropdownState, stateManager: DropdownStateManager, abortController: AbortController): void;
9
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/dropdown/events.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA4GxF;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,QAAQ,EACrB,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,oBAAoB,EAClC,eAAe,EAAE,eAAe,GAC/B,IAAI,CAoDN"}
@@ -0,0 +1,120 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Dropdown event handlers
4
+ */
5
+ /**
6
+ * Calculates the next index when navigating down through menu items.
7
+ */
8
+ function getNextIndex(currentIndex, totalItems) {
9
+ return currentIndex < totalItems - 1 ? currentIndex + 1 : 0;
10
+ }
11
+ /**
12
+ * Calculates the previous index when navigating up through menu items.
13
+ */
14
+ function getPrevIndex(currentIndex, totalItems) {
15
+ return currentIndex > 0 ? currentIndex - 1 : totalItems - 1;
16
+ }
17
+ /**
18
+ * Handles keyboard navigation on the trigger button.
19
+ */
20
+ function handleTriggerKeydown(e, dropdown, state, stateManager) {
21
+ const { focusMenuItem, toggleDropdown, updateAriaExpanded } = stateManager;
22
+ const totalItems = state.menuItems.length;
23
+ switch (e.key) {
24
+ case 'Enter':
25
+ case ' ':
26
+ e.preventDefault();
27
+ toggleDropdown(!dropdown.classList.contains('is-active'));
28
+ break;
29
+ case 'ArrowDown':
30
+ e.preventDefault();
31
+ if (!dropdown.classList.contains('is-active')) {
32
+ dropdown.classList.add('is-active');
33
+ updateAriaExpanded(true);
34
+ focusMenuItem(0);
35
+ }
36
+ else {
37
+ const nextIndex = state.currentIndex < 0 ? 0 : getNextIndex(state.currentIndex, totalItems);
38
+ focusMenuItem(nextIndex);
39
+ }
40
+ break;
41
+ case 'ArrowUp':
42
+ e.preventDefault();
43
+ if (!dropdown.classList.contains('is-active')) {
44
+ dropdown.classList.add('is-active');
45
+ updateAriaExpanded(true);
46
+ focusMenuItem(totalItems - 1);
47
+ }
48
+ else {
49
+ const startIndex = state.currentIndex < 0 ? totalItems - 1 : state.currentIndex;
50
+ focusMenuItem(getPrevIndex(startIndex, totalItems));
51
+ }
52
+ break;
53
+ }
54
+ }
55
+ /**
56
+ * Handles keyboard navigation on menu items.
57
+ */
58
+ function handleMenuItemKeydown(e, index, item, state, stateManager) {
59
+ const { focusMenuItem, closeDropdown } = stateManager;
60
+ const totalItems = state.menuItems.length;
61
+ switch (e.key) {
62
+ case 'ArrowDown':
63
+ e.preventDefault();
64
+ focusMenuItem(getNextIndex(index, totalItems));
65
+ break;
66
+ case 'ArrowUp':
67
+ e.preventDefault();
68
+ focusMenuItem(getPrevIndex(index, totalItems));
69
+ break;
70
+ case 'Escape':
71
+ e.preventDefault();
72
+ closeDropdown();
73
+ break;
74
+ case 'Enter':
75
+ case ' ':
76
+ e.preventDefault();
77
+ item.click();
78
+ break;
79
+ case 'Home':
80
+ e.preventDefault();
81
+ focusMenuItem(0);
82
+ break;
83
+ case 'End':
84
+ e.preventDefault();
85
+ focusMenuItem(totalItems - 1);
86
+ break;
87
+ }
88
+ }
89
+ /**
90
+ * Wires up all event handlers for the dropdown.
91
+ */
92
+ export function wireDropdownEventHandlers(documentObj, elements, state, stateManager, abortController) {
93
+ const { trigger, dropdown } = elements;
94
+ const { closeDropdown, toggleDropdown } = stateManager;
95
+ const signal = abortController.signal;
96
+ // Trigger click
97
+ trigger.addEventListener('click', (e) => {
98
+ e.preventDefault();
99
+ toggleDropdown();
100
+ }, { signal });
101
+ // Outside click
102
+ documentObj.addEventListener('click', (e) => {
103
+ if (!dropdown.contains(e.target)) {
104
+ closeDropdown({ restoreFocus: false });
105
+ }
106
+ }, { signal });
107
+ // Escape key (document-level)
108
+ documentObj.addEventListener('keydown', (e) => {
109
+ if (e.key === 'Escape' && dropdown.classList.contains('is-active')) {
110
+ closeDropdown({ restoreFocus: true });
111
+ }
112
+ }, { signal });
113
+ // Trigger keyboard navigation
114
+ trigger.addEventListener('keydown', (e) => handleTriggerKeydown(e, dropdown, state, stateManager), { signal });
115
+ // Menu item keyboard navigation
116
+ for (const [index, item] of state.menuItems.entries()) {
117
+ item.addEventListener('keydown', (e) => handleMenuItemKeydown(e, index, item, state, stateManager), { signal });
118
+ }
119
+ }
120
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/dropdown/events.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAIH;;GAEG;AACH,SAAS,YAAY,CAAC,YAAoB,EAAE,UAAkB;IAC5D,OAAO,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,YAAoB,EAAE,UAAkB;IAC5D,OAAO,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,CAAgB,EAChB,QAAqB,EACrB,KAAoB,EACpB,YAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,YAAY,CAAC;IAC3E,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;IAE1C,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,GAAG;YACN,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;YAC1D,MAAM;QAER,KAAK,WAAW;YACd,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9C,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACpC,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBACzB,aAAa,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;gBAC5F,aAAa,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM;QAER,KAAK,SAAS;YACZ,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9C,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACpC,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBACzB,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;gBAChF,aAAa,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM;IACV,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,CAAgB,EAChB,KAAa,EACb,IAAiB,EACjB,KAAoB,EACpB,YAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,YAAY,CAAC;IACtD,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;IAE1C,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;QACd,KAAK,WAAW;YACd,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;YAC/C,MAAM;QAER,KAAK,SAAS;YACZ,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;YAC/C,MAAM;QAER,KAAK,QAAQ;YACX,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,aAAa,EAAE,CAAC;YAChB,MAAM;QAER,KAAK,OAAO,CAAC;QACb,KAAK,GAAG;YACN,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,MAAM;QAER,KAAK,MAAM;YACT,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,aAAa,CAAC,CAAC,CAAC,CAAC;YACjB,MAAM;QAER,KAAK,KAAK;YACR,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM;IACV,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAqB,EACrB,QAA0B,EAC1B,KAAoB,EACpB,YAAkC,EAClC,eAAgC;IAEhC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IACvC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC;IACvD,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;IAEtC,gBAAgB;IAChB,OAAO,CAAC,gBAAgB,CACtB,OAAO,EACP,CAAC,CAAC,EAAE,EAAE;QACJ,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,cAAc,EAAE,CAAC;IACnB,CAAC,EACD,EAAE,MAAM,EAAE,CACX,CAAC;IAEF,gBAAgB;IAChB,WAAW,CAAC,gBAAgB,CAC1B,OAAO,EACP,CAAC,CAAa,EAAE,EAAE;QAChB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,EAAE,CAAC;YACzC,aAAa,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,EACD,EAAE,MAAM,EAAE,CACX,CAAC;IAEF,8BAA8B;IAC9B,WAAW,CAAC,gBAAgB,CAC1B,SAAS,EACT,CAAC,CAAgB,EAAE,EAAE;QACnB,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,EACD,EAAE,MAAM,EAAE,CACX,CAAC;IAEF,8BAA8B;IAC9B,OAAO,CAAC,gBAAgB,CACtB,SAAS,EACT,CAAC,CAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,EAC5E,EAAE,MAAM,EAAE,CACX,CAAC;IAEF,gCAAgC;IAChC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC,gBAAgB,CACnB,SAAS,EACT,CAAC,CAAgB,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,EAChF,EAAE,MAAM,EAAE,CACX,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Dropdown helper functions
3
+ */
4
+ /**
5
+ * Sets the active state (is-active class and aria-checked) on a theme item element.
6
+ */
7
+ export declare function setItemActiveState(item: Element, isActive: boolean): void;
8
+ /**
9
+ * Sets tabindex attribute on all items in a collection.
10
+ */
11
+ export declare function setTabindexBatch(items: HTMLElement[], value: string): void;
12
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/dropdown/helpers.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAOzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI1E"}
@@ -0,0 +1,25 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Dropdown helper functions
4
+ */
5
+ /**
6
+ * Sets the active state (is-active class and aria-checked) on a theme item element.
7
+ */
8
+ export function setItemActiveState(item, isActive) {
9
+ if (isActive) {
10
+ item.classList.add('is-active');
11
+ }
12
+ else {
13
+ item.classList.remove('is-active');
14
+ }
15
+ item.setAttribute('aria-checked', String(isActive));
16
+ }
17
+ /**
18
+ * Sets tabindex attribute on all items in a collection.
19
+ */
20
+ export function setTabindexBatch(items, value) {
21
+ for (const item of items) {
22
+ item.setAttribute('tabindex', value);
23
+ }
24
+ }
25
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/dropdown/helpers.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa,EAAE,QAAiB;IACjE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,KAAa;IAClE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Dropdown state management
3
+ */
4
+ export interface DropdownElements {
5
+ dropdownMenu: HTMLElement;
6
+ trigger: HTMLButtonElement;
7
+ dropdown: HTMLElement;
8
+ selectEl: HTMLSelectElement | null;
9
+ }
10
+ export interface DropdownState {
11
+ currentIndex: number;
12
+ menuItems: HTMLElement[];
13
+ }
14
+ export interface DropdownStateManager {
15
+ updateAriaExpanded: (expanded: boolean) => void;
16
+ focusMenuItem: (index: number) => void;
17
+ closeDropdown: (options?: {
18
+ restoreFocus?: boolean;
19
+ }) => void;
20
+ toggleDropdown: (focusFirst?: boolean) => void;
21
+ }
22
+ /**
23
+ * Creates dropdown state management functions.
24
+ */
25
+ export declare function createDropdownStateManager(elements: DropdownElements, state: DropdownState): DropdownStateManager;
26
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/dropdown/state.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,WAAW,CAAC;IAC1B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9D,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAChD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,aAAa,GACnB,oBAAoB,CA6CtB"}
@@ -0,0 +1,50 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Dropdown state management
4
+ */
5
+ import { setItemActiveState, setTabindexBatch } from './helpers.js';
6
+ /**
7
+ * Creates dropdown state management functions.
8
+ */
9
+ export function createDropdownStateManager(elements, state) {
10
+ const { trigger, dropdown } = elements;
11
+ const updateAriaExpanded = (expanded) => {
12
+ trigger.setAttribute('aria-expanded', String(expanded));
13
+ };
14
+ const focusMenuItem = (index) => {
15
+ if (index < 0 || index >= state.menuItems.length)
16
+ return;
17
+ const item = state.menuItems[index];
18
+ setTabindexBatch(state.menuItems, '-1');
19
+ item.setAttribute('tabindex', '0');
20
+ item.focus();
21
+ state.currentIndex = index;
22
+ };
23
+ const closeDropdown = (options = {}) => {
24
+ const { restoreFocus = true } = options;
25
+ dropdown.classList.remove('is-active');
26
+ updateAriaExpanded(false);
27
+ setTabindexBatch(state.menuItems, '-1');
28
+ state.currentIndex = -1;
29
+ if (restoreFocus) {
30
+ trigger.focus();
31
+ }
32
+ };
33
+ const toggleDropdown = (focusFirst = false) => {
34
+ const isActive = dropdown.classList.toggle('is-active');
35
+ updateAriaExpanded(isActive);
36
+ if (!isActive) {
37
+ state.currentIndex = -1;
38
+ setTabindexBatch(state.menuItems, '-1');
39
+ for (const menuItem of state.menuItems) {
40
+ const isActiveItem = menuItem.classList.contains('is-active');
41
+ setItemActiveState(menuItem, isActiveItem);
42
+ }
43
+ }
44
+ else if (focusFirst && state.menuItems.length > 0) {
45
+ focusMenuItem(0);
46
+ }
47
+ };
48
+ return { updateAriaExpanded, focusMenuItem, closeDropdown, toggleDropdown };
49
+ }
50
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/dropdown/state.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAqBpE;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,QAA0B,EAC1B,KAAoB;IAEpB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IAEvC,MAAM,kBAAkB,GAAG,CAAC,QAAiB,EAAQ,EAAE;QACrD,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAa,EAAQ,EAAE;QAC5C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM;YAAE,OAAO;QAEzD,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC;QACrC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,UAAsC,EAAE,EAAQ,EAAE;QACvE,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QACxC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1B,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACxB,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,UAAU,GAAG,KAAK,EAAQ,EAAE;QAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACxD,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAE7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACxB,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACxC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAC9D,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,aAAa,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Dropdown UI element creation
3
+ */
4
+ import type { ThemeFlavor } from '../theme-mapper.js';
5
+ import type { ThemeFamilyMeta } from '../constants.js';
6
+ import type { DropdownElements } from './state.js';
7
+ export interface DropdownContext {
8
+ documentObj: Document;
9
+ windowObj: Window;
10
+ baseUrl: string;
11
+ currentThemeId: string;
12
+ selectEl: HTMLSelectElement | null;
13
+ menuItems: HTMLElement[];
14
+ closeDropdown: (options?: {
15
+ restoreFocus?: boolean;
16
+ }) => void;
17
+ onThemeSelect: (themeId: string) => void;
18
+ }
19
+ /**
20
+ * Creates a checkmark SVG icon for the active theme indicator.
21
+ */
22
+ export declare function createCheckmarkIcon(doc: Document): SVGSVGElement;
23
+ /**
24
+ * Creates a single theme item button element.
25
+ */
26
+ export declare function createThemeItemElement(ctx: DropdownContext, theme: ThemeFlavor, familyMeta: ThemeFamilyMeta): HTMLButtonElement;
27
+ /**
28
+ * Creates a family group container with header and theme items.
29
+ */
30
+ export declare function createFamilyGroup(ctx: DropdownContext, familyKey: string, themes: ThemeFlavor[], familyMeta: ThemeFamilyMeta, animationDelay: number): {
31
+ group: HTMLDivElement;
32
+ items: HTMLElement[];
33
+ } | null;
34
+ /**
35
+ * Populates the dropdown menu with all theme family groups.
36
+ */
37
+ export declare function populateDropdownMenu(ctx: DropdownContext, dropdownMenu: HTMLElement, themes: ThemeFlavor[], themeFamilies: Record<string, ThemeFamilyMeta>): void;
38
+ /**
39
+ * Wires up the native select element for theme selection.
40
+ */
41
+ export declare function wireNativeSelect(ctx: DropdownContext, selectEl: HTMLSelectElement, themes: ThemeFlavor[], defaultTheme: string): void;
42
+ /**
43
+ * Gets DOM elements required for the dropdown, returning null if any are missing.
44
+ */
45
+ export declare function getDropdownElements(documentObj: Document): DropdownElements | null;
46
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/dropdown/ui.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,QAAQ,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,aAAa,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9D,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAgBhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,eAAe,GAC1B,iBAAiB,CAqEnB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EAAE,EACrB,UAAU,EAAE,eAAe,EAC3B,cAAc,EAAE,MAAM,GACrB;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,IAAI,CAuCxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,eAAe,EACpB,YAAY,EAAE,WAAW,EACzB,MAAM,EAAE,WAAW,EAAE,EACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAC7C,IAAI,CAgBN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,WAAW,EAAE,EACrB,YAAY,EAAE,MAAM,GACnB,IAAI,CAyBN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAelF"}