@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,179 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Dropdown UI element creation
4
+ */
5
+ import { setItemActiveState } from './helpers.js';
6
+ import { DOM_IDS, DOM_SELECTORS } from '../constants.js';
7
+ /**
8
+ * Creates a checkmark SVG icon for the active theme indicator.
9
+ */
10
+ export function createCheckmarkIcon(doc) {
11
+ const svg = doc.createElementNS('http://www.w3.org/2000/svg', 'svg');
12
+ svg.setAttribute('width', '16');
13
+ svg.setAttribute('height', '16');
14
+ svg.setAttribute('viewBox', '0 0 24 24');
15
+ svg.setAttribute('fill', 'none');
16
+ svg.setAttribute('stroke', 'currentColor');
17
+ svg.setAttribute('stroke-width', '3');
18
+ svg.setAttribute('stroke-linecap', 'round');
19
+ svg.setAttribute('stroke-linejoin', 'round');
20
+ const polyline = doc.createElementNS('http://www.w3.org/2000/svg', 'polyline');
21
+ polyline.setAttribute('points', '20 6 9 17 4 12');
22
+ svg.appendChild(polyline);
23
+ return svg;
24
+ }
25
+ /**
26
+ * Creates a single theme item button element.
27
+ */
28
+ export function createThemeItemElement(ctx, theme, familyMeta) {
29
+ const { documentObj, baseUrl, currentThemeId, selectEl, windowObj, closeDropdown, onThemeSelect } = ctx;
30
+ const item = documentObj.createElement('button');
31
+ item.type = 'button';
32
+ item.className = 'dropdown-item theme-item';
33
+ item.setAttribute('data-theme-id', theme.id);
34
+ item.setAttribute('data-appearance', theme.appearance);
35
+ item.setAttribute('role', 'menuitemradio');
36
+ item.setAttribute('aria-label', `${familyMeta.name} ${theme.name} (${theme.appearance}). ${theme.description}`);
37
+ item.setAttribute('tabindex', '-1');
38
+ const isActive = theme.id === currentThemeId;
39
+ setItemActiveState(item, isActive);
40
+ // Icon (only render if theme has an icon)
41
+ if (theme.icon) {
42
+ const icon = documentObj.createElement('img');
43
+ icon.className = 'theme-icon';
44
+ icon.src = baseUrl ? `${baseUrl}/${theme.icon}` : theme.icon;
45
+ icon.alt = `${familyMeta.name} ${theme.name}`;
46
+ icon.width = 24;
47
+ icon.height = 24;
48
+ item.appendChild(icon);
49
+ }
50
+ else {
51
+ // Add placeholder for consistent spacing
52
+ const placeholder = documentObj.createElement('span');
53
+ placeholder.className = 'theme-icon theme-icon-placeholder';
54
+ placeholder.setAttribute('aria-hidden', 'true');
55
+ item.appendChild(placeholder);
56
+ }
57
+ // Text content
58
+ const copy = documentObj.createElement('div');
59
+ copy.className = 'theme-copy';
60
+ const titleEl = documentObj.createElement('span');
61
+ titleEl.className = 'theme-title';
62
+ titleEl.textContent = `${familyMeta.name} · ${theme.name}`;
63
+ copy.appendChild(titleEl);
64
+ const descriptionEl = documentObj.createElement('span');
65
+ descriptionEl.className = 'theme-description';
66
+ descriptionEl.textContent = theme.description;
67
+ copy.appendChild(descriptionEl);
68
+ item.appendChild(copy);
69
+ // Checkmark for active state
70
+ const check = documentObj.createElement('span');
71
+ check.className = 'theme-check';
72
+ check.appendChild(createCheckmarkIcon(documentObj));
73
+ item.appendChild(check);
74
+ // Click handler
75
+ item.addEventListener('click', (e) => {
76
+ e.preventDefault();
77
+ onThemeSelect(theme.id);
78
+ if (selectEl) {
79
+ selectEl.value = theme.id;
80
+ selectEl.dispatchEvent(new Event('change', { bubbles: true }));
81
+ }
82
+ closeDropdown({ restoreFocus: true });
83
+ });
84
+ return item;
85
+ }
86
+ /**
87
+ * Creates a family group container with header and theme items.
88
+ */
89
+ export function createFamilyGroup(ctx, familyKey, themes, familyMeta, animationDelay) {
90
+ const { documentObj } = ctx;
91
+ if (themes.length === 0)
92
+ return null;
93
+ const items = [];
94
+ // Create family group container
95
+ const group = documentObj.createElement('div');
96
+ group.className = 'theme-family-group';
97
+ group.setAttribute('role', 'group');
98
+ group.setAttribute('aria-labelledby', `theme-family-${familyKey}`);
99
+ if (group.style && typeof group.style.setProperty === 'function') {
100
+ group.style.setProperty('--animation-delay', `${animationDelay}ms`);
101
+ }
102
+ // Create family header
103
+ const header = documentObj.createElement('div');
104
+ header.className = 'theme-family-header';
105
+ header.id = `theme-family-${familyKey}`;
106
+ const headerTitle = documentObj.createElement('span');
107
+ headerTitle.className = 'theme-family-name';
108
+ headerTitle.textContent = familyMeta.name;
109
+ header.appendChild(headerTitle);
110
+ group.appendChild(header);
111
+ // Create themes container
112
+ const themesContainer = documentObj.createElement('div');
113
+ themesContainer.className = 'theme-family-items';
114
+ themes.forEach((theme) => {
115
+ const item = createThemeItemElement(ctx, theme, familyMeta);
116
+ items.push(item);
117
+ themesContainer.appendChild(item);
118
+ });
119
+ group.appendChild(themesContainer);
120
+ return { group, items };
121
+ }
122
+ /**
123
+ * Populates the dropdown menu with all theme family groups.
124
+ */
125
+ export function populateDropdownMenu(ctx, dropdownMenu, themes, themeFamilies) {
126
+ const families = Object.keys(themeFamilies);
127
+ let animationDelay = 0;
128
+ families.forEach((familyKey) => {
129
+ const familyThemes = themes.filter((t) => t.family === familyKey);
130
+ const familyMeta = themeFamilies[familyKey];
131
+ if (!familyMeta)
132
+ return;
133
+ const result = createFamilyGroup(ctx, familyKey, familyThemes, familyMeta, animationDelay);
134
+ if (result) {
135
+ ctx.menuItems.push(...result.items);
136
+ dropdownMenu.appendChild(result.group);
137
+ animationDelay += 30;
138
+ }
139
+ });
140
+ }
141
+ /**
142
+ * Wires up the native select element for theme selection.
143
+ */
144
+ export function wireNativeSelect(ctx, selectEl, themes, defaultTheme) {
145
+ const { documentObj, windowObj, onThemeSelect } = ctx;
146
+ // Clear existing options
147
+ while (selectEl.firstChild) {
148
+ selectEl.removeChild(selectEl.firstChild);
149
+ }
150
+ // Populate options
151
+ themes.forEach((theme) => {
152
+ const option = documentObj.createElement('option');
153
+ option.value = theme.id;
154
+ option.textContent = theme.name;
155
+ option.selected = theme.id === ctx.currentThemeId;
156
+ selectEl.appendChild(option);
157
+ });
158
+ selectEl.disabled = false;
159
+ // Change handler
160
+ selectEl.addEventListener('change', (event) => {
161
+ const target = event.target;
162
+ const selectedThemeId = target?.value || defaultTheme;
163
+ onThemeSelect(selectedThemeId);
164
+ });
165
+ }
166
+ /**
167
+ * Gets DOM elements required for the dropdown, returning null if any are missing.
168
+ */
169
+ export function getDropdownElements(documentObj) {
170
+ const dropdownMenu = documentObj.getElementById(DOM_IDS.THEME_FLAVOR_MENU);
171
+ const trigger = documentObj.getElementById(DOM_IDS.THEME_FLAVOR_TRIGGER);
172
+ const dropdown = trigger?.closest(DOM_SELECTORS.NAVBAR_DROPDOWN);
173
+ const selectEl = documentObj.getElementById(DOM_IDS.THEME_FLAVOR_SELECT);
174
+ if (!dropdownMenu || !trigger || !dropdown) {
175
+ return null;
176
+ }
177
+ return { dropdownMenu, trigger, dropdown, selectEl };
178
+ }
179
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/dropdown/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Centralized error handling for Turbo Themes.
3
+ *
4
+ * Provides a consistent error logging strategy with standardized message
5
+ * formatting, error levels, and optional context for debugging.
6
+ */
7
+ /** Log prefix for all theme-related messages */
8
+ export declare const LOG_PREFIX = "[turbo-themes]";
9
+ /** Error severity levels */
10
+ export declare enum ErrorLevel {
11
+ WARN = "warn",
12
+ ERROR = "error"
13
+ }
14
+ /** Structured theme error with code, message, level, and optional context */
15
+ export interface ThemeError {
16
+ code: string;
17
+ message: string;
18
+ level: ErrorLevel;
19
+ context?: Record<string, unknown>;
20
+ }
21
+ /**
22
+ * Factory functions for creating structured theme errors.
23
+ * Each function returns a ThemeError with appropriate code, message, and level.
24
+ */
25
+ export declare const ThemeErrors: {
26
+ /** Invalid theme ID provided */
27
+ INVALID_THEME_ID: (themeId: string) => ThemeError;
28
+ /** No themes available in registry */
29
+ NO_THEMES_AVAILABLE: () => ThemeError;
30
+ /** Invalid theme icon path */
31
+ INVALID_ICON_PATH: (themeId: string) => ThemeError;
32
+ /** Theme initialization failed */
33
+ INIT_FAILED: (error: unknown) => ThemeError;
34
+ /** Protocol-relative URL rejected for security */
35
+ PROTOCOL_REJECTED: () => ThemeError;
36
+ /** Insecure HTTP URL rejected */
37
+ INSECURE_HTTP_REJECTED: () => ThemeError;
38
+ /** Cross-origin URL rejected */
39
+ CROSS_ORIGIN_REJECTED: (origin: string) => ThemeError;
40
+ /** Invalid CSS path for theme */
41
+ INVALID_CSS_PATH: (themeId: string) => ThemeError;
42
+ /** CSS failed to load */
43
+ CSS_LOAD_FAILED: (themeId: string, error: unknown) => ThemeError;
44
+ /** Storage unavailable (private browsing or disabled) */
45
+ STORAGE_UNAVAILABLE: (operation: string, error: unknown) => ThemeError;
46
+ };
47
+ /**
48
+ * Log a theme error to the console with consistent formatting.
49
+ *
50
+ * @param themeError - The structured error to log
51
+ */
52
+ export declare function logThemeError(themeError: ThemeError): void;
53
+ /**
54
+ * Convenience function to log a ThemeError.
55
+ *
56
+ * @param error - The ThemeError instance to log
57
+ */
58
+ export declare function logError<T extends ThemeError>(error: T): void;
59
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,gDAAgD;AAChD,eAAO,MAAM,UAAU,mBAAmB,CAAC;AAE3C,4BAA4B;AAC5B,oBAAY,UAAU;IACpB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW;IACtB,gCAAgC;gCACJ,MAAM,KAAG,UAAU;IAO/C,sCAAsC;+BACb,UAAU;IAMnC,8BAA8B;iCACD,MAAM,KAAG,UAAU;IAOhD,kCAAkC;yBACb,OAAO,KAAG,UAAU;IAOzC,kDAAkD;6BAC3B,UAAU;IAMjC,iCAAiC;kCACL,UAAU;IAMtC,gCAAgC;oCACA,MAAM,KAAG,UAAU;IAOnD,iCAAiC;gCACL,MAAM,KAAG,UAAU;IAO/C,yBAAyB;+BACE,MAAM,SAAS,OAAO,KAAG,UAAU;IAU9D,yDAAyD;qCACxB,MAAM,SAAS,OAAO,KAAG,UAAU;CASrE,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAgB1D;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAE7D"}
@@ -0,0 +1,127 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Centralized error handling for Turbo Themes.
4
+ *
5
+ * Provides a consistent error logging strategy with standardized message
6
+ * formatting, error levels, and optional context for debugging.
7
+ */
8
+ /** Log prefix for all theme-related messages */
9
+ export const LOG_PREFIX = '[turbo-themes]';
10
+ /** Error severity levels */
11
+ export var ErrorLevel;
12
+ (function (ErrorLevel) {
13
+ ErrorLevel["WARN"] = "warn";
14
+ ErrorLevel["ERROR"] = "error";
15
+ })(ErrorLevel || (ErrorLevel = {}));
16
+ /**
17
+ * Factory functions for creating structured theme errors.
18
+ * Each function returns a ThemeError with appropriate code, message, and level.
19
+ */
20
+ export const ThemeErrors = {
21
+ /** Invalid theme ID provided */
22
+ INVALID_THEME_ID: (themeId) => ({
23
+ code: 'INVALID_THEME_ID',
24
+ message: `Invalid theme ID "${themeId}" not saved to storage`,
25
+ level: ErrorLevel.WARN,
26
+ context: { themeId },
27
+ }),
28
+ /** No themes available in registry */
29
+ NO_THEMES_AVAILABLE: () => ({
30
+ code: 'NO_THEMES_AVAILABLE',
31
+ message: 'No themes available',
32
+ level: ErrorLevel.ERROR,
33
+ }),
34
+ /** Invalid theme icon path */
35
+ INVALID_ICON_PATH: (themeId) => ({
36
+ code: 'INVALID_ICON_PATH',
37
+ message: `Invalid theme icon path for ${themeId}`,
38
+ level: ErrorLevel.WARN,
39
+ context: { themeId },
40
+ }),
41
+ /** Theme initialization failed */
42
+ INIT_FAILED: (error) => ({
43
+ code: 'INIT_FAILED',
44
+ message: 'Theme switcher initialization failed',
45
+ level: ErrorLevel.ERROR,
46
+ context: { error: error instanceof Error ? error.message : String(error) },
47
+ }),
48
+ /** Protocol-relative URL rejected for security */
49
+ PROTOCOL_REJECTED: () => ({
50
+ code: 'PROTOCOL_REJECTED',
51
+ message: 'Protocol-relative base URL rejected for security',
52
+ level: ErrorLevel.WARN,
53
+ }),
54
+ /** Insecure HTTP URL rejected */
55
+ INSECURE_HTTP_REJECTED: () => ({
56
+ code: 'INSECURE_HTTP_REJECTED',
57
+ message: 'Insecure HTTP base URL rejected',
58
+ level: ErrorLevel.WARN,
59
+ }),
60
+ /** Cross-origin URL rejected */
61
+ CROSS_ORIGIN_REJECTED: (origin) => ({
62
+ code: 'CROSS_ORIGIN_REJECTED',
63
+ message: `Cross-origin base URL rejected: ${origin}`,
64
+ level: ErrorLevel.WARN,
65
+ context: { origin },
66
+ }),
67
+ /** Invalid CSS path for theme */
68
+ INVALID_CSS_PATH: (themeId) => ({
69
+ code: 'INVALID_CSS_PATH',
70
+ message: `Invalid theme CSS path for ${themeId}`,
71
+ level: ErrorLevel.WARN,
72
+ context: { themeId },
73
+ }),
74
+ /** CSS failed to load */
75
+ CSS_LOAD_FAILED: (themeId, error) => ({
76
+ code: 'CSS_LOAD_FAILED',
77
+ message: `Theme CSS failed to load for ${themeId}`,
78
+ level: ErrorLevel.WARN,
79
+ context: {
80
+ themeId,
81
+ error: error instanceof Error ? error.message : String(error),
82
+ },
83
+ }),
84
+ /** Storage unavailable (private browsing or disabled) */
85
+ STORAGE_UNAVAILABLE: (operation, error) => ({
86
+ code: 'STORAGE_UNAVAILABLE',
87
+ message: `localStorage ${operation} failed - storage may be unavailable`,
88
+ level: ErrorLevel.WARN,
89
+ context: {
90
+ operation,
91
+ error: error instanceof Error ? error.message : String(error),
92
+ },
93
+ }),
94
+ };
95
+ /**
96
+ * Log a theme error to the console with consistent formatting.
97
+ *
98
+ * @param themeError - The structured error to log
99
+ */
100
+ export function logThemeError(themeError) {
101
+ const prefixedMessage = `${LOG_PREFIX} ${themeError.message}`;
102
+ if (themeError.level === ErrorLevel.ERROR) {
103
+ if (themeError.context) {
104
+ console.error(prefixedMessage, themeError.context);
105
+ }
106
+ else {
107
+ console.error(prefixedMessage);
108
+ }
109
+ }
110
+ else {
111
+ if (themeError.context) {
112
+ console.warn(prefixedMessage, themeError.context);
113
+ }
114
+ else {
115
+ console.warn(prefixedMessage);
116
+ }
117
+ }
118
+ }
119
+ /**
120
+ * Convenience function to log a ThemeError.
121
+ *
122
+ * @param error - The ThemeError instance to log
123
+ */
124
+ export function logError(error) {
125
+ logThemeError(error);
126
+ }
127
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Theme selector package - main entry point
3
+ */
4
+ import { initNavbar } from './navbar.js';
5
+ import { enhanceAccessibility } from './accessibility.js';
6
+ declare global {
7
+ interface Window {
8
+ __INITIAL_THEME__?: string;
9
+ initNavbar: typeof initNavbar;
10
+ }
11
+ }
12
+ /**
13
+ * Initializes theme system
14
+ */
15
+ export declare function initTheme(documentObj: Document, windowObj: Window): Promise<void>;
16
+ /**
17
+ * Initializes and wires up the theme flavor selector dropdown.
18
+ * Returns a Promise for API consistency with initTheme.
19
+ */
20
+ export declare function wireFlavorSelector(documentObj: Document, windowObj: Window): Promise<{
21
+ cleanup: () => void;
22
+ }>;
23
+ export { initNavbar, enhanceAccessibility };
24
+ export type { ThemeMode, ThemeAppearance, ThemeFamily } from './types.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA;;GAEG;AAUH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAI1D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE,OAAO,UAAU,CAAC;KAC/B;CACF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBvF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,QAAQ,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CA0DlC;AAGD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC;AAG5C,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,114 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Theme selector package - main entry point
4
+ */
5
+ import { migrateLegacyStorage, getSavedTheme, saveTheme, DEFAULT_THEME } from './storage.js';
6
+ import { getBaseUrl, getCurrentThemeFromClasses } from './theme-loader.js';
7
+ import { applyTheme, getCurrentTheme } from './apply-theme.js';
8
+ import { THEME_FAMILIES } from './constants.js';
9
+ import { getThemes, getValidThemeIds } from './theme-resolver.js';
10
+ import { createDropdownStateManager } from './dropdown/state.js';
11
+ import { wireDropdownEventHandlers } from './dropdown/events.js';
12
+ import { populateDropdownMenu, wireNativeSelect, getDropdownElements } from './dropdown/ui.js';
13
+ import { initNavbar } from './navbar.js';
14
+ import { enhanceAccessibility } from './accessibility.js';
15
+ import { ThemeErrors, logThemeError } from './errors.js';
16
+ /**
17
+ * Initializes theme system
18
+ */
19
+ export async function initTheme(documentObj, windowObj) {
20
+ // Migrate legacy storage keys
21
+ migrateLegacyStorage(windowObj);
22
+ // Check if theme was already applied by blocking script
23
+ const initialTheme = windowObj.__INITIAL_THEME__;
24
+ const savedTheme = getSavedTheme(windowObj, getValidThemeIds());
25
+ // If blocking script already applied theme and it matches saved, just load CSS if needed
26
+ if (initialTheme && initialTheme === savedTheme) {
27
+ const currentTheme = getCurrentThemeFromClasses(documentObj.documentElement);
28
+ if (currentTheme === savedTheme) {
29
+ // Theme class already applied by blocking script, just ensure CSS is loaded
30
+ const themeLinkId = `theme-${savedTheme}-css`;
31
+ const themeLink = documentObj.getElementById(themeLinkId);
32
+ if (!themeLink) {
33
+ // CSS not loaded yet, load it now
34
+ await applyTheme(documentObj, savedTheme);
35
+ }
36
+ return;
37
+ }
38
+ }
39
+ // Otherwise, apply theme normally
40
+ await applyTheme(documentObj, savedTheme);
41
+ }
42
+ /**
43
+ * Initializes and wires up the theme flavor selector dropdown.
44
+ * Returns a Promise for API consistency with initTheme.
45
+ */
46
+ export async function wireFlavorSelector(documentObj, windowObj) {
47
+ const abortController = new AbortController();
48
+ // Get required DOM elements
49
+ const elements = getDropdownElements(documentObj);
50
+ if (!elements) {
51
+ return { cleanup: () => abortController.abort() };
52
+ }
53
+ const { dropdownMenu, selectEl } = elements;
54
+ const baseUrl = getBaseUrl(documentObj);
55
+ const themes = getThemes();
56
+ // Initialize state
57
+ const state = {
58
+ currentIndex: -1,
59
+ menuItems: [],
60
+ };
61
+ // Get current theme (validated against available themes)
62
+ const currentThemeId = getSavedTheme(windowObj, getValidThemeIds()) ||
63
+ getCurrentTheme(documentObj, DEFAULT_THEME);
64
+ // Create state manager (needs elements and state)
65
+ const stateManager = createDropdownStateManager(elements, state);
66
+ // Create context for UI creation
67
+ const ctx = {
68
+ documentObj,
69
+ windowObj,
70
+ baseUrl,
71
+ currentThemeId,
72
+ selectEl,
73
+ menuItems: state.menuItems,
74
+ closeDropdown: stateManager.closeDropdown,
75
+ onThemeSelect: async (themeId) => {
76
+ saveTheme(windowObj, themeId, getValidThemeIds());
77
+ await applyTheme(documentObj, themeId);
78
+ },
79
+ };
80
+ // Wire native select if present
81
+ if (selectEl) {
82
+ wireNativeSelect(ctx, selectEl, themes, DEFAULT_THEME);
83
+ }
84
+ // Populate dropdown menu
85
+ populateDropdownMenu(ctx, dropdownMenu, themes, THEME_FAMILIES);
86
+ // Wire event handlers
87
+ wireDropdownEventHandlers(documentObj, elements, state, stateManager, abortController);
88
+ // Initialize state
89
+ stateManager.updateAriaExpanded(false);
90
+ elements.dropdown.classList.remove('is-active');
91
+ return { cleanup: () => abortController.abort() };
92
+ }
93
+ // Re-export navbar and accessibility functions
94
+ export { initNavbar, enhanceAccessibility };
95
+ // Auto-initialize on DOMContentLoaded
96
+ if (typeof document !== 'undefined' && typeof window !== 'undefined') {
97
+ document.addEventListener('DOMContentLoaded', async () => {
98
+ try {
99
+ await initTheme(document, window);
100
+ const { cleanup } = await wireFlavorSelector(document, window);
101
+ enhanceAccessibility(document);
102
+ // Register cleanup to run on teardown
103
+ const pagehideHandler = () => {
104
+ cleanup();
105
+ window.removeEventListener('pagehide', pagehideHandler);
106
+ };
107
+ window.addEventListener('pagehide', pagehideHandler);
108
+ }
109
+ catch (error) {
110
+ logThemeError(ThemeErrors.INIT_FAILED(error));
111
+ }
112
+ });
113
+ }
114
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Navbar active state management
3
+ */
4
+ /**
5
+ * Initializes navbar active state based on current path
6
+ */
7
+ export declare function initNavbar(documentObj: Document): void;
8
+ declare global {
9
+ interface Window {
10
+ initNavbar: typeof initNavbar;
11
+ }
12
+ }
13
+ //# sourceMappingURL=navbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navbar.d.ts","sourceRoot":"","sources":["../src/navbar.ts"],"names":[],"mappings":"AACA;;GAEG;AAWH;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,QAAQ,GAAG,IAAI,CA2DtD;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,OAAO,UAAU,CAAC;KAC/B;CACF"}
@@ -0,0 +1,75 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Navbar active state management
4
+ */
5
+ import { DOM_SELECTORS } from './constants.js';
6
+ /**
7
+ * Normalizes a path by removing trailing slashes, defaulting to '/' if empty.
8
+ */
9
+ function normalizePath(path) {
10
+ return path.replace(/\/$/, '') || '/';
11
+ }
12
+ /**
13
+ * Initializes navbar active state based on current path
14
+ */
15
+ export function initNavbar(documentObj) {
16
+ const currentPath = documentObj.location.pathname;
17
+ const normalizedCurrentPath = normalizePath(currentPath);
18
+ const navbarItems = documentObj.querySelectorAll(DOM_SELECTORS.NAVBAR_ITEM);
19
+ // Single pass: find matching item and collect items to deactivate
20
+ let matchingItem = null;
21
+ const itemsToDeactivate = [];
22
+ navbarItems.forEach((item) => {
23
+ const link = item;
24
+ if (!link.href)
25
+ return;
26
+ try {
27
+ const normalizedLinkPath = normalizePath(new URL(link.href).pathname);
28
+ if (normalizedCurrentPath === normalizedLinkPath) {
29
+ matchingItem = item;
30
+ }
31
+ else {
32
+ // Collect non-matching items with valid URLs for deactivation
33
+ itemsToDeactivate.push(item);
34
+ }
35
+ }
36
+ catch {
37
+ // Ignore invalid URLs
38
+ }
39
+ });
40
+ // Apply deactivation after finding match (single DOM batch)
41
+ for (const item of itemsToDeactivate) {
42
+ item.classList.remove('is-active');
43
+ item.removeAttribute('aria-current');
44
+ }
45
+ // Set active state for the matching link
46
+ if (matchingItem) {
47
+ matchingItem.classList.add('is-active');
48
+ matchingItem.setAttribute('aria-current', 'page');
49
+ }
50
+ // Handle Reports dropdown highlighting
51
+ const reportsLink = documentObj.querySelector(DOM_SELECTORS.NAV_REPORTS);
52
+ if (reportsLink) {
53
+ const reportPaths = [
54
+ '/coverage',
55
+ '/coverage-python',
56
+ '/coverage-swift',
57
+ '/coverage-ruby',
58
+ '/playwright',
59
+ '/playwright-examples',
60
+ '/lighthouse',
61
+ ];
62
+ const isOnReportsPage = reportPaths.some((path) => normalizedCurrentPath === path || normalizedCurrentPath.startsWith(path + '/'));
63
+ if (isOnReportsPage) {
64
+ reportsLink.classList.add('is-active');
65
+ }
66
+ else {
67
+ reportsLink.classList.remove('is-active');
68
+ }
69
+ }
70
+ }
71
+ // Only assign to window in browser context
72
+ if (typeof window !== 'undefined') {
73
+ window.initNavbar = initNavbar;
74
+ }
75
+ //# sourceMappingURL=navbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navbar.js","sourceRoot":"","sources":["../src/navbar.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;GAEG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,WAAqB;IAC9C,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAClD,MAAM,qBAAqB,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAE5E,kEAAkE;IAClE,IAAI,YAAY,GAAmB,IAAI,CAAC;IACxC,MAAM,iBAAiB,GAAc,EAAE,CAAC;IAExC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,IAAyB,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,kBAAkB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;YACtE,IAAI,qBAAqB,KAAK,kBAAkB,EAAE,CAAC;gBACjD,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,8DAA8D;gBAC9D,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,4DAA4D;IAC5D,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,IAA0B,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IAC9D,CAAC;IAED,yCAAyC;IACzC,IAAI,YAAY,EAAE,CAAC;QAChB,YAA4B,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACxD,YAAkC,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,uCAAuC;IACvC,MAAM,WAAW,GAAG,WAAW,CAAC,aAAa,CAAc,aAAa,CAAC,WAAW,CAAC,CAAC;IACtF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG;YAClB,WAAW;YACX,kBAAkB;YAClB,iBAAiB;YACjB,gBAAgB;YAChB,aAAa;YACb,sBAAsB;YACtB,aAAa;SACd,CAAC;QACF,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CACtC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,KAAK,IAAI,IAAI,qBAAqB,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CACzF,CAAC;QACF,IAAI,eAAe,EAAE,CAAC;YACpB,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AASD,2CAA2C;AAC3C,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IAClC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;AACjC,CAAC"}