@customviews-js/customviews 1.4.0 → 1.4.1-beta.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.
- package/dist/custom-views.core.cjs.js +293 -105
- package/dist/custom-views.core.cjs.js.map +1 -1
- package/dist/custom-views.core.esm.js +293 -105
- package/dist/custom-views.core.esm.js.map +1 -1
- package/dist/custom-views.esm.js +293 -105
- package/dist/custom-views.esm.js.map +1 -1
- package/dist/custom-views.js +293 -105
- package/dist/custom-views.js.map +1 -1
- package/dist/custom-views.min.js +2 -2
- package/dist/custom-views.min.js.map +1 -1
- package/dist/types/core/core.d.ts +6 -4
- package/dist/types/core/core.d.ts.map +1 -1
- package/dist/types/core/toggle-manager.d.ts +12 -2
- package/dist/types/core/toggle-manager.d.ts.map +1 -1
- package/dist/types/core/url-state-manager.d.ts.map +1 -1
- package/dist/types/core/widget.d.ts.map +1 -1
- package/dist/types/styles/toggle-styles.d.ts +1 -1
- package/dist/types/styles/toggle-styles.d.ts.map +1 -1
- package/dist/types/styles/widget-styles.d.ts +1 -1
- package/dist/types/styles/widget-styles.d.ts.map +1 -1
- package/dist/types/types/types.d.ts +4 -2
- package/dist/types/types/types.d.ts.map +1 -1
- package/dist/types/utils/icons.d.ts +2 -0
- package/dist/types/utils/icons.d.ts.map +1 -1
- package/package.json +10 -4
package/dist/custom-views.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-views.js","sources":["../src/core/persistence.ts","../src/core/url-state-manager.ts","../src/core/visibility-manager.ts","../src/utils/icons.ts","../src/core/tab-manager.ts","../src/core/assets-manager.ts","../src/core/render.ts","../src/core/toggle-manager.ts","../src/utils/scroll-manager.ts","../src/styles/toggle-styles.ts","../src/styles/tab-styles.ts","../src/styles/styles.ts","../src/styles/toast-styles.ts","../src/core/toast-manager.ts","../src/core/anchor-engine.ts","../src/styles/share-mode-styles.ts","../src/core/share-manager.ts","../src/styles/focus-mode-styles.ts","../src/core/focus-manager.ts","../src/core/config.ts","../src/core/core.ts","../src/utils/url-utils.ts","../src/core/custom-elements.ts","../src/lib/custom-views.ts","../src/styles/widget-styles.ts","../src/core/widget.ts","../src/entry/browser-entry.ts","../src/index.ts"],"sourcesContent":["import type { State } from \"../types/types\";\n\n/**\n * Manages persistence of custom views state using browser localStorage\n */\nexport class PersistenceManager {\n // Storage keys for localStorage\n private static readonly STORAGE_KEYS = {\n STATE: 'customviews-state',\n TAB_NAV_VISIBILITY: 'cv-tab-navs-visible'\n } as const;\n\n /**\n * Check if localStorage is available in the current environment\n */\n private isStorageAvailable(): boolean {\n return typeof window !== 'undefined' && window.localStorage !== undefined;\n }\n\n \n public persistState(state: State): void {\n if (!this.isStorageAvailable()) return;\n\n try {\n localStorage.setItem(PersistenceManager.STORAGE_KEYS.STATE, JSON.stringify(state));\n } catch (error) {\n console.warn('Failed to persist state:', error);\n }\n }\n\n \n public getPersistedState(): State | null {\n if (!this.isStorageAvailable()) return null;\n try {\n const raw = localStorage.getItem(PersistenceManager.STORAGE_KEYS.STATE);\n return raw ? JSON.parse(raw) : null;\n } catch (error) {\n console.warn('Failed to parse persisted state:', error);\n return null;\n }\n }\n\n \n /**\n * Clear persisted state\n */\n public clearAll(): void {\n if (!this.isStorageAvailable()) return;\n\n localStorage.removeItem(PersistenceManager.STORAGE_KEYS.STATE);\n localStorage.removeItem(PersistenceManager.STORAGE_KEYS.TAB_NAV_VISIBILITY);\n }\n\n /**\n * Persist tab nav visibility preference\n */\n public persistTabNavVisibility(visible: boolean): void {\n if (!this.isStorageAvailable()) return;\n\n try {\n localStorage.setItem(PersistenceManager.STORAGE_KEYS.TAB_NAV_VISIBILITY, visible ? 'true' : 'false');\n } catch (error) {\n console.warn('Failed to persist tab nav visibility:', error);\n }\n }\n\n /**\n * Get persisted tab nav visibility preference\n */\n public getPersistedTabNavVisibility(): boolean | null {\n if (!this.isStorageAvailable()) return null;\n try {\n const raw = localStorage.getItem(PersistenceManager.STORAGE_KEYS.TAB_NAV_VISIBILITY);\n return raw === null ? null : raw === 'true';\n } catch (error) {\n console.warn('Failed to get persisted tab nav visibility:', error);\n return null;\n }\n }\n\n /**\n * Check if any persistence data exists\n */\n public hasPersistedData(): boolean {\n if (!this.isStorageAvailable()) {\n return false;\n }\n return !!this.getPersistedState();\n }\n\n}\n","/**\n * URL State Manager for CustomViews\n * Handles encoding/decoding of states in URL parameters\n */\n\nimport type { State } from \"../types/types\";\n\n\nexport class URLStateManager {\n /**\n * Parse current URL parameters into state object\n */\n public static parseURL(): State | null {\n const urlParams = new URLSearchParams(window.location.search);\n\n // Get view state\n const viewParam = urlParams.get('view');\n let decoded: State | null = null;\n if (viewParam) {\n try {\n decoded = this.decodeState(viewParam);\n } catch (error) {\n console.warn('Failed to decode view state from URL:', error);\n }\n }\n\n return decoded;\n }\n\n /**\n * Update URL with current state without triggering navigation\n */\n public static updateURL(state: State | null | undefined): void {\n if (typeof window === 'undefined' || !window.history) return;\n\n const url = new URL(window.location.href);\n\n // Clear existing parameters\n url.searchParams.delete('view');\n\n // Set view state\n if (state) {\n const encoded = this.encodeState(state);\n if (encoded) {\n url.searchParams.set('view', encoded);\n }\n }\n\n // Use a relative URL to satisfy stricter environments (e.g., jsdom tests)\n const relative = url.pathname + (url.search || '') + (url.hash || '');\n window.history.replaceState({}, '', relative);\n }\n\n /**\n * Clear all state parameters from URL\n */\n public static clearURL(): void {\n this.updateURL(null);\n }\n\n /**\n * Generate shareable URL for current state\n */\n public static generateShareableURL(state: State | null | undefined): string {\n const url = new URL(window.location.href);\n\n // Clear existing parameters\n url.searchParams.delete('view');\n\n // Set new parameters\n if (state) {\n const encoded = this.encodeState(state);\n if (encoded) {\n url.searchParams.set('view', encoded);\n }\n }\n\n return url.toString();\n }\n\n /**\n * Encode state into URL-safe string \n * \n * (Covers Toggles, Tabs and Focus currently)\n */\n private static encodeState(state: State): string | null {\n try {\n // Create a compact representation\n const compact: any = {};\n\n // Add toggles if present and non-empty\n if (state.toggles && state.toggles.length > 0) {\n compact.t = state.toggles;\n }\n\n // Add tab groups if present\n if (state.tabs && Object.keys(state.tabs).length > 0) {\n compact.g = Object.entries(state.tabs);\n }\n\n // Add focus if present\n if (state.focus && state.focus.length > 0) {\n compact.f = state.focus;\n }\n\n // Convert to JSON and encode\n const json = JSON.stringify(compact);\n let encoded: string;\n if (typeof btoa === 'function') {\n encoded = btoa(json);\n } else {\n // Node/test fallback\n // @ts-ignore\n encoded = Buffer.from(json, 'utf-8').toString('base64');\n }\n\n // Make URL-safe\n const urlSafeString = encoded.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n return urlSafeString;\n } catch (error) {\n console.warn('Failed to encode state:', error);\n return null;\n }\n }\n\n /**\n * Decode custom state from URL parameter\n * \n * (Covers Toggles, Tabs and Focus currently)\n */\n private static decodeState(encoded: string): State | null {\n try {\n // Restore base64 padding and characters\n let base64 = encoded.replace(/-/g, '+').replace(/_/g, '/');\n\n // Add padding if needed\n while (base64.length % 4) {\n base64 += '=';\n }\n\n // Decode and parse\n let json: string;\n if (typeof atob === 'function') {\n json = atob(base64);\n } else {\n // Node/test fallback\n // @ts-ignore\n json = Buffer.from(base64, 'base64').toString('utf-8');\n }\n const compact = JSON.parse(json);\n\n // Validate structure\n if (!compact || typeof compact !== 'object') {\n throw new Error('Invalid compact state structure');\n }\n\n // Reconstruct State from compact format\n\n // Reconstruct Toggles\n const state: State = {\n toggles: Array.isArray(compact.t) ? compact.t : []\n };\n\n // Reconstruct Tabs\n if (Array.isArray(compact.g)) {\n state.tabs = {};\n for (const [groupId, tabId] of compact.g) {\n if (typeof groupId === 'string' && typeof tabId === 'string') {\n state.tabs[groupId] = tabId;\n }\n }\n }\n\n // Reconstruct Focus\n if (Array.isArray(compact.f)) {\n state.focus = compact.f;\n }\n\n return state;\n } catch (error) {\n console.warn('Failed to decode view state:', error);\n return null;\n }\n }\n\n\n}\n","import type { ToggleId } from \"../types/types\";\n\n/**\n * Keeps track of which toggles are hidden and which are visible in memory.\n * \n * This class keeps track of hidden toggles without reading the DOM or URL.\n */\nexport class VisibilityManager {\n private hiddenToggles: Set<ToggleId> = new Set();\n\n /** Marks a toggle as visible or hidden. \n * Returns true if changed. \n * Also updates internal set of hidden toggles.\n */\n public setToggleVisibility(toggleId: ToggleId, visible: boolean): boolean {\n const wasHidden = this.hiddenToggles.has(toggleId);\n const shouldHide = !visible;\n if (shouldHide && !wasHidden) {\n this.hiddenToggles.add(toggleId);\n return true;\n }\n if (!shouldHide && wasHidden) {\n this.hiddenToggles.delete(toggleId);\n return true;\n }\n return false;\n }\n\n /** Hide all toggles in the provided set. */\n public hideAll(allToggleIds: ToggleId[]): void {\n for (const id of allToggleIds) {\n this.setToggleVisibility(id, false);\n }\n }\n\n /** Show all toggles in the provided set. */\n public showAll(allToggleIds: ToggleId[]): void {\n for (const id of allToggleIds) {\n this.setToggleVisibility(id, true);\n }\n }\n\n /** Get the globally hidden toggle ids (explicitly hidden via API). */\n public getHiddenToggles(): ToggleId[] {\n return Array.from(this.hiddenToggles);\n }\n\n /** Filter a list of toggles to only those visible per the hidden set. */\n public filterVisibleToggles(toggleIds: ToggleId[]): ToggleId[] {\n return toggleIds.filter(t => !this.hiddenToggles.has(t));\n }\n\n /**\n * Apply simple class-based visibility to a toggle element.\n * The element is assumed to have data-cv-toggle or data-customviews-toggle.\n */\n public applyElementVisibility(el: HTMLElement, visible: boolean): void {\n if (visible) {\n el.classList.remove('cv-hidden');\n el.classList.add('cv-visible');\n } else {\n el.classList.add('cv-hidden');\n el.classList.remove('cv-visible');\n }\n }\n}\n\n\n","/**\n * Icon utilities for CustomViews widget\n * Centralized SVG icons for better maintainability and reusability\n */\n\n/**\n * Settings gear icon for modal header\n */\nexport function getGearIcon(): string {\n return `<svg class=\"cv-modal-icon-svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path xmlns=\"http://www.w3.org/2000/svg\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 8.00002C9.79085 8.00002 7.99999 9.79088 7.99999 12C7.99999 14.2092 9.79085 16 12 16C14.2091 16 16 14.2092 16 12C16 9.79088 14.2091 8.00002 12 8.00002ZM9.99999 12C9.99999 10.8955 10.8954 10 12 10C13.1046 10 14 10.8955 14 12C14 13.1046 13.1046 14 12 14C10.8954 14 9.99999 13.1046 9.99999 12Z\" fill=\"#0F1729\"/>\n <path xmlns=\"http://www.w3.org/2000/svg\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.7673 1.01709C10.9925 0.999829 11.2454 0.99993 11.4516 1.00001L12.5484 1.00001C12.7546 0.99993 13.0075 0.999829 13.2327 1.01709C13.4989 1.03749 13.8678 1.08936 14.2634 1.26937C14.7635 1.49689 15.1915 1.85736 15.5007 2.31147C15.7454 2.67075 15.8592 3.0255 15.9246 3.2843C15.9799 3.50334 16.0228 3.75249 16.0577 3.9557L16.1993 4.77635L16.2021 4.77788C16.2369 4.79712 16.2715 4.81659 16.306 4.8363L16.3086 4.83774L17.2455 4.49865C17.4356 4.42978 17.6693 4.34509 17.8835 4.28543C18.1371 4.2148 18.4954 4.13889 18.9216 4.17026C19.4614 4.20998 19.9803 4.39497 20.4235 4.70563C20.7734 4.95095 21.0029 5.23636 21.1546 5.4515C21.2829 5.63326 21.4103 5.84671 21.514 6.02029L22.0158 6.86003C22.1256 7.04345 22.2594 7.26713 22.3627 7.47527C22.4843 7.7203 22.6328 8.07474 22.6777 8.52067C22.7341 9.08222 22.6311 9.64831 22.3803 10.1539C22.1811 10.5554 21.9171 10.8347 21.7169 11.0212C21.5469 11.1795 21.3428 11.3417 21.1755 11.4746L20.5 12L21.1755 12.5254C21.3428 12.6584 21.5469 12.8205 21.7169 12.9789C21.9171 13.1653 22.1811 13.4446 22.3802 13.8461C22.631 14.3517 22.7341 14.9178 22.6776 15.4794C22.6328 15.9253 22.4842 16.2797 22.3626 16.5248C22.2593 16.7329 22.1255 16.9566 22.0158 17.14L21.5138 17.9799C21.4102 18.1535 21.2828 18.3668 21.1546 18.5485C21.0028 18.7637 20.7734 19.0491 20.4234 19.2944C19.9803 19.6051 19.4613 19.7901 18.9216 19.8298C18.4954 19.8612 18.1371 19.7852 17.8835 19.7146C17.6692 19.6549 17.4355 19.5703 17.2454 19.5014L16.3085 19.1623L16.306 19.1638C16.2715 19.1835 16.2369 19.2029 16.2021 19.2222L16.1993 19.2237L16.0577 20.0443C16.0228 20.2475 15.9799 20.4967 15.9246 20.7157C15.8592 20.9745 15.7454 21.3293 15.5007 21.6886C15.1915 22.1427 14.7635 22.5032 14.2634 22.7307C13.8678 22.9107 13.4989 22.9626 13.2327 22.983C13.0074 23.0002 12.7546 23.0001 12.5484 23H11.4516C11.2454 23.0001 10.9925 23.0002 10.7673 22.983C10.5011 22.9626 10.1322 22.9107 9.73655 22.7307C9.23648 22.5032 8.80849 22.1427 8.49926 21.6886C8.25461 21.3293 8.14077 20.9745 8.07542 20.7157C8.02011 20.4967 7.97723 20.2475 7.94225 20.0443L7.80068 19.2237L7.79791 19.2222C7.7631 19.2029 7.72845 19.1835 7.69396 19.1637L7.69142 19.1623L6.75458 19.5014C6.5645 19.5702 6.33078 19.6549 6.11651 19.7146C5.86288 19.7852 5.50463 19.8611 5.07841 19.8298C4.53866 19.7901 4.01971 19.6051 3.57654 19.2944C3.2266 19.0491 2.99714 18.7637 2.84539 18.5485C2.71718 18.3668 2.58974 18.1534 2.4861 17.9798L1.98418 17.14C1.87447 16.9566 1.74067 16.7329 1.63737 16.5248C1.51575 16.2797 1.36719 15.9253 1.32235 15.4794C1.26588 14.9178 1.36897 14.3517 1.61976 13.8461C1.81892 13.4446 2.08289 13.1653 2.28308 12.9789C2.45312 12.8205 2.65717 12.6584 2.82449 12.5254L3.47844 12.0054V11.9947L2.82445 11.4746C2.65712 11.3417 2.45308 11.1795 2.28304 11.0212C2.08285 10.8347 1.81888 10.5554 1.61972 10.1539C1.36893 9.64832 1.26584 9.08224 1.3223 8.52069C1.36714 8.07476 1.51571 7.72032 1.63732 7.47528C1.74062 7.26715 1.87443 7.04347 1.98414 6.86005L2.48605 6.02026C2.58969 5.84669 2.71714 5.63326 2.84534 5.45151C2.9971 5.23637 3.22655 4.95096 3.5765 4.70565C4.01966 4.39498 4.53862 4.20999 5.07837 4.17027C5.50458 4.1389 5.86284 4.21481 6.11646 4.28544C6.33072 4.34511 6.56444 4.4298 6.75451 4.49867L7.69141 4.83775L7.69394 4.8363C7.72844 4.8166 7.7631 4.79712 7.79791 4.77788L7.80068 4.77635L7.94225 3.95571C7.97723 3.7525 8.02011 3.50334 8.07542 3.2843C8.14077 3.0255 8.25461 2.67075 8.49926 2.31147C8.80849 1.85736 9.23648 1.49689 9.73655 1.26937C10.1322 1.08936 10.5011 1.03749 10.7673 1.01709ZM14.0938 4.3363C14.011 3.85634 13.9696 3.61637 13.8476 3.43717C13.7445 3.2858 13.6019 3.16564 13.4352 3.0898C13.2378 3.00002 12.9943 3.00002 12.5073 3.00002H11.4927C11.0057 3.00002 10.7621 3.00002 10.5648 3.0898C10.3981 3.16564 10.2555 3.2858 10.1524 3.43717C10.0304 3.61637 9.98895 3.85634 9.90615 4.3363L9.75012 5.24064C9.69445 5.56333 9.66662 5.72467 9.60765 5.84869C9.54975 5.97047 9.50241 6.03703 9.40636 6.13166C9.30853 6.22804 9.12753 6.3281 8.76554 6.52822C8.73884 6.54298 8.71227 6.55791 8.68582 6.57302C8.33956 6.77078 8.16643 6.86966 8.03785 6.90314C7.91158 6.93602 7.83293 6.94279 7.70289 6.93196C7.57049 6.92094 7.42216 6.86726 7.12551 6.7599L6.11194 6.39308C5.66271 6.2305 5.43809 6.14921 5.22515 6.16488C5.04524 6.17811 4.87225 6.23978 4.72453 6.34333C4.5497 6.46589 4.42715 6.67094 4.18206 7.08103L3.72269 7.84965C3.46394 8.2826 3.33456 8.49907 3.31227 8.72078C3.29345 8.90796 3.32781 9.09665 3.41141 9.26519C3.51042 9.4648 3.7078 9.62177 4.10256 9.9357L4.82745 10.5122C5.07927 10.7124 5.20518 10.8126 5.28411 10.9199C5.36944 11.036 5.40583 11.1114 5.44354 11.2504C5.47844 11.379 5.47844 11.586 5.47844 12C5.47844 12.414 5.47844 12.621 5.44354 12.7497C5.40582 12.8887 5.36944 12.9641 5.28413 13.0801C5.20518 13.1875 5.07927 13.2876 4.82743 13.4879L4.10261 14.0643C3.70785 14.3783 3.51047 14.5352 3.41145 14.7349C3.32785 14.9034 3.29349 15.0921 3.31231 15.2793C3.33461 15.501 3.46398 15.7174 3.72273 16.1504L4.1821 16.919C4.4272 17.3291 4.54974 17.5342 4.72457 17.6567C4.8723 17.7603 5.04528 17.8219 5.2252 17.8352C5.43813 17.8508 5.66275 17.7695 6.11199 17.607L7.12553 17.2402C7.42216 17.1328 7.5705 17.0791 7.7029 17.0681C7.83294 17.0573 7.91159 17.064 8.03786 17.0969C8.16644 17.1304 8.33956 17.2293 8.68582 17.427C8.71228 17.4421 8.73885 17.4571 8.76554 17.4718C9.12753 17.6719 9.30853 17.772 9.40635 17.8684C9.50241 17.963 9.54975 18.0296 9.60765 18.1514C9.66662 18.2754 9.69445 18.4367 9.75012 18.7594L9.90615 19.6637C9.98895 20.1437 10.0304 20.3837 10.1524 20.5629C10.2555 20.7142 10.3981 20.8344 10.5648 20.9102C10.7621 21 11.0057 21 11.4927 21H12.5073C12.9943 21 13.2378 21 13.4352 20.9102C13.6019 20.8344 13.7445 20.7142 13.8476 20.5629C13.9696 20.3837 14.011 20.1437 14.0938 19.6637L14.2499 18.7594C14.3055 18.4367 14.3334 18.2754 14.3923 18.1514C14.4502 18.0296 14.4976 17.963 14.5936 17.8684C14.6915 17.772 14.8725 17.6719 15.2344 17.4718C15.2611 17.4571 15.2877 17.4421 15.3141 17.427C15.6604 17.2293 15.8335 17.1304 15.9621 17.0969C16.0884 17.064 16.167 17.0573 16.2971 17.0681C16.4295 17.0791 16.5778 17.1328 16.8744 17.2402L17.888 17.607C18.3372 17.7696 18.5619 17.8509 18.7748 17.8352C18.9547 17.8219 19.1277 17.7603 19.2754 17.6567C19.4502 17.5342 19.5728 17.3291 19.8179 16.919L20.2773 16.1504C20.536 15.7175 20.6654 15.501 20.6877 15.2793C20.7065 15.0921 20.6721 14.9034 20.5885 14.7349C20.4895 14.5353 20.2921 14.3783 19.8974 14.0643L19.1726 13.4879C18.9207 13.2876 18.7948 13.1875 18.7159 13.0801C18.6306 12.9641 18.5942 12.8887 18.5564 12.7497C18.5215 12.6211 18.5215 12.414 18.5215 12C18.5215 11.586 18.5215 11.379 18.5564 11.2504C18.5942 11.1114 18.6306 11.036 18.7159 10.9199C18.7948 10.8126 18.9207 10.7124 19.1725 10.5122L19.8974 9.9357C20.2922 9.62176 20.4896 9.46479 20.5886 9.26517C20.6722 9.09664 20.7065 8.90795 20.6877 8.72076C20.6654 8.49906 20.5361 8.28259 20.2773 7.84964L19.8179 7.08102C19.5728 6.67093 19.4503 6.46588 19.2755 6.34332C19.1277 6.23977 18.9548 6.1781 18.7748 6.16486C18.5619 6.14919 18.3373 6.23048 17.888 6.39307L16.8745 6.75989C16.5778 6.86725 16.4295 6.92093 16.2971 6.93195C16.167 6.94278 16.0884 6.93601 15.9621 6.90313C15.8335 6.86965 15.6604 6.77077 15.3142 6.57302C15.2877 6.55791 15.2611 6.54298 15.2345 6.52822C14.8725 6.3281 14.6915 6.22804 14.5936 6.13166C14.4976 6.03703 14.4502 5.97047 14.3923 5.84869C14.3334 5.72467 14.3055 5.56332 14.2499 5.24064L14.0938 4.3363Z\" fill=\"#0F1729\"/>\n</svg>`;\n}\n\n/**\n * Close/X icon for modal close button\n */\nexport function getCloseIcon(): string {\n return `<svg class=\"cv-modal-close-icon\" fill=\"currentColor\" height=\"20px\" viewBox=\"0 0 256 256\" width=\"20px\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n </svg>`;\n}\n\n/**\n * Reset/refresh icon for reset button\n */\nexport function getResetIcon(): string {\n return `<svg class=\"cv-btn-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M22.719 12A10.719 10.719 0 0 1 1.28 12h.838a9.916 9.916 0 1 0 1.373-5H8v1H2V2h1v4.2A10.71 10.71 0 0 1 22.719 12z\"/><path fill=\"none\" d=\"M0 0h24v24H0z\"/>\n </svg>`;\n}\n\n/**\n * Copy icon for sharing URL button\n */\nexport function getCopyIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" version=\"1.1\" fill=\"currentColor\">\n <g id=\"surface1\">\n <path d=\"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 \"></path>\n </g>\n </svg>`;\n}\n\nexport function getTickIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"2 2 22 22\" fill=\"currentColor\">\n <path d=\"M 19.28125 5.28125 L 9 15.5625 L 4.71875 11.28125 L 3.28125 12.71875 L 8.28125 17.71875 \n L 9 18.40625 L 9.71875 17.71875 L 20.71875 6.71875 Z\"></path>\n </svg>`;\n}\n\nexport function getNavHeadingOnIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"250\" height=\"181\" viewBox=\"0 0 250 181\">\n <rect y=\"34.5001\" width=\"250\" height=\"146\" rx=\"4\" stroke=\"currentColor\" stroke-width=\"10\" fill=\"none\"/>\n <line x1=\"27\" y1=\"62.0001\" x2=\"77\" y2=\"62.0001\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"77.8888\" x2=\"77\" y2=\"77.8888\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"97.4454\" x2=\"221\" y2=\"97.4454\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"114.555\" x2=\"221\" y2=\"114.555\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"132.889\" x2=\"221\" y2=\"132.889\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"150\" x2=\"221\" y2=\"150\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"247.5\" y1=\"43.0001\" x2=\"247.5\" y2=\"13.0001\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M185 12.5001L247 12.5001\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <line x1=\"204.09\" y1=\"36.6095\" x2=\"181.698\" y2=\"10.0228\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M125 9.50012L181 9.50012\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M144.305 35.2579L120.095 6.56679\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M120 6.50037L64 6.50037\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M87.1957 36.1024L59 2.50008\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M59 2.50037L3 2.50037\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M2.5 38.5001L2.5 3.00012\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n </svg>`;\n}\n\nexport function getNavHeadingOffIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"250\" height=\"181\" viewBox=\"0 0 250 181\" fill=\"currentColor\">\n <rect y=\"34.5001\" width=\"250\" height=\"146\" rx=\"4\" stroke=\"currentColor\" stroke-width=\"10\" fill=\"none\"/>\n <line x1=\"27\" y1=\"62\" x2=\"77\" y2=\"62\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"77.8887\" x2=\"77\" y2=\"77.8887\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"97.4453\" x2=\"221\" y2=\"97.4453\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"114.555\" x2=\"221\" y2=\"114.555\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"132.889\" x2=\"221\" y2=\"132.889\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"150\" x2=\"221\" y2=\"150\" stroke=\"currentColor\" stroke-width=\"5\"/>\n </svg>`;\n}\n\n/**\n * Transition Icon for Navigation Headings\n */\nexport function getNavDashed(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"250\" height=\"181\" viewBox=\"0 0 250 181\">\n <rect y=\"34.5001\" width=\"250\" height=\"146\" rx=\"4\" stroke=\"currentColor\" stroke-width=\"10\" fill=\"none\"/>\n <line x1=\"27\" y1=\"62.0001\" x2=\"77\" y2=\"62.0001\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"77.8888\" x2=\"77\" y2=\"77.8888\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"97.4454\" x2=\"221\" y2=\"97.4454\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"114.555\" x2=\"221\" y2=\"114.555\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"132.889\" x2=\"221\" y2=\"132.889\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"150\" x2=\"221\" y2=\"150\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <path d=\"M245 37.0001V39.5001H250V37.0001H247.5H245ZM250 13.0001C250 11.6194 248.881 10.5001 247.5 10.5001C246.119 10.5001 245 11.6194 245 13.0001H247.5H250ZM250 31.0001C250 29.6194 248.881 28.5001 247.5 28.5001C246.119 28.5001 245 29.6194 245 31.0001H247.5H250ZM245 19.0001C245 20.3808 246.119 21.5001 247.5 21.5001C248.881 21.5001 250 20.3808 250 19.0001H247.5H245ZM247.5 37.0001H250V31.0001H247.5H245V37.0001H247.5ZM247.5 19.0001H250V13.0001H247.5H245V19.0001H247.5Z\" fill=\"currentColor\"/>\n <line x1=\"204.09\" y1=\"36.6095\" x2=\"181.698\" y2=\"10.0228\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M125 9.50012L181 9.50012\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M144.305 35.2579L120.095 6.56679\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M120 6.50037L64 6.50037\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M87.1957 36.1024L59 2.50008\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M59 2.50037L3 2.50037\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M2.5 38.5001L2.5 3.00012\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M185 12.5001L247 12.5001\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n </svg>`;\n}\n\n\nexport function getPinIcon(isPinned: boolean = false): string {\n const opacity = isPinned ? '1' : '0.6'; // Optional: additional dimming effect\n\n return `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" opacity=\"${opacity}\" xmlns=\"http://www.w3.org/2000/svg\">\n <g transform=\"rotate(45 8 8)\">\n <path d=\"M10.5 2H12V0H4V2H5.5V6L4 7.5V9H7.2V15H8.8V9H12V7.5L10.5 6V2Z\"/>\n </g>\n </svg>\n `.trim();\n}\n\nexport function getLinkIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/>\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>\n </svg>`;\n}\n\nexport function getShareIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M18 8h-2a1 1 0 0 0 0 2h2v8H6v-8h2a1 1 0 0 0 0-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8a2 2 0 0 0-2-2z\"/>\n <path fill=\"currentColor\" d=\"M11 6.41V12a1 1 0 0 0 2 0V6.41l1.29 1.3a1 1 0 0 0 1.42 0a1 1 0 0 0 0-1.42l-3-3a1 1 0 0 0-1.42 0l-3 3a1 1 0 1 0 1.42 1.42L11 6.41z\"/>\n </svg>`;\n}\n\n/**\n * GitHub icon for footer link\n */\nexport function getGitHubIcon(): string {\n return `<svg viewBox=\"0 0 98 96\" width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z\"/>\n </svg>`;\n}\n","import type { TabGroupConfig } from \"../types/types\";\nimport { getPinIcon } from \"../utils/icons\";\n\n\n// Constants for selectors\nconst TABGROUP_SELECTOR = 'cv-tabgroup';\nconst TAB_SELECTOR = 'cv-tab';\nconst NAV_AUTO_SELECTOR = 'cv-tabgroup[nav=\"auto\"], cv-tabgroup:not([nav])';\nconst NAV_CONTAINER_CLASS = 'cv-tabs-nav';\nconst NAV_HIDE_ROOT_CLASS = 'cv-hide-tab-navs';\nconst NAV_HIDDEN_CLASS = 'cv-tabs-nav-hidden';\n\nexport class TabManager {\n /**\n * Split a tab ID into multiple IDs if it contains spaces or |\n */\n private static splitTabIds(tabId: string): string[] {\n const splitIds = tabId.split(/[\\s|]+/).filter(id => id.trim() !== '');\n const trimmedIds = splitIds.map(id => id.trim());\n return trimmedIds;\n }\n\n /**\n * Apply tab selections to a given list of tab group elements\n */\n public static applyTabSelections(\n tabGroups: HTMLElement[],\n tabs: Record<string, string>,\n cfgGroups?: TabGroupConfig[]\n ): void {\n tabGroups.forEach((groupEl) => {\n const groupId = groupEl.getAttribute('id');\n \n // Determine the active tab for this group\n let activeTabId: string | null;\n if (groupId) {\n activeTabId = this.resolveActiveTabForGroup(groupId, tabs, cfgGroups, groupEl as HTMLElement);\n } else {\n // For standalone groups without id, activate the first tab\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n const firstTab = tabElements[0];\n if (firstTab) {\n const firstTabId = firstTab.getAttribute('id') || firstTab.getAttribute('data-cv-internal-id') || '';\n const splitIds = this.splitTabIds(firstTabId);\n activeTabId = splitIds[0] || null;\n } else {\n activeTabId = null;\n }\n }\n \n // Apply visibility to direct child cv-tab elements only (not nested ones)\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n tabElements.forEach((tabEl) => {\n // Use id or internal id\n const tabId = tabEl.getAttribute('id') || tabEl.getAttribute('data-cv-internal-id');\n if (!tabId) return;\n\n // Split IDs and check if any match the active tab\n const splitIds = this.splitTabIds(tabId);\n const isActive = splitIds.includes(activeTabId || '');\n this.applyTabVisibility(tabEl as HTMLElement, isActive);\n });\n });\n }\n\n /**\n * Resolve the active tab for a group based on state, config, and DOM\n * \n * Pass in the current tabs state, config groups, and the group element\n */\n private static resolveActiveTabForGroup(\n groupId: string,\n tabs: Record<string, string>,\n cfgGroups: TabGroupConfig[] | undefined,\n groupEl: HTMLElement\n ): string | null {\n // 1. Check state\n if (tabs[groupId]) {\n return tabs[groupId];\n }\n\n // 2. Check config for first tab\n if (cfgGroups) {\n const groupCfg = cfgGroups.find(g => g.id === groupId);\n if (groupCfg) {\n // Fallback to first tab in config\n const firstConfigTab = groupCfg.tabs[0];\n if (firstConfigTab) {\n return firstConfigTab.id;\n }\n }\n }\n\n // 3. Fallback to first direct cv-tab child in DOM\n const firstTab = Array.from(groupEl.children).find(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n if (firstTab) {\n // Use id or internal id\n const tabId = firstTab.getAttribute('id') || firstTab.getAttribute('data-cv-internal-id') || '';\n const splitIds = this.splitTabIds(tabId);\n return splitIds[0] || null;\n }\n\n return null;\n }\n\n /**\n * Apply visibility classes to a tab element\n */\n private static applyTabVisibility(tabEl: HTMLElement, isActive: boolean): void {\n if (isActive) {\n tabEl.classList.remove('cv-hidden');\n tabEl.classList.add('cv-visible');\n } else {\n tabEl.classList.add('cv-hidden');\n tabEl.classList.remove('cv-visible');\n }\n }\n\n /**\n * Extract header and body content from header component syntax: <cv-tab-header> and <cv-tab-body>\n * Returns null if using old attribute-based syntax.\n * \n * @param tabEl The <cv-tab> element to inspect\n * @returns Object with extracted content, or null if new syntax not used\n */\n private static extractTabContent(\n tabEl: HTMLElement\n ): { headerHTML: string; bodyEl: HTMLElement | null } | null {\n // Look for direct children \n let headerEl = tabEl.querySelector(':scope > cv-tab-header');\n \n if (!headerEl) {\n return null;\n }\n\n const headerHTML = headerEl.innerHTML.trim();\n \n // Find body element\n let bodyEl = tabEl.querySelector(':scope > cv-tab-body') as HTMLElement | null;\n\n // Fallback: try finding both header and body\n // without :scope (in case of DOM manipulation) by iterating through tabEl.children if needed\n\n return {\n headerHTML,\n bodyEl\n };\n }\n\n /**\n * Build navigation for tab groups (one-time setup)\n */\n public static buildNavs(\n tabGroups: HTMLElement[],\n cfgGroups?: TabGroupConfig[],\n onTabClick?: (groupId: string, tabId: string, groupEl: HTMLElement) => void,\n onTabDoubleClick?: (groupId: string, tabId: string, groupEl: HTMLElement) => void\n ): void {\n const rootEl = document.body; // Needed for NAV_HIDE_ROOT_CLASS check\n \n tabGroups.forEach((groupEl) => {\n // Prevent re-initialization\n if (groupEl.hasAttribute('data-cv-initialized')) {\n return;\n }\n groupEl.setAttribute('data-cv-initialized', 'true');\n\n // Filter to only build for groups with nav=\"auto\" or no nav attribute\n if (!groupEl.matches(NAV_AUTO_SELECTOR)) {\n return;\n }\n\n const groupId = groupEl.getAttribute('id') || null;\n \n // Note: groupId can be null for standalone tabgroups\n // These won't sync with other groups or persist state\n\n // Check if nav already exists - if so, skip building\n let navContainer = groupEl.querySelector(`.${NAV_CONTAINER_CLASS}`);\n if (navContainer) return; // Already built\n \n // Get only direct child tabs (not nested ones)\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n if (tabElements.length === 0) return;\n\n // Create nav container\n navContainer = document.createElement('ul');\n navContainer.className = `${NAV_CONTAINER_CLASS} nav-tabs`;\n navContainer.setAttribute('role', 'tablist');\n \n // Respect viewer preference on the root to show/hide navs\n const showNavs = !rootEl.classList.contains(NAV_HIDE_ROOT_CLASS);\n if (!showNavs) {\n navContainer.classList.add(NAV_HIDDEN_CLASS);\n navContainer.setAttribute('aria-hidden', 'true');\n } else {\n navContainer.setAttribute('aria-hidden', 'false');\n }\n groupEl.insertBefore(navContainer, groupEl.firstChild);\n\n // Build nav items\n tabElements.forEach((tabEl, index) => {\n let rawTabId = tabEl.getAttribute('id');\n \n // If tab has no id, generate one based on position\n if (!rawTabId) {\n rawTabId = `${groupId}-tab-${index}`;\n tabEl.setAttribute('data-cv-internal-id', rawTabId);\n }\n\n const splitIds = this.splitTabIds(rawTabId);\n // If multiple IDs, use the first as primary\n const tabId = splitIds[0] || rawTabId;\n \n // Get header for this tab - prefer new syntax over old attribute syntax\n const extractedHeaderAndBody = this.extractTabContent(tabEl as HTMLElement);\n let header = '';\n \n // use <cv-tab-header> content if available\n if (extractedHeaderAndBody && extractedHeaderAndBody.headerHTML) {\n header = extractedHeaderAndBody.headerHTML;\n } else {\n // use header attribute if available\n const headerAttr = tabEl.getAttribute('header') || '';\n if (headerAttr) {\n header = headerAttr;\n } else {\n // Use config label if available (only if group has an id)\n const configLabel = groupId ? this.getTabLabel(tabId, groupId, cfgGroups) : null;\n if (configLabel) {\n header = configLabel;\n }\n else if (tabEl.getAttribute('id')) {\n // Use the original id if it exists\n header = tabId;\n } else {\n // Auto-generate label for tabs without id (Tab 1, Tab 2, etc.)\n header = `Tab ${index + 1}`;\n }\n }\n }\n\n // Create a single nav link for this tab element\n const listItem = document.createElement('li');\n listItem.className = 'nav-item';\n\n const navLink = document.createElement('a');\n navLink.className = 'nav-link';\n navLink.href = '#';\n navLink.setAttribute('data-tab-id', tabId);\n navLink.setAttribute('data-raw-tab-id', rawTabId);\n if (groupId) {\n navLink.setAttribute('data-group-id', groupId);\n }\n navLink.setAttribute('role', 'tab');\n \n // Create header container with text and pin icon\n const headerContainer = document.createElement('span');\n headerContainer.className = 'cv-tab-header-container';\n \n const headerText = document.createElement('span');\n headerText.className = 'cv-tab-header-text';\n headerText.innerHTML = header;\n \n const pinIcon = document.createElement('span');\n pinIcon.className = 'cv-tab-pin-icon';\n pinIcon.innerHTML = getPinIcon(true);\n pinIcon.style.display = 'none'; // Hidden by default\n \n headerContainer.appendChild(headerText);\n headerContainer.appendChild(pinIcon);\n navLink.appendChild(headerContainer);\n\n // Check if any of the split IDs is active\n const activeTabId = groupId \n ? this.resolveActiveTabForGroup(groupId, {}, cfgGroups, groupEl as HTMLElement)\n : (index === 0 ? tabId : null); // For standalone groups, activate first tab\n const isActive = splitIds.includes(activeTabId || '');\n if (isActive) {\n navLink.classList.add('active');\n navLink.setAttribute('aria-selected', 'true');\n } else {\n navLink.setAttribute('aria-selected', 'false');\n }\n\n // Add click handler for local tab switch (if split id, switches to default first ID)\n if (onTabClick) {\n navLink.addEventListener('click', (e) => {\n e.preventDefault();\n // For standalone groups (no groupId), use empty string\n onTabClick(groupId || '', tabId, groupEl as HTMLElement);\n });\n }\n\n // Add double-click handler for sync (only for groups with id)\n if (onTabDoubleClick && groupId) {\n navLink.addEventListener('dblclick', (e) => {\n e.preventDefault();\n onTabDoubleClick(groupId, tabId, groupEl as HTMLElement);\n });\n }\n\n // Add tooltip for UX feedback (use native title attribute)\n navLink.setAttribute('title', 'Double click to change switch tabs across all groups');\n\n listItem.appendChild(navLink);\n navContainer.appendChild(listItem);\n });\n\n // Add bottom border line at the end of the tab group\n const bottomBorder = document.createElement('div');\n bottomBorder.className = 'cv-tabgroup-bottom-border';\n groupEl.appendChild(bottomBorder);\n });\n }\n\n /**\n * Toggle nav visibility for all tab groups (viewer-controlled)\n */\n public static setNavsVisibility(rootEl: HTMLElement, visible: boolean): void {\n if (visible) {\n rootEl.classList.remove(NAV_HIDE_ROOT_CLASS);\n } else {\n rootEl.classList.add(NAV_HIDE_ROOT_CLASS);\n }\n\n const navContainers = rootEl.querySelectorAll(`.${NAV_CONTAINER_CLASS}`);\n navContainers.forEach((nav) => {\n if (visible) {\n nav.classList.remove(NAV_HIDDEN_CLASS);\n nav.setAttribute('aria-hidden', 'false');\n } else {\n nav.classList.add(NAV_HIDDEN_CLASS);\n nav.setAttribute('aria-hidden', 'true');\n }\n });\n\n // Also hide/show the bottom border of tab groups\n const bottomBorders = rootEl.querySelectorAll('.cv-tabgroup-bottom-border');\n bottomBorders.forEach((border) => {\n if (visible) {\n border.classList.remove('cv-hidden');\n } else {\n border.classList.add('cv-hidden');\n }\n });\n }\n\n /**\n * Read current nav visibility (viewer preference)\n */\n public static areNavsVisible(rootEl: HTMLElement): boolean {\n return !rootEl.classList.contains(NAV_HIDE_ROOT_CLASS);\n }\n\n /**\n * Get tab label from config\n */\n private static getTabLabel(\n tabId: string,\n groupId: string,\n cfgGroups?: TabGroupConfig[]\n ): string | null {\n if (!cfgGroups) return null;\n\n const groupCfg = cfgGroups.find(g => g.id === groupId);\n if (!groupCfg) return null;\n\n const tabCfg = groupCfg.tabs.find(t => t.id === tabId);\n return tabCfg?.label || null;\n }\n\n /**\n * Update active state in navs for a specific tabgroup element only\n */\n public static updateNavActiveState(groupEl: HTMLElement, activeTabId: string): void {\n const navLinks = groupEl.querySelectorAll('.nav-link');\n navLinks.forEach((link) => {\n const rawTabId = link.getAttribute('data-raw-tab-id');\n if (!rawTabId) return;\n\n // Check if activeTabId is in the split IDs of this link\n const splitIds = this.splitTabIds(rawTabId);\n const isActive = splitIds.includes(activeTabId);\n if (isActive) {\n link.classList.add('active');\n link.setAttribute('aria-selected', 'true');\n } else {\n link.classList.remove('active');\n link.setAttribute('aria-selected', 'false');\n }\n });\n }\n\n /**\n * Update active states for all tab groups based on current state\n */\n public static updateAllNavActiveStates(\n tabGroups: HTMLElement[],\n tabs: Record<string, string>,\n cfgGroups?: TabGroupConfig[]\n ): void {\n tabGroups.forEach((groupEl) => {\n const groupId = groupEl.getAttribute('id');\n if (!groupId) return;\n\n // Determine the active tab for this group\n const activeTabId = this.resolveActiveTabForGroup(groupId, tabs, cfgGroups, groupEl as HTMLElement);\n if (!activeTabId) return;\n\n // Update nav links for this group\n const navLinks = groupEl.querySelectorAll('.nav-link');\n navLinks.forEach((link) => {\n const rawTabId = link.getAttribute('data-raw-tab-id');\n if (!rawTabId) return;\n\n // Check if activeTabId is in the split IDs of this link\n const splitIds = this.splitTabIds(rawTabId);\n const isActive = splitIds.includes(activeTabId);\n if (isActive) {\n link.classList.add('active');\n link.setAttribute('aria-selected', 'true');\n } else {\n link.classList.remove('active');\n link.setAttribute('aria-selected', 'false');\n }\n });\n });\n }\n\n /**\n * Apply tab selection to a specific tabgroup element only (not globally).\n * Used for single-click behavior to update only the clicked tabgroup.\n */\n public static applyTabLocalOnly(groupEl: HTMLElement, activeTabId: string): void {\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n \n tabElements.forEach((tabEl) => {\n // Use id or internal id\n const tabId = tabEl.getAttribute('id') || tabEl.getAttribute('data-cv-internal-id');\n if (!tabId) return;\n\n const splitIds = this.splitTabIds(tabId);\n const isActive = splitIds.includes(activeTabId);\n this.applyTabVisibility(tabEl as HTMLElement, isActive);\n });\n }\n\n /**\n * Check if a tabgroup element contains a specific tab ID (respects split IDs).\n * Accepts groupEl to avoid repeated DOM queries.\n */\n public static groupHasTab(groupEl: HTMLElement, tabId: string): boolean {\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n return tabElements.some((tabEl) => {\n // Use id or internal id\n const idAttr = tabEl.getAttribute('id') || tabEl.getAttribute('data-cv-internal-id') || '';\n const splitIds = this.splitTabIds(idAttr);\n return splitIds.includes(tabId);\n });\n }\n\n\n /**\n * Returns array of group elements to be synced (excluding source).\n */\n public static getTabgroupsWithId(\n rootEl: HTMLElement,\n sourceGroupId: string,\n tabId: string\n ): HTMLElement[] {\n const syncedGroupEls: HTMLElement[] = [];\n const allGroupEls = Array.from(rootEl.querySelectorAll(`${TABGROUP_SELECTOR}[id=\"${sourceGroupId}\"]`)) as HTMLElement[];\n\n allGroupEls.forEach((targetGroupEl) => {\n // Only sync if target group actually contains this tab\n if (this.groupHasTab(targetGroupEl, tabId)) {\n syncedGroupEls.push(targetGroupEl);\n }\n });\n\n return syncedGroupEls;\n }\n\n /**\n * Update pin icon visibility for all tab groups based on current state.\n * Shows pin icon for tabs that are in the persisted state (i.e., have been double-clicked).\n */\n public static updatePinIcons(\n tabGroups: HTMLElement[],\n tabs: Record<string, string>\n ): void {\n tabGroups.forEach((groupEl) => {\n const groupId = groupEl.getAttribute('id');\n if (!groupId) return;\n\n const persistedTabId = tabs[groupId];\n \n // Find all nav links in this group\n const navLinks = groupEl.querySelectorAll('.nav-link');\n navLinks.forEach((link) => {\n const rawTabId = link.getAttribute('data-raw-tab-id');\n const pinIcon = link.querySelector('.cv-tab-pin-icon') as HTMLElement;\n \n if (!pinIcon || !rawTabId) return;\n \n // Check if persisted tab ID matches any of the split IDs (for multi-ID tabs)\n const splitIds = this.splitTabIds(rawTabId);\n const shouldShowPin = persistedTabId && splitIds.includes(persistedTabId);\n \n if (shouldShowPin) {\n pinIcon.style.display = 'inline-block';\n } else {\n pinIcon.style.display = 'none';\n }\n });\n });\n }\n}\n","import type { CustomViewAsset } from \"../types/types\";\n\nexport class AssetsManager {\n assets: Record<string, CustomViewAsset>;\n private baseURL: string;\n\n constructor(assets: Record<string, CustomViewAsset>, baseURL: string = '') {\n this.assets = assets;\n this.baseURL = baseURL;\n if (!this.validate()) {\n console.warn('Invalid assets:', this.assets);\n }\n }\n\n // Check each asset has content or src\n validate(): boolean {\n return Object.values(this.assets).every(a => a.src || a.content);\n }\n\n get(assetId: string): CustomViewAsset | undefined {\n const asset = this.assets[assetId];\n if (!asset) return undefined;\n\n // If there's a baseURL and the asset has a src property, prepend the baseURL\n if (this.baseURL && asset.src) {\n // Create a shallow copy to avoid mutating the original asset\n return {\n ...asset,\n src: this.prependBaseURL(asset.src)\n };\n }\n\n return asset;\n }\n\n private prependBaseURL(path: string): string {\n // Don't prepend if the path is already absolute (starts with http:// or https://)\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path;\n }\n\n // Ensure baseURL doesn't end with / and path starts with /\n const cleanBaseURL = this.baseURL.endsWith('/') ? this.baseURL.slice(0, -1) : this.baseURL;\n const cleanPath = path.startsWith('/') ? path : '/' + path;\n \n return cleanBaseURL + cleanPath;\n }\n\n loadFromJSON(json: Record<string, CustomViewAsset>) {\n this.assets = json;\n }\n\n loadAdditionalAssets(additionalAssets: Record<string, CustomViewAsset>) {\n this.assets = { ...this.assets, ...additionalAssets };\n }\n\n}\n","import type { CustomViewAsset } from \"../types/types\";\nimport type { AssetsManager } from \"./assets-manager\";\n\n/** --- Basic renderers --- */\n\nfunction renderImage(el: HTMLElement, asset: CustomViewAsset) {\n if (!asset.src) return;\n el.innerHTML = '';\n const img = document.createElement('img');\n img.src = asset.src;\n img.alt = asset.alt || '';\n \n // Apply custom styling if provided\n if (asset.className) {\n img.className = asset.className;\n }\n if (asset.style) {\n img.setAttribute('style', asset.style);\n }\n \n // Default styles (can be overridden by asset.style)\n img.style.maxWidth = img.style.maxWidth || '100%';\n img.style.height = img.style.height || 'auto';\n img.style.display = img.style.display || 'block';\n el.appendChild(img);\n}\n\nfunction renderText(el: HTMLElement, asset: CustomViewAsset) {\n if (asset.content != null) {\n el.textContent = asset.content;\n }\n \n // Apply custom styling if provided\n if (asset.className) {\n el.className = asset.className;\n }\n if (asset.style) {\n el.setAttribute('style', asset.style);\n }\n}\n\nfunction renderHtml(el: HTMLElement, asset: CustomViewAsset) {\n if (asset.content != null) {\n el.innerHTML = asset.content;\n }\n \n // Apply custom styling if provided\n if (asset.className) {\n el.className = asset.className;\n }\n if (asset.style) {\n el.setAttribute('style', asset.style);\n }\n}\n\n/** --- Unified asset renderer --- */\n\nfunction detectAssetType(asset: CustomViewAsset): 'image' | 'text' | 'html' {\n // If src exists, it's an image\n if (asset.src) return 'image';\n \n // If content contains HTML tags, it's HTML\n if (asset.content && /<[^>]+>/.test(asset.content)) {\n return 'html';\n }\n \n return 'text';\n}\n\nexport function renderAssetInto(\n el: HTMLElement,\n assetId: string,\n assetsManager: AssetsManager\n) {\n const asset = assetsManager.get(assetId);\n if (!asset) return;\n\n const type = asset.type || detectAssetType(asset);\n\n switch (type) {\n case 'image':\n renderImage(el, asset);\n break;\n case 'text':\n renderText(el, asset);\n break;\n case 'html':\n renderHtml(el, asset);\n break;\n default:\n el.innerHTML = asset.content || String(asset);\n console.warn('[CustomViews] Unknown asset type:', type);\n }\n}\n","import type { ToggleId } from \"../types/types\";\nimport { AssetsManager } from \"./assets-manager\";\nimport { renderAssetInto } from \"./render\";\n\n/**\n * ToggleManager handles discovery, visibility, and asset rendering for toggle elements\n */\nexport class ToggleManager {\n /**\n * Apply toggle visibility to a given list of toggle elements\n */\n public static applyToggles(elements: HTMLElement[], activeToggles: ToggleId[]): void {\n elements.forEach(el => {\n const categories = this.getToggleCategories(el);\n const shouldShow = categories.some(cat => activeToggles.includes(cat));\n this.applyToggleVisibility(el, shouldShow);\n });\n }\n\n /**\n * Render assets into a given list of toggle elements that are currently visible\n */\n public static renderAssets(elements: HTMLElement[], activeToggles: ToggleId[], assetsManager: AssetsManager): void {\n elements.forEach(el => {\n const categories = this.getToggleCategories(el);\n const toggleId = this.getToggleId(el);\n const isRendered = el.dataset.cvRendered === 'true';\n\n if (toggleId && !isRendered && categories.some(cat => activeToggles.includes(cat))) {\n renderAssetInto(el, toggleId, assetsManager);\n el.dataset.cvRendered = 'true';\n }\n });\n }\n\n /**\n * Get toggle categories from an element (supports both data attributes and cv-toggle elements)\n */\n private static getToggleCategories(el: HTMLElement): string[] {\n if (el.tagName.toLowerCase() === 'cv-toggle') {\n const category = el.getAttribute('category');\n return (category || '').split(/\\s+/).filter(Boolean);\n } else {\n const data = el.dataset.cvToggle || el.dataset.customviewsToggle;\n return (data || '').split(/\\s+/).filter(Boolean);\n }\n }\n\n /**\n * Get toggle ID from an element\n */\n private static getToggleId(el: HTMLElement): string | undefined {\n return el.dataset.cvId || el.dataset.customviewsId || el.getAttribute('data-cv-id') || el.getAttribute('data-customviews-id') || undefined;\n }\n\n /**\n * Apply simple class-based visibility to a toggle element\n */\n private static applyToggleVisibility(el: HTMLElement, visible: boolean): void {\n if (visible) {\n el.classList.remove('cv-hidden');\n el.classList.add('cv-visible');\n } else {\n el.classList.add('cv-hidden');\n el.classList.remove('cv-visible');\n }\n }\n\n /**\n * Scans a given DOM subtree for toggle elements and initializes them.\n * This includes applying visibility and rendering assets.\n */\n public static initializeToggles(\n root: HTMLElement,\n activeToggles: ToggleId[],\n assetsManager: AssetsManager\n ): void {\n const elements: HTMLElement[] = [];\n if (root.matches('[data-cv-toggle], [data-customviews-toggle], cv-toggle')) {\n elements.push(root);\n }\n root.querySelectorAll('[data-cv-toggle], [data-customviews-toggle], cv-toggle').forEach(el => elements.push(el as HTMLElement));\n\n if (elements.length === 0) return;\n\n this.applyToggles(elements, activeToggles);\n this.renderAssets(elements, activeToggles, assetsManager);\n }\n}","// src/utils/scroll-manager.ts\n\nexport class ScrollManager {\n /**\n * Finds the highest tab group currently in the viewport.\n * This is intended to be called BEFORE the state changes, to identify which element to scroll to.\n * @returns The HTMLElement of the highest visible tab group, or null if none are found.\n */\n public static findHighestVisibleTabGroup(): HTMLElement | null {\n // console.log('[ScrollManager] Finding highest visible tab group.');\n\n // 1. Detect fixed/sticky header and calculate its height for offset.\n let headerOffset = 0;\n const headerEl = document.querySelector('header');\n let isHeaderFixedOrSticky = false;\n if (headerEl) {\n const headerStyle = window.getComputedStyle(headerEl);\n isHeaderFixedOrSticky = ['fixed', 'sticky'].includes(headerStyle.position);\n if (isHeaderFixedOrSticky) {\n headerOffset = headerEl.getBoundingClientRect().height;\n }\n }\n const contentTop = headerOffset; // Viewport-relative position where content begins.\n\n // 2. Find all tab groups, filtering out any inside the main header.\n const allTabGroups = Array.from(document.querySelectorAll<HTMLElement>('cv-tabgroup'));\n const candidateGroups = allTabGroups.filter(groupEl => {\n if (isHeaderFixedOrSticky && headerEl && groupEl.closest('header') === headerEl) {\n return false;\n }\n return true;\n });\n\n // 3. Find the highest group that is visible in the content area (below the header).\n let highestVisibleGroup: HTMLElement | null = null;\n let highestVisibleGroupTop = Infinity;\n\n for (const groupEl of candidateGroups) {\n const rect = groupEl.getBoundingClientRect();\n // A group is \"visible\" if it's not completely above the content area or completely below the viewport.\n const isVisibleInContentArea = rect.bottom > contentTop && rect.top < window.innerHeight;\n \n if (isVisibleInContentArea) {\n // We want the one with the smallest 'top' value (closest to the top of the viewport).\n if (rect.top < highestVisibleGroupTop) {\n highestVisibleGroup = groupEl;\n highestVisibleGroupTop = rect.top;\n }\n }\n }\n \n return highestVisibleGroup;\n }\n\n /**\n * Scrolls the page to align the given tab group's header (or the group itself) \n * to the top of the viewport, accounting for a fixed/sticky page header.\n * This should be called AFTER the content has changed.\n * @param groupEl The tab group element to scroll to.\n */\n public static scrollToTabGroup(groupEl: HTMLElement): void {\n // console.log('[ScrollManager] Scrolling to tab group:', groupEl);\n\n // 1. Detect fixed/sticky header and calculate its height for offset.\n let headerOffset = 0;\n const headerEl = document.querySelector('header');\n if (headerEl) {\n const headerStyle = window.getComputedStyle(headerEl);\n if (['fixed', 'sticky'].includes(headerStyle.position)) {\n headerOffset = headerEl.getBoundingClientRect().height;\n }\n }\n const PADDING_BELOW_HEADER = 20; // Extra space.\n\n // 2. Calculate the target position.\n const targetElementRect = groupEl.getBoundingClientRect();\n\n // Calculate the absolute top position of the target element in the document.\n const scrollTargetY = targetElementRect.top + window.scrollY;\n\n // Adjust for the header offset and padding to position it just below the header.\n const finalScrollY = scrollTargetY - headerOffset - PADDING_BELOW_HEADER;\n\n // change to 'auto' if instant scroll is preferred.\n window.scrollTo({\n top: finalScrollY,\n behavior: 'smooth',\n });\n }\n\n /**\n * Adjusts the scroll position to keep a specific element in the same visual location\n * after a content change. This is useful for preventing the page from jumping when\n * content above the element is added or removed.\n * @param scrollAnchor An object containing the element to anchor and its initial top position.\n */\n public static handleScrollAnchor(scrollAnchor: { element: HTMLElement; top: number }): void {\n requestAnimationFrame(() => {\n const { element, top: initialTop } = scrollAnchor;\n const newTop = element.getBoundingClientRect().top;\n const scrollDelta = newTop - initialTop;\n\n // Only scroll if there's a noticeable change to avoid jitter\n if (Math.abs(scrollDelta) > 1) {\n window.scrollBy({\n top: scrollDelta,\n behavior: 'instant'\n });\n }\n });\n }\n}\n","/**\n * Styles for toggle visibility and animations\n */\n\nexport const TOGGLE_STYLES = `\n/* Core toggle visibility transitions */\n[data-cv-toggle], [data-customviews-toggle], cv-toggle {\n transition: opacity 150ms ease,\n transform 150ms ease,\n max-height 200ms ease,\n margin 150ms ease;\n will-change: opacity, transform, max-height, margin;\n}\n\n.cv-visible {\n opacity: 1 !important;\n transform: translateY(0) !important;\n max-height: var(--cv-max-height, 9999px) !important;\n}\n\n.cv-hidden {\n opacity: 0 !important;\n transform: translateY(-4px) !important;\n pointer-events: none !important;\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n border-top-width: 0 !important;\n border-bottom-width: 0 !important;\n max-height: 0 !important;\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n overflow: hidden !important;\n}\n`;\n","/**\n * Styles for tab groups and tab navigation\n */\n\nexport const TAB_STYLES = `\n/* Tab navigation styles - Bootstrap-style tabs matching MarkBind */\n.cv-tabs-nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-top: 0.5rem;\n margin-bottom: 1rem;\n list-style: none;\n border-bottom: 1px solid #dee2e6;\n\n align-items: stretch;\n}\n\n.cv-tabs-nav .nav-item {\n margin-bottom: -1px;\n list-style: none;\n display: flex; /* was inline-block → make flex to stretch height */\n align-items: stretch; /* stretch link to full height */\n}\n\n.cv-tabs-nav .nav-link {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 1rem;\n color: #495057;\n text-decoration: none;\n background-color: transparent;\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n cursor: pointer;\n min-height: 2.5rem;\n box-sizing: border-box;\n}\n\n.cv-tabs-nav .nav-link p {\n margin: 0; /* remove default margins */\n display: inline; /* or inline-block */\n}\n\n/* Tab header container with pin icon */\n.cv-tab-header-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.cv-tab-header-text {\n flex: 1;\n}\n\n.cv-tab-pin-icon {\n display: inline-block;\n line-height: 0;\n flex-shrink: 0;\n}\n\n.cv-tab-pin-icon svg {\n vertical-align: middle;\n width: 14px;\n height: 14px;\n}\n\n.cv-tabs-nav .nav-link:hover,\n.cv-tabs-nav .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n isolation: isolate;\n}\n\n.cv-tabs-nav .nav-link.active {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.cv-tabs-nav .nav-link:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n/* Legacy button-based nav (deprecated, kept for compatibility) */\n.cv-tabs-nav-item {\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: 0.5rem 1rem;\n cursor: pointer;\n font-size: 1rem;\n color: #6c757d;\n transition: color 150ms ease, border-color 150ms ease;\n}\n\n.cv-tabs-nav-item:hover {\n color: #495057;\n border-bottom-color: #dee2e6;\n}\n\n.cv-tabs-nav-item.active {\n color: #007bff;\n border-bottom-color: #007bff;\n font-weight: 500;\n}\n\n.cv-tabs-nav-item:focus {\n outline: 2px solid #007bff;\n outline-offset: 2px;\n}\n\n/* Tab panel base styles */\ncv-tab {\n display: block;\n}\n\n/* Hide cv-tab-header source element; content is extracted to nav link */\ncv-tab-header {\n display: none !important;\n}\n\n/* Allow cv-tab-body to flow naturally */\ncv-tab-body {\n display: block;\n}\n\n/* Override visibility for tab panels - use display instead of collapse animation */\ncv-tab.cv-hidden {\n display: none !important;\n}\n\ncv-tab.cv-visible {\n display: block !important;\n}\n\ncv-tabgroup {\n display: block;\n margin-bottom: 1.5rem;\n}\n\n/* Bottom border line for tab groups */\n.cv-tabgroup-bottom-border {\n border-bottom: 1px solid #dee2e6;\n margin-top: 1rem;\n}\n\n/* Tab content wrapper */\n.cv-tab-content {\n padding: 1rem 0;\n}\n\n/* Viewer-controlled nav visibility: hide nav containers when requested */\n.cv-tabs-nav-hidden {\n display: none !important;\n}\n\n/* Print-friendly: hide tab navigation when printing to reduce clutter */\n@media print {\n .cv-tabs-nav {\n display: none !important;\n }\n}\n`;\n","import { TOGGLE_STYLES } from './toggle-styles';\nimport { TAB_STYLES } from './tab-styles';\n\n/**\n * Combined core styles for toggles and tabs\n */\nconst CORE_STYLES = `\n${TOGGLE_STYLES}\n\n${TAB_STYLES}\n`;\n\n/**\n * Add styles for hiding and showing toggles animations and transitions to the document head\n */\nexport function injectCoreStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.querySelector('#cv-core-styles')) return;\n const style = document.createElement('style');\n style.id = 'cv-core-styles';\n style.textContent = CORE_STYLES;\n document.head.appendChild(style);\n}\n\n// Export individual style modules for flexibility\nexport { TOGGLE_STYLES } from './toggle-styles';\nexport { TAB_STYLES } from './tab-styles';\n\n\n","export const TOAST_STYLE_ID = 'cv-toast-styles';\nexport const TOAST_CLASS = 'cv-toast-notification';\n\nexport const TOAST_STYLES = `\n .cv-toast-notification {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n background-color: #323232;\n color: white;\n padding: 12px 24px;\n border-radius: 4px;\n z-index: 100000;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none; /* Let clicks pass through if needed, though usually it blocks */\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n }\n`;\n","import { TOAST_STYLES, TOAST_STYLE_ID, TOAST_CLASS } from '../styles/toast-styles';\n\n/**\n * Manages toast notifications for the application.\n */\nexport class ToastManager {\n private static isStyleInjected = false;\n private static toastEl: HTMLElement | null = null;\n private static navTimeout: any = null;\n private static fadeTimeout: any = null;\n\n public static show(message: string, duration: number = 2500): void {\n this.injectStyles();\n\n // specific reuse logic\n if (!this.toastEl) {\n this.toastEl = document.createElement('div');\n this.toastEl.className = TOAST_CLASS;\n document.body.appendChild(this.toastEl);\n }\n\n // Reset state\n this.toastEl.textContent = message;\n this.toastEl.style.opacity = '0';\n this.toastEl.style.display = 'block';\n\n // Clear any pending dismissal\n if (this.navTimeout) clearTimeout(this.navTimeout);\n if (this.fadeTimeout) clearTimeout(this.fadeTimeout);\n\n // Trigger reflow & fade in\n requestAnimationFrame(() => {\n if (this.toastEl) this.toastEl.style.opacity = '1';\n });\n\n // Schedule fade out\n this.navTimeout = setTimeout(() => {\n if (this.toastEl) this.toastEl.style.opacity = '0';\n\n this.fadeTimeout = setTimeout(() => {\n if (this.toastEl) this.toastEl.style.display = 'none';\n }, 300);\n }, duration);\n }\n\n private static injectStyles(): void {\n if (this.isStyleInjected) return;\n if (document.getElementById(TOAST_STYLE_ID)) {\n this.isStyleInjected = true;\n return;\n }\n\n const style = document.createElement('style');\n style.id = TOAST_STYLE_ID;\n style.innerHTML = TOAST_STYLES;\n document.head.appendChild(style);\n this.isStyleInjected = true;\n }\n}\n","\n/**\n * Descriptor for an anchor that represents a DOM element.\n */\ninterface AnchorDescriptor {\n tag: string; // e.g., \"P\", \"BLOCKQUOTE\"\n index: number; // e.g., 2 (It is the 2nd <p> in the container)\n parentId?: string; // ID of the nearest parent that HAS a hard ID (e.g., #section-configuration)\n textSnippet: string; // First 32 chars of text content (normalized)\n textHash: number; // A simple hash of the full text content\n}\n\n/**\n * Engine for generating and resolving robust anchors.\n * \n * It implements a simple anchor generation and resolution algorithm that uses a combination of \n * structural, contextual, and content-based hints to generate a unique anchor for a given DOM element.\n * \n * The anchor is generated by first creating an AnchorDescriptor for the element, which contains \n * information about the element's tag, index, parent ID, and text content. This descriptor is then \n * serialized into a URL-safe string using a minification algorithm.\n * \n * The anchor is then resolved by searching for the element in the DOM using the serialized string.\n * \n */\nexport class AnchorEngine {\n\n /**\n * Generates a simple hash code for a string.\n * \n * It takes each character's Unicode code point and uses it to update the hash value.\n */\n private static hashCode(str: string): number {\n let hash = 0;\n if (str.length === 0) return hash;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n }\n\n /**\n * Normalizes text content by removing excessive whitespace.\n * \n * It trims leading and trailing whitespace and replaces multiple spaces with a single space.\n */\n private static normalizeText(text: string): string {\n return text.trim().replace(/\\s+/g, ' ');\n }\n\n /**\n * Creates an AnchorDescriptor for a given DOM element.\n */\n static createDescriptor(el: HTMLElement): AnchorDescriptor {\n const tag = el.tagName;\n const textContent = el.textContent || \"\";\n const normalizedText = this.normalizeText(textContent);\n\n // Find nearest parent with an ID\n let parentId: string | undefined;\n let parent = el.parentElement;\n while (parent) {\n if (parent.id) {\n parentId = parent.id;\n break;\n }\n parent = parent.parentElement;\n }\n\n // Calculate index relative to the container (either the found parent or document.body)\n const container = parent || document.body;\n const siblings = Array.from(container.querySelectorAll(tag));\n // Index is the position of the element in the list of siblings, where siblings are those of the same tag.\n const index = siblings.indexOf(el);\n\n const descriptor: AnchorDescriptor = {\n tag,\n index: index !== -1 ? index : 0,\n textSnippet: normalizedText.substring(0, 32),\n textHash: this.hashCode(normalizedText)\n };\n\n if (parentId) {\n descriptor.parentId = parentId;\n }\n\n return descriptor;\n }\n\n /**\n * Serializes a list of AnchorDescriptors into a URL-safe string.\n */\n static serialize(descriptors: AnchorDescriptor[]): string {\n // Minify keys for compactness\n const minified = descriptors.map(d => ({\n t: d.tag,\n i: d.index,\n p: d.parentId,\n s: d.textSnippet,\n h: d.textHash\n }));\n const json = JSON.stringify(minified);\n // Base64 encode\n return btoa(encodeURIComponent(json));\n }\n\n /**\n * Deserializes a URL-safe string back into a list of AnchorDescriptors.\n */\n static deserialize(encoded: string): AnchorDescriptor[] {\n try {\n const json = decodeURIComponent(atob(encoded));\n const minified = JSON.parse(json);\n return minified.map((m: any) => ({\n tag: m.t,\n index: m.i,\n parentId: m.p,\n textSnippet: m.s,\n textHash: m.h\n }));\n } catch (e) {\n console.error(\"Failed to deserialize anchor:\", e);\n return [];\n }\n }\n\n /**\n * Finds the best DOM element match for a descriptor.\n */\n static resolve(root: HTMLElement, descriptor: AnchorDescriptor): HTMLElement | null {\n // 1. Scope\n let scope: HTMLElement = root;\n if (descriptor.parentId) {\n const foundParent = root.querySelector(`#${descriptor.parentId}`);\n if (foundParent instanceof HTMLElement) {\n scope = foundParent;\n } else {\n // Fallback: if parent ID not found, search global root - document.body\n const globalParent = document.getElementById(descriptor.parentId);\n if (globalParent) {\n scope = globalParent;\n }\n }\n }\n\n // 2. Candidate Search\n const candidates = Array.from(scope.querySelectorAll(descriptor.tag)) as HTMLElement[];\n\n // 3. Scoring\n let bestMatch: HTMLElement | null = null;\n let highestScore = 0;\n\n candidates.forEach((candidate) => {\n let score = 0;\n const text = this.normalizeText(candidate.textContent || \"\");\n\n // Exact Text Match (Hash check is faster proxy for full string compare, but let's check hash first)\n if (this.hashCode(text) === descriptor.textHash) {\n score += 50;\n } else if (text.startsWith(descriptor.textSnippet)) {\n // Fuzzy Text Match (Snippet) - +30 score\n score += 30;\n }\n\n // Structural Match (Index)\n // We need to re-calculate index of this candidate to compare with descriptor.index\n // The descriptor.index is relative to the *found* parentId container.\n // So we must compare index within the scope we are searching.\n const siblings = Array.from(scope.querySelectorAll(descriptor.tag));\n const index = siblings.indexOf(candidate);\n if (index === descriptor.index) {\n score += 10;\n }\n\n if (score > highestScore) {\n highestScore = score;\n bestMatch = candidate;\n }\n });\n\n // 4. Winner\n if (highestScore > 30) {\n return bestMatch;\n }\n\n return null;\n }\n}\n","export const SHARE_MODE_STYLE_ID = 'cv-share-mode-styles';\nexport const FLOATING_ACTION_BAR_ID = 'cv-floating-action-bar';\nexport const HOVER_HELPER_ID = 'cv-hover-helper';\n\nexport const HIGHLIGHT_TARGET_CLASS = 'cv-highlight-target';\nexport const SELECTED_CLASS = 'cv-share-selected';\n\n/**\n * CSS styles to be injected during Share Mode.\n */\nexport const SHARE_MODE_STYLES = `\n body.cv-share-mode {\n cursor: default;\n }\n\n /* Highlight outlines */\n .${HIGHLIGHT_TARGET_CLASS} {\n outline: 2px dashed #0078D4 !important;\n outline-offset: 2px;\n cursor: crosshair;\n }\n\n .${SELECTED_CLASS} {\n outline: 3px solid #005a9e !important;\n outline-offset: 2px;\n background-color: rgba(0, 120, 212, 0.05);\n }\n\n /* Floating Action Bar */\n #${FLOATING_ACTION_BAR_ID} {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n background-color: #2c2c2c;\n color: #f1f1f1;\n border-radius: 8px;\n padding: 12px 20px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n display: flex;\n align-items: center;\n gap: 16px;\n z-index: 99999;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n border: 1px solid #4a4a4a;\n }\n\n #${FLOATING_ACTION_BAR_ID} .cv-action-button {\n background-color: #0078D4;\n color: white;\n border: none;\n padding: 8px 14px;\n border-radius: 5px;\n cursor: pointer;\n font-weight: 500;\n transition: background-color 0.2s;\n }\n \n #${FLOATING_ACTION_BAR_ID} .cv-action-button:hover {\n background-color: #005a9e;\n }\n\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.clear {\n background-color: #5a5a5a;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.clear:hover {\n background-color: #4a4a4a;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.clear:hover {\n background-color: #4a4a4a;\n }\n\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.preview {\n background-color: #106ebe;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.preview:hover {\n background-color: #005a9e;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.exit {\n background-color: #d13438;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.exit:hover {\n background-color: #a42628;\n }\n\n /* Hover Helper (Smart Label & Level Up) */\n #${HOVER_HELPER_ID} {\n position: fixed;\n z-index: 99999;\n background-color: #333;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-family: monospace;\n display: none;\n pointer-events: auto; /* Allow clicking buttons inside */\n align-items: center;\n gap: 8px;\n box-shadow: 0 2px 5px rgba(0,0,0,0.2);\n }\n\n #${HOVER_HELPER_ID} button {\n background: #555;\n border: none;\n color: white;\n border-radius: 3px;\n cursor: pointer;\n padding: 2px 6px;\n font-size: 14px;\n line-height: 1;\n }\n #${HOVER_HELPER_ID} button:hover {\n background: #777;\n }\n\n`;\n","\nimport { ToastManager } from './toast-manager';\nimport { AnchorEngine } from './anchor-engine';\n\nimport {\n SHARE_MODE_STYLES,\n SHARE_MODE_STYLE_ID,\n FLOATING_ACTION_BAR_ID,\n HOVER_HELPER_ID,\n HIGHLIGHT_TARGET_CLASS,\n SELECTED_CLASS\n} from '../styles/share-mode-styles';\n\nconst CV_CUSTOM_ELEMENTS = 'cv-tabgroup, cv-toggle';\nconst SHAREABLE_SELECTOR = 'div, p, blockquote, pre, li, h1, h2, h3, h4, h5, h6, [data-share], ' + CV_CUSTOM_ELEMENTS;\n\n// TODO: Add interface for plugin users to define what is excluded selection.\n// const EXCLUDED_ELEMENTS = 'header, nav, footer';\n// const EXCLUDED_IDS = 'cv-floating-action-bar';\n\nexport interface ShareManagerOptions {\n excludedTags: string[];\n excludedIds: string[];\n}\n\n/**\n * Manages the \"Share Mode\" for creating custom focus links.\n * Implementing Robust Granular Sharing with \"Innermost Wins\" and \"Level Up\" UI.\n */\nexport class ShareManager {\n private isActive = false;\n private selectedElements = new Set<HTMLElement>();\n private floatingBarEl: HTMLElement | null = null;\n private helperEl: HTMLElement | null = null;\n private currentHoverTarget: HTMLElement | null = null;\n private excludedTags: Set<string>;\n private excludedIds: Set<string>;\n private boundHandleHover: (e: MouseEvent) => void;\n private boundHandleClick: (e: MouseEvent) => void;\n private boundHandleKeydown: (e: KeyboardEvent) => void;\n\n constructor(options: ShareManagerOptions) {\n this.excludedTags = new Set(options.excludedTags.map(t => t.toUpperCase()));\n this.excludedIds = new Set(options.excludedIds);\n this.boundHandleHover = this.handleHover.bind(this);\n this.boundHandleClick = this.handleClick.bind(this);\n this.boundHandleKeydown = this.handleKeydown.bind(this);\n }\n\n private listeners: Array<(isActive: boolean) => void> = [];\n\n public addStateChangeListener(listener: (isActive: boolean) => void): void {\n this.listeners.push(listener);\n }\n\n public removeStateChangeListener(listener: (isActive: boolean) => void): void {\n this.listeners = this.listeners.filter(l => l !== listener);\n }\n\n private notifyListeners(): void {\n this.listeners.forEach(listener => listener(this.isActive));\n }\n\n public toggleShareMode(): void {\n this.isActive = !this.isActive;\n if (this.isActive) {\n this.activate();\n } else {\n this.cleanup();\n }\n this.notifyListeners();\n }\n\n /**\n * Activates the share mode.\n * Injects styles, creates floating bar, and helper element.\n * Adds event listeners for hover and click.\n */\n private activate(): void {\n this.injectStyles();\n this.createFloatingBar();\n this.helperEl = this.createHelperPopover();\n\n // Event Listeners\n document.addEventListener('mouseover', this.boundHandleHover, true);\n document.addEventListener('click', this.boundHandleClick, true);\n document.addEventListener('keydown', this.boundHandleKeydown, true);\n }\n\n private injectStyles(): void {\n const styleElement = document.createElement('style');\n styleElement.id = SHARE_MODE_STYLE_ID;\n styleElement.innerHTML = SHARE_MODE_STYLES;\n document.head.appendChild(styleElement);\n }\n\n /**\n * Creates the hover helper element that shows up when hovering over a shareable element.\n */\n private createHelperPopover(): HTMLElement {\n const div = document.createElement('div');\n div.id = HOVER_HELPER_ID;\n div.innerHTML = `\n <span id=\"cv-helper-tag\">TAG</span>\n <button id=\"cv-helper-select-btn\" title=\"Select This Element\">✓</button>\n <button id=\"cv-helper-up-btn\" title=\"Select Parent\">↰</button>\n `;\n document.body.appendChild(div);\n\n // Select parent button\n div.querySelector('#cv-helper-up-btn')?.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.handleSelectParent();\n });\n\n // Select element button\n div.querySelector('#cv-helper-select-btn')?.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (this.currentHoverTarget) {\n this.toggleSelection(this.currentHoverTarget);\n }\n });\n\n return div;\n }\n\n /**\n * Handles mouse hover events.\n *\n * This function is called when the user hovers over an element.\n * It checks if the element is shareable and highlights it.\n * If a parent element is already selected, it highlights the parent instead,\n * allowing the helper to remain visible for the selected parent.\n *\n * @param e The mouse event triggered by the hover.\n */\n private handleHover(e: MouseEvent): void {\n if (!this.isActive) return;\n\n // Check if we are hovering over the helper itself\n if (this.helperEl && this.helperEl.contains(e.target as Node)) {\n return;\n }\n\n const target = e.target as HTMLElement;\n\n // Exclude by Tag or ID\n const upperTag = target.tagName.toUpperCase();\n if (this.excludedTags.has(upperTag) || (target.id && this.excludedIds.has(target.id))) {\n return;\n }\n\n // Check closest excluded (for nested elements in excluded regions)\n let ancestor = target.parentElement;\n while (ancestor) {\n if (this.excludedTags.has(ancestor.tagName.toUpperCase()) || (ancestor.id && this.excludedIds.has(ancestor.id))) {\n return;\n }\n ancestor = ancestor.parentElement;\n }\n\n // Find closest shareable parent element\n const shareablePart = target.closest(SHAREABLE_SELECTOR);\n if (!shareablePart) {\n this.clearHover();\n return;\n }\n\n // Cast to HTMLElement\n const finalTarget = shareablePart as HTMLElement;\n\n // Check if any ancestor is already selected. If so, do NOT highlight this child.\n // Instead, highlight (or keep highlighted) the SELECTED PARENT so the user can see the helper for it.\n let parent = finalTarget.parentElement;\n let selectedAncestor: HTMLElement | null = null;\n\n // Loop outwards until we find a selected parent or reach the top\n while (parent) {\n if (this.selectedElements.has(parent)) {\n selectedAncestor = parent;\n break;\n }\n parent = parent.parentElement;\n }\n\n if (selectedAncestor) {\n // If we are hovering deep inside a selected block, show the helper for that block\n this.setNewHoverTarget(selectedAncestor);\n return;\n }\n\n // stop bubbling to parent\n // when element found for highlight\n e.stopPropagation();\n\n // If we are already on this target, do nothing (and keep it selected/highlighted)\n if (this.currentHoverTarget === finalTarget) return;\n\n // Highlight\n this.setNewHoverTarget(finalTarget);\n }\n\n private setNewHoverTarget(target: HTMLElement): void {\n if (this.currentHoverTarget) {\n this.currentHoverTarget.classList.remove(HIGHLIGHT_TARGET_CLASS);\n }\n this.currentHoverTarget = target;\n this.currentHoverTarget.classList.add(HIGHLIGHT_TARGET_CLASS);\n this.positionHelper(target);\n }\n\n private positionHelper(target: HTMLElement): void {\n if (!this.helperEl) return;\n\n const rect = target.getBoundingClientRect();\n const tagLabel = this.helperEl.querySelector('#cv-helper-tag');\n const upBtn = this.helperEl.querySelector('#cv-helper-up-btn') as HTMLElement;\n\n if (tagLabel) tagLabel.textContent = target.tagName;\n\n // Position at top-right of the element\n // Prevent going off-screen\n let top = rect.top - 20;\n if (top < 0) top = rect.top + 10; // Flip down if too close to top\n\n let left = rect.right - 80;\n if (left < 0) left = 10;\n\n this.helperEl.style.display = 'flex';\n this.helperEl.style.top = `${top}px`;\n this.helperEl.style.left = `${left}px`;\n\n // Update Select Button State (Tick or Cross)\n const selectBtn = this.helperEl.querySelector('#cv-helper-select-btn') as HTMLElement;\n if (selectBtn) {\n if (this.selectedElements.has(target)) {\n selectBtn.textContent = '✕';\n selectBtn.title = 'Deselect This Element';\n selectBtn.style.backgroundColor = '#d13438'; // Reddish\n } else {\n selectBtn.textContent = '✓';\n selectBtn.title = 'Select This Element';\n selectBtn.style.backgroundColor = ''; // Reset\n }\n }\n\n // Ancestry Check\n const parent = target.parentElement;\n const parentIsShareable = parent && parent.matches(SHAREABLE_SELECTOR);\n if (parentIsShareable) {\n upBtn.style.display = 'inline-block';\n } else {\n upBtn.style.display = 'none';\n }\n }\n\n private handleSelectParent(): void {\n if (this.currentHoverTarget && this.currentHoverTarget.parentElement) {\n const parent = this.currentHoverTarget.parentElement;\n if (parent.matches(SHAREABLE_SELECTOR)) {\n this.setNewHoverTarget(parent);\n }\n }\n }\n\n private handleClick(e: MouseEvent): void {\n if (!this.isActive) return;\n\n // If clicking helper\n if (this.helperEl && this.helperEl.contains(e.target as Node)) return;\n // If clicking floating bar\n if (this.floatingBarEl && this.floatingBarEl.contains(e.target as Node)) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n if (this.currentHoverTarget) {\n this.toggleSelection(this.currentHoverTarget);\n }\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n if (!this.isActive) return;\n\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n this.toggleShareMode();\n }\n }\n\n /**\n * Toggles the selection state of a given HTML element.\n * Implements selection logic:\n * - If an ancestor of the element is already selected, the click is ignored.\n * - If the element being selected is a parent of already selected elements, those children are deselected.\n * @param el The HTMLElement to toggle selection for.\n */\n private toggleSelection(el: HTMLElement): void {\n if (this.selectedElements.has(el)) {\n this.selectedElements.delete(el);\n el.classList.remove(SELECTED_CLASS);\n } else {\n // Selection Logic\n // Scenario A: Selecting a Parent -> Remove children selected while selecting parent\n // Scenario B: Selecting a Child -> Ignore if ancestor selected (or handle)\n\n // B. Check if any ancestor is already selected, return if any (Scenario B)\n let parent = el.parentElement;\n while (parent) {\n if (this.selectedElements.has(parent)) {\n // Ancestor is selected. Ignore click.\n return;\n }\n parent = parent.parentElement;\n }\n\n // A. Check if any children are selected (Scenario A)\n // We must iterate over currently selected elements\n const toRemove: HTMLElement[] = [];\n this.selectedElements.forEach(selected => {\n if (el.contains(selected) && el !== selected) {\n toRemove.push(selected);\n }\n });\n\n toRemove.forEach(child => {\n this.selectedElements.delete(child);\n child.classList.remove(SELECTED_CLASS);\n });\n\n // Add new selection\n this.selectedElements.add(el);\n el.classList.add(SELECTED_CLASS);\n }\n this.updateFloatingBarCount();\n }\n\n\n\n private createFloatingBar(): void {\n const bar = document.createElement('div');\n bar.id = FLOATING_ACTION_BAR_ID;\n bar.innerHTML = `\n <span id=\"cv-selected-count\">0 items selected</span>\n <button class=\"cv-action-button clear\">Clear All</button>\n <button class=\"cv-action-button preview\">Preview</button>\n <button class=\"cv-action-button generate\">Generate Link</button>\n <button class=\"cv-action-button exit\">Exit</button>\n `;\n document.body.appendChild(bar);\n this.floatingBarEl = bar;\n\n bar.querySelector('.clear')?.addEventListener('click', () => this.clearAll());\n bar.querySelector('.preview')?.addEventListener('click', () => this.previewLink());\n bar.querySelector('.generate')?.addEventListener('click', () => this.generateLink());\n bar.querySelector('.exit')?.addEventListener('click', () => this.toggleShareMode());\n }\n\n private updateFloatingBarCount(): void {\n if (this.floatingBarEl) {\n const countElement = this.floatingBarEl.querySelector('#cv-selected-count');\n if (countElement) {\n const count = this.selectedElements.size;\n countElement.textContent = `${count} item${count === 1 ? '' : 's'} selected`;\n }\n }\n }\n\n private clearAll(): void {\n this.selectedElements.forEach(el => el.classList.remove('cv-share-selected'));\n this.selectedElements.clear();\n this.updateFloatingBarCount();\n }\n\n private getShareUrl(): URL | null {\n if (this.selectedElements.size === 0) {\n return null;\n }\n\n const descriptors = Array.from(this.selectedElements).map(el => AnchorEngine.createDescriptor(el));\n const serialized = AnchorEngine.serialize(descriptors);\n\n const url = new URL(window.location.href);\n url.searchParams.set('cv-focus', serialized);\n return url;\n }\n\n private async generateLink(): Promise<void> {\n const url = this.getShareUrl();\n if (!url) {\n ToastManager.show('Please select at least one item.');\n return;\n }\n\n try {\n await navigator.clipboard.writeText(url.toString());\n ToastManager.show('Link copied to clipboard!');\n } catch (e) {\n console.error('Clipboard failed', e);\n ToastManager.show('Failed to copy link.');\n }\n }\n\n private previewLink(): void {\n const url = this.getShareUrl();\n if (!url) {\n ToastManager.show('Please select at least one item.');\n return;\n }\n window.open(url.toString(), '_blank');\n }\n\n\n\n private clearHover(): void {\n if (this.currentHoverTarget) {\n this.currentHoverTarget.classList.remove(HIGHLIGHT_TARGET_CLASS);\n this.currentHoverTarget = null;\n }\n if (this.helperEl) {\n this.helperEl.style.display = 'none';\n }\n }\n\n public cleanup(): void {\n document.body.classList.remove('cv-share-mode');\n this.clearAll();\n\n const style = document.getElementById(SHARE_MODE_STYLE_ID);\n if (style) document.head.removeChild(style);\n\n if (this.floatingBarEl) {\n document.body.removeChild(this.floatingBarEl);\n this.floatingBarEl = null;\n }\n\n if (this.helperEl) {\n document.body.removeChild(this.helperEl);\n this.helperEl = null;\n }\n\n if (this.currentHoverTarget) {\n this.currentHoverTarget.classList.remove(HIGHLIGHT_TARGET_CLASS);\n this.currentHoverTarget = null;\n }\n\n document.removeEventListener('mouseover', this.boundHandleHover, true);\n document.removeEventListener('click', this.boundHandleClick, true);\n document.removeEventListener('keydown', this.boundHandleKeydown, true);\n\n this.isActive = false;\n }\n}\n","export const FOCUS_MODE_STYLE_ID = 'cv-focus-mode-styles';\nexport const BODY_FOCUS_CLASS = 'cv-focus-mode';\nexport const HIDDEN_CLASS = 'cv-focus-hidden';\nexport const FOCUSED_CLASS = 'cv-focused-element';\nexport const DIVIDER_CLASS = 'cv-context-divider';\nexport const EXIT_BANNER_ID = 'cv-exit-focus-banner';\n\nconst styles = `\n body.${BODY_FOCUS_CLASS} {\n /* e.g. potentially hide scrollbars or adjust layout */\n }\n\n .${HIDDEN_CLASS} {\n display: none !important;\n }\n\n .${FOCUSED_CLASS} {\n /* No visual style for focused elements, just logic class for now. Can add borders for debugging*/\n }\n\n .${DIVIDER_CLASS} {\n padding: 12px;\n margin: 16px 0;\n background-color: #f8f8f8;\n border-top: 1px dashed #ccc;\n border-bottom: 1px dashed #ccc;\n color: #555;\n text-align: center;\n cursor: pointer;\n font-family: system-ui, sans-serif;\n font-size: 13px;\n transition: background-color 0.2s;\n }\n .${DIVIDER_CLASS}:hover {\n background-color: #e8e8e8;\n color: #333;\n }\n\n #${EXIT_BANNER_ID} {\n position: sticky;\n top: 0;\n left: 0;\n right: 0;\n background-color: #0078D4;\n color: white;\n padding: 10px 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n z-index: 100000;\n font-family: system-ui, sans-serif;\n box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n }\n\n #${EXIT_BANNER_ID} button {\n background: white;\n color: #0078D4;\n border: none;\n padding: 4px 12px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 600;\n }\n #${EXIT_BANNER_ID} button:hover {\n background: #f0f0f0;\n }\n`;\n\nexport const FOCUS_MODE_STYLES = styles;\n","/**\n * Manages the \"Focus Mode\" (Presentation View).\n * Parses the URL for robust anchors, resolves them, hides irrelevant content, and inserts context dividers.\n */\nimport { ToastManager } from './toast-manager';\nimport { AnchorEngine } from './anchor-engine';\nimport { TOAST_CLASS } from '../styles/toast-styles';\nimport {\n FOCUS_MODE_STYLES,\n FOCUS_MODE_STYLE_ID,\n BODY_FOCUS_CLASS,\n HIDDEN_CLASS,\n FOCUSED_CLASS,\n DIVIDER_CLASS,\n EXIT_BANNER_ID\n} from '../styles/focus-mode-styles';\n\nconst FOCUS_PARAM = 'cv-focus';\n\nexport interface FocusManagerOptions {\n excludedTags: string[];\n excludedIds: string[];\n}\n\nexport class FocusManager {\n\n private hiddenElements = new Set<HTMLElement>();\n private dividers: HTMLElement[] = [];\n private exitBanner: HTMLElement | null = null;\n private excludedTags: Set<string>;\n private excludedIds: Set<string>;\n\n constructor(private rootEl: HTMLElement, options: FocusManagerOptions) {\n this.excludedTags = new Set(options.excludedTags.map(t => t.toUpperCase()));\n this.excludedIds = new Set(options.excludedIds);\n }\n\n /**\n * Initializes the Focus Manager. Checks URL for focus parameter.\n */\n public init(): void {\n this.handleUrlChange();\n }\n\n public handleUrlChange(): void {\n const urlParams = new URLSearchParams(window.location.search);\n const encodedDescriptors = urlParams.get(FOCUS_PARAM);\n\n if (encodedDescriptors) {\n this.applyFocusMode(encodedDescriptors);\n } else {\n // encoding missing, ensure we exit focus mode if active\n if (document.body.classList.contains(BODY_FOCUS_CLASS)) {\n this.exitFocusMode();\n }\n }\n }\n\n /**\n * Applies Focus Mode based on encoded descriptors.\n */\n public applyFocusMode(encodedDescriptors: string): void {\n const descriptors = AnchorEngine.deserialize(encodedDescriptors);\n if (!descriptors || descriptors.length === 0) return;\n\n // Resolve anchors to DOM elements\n const targets: HTMLElement[] = [];\n descriptors.forEach(desc => {\n const el = AnchorEngine.resolve(this.rootEl, desc);\n if (el) {\n targets.push(el);\n }\n });\n\n if (targets.length === 0) {\n ToastManager.show(\"Some shared sections could not be found.\");\n return;\n }\n\n if (targets.length < descriptors.length) {\n ToastManager.show(\"Some shared sections could not be found.\");\n }\n\n this.injectStyles();\n document.body.classList.add(BODY_FOCUS_CLASS);\n this.renderFocusedView(targets);\n this.showExitBanner();\n }\n\n private injectStyles(): void {\n if (document.getElementById(FOCUS_MODE_STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = FOCUS_MODE_STYLE_ID;\n style.textContent = FOCUS_MODE_STYLES;\n document.head.appendChild(style);\n }\n\n /**\n * Hides irrelevant content and adds dividers.\n */\n private renderFocusedView(targets: HTMLElement[]): void {\n // 1. Mark targets\n targets.forEach(t => t.classList.add(FOCUSED_CLASS));\n\n // 2. We need to hide siblings of targets (and their ancestors up to root generally, \n // but \"siblings between focused zones\" suggests we are mostly looking at a flat list or specific nesting).\n //\n // \"All sibling elements between the focused zones are collapsed and hidden.\"\n // \"If a user selects a parent element, all of its child elements must be visible.\"\n //\n // Algorithm:\n // Walk up from each target to finding the common container? \n // Or just assume targets are somewhat related.\n //\n // Let's implement a robust \"Hide Siblings\" approach.\n // For every target, we ensure it is visible.\n // We look at its siblings. If a sibling is NOT a target AND NOT an ancestor of a target, we hide it.\n\n // We need to identify all \"Keep Visible\" elements (targets + ancestors)\n const keepVisible = new Set<HTMLElement>();\n targets.forEach(t => {\n let curr: HTMLElement | null = t;\n while (curr && curr !== document.body && curr !== document.documentElement) {\n keepVisible.add(curr);\n curr = curr.parentElement;\n }\n });\n\n // Now iterate through siblings of \"Keep Visible\" elements?\n // Actually, we can just walk the tree or iterate siblings of targets/ancestors?\n //\n // Improved Algorithm: \n // 1. Collect all direct siblings of every element in keepVisible set.\n // 2. If a sibling is NOT in keepVisible, hide it.\n\n // To avoid processing the entire DOM, we start from targets and walk up.\n keepVisible.forEach(el => {\n if (el === document.body) return; // Don't hide siblings of body (scripts etc) unless we are sure.\n // Actually usually we want to hide siblings of the content container.\n\n const parent = el.parentElement;\n if (!parent) return;\n\n // FIX: \"Parent Dominance\"\n // If the parent itself is a target (or we otherwise decided its whole content is meaningful),\n // then we should NOT hide anything inside it.\n // We check if 'parent' is one of the explicitly resolved targets.\n // We can check if it has the FOCUSED_CLASS class, since we added it in step 1.\n if (parent.classList.contains(FOCUSED_CLASS)) {\n return;\n }\n\n // Using children because we want element nodes\n Array.from(parent.children).forEach(child => {\n if (child instanceof HTMLElement && !keepVisible.has(child)) {\n this.hideElement(child);\n }\n });\n });\n\n // 3. Insert Dividers\n // We process each container that has hidden elements\n const processedContainers = new Set<HTMLElement>();\n\n keepVisible.forEach(el => {\n const parent = el.parentElement;\n if (parent && !processedContainers.has(parent)) {\n this.insertDividersForContainer(parent);\n processedContainers.add(parent);\n }\n });\n }\n\n private hideElement(el: HTMLElement): void {\n if (this.hiddenElements.has(el)) return; // Already hidden\n\n // Exclude by Tag\n if (this.excludedTags.has(el.tagName.toUpperCase())) return;\n\n // Exclude by ID (if strictly matching)\n if (el.id && this.excludedIds.has(el.id)) return;\n\n // Also don't hide things that are aria-hidden\n if (el.getAttribute('aria-hidden') === 'true') return;\n\n // Exclude Toast Notification\n if (el.classList.contains(TOAST_CLASS)) return;\n\n // We check if it is already hidden (e.g. by previous focus mode run? No, isActive check handles that)\n // Just mark it.\n el.classList.add(HIDDEN_CLASS);\n this.hiddenElements.add(el);\n }\n\n private insertDividersForContainer(container: HTMLElement): void {\n const children = Array.from(container.children) as HTMLElement[];\n let hiddenCount = 0;\n let hiddenGroupStart: HTMLElement | null = null;\n\n children.forEach((child) => {\n if (child.classList.contains(HIDDEN_CLASS)) {\n if (hiddenCount === 0) hiddenGroupStart = child;\n hiddenCount++;\n } else {\n // Found a visible element. Was there a hidden group before this?\n if (hiddenCount > 0 && hiddenGroupStart) {\n this.createDivider(container, hiddenGroupStart, hiddenCount);\n hiddenCount = 0;\n hiddenGroupStart = null;\n }\n }\n });\n\n // Trailing hidden group\n if (hiddenCount > 0 && hiddenGroupStart) {\n this.createDivider(container, hiddenGroupStart, hiddenCount);\n }\n }\n\n private createDivider(container: HTMLElement, insertBeforeEl: HTMLElement | null, count: number): void {\n const divider = document.createElement('div');\n divider.className = DIVIDER_CLASS;\n divider.textContent = `... ${count} section${count > 1 ? 's' : ''} hidden (Click to expand) ...`;\n divider.onclick = () => this.expandContext(insertBeforeEl, count, divider);\n\n container.insertBefore(divider, insertBeforeEl);\n this.dividers.push(divider);\n }\n\n private expandContext(firstHidden: HTMLElement | null, count: number, divider: HTMLElement) {\n // Divider is inserted BEFORE firstHidden.\n // So firstHidden is the first element to reveal.\n let curr: Element | null = firstHidden;\n let expanded = 0;\n\n while (curr && expanded < count) {\n if (curr instanceof HTMLElement && curr.classList.contains(HIDDEN_CLASS)) {\n curr.classList.remove(HIDDEN_CLASS);\n this.hiddenElements.delete(curr);\n }\n curr = curr.nextElementSibling;\n // Note: If nested dividers or other elements exist, they shouldn't count?\n // \"Children\" iteration in insertDividers covered direct children.\n // sibling iteration also covers direct children.\n // We assume contiguous hidden siblings.\n expanded++;\n }\n\n divider.remove();\n const idx = this.dividers.indexOf(divider);\n if (idx > -1) this.dividers.splice(idx, 1);\n\n // If no more hidden elements, remove the banner\n if (this.hiddenElements.size === 0) {\n this.removeExitBanner();\n }\n }\n\n private removeExitBanner(): void {\n if (this.exitBanner) {\n this.exitBanner.remove();\n this.exitBanner = null;\n }\n }\n\n /**\n * Override of renderFocusedView with robust logic\n */\n // (We use the class method `renderFocusedView` and internal helpers)\n\n private showExitBanner(): void {\n if (document.getElementById(EXIT_BANNER_ID)) return;\n\n const banner = document.createElement('div');\n banner.id = EXIT_BANNER_ID;\n banner.innerHTML = `\n <span>You are viewing a focused selection.</span>\n <button id=\"cv-exit-focus-btn\">Show Full Page</button>\n `;\n document.body.prepend(banner); // Top of body\n\n banner.querySelector('button')?.addEventListener('click', () => this.exitFocusMode());\n this.exitBanner = banner;\n }\n\n public exitFocusMode(): void {\n document.body.classList.remove(BODY_FOCUS_CLASS);\n\n // Show all hidden elements\n this.hiddenElements.forEach(el => el.classList.remove(HIDDEN_CLASS));\n this.hiddenElements.clear();\n\n // Remove dividers\n this.dividers.forEach(d => d.remove());\n this.dividers = [];\n\n // Remove styling from targets\n const targets = document.querySelectorAll(`.${FOCUSED_CLASS}`);\n targets.forEach(t => t.classList.remove(FOCUSED_CLASS));\n\n // Remove banner\n this.removeExitBanner();\n\n // Update URL\n const url = new URL(window.location.href);\n url.searchParams.delete(FOCUS_PARAM);\n window.history.pushState({}, '', url.toString());\n }\n\n\n}\n","export const DEFAULT_EXCLUDED_TAGS = ['HEADER', 'NAV', 'FOOTER', 'SCRIPT', 'STYLE'];\nexport const DEFAULT_EXCLUDED_IDS = ['cv-floating-action-bar', 'cv-hover-helper', 'cv-toast-notification'];\n","import type { State, TabGroupConfig, Config } from \"../types/types\";\nimport type { AssetsManager } from \"./assets-manager\";\n\nimport { PersistenceManager } from \"./persistence\";\nimport { URLStateManager } from \"./url-state-manager\";\nimport { VisibilityManager } from \"./visibility-manager\";\nimport { TabManager } from \"./tab-manager\";\nimport { ToggleManager } from \"./toggle-manager\";\nimport { ScrollManager } from \"../utils/scroll-manager\";\nimport { injectCoreStyles } from \"../styles/styles\";\nimport { ShareManager } from \"./share-manager\";\nimport { FocusManager } from \"./focus-manager\";\nimport { DEFAULT_EXCLUDED_TAGS, DEFAULT_EXCLUDED_IDS } from './config';\n\nconst TOGGLE_SELECTOR = \"[data-cv-toggle], [data-customviews-toggle], cv-toggle\";\nconst TABGROUP_SELECTOR = 'cv-tabgroup';\n\ninterface ComponentRegistry {\n toggles: Set<HTMLElement>;\n tabGroups: Set<HTMLElement>;\n}\n\nexport interface CustomViewsOptions {\n assetsManager: AssetsManager;\n config: Config;\n rootEl?: HTMLElement | undefined;\n showUrl?: boolean;\n}\n\nexport class CustomViewsCore {\n private rootEl: HTMLElement;\n private assetsManager: AssetsManager;\n private persistenceManager: PersistenceManager;\n private visibilityManager: VisibilityManager;\n private observer: MutationObserver | null = null;\n private shareManager: ShareManager;\n private focusManager: FocusManager;\n\n private componentRegistry: ComponentRegistry = {\n toggles: new Set(),\n tabGroups: new Set(),\n };\n\n private config: Config;\n private stateChangeListeners: Array<() => void> = [];\n private showUrlEnabled: boolean;\n private lastAppliedState: State | null = null;\n\n constructor(opt: CustomViewsOptions) {\n this.assetsManager = opt.assetsManager;\n this.config = opt.config;\n this.rootEl = opt.rootEl || document.body;\n this.persistenceManager = new PersistenceManager();\n this.visibilityManager = new VisibilityManager();\n this.showUrlEnabled = opt.showUrl ?? false;\n this.lastAppliedState = this.cloneState(this.getComputedDefaultState());\n\n // Resolve Exclusions\n const excludedTags = [...DEFAULT_EXCLUDED_TAGS, ...(this.config.shareExclusions?.tags || [])];\n const excludedIds = [...DEFAULT_EXCLUDED_IDS, ...(this.config.shareExclusions?.ids || [])];\n const commonOptions = { excludedTags, excludedIds };\n\n this.shareManager = new ShareManager(commonOptions);\n this.focusManager = new FocusManager(this.rootEl, commonOptions);\n }\n\n public getShareManager(): ShareManager {\n return this.shareManager;\n }\n\n /**\n * Toggles the share mode on or off.\n */\n public toggleShareMode(): void {\n this.shareManager.toggleShareMode();\n }\n\n /**\n * Scan the given element for toggles and tab groups, register them\n * Returns true if new components were found\n */\n private scan(element: HTMLElement): boolean {\n let newComponentsFound = false;\n\n // Scan for toggles\n const toggles = Array.from(element.querySelectorAll(TOGGLE_SELECTOR));\n if (element.matches(TOGGLE_SELECTOR)) {\n toggles.unshift(element);\n }\n toggles.forEach((toggle) => {\n if (!this.componentRegistry.toggles.has(toggle as HTMLElement)) {\n this.componentRegistry.toggles.add(toggle as HTMLElement);\n newComponentsFound = true;\n }\n });\n\n // Scan for tab groups\n const tabGroups = Array.from(element.querySelectorAll(TABGROUP_SELECTOR));\n if (element.matches(TABGROUP_SELECTOR)) {\n tabGroups.unshift(element);\n }\n tabGroups.forEach((tabGroup) => {\n if (!this.componentRegistry.tabGroups.has(tabGroup as HTMLElement)) {\n this.componentRegistry.tabGroups.add(tabGroup as HTMLElement);\n newComponentsFound = true;\n }\n });\n\n return newComponentsFound;\n }\n\n /**\n * Unscan the given element for toggles and tab groups, de-register them from registry\n */\n private unscan(element: HTMLElement): void {\n // Unscan for toggles\n const toggles = Array.from(element.querySelectorAll(TOGGLE_SELECTOR));\n if (element.matches(TOGGLE_SELECTOR)) {\n toggles.unshift(element);\n }\n toggles.forEach((toggle) => {\n this.componentRegistry.toggles.delete(toggle as HTMLElement);\n });\n\n // Unscan for tab groups\n const tabGroups = Array.from(element.querySelectorAll(TABGROUP_SELECTOR));\n if (element.matches(TABGROUP_SELECTOR)) {\n tabGroups.unshift(element);\n }\n tabGroups.forEach((tabGroup) => {\n this.componentRegistry.tabGroups.delete(tabGroup as HTMLElement);\n });\n }\n\n public getConfig(): Config {\n return this.config;\n }\n\n /**\n * Get tab groups from config\n */\n public getTabGroups(): TabGroupConfig[] | undefined {\n return this.config.tabGroups;\n }\n\n /**\n * Generate a computed default state:\n * - If config.defaultState is defined, use it (even if empty)\n * - Otherwise, compute a default: enable all toggles and set all tab groups to their first tab\n */\n private getComputedDefaultState(): State {\n const configDefaultState = this.config?.defaultState;\n\n // If defaultState is explicitly defined in config, use it as-is\n if (configDefaultState !== undefined) {\n return configDefaultState;\n }\n\n // Otherwise, compute a default state: all toggles on, all tabs to first\n const tabs: Record<string, string> = {};\n\n // Set all tab groups to their first tab\n if (this.config.tabGroups?.length) {\n this.config.tabGroups.forEach(group => {\n if (group.tabs && group.tabs.length > 0) {\n const firstTab = group.tabs[0];\n if (firstTab?.id) {\n tabs[group.id] = firstTab.id;\n }\n }\n });\n }\n\n const computedState: State = {\n toggles: this.config.toggles?.map(t => t.id) || [],\n tabs\n };\n\n return computedState;\n }\n\n /**\n * Get currently active tabs (from URL > persisted (localStorage) > defaults)\n */\n public getCurrentActiveTabs(): Record<string, string> {\n if (this.lastAppliedState?.tabs) {\n return { ...this.lastAppliedState.tabs };\n }\n\n const persistedState = this.persistenceManager.getPersistedState();\n if (persistedState?.tabs) {\n return { ...persistedState.tabs };\n }\n\n return this.getComputedDefaultState().tabs || {};\n }\n\n /**\n * Set active tab for a group and apply state\n */\n public setActiveTab(groupId: string, tabId: string, groupEl?: HTMLElement): void {\n // If groupEl is provided, apply tab selection locally to just that element\n // Single-click: only updates DOM visually, no persistence\n if (groupEl) {\n TabManager.applyTabLocalOnly(groupEl, tabId);\n\n // Update nav active state for this group element only\n TabManager.updateNavActiveState(groupEl, tabId);\n\n // Emit custom event for local tab change\n const event = new CustomEvent('customviews:tab-change', {\n detail: { groupId, tabId, synced: false },\n bubbles: true\n });\n document.dispatchEvent(event);\n }\n }\n\n // Inject styles, setup listeners and call rendering logic\n public async init() {\n injectCoreStyles();\n this.scan(this.rootEl);\n\n // Initialize all components found on initial scan\n this.initializeNewComponents();\n\n // Apply stored nav visibility preference on page load\n const navPref = this.persistenceManager.getPersistedTabNavVisibility();\n if (navPref !== null) {\n TabManager.setNavsVisibility(this.rootEl, navPref);\n }\n\n // For session history, clicks on back/forward button\n window.addEventListener(\"popstate\", () => {\n this.loadAndCallApplyState();\n this.focusManager.handleUrlChange();\n });\n\n this.loadAndCallApplyState();\n this.focusManager.init();\n this.initObserver();\n }\n\n private initializeNewComponents(): void {\n // Build navigation for any newly added tab groups.\n // The `data-cv-initialized` attribute in `buildNavs` prevents re-initialization.\n TabManager.buildNavs(\n Array.from(this.componentRegistry.tabGroups),\n this.config.tabGroups,\n // Single click: update clicked group only (local, no persistence)\n (groupId, tabId, groupEl) => {\n this.setActiveTab(groupId, tabId, groupEl);\n },\n // Double click: sync across all tabgroups with same id (with persistence)\n (groupId, tabId, groupEl) => {\n // 1. Record position before state change\n const navHeader = groupEl.querySelector('.cv-tabs-nav');\n const anchorElement = navHeader instanceof HTMLElement ? navHeader : groupEl;\n const initialTop = anchorElement.getBoundingClientRect().top;\n\n const currentTabs = this.getCurrentActiveTabs();\n currentTabs[groupId] = tabId;\n\n const currentToggles = this.getCurrentActiveToggles();\n const newState: State = {\n toggles: currentToggles,\n tabs: currentTabs,\n };\n\n // 2. Apply state with scroll anchor information\n this.applyState(newState, {\n scrollAnchor: { element: anchorElement, top: initialTop }\n });\n }\n );\n\n // Future components (e.g., toggles, widgets) can be initialized here\n }\n\n private initObserver() {\n this.observer = new MutationObserver((mutations) => {\n let newComponentsFound = false;\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof Element) {\n // Scan the new node for components and add them to the registry\n if (this.scan(node as HTMLElement)) {\n newComponentsFound = true;\n }\n }\n });\n\n mutation.removedNodes.forEach((node) => {\n if (node instanceof Element) {\n // Unscan the removed node to cleanup the registry\n this.unscan(node as HTMLElement);\n }\n });\n }\n }\n\n if (newComponentsFound) {\n // Initialize navs for new components.\n this.initializeNewComponents();\n\n // Re-apply the last known state. renderState will handle disconnecting\n // the observer to prevent infinite loops.\n if (this.lastAppliedState) {\n this.renderState(this.lastAppliedState);\n }\n }\n });\n\n // Observe only the root element to avoid performance issues on large pages.\n if (this.rootEl) {\n this.observer.observe(this.rootEl, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n // Priority: URL state > persisted state > config default > computed default\n // Also filters using the visibility manager to persist selection\n // across back/forward button clicks\n private async loadAndCallApplyState() {\n // 1. URL State\n const urlState = URLStateManager.parseURL();\n if (urlState) {\n this.applyState(urlState);\n return;\n }\n\n // 2. Persisted State\n const persistedState = this.persistenceManager.getPersistedState();\n if (persistedState) {\n this.applyState(persistedState);\n return;\n }\n\n // 3. Computed Default Fallback\n this.renderState(this.getComputedDefaultState());\n }\n\n /**\n * Apply a custom state, saves to localStorage and updates the URL\n * Add 'source' in options to indicate the origin of the state change\n * (e.g., 'widget' to trigger scroll behavior)\n * Add scrollAnchor in options to maintain scroll position of a specific element\n */\n public applyState(state: State, options?: { source?: string; scrollAnchor?: { element: HTMLElement; top: number; }; }) {\n // console.log(`[Core] applyState called with source: ${options?.source}`, state);\n\n let groupToScrollTo: HTMLElement | null = null;\n if (options?.source === 'widget') {\n groupToScrollTo = ScrollManager.findHighestVisibleTabGroup();\n }\n\n const snapshot = this.cloneState(state);\n this.renderState(snapshot);\n this.persistenceManager.persistState(snapshot);\n if (this.showUrlEnabled) {\n URLStateManager.updateURL(snapshot);\n } else {\n URLStateManager.clearURL();\n }\n\n if (groupToScrollTo) {\n // Defer scrolling until after the DOM has been updated by renderState\n queueMicrotask(() => {\n ScrollManager.scrollToTabGroup(groupToScrollTo as HTMLElement);\n });\n }\n\n // Handle scroll anchoring for double-clicks\n // scroll to original position after content changes\n if (options?.scrollAnchor) {\n ScrollManager.handleScrollAnchor(options.scrollAnchor);\n }\n }\n\n /** \n * Renders state on components in ComponentRegistry\n * Applies the given state.\n * Disconnects the mutation observer during rendering to prevent loops\n **/\n private renderState(state: State) {\n this.observer?.disconnect();\n this.lastAppliedState = this.cloneState(state);\n const toggles = state?.toggles || [];\n const finalToggles = this.visibilityManager.filterVisibleToggles(toggles);\n\n const toggleElements = Array.from(this.componentRegistry.toggles);\n const tabGroupElements = Array.from(this.componentRegistry.tabGroups);\n\n // Apply toggle visibility\n ToggleManager.applyToggles(toggleElements, finalToggles);\n\n // Render assets into toggles\n ToggleManager.renderAssets(toggleElements, finalToggles, this.assetsManager);\n\n // Apply tab selections\n TabManager.applyTabSelections(tabGroupElements, state.tabs || {}, this.config.tabGroups);\n\n // Update nav active states (without rebuilding)\n TabManager.updateAllNavActiveStates(tabGroupElements, state.tabs || {}, this.config.tabGroups);\n\n // Update pin icons to show which tabs are persisted\n TabManager.updatePinIcons(tabGroupElements, state.tabs || {});\n\n // Notify state change listeners (like widgets)\n this.notifyStateChangeListeners();\n this.observer?.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n /**\n * Reset to default state\n */\n public resetToDefault() {\n this.persistenceManager.clearAll();\n\n if (this.config) {\n this.renderState(this.getComputedDefaultState());\n } else {\n console.warn(\"No configuration loaded, cannot reset to default state\");\n }\n\n // Reset tab nav visibility to default (visible)\n TabManager.setNavsVisibility(this.rootEl, true);\n\n // Clear URL\n URLStateManager.clearURL();\n }\n\n\n /**\n * Get the currently active toggles regardless of whether they come from custom state or default configuration\n */\n public getCurrentActiveToggles(): string[] {\n if (this.lastAppliedState) {\n return this.lastAppliedState.toggles || [];\n }\n\n if (this.config) {\n return this.getComputedDefaultState().toggles || [];\n }\n\n return [];\n }\n\n /**\n * Clear all persistence and reset to default\n */\n public clearPersistence() {\n this.persistenceManager.clearAll();\n if (this.config) {\n this.renderState(this.getComputedDefaultState());\n } else {\n console.warn(\"No configuration loaded, cannot reset to default state\");\n }\n\n URLStateManager.clearURL();\n }\n\n public setOption(flag: string, value: unknown): void {\n switch (flag) {\n case 'showUrl': {\n const nextValue = Boolean(value);\n if (this.showUrlEnabled === nextValue) {\n return;\n }\n\n this.showUrlEnabled = nextValue;\n if (nextValue) {\n const stateForUrl = this.getTrackedStateSnapshot();\n URLStateManager.updateURL(stateForUrl);\n } else {\n URLStateManager.clearURL();\n }\n break;\n }\n default:\n console.warn(`[CustomViews] Unknown option '${flag}' passed to setOption`);\n }\n }\n\n // === STATE CHANGE LISTENER METHODS ===\n /**\n * Add a listener that will be called whenever the state changes\n */\n public addStateChangeListener(listener: () => void): void {\n this.stateChangeListeners.push(listener);\n }\n\n /**\n * Remove a state change listener\n */\n public removeStateChangeListener(listener: () => void): void {\n const index = this.stateChangeListeners.indexOf(listener);\n if (index > -1) {\n this.stateChangeListeners.splice(index, 1);\n }\n }\n\n /**\n * Notify all state change listeners\n */\n private notifyStateChangeListeners(): void {\n this.stateChangeListeners.forEach(listener => {\n try {\n listener();\n } catch (error) {\n console.warn('Error in state change listener:', error);\n }\n });\n }\n\n /**\n * Persist tab nav visibility preference\n */\n public persistTabNavVisibility(visible: boolean): void {\n this.persistenceManager.persistTabNavVisibility(visible);\n }\n\n /**\n * Get persisted tab nav visibility preference\n */\n public getPersistedTabNavVisibility(): boolean | null {\n return this.persistenceManager.getPersistedTabNavVisibility();\n }\n\n private cloneState(state?: State | null): State {\n if (!state) return {};\n return JSON.parse(JSON.stringify(state));\n }\n\n private getTrackedStateSnapshot(): State {\n if (this.lastAppliedState) {\n return this.cloneState(this.lastAppliedState);\n }\n\n if (this.config) {\n return this.cloneState(this.getComputedDefaultState());\n }\n\n return {};\n }\n\n}\n\n\n\n\n\n\n","/**\n * Helper function to prepend baseUrl to a path\n * @param path The path to prepend the baseUrl to\n * @param baseUrl The base URL to prepend\n * @returns The full URL with baseUrl prepended if applicable\n */\nexport function prependBaseUrl(path: string, baseUrl: string): string {\n if (!baseUrl) return path;\n \n // Don't prepend if the path is already absolute (starts with http:// or https://)\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path;\n }\n\n // Ensure baseUrl doesn't end with / and path starts with /\n const cleanbaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const cleanPath = path.startsWith('/') ? path : '/' + path;\n \n return cleanbaseUrl + cleanPath;\n}\n","/**\n * Defines the custom elements used by CustomViews.\n */\n\n/**\n * `<cv-tab>`: A custom element representing a single tab panel within a tab group.\n * Its content is displayed when the corresponding tab is active.\n */\nclass CVTab extends HTMLElement {\n connectedCallback() {\n // Element is managed by TabManager\n }\n}\n\n/**\n * `<cv-tabgroup>`: A custom element that encapsulates a set of tabs (`<cv-tab>`).\n * It manages the tab navigation and content visibility for the group.\n */\nclass CVTabgroup extends HTMLElement {\n connectedCallback() {\n // Element is managed by TabManager\n // Emit ready event after a brief delay to ensure children are parsed\n setTimeout(() => {\n const event = new CustomEvent('cv:tabgroup-ready', {\n bubbles: true,\n detail: { groupId: this.getAttribute('id') }\n });\n this.dispatchEvent(event);\n }, 0);\n }\n}\n\n/**\n * `<cv-toggle>`: A custom element for creating a toggleable content block.\n */\nclass CVToggle extends HTMLElement {\n connectedCallback() {\n // Element is managed by Core\n }\n}\n\n/**\n * `<cv-tab-header>`: A semantic container for a tab's header content.\n * The content of this element is used to create the navigation link for the tab.\n */\nclass CVTabHeader extends HTMLElement {\n connectedCallback() {\n // Element is a semantic container; TabManager extracts its content\n }\n}\n\n/**\n * `<cv-tab-body>`: A semantic container for the main content of a tab panel.\n */\nclass CVTabBody extends HTMLElement {\n connectedCallback() {\n // Element is a semantic container; visibility managed by TabManager\n }\n}\n\n/**\n * Registers all CustomViews custom elements with the CustomElementRegistry.\n */\nexport function registerCustomElements(): void {\n // Only register if not already defined\n if (!customElements.get('cv-tab')) {\n customElements.define('cv-tab', CVTab);\n }\n\n if (!customElements.get('cv-tabgroup')) {\n customElements.define('cv-tabgroup', CVTabgroup);\n }\n\n if (!customElements.get('cv-toggle')) {\n customElements.define('cv-toggle', CVToggle);\n }\n\n if (!customElements.get('cv-tab-header')) {\n customElements.define('cv-tab-header', CVTabHeader);\n }\n\n if (!customElements.get('cv-tab-body')) {\n customElements.define('cv-tab-body', CVTabBody);\n }\n}\n","import { CustomViewsCore, type CustomViewsOptions } from \"../core/core\";\nimport { AssetsManager } from \"../core/assets-manager\";\nimport type { CustomViewAsset, Config } from \"../types/types\";\nimport { prependBaseUrl } from \"../utils/url-utils\";\nimport { registerCustomElements } from \"../core/custom-elements\";\n\n/**\n * Options for initializing CustomViews from JSON\n */\nexport type initOptions = {\n /** Path to the assets JSON file */\n assetsJsonPath?: string;\n /** Root element to apply custom views */\n rootEl?: HTMLElement;\n /** Config object with toggles and defaultState */\n config?: Config;\n /** Base URL for all paths */\n baseURL?: string;\n /** Whether to show the `view` parameter in the browser URL bar */\n showUrl?: boolean;\n}\n\n/**\n * Main CustomViews class for initializing and managing custom views\n */\nexport class CustomViews {\n /**\n * Entry Point to use CustomViews\n * @param opts Initialization options including config object and assets path\n * @returns Promise resolving to the CustomViewsCore instance or null if initialization fails\n */\n static async init(opts: initOptions): Promise<CustomViewsCore | null> {\n // Register custom elements\n registerCustomElements();\n\n // Load assets JSON if provided\n let assetsManager: AssetsManager | undefined;\n const baseURL = opts.baseURL || '';\n if (opts.assetsJsonPath) {\n const assetsPath = prependBaseUrl(opts.assetsJsonPath, baseURL);\n try {\n const assetsJson: Record<string, CustomViewAsset> = await (await fetch(assetsPath)).json();\n assetsManager = new AssetsManager(assetsJson, baseURL);\n } catch (error) {\n console.error(`[CustomViews] Failed to load assets JSON from ${assetsPath}:`, error);\n assetsManager = new AssetsManager({}, baseURL);\n }\n } else {\n assetsManager = new AssetsManager({}, baseURL);\n }\n\n // Use provided config or create a minimal default one\n let config: Config;\n if (opts.config) {\n config = opts.config;\n } else {\n console.error(\"No config provided, using minimal default config\");\n // Create a minimal default config\n config = { toggles: [], defaultState: {} };\n }\n\n const coreOptions: CustomViewsOptions = {\n assetsManager,\n config: config,\n rootEl: opts.rootEl,\n };\n if (opts.showUrl !== undefined) {\n coreOptions.showUrl = opts.showUrl;\n }\n const core = new CustomViewsCore(coreOptions);\n core.init();\n return core;\n }\n}\n","/**\n * Widget styles for CustomViews\n * Extracted from widget.ts for better maintainability\n * \n * Note: Styles are kept as a TypeScript string for compatibility with the build system.\n * This approach ensures the styles are properly bundled and don't require separate CSS file handling.\n */\n\nexport const WIDGET_STYLES = `\n/* Rounded rectangle widget icon styles */\n.cv-widget-icon {\n position: fixed;\n /* Slightly transparent by default so the widget is subtle at the page edge */\n background: rgba(255, 255, 255, 0.92);\n color: rgba(0, 0, 0, 0.9);\n opacity: 0.6;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n font-weight: bold;\n cursor: pointer;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 9998;\n transition: all 0.3s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.cv-widget-icon:hover {\n /* Become fully opaque on hover to improve readability */\n background: rgba(255, 255, 255, 1);\n color: rgba(0, 0, 0, 1);\n opacity: 1;\n}\n\n/* Top-right: rounded end on left, sticks out leftward on hover */\n.cv-widget-top-right {\n top: 20px;\n right: 0;\n border-radius: 18px 0 0 18px;\n padding-left: 8px;\n justify-content: flex-start;\n}\n\n/* Top-left: rounded end on right, sticks out rightward on hover */\n.cv-widget-top-left {\n top: 20px;\n left: 0;\n border-radius: 0 18px 18px 0;\n padding-right: 8px;\n justify-content: flex-end;\n}\n\n/* Bottom-right: rounded end on left, sticks out leftward on hover */\n.cv-widget-bottom-right {\n bottom: 20px;\n right: 0;\n border-radius: 18px 0 0 18px;\n padding-left: 8px;\n justify-content: flex-start;\n}\n\n/* Bottom-left: rounded end on right, sticks out rightward on hover */\n.cv-widget-bottom-left {\n bottom: 20px;\n left: 0;\n border-radius: 0 18px 18px 0;\n padding-right: 8px;\n justify-content: flex-end;\n}\n\n/* Middle-left: rounded end on right, sticks out rightward on hover */\n.cv-widget-middle-left {\n top: 50%;\n left: 0;\n transform: translateY(-50%);\n border-radius: 0 18px 18px 0;\n padding-right: 8px;\n justify-content: flex-end;\n}\n\n/* Middle-right: rounded end on left, sticks out leftward on hover */\n.cv-widget-middle-right {\n top: 50%;\n right: 0;\n transform: translateY(-50%);\n border-radius: 18px 0 0 18px;\n padding-left: 8px;\n justify-content: flex-start;\n}\n\n.cv-widget-top-right,\n.cv-widget-middle-right,\n.cv-widget-bottom-right,\n.cv-widget-top-left,\n.cv-widget-middle-left,\n.cv-widget-bottom-left {\n height: 36px;\n width: 36px;\n}\n\n.cv-widget-middle-right:hover,\n.cv-widget-top-right:hover,\n.cv-widget-bottom-right:hover,\n.cv-widget-top-left:hover,\n.cv-widget-middle-left:hover,\n.cv-widget-bottom-left:hover {\n width: 55px;\n}\n\n/* Modal content styles */\n.cv-widget-section {\n margin-bottom: 16px;\n}\n\n.cv-widget-section:last-child {\n margin-bottom: 0;\n}\n\n.cv-widget-section label {\n display: block;\n margin-bottom: 4px;\n font-weight: 500;\n color: #555;\n}\n\n.cv-widget-profile-select,\n.cv-widget-state-select {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n}\n\n.cv-widget-profile-select:focus,\n.cv-widget-state-select:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n}\n\n.cv-widget-profile-select:disabled,\n.cv-widget-state-select:disabled {\n background: #f8f9fa;\n color: #6c757d;\n cursor: not-allowed;\n}\n\n.cv-widget-current {\n margin: 16px 0;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 4px;\n border-left: 4px solid #007bff;\n}\n\n.cv-widget-current label {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: #666;\n margin-bottom: 4px;\n}\n\n.cv-widget-current-view {\n font-weight: 500;\n color: #333;\n}\n\n.cv-widget-reset {\n width: 100%;\n padding: 8px 16px;\n background: #dc3545;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n}\n\n.cv-widget-reset:hover {\n background: #c82333;\n}\n\n.cv-widget-reset:active {\n background: #bd2130;\n}\n\n/* Responsive design for mobile */\n@media (max-width: 768px) {\n .cv-widget-top-right,\n .cv-widget-top-left {\n top: 10px;\n }\n\n .cv-widget-bottom-right,\n .cv-widget-bottom-left {\n bottom: 10px;\n }\n\n /* All widgets stay flush with screen edges */\n .cv-widget-top-right,\n .cv-widget-bottom-right,\n .cv-widget-middle-right {\n right: 0;\n }\n\n .cv-widget-top-left,\n .cv-widget-bottom-left,\n .cv-widget-middle-left {\n left: 0;\n }\n\n /* Slightly smaller on mobile */\n .cv-widget-icon {\n width: 60px;\n height: 32px;\n }\n\n .cv-widget-icon:hover {\n width: 75px;\n }\n}\n\n/* Modal styles */\n.cv-widget-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10002;\n animation: fadeIn 0.2s ease;\n}\n\n.cv-widget-modal-overlay.cv-hidden {\n display: none;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.cv-widget-modal {\n background: white;\n border-radius: 0.75rem;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n max-width: 32rem;\n width: 90vw;\n max-height: 80vh;\n animation: slideIn 0.2s ease;\n display: flex;\n flex-direction: column;\n}\n\n@keyframes slideIn {\n from { \n opacity: 0;\n transform: scale(0.9) translateY(-20px);\n }\n to { \n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n.cv-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.cv-modal-header-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.cv-modal-icon {\n position: relative;\n width: 1rem;\n height: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n}\n\n.cv-modal-icon-svg {\n width: 100%;\n height: 100%;\n opacity: 1;\n}\n\n.cv-modal-title {\n font-size: 1.125rem;\n font-weight: bold;\n color: rgba(0, 0, 0, 0.9);\n margin: 0;\n}\n\n.cv-modal-close {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n background: transparent;\n border: none;\n color: rgba(0, 0, 0, 0.6);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.cv-modal-close:hover {\n background: rgba(62, 132, 244, 0.1);\n color: #3e84f4;\n}\n\n.cv-modal-close-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.cv-modal-main {\n padding: 1rem;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n overflow-y: auto;\n max-height: calc(80vh - 8rem);\n}\n\n.cv-modal-description {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.8);\n margin: 0;\n line-height: 1.4;\n}\n\n.cv-content-section,\n.cv-tab-groups-section {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.cv-section-heading {\n font-size: 1rem;\n font-weight: bold;\n color: rgba(0, 0, 0, 0.9);\n margin: 0;\n}\n\n.cv-widget-modal-actions {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n}\n\n.cv-widget-restore {\n width: 100%;\n padding: 10px 16px;\n background: #28a745;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n}\n\n.cv-widget-restore:hover {\n background: #218838;\n}\n\n.cv-widget-create-state {\n width: 100%;\n padding: 10px 16px;\n background: #007bff;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.cv-widget-create-state:hover {\n background: #0056b3;\n}\n\n.cv-widget-theme-dark .cv-widget-modal {\n background: #101722;\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-modal-header {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-modal-title {\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-modal-close {\n color: rgba(255, 255, 255, 0.6);\n}\n\n.cv-widget-theme-dark .cv-modal-close:hover {\n background: rgba(62, 132, 244, 0.2);\n color: #3e84f4;\n}\n\n.cv-widget-theme-dark .cv-modal-description {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-section-heading {\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-toggles-container\n.cv-widget-theme-dark .cv-tabgroups-container {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-toggle-card,\n.cv-widget-theme-dark .cv-tabgroup-card {\n background: #101722;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-toggle-title,\n.cv-widget-theme-dark .cv-tabgroup-title {\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-toggle-description,\n.cv-widget-theme-dark .cv-tabgroup-description {\n color: rgba(255, 255, 255, 0.6);\n}\n\n.cv-widget-theme-dark .cv-toggle-slider {\n background: rgba(255, 255, 255, 0.2);\n}\n\n.cv-widget-theme-dark .cv-tab-group-description {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-select {\n background: #101722;\n border-color: rgba(255, 255, 255, 0.2);\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-modal-footer {\n border-color: rgba(255, 255, 255, 0.1);\n background: #101722;\n}\n\n.cv-widget-theme-dark .cv-reset-btn {\n color: #e2e8f0;\n background: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-reset-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n/* Custom state creator styles */\n.cv-custom-state-modal {\n max-width: 500px;\n}\n\n.cv-custom-state-form .cv-section-header {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n border-bottom: 1px solid #e9ecef;\n padding-bottom: 5px;\n}\n\n.cv-custom-state-form p {\n font-size: 15px;\n line-height: 1.6;\n color: #555;\n margin-bottom: 24px;\n text-align: justify;\n}\n\n.cv-custom-state-section {\n margin-bottom: 16px;\n}\n\n.cv-custom-state-section label {\n display: block;\n margin-bottom: 4px;\n font-weight: 500;\n color: #555;\n}\n\n.cv-custom-state-input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n}\n\n.cv-custom-state-input:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n}\n\n/* Toggles Container */\n.cv-toggles-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n border-radius: 0.5rem;\n border: 1px solid rgba(0, 0, 0, 0.1);\n overflow: hidden;\n}\n\n.cv-toggle-card,\n.cv-tabgroup-card {\n background: white;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.cv-toggle-card:last-child {\n border-bottom: none;\n}\n\n.cv-toggle-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem;\n}\n\n.cv-toggle-title {\n font-weight: 500;\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.9);\n margin: 0 0 0.125rem 0;\n}\n\n.cv-toggle-description {\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.6);\n margin: 0;\n}\n\n.cv-toggle-label{\n position: relative;\n display: inline-block;\n width: 2.75rem;\n height: 1.5rem;\n cursor: pointer;\n}\n\n.cv-toggle-input {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.cv-toggle-slider {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.2);\n border-radius: 9999px;\n transition: background-color 0.2s ease;\n}\n\n.cv-toggle-slider:before {\n position: absolute;\n content: \"\";\n height: 1rem;\n width: 1rem;\n left: 0.25rem;\n bottom: 0.25rem;\n background: white;\n border-radius: 50%;\n transition: transform 0.2s ease;\n}\n\n.cv-toggle-input:checked + .cv-toggle-slider {\n background: #3e84f4;\n}\n\n.cv-toggle-input:checked + .cv-toggle-slider:before {\n transform: translateX(1.25rem);\n}\n\n/* Dark theme toggle switch styles */\n.cv-widget-theme-dark .cv-toggle-switch {\n background: #4a5568;\n}\n\n.cv-widget-theme-dark .cv-toggle-switch:hover {\n background: #5a6578;\n}\n\n.cv-widget-theme-dark .cv-toggle-switch.cv-toggle-active {\n background: #63b3ed;\n}\n\n.cv-widget-theme-dark .cv-toggle-switch.cv-toggle-active:hover {\n background: #4299e1;\n}\n\n/* Tab Groups Container */\n.cv-tab-groups-list {\n display: flex;\n flex-direction: column;\n gap: 1px;\n border: 1px solid rgba(0, 0, 0, 0.1);\n border-radius: 0.5rem;\n overflow: hidden;\n}\n\n/* Tab Group Card - Header (Navigation Headers toggle) */\n.cv-tabgroup-card.cv-tabgroup-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem;\n border-bottom: 0px;\n}\n\n.cv-tabgroup-card.cv-tabgroup-header .cv-tabgroup-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n gap: 1rem;\n}\n\n/* Navigation toggle icon container */\n.cv-nav-toggle-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.cv-nav-icon {\n width: 2rem;\n height: 2rem;\n color: rgba(0, 0, 0, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: color 0.2s ease;\n}\n\n/* Logo box - centered grey box on its own row */\n.cv-tabgroup-logo-box {\n width: 3.5rem;\n height: 3.5rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 0.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-bottom: 0.5rem;\n}\n\n/* Title container for title alignment (without icon) */\n.cv-tabgroup-title-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Hover state for icon - apply to the entire tabgroup-row */\n.cv-tabgroup-card.cv-tabgroup-header:hover .cv-nav-icon {\n color: #3e84f4;\n}\n\n.cv-widget-theme-dark .cv-nav-icon {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-card.cv-tabgroup-header:hover .cv-nav-icon {\n color: #60a5fa;\n}\n\n/* Tab Group Card - Items */\n.cv-tabgroup-card.cv-tabgroup-item {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding: 0.75rem;\n background: white;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.cv-tabgroup-card.cv-tabgroup-item:last-child {\n border-bottom: none;\n}\n\n/* Tab Group Info */\n.cv-tabgroup-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.cv-tabgroup-title {\n font-weight: 500;\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.9);\n margin: 0 0 0 0;\n}\n\n.cv-tabgroup-description {\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.6);\n margin: 0;\n line-height: 1.3;\n}\n\n/* Tab Group Label (for select dropdowns) */\n.cv-tabgroup-label {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.8);\n margin: 0;\n line-height: 1.4;\n font-weight: 500;\n display: block;\n cursor: pointer;\n}\n\n/* Tab Group Select */\n.cv-tabgroup-select {\n width: 100%;\n border-radius: 0.5rem;\n background: white;\n border: 1px solid rgba(0, 0, 0, 0.15);\n color: rgba(0, 0, 0, 0.9);\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n}\n\n.cv-tabgroup-select:hover {\n border-color: rgba(0, 0, 0, 0.25);\n}\n\n.cv-tabgroup-select:focus {\n outline: none;\n border-color: #3e84f4;\n box-shadow: 0 0 0 2px rgba(62, 132, 244, 0.2);\n}\n\n/* Modern Toggle Switch */\n.cv-toggle-switch {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 44px;\n height: 24px;\n background: rgba(0, 0, 0, 0.1);\n border-radius: 9999px;\n padding: 2px;\n box-sizing: border-box;\n cursor: pointer;\n transition: background-color 0.2s ease;\n border: none;\n}\n\n.cv-toggle-switch input {\n display: none;\n}\n\n.cv-toggle-switch .cv-switch-bg {\n position: absolute;\n inset: 0;\n border-radius: 9999px;\n background: rgba(0, 0, 0, 0.1);\n transition: background-color 0.2s ease;\n pointer-events: none;\n}\n\n.cv-toggle-switch .cv-switch-knob {\n position: relative;\n width: 20px;\n height: 20px;\n background: white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n transition: transform 0.2s ease;\n z-index: 1;\n}\n\n.cv-toggle-switch input:checked + .cv-switch-bg {\n background: #3e84f4;\n}\n\n.cv-toggle-switch input:checked ~ .cv-switch-knob {\n transform: translateX(20px);\n}\n\n/* Dark Theme - Tab Groups */\n.cv-widget-theme-dark .cv-tabgroup-card.cv-tabgroup-header {\n background: #101722;\n border-bottom-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-card.cv-tabgroup-item {\n background: #101722;\n border-bottom-color: rgba(255, 255, 255, 0.05);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-title {\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-tabgroup-description {\n color: rgba(255, 255, 255, 0.6);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-label {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-tab-groups-list {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-select {\n background: #101722;\n border-color: rgba(255, 255, 255, 0.15);\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-tabgroup-select:hover {\n border-color: rgba(255, 255, 255, 0.25);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-select:focus {\n border-color: #60a5fa;\n box-shadow: 0 0 0 2px rgba(96, 165, 250, 0.2);\n}\n\n/* Dark Theme - Toggle Switch */\n.cv-widget-theme-dark .cv-toggle-switch .cv-switch-bg {\n background: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-toggle-switch .cv-switch-knob {\n background: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-toggle-switch input:checked + .cv-switch-bg {\n background: #63b3ed;\n}\n\n.cv-modal-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n \n.cv-footer-link {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.5);\n text-decoration: none;\n transition: color 0.2s ease;\n}\n\n.cv-footer-link:hover {\n color: #3e84f4;\n}\n\n.cv-footer-link svg {\n opacity: 0.8;\n}\n\n.cv-widget-theme-dark .cv-footer-link {\n color: rgba(255, 255, 255, 0.4);\n}\n\n.cv-widget-theme-dark .cv-footer-link:hover {\n color: #60a5fa;\n}\n\n.cv-reset-btn,\n.cv-share-btn {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n border-radius: 0.5rem;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s ease;\n border: none;\n}\n\n.cv-reset-btn {\n color: rgba(0, 0, 0, 0.9);\n background: rgba(0, 0, 0, 0.1);\n}\n\n.cv-reset-btn:hover {\n background: rgba(0, 0, 0, 0.2);\n}\n\n.cv-share-btn {\n color: white;\n background: #3e84f4;\n}\n\n.cv-share-btn:hover {\n background: rgba(62, 132, 244, 0.9);\n}\n\n.cv-btn-icon {\n width: 1rem;\n height: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 0.2s ease;\n}\n\n/* Dark theme custom state styles */\n/* Welcome modal styles */\n.cv-welcome-modal {\n max-width: 32rem;\n width: 90vw;\n background: white;\n border-radius: 0.75rem;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n animation: slideIn 0.2s ease;\n display: flex;\n flex-direction: column;\n}\n\n.cv-modal-main {\n padding: 1rem;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n overflow-y: auto;\n max-height: calc(80vh - 8rem);\n}\n\n.cv-welcome-message {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.8);\n margin: 0;\n line-height: 1.4;\n text-align: center;\n}\n\n.cv-welcome-message a {\n color: #3e84f4;\n text-align: justify;\n text-decoration: none;\n}\n\n.cv-welcome-message a:hover {\n text-decoration: underline;\n}\n\n.cv-welcome-widget-preview {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n padding: 1rem;\n background: #f8f9fa;\n border-radius: 0.5rem;\n margin: 1rem 0;\n}\n\n.cv-welcome-widget-icon {\n width: 2rem;\n height: 2rem;\n background: rgba(62, 132, 244, 0.1);\n border-radius: 9999px;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: cv-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n color: #3e84f4;\n}\n\n.cv-welcome-widget-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgba(0, 0, 0, 0.8);\n margin: 0;\n}\n\n.cv-welcome-got-it {\n width: 100%;\n background: #3e84f4;\n color: white;\n font-weight: 600;\n padding: 0.75rem 1rem;\n border-radius: 0.5rem;\n border: none;\n cursor: pointer;\n font-size: 0.875rem;\n transition: background-color 0.2s ease;\n outline: none;\n}\n\n.cv-welcome-got-it:hover {\n background: rgba(62, 132, 244, 0.9);\n}\n\n.cv-welcome-got-it:focus {\n box-shadow: 0 0 0 2px rgba(62, 132, 244, 0.5);\n}\n\n/* Animations */\n@keyframes cv-pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n/* Dark theme welcome modal styles */\n.cv-widget-theme-dark .cv-welcome-modal {\n background: #101722;\n}\n\n.cv-widget-theme-dark .cv-welcome-message {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-welcome-message a {\n color: #60a5fa;\n}\n\n.cv-widget-theme-dark .cv-welcome-widget-preview {\n background: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-welcome-widget-label {\n color: #e2e8f0;\n}\n\n/* Dark theme logo box */\n.cv-widget-theme-dark .cv-tabgroup-logo-box {\n background: rgba(255, 255, 255, 0.1);\n}\n\n/* Spinning animation for reset button icon */\n@keyframes cv-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(-360deg);\n }\n}\n\n.cv-spinning {\n animation: cv-spin 0.6s ease-in-out;\n}\n\n/* Hide widget icon in print view */\n@media print {\n .cv-widget-icon {\n display: none !important;\n }\n}\n/* Widget Modal Tabs */\n.cv-modal-tabs {\n display: flex;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n margin-bottom: 0.5rem;\n}\n\n.cv-tab-content > .cv-content-section + .cv-content-section {\n margin-top: 1.5rem;\n}\n\n.cv-modal-tab {\n padding: 0.75rem 1.5rem;\n font-size: 0.875rem;\n font-weight: 500;\n color: rgba(0, 0, 0, 0.6);\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.cv-modal-tab:hover {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.cv-modal-tab.active {\n color: #3e84f4;\n border-bottom-color: #3e84f4;\n}\n\n.cv-tab-content {\n display: none;\n animation: fadeIn 0.3s ease;\n}\n\n.cv-tab-content.active {\n display: block;\n}\n\n/* Share Tab Content */\n.cv-share-content {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem 0;\n align-items: center;\n text-align: center;\n}\n\n.cv-share-instruction {\n font-size: 0.9rem;\n color: rgba(0, 0, 0, 0.7);\n margin-bottom: 1rem;\n}\n\n.cv-share-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n width: 100%;\n padding: 12px 16px;\n background: white;\n color: #333;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.9rem;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n.cv-share-action-btn:hover {\n background: #f8f9fa;\n border-color: rgba(0, 0, 0, 0.25);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n}\n\n.cv-share-action-btn.primary {\n background: #3e84f4;\n color: white;\n border-color: #3e84f4;\n}\n\n.cv-share-action-btn.primary:hover {\n background: #2b74e6;\n border-color: #2b74e6;\n}\n\n.cv-done-btn {\n padding: 0.375rem 1rem;\n background: #3e84f4;\n color: white;\n border: none;\n border-radius: 0.5rem;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.cv-done-btn:hover {\n background: #2b74e6;\n}\n\n/* Dark Theme Adjustments */\n.cv-widget-theme-dark .cv-modal-tabs {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-modal-tab {\n color: rgba(255, 255, 255, 0.6);\n}\n\n.cv-widget-theme-dark .cv-modal-tab:hover {\n color: rgba(255, 255, 255, 0.9);\n}\n\n.cv-widget-theme-dark .cv-modal-tab.active {\n color: #60a5fa;\n border-bottom-color: #60a5fa;\n}\n\n.cv-widget-theme-dark .cv-share-instruction {\n color: rgba(255, 255, 255, 0.7);\n}\n\n.cv-widget-theme-dark .cv-share-action-btn {\n background: #1a202c;\n color: white;\n border-color: rgba(255, 255, 255, 0.15);\n}\n\n.cv-widget-theme-dark .cv-share-action-btn:hover {\n background: #2d3748;\n}\n\n.cv-widget-theme-dark .cv-share-action-btn.primary {\n background: #3e84f4;\n border-color: #3e84f4;\n}\n\n.cv-widget-theme-dark .cv-share-action-btn.primary:hover {\n background: #2b74e6;\n}\n`;\n\n/**\n * Inject widget styles into the document head\n */\nexport function injectWidgetStyles(): void {\n // Check if styles are already injected\n if (document.querySelector('#cv-widget-styles')) return;\n\n const style = document.createElement('style');\n style.id = 'cv-widget-styles';\n style.textContent = WIDGET_STYLES;\n document.head.appendChild(style);\n}\n","import { injectWidgetStyles } from \"../styles/widget-styles\";\nimport type { CustomViewsCore } from \"./core\";\nimport type { State } from \"../types/types\";\nimport { URLStateManager } from \"./url-state-manager\";\n\nimport { TabManager } from \"./tab-manager\";\nimport { getGearIcon, getCloseIcon, getResetIcon, getCopyIcon, getTickIcon, getNavHeadingOnIcon, getNavHeadingOffIcon, getNavDashed, getShareIcon, getGitHubIcon } from \"../utils/icons\";\n\nexport interface WidgetOptions {\n /** The CustomViews core instance to control */\n core: CustomViewsCore;\n\n /** Container element where the widget should be rendered */\n container?: HTMLElement;\n\n /** Widget position: 'top-right', 'top-left', 'bottom-right', 'bottom-left', 'middle-left', 'middle-right' */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'middle-left' | 'middle-right';\n\n /** Widget theme: 'light' or 'dark' */\n theme?: 'light' | 'dark';\n\n /** Whether to show reset button */\n showReset?: boolean;\n\n /** Widget title */\n title?: string;\n\n /** Widget description text */\n description?: string;\n\n /** Whether to show welcome modal on first visit */\n showWelcome?: boolean;\n\n /** Welcome modal title (only used if showWelcome is true) */\n welcomeTitle?: string;\n\n /** Welcome modal message (only used if showWelcome is true) */\n welcomeMessage?: string;\n\n /** Whether to show tab groups section in widget (default: true) */\n showTabGroups?: boolean;\n}\n\nexport class CustomViewsWidget {\n private core: CustomViewsCore;\n private container: HTMLElement;\n private widgetIcon: HTMLElement | null = null;\n private options: Required<WidgetOptions>;\n private _hasVisibleConfig = false;\n private pageToggleIds: Set<string> = new Set();\n private pageTabIds: Set<string> = new Set();\n private currentTab: 'customize' | 'share' = 'customize';\n\n // Modal state\n private stateModal: HTMLElement | null = null;\n\n\n constructor(options: WidgetOptions) {\n this.core = options.core;\n this.container = options.container || document.body;\n\n // Set defaults\n this.options = {\n core: options.core,\n container: this.container,\n position: options.position || 'middle-left',\n theme: options.theme || 'light',\n showReset: options.showReset ?? true,\n title: options.title || 'Customize View',\n description: options.description || '',\n showWelcome: options.showWelcome ?? false,\n welcomeTitle: options.welcomeTitle || 'Site Customization',\n welcomeMessage: options.welcomeMessage || 'This site is powered by Custom Views. Use the widget on the side (⚙) to customize your experience. Your preferences will be saved and can be shared via URL.<br><br>Learn more at <a href=\"https://github.com/customviews-js/customviews\" target=\"_blank\">customviews GitHub</a>.',\n showTabGroups: options.showTabGroups ?? true\n };\n\n // Determine if there are any configurations to show\n const config = this.core.getConfig();\n const allToggles = config?.toggles || [];\n const visibleToggles = allToggles.filter(toggle => {\n if (toggle.isLocal) {\n return !!document.querySelector(`[data-cv-toggle=\"${toggle.id}\"], [data-cv-toggle-group-id=\"${toggle.id}\"]`);\n }\n return true;\n });\n\n const allTabGroups = this.core.getTabGroups() || [];\n const visibleTabGroups = allTabGroups.filter(group => {\n if (group.isLocal) {\n return !!document.querySelector(`cv-tabgroup[id=\"${group.id}\"]`);\n }\n return true;\n });\n\n if (visibleToggles.length > 0 || (this.options.showTabGroups && visibleTabGroups.length > 0)) {\n this._hasVisibleConfig = true;\n }\n\n // Scan for page-declared local components and cache them\n // Do this on initialization to avoid querying DOM repeatedly\n const pageTogglesAttr = document.querySelector('[data-cv-page-local-toggles]')?.getAttribute('data-cv-page-local-toggles') || '';\n this.pageToggleIds = new Set(pageTogglesAttr.split(',').map(id => id.trim()).filter(id => id));\n\n const pageTabsAttr = document.querySelector('[data-cv-page-local-tabs]')?.getAttribute('data-cv-page-local-tabs') || '';\n this.pageTabIds = new Set(pageTabsAttr.split(',').map(id => id.trim()).filter(id => id));\n\n }\n\n /**\n * Render the widget modal icon\n * \n * Does not render if there are no visible toggles or tab groups.\n */\n public renderModalIcon(): HTMLElement | undefined {\n if (!this._hasVisibleConfig) {\n return;\n }\n\n this.widgetIcon = this.createWidgetIcon();\n this.attachEventListeners();\n\n // Always append to body since it's a floating icon\n document.body.appendChild(this.widgetIcon);\n\n // Show welcome modal on first visit if enabled\n if (this.options.showWelcome) {\n this.showWelcomeModalIfFirstVisit();\n }\n\n return this.widgetIcon;\n }\n\n /**\n * Create the simple widget icon\n */\n private createWidgetIcon(): HTMLElement {\n const icon = document.createElement('div');\n icon.className = `cv-widget-icon cv-widget-${this.options.position}`;\n icon.innerHTML = '⚙';\n icon.title = this.options.title;\n icon.setAttribute('aria-label', 'Open Custom Views');\n\n // Add styles\n injectWidgetStyles();\n\n return icon;\n }\n\n /**\n * Remove the widget from DOM\n */\n public destroy(): void {\n if (this.widgetIcon) {\n this.widgetIcon.remove();\n this.widgetIcon = null;\n }\n\n // Clean up modal\n if (this.stateModal) {\n this.stateModal.remove();\n this.stateModal = null;\n }\n }\n\n private attachEventListeners(): void {\n if (!this.widgetIcon) return;\n\n // Click to open customization modal directly\n this.widgetIcon.addEventListener('click', () => this.openStateModal());\n }\n\n /**\n * Close the modal\n */\n private closeModal(): void {\n if (this.stateModal) {\n this.stateModal.classList.add('cv-hidden');\n }\n }\n\n /**\n * Open the custom state creator\n */\n private openStateModal(): void {\n if (!this.stateModal) {\n this._createStateModal();\n }\n this._updateStateModalContent();\n this.stateModal!.classList.remove('cv-hidden');\n }\n\n /**\n * Create the custom state creator modal shell and attach listeners\n */\n private _createStateModal(): void {\n this.stateModal = document.createElement('div');\n this.stateModal.className = 'cv-widget-modal-overlay cv-hidden';\n this.applyThemeToModal();\n\n document.body.appendChild(this.stateModal);\n this._attachStateModalFrameEventListeners();\n }\n\n /**\n * Update the content of the state modal\n */\n private _updateStateModalContent(): void {\n if (!this.stateModal) return;\n\n const pageToggleIds = this.pageToggleIds;\n const pageTabIds = this.pageTabIds;\n\n // Get toggles from current configuration\n const config = this.core.getConfig();\n const allToggles = config?.toggles || [];\n\n // Filter toggles to only include global and visible/declared local toggles\n const visibleToggles = allToggles.filter(toggle => {\n if (toggle.isLocal) {\n return pageToggleIds.has(toggle.id) || !!document.querySelector(`[data-cv-toggle=\"${toggle.id}\"], [data-cv-toggle-group-id=\"${toggle.id}\"]`);\n }\n return true; // Keep global toggles\n });\n\n const toggleControlsHtml = visibleToggles.map(toggle => `\n <div class=\"cv-toggle-card\">\n <div class=\"cv-toggle-content\">\n <div>\n <p class=\"cv-toggle-title\">${toggle.label || toggle.id}</p>\n </div>\n <label class=\"cv-toggle-label\">\n <input class=\"cv-toggle-input\" type=\"checkbox\" data-toggle=\"${toggle.id}\"/>\n <span class=\"cv-toggle-slider\"></span>\n </label>\n </div>\n </div>\n `).join('');\n\n // Get tab groups\n const allTabGroups = this.core.getTabGroups() || [];\n const tabGroups = allTabGroups.filter(group => {\n if (group.isLocal) {\n return pageTabIds.has(group.id) || !!document.querySelector(`cv-tabgroup[id=\"${group.id}\"]`);\n }\n return true; // Keep global tab groups\n });\n\n let tabGroupControlsHTML = '';\n if (this.options.showTabGroups && tabGroups && tabGroups.length > 0) {\n const initialNavsVisible = TabManager.areNavsVisible(document.body);\n\n tabGroupControlsHTML = `\n <div class=\"cv-tabgroup-card cv-tabgroup-header\">\n <div class=\"cv-tabgroup-row\">\n <div class=\"cv-tabgroup-logo-box\" id=\"cv-nav-icon-box\">\n <div class=\"cv-nav-icon\" id=\"cv-nav-icon\">${initialNavsVisible ? getNavHeadingOnIcon() : getNavHeadingOffIcon()}</div>\n </div>\n <div class=\"cv-tabgroup-info\">\n <div class=\"cv-tabgroup-title-container\">\n <p class=\"cv-tabgroup-title\">Show only the selected tab</p>\n </div>\n <p class=\"cv-tabgroup-description\">Hide the navigation headers</p>\n </div>\n <label class=\"cv-toggle-switch cv-nav-toggle\">\n <input class=\"cv-nav-pref-input\" type=\"checkbox\" ${initialNavsVisible ? '' : 'checked'} aria-label=\"Show only the selected tab\" />\n <span class=\"cv-switch-bg\"></span>\n <span class=\"cv-switch-knob\"></span>\n </label>\n </div>\n </div>\n <div class=\"cv-tab-groups-list\">\n ${tabGroups.map(group => `\n <div class=\"cv-tabgroup-card cv-tabgroup-item\">\n <label class=\"cv-tabgroup-label\" for=\"tab-group-${group.id}\">\n ${group.label || group.id}\n </label>\n <select id=\"tab-group-${group.id}\" class=\"cv-tabgroup-select\" data-group-id=\"${group.id}\">\n ${group.tabs.map(tab => `<option value=\"${tab.id}\">${tab.label || tab.id}</option>`).join('')}\n </select>\n </div>\n `).join('')}\n </div>\n `;\n }\n\n this.stateModal.innerHTML = `\n <div class=\"cv-widget-modal cv-custom-state-modal\">\n <header class=\"cv-modal-header\">\n <div class=\"cv-modal-header-content\">\n <div class=\"cv-modal-icon\">\n ${getGearIcon()}\n </div>\n <div class=\"cv-modal-title\">${this.options.title}</div>\n </div>\n <button class=\"cv-modal-close\" aria-label=\"Close modal\">\n ${getCloseIcon()}\n </button>\n </header>\n <main class=\"cv-modal-main\">\n ${this.options.description ? `<p class=\"cv-modal-description\">${this.options.description}</p>` : ''}\n \n <div class=\"cv-modal-tabs\">\n <button class=\"cv-modal-tab ${this.currentTab === 'customize' ? 'active' : ''}\" data-tab=\"customize\">Customize</button>\n <button class=\"cv-modal-tab ${this.currentTab === 'share' ? 'active' : ''}\" data-tab=\"share\">Share</button>\n </div>\n\n <div class=\"cv-tab-content ${this.currentTab === 'customize' ? 'active' : ''}\" data-content=\"customize\">\n ${visibleToggles.length ? `\n <div class=\"cv-content-section\">\n <div class=\"cv-section-heading\">Toggles</div>\n <div class=\"cv-toggles-container\">\n ${toggleControlsHtml}\n </div>\n </div>\n ` : ''}\n \n ${this.options.showTabGroups && tabGroups && tabGroups.length > 0 ? `\n <div class=\"cv-content-section\">\n <div class=\"cv-section-heading\">Tab Groups</div>\n <div class=\"cv-tabgroups-container\">\n ${tabGroupControlsHTML}\n </div>\n </div>\n ` : ''}\n </div>\n\n <div class=\"cv-tab-content ${this.currentTab === 'share' ? 'active' : ''}\" data-content=\"share\">\n <div class=\"cv-share-content\">\n <div class=\"cv-share-instruction\">\n Create a shareable link for your current customization, or select specific parts of the page to share.\n </div>\n \n <button class=\"cv-share-action-btn primary cv-start-share-btn\">\n <span class=\"cv-btn-icon\">${getShareIcon()}</span>\n <span>Select elements to share</span>\n </button>\n \n <button class=\"cv-share-action-btn cv-copy-url-btn\">\n <span class=\"cv-btn-icon\">${getCopyIcon()}</span>\n <span>Copy Shareable URL of Settings</span>\n </button>\n </div>\n </div>\n </main>\n\n <footer class=\"cv-modal-footer\">\n ${this.options.showReset ? `\n <button class=\"cv-reset-btn\" title=\"Reset to Default\">\n <span class=\"cv-reset-btn-icon\">${getResetIcon()}</span>\n <span>Reset</span>\n </button>\n ` : '<div></div>'}\n \n <a href=\"https://github.com/customviews-js/customviews\" target=\"_blank\" class=\"cv-footer-link\">\n ${getGitHubIcon()}\n <span>View on GitHub</span>\n </a>\n\n <button class=\"cv-done-btn\">Done</button>\n </footer>\n </div>\n `;\n\n this._attachStateModalContentEventListeners();\n this.loadCurrentStateIntoForm();\n }\n\n /**\n * Attach event listeners for the modal frame (delegated events)\n */\n private _attachStateModalFrameEventListeners(): void {\n if (!this.stateModal) return;\n\n // Delegated click events\n this.stateModal.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n\n // Close button\n if (target.closest('.cv-modal-close')) {\n this.closeModal();\n return;\n }\n\n\n // Reset to default button\n if (target.closest('.cv-reset-btn')) {\n const resetBtn = target.closest('.cv-reset-btn');\n const resetIcon = resetBtn?.querySelector('.cv-reset-btn-icon');\n if (resetIcon) {\n resetIcon.classList.add('cv-spinning');\n }\n\n this.core.resetToDefault();\n this.loadCurrentStateIntoForm();\n\n setTimeout(() => {\n if (resetIcon) {\n resetIcon.classList.remove('cv-spinning');\n }\n }, 600);\n return;\n }\n\n // Done button\n if (target.closest('.cv-done-btn')) {\n this.closeModal();\n return;\n }\n\n // Overlay click to close\n if (e.target === this.stateModal) {\n this.closeModal();\n }\n });\n\n // Escape key to close\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.closeModal();\n }\n };\n // We can't remove this listener easily if it's anonymous, so we attach it to the document\n // and it will stay for the lifetime of the widget. This is acceptable.\n document.addEventListener('keydown', handleEscape);\n }\n\n /**\n * Attach event listeners for custom state creator's dynamic content\n */\n private _attachStateModalContentEventListeners(): void {\n if (!this.stateModal) return;\n\n // Listen to toggle switches\n const toggleInputs = this.stateModal.querySelectorAll('.cv-toggle-input') as NodeListOf<HTMLInputElement>;\n toggleInputs.forEach(toggleInput => {\n toggleInput.addEventListener('change', () => {\n const state = this.getCurrentCustomStateFromModal();\n this.core.applyState(state, { source: 'widget' });\n });\n });\n\n // Listen to tab group selects\n const tabGroupSelects = this.stateModal.querySelectorAll('.cv-tabgroup-select') as NodeListOf<HTMLSelectElement>;\n tabGroupSelects.forEach(select => {\n select.addEventListener('change', () => {\n const groupId = select.dataset.groupId;\n const tabId = select.value;\n if (groupId && tabId) {\n const currentTabs = this.core.getCurrentActiveTabs();\n currentTabs[groupId] = tabId;\n\n const currentToggles = this.core.getCurrentActiveToggles();\n const newState: State = {\n toggles: currentToggles,\n tabs: currentTabs\n };\n this.core.applyState(newState, { source: 'widget' });\n }\n });\n });\n\n // Listener for show/hide tab navs\n const tabNavToggle = this.stateModal.querySelector('.cv-nav-pref-input') as HTMLInputElement | null;\n const navIcon = this.stateModal?.querySelector('#cv-nav-icon');\n const navHeaderCard = this.stateModal?.querySelector('.cv-tabgroup-card.cv-tabgroup-header') as HTMLElement | null;\n\n if (tabNavToggle && navIcon && navHeaderCard) {\n const updateIcon = (isVisible: boolean, isHovering: boolean = false) => {\n if (isHovering) {\n navIcon.innerHTML = getNavDashed();\n } else {\n navIcon.innerHTML = isVisible ? getNavHeadingOnIcon() : getNavHeadingOffIcon();\n }\n };\n\n navHeaderCard.addEventListener('mouseenter', () => updateIcon(!tabNavToggle.checked, true));\n navHeaderCard.addEventListener('mouseleave', () => updateIcon(!tabNavToggle.checked, false));\n\n tabNavToggle.addEventListener('change', () => {\n const visible = !tabNavToggle.checked;\n updateIcon(visible, false);\n this.core.persistTabNavVisibility(visible);\n try {\n TabManager.setNavsVisibility(document.body, visible);\n } catch (e) {\n console.error('Failed to set tab nav visibility:', e);\n }\n });\n }\n\n // Tab switching\n const tabs = this.stateModal.querySelectorAll('.cv-modal-tab');\n tabs.forEach(tab => {\n tab.addEventListener('click', () => {\n const tabId = (tab as HTMLElement).dataset.tab;\n if (tabId === 'customize' || tabId === 'share') {\n this.currentTab = tabId;\n\n // Update UI without full re-render\n tabs.forEach(t => t.classList.remove('active'));\n tab.classList.add('active');\n\n const contents = this.stateModal?.querySelectorAll('.cv-tab-content');\n contents?.forEach(c => {\n c.classList.remove('active');\n if ((c as HTMLElement).dataset.content === tabId) {\n c.classList.add('active');\n }\n });\n }\n });\n });\n\n // Share buttons (inside content)\n const startShareBtn = this.stateModal.querySelector('.cv-start-share-btn');\n if (startShareBtn) {\n startShareBtn.addEventListener('click', () => {\n this.closeModal();\n this.core.toggleShareMode();\n });\n }\n\n const copyUrlBtn = this.stateModal.querySelector('.cv-copy-url-btn');\n if (copyUrlBtn) {\n copyUrlBtn.addEventListener('click', () => {\n this.copyShareableURL();\n const iconContainer = copyUrlBtn.querySelector('.cv-btn-icon');\n if (iconContainer) {\n const originalIcon = iconContainer.innerHTML;\n iconContainer.innerHTML = getTickIcon();\n setTimeout(() => {\n iconContainer.innerHTML = originalIcon;\n }, 2000);\n }\n });\n }\n }\n\n /**\n * Apply theme class to the modal overlay based on options\n */\n private applyThemeToModal(): void {\n if (!this.stateModal) return;\n if (this.options.theme === 'dark') {\n this.stateModal.classList.add('cv-widget-theme-dark');\n } else {\n this.stateModal.classList.remove('cv-widget-theme-dark');\n }\n }\n\n\n /**\n * Get current state from form values\n */\n private getCurrentCustomStateFromModal(): State {\n if (!this.stateModal) {\n return {};\n }\n\n // Collect toggle values\n const toggles: string[] = [];\n const toggleInputs = this.stateModal.querySelectorAll('.cv-toggle-input') as NodeListOf<HTMLInputElement>;\n toggleInputs.forEach(toggleInput => {\n const toggle = toggleInput.dataset.toggle;\n if (toggle && toggleInput.checked) {\n toggles.push(toggle);\n }\n });\n\n // Collect tab selections\n const tabGroupSelects = this.stateModal.querySelectorAll('.cv-tabgroup-select') as NodeListOf<HTMLSelectElement>;\n const tabs: Record<string, string> = {};\n tabGroupSelects.forEach(select => {\n const groupId = select.dataset.groupId;\n if (groupId) {\n tabs[groupId] = select.value;\n }\n });\n\n const result: State = { toggles };\n if (Object.keys(tabs).length > 0) {\n result.tabs = tabs;\n }\n return result;\n }\n\n /**\n * Copy shareable URL to clipboard\n */\n private copyShareableURL(): void {\n const customState = this.getCurrentCustomStateFromModal();\n const url = URLStateManager.generateShareableURL(customState);\n\n navigator.clipboard.writeText(url).then(() => {\n console.log('Shareable URL copied to clipboard!');\n }).catch(() => { console.error('Failed to copy URL!'); });\n }\n\n /**\n * Load current state into form based on currently active toggles\n */\n private loadCurrentStateIntoForm(): void {\n if (!this.stateModal) return;\n\n // Get currently active toggles (from custom state or default configuration)\n const activeToggles = this.core.getCurrentActiveToggles();\n\n // First, uncheck all toggle inputs\n const allToggleInputs = this.stateModal.querySelectorAll('.cv-toggle-input') as NodeListOf<HTMLInputElement>;\n allToggleInputs.forEach(toggleInput => {\n toggleInput.checked = false;\n });\n\n // Then check the ones that should be active\n activeToggles.forEach(toggle => {\n const toggleInput = this.stateModal?.querySelector(`[data-toggle=\"${toggle}\"]`) as HTMLInputElement;\n if (toggleInput) {\n toggleInput.checked = true;\n }\n });\n\n // Load tab group selections\n const activeTabs = this.core.getCurrentActiveTabs();\n const tabGroupSelects = this.stateModal.querySelectorAll('.cv-tabgroup-select') as NodeListOf<HTMLSelectElement>;\n tabGroupSelects.forEach(select => {\n const groupId = select.dataset.groupId;\n if (groupId && activeTabs[groupId]) {\n select.value = activeTabs[groupId];\n }\n });\n\n // Load tab nav visibility preference\n const navPref = ((): boolean => {\n const persisted = this.core.getPersistedTabNavVisibility();\n if (persisted !== null) {\n return persisted;\n }\n return TabManager.areNavsVisible(document.body);\n })();\n const tabNavToggle = this.stateModal.querySelector('.cv-nav-pref-input') as HTMLInputElement | null;\n const navIcon = this.stateModal?.querySelector('#cv-nav-icon');\n if (tabNavToggle) {\n tabNavToggle.checked = !navPref;\n // Ensure UI matches actual visibility\n TabManager.setNavsVisibility(document.body, navPref);\n\n // Update the nav icon to reflect the current state\n if (navIcon) {\n navIcon.innerHTML = navPref ? getNavHeadingOnIcon() : getNavHeadingOffIcon();\n }\n }\n }\n\n /**\n * Check if this is the first visit and show welcome modal\n */\n private showWelcomeModalIfFirstVisit(): void {\n if (!this._hasVisibleConfig) return;\n\n const STORAGE_KEY = 'cv-welcome-shown';\n\n // Check if welcome has been shown before\n const hasSeenWelcome = localStorage.getItem(STORAGE_KEY);\n\n if (!hasSeenWelcome) {\n // Show welcome modal after a short delay to let the page settle\n setTimeout(() => {\n this.createWelcomeModal();\n }, 500);\n\n // Mark as shown\n localStorage.setItem(STORAGE_KEY, 'true');\n }\n }\n\n /**\n * Create and show the welcome modal\n */\n private createWelcomeModal(): void {\n // Don't show if there's already a modal open\n if (this.stateModal && !this.stateModal.classList.contains('cv-hidden')) return;\n\n const welcomeModal = document.createElement('div');\n welcomeModal.className = 'cv-widget-modal-overlay cv-welcome-modal-overlay';\n if (this.options.theme === 'dark') {\n welcomeModal.classList.add('cv-widget-theme-dark');\n }\n\n welcomeModal.innerHTML = `\n <div class=\"cv-widget-modal cv-welcome-modal\">\n <header class=\"cv-modal-header\">\n <div class=\"cv-modal-header-content\">\n <div class=\"cv-modal-icon\">\n ${getGearIcon()}\n </div>\n <h1 class=\"cv-modal-title\">${this.options.welcomeTitle}</h1>\n </div>\n </header>\n <div class=\"cv-modal-main\">\n <p class=\"cv-welcome-message\">${this.options.welcomeMessage}</p>\n \n <div class=\"cv-welcome-widget-preview\">\n <div class=\"cv-welcome-widget-icon\">\n ${getGearIcon()}\n </div>\n <p class=\"cv-welcome-widget-label\">Look for this widget</p>\n </div>\n \n <button class=\"cv-welcome-got-it\">Got it!</button>\n </div>\n </div>\n `;\n\n document.body.appendChild(welcomeModal);\n this.attachWelcomeModalEventListeners(welcomeModal);\n }\n\n /**\n * Attach event listeners for welcome modal\n */\n private attachWelcomeModalEventListeners(welcomeModal: HTMLElement): void {\n const closeModal = () => {\n welcomeModal.remove();\n document.removeEventListener('keydown', handleEscape);\n };\n\n // Got it button\n const gotItBtn = welcomeModal.querySelector('.cv-welcome-got-it');\n if (gotItBtn) {\n gotItBtn.addEventListener('click', closeModal);\n }\n\n // Overlay click to close\n welcomeModal.addEventListener('click', (e) => {\n if (e.target === welcomeModal) {\n closeModal();\n }\n });\n\n // Escape key to close\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeModal();\n }\n };\n document.addEventListener('keydown', handleEscape);\n }\n\n\n}\n","import { CustomViews } from \"../lib/custom-views\";\nimport { CustomViewsWidget } from \"../core/widget\";\nimport { prependBaseUrl } from \"../utils/url-utils\";\n\n/**\n * Initialize CustomViews from script tag attributes and config file\n * This function handles the automatic initialization of CustomViews when included via script tag\n * \n * Data attributes supported:\n * - data-base-url: Base URL for the site (e.g., \"/customviews\" for subdirectory deployments)\n * - data-config-path: Path to config file (default: \"/customviews.config.json\")\n * \n * The function fetches the config file and uses it directly to initialize CustomViews.\n * Widget visibility is controlled via the config file (widget.enabled property).\n */\nexport default function initializeFromScript(): void {\n // Only run in browser environment\n if (typeof window === 'undefined') return;\n\n // Use the typed global `window` (see src/types/global.d.ts)\n // Idempotency guard: if already initialized, skip setting up listener again.\n if (window.__customViewsInitialized) {\n // Informational for developers; harmless in production.\n console.info('[CustomViews] Auto-init skipped: already initialized.');\n return;\n }\n\n document.addEventListener('DOMContentLoaded', async function() {\n // Prevent concurrent initialization runs (race conditions when script is loaded twice)\n if (window.__customViewsInitInProgress || window.__customViewsInitialized) {\n return;\n }\n window.__customViewsInitInProgress = true;\n \n try {\n // Find the script tag that loaded this script\n let scriptTag = document.currentScript as HTMLScriptElement | null;\n\n if (!scriptTag || !scriptTag.hasAttribute('data-base-url')) {\n const dataAttrMatch = document.querySelector('script[data-base-url]') as HTMLScriptElement | null;\n if (dataAttrMatch) {\n scriptTag = dataAttrMatch;\n } else {\n for (const script of document.scripts) {\n const src = script.src || '';\n if (/(?:custom[-_]views|@customviews-js\\/customviews)(?:\\.min)?\\.(?:esm\\.)?js($|\\?)/i.test(src)) {\n scriptTag = script as HTMLScriptElement;\n break;\n }\n }\n }\n }\n\n // Read data attributes from script tag\n let baseURL = '';\n let configPath = '/customviews.config.json';\n\n if (scriptTag) {\n baseURL = scriptTag.getAttribute('data-base-url') || '';\n configPath = scriptTag.getAttribute('data-config-path') || configPath;\n }\n\n // Fetch config file\n let configFile;\n try {\n const fullConfigPath = prependBaseUrl(configPath, baseURL);\n console.log(`[CustomViews] Loading config from: ${fullConfigPath}`);\n \n const response = await fetch(fullConfigPath);\n \n if (!response.ok) {\n console.warn(`[CustomViews] Config file not found at ${fullConfigPath}. Using defaults.`);\n // Provide minimal default config structure\n configFile = { \n config: { toggles: [], defaultState: {}},\n widget: { enabled: true }\n };\n } else {\n configFile = await response.json();\n console.log('[CustomViews] Config loaded successfully');\n }\n } catch (error) {\n console.error('[CustomViews] Error loading config file:', error);\n return; // Abort initialization\n }\n\n // Determine effective baseURL (data attribute takes precedence over config)\n const effectiveBaseURL = baseURL || configFile.baseURL || '';\n\n const options: any = {\n config: configFile.config,\n assetsJsonPath: configFile.assetsJsonPath,\n baseURL: effectiveBaseURL,\n }\n\n if (configFile.showUrl !== undefined) {\n options.showUrl = configFile.showUrl;\n }\n\n // Initialize CustomViews core\n const core = await CustomViews.init(options);\n\n if (!core) {\n console.error('[CustomViews] Failed to initialize core.');\n return; // Abort widget creation\n }\n\n // Store instance\n window.customViewsInstance = { core };\n\n // Initialize widget if enabled in config\n let widget;\n if (configFile.widget?.enabled !== false) {\n widget = new CustomViewsWidget({\n core,\n ...configFile.widget\n });\n widget.renderModalIcon();\n \n // Store widget instance\n window.customViewsInstance.widget = widget;\n console.log('[CustomViews] Widget initialized and rendered');\n } else {\n console.log('[CustomViews] Widget disabled in config - skipping initialization');\n }\n\n // Dispatch ready event\n const readyEvent = new CustomEvent('customviews:ready', {\n detail: {\n core,\n widget\n }\n });\n document.dispatchEvent(readyEvent);\n\n // Mark initialized and clear in-progress flag\n window.__customViewsInitialized = true;\n window.__customViewsInitInProgress = false;\n\n } catch (error) {\n // Clear in-progress flag so a future attempt can retry\n window.__customViewsInitInProgress = false;\n console.error('[CustomViews] Auto-initialization error:', error);\n }\n });\n}\n","// Import from new modules\nimport { CustomViews } from \"./lib/custom-views\";\nimport initializeFromScript from \"./entry/browser-entry\";\nimport { CustomViewsWidget } from \"./core/widget\";\n\n// Export public API\nexport { CustomViewsCore } from \"./core/core\";\nexport type { CustomViewsOptions } from \"./core/core\";\nexport { CustomViewsWidget } from \"./core/widget\";\nexport type { WidgetOptions } from \"./core/widget\";\nexport { CustomViews } from \"./lib/custom-views\";\nexport type { initOptions } from \"./lib/custom-views\";\nexport { PersistenceManager } from \"./core/persistence\";\nexport { URLStateManager } from \"./core/url-state-manager\";\nexport { AssetsManager } from \"./core/assets-manager\";\nexport type { Config } from \"./types/types\";\nexport type { ConfigFile } from \"./types/types\";\n\n// Set up globals and auto-initialization\nif (typeof window !== \"undefined\") {\n // Expose to window to enable usage (e.g. const app = new window.CustomViews(...))\n window.CustomViews = CustomViews;\n window.CustomViewsWidget = CustomViewsWidget;\n \n // Run auto-initialization\n initializeFromScript();\n}"],"names":["TABGROUP_SELECTOR"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"custom-views.js","sources":["../src/core/persistence.ts","../src/core/url-state-manager.ts","../src/core/visibility-manager.ts","../src/utils/icons.ts","../src/core/tab-manager.ts","../src/core/assets-manager.ts","../src/core/render.ts","../src/core/toggle-manager.ts","../src/utils/scroll-manager.ts","../src/styles/toggle-styles.ts","../src/styles/tab-styles.ts","../src/styles/styles.ts","../src/styles/toast-styles.ts","../src/core/toast-manager.ts","../src/core/anchor-engine.ts","../src/styles/share-mode-styles.ts","../src/core/share-manager.ts","../src/styles/focus-mode-styles.ts","../src/core/focus-manager.ts","../src/core/config.ts","../src/core/core.ts","../src/utils/url-utils.ts","../src/core/custom-elements.ts","../src/lib/custom-views.ts","../src/styles/widget-styles.ts","../src/core/widget.ts","../src/entry/browser-entry.ts","../src/index.ts"],"sourcesContent":["import type { State } from \"../types/types\";\n\n/**\n * Manages persistence of custom views state using browser localStorage\n */\nexport class PersistenceManager {\n // Storage keys for localStorage\n private static readonly STORAGE_KEYS = {\n STATE: 'customviews-state',\n TAB_NAV_VISIBILITY: 'cv-tab-navs-visible'\n } as const;\n\n /**\n * Check if localStorage is available in the current environment\n */\n private isStorageAvailable(): boolean {\n return typeof window !== 'undefined' && window.localStorage !== undefined;\n }\n\n \n public persistState(state: State): void {\n if (!this.isStorageAvailable()) return;\n\n try {\n localStorage.setItem(PersistenceManager.STORAGE_KEYS.STATE, JSON.stringify(state));\n } catch (error) {\n console.warn('Failed to persist state:', error);\n }\n }\n\n \n public getPersistedState(): State | null {\n if (!this.isStorageAvailable()) return null;\n try {\n const raw = localStorage.getItem(PersistenceManager.STORAGE_KEYS.STATE);\n return raw ? JSON.parse(raw) : null;\n } catch (error) {\n console.warn('Failed to parse persisted state:', error);\n return null;\n }\n }\n\n \n /**\n * Clear persisted state\n */\n public clearAll(): void {\n if (!this.isStorageAvailable()) return;\n\n localStorage.removeItem(PersistenceManager.STORAGE_KEYS.STATE);\n localStorage.removeItem(PersistenceManager.STORAGE_KEYS.TAB_NAV_VISIBILITY);\n }\n\n /**\n * Persist tab nav visibility preference\n */\n public persistTabNavVisibility(visible: boolean): void {\n if (!this.isStorageAvailable()) return;\n\n try {\n localStorage.setItem(PersistenceManager.STORAGE_KEYS.TAB_NAV_VISIBILITY, visible ? 'true' : 'false');\n } catch (error) {\n console.warn('Failed to persist tab nav visibility:', error);\n }\n }\n\n /**\n * Get persisted tab nav visibility preference\n */\n public getPersistedTabNavVisibility(): boolean | null {\n if (!this.isStorageAvailable()) return null;\n try {\n const raw = localStorage.getItem(PersistenceManager.STORAGE_KEYS.TAB_NAV_VISIBILITY);\n return raw === null ? null : raw === 'true';\n } catch (error) {\n console.warn('Failed to get persisted tab nav visibility:', error);\n return null;\n }\n }\n\n /**\n * Check if any persistence data exists\n */\n public hasPersistedData(): boolean {\n if (!this.isStorageAvailable()) {\n return false;\n }\n return !!this.getPersistedState();\n }\n\n}\n","/**\n * URL State Manager for CustomViews\n * Handles encoding/decoding of states in URL parameters\n */\n\nimport type { State } from \"../types/types\";\n\n\nexport class URLStateManager {\n /**\n * Parse current URL parameters into state object\n */\n public static parseURL(): State | null {\n const urlParams = new URLSearchParams(window.location.search);\n\n // Get view state\n const viewParam = urlParams.get('view');\n let decoded: State | null = null;\n if (viewParam) {\n try {\n decoded = this.decodeState(viewParam);\n } catch (error) {\n console.warn('Failed to decode view state from URL:', error);\n }\n }\n\n return decoded;\n }\n\n /**\n * Update URL with current state without triggering navigation\n */\n public static updateURL(state: State | null | undefined): void {\n if (typeof window === 'undefined' || !window.history) return;\n\n const url = new URL(window.location.href);\n\n // Clear existing parameters\n url.searchParams.delete('view');\n\n // Set view state\n if (state) {\n const encoded = this.encodeState(state);\n if (encoded) {\n url.searchParams.set('view', encoded);\n }\n }\n\n // Use a relative URL to satisfy stricter environments (e.g., jsdom tests)\n const relative = url.pathname + (url.search || '') + (url.hash || '');\n window.history.replaceState({}, '', relative);\n }\n\n /**\n * Clear all state parameters from URL\n */\n public static clearURL(): void {\n this.updateURL(null);\n }\n\n /**\n * Generate shareable URL for current state\n */\n public static generateShareableURL(state: State | null | undefined): string {\n const url = new URL(window.location.href);\n\n // Clear existing parameters\n url.searchParams.delete('view');\n\n // Set new parameters\n if (state) {\n const encoded = this.encodeState(state);\n if (encoded) {\n url.searchParams.set('view', encoded);\n }\n }\n\n return url.toString();\n }\n\n /**\n * Encode state into URL-safe string \n * \n * (Covers Toggles, Tabs and Focus currently)\n */\n private static encodeState(state: State): string | null {\n try {\n // Create a compact representation\n const compact: any = {};\n\n // Add toggles if present and non-empty\n if (state.shownToggles && state.shownToggles.length > 0) {\n compact.t = state.shownToggles;\n }\n\n // Add peek toggles if present and non-empty\n if (state.peekToggles && state.peekToggles.length > 0) {\n compact.p = state.peekToggles;\n }\n\n // Add tab groups if present\n if (state.tabs && Object.keys(state.tabs).length > 0) {\n compact.g = Object.entries(state.tabs);\n }\n\n // Add focus if present\n if (state.focus && state.focus.length > 0) {\n compact.f = state.focus;\n }\n\n // Convert to JSON and encode\n const json = JSON.stringify(compact);\n let encoded: string;\n if (typeof btoa === 'function') {\n encoded = btoa(json);\n } else {\n // Node/test fallback\n // @ts-ignore\n encoded = Buffer.from(json, 'utf-8').toString('base64');\n }\n\n // Make URL-safe\n const urlSafeString = encoded.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n return urlSafeString;\n } catch (error) {\n console.warn('Failed to encode state:', error);\n return null;\n }\n }\n\n /**\n * Decode custom state from URL parameter\n * \n * (Covers Toggles, Tabs and Focus currently)\n */\n private static decodeState(encoded: string): State | null {\n try {\n // Restore base64 padding and characters\n let base64 = encoded.replace(/-/g, '+').replace(/_/g, '/');\n\n // Add padding if needed\n while (base64.length % 4) {\n base64 += '=';\n }\n\n // Decode and parse\n let json: string;\n if (typeof atob === 'function') {\n json = atob(base64);\n } else {\n // Node/test fallback\n // @ts-ignore\n json = Buffer.from(base64, 'base64').toString('utf-8');\n }\n const compact = JSON.parse(json);\n\n // Validate structure\n if (!compact || typeof compact !== 'object') {\n throw new Error('Invalid compact state structure');\n }\n\n // Reconstruct State from compact format\n\n // Reconstruct Toggles\n const state: State = {\n shownToggles: Array.isArray(compact.t) ? compact.t : [],\n peekToggles: Array.isArray(compact.p) ? compact.p : []\n };\n\n // Reconstruct Tabs\n if (Array.isArray(compact.g)) {\n state.tabs = {};\n for (const [groupId, tabId] of compact.g) {\n if (typeof groupId === 'string' && typeof tabId === 'string') {\n state.tabs[groupId] = tabId;\n }\n }\n }\n\n // Reconstruct Focus\n if (Array.isArray(compact.f)) {\n state.focus = compact.f;\n }\n\n return state;\n } catch (error) {\n console.warn('Failed to decode view state:', error);\n return null;\n }\n }\n\n\n}\n","import type { ToggleId } from \"../types/types\";\n\n/**\n * Keeps track of which toggles are hidden and which are visible in memory.\n * \n * This class keeps track of hidden toggles without reading the DOM or URL.\n */\nexport class VisibilityManager {\n private hiddenToggles: Set<ToggleId> = new Set();\n\n /** Marks a toggle as visible or hidden. \n * Returns true if changed. \n * Also updates internal set of hidden toggles.\n */\n public setToggleVisibility(toggleId: ToggleId, visible: boolean): boolean {\n const wasHidden = this.hiddenToggles.has(toggleId);\n const shouldHide = !visible;\n if (shouldHide && !wasHidden) {\n this.hiddenToggles.add(toggleId);\n return true;\n }\n if (!shouldHide && wasHidden) {\n this.hiddenToggles.delete(toggleId);\n return true;\n }\n return false;\n }\n\n /** Hide all toggles in the provided set. */\n public hideAll(allToggleIds: ToggleId[]): void {\n for (const id of allToggleIds) {\n this.setToggleVisibility(id, false);\n }\n }\n\n /** Show all toggles in the provided set. */\n public showAll(allToggleIds: ToggleId[]): void {\n for (const id of allToggleIds) {\n this.setToggleVisibility(id, true);\n }\n }\n\n /** Get the globally hidden toggle ids (explicitly hidden via API). */\n public getHiddenToggles(): ToggleId[] {\n return Array.from(this.hiddenToggles);\n }\n\n /** Filter a list of toggles to only those visible per the hidden set. */\n public filterVisibleToggles(toggleIds: ToggleId[]): ToggleId[] {\n return toggleIds.filter(t => !this.hiddenToggles.has(t));\n }\n\n /**\n * Apply simple class-based visibility to a toggle element.\n * The element is assumed to have data-cv-toggle or data-customviews-toggle.\n */\n public applyElementVisibility(el: HTMLElement, visible: boolean): void {\n if (visible) {\n el.classList.remove('cv-hidden');\n el.classList.add('cv-visible');\n } else {\n el.classList.add('cv-hidden');\n el.classList.remove('cv-visible');\n }\n }\n}\n\n\n","/**\n * Icon utilities for CustomViews widget\n * Centralized SVG icons for better maintainability and reusability\n */\n\n/**\n * Settings gear icon for modal header\n */\nexport function getGearIcon(): string {\n return `<svg class=\"cv-modal-icon-svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path xmlns=\"http://www.w3.org/2000/svg\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 8.00002C9.79085 8.00002 7.99999 9.79088 7.99999 12C7.99999 14.2092 9.79085 16 12 16C14.2091 16 16 14.2092 16 12C16 9.79088 14.2091 8.00002 12 8.00002ZM9.99999 12C9.99999 10.8955 10.8954 10 12 10C13.1046 10 14 10.8955 14 12C14 13.1046 13.1046 14 12 14C10.8954 14 9.99999 13.1046 9.99999 12Z\" fill=\"#0F1729\"/>\n <path xmlns=\"http://www.w3.org/2000/svg\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.7673 1.01709C10.9925 0.999829 11.2454 0.99993 11.4516 1.00001L12.5484 1.00001C12.7546 0.99993 13.0075 0.999829 13.2327 1.01709C13.4989 1.03749 13.8678 1.08936 14.2634 1.26937C14.7635 1.49689 15.1915 1.85736 15.5007 2.31147C15.7454 2.67075 15.8592 3.0255 15.9246 3.2843C15.9799 3.50334 16.0228 3.75249 16.0577 3.9557L16.1993 4.77635L16.2021 4.77788C16.2369 4.79712 16.2715 4.81659 16.306 4.8363L16.3086 4.83774L17.2455 4.49865C17.4356 4.42978 17.6693 4.34509 17.8835 4.28543C18.1371 4.2148 18.4954 4.13889 18.9216 4.17026C19.4614 4.20998 19.9803 4.39497 20.4235 4.70563C20.7734 4.95095 21.0029 5.23636 21.1546 5.4515C21.2829 5.63326 21.4103 5.84671 21.514 6.02029L22.0158 6.86003C22.1256 7.04345 22.2594 7.26713 22.3627 7.47527C22.4843 7.7203 22.6328 8.07474 22.6777 8.52067C22.7341 9.08222 22.6311 9.64831 22.3803 10.1539C22.1811 10.5554 21.9171 10.8347 21.7169 11.0212C21.5469 11.1795 21.3428 11.3417 21.1755 11.4746L20.5 12L21.1755 12.5254C21.3428 12.6584 21.5469 12.8205 21.7169 12.9789C21.9171 13.1653 22.1811 13.4446 22.3802 13.8461C22.631 14.3517 22.7341 14.9178 22.6776 15.4794C22.6328 15.9253 22.4842 16.2797 22.3626 16.5248C22.2593 16.7329 22.1255 16.9566 22.0158 17.14L21.5138 17.9799C21.4102 18.1535 21.2828 18.3668 21.1546 18.5485C21.0028 18.7637 20.7734 19.0491 20.4234 19.2944C19.9803 19.6051 19.4613 19.7901 18.9216 19.8298C18.4954 19.8612 18.1371 19.7852 17.8835 19.7146C17.6692 19.6549 17.4355 19.5703 17.2454 19.5014L16.3085 19.1623L16.306 19.1638C16.2715 19.1835 16.2369 19.2029 16.2021 19.2222L16.1993 19.2237L16.0577 20.0443C16.0228 20.2475 15.9799 20.4967 15.9246 20.7157C15.8592 20.9745 15.7454 21.3293 15.5007 21.6886C15.1915 22.1427 14.7635 22.5032 14.2634 22.7307C13.8678 22.9107 13.4989 22.9626 13.2327 22.983C13.0074 23.0002 12.7546 23.0001 12.5484 23H11.4516C11.2454 23.0001 10.9925 23.0002 10.7673 22.983C10.5011 22.9626 10.1322 22.9107 9.73655 22.7307C9.23648 22.5032 8.80849 22.1427 8.49926 21.6886C8.25461 21.3293 8.14077 20.9745 8.07542 20.7157C8.02011 20.4967 7.97723 20.2475 7.94225 20.0443L7.80068 19.2237L7.79791 19.2222C7.7631 19.2029 7.72845 19.1835 7.69396 19.1637L7.69142 19.1623L6.75458 19.5014C6.5645 19.5702 6.33078 19.6549 6.11651 19.7146C5.86288 19.7852 5.50463 19.8611 5.07841 19.8298C4.53866 19.7901 4.01971 19.6051 3.57654 19.2944C3.2266 19.0491 2.99714 18.7637 2.84539 18.5485C2.71718 18.3668 2.58974 18.1534 2.4861 17.9798L1.98418 17.14C1.87447 16.9566 1.74067 16.7329 1.63737 16.5248C1.51575 16.2797 1.36719 15.9253 1.32235 15.4794C1.26588 14.9178 1.36897 14.3517 1.61976 13.8461C1.81892 13.4446 2.08289 13.1653 2.28308 12.9789C2.45312 12.8205 2.65717 12.6584 2.82449 12.5254L3.47844 12.0054V11.9947L2.82445 11.4746C2.65712 11.3417 2.45308 11.1795 2.28304 11.0212C2.08285 10.8347 1.81888 10.5554 1.61972 10.1539C1.36893 9.64832 1.26584 9.08224 1.3223 8.52069C1.36714 8.07476 1.51571 7.72032 1.63732 7.47528C1.74062 7.26715 1.87443 7.04347 1.98414 6.86005L2.48605 6.02026C2.58969 5.84669 2.71714 5.63326 2.84534 5.45151C2.9971 5.23637 3.22655 4.95096 3.5765 4.70565C4.01966 4.39498 4.53862 4.20999 5.07837 4.17027C5.50458 4.1389 5.86284 4.21481 6.11646 4.28544C6.33072 4.34511 6.56444 4.4298 6.75451 4.49867L7.69141 4.83775L7.69394 4.8363C7.72844 4.8166 7.7631 4.79712 7.79791 4.77788L7.80068 4.77635L7.94225 3.95571C7.97723 3.7525 8.02011 3.50334 8.07542 3.2843C8.14077 3.0255 8.25461 2.67075 8.49926 2.31147C8.80849 1.85736 9.23648 1.49689 9.73655 1.26937C10.1322 1.08936 10.5011 1.03749 10.7673 1.01709ZM14.0938 4.3363C14.011 3.85634 13.9696 3.61637 13.8476 3.43717C13.7445 3.2858 13.6019 3.16564 13.4352 3.0898C13.2378 3.00002 12.9943 3.00002 12.5073 3.00002H11.4927C11.0057 3.00002 10.7621 3.00002 10.5648 3.0898C10.3981 3.16564 10.2555 3.2858 10.1524 3.43717C10.0304 3.61637 9.98895 3.85634 9.90615 4.3363L9.75012 5.24064C9.69445 5.56333 9.66662 5.72467 9.60765 5.84869C9.54975 5.97047 9.50241 6.03703 9.40636 6.13166C9.30853 6.22804 9.12753 6.3281 8.76554 6.52822C8.73884 6.54298 8.71227 6.55791 8.68582 6.57302C8.33956 6.77078 8.16643 6.86966 8.03785 6.90314C7.91158 6.93602 7.83293 6.94279 7.70289 6.93196C7.57049 6.92094 7.42216 6.86726 7.12551 6.7599L6.11194 6.39308C5.66271 6.2305 5.43809 6.14921 5.22515 6.16488C5.04524 6.17811 4.87225 6.23978 4.72453 6.34333C4.5497 6.46589 4.42715 6.67094 4.18206 7.08103L3.72269 7.84965C3.46394 8.2826 3.33456 8.49907 3.31227 8.72078C3.29345 8.90796 3.32781 9.09665 3.41141 9.26519C3.51042 9.4648 3.7078 9.62177 4.10256 9.9357L4.82745 10.5122C5.07927 10.7124 5.20518 10.8126 5.28411 10.9199C5.36944 11.036 5.40583 11.1114 5.44354 11.2504C5.47844 11.379 5.47844 11.586 5.47844 12C5.47844 12.414 5.47844 12.621 5.44354 12.7497C5.40582 12.8887 5.36944 12.9641 5.28413 13.0801C5.20518 13.1875 5.07927 13.2876 4.82743 13.4879L4.10261 14.0643C3.70785 14.3783 3.51047 14.5352 3.41145 14.7349C3.32785 14.9034 3.29349 15.0921 3.31231 15.2793C3.33461 15.501 3.46398 15.7174 3.72273 16.1504L4.1821 16.919C4.4272 17.3291 4.54974 17.5342 4.72457 17.6567C4.8723 17.7603 5.04528 17.8219 5.2252 17.8352C5.43813 17.8508 5.66275 17.7695 6.11199 17.607L7.12553 17.2402C7.42216 17.1328 7.5705 17.0791 7.7029 17.0681C7.83294 17.0573 7.91159 17.064 8.03786 17.0969C8.16644 17.1304 8.33956 17.2293 8.68582 17.427C8.71228 17.4421 8.73885 17.4571 8.76554 17.4718C9.12753 17.6719 9.30853 17.772 9.40635 17.8684C9.50241 17.963 9.54975 18.0296 9.60765 18.1514C9.66662 18.2754 9.69445 18.4367 9.75012 18.7594L9.90615 19.6637C9.98895 20.1437 10.0304 20.3837 10.1524 20.5629C10.2555 20.7142 10.3981 20.8344 10.5648 20.9102C10.7621 21 11.0057 21 11.4927 21H12.5073C12.9943 21 13.2378 21 13.4352 20.9102C13.6019 20.8344 13.7445 20.7142 13.8476 20.5629C13.9696 20.3837 14.011 20.1437 14.0938 19.6637L14.2499 18.7594C14.3055 18.4367 14.3334 18.2754 14.3923 18.1514C14.4502 18.0296 14.4976 17.963 14.5936 17.8684C14.6915 17.772 14.8725 17.6719 15.2344 17.4718C15.2611 17.4571 15.2877 17.4421 15.3141 17.427C15.6604 17.2293 15.8335 17.1304 15.9621 17.0969C16.0884 17.064 16.167 17.0573 16.2971 17.0681C16.4295 17.0791 16.5778 17.1328 16.8744 17.2402L17.888 17.607C18.3372 17.7696 18.5619 17.8509 18.7748 17.8352C18.9547 17.8219 19.1277 17.7603 19.2754 17.6567C19.4502 17.5342 19.5728 17.3291 19.8179 16.919L20.2773 16.1504C20.536 15.7175 20.6654 15.501 20.6877 15.2793C20.7065 15.0921 20.6721 14.9034 20.5885 14.7349C20.4895 14.5353 20.2921 14.3783 19.8974 14.0643L19.1726 13.4879C18.9207 13.2876 18.7948 13.1875 18.7159 13.0801C18.6306 12.9641 18.5942 12.8887 18.5564 12.7497C18.5215 12.6211 18.5215 12.414 18.5215 12C18.5215 11.586 18.5215 11.379 18.5564 11.2504C18.5942 11.1114 18.6306 11.036 18.7159 10.9199C18.7948 10.8126 18.9207 10.7124 19.1725 10.5122L19.8974 9.9357C20.2922 9.62176 20.4896 9.46479 20.5886 9.26517C20.6722 9.09664 20.7065 8.90795 20.6877 8.72076C20.6654 8.49906 20.5361 8.28259 20.2773 7.84964L19.8179 7.08102C19.5728 6.67093 19.4503 6.46588 19.2755 6.34332C19.1277 6.23977 18.9548 6.1781 18.7748 6.16486C18.5619 6.14919 18.3373 6.23048 17.888 6.39307L16.8745 6.75989C16.5778 6.86725 16.4295 6.92093 16.2971 6.93195C16.167 6.94278 16.0884 6.93601 15.9621 6.90313C15.8335 6.86965 15.6604 6.77077 15.3142 6.57302C15.2877 6.55791 15.2611 6.54298 15.2345 6.52822C14.8725 6.3281 14.6915 6.22804 14.5936 6.13166C14.4976 6.03703 14.4502 5.97047 14.3923 5.84869C14.3334 5.72467 14.3055 5.56332 14.2499 5.24064L14.0938 4.3363Z\" fill=\"#0F1729\"/>\n</svg>`;\n}\n\n/**\n * Close/X icon for modal close button\n */\nexport function getCloseIcon(): string {\n return `<svg class=\"cv-modal-close-icon\" fill=\"currentColor\" height=\"20px\" viewBox=\"0 0 256 256\" width=\"20px\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n </svg>`;\n}\n\n/**\n * Reset/refresh icon for reset button\n */\nexport function getResetIcon(): string {\n return `<svg class=\"cv-btn-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M22.719 12A10.719 10.719 0 0 1 1.28 12h.838a9.916 9.916 0 1 0 1.373-5H8v1H2V2h1v4.2A10.71 10.71 0 0 1 22.719 12z\"/><path fill=\"none\" d=\"M0 0h24v24H0z\"/>\n </svg>`;\n}\n\n/**\n * Copy icon for sharing URL button\n */\nexport function getCopyIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" version=\"1.1\" fill=\"currentColor\">\n <g id=\"surface1\">\n <path d=\"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 \"></path>\n </g>\n </svg>`;\n}\n\nexport function getTickIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"2 2 22 22\" fill=\"currentColor\">\n <path d=\"M 19.28125 5.28125 L 9 15.5625 L 4.71875 11.28125 L 3.28125 12.71875 L 8.28125 17.71875 \n L 9 18.40625 L 9.71875 17.71875 L 20.71875 6.71875 Z\"></path>\n </svg>`;\n}\n\nexport function getNavHeadingOnIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"250\" height=\"181\" viewBox=\"0 0 250 181\">\n <rect y=\"34.5001\" width=\"250\" height=\"146\" rx=\"4\" stroke=\"currentColor\" stroke-width=\"10\" fill=\"none\"/>\n <line x1=\"27\" y1=\"62.0001\" x2=\"77\" y2=\"62.0001\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"77.8888\" x2=\"77\" y2=\"77.8888\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"97.4454\" x2=\"221\" y2=\"97.4454\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"114.555\" x2=\"221\" y2=\"114.555\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"132.889\" x2=\"221\" y2=\"132.889\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"150\" x2=\"221\" y2=\"150\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"247.5\" y1=\"43.0001\" x2=\"247.5\" y2=\"13.0001\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M185 12.5001L247 12.5001\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <line x1=\"204.09\" y1=\"36.6095\" x2=\"181.698\" y2=\"10.0228\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M125 9.50012L181 9.50012\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M144.305 35.2579L120.095 6.56679\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M120 6.50037L64 6.50037\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M87.1957 36.1024L59 2.50008\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M59 2.50037L3 2.50037\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n <path d=\"M2.5 38.5001L2.5 3.00012\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n </svg>`;\n}\n\nexport function getNavHeadingOffIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"250\" height=\"181\" viewBox=\"0 0 250 181\" fill=\"currentColor\">\n <rect y=\"34.5001\" width=\"250\" height=\"146\" rx=\"4\" stroke=\"currentColor\" stroke-width=\"10\" fill=\"none\"/>\n <line x1=\"27\" y1=\"62\" x2=\"77\" y2=\"62\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"77.8887\" x2=\"77\" y2=\"77.8887\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"97.4453\" x2=\"221\" y2=\"97.4453\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"114.555\" x2=\"221\" y2=\"114.555\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"132.889\" x2=\"221\" y2=\"132.889\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"150\" x2=\"221\" y2=\"150\" stroke=\"currentColor\" stroke-width=\"5\"/>\n </svg>`;\n}\n\n/**\n * Transition Icon for Navigation Headings\n */\nexport function getNavDashed(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"250\" height=\"181\" viewBox=\"0 0 250 181\">\n <rect y=\"34.5001\" width=\"250\" height=\"146\" rx=\"4\" stroke=\"currentColor\" stroke-width=\"10\" fill=\"none\"/>\n <line x1=\"27\" y1=\"62.0001\" x2=\"77\" y2=\"62.0001\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"77.8888\" x2=\"77\" y2=\"77.8888\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"97.4454\" x2=\"221\" y2=\"97.4454\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"114.555\" x2=\"221\" y2=\"114.555\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"132.889\" x2=\"221\" y2=\"132.889\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <line x1=\"27\" y1=\"150\" x2=\"221\" y2=\"150\" stroke=\"currentColor\" stroke-width=\"5\"/>\n <path d=\"M245 37.0001V39.5001H250V37.0001H247.5H245ZM250 13.0001C250 11.6194 248.881 10.5001 247.5 10.5001C246.119 10.5001 245 11.6194 245 13.0001H247.5H250ZM250 31.0001C250 29.6194 248.881 28.5001 247.5 28.5001C246.119 28.5001 245 29.6194 245 31.0001H247.5H250ZM245 19.0001C245 20.3808 246.119 21.5001 247.5 21.5001C248.881 21.5001 250 20.3808 250 19.0001H247.5H245ZM247.5 37.0001H250V31.0001H247.5H245V37.0001H247.5ZM247.5 19.0001H250V13.0001H247.5H245V19.0001H247.5Z\" fill=\"currentColor\"/>\n <line x1=\"204.09\" y1=\"36.6095\" x2=\"181.698\" y2=\"10.0228\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M125 9.50012L181 9.50012\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M144.305 35.2579L120.095 6.56679\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M120 6.50037L64 6.50037\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M87.1957 36.1024L59 2.50008\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M59 2.50037L3 2.50037\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M2.5 38.5001L2.5 3.00012\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n <path d=\"M185 12.5001L247 12.5001\" stroke=\"currentColor\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-dasharray=\"10 10\"/>\n </svg>`;\n}\n\n\nexport function getPinIcon(isPinned: boolean = false): string {\n const opacity = isPinned ? '1' : '0.6'; // Optional: additional dimming effect\n\n return `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" opacity=\"${opacity}\" xmlns=\"http://www.w3.org/2000/svg\">\n <g transform=\"rotate(45 8 8)\">\n <path d=\"M10.5 2H12V0H4V2H5.5V6L4 7.5V9H7.2V15H8.8V9H12V7.5L10.5 6V2Z\"/>\n </g>\n </svg>\n `.trim();\n}\n\nexport function getLinkIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/>\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>\n </svg>`;\n}\n\nexport function getShareIcon(): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M18 8h-2a1 1 0 0 0 0 2h2v8H6v-8h2a1 1 0 0 0 0-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8a2 2 0 0 0-2-2z\"/>\n <path fill=\"currentColor\" d=\"M11 6.41V12a1 1 0 0 0 2 0V6.41l1.29 1.3a1 1 0 0 0 1.42 0a1 1 0 0 0 0-1.42l-3-3a1 1 0 0 0-1.42 0l-3 3a1 1 0 1 0 1.42 1.42L11 6.41z\"/>\n </svg>`;\n}\n\n/**\n * GitHub icon for footer link\n */\nexport function getGitHubIcon(): string {\n return `<svg viewBox=\"0 0 98 96\" width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z\"/>\n </svg>`;\n}\n\nexport function getChevronDownIcon(): string {\n return `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>`;\n}\n\nexport function getChevronUpIcon(): string {\n return `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"18 15 12 9 6 15\"></polyline></svg>`;\n}\n","import type { TabGroupConfig } from \"../types/types\";\nimport { getPinIcon } from \"../utils/icons\";\n\n\n// Constants for selectors\nconst TABGROUP_SELECTOR = 'cv-tabgroup';\nconst TAB_SELECTOR = 'cv-tab';\nconst NAV_AUTO_SELECTOR = 'cv-tabgroup[nav=\"auto\"], cv-tabgroup:not([nav])';\nconst NAV_CONTAINER_CLASS = 'cv-tabs-nav';\nconst NAV_HIDE_ROOT_CLASS = 'cv-hide-tab-navs';\nconst NAV_HIDDEN_CLASS = 'cv-tabs-nav-hidden';\n\nexport class TabManager {\n /**\n * Split a tab ID into multiple IDs if it contains spaces or |\n */\n private static splitTabIds(tabId: string): string[] {\n const splitIds = tabId.split(/[\\s|]+/).filter(id => id.trim() !== '');\n const trimmedIds = splitIds.map(id => id.trim());\n return trimmedIds;\n }\n\n /**\n * Apply tab selections to a given list of tab group elements\n */\n public static applyTabSelections(\n tabGroups: HTMLElement[],\n tabs: Record<string, string>,\n cfgGroups?: TabGroupConfig[]\n ): void {\n tabGroups.forEach((groupEl) => {\n const groupId = groupEl.getAttribute('id');\n \n // Determine the active tab for this group\n let activeTabId: string | null;\n if (groupId) {\n activeTabId = this.resolveActiveTabForGroup(groupId, tabs, cfgGroups, groupEl as HTMLElement);\n } else {\n // For standalone groups without id, activate the first tab\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n const firstTab = tabElements[0];\n if (firstTab) {\n const firstTabId = firstTab.getAttribute('id') || firstTab.getAttribute('data-cv-internal-id') || '';\n const splitIds = this.splitTabIds(firstTabId);\n activeTabId = splitIds[0] || null;\n } else {\n activeTabId = null;\n }\n }\n \n // Apply visibility to direct child cv-tab elements only (not nested ones)\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n tabElements.forEach((tabEl) => {\n // Use id or internal id\n const tabId = tabEl.getAttribute('id') || tabEl.getAttribute('data-cv-internal-id');\n if (!tabId) return;\n\n // Split IDs and check if any match the active tab\n const splitIds = this.splitTabIds(tabId);\n const isActive = splitIds.includes(activeTabId || '');\n this.applyTabVisibility(tabEl as HTMLElement, isActive);\n });\n });\n }\n\n /**\n * Resolve the active tab for a group based on state, config, and DOM\n * \n * Pass in the current tabs state, config groups, and the group element\n */\n private static resolveActiveTabForGroup(\n groupId: string,\n tabs: Record<string, string>,\n cfgGroups: TabGroupConfig[] | undefined,\n groupEl: HTMLElement\n ): string | null {\n // 1. Check state\n if (tabs[groupId]) {\n return tabs[groupId];\n }\n\n // 2. Check config for first tab\n if (cfgGroups) {\n const groupCfg = cfgGroups.find(g => g.id === groupId);\n if (groupCfg) {\n // Fallback to first tab in config\n const firstConfigTab = groupCfg.tabs[0];\n if (firstConfigTab) {\n return firstConfigTab.id;\n }\n }\n }\n\n // 3. Fallback to first direct cv-tab child in DOM\n const firstTab = Array.from(groupEl.children).find(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n if (firstTab) {\n // Use id or internal id\n const tabId = firstTab.getAttribute('id') || firstTab.getAttribute('data-cv-internal-id') || '';\n const splitIds = this.splitTabIds(tabId);\n return splitIds[0] || null;\n }\n\n return null;\n }\n\n /**\n * Apply visibility classes to a tab element\n */\n private static applyTabVisibility(tabEl: HTMLElement, isActive: boolean): void {\n if (isActive) {\n tabEl.classList.remove('cv-hidden');\n tabEl.classList.add('cv-visible');\n } else {\n tabEl.classList.add('cv-hidden');\n tabEl.classList.remove('cv-visible');\n }\n }\n\n /**\n * Extract header and body content from header component syntax: <cv-tab-header> and <cv-tab-body>\n * Returns null if using old attribute-based syntax.\n * \n * @param tabEl The <cv-tab> element to inspect\n * @returns Object with extracted content, or null if new syntax not used\n */\n private static extractTabContent(\n tabEl: HTMLElement\n ): { headerHTML: string; bodyEl: HTMLElement | null } | null {\n // Look for direct children \n let headerEl = tabEl.querySelector(':scope > cv-tab-header');\n \n if (!headerEl) {\n return null;\n }\n\n const headerHTML = headerEl.innerHTML.trim();\n \n // Find body element\n let bodyEl = tabEl.querySelector(':scope > cv-tab-body') as HTMLElement | null;\n\n // Fallback: try finding both header and body\n // without :scope (in case of DOM manipulation) by iterating through tabEl.children if needed\n\n return {\n headerHTML,\n bodyEl\n };\n }\n\n /**\n * Build navigation for tab groups (one-time setup)\n */\n public static buildNavs(\n tabGroups: HTMLElement[],\n cfgGroups?: TabGroupConfig[],\n onTabClick?: (groupId: string, tabId: string, groupEl: HTMLElement) => void,\n onTabDoubleClick?: (groupId: string, tabId: string, groupEl: HTMLElement) => void\n ): void {\n const rootEl = document.body; // Needed for NAV_HIDE_ROOT_CLASS check\n \n tabGroups.forEach((groupEl) => {\n // Prevent re-initialization\n if (groupEl.hasAttribute('data-cv-initialized')) {\n return;\n }\n groupEl.setAttribute('data-cv-initialized', 'true');\n\n // Filter to only build for groups with nav=\"auto\" or no nav attribute\n if (!groupEl.matches(NAV_AUTO_SELECTOR)) {\n return;\n }\n\n const groupId = groupEl.getAttribute('id') || null;\n \n // Note: groupId can be null for standalone tabgroups\n // These won't sync with other groups or persist state\n\n // Check if nav already exists - if so, skip building\n let navContainer = groupEl.querySelector(`.${NAV_CONTAINER_CLASS}`);\n if (navContainer) return; // Already built\n \n // Get only direct child tabs (not nested ones)\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n if (tabElements.length === 0) return;\n\n // Create nav container\n navContainer = document.createElement('ul');\n navContainer.className = `${NAV_CONTAINER_CLASS} nav-tabs`;\n navContainer.setAttribute('role', 'tablist');\n \n // Respect viewer preference on the root to show/hide navs\n const showNavs = !rootEl.classList.contains(NAV_HIDE_ROOT_CLASS);\n if (!showNavs) {\n navContainer.classList.add(NAV_HIDDEN_CLASS);\n navContainer.setAttribute('aria-hidden', 'true');\n } else {\n navContainer.setAttribute('aria-hidden', 'false');\n }\n groupEl.insertBefore(navContainer, groupEl.firstChild);\n\n // Build nav items\n tabElements.forEach((tabEl, index) => {\n let rawTabId = tabEl.getAttribute('id');\n \n // If tab has no id, generate one based on position\n if (!rawTabId) {\n rawTabId = `${groupId}-tab-${index}`;\n tabEl.setAttribute('data-cv-internal-id', rawTabId);\n }\n\n const splitIds = this.splitTabIds(rawTabId);\n // If multiple IDs, use the first as primary\n const tabId = splitIds[0] || rawTabId;\n \n // Get header for this tab - prefer new syntax over old attribute syntax\n const extractedHeaderAndBody = this.extractTabContent(tabEl as HTMLElement);\n let header = '';\n \n // use <cv-tab-header> content if available\n if (extractedHeaderAndBody && extractedHeaderAndBody.headerHTML) {\n header = extractedHeaderAndBody.headerHTML;\n } else {\n // use header attribute if available\n const headerAttr = tabEl.getAttribute('header') || '';\n if (headerAttr) {\n header = headerAttr;\n } else {\n // Use config label if available (only if group has an id)\n const configLabel = groupId ? this.getTabLabel(tabId, groupId, cfgGroups) : null;\n if (configLabel) {\n header = configLabel;\n }\n else if (tabEl.getAttribute('id')) {\n // Use the original id if it exists\n header = tabId;\n } else {\n // Auto-generate label for tabs without id (Tab 1, Tab 2, etc.)\n header = `Tab ${index + 1}`;\n }\n }\n }\n\n // Create a single nav link for this tab element\n const listItem = document.createElement('li');\n listItem.className = 'nav-item';\n\n const navLink = document.createElement('a');\n navLink.className = 'nav-link';\n navLink.href = '#';\n navLink.setAttribute('data-tab-id', tabId);\n navLink.setAttribute('data-raw-tab-id', rawTabId);\n if (groupId) {\n navLink.setAttribute('data-group-id', groupId);\n }\n navLink.setAttribute('role', 'tab');\n \n // Create header container with text and pin icon\n const headerContainer = document.createElement('span');\n headerContainer.className = 'cv-tab-header-container';\n \n const headerText = document.createElement('span');\n headerText.className = 'cv-tab-header-text';\n headerText.innerHTML = header;\n \n const pinIcon = document.createElement('span');\n pinIcon.className = 'cv-tab-pin-icon';\n pinIcon.innerHTML = getPinIcon(true);\n pinIcon.style.display = 'none'; // Hidden by default\n \n headerContainer.appendChild(headerText);\n headerContainer.appendChild(pinIcon);\n navLink.appendChild(headerContainer);\n\n // Check if any of the split IDs is active\n const activeTabId = groupId \n ? this.resolveActiveTabForGroup(groupId, {}, cfgGroups, groupEl as HTMLElement)\n : (index === 0 ? tabId : null); // For standalone groups, activate first tab\n const isActive = splitIds.includes(activeTabId || '');\n if (isActive) {\n navLink.classList.add('active');\n navLink.setAttribute('aria-selected', 'true');\n } else {\n navLink.setAttribute('aria-selected', 'false');\n }\n\n // Add click handler for local tab switch (if split id, switches to default first ID)\n if (onTabClick) {\n navLink.addEventListener('click', (e) => {\n e.preventDefault();\n // For standalone groups (no groupId), use empty string\n onTabClick(groupId || '', tabId, groupEl as HTMLElement);\n });\n }\n\n // Add double-click handler for sync (only for groups with id)\n if (onTabDoubleClick && groupId) {\n navLink.addEventListener('dblclick', (e) => {\n e.preventDefault();\n onTabDoubleClick(groupId, tabId, groupEl as HTMLElement);\n });\n }\n\n // Add tooltip for UX feedback (use native title attribute)\n navLink.setAttribute('title', 'Double click to change switch tabs across all groups');\n\n listItem.appendChild(navLink);\n navContainer.appendChild(listItem);\n });\n\n // Add bottom border line at the end of the tab group\n const bottomBorder = document.createElement('div');\n bottomBorder.className = 'cv-tabgroup-bottom-border';\n groupEl.appendChild(bottomBorder);\n });\n }\n\n /**\n * Toggle nav visibility for all tab groups (viewer-controlled)\n */\n public static setNavsVisibility(rootEl: HTMLElement, visible: boolean): void {\n if (visible) {\n rootEl.classList.remove(NAV_HIDE_ROOT_CLASS);\n } else {\n rootEl.classList.add(NAV_HIDE_ROOT_CLASS);\n }\n\n const navContainers = rootEl.querySelectorAll(`.${NAV_CONTAINER_CLASS}`);\n navContainers.forEach((nav) => {\n if (visible) {\n nav.classList.remove(NAV_HIDDEN_CLASS);\n nav.setAttribute('aria-hidden', 'false');\n } else {\n nav.classList.add(NAV_HIDDEN_CLASS);\n nav.setAttribute('aria-hidden', 'true');\n }\n });\n\n // Also hide/show the bottom border of tab groups\n const bottomBorders = rootEl.querySelectorAll('.cv-tabgroup-bottom-border');\n bottomBorders.forEach((border) => {\n if (visible) {\n border.classList.remove('cv-hidden');\n } else {\n border.classList.add('cv-hidden');\n }\n });\n }\n\n /**\n * Read current nav visibility (viewer preference)\n */\n public static areNavsVisible(rootEl: HTMLElement): boolean {\n return !rootEl.classList.contains(NAV_HIDE_ROOT_CLASS);\n }\n\n /**\n * Get tab label from config\n */\n private static getTabLabel(\n tabId: string,\n groupId: string,\n cfgGroups?: TabGroupConfig[]\n ): string | null {\n if (!cfgGroups) return null;\n\n const groupCfg = cfgGroups.find(g => g.id === groupId);\n if (!groupCfg) return null;\n\n const tabCfg = groupCfg.tabs.find(t => t.id === tabId);\n return tabCfg?.label || null;\n }\n\n /**\n * Update active state in navs for a specific tabgroup element only\n */\n public static updateNavActiveState(groupEl: HTMLElement, activeTabId: string): void {\n const navLinks = groupEl.querySelectorAll('.nav-link');\n navLinks.forEach((link) => {\n const rawTabId = link.getAttribute('data-raw-tab-id');\n if (!rawTabId) return;\n\n // Check if activeTabId is in the split IDs of this link\n const splitIds = this.splitTabIds(rawTabId);\n const isActive = splitIds.includes(activeTabId);\n if (isActive) {\n link.classList.add('active');\n link.setAttribute('aria-selected', 'true');\n } else {\n link.classList.remove('active');\n link.setAttribute('aria-selected', 'false');\n }\n });\n }\n\n /**\n * Update active states for all tab groups based on current state\n */\n public static updateAllNavActiveStates(\n tabGroups: HTMLElement[],\n tabs: Record<string, string>,\n cfgGroups?: TabGroupConfig[]\n ): void {\n tabGroups.forEach((groupEl) => {\n const groupId = groupEl.getAttribute('id');\n if (!groupId) return;\n\n // Determine the active tab for this group\n const activeTabId = this.resolveActiveTabForGroup(groupId, tabs, cfgGroups, groupEl as HTMLElement);\n if (!activeTabId) return;\n\n // Update nav links for this group\n const navLinks = groupEl.querySelectorAll('.nav-link');\n navLinks.forEach((link) => {\n const rawTabId = link.getAttribute('data-raw-tab-id');\n if (!rawTabId) return;\n\n // Check if activeTabId is in the split IDs of this link\n const splitIds = this.splitTabIds(rawTabId);\n const isActive = splitIds.includes(activeTabId);\n if (isActive) {\n link.classList.add('active');\n link.setAttribute('aria-selected', 'true');\n } else {\n link.classList.remove('active');\n link.setAttribute('aria-selected', 'false');\n }\n });\n });\n }\n\n /**\n * Apply tab selection to a specific tabgroup element only (not globally).\n * Used for single-click behavior to update only the clicked tabgroup.\n */\n public static applyTabLocalOnly(groupEl: HTMLElement, activeTabId: string): void {\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n \n tabElements.forEach((tabEl) => {\n // Use id or internal id\n const tabId = tabEl.getAttribute('id') || tabEl.getAttribute('data-cv-internal-id');\n if (!tabId) return;\n\n const splitIds = this.splitTabIds(tabId);\n const isActive = splitIds.includes(activeTabId);\n this.applyTabVisibility(tabEl as HTMLElement, isActive);\n });\n }\n\n /**\n * Check if a tabgroup element contains a specific tab ID (respects split IDs).\n * Accepts groupEl to avoid repeated DOM queries.\n */\n public static groupHasTab(groupEl: HTMLElement, tabId: string): boolean {\n const tabElements = Array.from(groupEl.children).filter(\n (child) => child.tagName.toLowerCase() === TAB_SELECTOR\n );\n return tabElements.some((tabEl) => {\n // Use id or internal id\n const idAttr = tabEl.getAttribute('id') || tabEl.getAttribute('data-cv-internal-id') || '';\n const splitIds = this.splitTabIds(idAttr);\n return splitIds.includes(tabId);\n });\n }\n\n\n /**\n * Returns array of group elements to be synced (excluding source).\n */\n public static getTabgroupsWithId(\n rootEl: HTMLElement,\n sourceGroupId: string,\n tabId: string\n ): HTMLElement[] {\n const syncedGroupEls: HTMLElement[] = [];\n const allGroupEls = Array.from(rootEl.querySelectorAll(`${TABGROUP_SELECTOR}[id=\"${sourceGroupId}\"]`)) as HTMLElement[];\n\n allGroupEls.forEach((targetGroupEl) => {\n // Only sync if target group actually contains this tab\n if (this.groupHasTab(targetGroupEl, tabId)) {\n syncedGroupEls.push(targetGroupEl);\n }\n });\n\n return syncedGroupEls;\n }\n\n /**\n * Update pin icon visibility for all tab groups based on current state.\n * Shows pin icon for tabs that are in the persisted state (i.e., have been double-clicked).\n */\n public static updatePinIcons(\n tabGroups: HTMLElement[],\n tabs: Record<string, string>\n ): void {\n tabGroups.forEach((groupEl) => {\n const groupId = groupEl.getAttribute('id');\n if (!groupId) return;\n\n const persistedTabId = tabs[groupId];\n \n // Find all nav links in this group\n const navLinks = groupEl.querySelectorAll('.nav-link');\n navLinks.forEach((link) => {\n const rawTabId = link.getAttribute('data-raw-tab-id');\n const pinIcon = link.querySelector('.cv-tab-pin-icon') as HTMLElement;\n \n if (!pinIcon || !rawTabId) return;\n \n // Check if persisted tab ID matches any of the split IDs (for multi-ID tabs)\n const splitIds = this.splitTabIds(rawTabId);\n const shouldShowPin = persistedTabId && splitIds.includes(persistedTabId);\n \n if (shouldShowPin) {\n pinIcon.style.display = 'inline-block';\n } else {\n pinIcon.style.display = 'none';\n }\n });\n });\n }\n}\n","import type { CustomViewAsset } from \"../types/types\";\n\nexport class AssetsManager {\n assets: Record<string, CustomViewAsset>;\n private baseURL: string;\n\n constructor(assets: Record<string, CustomViewAsset>, baseURL: string = '') {\n this.assets = assets;\n this.baseURL = baseURL;\n if (!this.validate()) {\n console.warn('Invalid assets:', this.assets);\n }\n }\n\n // Check each asset has content or src\n validate(): boolean {\n return Object.values(this.assets).every(a => a.src || a.content);\n }\n\n get(assetId: string): CustomViewAsset | undefined {\n const asset = this.assets[assetId];\n if (!asset) return undefined;\n\n // If there's a baseURL and the asset has a src property, prepend the baseURL\n if (this.baseURL && asset.src) {\n // Create a shallow copy to avoid mutating the original asset\n return {\n ...asset,\n src: this.prependBaseURL(asset.src)\n };\n }\n\n return asset;\n }\n\n private prependBaseURL(path: string): string {\n // Don't prepend if the path is already absolute (starts with http:// or https://)\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path;\n }\n\n // Ensure baseURL doesn't end with / and path starts with /\n const cleanBaseURL = this.baseURL.endsWith('/') ? this.baseURL.slice(0, -1) : this.baseURL;\n const cleanPath = path.startsWith('/') ? path : '/' + path;\n \n return cleanBaseURL + cleanPath;\n }\n\n loadFromJSON(json: Record<string, CustomViewAsset>) {\n this.assets = json;\n }\n\n loadAdditionalAssets(additionalAssets: Record<string, CustomViewAsset>) {\n this.assets = { ...this.assets, ...additionalAssets };\n }\n\n}\n","import type { CustomViewAsset } from \"../types/types\";\nimport type { AssetsManager } from \"./assets-manager\";\n\n/** --- Basic renderers --- */\n\nfunction renderImage(el: HTMLElement, asset: CustomViewAsset) {\n if (!asset.src) return;\n el.innerHTML = '';\n const img = document.createElement('img');\n img.src = asset.src;\n img.alt = asset.alt || '';\n \n // Apply custom styling if provided\n if (asset.className) {\n img.className = asset.className;\n }\n if (asset.style) {\n img.setAttribute('style', asset.style);\n }\n \n // Default styles (can be overridden by asset.style)\n img.style.maxWidth = img.style.maxWidth || '100%';\n img.style.height = img.style.height || 'auto';\n img.style.display = img.style.display || 'block';\n el.appendChild(img);\n}\n\nfunction renderText(el: HTMLElement, asset: CustomViewAsset) {\n if (asset.content != null) {\n el.textContent = asset.content;\n }\n \n // Apply custom styling if provided\n if (asset.className) {\n el.className = asset.className;\n }\n if (asset.style) {\n el.setAttribute('style', asset.style);\n }\n}\n\nfunction renderHtml(el: HTMLElement, asset: CustomViewAsset) {\n if (asset.content != null) {\n el.innerHTML = asset.content;\n }\n \n // Apply custom styling if provided\n if (asset.className) {\n el.className = asset.className;\n }\n if (asset.style) {\n el.setAttribute('style', asset.style);\n }\n}\n\n/** --- Unified asset renderer --- */\n\nfunction detectAssetType(asset: CustomViewAsset): 'image' | 'text' | 'html' {\n // If src exists, it's an image\n if (asset.src) return 'image';\n \n // If content contains HTML tags, it's HTML\n if (asset.content && /<[^>]+>/.test(asset.content)) {\n return 'html';\n }\n \n return 'text';\n}\n\nexport function renderAssetInto(\n el: HTMLElement,\n assetId: string,\n assetsManager: AssetsManager\n) {\n const asset = assetsManager.get(assetId);\n if (!asset) return;\n\n const type = asset.type || detectAssetType(asset);\n\n switch (type) {\n case 'image':\n renderImage(el, asset);\n break;\n case 'text':\n renderText(el, asset);\n break;\n case 'html':\n renderHtml(el, asset);\n break;\n default:\n el.innerHTML = asset.content || String(asset);\n console.warn('[CustomViews] Unknown asset type:', type);\n }\n}\n","import type { ToggleId } from \"../types/types\";\nimport { AssetsManager } from \"./assets-manager\";\nimport { renderAssetInto } from \"./render\";\nimport { getChevronDownIcon, getChevronUpIcon } from \"../utils/icons\";\n\n/**\n * ToggleManager handles discovery, visibility, and asset rendering for toggle elements\n */\nexport class ToggleManager {\n /**\n * Track locally expanded elements (that were in peek mode but user expanded them)\n */\n private static expandedPeekElements = new WeakSet<HTMLElement>();\n\n /**\n * Apply toggle visibility to a given list of toggle elements\n */\n public static applyTogglesVisibility(allToggleElements: HTMLElement[], activeToggles: ToggleId[], peekToggles: ToggleId[] = []): void {\n allToggleElements.forEach(el => {\n const categories = this.getToggleCategories(el);\n const shouldShow = categories.some(cat => activeToggles.includes(cat));\n const shouldPeek = !shouldShow && categories.some(cat => peekToggles.includes(cat));\n\n if (!shouldPeek) {\n this.expandedPeekElements.delete(el);\n }\n\n // If locally expanded, treat as shown (override peek)\n // Note: If neither show nor peek is active (i.e. hidden), local expansion is ignored/cleared effectively\n this.applyToggleVisibility(el, shouldShow || (shouldPeek && this.expandedPeekElements.has(el)), shouldPeek && !this.expandedPeekElements.has(el));\n });\n }\n\n /**\n * Render assets into a given list of toggle elements that are currently visible\n * Toggles that have a toggleId and are currently visible will have their assets rendered (if any)\n */\n public static renderToggleAssets(elements: HTMLElement[], activeToggles: ToggleId[], assetsManager: AssetsManager): void {\n // TO DO: (gerteck) Enable for peek toggles as well\n // Also, rework the rendering logic again to make it more user friendly.\n\n elements.forEach(el => {\n const categories = this.getToggleCategories(el);\n const toggleId = this.getToggleId(el);\n const isRendered = el.dataset.cvRendered === 'true';\n\n if (toggleId && !isRendered && categories.some(cat => activeToggles.includes(cat))) {\n renderAssetInto(el, toggleId, assetsManager);\n el.dataset.cvRendered = 'true';\n }\n });\n }\n\n /**\n * Get toggle categories from an element (supports both data attributes and cv-toggle elements)\n * Note: a toggle can have multiple categories.\n */\n private static getToggleCategories(el: HTMLElement): string[] {\n if (el.tagName.toLowerCase() === 'cv-toggle') {\n const category = el.getAttribute('category');\n return (category || '').split(/\\s+/).filter(Boolean);\n } else {\n const data = el.dataset.cvToggle || el.dataset.customviewsToggle;\n return (data || '').split(/\\s+/).filter(Boolean);\n }\n }\n\n /**\n * Get toggle ID from an element\n */\n private static getToggleId(el: HTMLElement): string | undefined {\n return el.dataset.cvId || el.dataset.customviewsId || el.getAttribute('data-cv-id') || el.getAttribute('data-customviews-id') || undefined;\n }\n\n /**\n * Apply simple class-based visibility to a toggle element\n */\n private static applyToggleVisibility(toggleElement: HTMLElement, visible: boolean, peek: boolean = false): void {\n const isLocallyExpanded = this.expandedPeekElements.has(toggleElement);\n\n if (visible) {\n toggleElement.classList.remove('cv-hidden', 'cv-peek');\n toggleElement.classList.add('cv-visible');\n // Show collapse button ONLY if locally expanded (meaning we are actually in peek mode but expanded).\n // If globally visible (because of 'Show' state), isLocallyExpanded should have been cleared by applyTogglesVisibility,\n // so this will be false, and button will be removed.\n this.manageExpandButton(toggleElement, false, isLocallyExpanded);\n } else if (peek) {\n toggleElement.classList.remove('cv-hidden', 'cv-visible');\n toggleElement.classList.add('cv-peek');\n // Show/create expand button if peeked\n this.manageExpandButton(toggleElement, true, false);\n } else {\n toggleElement.classList.add('cv-hidden');\n toggleElement.classList.remove('cv-visible', 'cv-peek');\n // Ensure button is gone/hidden\n this.manageExpandButton(toggleElement, false, false);\n }\n }\n\n /**\n * Manage the presence of the inline Expand/Collapse button using a wrapper approach\n */\n private static manageExpandButton(toggleElement: HTMLElement, showExpand: boolean, showCollapse: boolean = false): void {\n // 1. Ensure wrapper exists\n let wrapper = toggleElement.parentElement;\n if (!wrapper || !wrapper.classList.contains('cv-wrapper')) {\n wrapper = document.createElement('div');\n wrapper.className = 'cv-wrapper';\n toggleElement.parentNode?.insertBefore(wrapper, toggleElement);\n wrapper.appendChild(toggleElement);\n }\n\n const btn = wrapper.querySelector('.cv-expand-btn') as HTMLElement;\n\n // 2. Handle \"No Button\" case (neither expand nor collapse)\n if (!showExpand && !showCollapse) {\n if (btn) btn.style.display = 'none';\n\n // If content is visible globally (not hidden), ensure wrapper has 'cv-expanded' \n // to hide the peek fade effect (since fade is for peek state only).\n if (!toggleElement.classList.contains('cv-hidden')) {\n wrapper.classList.add('cv-expanded');\n } else {\n wrapper.classList.remove('cv-expanded');\n }\n return;\n }\n\n // 3. Handle Button Needed (Expand or Collapse)\n const action = showExpand ? 'expand' : 'collapse';\n\n // Update Wrapper Class Logic\n // If showExpand (Peek state) -> remove cv-expanded (show fade)\n // If showCollapse (Expanded peek) -> add cv-expanded (hide fade)\n if (showExpand) {\n wrapper.classList.remove('cv-expanded');\n } else {\n if (!wrapper.classList.contains('cv-expanded')) wrapper.classList.add('cv-expanded');\n }\n\n // Check if existing button matches desired state\n const currentAction = btn?.getAttribute('data-action');\n if (btn && currentAction === action) {\n btn.style.display = 'flex';\n return;\n }\n\n // 4. Create New Button (if missing or state changed)\n const iconSvg = showExpand ? getChevronDownIcon() : getChevronUpIcon();\n\n const newBtn = document.createElement('button');\n newBtn.className = 'cv-expand-btn';\n newBtn.innerHTML = iconSvg;\n newBtn.setAttribute('aria-label', showExpand ? 'Expand content' : 'Collapse content');\n newBtn.setAttribute('data-action', action); // Track state\n newBtn.style.display = 'flex';\n\n newBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n // Logic: Toggle expansion state\n if (showExpand) {\n wrapper!.classList.add('cv-expanded');\n this.expandedPeekElements.add(toggleElement);\n this.applyToggleVisibility(toggleElement, true, false);\n } else {\n wrapper!.classList.remove('cv-expanded');\n this.expandedPeekElements.delete(toggleElement);\n this.applyToggleVisibility(toggleElement, false, true);\n }\n });\n\n if (btn) {\n btn.replaceWith(newBtn);\n } else {\n wrapper.appendChild(newBtn);\n }\n }\n\n /**\n * Scans a given DOM subtree for toggle elements and initializes them.\n * This includes applying visibility and rendering assets.\n */\n public static initializeToggles(\n root: HTMLElement,\n activeToggles: ToggleId[],\n assetsManager: AssetsManager\n ): void {\n const allToggleElements: HTMLElement[] = [];\n if (root.matches('[data-cv-toggle], [data-customviews-toggle], cv-toggle')) {\n allToggleElements.push(root);\n }\n root.querySelectorAll('[data-cv-toggle], [data-customviews-toggle], cv-toggle').forEach(el => allToggleElements.push(el as HTMLElement));\n\n if (allToggleElements.length === 0) return;\n\n this.applyTogglesVisibility(allToggleElements, activeToggles);\n this.renderToggleAssets(allToggleElements, activeToggles, assetsManager);\n }\n}","// src/utils/scroll-manager.ts\n\nexport class ScrollManager {\n /**\n * Finds the highest tab group currently in the viewport.\n * This is intended to be called BEFORE the state changes, to identify which element to scroll to.\n * @returns The HTMLElement of the highest visible tab group, or null if none are found.\n */\n public static findHighestVisibleTabGroup(): HTMLElement | null {\n // console.log('[ScrollManager] Finding highest visible tab group.');\n\n // 1. Detect fixed/sticky header and calculate its height for offset.\n let headerOffset = 0;\n const headerEl = document.querySelector('header');\n let isHeaderFixedOrSticky = false;\n if (headerEl) {\n const headerStyle = window.getComputedStyle(headerEl);\n isHeaderFixedOrSticky = ['fixed', 'sticky'].includes(headerStyle.position);\n if (isHeaderFixedOrSticky) {\n headerOffset = headerEl.getBoundingClientRect().height;\n }\n }\n const contentTop = headerOffset; // Viewport-relative position where content begins.\n\n // 2. Find all tab groups, filtering out any inside the main header.\n const allTabGroups = Array.from(document.querySelectorAll<HTMLElement>('cv-tabgroup'));\n const candidateGroups = allTabGroups.filter(groupEl => {\n if (isHeaderFixedOrSticky && headerEl && groupEl.closest('header') === headerEl) {\n return false;\n }\n return true;\n });\n\n // 3. Find the highest group that is visible in the content area (below the header).\n let highestVisibleGroup: HTMLElement | null = null;\n let highestVisibleGroupTop = Infinity;\n\n for (const groupEl of candidateGroups) {\n const rect = groupEl.getBoundingClientRect();\n // A group is \"visible\" if it's not completely above the content area or completely below the viewport.\n const isVisibleInContentArea = rect.bottom > contentTop && rect.top < window.innerHeight;\n \n if (isVisibleInContentArea) {\n // We want the one with the smallest 'top' value (closest to the top of the viewport).\n if (rect.top < highestVisibleGroupTop) {\n highestVisibleGroup = groupEl;\n highestVisibleGroupTop = rect.top;\n }\n }\n }\n \n return highestVisibleGroup;\n }\n\n /**\n * Scrolls the page to align the given tab group's header (or the group itself) \n * to the top of the viewport, accounting for a fixed/sticky page header.\n * This should be called AFTER the content has changed.\n * @param groupEl The tab group element to scroll to.\n */\n public static scrollToTabGroup(groupEl: HTMLElement): void {\n // console.log('[ScrollManager] Scrolling to tab group:', groupEl);\n\n // 1. Detect fixed/sticky header and calculate its height for offset.\n let headerOffset = 0;\n const headerEl = document.querySelector('header');\n if (headerEl) {\n const headerStyle = window.getComputedStyle(headerEl);\n if (['fixed', 'sticky'].includes(headerStyle.position)) {\n headerOffset = headerEl.getBoundingClientRect().height;\n }\n }\n const PADDING_BELOW_HEADER = 20; // Extra space.\n\n // 2. Calculate the target position.\n const targetElementRect = groupEl.getBoundingClientRect();\n\n // Calculate the absolute top position of the target element in the document.\n const scrollTargetY = targetElementRect.top + window.scrollY;\n\n // Adjust for the header offset and padding to position it just below the header.\n const finalScrollY = scrollTargetY - headerOffset - PADDING_BELOW_HEADER;\n\n // change to 'auto' if instant scroll is preferred.\n window.scrollTo({\n top: finalScrollY,\n behavior: 'smooth',\n });\n }\n\n /**\n * Adjusts the scroll position to keep a specific element in the same visual location\n * after a content change. This is useful for preventing the page from jumping when\n * content above the element is added or removed.\n * @param scrollAnchor An object containing the element to anchor and its initial top position.\n */\n public static handleScrollAnchor(scrollAnchor: { element: HTMLElement; top: number }): void {\n requestAnimationFrame(() => {\n const { element, top: initialTop } = scrollAnchor;\n const newTop = element.getBoundingClientRect().top;\n const scrollDelta = newTop - initialTop;\n\n // Only scroll if there's a noticeable change to avoid jitter\n if (Math.abs(scrollDelta) > 1) {\n window.scrollBy({\n top: scrollDelta,\n behavior: 'instant'\n });\n }\n });\n }\n}\n","/**\n * Styles for toggle visibility and animations\n */\n\nexport const TOGGLE_STYLES = `\n/* Core toggle visibility transitions */\n[data-cv-toggle], [data-customviews-toggle], cv-toggle {\n display: block;\n overflow: hidden;\n /* Removed transitions for instant toggling */\n}\n\n/* Open State */\n.cv-visible {\n opacity: 1 !important;\n transform: translateY(0) !important;\n max-height: none !important;\n}\n\n.cv-hidden {\n opacity: 0 !important;\n transform: translateY(-4px) !important;\n pointer-events: none !important;\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n border-top-width: 0 !important;\n border-bottom-width: 0 !important;\n max-height: 0 !important;\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n overflow: hidden !important;\n}\n\n/* Close/Peek State */\n.cv-peek {\n display: block !important;\n max-height: 70px !important;\n overflow: hidden !important;\n opacity: 1 !important;\n transform: translateY(0) !important;\n mask-image: linear-gradient(to bottom, black 50%, transparent 100%);\n -webkit-mask-image: linear-gradient(to bottom, black 50%, transparent 100%);\n}\n\n.cv-wrapper {\n position: relative;\n width: 100%;\n display: block;\n margin-bottom: 24px; /* Space for the button */\n}\n\n.cv-expand-btn {\n position: absolute;\n bottom: -28px; /* Mostly outside, slight overlap */\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n background: transparent;\n border: none;\n border-radius: 50%;\n padding: 4px;\n width: 32px;\n height: 32px;\n cursor: pointer;\n z-index: 100;\n align-items: center;\n justify-content: center;\n color: #888;\n transition: all 0.2s ease;\n box-shadow: none;\n}\n\n.cv-expand-btn:hover {\n background: rgba(0, 0, 0, 0.05);\n color: #000;\n transform: translateX(-50%) scale(1.1);\n}\n\n.cv-expand-btn svg {\n display: block;\n opacity: 0.6;\n}\n\n.cv-expand-btn:hover svg {\n opacity: 1;\n}\n\n`;\n","/**\n * Styles for tab groups and tab navigation\n */\n\nexport const TAB_STYLES = `\n/* Tab navigation styles - Bootstrap-style tabs matching MarkBind */\n.cv-tabs-nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-top: 0.5rem;\n margin-bottom: 1rem;\n list-style: none;\n border-bottom: 1px solid #dee2e6;\n\n align-items: stretch;\n}\n\n.cv-tabs-nav .nav-item {\n margin-bottom: -1px;\n list-style: none;\n display: flex; /* was inline-block → make flex to stretch height */\n align-items: stretch; /* stretch link to full height */\n}\n\n.cv-tabs-nav .nav-link {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 1rem;\n color: #495057;\n text-decoration: none;\n background-color: transparent;\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n cursor: pointer;\n min-height: 2.5rem;\n box-sizing: border-box;\n}\n\n.cv-tabs-nav .nav-link p {\n margin: 0; /* remove default margins */\n display: inline; /* or inline-block */\n}\n\n/* Tab header container with pin icon */\n.cv-tab-header-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.cv-tab-header-text {\n flex: 1;\n}\n\n.cv-tab-pin-icon {\n display: inline-block;\n line-height: 0;\n flex-shrink: 0;\n}\n\n.cv-tab-pin-icon svg {\n vertical-align: middle;\n width: 14px;\n height: 14px;\n}\n\n.cv-tabs-nav .nav-link:hover,\n.cv-tabs-nav .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n isolation: isolate;\n}\n\n.cv-tabs-nav .nav-link.active {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.cv-tabs-nav .nav-link:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n/* Legacy button-based nav (deprecated, kept for compatibility) */\n.cv-tabs-nav-item {\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: 0.5rem 1rem;\n cursor: pointer;\n font-size: 1rem;\n color: #6c757d;\n transition: color 150ms ease, border-color 150ms ease;\n}\n\n.cv-tabs-nav-item:hover {\n color: #495057;\n border-bottom-color: #dee2e6;\n}\n\n.cv-tabs-nav-item.active {\n color: #007bff;\n border-bottom-color: #007bff;\n font-weight: 500;\n}\n\n.cv-tabs-nav-item:focus {\n outline: 2px solid #007bff;\n outline-offset: 2px;\n}\n\n/* Tab panel base styles */\ncv-tab {\n display: block;\n}\n\n/* Hide cv-tab-header source element; content is extracted to nav link */\ncv-tab-header {\n display: none !important;\n}\n\n/* Allow cv-tab-body to flow naturally */\ncv-tab-body {\n display: block;\n}\n\n/* Override visibility for tab panels - use display instead of collapse animation */\ncv-tab.cv-hidden {\n display: none !important;\n}\n\ncv-tab.cv-visible {\n display: block !important;\n}\n\ncv-tabgroup {\n display: block;\n margin-bottom: 1.5rem;\n}\n\n/* Bottom border line for tab groups */\n.cv-tabgroup-bottom-border {\n border-bottom: 1px solid #dee2e6;\n margin-top: 1rem;\n}\n\n/* Tab content wrapper */\n.cv-tab-content {\n padding: 1rem 0;\n}\n\n/* Viewer-controlled nav visibility: hide nav containers when requested */\n.cv-tabs-nav-hidden {\n display: none !important;\n}\n\n/* Print-friendly: hide tab navigation when printing to reduce clutter */\n@media print {\n .cv-tabs-nav {\n display: none !important;\n }\n}\n`;\n","import { TOGGLE_STYLES } from './toggle-styles';\nimport { TAB_STYLES } from './tab-styles';\n\n/**\n * Combined core styles for toggles and tabs\n */\nconst CORE_STYLES = `\n${TOGGLE_STYLES}\n\n${TAB_STYLES}\n`;\n\n/**\n * Add styles for hiding and showing toggles animations and transitions to the document head\n */\nexport function injectCoreStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.querySelector('#cv-core-styles')) return;\n const style = document.createElement('style');\n style.id = 'cv-core-styles';\n style.textContent = CORE_STYLES;\n document.head.appendChild(style);\n}\n\n// Export individual style modules for flexibility\nexport { TOGGLE_STYLES } from './toggle-styles';\nexport { TAB_STYLES } from './tab-styles';\n\n\n","export const TOAST_STYLE_ID = 'cv-toast-styles';\nexport const TOAST_CLASS = 'cv-toast-notification';\n\nexport const TOAST_STYLES = `\n .cv-toast-notification {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n background-color: #323232;\n color: white;\n padding: 12px 24px;\n border-radius: 4px;\n z-index: 100000;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none; /* Let clicks pass through if needed, though usually it blocks */\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n }\n`;\n","import { TOAST_STYLES, TOAST_STYLE_ID, TOAST_CLASS } from '../styles/toast-styles';\n\n/**\n * Manages toast notifications for the application.\n */\nexport class ToastManager {\n private static isStyleInjected = false;\n private static toastEl: HTMLElement | null = null;\n private static navTimeout: any = null;\n private static fadeTimeout: any = null;\n\n public static show(message: string, duration: number = 2500): void {\n this.injectStyles();\n\n // specific reuse logic\n if (!this.toastEl) {\n this.toastEl = document.createElement('div');\n this.toastEl.className = TOAST_CLASS;\n document.body.appendChild(this.toastEl);\n }\n\n // Reset state\n this.toastEl.textContent = message;\n this.toastEl.style.opacity = '0';\n this.toastEl.style.display = 'block';\n\n // Clear any pending dismissal\n if (this.navTimeout) clearTimeout(this.navTimeout);\n if (this.fadeTimeout) clearTimeout(this.fadeTimeout);\n\n // Trigger reflow & fade in\n requestAnimationFrame(() => {\n if (this.toastEl) this.toastEl.style.opacity = '1';\n });\n\n // Schedule fade out\n this.navTimeout = setTimeout(() => {\n if (this.toastEl) this.toastEl.style.opacity = '0';\n\n this.fadeTimeout = setTimeout(() => {\n if (this.toastEl) this.toastEl.style.display = 'none';\n }, 300);\n }, duration);\n }\n\n private static injectStyles(): void {\n if (this.isStyleInjected) return;\n if (document.getElementById(TOAST_STYLE_ID)) {\n this.isStyleInjected = true;\n return;\n }\n\n const style = document.createElement('style');\n style.id = TOAST_STYLE_ID;\n style.innerHTML = TOAST_STYLES;\n document.head.appendChild(style);\n this.isStyleInjected = true;\n }\n}\n","\n/**\n * Descriptor for an anchor that represents a DOM element.\n */\ninterface AnchorDescriptor {\n tag: string; // e.g., \"P\", \"BLOCKQUOTE\"\n index: number; // e.g., 2 (It is the 2nd <p> in the container)\n parentId?: string; // ID of the nearest parent that HAS a hard ID (e.g., #section-configuration)\n textSnippet: string; // First 32 chars of text content (normalized)\n textHash: number; // A simple hash of the full text content\n}\n\n/**\n * Engine for generating and resolving robust anchors.\n * \n * It implements a simple anchor generation and resolution algorithm that uses a combination of \n * structural, contextual, and content-based hints to generate a unique anchor for a given DOM element.\n * \n * The anchor is generated by first creating an AnchorDescriptor for the element, which contains \n * information about the element's tag, index, parent ID, and text content. This descriptor is then \n * serialized into a URL-safe string using a minification algorithm.\n * \n * The anchor is then resolved by searching for the element in the DOM using the serialized string.\n * \n */\nexport class AnchorEngine {\n\n /**\n * Generates a simple hash code for a string.\n * \n * It takes each character's Unicode code point and uses it to update the hash value.\n */\n private static hashCode(str: string): number {\n let hash = 0;\n if (str.length === 0) return hash;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n }\n\n /**\n * Normalizes text content by removing excessive whitespace.\n * \n * It trims leading and trailing whitespace and replaces multiple spaces with a single space.\n */\n private static normalizeText(text: string): string {\n return text.trim().replace(/\\s+/g, ' ');\n }\n\n /**\n * Creates an AnchorDescriptor for a given DOM element.\n */\n static createDescriptor(el: HTMLElement): AnchorDescriptor {\n const tag = el.tagName;\n const textContent = el.textContent || \"\";\n const normalizedText = this.normalizeText(textContent);\n\n // Find nearest parent with an ID\n let parentId: string | undefined;\n let parent = el.parentElement;\n while (parent) {\n if (parent.id) {\n parentId = parent.id;\n break;\n }\n parent = parent.parentElement;\n }\n\n // Calculate index relative to the container (either the found parent or document.body)\n const container = parent || document.body;\n const siblings = Array.from(container.querySelectorAll(tag));\n // Index is the position of the element in the list of siblings, where siblings are those of the same tag.\n const index = siblings.indexOf(el);\n\n const descriptor: AnchorDescriptor = {\n tag,\n index: index !== -1 ? index : 0,\n textSnippet: normalizedText.substring(0, 32),\n textHash: this.hashCode(normalizedText)\n };\n\n if (parentId) {\n descriptor.parentId = parentId;\n }\n\n return descriptor;\n }\n\n /**\n * Serializes a list of AnchorDescriptors into a URL-safe string.\n */\n static serialize(descriptors: AnchorDescriptor[]): string {\n // Minify keys for compactness\n const minified = descriptors.map(d => ({\n t: d.tag,\n i: d.index,\n p: d.parentId,\n s: d.textSnippet,\n h: d.textHash\n }));\n const json = JSON.stringify(minified);\n // Base64 encode\n return btoa(encodeURIComponent(json));\n }\n\n /**\n * Deserializes a URL-safe string back into a list of AnchorDescriptors.\n */\n static deserialize(encoded: string): AnchorDescriptor[] {\n try {\n const json = decodeURIComponent(atob(encoded));\n const minified = JSON.parse(json);\n return minified.map((m: any) => ({\n tag: m.t,\n index: m.i,\n parentId: m.p,\n textSnippet: m.s,\n textHash: m.h\n }));\n } catch (e) {\n console.error(\"Failed to deserialize anchor:\", e);\n return [];\n }\n }\n\n /**\n * Finds the best DOM element match for a descriptor.\n */\n static resolve(root: HTMLElement, descriptor: AnchorDescriptor): HTMLElement | null {\n // 1. Scope\n let scope: HTMLElement = root;\n if (descriptor.parentId) {\n const foundParent = root.querySelector(`#${descriptor.parentId}`);\n if (foundParent instanceof HTMLElement) {\n scope = foundParent;\n } else {\n // Fallback: if parent ID not found, search global root - document.body\n const globalParent = document.getElementById(descriptor.parentId);\n if (globalParent) {\n scope = globalParent;\n }\n }\n }\n\n // 2. Candidate Search\n const candidates = Array.from(scope.querySelectorAll(descriptor.tag)) as HTMLElement[];\n\n // 3. Scoring\n let bestMatch: HTMLElement | null = null;\n let highestScore = 0;\n\n candidates.forEach((candidate) => {\n let score = 0;\n const text = this.normalizeText(candidate.textContent || \"\");\n\n // Exact Text Match (Hash check is faster proxy for full string compare, but let's check hash first)\n if (this.hashCode(text) === descriptor.textHash) {\n score += 50;\n } else if (text.startsWith(descriptor.textSnippet)) {\n // Fuzzy Text Match (Snippet) - +30 score\n score += 30;\n }\n\n // Structural Match (Index)\n // We need to re-calculate index of this candidate to compare with descriptor.index\n // The descriptor.index is relative to the *found* parentId container.\n // So we must compare index within the scope we are searching.\n const siblings = Array.from(scope.querySelectorAll(descriptor.tag));\n const index = siblings.indexOf(candidate);\n if (index === descriptor.index) {\n score += 10;\n }\n\n if (score > highestScore) {\n highestScore = score;\n bestMatch = candidate;\n }\n });\n\n // 4. Winner\n if (highestScore > 30) {\n return bestMatch;\n }\n\n return null;\n }\n}\n","export const SHARE_MODE_STYLE_ID = 'cv-share-mode-styles';\nexport const FLOATING_ACTION_BAR_ID = 'cv-floating-action-bar';\nexport const HOVER_HELPER_ID = 'cv-hover-helper';\n\nexport const HIGHLIGHT_TARGET_CLASS = 'cv-highlight-target';\nexport const SELECTED_CLASS = 'cv-share-selected';\n\n/**\n * CSS styles to be injected during Share Mode.\n */\nexport const SHARE_MODE_STYLES = `\n body.cv-share-mode {\n cursor: default;\n }\n\n /* Highlight outlines */\n .${HIGHLIGHT_TARGET_CLASS} {\n outline: 2px dashed #0078D4 !important;\n outline-offset: 2px;\n cursor: crosshair;\n }\n\n .${SELECTED_CLASS} {\n outline: 3px solid #005a9e !important;\n outline-offset: 2px;\n background-color: rgba(0, 120, 212, 0.05);\n }\n\n /* Floating Action Bar */\n #${FLOATING_ACTION_BAR_ID} {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n background-color: #2c2c2c;\n color: #f1f1f1;\n border-radius: 8px;\n padding: 12px 20px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n display: flex;\n align-items: center;\n gap: 16px;\n z-index: 99999;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n border: 1px solid #4a4a4a;\n }\n\n #${FLOATING_ACTION_BAR_ID} .cv-action-button {\n background-color: #0078D4;\n color: white;\n border: none;\n padding: 8px 14px;\n border-radius: 5px;\n cursor: pointer;\n font-weight: 500;\n transition: background-color 0.2s;\n }\n \n #${FLOATING_ACTION_BAR_ID} .cv-action-button:hover {\n background-color: #005a9e;\n }\n\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.clear {\n background-color: #5a5a5a;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.clear:hover {\n background-color: #4a4a4a;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.clear:hover {\n background-color: #4a4a4a;\n }\n\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.preview {\n background-color: #106ebe;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.preview:hover {\n background-color: #005a9e;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.exit {\n background-color: #d13438;\n }\n #${FLOATING_ACTION_BAR_ID} .cv-action-button.exit:hover {\n background-color: #a42628;\n }\n\n /* Hover Helper (Smart Label & Level Up) */\n #${HOVER_HELPER_ID} {\n position: fixed;\n z-index: 99999;\n background-color: #333;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-family: monospace;\n display: none;\n pointer-events: auto; /* Allow clicking buttons inside */\n align-items: center;\n gap: 8px;\n box-shadow: 0 2px 5px rgba(0,0,0,0.2);\n }\n\n #${HOVER_HELPER_ID} button {\n background: #555;\n border: none;\n color: white;\n border-radius: 3px;\n cursor: pointer;\n padding: 2px 6px;\n font-size: 14px;\n line-height: 1;\n }\n #${HOVER_HELPER_ID} button:hover {\n background: #777;\n }\n\n`;\n","\nimport { ToastManager } from './toast-manager';\nimport { AnchorEngine } from './anchor-engine';\n\nimport {\n SHARE_MODE_STYLES,\n SHARE_MODE_STYLE_ID,\n FLOATING_ACTION_BAR_ID,\n HOVER_HELPER_ID,\n HIGHLIGHT_TARGET_CLASS,\n SELECTED_CLASS\n} from '../styles/share-mode-styles';\n\nconst CV_CUSTOM_ELEMENTS = 'cv-tabgroup, cv-toggle';\nconst SHAREABLE_SELECTOR = 'div, p, blockquote, pre, li, h1, h2, h3, h4, h5, h6, [data-share], ' + CV_CUSTOM_ELEMENTS;\n\n// TODO: Add interface for plugin users to define what is excluded selection.\n// const EXCLUDED_ELEMENTS = 'header, nav, footer';\n// const EXCLUDED_IDS = 'cv-floating-action-bar';\n\nexport interface ShareManagerOptions {\n excludedTags: string[];\n excludedIds: string[];\n}\n\n/**\n * Manages the \"Share Mode\" for creating custom focus links.\n * Implementing Robust Granular Sharing with \"Innermost Wins\" and \"Level Up\" UI.\n */\nexport class ShareManager {\n private isActive = false;\n private selectedElements = new Set<HTMLElement>();\n private floatingBarEl: HTMLElement | null = null;\n private helperEl: HTMLElement | null = null;\n private currentHoverTarget: HTMLElement | null = null;\n private excludedTags: Set<string>;\n private excludedIds: Set<string>;\n private boundHandleHover: (e: MouseEvent) => void;\n private boundHandleClick: (e: MouseEvent) => void;\n private boundHandleKeydown: (e: KeyboardEvent) => void;\n\n constructor(options: ShareManagerOptions) {\n this.excludedTags = new Set(options.excludedTags.map(t => t.toUpperCase()));\n this.excludedIds = new Set(options.excludedIds);\n this.boundHandleHover = this.handleHover.bind(this);\n this.boundHandleClick = this.handleClick.bind(this);\n this.boundHandleKeydown = this.handleKeydown.bind(this);\n }\n\n private listeners: Array<(isActive: boolean) => void> = [];\n\n public addStateChangeListener(listener: (isActive: boolean) => void): void {\n this.listeners.push(listener);\n }\n\n public removeStateChangeListener(listener: (isActive: boolean) => void): void {\n this.listeners = this.listeners.filter(l => l !== listener);\n }\n\n private notifyListeners(): void {\n this.listeners.forEach(listener => listener(this.isActive));\n }\n\n public toggleShareMode(): void {\n this.isActive = !this.isActive;\n if (this.isActive) {\n this.activate();\n } else {\n this.cleanup();\n }\n this.notifyListeners();\n }\n\n /**\n * Activates the share mode.\n * Injects styles, creates floating bar, and helper element.\n * Adds event listeners for hover and click.\n */\n private activate(): void {\n this.injectStyles();\n this.createFloatingBar();\n this.helperEl = this.createHelperPopover();\n\n // Event Listeners\n document.addEventListener('mouseover', this.boundHandleHover, true);\n document.addEventListener('click', this.boundHandleClick, true);\n document.addEventListener('keydown', this.boundHandleKeydown, true);\n }\n\n private injectStyles(): void {\n const styleElement = document.createElement('style');\n styleElement.id = SHARE_MODE_STYLE_ID;\n styleElement.innerHTML = SHARE_MODE_STYLES;\n document.head.appendChild(styleElement);\n }\n\n /**\n * Creates the hover helper element that shows up when hovering over a shareable element.\n */\n private createHelperPopover(): HTMLElement {\n const div = document.createElement('div');\n div.id = HOVER_HELPER_ID;\n div.innerHTML = `\n <span id=\"cv-helper-tag\">TAG</span>\n <button id=\"cv-helper-select-btn\" title=\"Select This Element\">✓</button>\n <button id=\"cv-helper-up-btn\" title=\"Select Parent\">↰</button>\n `;\n document.body.appendChild(div);\n\n // Select parent button\n div.querySelector('#cv-helper-up-btn')?.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.handleSelectParent();\n });\n\n // Select element button\n div.querySelector('#cv-helper-select-btn')?.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (this.currentHoverTarget) {\n this.toggleSelection(this.currentHoverTarget);\n }\n });\n\n return div;\n }\n\n /**\n * Handles mouse hover events.\n *\n * This function is called when the user hovers over an element.\n * It checks if the element is shareable and highlights it.\n * If a parent element is already selected, it highlights the parent instead,\n * allowing the helper to remain visible for the selected parent.\n *\n * @param e The mouse event triggered by the hover.\n */\n private handleHover(e: MouseEvent): void {\n if (!this.isActive) return;\n\n // Check if we are hovering over the helper itself\n if (this.helperEl && this.helperEl.contains(e.target as Node)) {\n return;\n }\n\n const target = e.target as HTMLElement;\n\n // Exclude by Tag or ID\n const upperTag = target.tagName.toUpperCase();\n if (this.excludedTags.has(upperTag) || (target.id && this.excludedIds.has(target.id))) {\n return;\n }\n\n // Check closest excluded (for nested elements in excluded regions)\n let ancestor = target.parentElement;\n while (ancestor) {\n if (this.excludedTags.has(ancestor.tagName.toUpperCase()) || (ancestor.id && this.excludedIds.has(ancestor.id))) {\n return;\n }\n ancestor = ancestor.parentElement;\n }\n\n // Find closest shareable parent element\n const shareablePart = target.closest(SHAREABLE_SELECTOR);\n if (!shareablePart) {\n this.clearHover();\n return;\n }\n\n // Cast to HTMLElement\n const finalTarget = shareablePart as HTMLElement;\n\n // Check if any ancestor is already selected. If so, do NOT highlight this child.\n // Instead, highlight (or keep highlighted) the SELECTED PARENT so the user can see the helper for it.\n let parent = finalTarget.parentElement;\n let selectedAncestor: HTMLElement | null = null;\n\n // Loop outwards until we find a selected parent or reach the top\n while (parent) {\n if (this.selectedElements.has(parent)) {\n selectedAncestor = parent;\n break;\n }\n parent = parent.parentElement;\n }\n\n if (selectedAncestor) {\n // If we are hovering deep inside a selected block, show the helper for that block\n this.setNewHoverTarget(selectedAncestor);\n return;\n }\n\n // stop bubbling to parent\n // when element found for highlight\n e.stopPropagation();\n\n // If we are already on this target, do nothing (and keep it selected/highlighted)\n if (this.currentHoverTarget === finalTarget) return;\n\n // Highlight\n this.setNewHoverTarget(finalTarget);\n }\n\n private setNewHoverTarget(target: HTMLElement): void {\n if (this.currentHoverTarget) {\n this.currentHoverTarget.classList.remove(HIGHLIGHT_TARGET_CLASS);\n }\n this.currentHoverTarget = target;\n this.currentHoverTarget.classList.add(HIGHLIGHT_TARGET_CLASS);\n this.positionHelper(target);\n }\n\n private positionHelper(target: HTMLElement): void {\n if (!this.helperEl) return;\n\n const rect = target.getBoundingClientRect();\n const tagLabel = this.helperEl.querySelector('#cv-helper-tag');\n const upBtn = this.helperEl.querySelector('#cv-helper-up-btn') as HTMLElement;\n\n if (tagLabel) tagLabel.textContent = target.tagName;\n\n // Position at top-right of the element\n // Prevent going off-screen\n let top = rect.top - 20;\n if (top < 0) top = rect.top + 10; // Flip down if too close to top\n\n let left = rect.right - 80;\n if (left < 0) left = 10;\n\n this.helperEl.style.display = 'flex';\n this.helperEl.style.top = `${top}px`;\n this.helperEl.style.left = `${left}px`;\n\n // Update Select Button State (Tick or Cross)\n const selectBtn = this.helperEl.querySelector('#cv-helper-select-btn') as HTMLElement;\n if (selectBtn) {\n if (this.selectedElements.has(target)) {\n selectBtn.textContent = '✕';\n selectBtn.title = 'Deselect This Element';\n selectBtn.style.backgroundColor = '#d13438'; // Reddish\n } else {\n selectBtn.textContent = '✓';\n selectBtn.title = 'Select This Element';\n selectBtn.style.backgroundColor = ''; // Reset\n }\n }\n\n // Ancestry Check\n const parent = target.parentElement;\n const parentIsShareable = parent && parent.matches(SHAREABLE_SELECTOR);\n if (parentIsShareable) {\n upBtn.style.display = 'inline-block';\n } else {\n upBtn.style.display = 'none';\n }\n }\n\n private handleSelectParent(): void {\n if (this.currentHoverTarget && this.currentHoverTarget.parentElement) {\n const parent = this.currentHoverTarget.parentElement;\n if (parent.matches(SHAREABLE_SELECTOR)) {\n this.setNewHoverTarget(parent);\n }\n }\n }\n\n private handleClick(e: MouseEvent): void {\n if (!this.isActive) return;\n\n // If clicking helper\n if (this.helperEl && this.helperEl.contains(e.target as Node)) return;\n // If clicking floating bar\n if (this.floatingBarEl && this.floatingBarEl.contains(e.target as Node)) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n if (this.currentHoverTarget) {\n this.toggleSelection(this.currentHoverTarget);\n }\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n if (!this.isActive) return;\n\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n this.toggleShareMode();\n }\n }\n\n /**\n * Toggles the selection state of a given HTML element.\n * Implements selection logic:\n * - If an ancestor of the element is already selected, the click is ignored.\n * - If the element being selected is a parent of already selected elements, those children are deselected.\n * @param el The HTMLElement to toggle selection for.\n */\n private toggleSelection(el: HTMLElement): void {\n if (this.selectedElements.has(el)) {\n this.selectedElements.delete(el);\n el.classList.remove(SELECTED_CLASS);\n } else {\n // Selection Logic\n // Scenario A: Selecting a Parent -> Remove children selected while selecting parent\n // Scenario B: Selecting a Child -> Ignore if ancestor selected (or handle)\n\n // B. Check if any ancestor is already selected, return if any (Scenario B)\n let parent = el.parentElement;\n while (parent) {\n if (this.selectedElements.has(parent)) {\n // Ancestor is selected. Ignore click.\n return;\n }\n parent = parent.parentElement;\n }\n\n // A. Check if any children are selected (Scenario A)\n // We must iterate over currently selected elements\n const toRemove: HTMLElement[] = [];\n this.selectedElements.forEach(selected => {\n if (el.contains(selected) && el !== selected) {\n toRemove.push(selected);\n }\n });\n\n toRemove.forEach(child => {\n this.selectedElements.delete(child);\n child.classList.remove(SELECTED_CLASS);\n });\n\n // Add new selection\n this.selectedElements.add(el);\n el.classList.add(SELECTED_CLASS);\n }\n this.updateFloatingBarCount();\n }\n\n\n\n private createFloatingBar(): void {\n const bar = document.createElement('div');\n bar.id = FLOATING_ACTION_BAR_ID;\n bar.innerHTML = `\n <span id=\"cv-selected-count\">0 items selected</span>\n <button class=\"cv-action-button clear\">Clear All</button>\n <button class=\"cv-action-button preview\">Preview</button>\n <button class=\"cv-action-button generate\">Generate Link</button>\n <button class=\"cv-action-button exit\">Exit</button>\n `;\n document.body.appendChild(bar);\n this.floatingBarEl = bar;\n\n bar.querySelector('.clear')?.addEventListener('click', () => this.clearAll());\n bar.querySelector('.preview')?.addEventListener('click', () => this.previewLink());\n bar.querySelector('.generate')?.addEventListener('click', () => this.generateLink());\n bar.querySelector('.exit')?.addEventListener('click', () => this.toggleShareMode());\n }\n\n private updateFloatingBarCount(): void {\n if (this.floatingBarEl) {\n const countElement = this.floatingBarEl.querySelector('#cv-selected-count');\n if (countElement) {\n const count = this.selectedElements.size;\n countElement.textContent = `${count} item${count === 1 ? '' : 's'} selected`;\n }\n }\n }\n\n private clearAll(): void {\n this.selectedElements.forEach(el => el.classList.remove('cv-share-selected'));\n this.selectedElements.clear();\n this.updateFloatingBarCount();\n }\n\n private getShareUrl(): URL | null {\n if (this.selectedElements.size === 0) {\n return null;\n }\n\n const descriptors = Array.from(this.selectedElements).map(el => AnchorEngine.createDescriptor(el));\n const serialized = AnchorEngine.serialize(descriptors);\n\n const url = new URL(window.location.href);\n url.searchParams.set('cv-focus', serialized);\n return url;\n }\n\n private async generateLink(): Promise<void> {\n const url = this.getShareUrl();\n if (!url) {\n ToastManager.show('Please select at least one item.');\n return;\n }\n\n try {\n await navigator.clipboard.writeText(url.toString());\n ToastManager.show('Link copied to clipboard!');\n } catch (e) {\n console.error('Clipboard failed', e);\n ToastManager.show('Failed to copy link.');\n }\n }\n\n private previewLink(): void {\n const url = this.getShareUrl();\n if (!url) {\n ToastManager.show('Please select at least one item.');\n return;\n }\n window.open(url.toString(), '_blank');\n }\n\n\n\n private clearHover(): void {\n if (this.currentHoverTarget) {\n this.currentHoverTarget.classList.remove(HIGHLIGHT_TARGET_CLASS);\n this.currentHoverTarget = null;\n }\n if (this.helperEl) {\n this.helperEl.style.display = 'none';\n }\n }\n\n public cleanup(): void {\n document.body.classList.remove('cv-share-mode');\n this.clearAll();\n\n const style = document.getElementById(SHARE_MODE_STYLE_ID);\n if (style) document.head.removeChild(style);\n\n if (this.floatingBarEl) {\n document.body.removeChild(this.floatingBarEl);\n this.floatingBarEl = null;\n }\n\n if (this.helperEl) {\n document.body.removeChild(this.helperEl);\n this.helperEl = null;\n }\n\n if (this.currentHoverTarget) {\n this.currentHoverTarget.classList.remove(HIGHLIGHT_TARGET_CLASS);\n this.currentHoverTarget = null;\n }\n\n document.removeEventListener('mouseover', this.boundHandleHover, true);\n document.removeEventListener('click', this.boundHandleClick, true);\n document.removeEventListener('keydown', this.boundHandleKeydown, true);\n\n this.isActive = false;\n }\n}\n","export const FOCUS_MODE_STYLE_ID = 'cv-focus-mode-styles';\nexport const BODY_FOCUS_CLASS = 'cv-focus-mode';\nexport const HIDDEN_CLASS = 'cv-focus-hidden';\nexport const FOCUSED_CLASS = 'cv-focused-element';\nexport const DIVIDER_CLASS = 'cv-context-divider';\nexport const EXIT_BANNER_ID = 'cv-exit-focus-banner';\n\nconst styles = `\n body.${BODY_FOCUS_CLASS} {\n /* e.g. potentially hide scrollbars or adjust layout */\n }\n\n .${HIDDEN_CLASS} {\n display: none !important;\n }\n\n .${FOCUSED_CLASS} {\n /* No visual style for focused elements, just logic class for now. Can add borders for debugging*/\n }\n\n .${DIVIDER_CLASS} {\n padding: 12px;\n margin: 16px 0;\n background-color: #f8f8f8;\n border-top: 1px dashed #ccc;\n border-bottom: 1px dashed #ccc;\n color: #555;\n text-align: center;\n cursor: pointer;\n font-family: system-ui, sans-serif;\n font-size: 13px;\n transition: background-color 0.2s;\n }\n .${DIVIDER_CLASS}:hover {\n background-color: #e8e8e8;\n color: #333;\n }\n\n #${EXIT_BANNER_ID} {\n position: sticky;\n top: 0;\n left: 0;\n right: 0;\n background-color: #0078D4;\n color: white;\n padding: 10px 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n z-index: 100000;\n font-family: system-ui, sans-serif;\n box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n }\n\n #${EXIT_BANNER_ID} button {\n background: white;\n color: #0078D4;\n border: none;\n padding: 4px 12px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 600;\n }\n #${EXIT_BANNER_ID} button:hover {\n background: #f0f0f0;\n }\n`;\n\nexport const FOCUS_MODE_STYLES = styles;\n","/**\n * Manages the \"Focus Mode\" (Presentation View).\n * Parses the URL for robust anchors, resolves them, hides irrelevant content, and inserts context dividers.\n */\nimport { ToastManager } from './toast-manager';\nimport { AnchorEngine } from './anchor-engine';\nimport { TOAST_CLASS } from '../styles/toast-styles';\nimport {\n FOCUS_MODE_STYLES,\n FOCUS_MODE_STYLE_ID,\n BODY_FOCUS_CLASS,\n HIDDEN_CLASS,\n FOCUSED_CLASS,\n DIVIDER_CLASS,\n EXIT_BANNER_ID\n} from '../styles/focus-mode-styles';\n\nconst FOCUS_PARAM = 'cv-focus';\n\nexport interface FocusManagerOptions {\n excludedTags: string[];\n excludedIds: string[];\n}\n\nexport class FocusManager {\n\n private hiddenElements = new Set<HTMLElement>();\n private dividers: HTMLElement[] = [];\n private exitBanner: HTMLElement | null = null;\n private excludedTags: Set<string>;\n private excludedIds: Set<string>;\n\n constructor(private rootEl: HTMLElement, options: FocusManagerOptions) {\n this.excludedTags = new Set(options.excludedTags.map(t => t.toUpperCase()));\n this.excludedIds = new Set(options.excludedIds);\n }\n\n /**\n * Initializes the Focus Manager. Checks URL for focus parameter.\n */\n public init(): void {\n this.handleUrlChange();\n }\n\n public handleUrlChange(): void {\n const urlParams = new URLSearchParams(window.location.search);\n const encodedDescriptors = urlParams.get(FOCUS_PARAM);\n\n if (encodedDescriptors) {\n this.applyFocusMode(encodedDescriptors);\n } else {\n // encoding missing, ensure we exit focus mode if active\n if (document.body.classList.contains(BODY_FOCUS_CLASS)) {\n this.exitFocusMode();\n }\n }\n }\n\n /**\n * Applies Focus Mode based on encoded descriptors.\n */\n public applyFocusMode(encodedDescriptors: string): void {\n const descriptors = AnchorEngine.deserialize(encodedDescriptors);\n if (!descriptors || descriptors.length === 0) return;\n\n // Resolve anchors to DOM elements\n const targets: HTMLElement[] = [];\n descriptors.forEach(desc => {\n const el = AnchorEngine.resolve(this.rootEl, desc);\n if (el) {\n targets.push(el);\n }\n });\n\n if (targets.length === 0) {\n ToastManager.show(\"Some shared sections could not be found.\");\n return;\n }\n\n if (targets.length < descriptors.length) {\n ToastManager.show(\"Some shared sections could not be found.\");\n }\n\n this.injectStyles();\n document.body.classList.add(BODY_FOCUS_CLASS);\n this.renderFocusedView(targets);\n this.showExitBanner();\n }\n\n private injectStyles(): void {\n if (document.getElementById(FOCUS_MODE_STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = FOCUS_MODE_STYLE_ID;\n style.textContent = FOCUS_MODE_STYLES;\n document.head.appendChild(style);\n }\n\n /**\n * Hides irrelevant content and adds dividers.\n */\n private renderFocusedView(targets: HTMLElement[]): void {\n // 1. Mark targets\n targets.forEach(t => t.classList.add(FOCUSED_CLASS));\n\n // 2. We need to hide siblings of targets (and their ancestors up to root generally, \n // but \"siblings between focused zones\" suggests we are mostly looking at a flat list or specific nesting).\n //\n // \"All sibling elements between the focused zones are collapsed and hidden.\"\n // \"If a user selects a parent element, all of its child elements must be visible.\"\n //\n // Algorithm:\n // Walk up from each target to finding the common container? \n // Or just assume targets are somewhat related.\n //\n // Let's implement a robust \"Hide Siblings\" approach.\n // For every target, we ensure it is visible.\n // We look at its siblings. If a sibling is NOT a target AND NOT an ancestor of a target, we hide it.\n\n // We need to identify all \"Keep Visible\" elements (targets + ancestors)\n const keepVisible = new Set<HTMLElement>();\n targets.forEach(t => {\n let curr: HTMLElement | null = t;\n while (curr && curr !== document.body && curr !== document.documentElement) {\n keepVisible.add(curr);\n curr = curr.parentElement;\n }\n });\n\n // Now iterate through siblings of \"Keep Visible\" elements?\n // Actually, we can just walk the tree or iterate siblings of targets/ancestors?\n //\n // Improved Algorithm: \n // 1. Collect all direct siblings of every element in keepVisible set.\n // 2. If a sibling is NOT in keepVisible, hide it.\n\n // To avoid processing the entire DOM, we start from targets and walk up.\n keepVisible.forEach(el => {\n if (el === document.body) return; // Don't hide siblings of body (scripts etc) unless we are sure.\n // Actually usually we want to hide siblings of the content container.\n\n const parent = el.parentElement;\n if (!parent) return;\n\n // FIX: \"Parent Dominance\"\n // If the parent itself is a target (or we otherwise decided its whole content is meaningful),\n // then we should NOT hide anything inside it.\n // We check if 'parent' is one of the explicitly resolved targets.\n // We can check if it has the FOCUSED_CLASS class, since we added it in step 1.\n if (parent.classList.contains(FOCUSED_CLASS)) {\n return;\n }\n\n // Using children because we want element nodes\n Array.from(parent.children).forEach(child => {\n if (child instanceof HTMLElement && !keepVisible.has(child)) {\n this.hideElement(child);\n }\n });\n });\n\n // 3. Insert Dividers\n // We process each container that has hidden elements\n const processedContainers = new Set<HTMLElement>();\n\n keepVisible.forEach(el => {\n const parent = el.parentElement;\n if (parent && !processedContainers.has(parent)) {\n this.insertDividersForContainer(parent);\n processedContainers.add(parent);\n }\n });\n }\n\n private hideElement(el: HTMLElement): void {\n if (this.hiddenElements.has(el)) return; // Already hidden\n\n // Exclude by Tag\n if (this.excludedTags.has(el.tagName.toUpperCase())) return;\n\n // Exclude by ID (if strictly matching)\n if (el.id && this.excludedIds.has(el.id)) return;\n\n // Also don't hide things that are aria-hidden\n if (el.getAttribute('aria-hidden') === 'true') return;\n\n // Exclude Toast Notification\n if (el.classList.contains(TOAST_CLASS)) return;\n\n // We check if it is already hidden (e.g. by previous focus mode run? No, isActive check handles that)\n // Just mark it.\n el.classList.add(HIDDEN_CLASS);\n this.hiddenElements.add(el);\n }\n\n private insertDividersForContainer(container: HTMLElement): void {\n const children = Array.from(container.children) as HTMLElement[];\n let hiddenCount = 0;\n let hiddenGroupStart: HTMLElement | null = null;\n\n children.forEach((child) => {\n if (child.classList.contains(HIDDEN_CLASS)) {\n if (hiddenCount === 0) hiddenGroupStart = child;\n hiddenCount++;\n } else {\n // Found a visible element. Was there a hidden group before this?\n if (hiddenCount > 0 && hiddenGroupStart) {\n this.createDivider(container, hiddenGroupStart, hiddenCount);\n hiddenCount = 0;\n hiddenGroupStart = null;\n }\n }\n });\n\n // Trailing hidden group\n if (hiddenCount > 0 && hiddenGroupStart) {\n this.createDivider(container, hiddenGroupStart, hiddenCount);\n }\n }\n\n private createDivider(container: HTMLElement, insertBeforeEl: HTMLElement | null, count: number): void {\n const divider = document.createElement('div');\n divider.className = DIVIDER_CLASS;\n divider.textContent = `... ${count} section${count > 1 ? 's' : ''} hidden (Click to expand) ...`;\n divider.onclick = () => this.expandContext(insertBeforeEl, count, divider);\n\n container.insertBefore(divider, insertBeforeEl);\n this.dividers.push(divider);\n }\n\n private expandContext(firstHidden: HTMLElement | null, count: number, divider: HTMLElement) {\n // Divider is inserted BEFORE firstHidden.\n // So firstHidden is the first element to reveal.\n let curr: Element | null = firstHidden;\n let expanded = 0;\n\n while (curr && expanded < count) {\n if (curr instanceof HTMLElement && curr.classList.contains(HIDDEN_CLASS)) {\n curr.classList.remove(HIDDEN_CLASS);\n this.hiddenElements.delete(curr);\n }\n curr = curr.nextElementSibling;\n // Note: If nested dividers or other elements exist, they shouldn't count?\n // \"Children\" iteration in insertDividers covered direct children.\n // sibling iteration also covers direct children.\n // We assume contiguous hidden siblings.\n expanded++;\n }\n\n divider.remove();\n const idx = this.dividers.indexOf(divider);\n if (idx > -1) this.dividers.splice(idx, 1);\n\n // If no more hidden elements, remove the banner\n if (this.hiddenElements.size === 0) {\n this.removeExitBanner();\n }\n }\n\n private removeExitBanner(): void {\n if (this.exitBanner) {\n this.exitBanner.remove();\n this.exitBanner = null;\n }\n }\n\n /**\n * Override of renderFocusedView with robust logic\n */\n // (We use the class method `renderFocusedView` and internal helpers)\n\n private showExitBanner(): void {\n if (document.getElementById(EXIT_BANNER_ID)) return;\n\n const banner = document.createElement('div');\n banner.id = EXIT_BANNER_ID;\n banner.innerHTML = `\n <span>You are viewing a focused selection.</span>\n <button id=\"cv-exit-focus-btn\">Show Full Page</button>\n `;\n document.body.prepend(banner); // Top of body\n\n banner.querySelector('button')?.addEventListener('click', () => this.exitFocusMode());\n this.exitBanner = banner;\n }\n\n public exitFocusMode(): void {\n document.body.classList.remove(BODY_FOCUS_CLASS);\n\n // Show all hidden elements\n this.hiddenElements.forEach(el => el.classList.remove(HIDDEN_CLASS));\n this.hiddenElements.clear();\n\n // Remove dividers\n this.dividers.forEach(d => d.remove());\n this.dividers = [];\n\n // Remove styling from targets\n const targets = document.querySelectorAll(`.${FOCUSED_CLASS}`);\n targets.forEach(t => t.classList.remove(FOCUSED_CLASS));\n\n // Remove banner\n this.removeExitBanner();\n\n // Update URL\n const url = new URL(window.location.href);\n url.searchParams.delete(FOCUS_PARAM);\n window.history.pushState({}, '', url.toString());\n }\n\n\n}\n","export const DEFAULT_EXCLUDED_TAGS = ['HEADER', 'NAV', 'FOOTER', 'SCRIPT', 'STYLE'];\nexport const DEFAULT_EXCLUDED_IDS = ['cv-floating-action-bar', 'cv-hover-helper', 'cv-toast-notification'];\n","import type { State, TabGroupConfig, Config } from \"../types/types\";\nimport type { AssetsManager } from \"./assets-manager\";\n\nimport { PersistenceManager } from \"./persistence\";\nimport { URLStateManager } from \"./url-state-manager\";\nimport { VisibilityManager } from \"./visibility-manager\";\nimport { TabManager } from \"./tab-manager\";\nimport { ToggleManager } from \"./toggle-manager\";\nimport { ScrollManager } from \"../utils/scroll-manager\";\nimport { injectCoreStyles } from \"../styles/styles\";\nimport { ShareManager } from \"./share-manager\";\nimport { FocusManager } from \"./focus-manager\";\nimport { DEFAULT_EXCLUDED_TAGS, DEFAULT_EXCLUDED_IDS } from './config';\n\nconst TOGGLE_SELECTOR = \"[data-cv-toggle], [data-customviews-toggle], cv-toggle\";\nconst TABGROUP_SELECTOR = 'cv-tabgroup';\n\ninterface ComponentRegistry {\n toggles: Set<HTMLElement>;\n tabGroups: Set<HTMLElement>;\n}\n\nexport interface CustomViewsOptions {\n assetsManager: AssetsManager;\n config: Config;\n rootEl?: HTMLElement | undefined;\n showUrl?: boolean;\n}\n\nexport class CustomViewsCore {\n private rootEl: HTMLElement;\n private assetsManager: AssetsManager;\n private persistenceManager: PersistenceManager;\n private visibilityManager: VisibilityManager;\n private observer: MutationObserver | null = null;\n private shareManager: ShareManager;\n private focusManager: FocusManager;\n\n private componentRegistry: ComponentRegistry = {\n toggles: new Set(),\n tabGroups: new Set(),\n };\n\n private config: Config;\n private stateChangeListeners: Array<() => void> = [];\n private showUrlEnabled: boolean;\n private lastAppliedState: State | null = null;\n\n constructor(opt: CustomViewsOptions) {\n this.assetsManager = opt.assetsManager;\n this.config = opt.config;\n this.rootEl = opt.rootEl || document.body;\n this.persistenceManager = new PersistenceManager();\n this.visibilityManager = new VisibilityManager();\n this.showUrlEnabled = opt.showUrl ?? false;\n this.lastAppliedState = this.cloneState(this.getComputedDefaultState());\n\n // Resolve Exclusions\n const excludedTags = [...DEFAULT_EXCLUDED_TAGS, ...(this.config.shareExclusions?.tags || [])];\n const excludedIds = [...DEFAULT_EXCLUDED_IDS, ...(this.config.shareExclusions?.ids || [])];\n const commonOptions = { excludedTags, excludedIds };\n\n this.shareManager = new ShareManager(commonOptions);\n this.focusManager = new FocusManager(this.rootEl, commonOptions);\n }\n\n public getShareManager(): ShareManager {\n return this.shareManager;\n }\n\n /**\n * Toggles the share mode on or off.\n */\n public toggleShareMode(): void {\n this.shareManager.toggleShareMode();\n }\n\n /**\n * Scan the given element for toggles and tab groups, register them\n * Returns true if new components were found\n */\n private scan(element: HTMLElement): boolean {\n let newComponentsFound = false;\n\n // Scan for toggles\n const toggles = Array.from(element.querySelectorAll(TOGGLE_SELECTOR));\n if (element.matches(TOGGLE_SELECTOR)) {\n toggles.unshift(element);\n }\n toggles.forEach((toggle) => {\n if (!this.componentRegistry.toggles.has(toggle as HTMLElement)) {\n this.componentRegistry.toggles.add(toggle as HTMLElement);\n newComponentsFound = true;\n }\n });\n\n // Scan for tab groups\n const tabGroups = Array.from(element.querySelectorAll(TABGROUP_SELECTOR));\n if (element.matches(TABGROUP_SELECTOR)) {\n tabGroups.unshift(element);\n }\n tabGroups.forEach((tabGroup) => {\n if (!this.componentRegistry.tabGroups.has(tabGroup as HTMLElement)) {\n this.componentRegistry.tabGroups.add(tabGroup as HTMLElement);\n newComponentsFound = true;\n }\n });\n\n return newComponentsFound;\n }\n\n /**\n * Unscan the given element for toggles and tab groups, de-register them from registry\n */\n private unscan(element: HTMLElement): void {\n // Unscan for toggles\n const toggles = Array.from(element.querySelectorAll(TOGGLE_SELECTOR));\n if (element.matches(TOGGLE_SELECTOR)) {\n toggles.unshift(element);\n }\n toggles.forEach((toggle) => {\n this.componentRegistry.toggles.delete(toggle as HTMLElement);\n });\n\n // Unscan for tab groups\n const tabGroups = Array.from(element.querySelectorAll(TABGROUP_SELECTOR));\n if (element.matches(TABGROUP_SELECTOR)) {\n tabGroups.unshift(element);\n }\n tabGroups.forEach((tabGroup) => {\n this.componentRegistry.tabGroups.delete(tabGroup as HTMLElement);\n });\n }\n\n public getConfig(): Config {\n return this.config;\n }\n\n /**\n * Get tab groups from config\n */\n public getTabGroups(): TabGroupConfig[] | undefined {\n return this.config.tabGroups;\n }\n\n /**\n * Generate a computed default state:\n * - If config.defaultState is defined, use it (even if empty)\n * - Otherwise, compute a default: enable all toggles and set all tab groups to their first tab\n */\n private getComputedDefaultState(): State {\n const configDefaultState = this.config?.defaultState;\n\n // If defaultState is explicitly defined in config, use it as-is\n if (configDefaultState !== undefined) {\n return configDefaultState;\n }\n\n // Otherwise, compute a default state: all toggles on, all tabs to first\n const tabs: Record<string, string> = {};\n\n // Set all tab groups to their first tab\n if (this.config.tabGroups?.length) {\n this.config.tabGroups.forEach(group => {\n if (group.tabs && group.tabs.length > 0) {\n const firstTab = group.tabs[0];\n if (firstTab?.id) {\n tabs[group.id] = firstTab.id;\n }\n }\n });\n }\n\n const computedState: State = {\n shownToggles: this.config.toggles?.map(t => t.id) || [],\n tabs\n };\n\n return computedState;\n }\n\n /**\n * Get currently active tabs (from URL > persisted (localStorage) > defaults)\n */\n public getCurrentActiveTabs(): Record<string, string> {\n if (this.lastAppliedState?.tabs) {\n return { ...this.lastAppliedState.tabs };\n }\n\n const persistedState = this.persistenceManager.getPersistedState();\n if (persistedState?.tabs) {\n return { ...persistedState.tabs };\n }\n\n return this.getComputedDefaultState().tabs || {};\n }\n\n /**\n * Set active tab for a group and apply state\n */\n public setActiveTab(groupId: string, tabId: string, groupEl?: HTMLElement): void {\n // If groupEl is provided, apply tab selection locally to just that element\n // Single-click: only updates DOM visually, no persistence\n if (groupEl) {\n TabManager.applyTabLocalOnly(groupEl, tabId);\n\n // Update nav active state for this group element only\n TabManager.updateNavActiveState(groupEl, tabId);\n\n // Emit custom event for local tab change\n const event = new CustomEvent('customviews:tab-change', {\n detail: { groupId, tabId, synced: false },\n bubbles: true\n });\n document.dispatchEvent(event);\n }\n }\n\n // Inject styles, setup listeners and call rendering logic\n public async init() {\n injectCoreStyles();\n this.scan(this.rootEl);\n\n // Initialize all components found on initial scan\n this.initializeNewComponents();\n\n // Apply stored nav visibility preference on page load\n const navPref = this.persistenceManager.getPersistedTabNavVisibility();\n if (navPref !== null) {\n TabManager.setNavsVisibility(this.rootEl, navPref);\n }\n\n // For session history, clicks on back/forward button\n window.addEventListener(\"popstate\", () => {\n this.loadAndCallApplyState();\n this.focusManager.handleUrlChange();\n });\n\n this.loadAndCallApplyState();\n this.focusManager.init();\n this.initObserver();\n }\n\n private initializeNewComponents(): void {\n // Build navigation for any newly added tab groups.\n // The `data-cv-initialized` attribute in `buildNavs` prevents re-initialization.\n TabManager.buildNavs(\n Array.from(this.componentRegistry.tabGroups),\n this.config.tabGroups,\n // Single click: update clicked group only (local, no persistence)\n (groupId, tabId, groupEl) => {\n this.setActiveTab(groupId, tabId, groupEl);\n },\n // Double click: sync across all tabgroups with same id (with persistence)\n (groupId, tabId, groupEl) => {\n // 1. Record position before state change\n const navHeader = groupEl.querySelector('.cv-tabs-nav');\n const anchorElement = navHeader instanceof HTMLElement ? navHeader : groupEl;\n const initialTop = anchorElement.getBoundingClientRect().top;\n\n const currentTabs = this.getCurrentActiveTabs();\n currentTabs[groupId] = tabId;\n\n const currentState = this.getCurrentState();\n const newState: State = {\n ...currentState,\n tabs: currentTabs,\n };\n\n // 2. Apply state with scroll anchor information\n this.applyState(newState, {\n scrollAnchor: { element: anchorElement, top: initialTop }\n });\n }\n );\n\n // Future components (e.g., toggles, widgets) can be initialized here\n }\n\n private initObserver() {\n this.observer = new MutationObserver((mutations) => {\n let newComponentsFound = false;\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof Element) {\n // Scan the new node for components and add them to the registry\n if (this.scan(node as HTMLElement)) {\n newComponentsFound = true;\n }\n }\n });\n\n mutation.removedNodes.forEach((node) => {\n if (node instanceof Element) {\n // Unscan the removed node to cleanup the registry\n this.unscan(node as HTMLElement);\n }\n });\n }\n }\n\n if (newComponentsFound) {\n // Initialize navs for new components.\n this.initializeNewComponents();\n\n // Re-apply the last known state. renderState will handle disconnecting\n // the observer to prevent infinite loops.\n if (this.lastAppliedState) {\n this.renderState(this.lastAppliedState);\n }\n }\n });\n\n // Observe only the root element to avoid performance issues on large pages.\n if (this.rootEl) {\n this.observer.observe(this.rootEl, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n // Priority: URL state > persisted state > config default > computed default\n // Also filters using the visibility manager to persist selection\n // across back/forward button clicks\n private async loadAndCallApplyState() {\n // 1. URL State\n const urlState = URLStateManager.parseURL();\n if (urlState) {\n // Apply URL state temporarily (do not persist until interaction)\n this.applyState(urlState, { persist: false });\n return;\n }\n\n // 2. Persisted State\n const persistedState = this.persistenceManager.getPersistedState();\n if (persistedState) {\n this.applyState(persistedState);\n return;\n }\n\n // 3. Computed Default Fallback\n this.renderState(this.getComputedDefaultState());\n }\n\n /**\n * Apply a custom state, saves to localStorage and updates the URL\n * 'source' in options indicates the origin of the state change\n * (e.g., 'widget' to trigger scroll behavior)\n * 'scrollAnchor' in options indicates the element to maintain scroll position of\n * 'persist' (default true) to control whether to save to localStorage\n */\n public applyState(state: State, options?: { source?: string; scrollAnchor?: { element: HTMLElement; top: number; }; persist?: boolean; }) {\n // console.log(`[Core] applyState called with source: ${options?.source}`, state);\n\n let groupToScrollTo: HTMLElement | null = null;\n if (options?.source === 'widget') {\n groupToScrollTo = ScrollManager.findHighestVisibleTabGroup();\n }\n\n const snapshot = this.cloneState(state);\n this.renderState(snapshot);\n\n // Only persist if explicitly requested (default true)\n if (options?.persist !== false) {\n this.persistenceManager.persistState(snapshot);\n }\n\n if (this.showUrlEnabled) {\n URLStateManager.updateURL(snapshot);\n } else {\n URLStateManager.clearURL();\n }\n\n if (groupToScrollTo) {\n // Defer scrolling until after the DOM has been updated by renderState\n queueMicrotask(() => {\n ScrollManager.scrollToTabGroup(groupToScrollTo as HTMLElement);\n });\n }\n\n // Handle scroll anchoring for double-clicks\n // scroll to original position after content changes\n if (options?.scrollAnchor) {\n ScrollManager.handleScrollAnchor(options.scrollAnchor);\n }\n }\n\n /** \n * Renders state on components in ComponentRegistry\n * Applies the given state.\n * Disconnects the mutation observer during rendering to prevent loops\n **/\n private renderState(state: State) {\n this.observer?.disconnect();\n this.lastAppliedState = this.cloneState(state);\n const toggles = state?.shownToggles || [];\n const finalToggles = this.visibilityManager.filterVisibleToggles(toggles);\n\n const allToggleElements = Array.from(this.componentRegistry.toggles);\n const tabGroupElements = Array.from(this.componentRegistry.tabGroups);\n\n ToggleManager.applyTogglesVisibility(allToggleElements, finalToggles, state.peekToggles);\n\n // Render assets into toggles\n ToggleManager.renderToggleAssets(allToggleElements, finalToggles, this.assetsManager);\n\n // Apply tab selections\n TabManager.applyTabSelections(tabGroupElements, state.tabs || {}, this.config.tabGroups);\n\n // Update nav active states (without rebuilding)\n TabManager.updateAllNavActiveStates(tabGroupElements, state.tabs || {}, this.config.tabGroups);\n\n // Update pin icons to show which tabs are persisted\n TabManager.updatePinIcons(tabGroupElements, state.tabs || {});\n\n // Notify state change listeners (like widgets)\n this.notifyStateChangeListeners();\n this.observer?.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n /**\n * Reset to default state\n */\n public resetToDefault() {\n this.persistenceManager.clearAll();\n\n if (this.config) {\n this.renderState(this.getComputedDefaultState());\n } else {\n console.warn(\"No configuration loaded, cannot reset to default state\");\n }\n\n // Reset tab nav visibility to default (visible)\n TabManager.setNavsVisibility(this.rootEl, true);\n\n // Clear URL\n URLStateManager.clearURL();\n }\n\n\n /**\n * Get the full current state including active toggles, peek toggles, and tabs\n */\n public getCurrentState(): State {\n if (this.lastAppliedState) {\n return this.cloneState(this.lastAppliedState);\n }\n\n if (this.config) {\n return this.cloneState(this.getComputedDefaultState());\n }\n\n return {};\n }\n\n /**\n * Clear all persistence and reset to default\n */\n public clearPersistence() {\n this.persistenceManager.clearAll();\n if (this.config) {\n this.renderState(this.getComputedDefaultState());\n } else {\n console.warn(\"No configuration loaded, cannot reset to default state\");\n }\n\n URLStateManager.clearURL();\n }\n\n public setOption(flag: string, value: unknown): void {\n switch (flag) {\n case 'showUrl': {\n const nextValue = Boolean(value);\n if (this.showUrlEnabled === nextValue) {\n return;\n }\n\n this.showUrlEnabled = nextValue;\n if (nextValue) {\n const stateForUrl = this.getTrackedStateSnapshot();\n URLStateManager.updateURL(stateForUrl);\n } else {\n URLStateManager.clearURL();\n }\n break;\n }\n default:\n console.warn(`[CustomViews] Unknown option '${flag}' passed to setOption`);\n }\n }\n\n // === STATE CHANGE LISTENER METHODS ===\n /**\n * Add a listener that will be called whenever the state changes\n */\n public addStateChangeListener(listener: () => void): void {\n this.stateChangeListeners.push(listener);\n }\n\n /**\n * Remove a state change listener\n */\n public removeStateChangeListener(listener: () => void): void {\n const index = this.stateChangeListeners.indexOf(listener);\n if (index > -1) {\n this.stateChangeListeners.splice(index, 1);\n }\n }\n\n /**\n * Notify all state change listeners\n */\n private notifyStateChangeListeners(): void {\n this.stateChangeListeners.forEach(listener => {\n try {\n listener();\n } catch (error) {\n console.warn('Error in state change listener:', error);\n }\n });\n }\n\n /**\n * Persist tab nav visibility preference\n */\n public persistTabNavVisibility(visible: boolean): void {\n this.persistenceManager.persistTabNavVisibility(visible);\n }\n\n /**\n * Get persisted tab nav visibility preference\n */\n public getPersistedTabNavVisibility(): boolean | null {\n return this.persistenceManager.getPersistedTabNavVisibility();\n }\n\n private cloneState(state?: State | null): State {\n if (!state) return {};\n return JSON.parse(JSON.stringify(state));\n }\n\n private getTrackedStateSnapshot(): State {\n if (this.lastAppliedState) {\n return this.cloneState(this.lastAppliedState);\n }\n\n if (this.config) {\n return this.cloneState(this.getComputedDefaultState());\n }\n\n return {};\n }\n\n}\n\n\n\n\n\n\n","/**\n * Helper function to prepend baseUrl to a path\n * @param path The path to prepend the baseUrl to\n * @param baseUrl The base URL to prepend\n * @returns The full URL with baseUrl prepended if applicable\n */\nexport function prependBaseUrl(path: string, baseUrl: string): string {\n if (!baseUrl) return path;\n \n // Don't prepend if the path is already absolute (starts with http:// or https://)\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path;\n }\n\n // Ensure baseUrl doesn't end with / and path starts with /\n const cleanbaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const cleanPath = path.startsWith('/') ? path : '/' + path;\n \n return cleanbaseUrl + cleanPath;\n}\n","/**\n * Defines the custom elements used by CustomViews.\n */\n\n/**\n * `<cv-tab>`: A custom element representing a single tab panel within a tab group.\n * Its content is displayed when the corresponding tab is active.\n */\nclass CVTab extends HTMLElement {\n connectedCallback() {\n // Element is managed by TabManager\n }\n}\n\n/**\n * `<cv-tabgroup>`: A custom element that encapsulates a set of tabs (`<cv-tab>`).\n * It manages the tab navigation and content visibility for the group.\n */\nclass CVTabgroup extends HTMLElement {\n connectedCallback() {\n // Element is managed by TabManager\n // Emit ready event after a brief delay to ensure children are parsed\n setTimeout(() => {\n const event = new CustomEvent('cv:tabgroup-ready', {\n bubbles: true,\n detail: { groupId: this.getAttribute('id') }\n });\n this.dispatchEvent(event);\n }, 0);\n }\n}\n\n/**\n * `<cv-toggle>`: A custom element for creating a toggleable content block.\n */\nclass CVToggle extends HTMLElement {\n connectedCallback() {\n // Element is managed by Core\n }\n}\n\n/**\n * `<cv-tab-header>`: A semantic container for a tab's header content.\n * The content of this element is used to create the navigation link for the tab.\n */\nclass CVTabHeader extends HTMLElement {\n connectedCallback() {\n // Element is a semantic container; TabManager extracts its content\n }\n}\n\n/**\n * `<cv-tab-body>`: A semantic container for the main content of a tab panel.\n */\nclass CVTabBody extends HTMLElement {\n connectedCallback() {\n // Element is a semantic container; visibility managed by TabManager\n }\n}\n\n/**\n * Registers all CustomViews custom elements with the CustomElementRegistry.\n */\nexport function registerCustomElements(): void {\n // Only register if not already defined\n if (!customElements.get('cv-tab')) {\n customElements.define('cv-tab', CVTab);\n }\n\n if (!customElements.get('cv-tabgroup')) {\n customElements.define('cv-tabgroup', CVTabgroup);\n }\n\n if (!customElements.get('cv-toggle')) {\n customElements.define('cv-toggle', CVToggle);\n }\n\n if (!customElements.get('cv-tab-header')) {\n customElements.define('cv-tab-header', CVTabHeader);\n }\n\n if (!customElements.get('cv-tab-body')) {\n customElements.define('cv-tab-body', CVTabBody);\n }\n}\n","import { CustomViewsCore, type CustomViewsOptions } from \"../core/core\";\nimport { AssetsManager } from \"../core/assets-manager\";\nimport type { CustomViewAsset, Config } from \"../types/types\";\nimport { prependBaseUrl } from \"../utils/url-utils\";\nimport { registerCustomElements } from \"../core/custom-elements\";\n\n/**\n * Options for initializing CustomViews from JSON\n */\nexport type initOptions = {\n /** Path to the assets JSON file */\n assetsJsonPath?: string;\n /** Root element to apply custom views */\n rootEl?: HTMLElement;\n /** Config object with toggles and defaultState */\n config?: Config;\n /** Base URL for all paths */\n baseURL?: string;\n /** Whether to show the `view` parameter in the browser URL bar */\n showUrl?: boolean;\n}\n\n/**\n * Main CustomViews class for initializing and managing custom views\n */\nexport class CustomViews {\n /**\n * Entry Point to use CustomViews\n * @param opts Initialization options including config object and assets path\n * @returns Promise resolving to the CustomViewsCore instance or null if initialization fails\n */\n static async init(opts: initOptions): Promise<CustomViewsCore | null> {\n // Register custom elements\n registerCustomElements();\n\n // Load assets JSON if provided\n let assetsManager: AssetsManager | undefined;\n const baseURL = opts.baseURL || '';\n if (opts.assetsJsonPath) {\n const assetsPath = prependBaseUrl(opts.assetsJsonPath, baseURL);\n try {\n const assetsJson: Record<string, CustomViewAsset> = await (await fetch(assetsPath)).json();\n assetsManager = new AssetsManager(assetsJson, baseURL);\n } catch (error) {\n console.error(`[CustomViews] Failed to load assets JSON from ${assetsPath}:`, error);\n assetsManager = new AssetsManager({}, baseURL);\n }\n } else {\n assetsManager = new AssetsManager({}, baseURL);\n }\n\n // Use provided config or create a minimal default one\n let config: Config;\n if (opts.config) {\n config = opts.config;\n } else {\n console.error(\"No config provided, using minimal default config\");\n // Create a minimal default config\n config = { toggles: [], defaultState: {} };\n }\n\n const coreOptions: CustomViewsOptions = {\n assetsManager,\n config: config,\n rootEl: opts.rootEl,\n };\n if (opts.showUrl !== undefined) {\n coreOptions.showUrl = opts.showUrl;\n }\n const core = new CustomViewsCore(coreOptions);\n core.init();\n return core;\n }\n}\n","/**\n * Widget styles for CustomViews\n * Extracted from widget.ts for better maintainability\n * \n * Note: Styles are kept as a TypeScript string for compatibility with the build system.\n * This approach ensures the styles are properly bundled and don't require separate CSS file handling.\n */\n\nexport const WIDGET_STYLES = `\n/* Rounded rectangle widget icon styles */\n.cv-widget-icon {\n position: fixed;\n /* Slightly transparent by default so the widget is subtle at the page edge */\n background: rgba(255, 255, 255, 0.92);\n color: rgba(0, 0, 0, 0.9);\n opacity: 0.6;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n font-weight: bold;\n cursor: pointer;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 9998;\n transition: all 0.3s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.cv-widget-icon:hover {\n /* Become fully opaque on hover to improve readability */\n background: rgba(255, 255, 255, 1);\n color: rgba(0, 0, 0, 1);\n opacity: 1;\n}\n\n/* Top-right: rounded end on left, sticks out leftward on hover */\n.cv-widget-top-right {\n top: 20px;\n right: 0;\n border-radius: 18px 0 0 18px;\n padding-left: 8px;\n justify-content: flex-start;\n}\n\n/* Top-left: rounded end on right, sticks out rightward on hover */\n.cv-widget-top-left {\n top: 20px;\n left: 0;\n border-radius: 0 18px 18px 0;\n padding-right: 8px;\n justify-content: flex-end;\n}\n\n/* Bottom-right: rounded end on left, sticks out leftward on hover */\n.cv-widget-bottom-right {\n bottom: 20px;\n right: 0;\n border-radius: 18px 0 0 18px;\n padding-left: 8px;\n justify-content: flex-start;\n}\n\n/* Bottom-left: rounded end on right, sticks out rightward on hover */\n.cv-widget-bottom-left {\n bottom: 20px;\n left: 0;\n border-radius: 0 18px 18px 0;\n padding-right: 8px;\n justify-content: flex-end;\n}\n\n/* Middle-left: rounded end on right, sticks out rightward on hover */\n.cv-widget-middle-left {\n top: 50%;\n left: 0;\n transform: translateY(-50%);\n border-radius: 0 18px 18px 0;\n padding-right: 8px;\n justify-content: flex-end;\n}\n\n/* Middle-right: rounded end on left, sticks out leftward on hover */\n.cv-widget-middle-right {\n top: 50%;\n right: 0;\n transform: translateY(-50%);\n border-radius: 18px 0 0 18px;\n padding-left: 8px;\n justify-content: flex-start;\n}\n\n.cv-widget-top-right,\n.cv-widget-middle-right,\n.cv-widget-bottom-right,\n.cv-widget-top-left,\n.cv-widget-middle-left,\n.cv-widget-bottom-left {\n height: 36px;\n width: 36px;\n}\n\n.cv-widget-middle-right:hover,\n.cv-widget-top-right:hover,\n.cv-widget-bottom-right:hover,\n.cv-widget-top-left:hover,\n.cv-widget-middle-left:hover,\n.cv-widget-bottom-left:hover {\n width: 55px;\n}\n\n/* Modal content styles */\n.cv-widget-section {\n margin-bottom: 16px;\n}\n\n.cv-widget-section:last-child {\n margin-bottom: 0;\n}\n\n.cv-widget-section label {\n display: block;\n margin-bottom: 4px;\n font-weight: 500;\n color: #555;\n}\n\n.cv-widget-profile-select,\n.cv-widget-state-select {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n}\n\n.cv-widget-profile-select:focus,\n.cv-widget-state-select:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n}\n\n.cv-widget-profile-select:disabled,\n.cv-widget-state-select:disabled {\n background: #f8f9fa;\n color: #6c757d;\n cursor: not-allowed;\n}\n\n.cv-widget-current {\n margin: 16px 0;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 4px;\n border-left: 4px solid #007bff;\n}\n\n.cv-widget-current label {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: #666;\n margin-bottom: 4px;\n}\n\n.cv-widget-current-view {\n font-weight: 500;\n color: #333;\n}\n\n.cv-widget-reset {\n width: 100%;\n padding: 8px 16px;\n background: #dc3545;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n}\n\n.cv-widget-reset:hover {\n background: #c82333;\n}\n\n.cv-widget-reset:active {\n background: #bd2130;\n}\n\n/* Responsive design for mobile */\n@media (max-width: 768px) {\n .cv-widget-top-right,\n .cv-widget-top-left {\n top: 10px;\n }\n\n .cv-widget-bottom-right,\n .cv-widget-bottom-left {\n bottom: 10px;\n }\n\n /* All widgets stay flush with screen edges */\n .cv-widget-top-right,\n .cv-widget-bottom-right,\n .cv-widget-middle-right {\n right: 0;\n }\n\n .cv-widget-top-left,\n .cv-widget-bottom-left,\n .cv-widget-middle-left {\n left: 0;\n }\n\n /* Slightly smaller on mobile */\n .cv-widget-icon {\n width: 60px;\n height: 32px;\n }\n\n .cv-widget-icon:hover {\n width: 75px;\n }\n}\n\n/* Modal styles */\n.cv-widget-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10002;\n animation: fadeIn 0.2s ease;\n}\n\n.cv-widget-modal-overlay.cv-hidden {\n display: none;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.cv-widget-modal {\n background: white;\n border-radius: 0.75rem;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n max-width: 32rem;\n width: 90vw;\n max-height: 80vh;\n animation: slideIn 0.2s ease;\n display: flex;\n flex-direction: column;\n}\n\n@keyframes slideIn {\n from { \n opacity: 0;\n transform: scale(0.9) translateY(-20px);\n }\n to { \n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n.cv-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.cv-modal-header-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.cv-modal-icon {\n position: relative;\n width: 1rem;\n height: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n}\n\n.cv-modal-icon-svg {\n width: 100%;\n height: 100%;\n opacity: 1;\n}\n\n.cv-modal-title {\n font-size: 1.125rem;\n font-weight: bold;\n color: rgba(0, 0, 0, 0.9);\n margin: 0;\n}\n\n.cv-modal-close {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n background: transparent;\n border: none;\n color: rgba(0, 0, 0, 0.6);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.cv-modal-close:hover {\n background: rgba(62, 132, 244, 0.1);\n color: #3e84f4;\n}\n\n.cv-modal-close-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.cv-modal-main {\n padding: 1rem;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n overflow-y: auto;\n max-height: calc(80vh - 8rem);\n}\n\n.cv-modal-description {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.8);\n margin: 0;\n line-height: 1.4;\n}\n\n.cv-content-section,\n.cv-tab-groups-section {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.cv-section-heading {\n font-size: 1rem;\n font-weight: bold;\n color: rgba(0, 0, 0, 0.9);\n margin: 0;\n}\n\n.cv-widget-modal-actions {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n}\n\n.cv-widget-restore {\n width: 100%;\n padding: 10px 16px;\n background: #28a745;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n}\n\n.cv-widget-restore:hover {\n background: #218838;\n}\n\n.cv-widget-create-state {\n width: 100%;\n padding: 10px 16px;\n background: #007bff;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.cv-widget-create-state:hover {\n background: #0056b3;\n}\n\n.cv-widget-theme-dark .cv-widget-modal {\n background: #101722;\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-modal-header {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-modal-title {\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-modal-close {\n color: rgba(255, 255, 255, 0.6);\n}\n\n.cv-widget-theme-dark .cv-modal-close:hover {\n background: rgba(62, 132, 244, 0.2);\n color: #3e84f4;\n}\n\n.cv-widget-theme-dark .cv-modal-description {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-section-heading {\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-toggles-container\n.cv-widget-theme-dark .cv-tabgroups-container {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-toggle-card,\n.cv-widget-theme-dark .cv-tabgroup-card {\n background: #101722;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-toggle-title,\n.cv-widget-theme-dark .cv-tabgroup-title {\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-toggle-description,\n.cv-widget-theme-dark .cv-tabgroup-description {\n color: rgba(255, 255, 255, 0.6);\n}\n\n.cv-widget-theme-dark .cv-tab-group-description {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-select {\n background: #101722;\n border-color: rgba(255, 255, 255, 0.2);\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-modal-footer {\n border-color: rgba(255, 255, 255, 0.1);\n background: #101722;\n}\n\n.cv-widget-theme-dark .cv-reset-btn {\n color: #e2e8f0;\n background: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-reset-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n/* Custom state creator styles */\n.cv-custom-state-modal {\n max-width: 500px;\n}\n\n.cv-custom-state-form .cv-section-header {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n border-bottom: 1px solid #e9ecef;\n padding-bottom: 5px;\n}\n\n.cv-custom-state-form p {\n font-size: 15px;\n line-height: 1.6;\n color: #555;\n margin-bottom: 24px;\n text-align: justify;\n}\n\n.cv-custom-state-section {\n margin-bottom: 16px;\n}\n\n.cv-custom-state-section label {\n display: block;\n margin-bottom: 4px;\n font-weight: 500;\n color: #555;\n}\n\n.cv-custom-state-input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n}\n\n.cv-custom-state-input:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n}\n\n/* Toggles Container */\n.cv-toggles-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n border-radius: 0.5rem;\n border: 1px solid rgba(0, 0, 0, 0.1);\n overflow: hidden;\n}\n\n.cv-toggle-card,\n.cv-tabgroup-card {\n background: white;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.cv-toggle-card:last-child {\n border-bottom: none;\n}\n\n.cv-toggle-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem;\n}\n\n.cv-toggle-title {\n font-weight: 500;\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.9);\n margin: 0 0 0.125rem 0;\n}\n\n.cv-toggle-description {\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.6);\n margin: 0;\n}\n\n.cv-toggle-label{\n position: relative;\n display: inline-block;\n width: 2.75rem;\n height: 1.5rem;\n cursor: pointer;\n}\n\n.cv-toggle-input {\n /* Only hide if it is part of a custom slider toggle */\n}\n.cv-toggle-label .cv-toggle-input {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.cv-toggle-radios {\n display: flex;\n gap: 8px;\n}\n\n.cv-radio-label {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.cv-radio-label input {\n margin: 0;\n opacity: 1;\n width: auto;\n height: auto;\n}\n\n/* Dark theme toggle switch styles */\n.cv-widget-theme-dark .cv-toggle-switch {\n background: #4a5568;\n}\n\n.cv-widget-theme-dark .cv-toggle-switch:hover {\n background: #5a6578;\n}\n\n.cv-widget-theme-dark .cv-toggle-switch.cv-toggle-active {\n background: #63b3ed;\n}\n\n.cv-widget-theme-dark .cv-toggle-switch.cv-toggle-active:hover {\n background: #4299e1;\n}\n\n/* Tab Groups Container */\n.cv-tab-groups-list {\n display: flex;\n flex-direction: column;\n gap: 1px;\n border: 1px solid rgba(0, 0, 0, 0.1);\n border-radius: 0.5rem;\n overflow: hidden;\n}\n\n/* Tab Group Card - Header (Navigation Headers toggle) */\n.cv-tabgroup-card.cv-tabgroup-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem;\n border-bottom: 0px;\n}\n\n.cv-tabgroup-card.cv-tabgroup-header .cv-tabgroup-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n gap: 1rem;\n}\n\n/* Navigation toggle icon container */\n.cv-nav-toggle-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.cv-nav-icon {\n width: 2rem;\n height: 2rem;\n color: rgba(0, 0, 0, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: color 0.2s ease;\n}\n\n/* Logo box - centered grey box on its own row */\n.cv-tabgroup-logo-box {\n width: 3.5rem;\n height: 3.5rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 0.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-bottom: 0.5rem;\n}\n\n/* Title container for title alignment (without icon) */\n.cv-tabgroup-title-container {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Hover state for icon - apply to the entire tabgroup-row */\n.cv-tabgroup-card.cv-tabgroup-header:hover .cv-nav-icon {\n color: #3e84f4;\n}\n\n.cv-widget-theme-dark .cv-nav-icon {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-card.cv-tabgroup-header:hover .cv-nav-icon {\n color: #60a5fa;\n}\n\n/* Tab Group Card - Items */\n.cv-tabgroup-card.cv-tabgroup-item {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding: 0.75rem;\n background: white;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.cv-tabgroup-card.cv-tabgroup-item:last-child {\n border-bottom: none;\n}\n\n/* Tab Group Info */\n.cv-tabgroup-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.cv-tabgroup-title {\n font-weight: 500;\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.9);\n margin: 0 0 0 0;\n}\n\n.cv-tabgroup-description {\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.6);\n margin: 0;\n line-height: 1.3;\n}\n\n/* Tab Group Label (for select dropdowns) */\n.cv-tabgroup-label {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.8);\n margin: 0;\n line-height: 1.4;\n font-weight: 500;\n display: block;\n cursor: pointer;\n}\n\n/* Tab Group Select */\n.cv-tabgroup-select {\n width: 100%;\n border-radius: 0.5rem;\n background: white;\n border: 1px solid rgba(0, 0, 0, 0.15);\n color: rgba(0, 0, 0, 0.9);\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n}\n\n.cv-tabgroup-select:hover {\n border-color: rgba(0, 0, 0, 0.25);\n}\n\n.cv-tabgroup-select:focus {\n outline: none;\n border-color: #3e84f4;\n box-shadow: 0 0 0 2px rgba(62, 132, 244, 0.2);\n}\n\n/* Modern Toggle Switch */\n.cv-toggle-switch {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 44px;\n height: 24px;\n background: rgba(0, 0, 0, 0.1);\n border-radius: 9999px;\n padding: 2px;\n box-sizing: border-box;\n cursor: pointer;\n transition: background-color 0.2s ease;\n border: none;\n}\n\n.cv-toggle-switch input {\n display: none;\n}\n\n.cv-toggle-switch .cv-switch-bg {\n position: absolute;\n inset: 0;\n border-radius: 9999px;\n background: rgba(0, 0, 0, 0.1);\n transition: background-color 0.2s ease;\n pointer-events: none;\n}\n\n.cv-toggle-switch .cv-switch-knob {\n position: relative;\n width: 20px;\n height: 20px;\n background: white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n transition: transform 0.2s ease;\n z-index: 1;\n}\n\n.cv-toggle-switch input:checked + .cv-switch-bg {\n background: #3e84f4;\n}\n\n.cv-toggle-switch input:checked ~ .cv-switch-knob {\n transform: translateX(20px);\n}\n\n/* Dark Theme - Tab Groups */\n.cv-widget-theme-dark .cv-tabgroup-card.cv-tabgroup-header {\n background: #101722;\n border-bottom-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-card.cv-tabgroup-item {\n background: #101722;\n border-bottom-color: rgba(255, 255, 255, 0.05);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-title {\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-tabgroup-description {\n color: rgba(255, 255, 255, 0.6);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-label {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-tab-groups-list {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-select {\n background: #101722;\n border-color: rgba(255, 255, 255, 0.15);\n color: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-tabgroup-select:hover {\n border-color: rgba(255, 255, 255, 0.25);\n}\n\n.cv-widget-theme-dark .cv-tabgroup-select:focus {\n border-color: #60a5fa;\n box-shadow: 0 0 0 2px rgba(96, 165, 250, 0.2);\n}\n\n/* Dark Theme - Toggle Switch */\n.cv-widget-theme-dark .cv-toggle-switch .cv-switch-bg {\n background: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-toggle-switch .cv-switch-knob {\n background: #e2e8f0;\n}\n\n.cv-widget-theme-dark .cv-toggle-switch input:checked + .cv-switch-bg {\n background: #63b3ed;\n}\n\n.cv-modal-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n \n.cv-footer-link {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n color: rgba(0, 0, 0, 0.5);\n text-decoration: none;\n transition: color 0.2s ease;\n}\n\n.cv-footer-link:hover {\n color: #3e84f4;\n}\n\n.cv-footer-link svg {\n opacity: 0.8;\n}\n\n.cv-widget-theme-dark .cv-footer-link {\n color: rgba(255, 255, 255, 0.4);\n}\n\n.cv-widget-theme-dark .cv-footer-link:hover {\n color: #60a5fa;\n}\n\n.cv-reset-btn,\n.cv-share-btn {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n border-radius: 0.5rem;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s ease;\n border: none;\n}\n\n.cv-reset-btn {\n color: rgba(0, 0, 0, 0.9);\n background: rgba(0, 0, 0, 0.1);\n}\n\n.cv-reset-btn:hover {\n background: rgba(0, 0, 0, 0.2);\n}\n\n.cv-share-btn {\n color: white;\n background: #3e84f4;\n}\n\n.cv-share-btn:hover {\n background: rgba(62, 132, 244, 0.9);\n}\n\n.cv-btn-icon {\n width: 1rem;\n height: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 0.2s ease;\n}\n\n/* Dark theme custom state styles */\n/* Welcome modal styles */\n.cv-welcome-modal {\n max-width: 32rem;\n width: 90vw;\n background: white;\n border-radius: 0.75rem;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n animation: slideIn 0.2s ease;\n display: flex;\n flex-direction: column;\n}\n\n.cv-modal-main {\n padding: 1rem;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n overflow-y: auto;\n max-height: calc(80vh - 8rem);\n}\n\n.cv-welcome-message {\n font-size: 0.875rem;\n color: rgba(0, 0, 0, 0.8);\n margin: 0;\n line-height: 1.4;\n text-align: center;\n}\n\n.cv-welcome-message a {\n color: #3e84f4;\n text-align: justify;\n text-decoration: none;\n}\n\n.cv-welcome-message a:hover {\n text-decoration: underline;\n}\n\n.cv-welcome-widget-preview {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n padding: 1rem;\n background: #f8f9fa;\n border-radius: 0.5rem;\n margin: 1rem 0;\n}\n\n.cv-welcome-widget-icon {\n width: 2rem;\n height: 2rem;\n background: rgba(62, 132, 244, 0.1);\n border-radius: 9999px;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: cv-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n color: #3e84f4;\n}\n\n.cv-welcome-widget-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgba(0, 0, 0, 0.8);\n margin: 0;\n}\n\n.cv-welcome-got-it {\n width: 100%;\n background: #3e84f4;\n color: white;\n font-weight: 600;\n padding: 0.75rem 1rem;\n border-radius: 0.5rem;\n border: none;\n cursor: pointer;\n font-size: 0.875rem;\n transition: background-color 0.2s ease;\n outline: none;\n}\n\n.cv-welcome-got-it:hover {\n background: rgba(62, 132, 244, 0.9);\n}\n\n.cv-welcome-got-it:focus {\n box-shadow: 0 0 0 2px rgba(62, 132, 244, 0.5);\n}\n\n/* Animations */\n@keyframes cv-pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n/* Dark theme welcome modal styles */\n.cv-widget-theme-dark .cv-welcome-modal {\n background: #101722;\n}\n\n.cv-widget-theme-dark .cv-welcome-message {\n color: rgba(255, 255, 255, 0.8);\n}\n\n.cv-widget-theme-dark .cv-welcome-message a {\n color: #60a5fa;\n}\n\n.cv-widget-theme-dark .cv-welcome-widget-preview {\n background: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-welcome-widget-label {\n color: #e2e8f0;\n}\n\n/* Dark theme logo box */\n.cv-widget-theme-dark .cv-tabgroup-logo-box {\n background: rgba(255, 255, 255, 0.1);\n}\n\n/* Spinning animation for reset button icon */\n@keyframes cv-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(-360deg);\n }\n}\n\n.cv-spinning {\n animation: cv-spin 0.6s ease-in-out;\n}\n\n/* Hide widget icon in print view */\n@media print {\n .cv-widget-icon {\n display: none !important;\n }\n}\n/* Widget Modal Tabs */\n.cv-modal-tabs {\n display: flex;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n margin-bottom: 0.5rem;\n}\n\n.cv-tab-content > .cv-content-section + .cv-content-section {\n margin-top: 1.5rem;\n}\n\n.cv-modal-tab {\n padding: 0.75rem 1.5rem;\n font-size: 0.875rem;\n font-weight: 500;\n color: rgba(0, 0, 0, 0.6);\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.cv-modal-tab:hover {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.cv-modal-tab.active {\n color: #3e84f4;\n border-bottom-color: #3e84f4;\n}\n\n.cv-tab-content {\n display: none;\n animation: fadeIn 0.3s ease;\n}\n\n.cv-tab-content.active {\n display: block;\n}\n\n/* Share Tab Content */\n.cv-share-content {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem 0;\n align-items: center;\n text-align: center;\n}\n\n.cv-share-instruction {\n font-size: 0.9rem;\n color: rgba(0, 0, 0, 0.7);\n margin-bottom: 1rem;\n}\n\n.cv-share-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n width: 100%;\n padding: 12px 16px;\n background: white;\n color: #333;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.9rem;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n.cv-share-action-btn:hover {\n background: #f8f9fa;\n border-color: rgba(0, 0, 0, 0.25);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n}\n\n.cv-share-action-btn.primary {\n background: #3e84f4;\n color: white;\n border-color: #3e84f4;\n}\n\n.cv-share-action-btn.primary:hover {\n background: #2b74e6;\n border-color: #2b74e6;\n}\n\n.cv-done-btn {\n padding: 0.375rem 1rem;\n background: #3e84f4;\n color: white;\n border: none;\n border-radius: 0.5rem;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.cv-done-btn:hover {\n background: #2b74e6;\n}\n\n/* Dark Theme Adjustments */\n.cv-widget-theme-dark .cv-modal-tabs {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.cv-widget-theme-dark .cv-modal-tab {\n color: rgba(255, 255, 255, 0.6);\n}\n\n.cv-widget-theme-dark .cv-modal-tab:hover {\n color: rgba(255, 255, 255, 0.9);\n}\n\n.cv-widget-theme-dark .cv-modal-tab.active {\n color: #60a5fa;\n border-bottom-color: #60a5fa;\n}\n\n.cv-widget-theme-dark .cv-share-instruction {\n color: rgba(255, 255, 255, 0.7);\n}\n\n.cv-widget-theme-dark .cv-share-action-btn {\n background: #1a202c;\n color: white;\n border-color: rgba(255, 255, 255, 0.15);\n}\n\n.cv-widget-theme-dark .cv-share-action-btn:hover {\n background: #2d3748;\n}\n\n.cv-widget-theme-dark .cv-share-action-btn.primary {\n background: #3e84f4;\n border-color: #3e84f4;\n}\n\n.cv-widget-theme-dark .cv-share-action-btn.primary:hover {\n background: #2b74e6;\n}\n`;\n\n/**\n * Inject widget styles into the document head\n */\nexport function injectWidgetStyles(): void {\n // Check if styles are already injected\n if (document.querySelector('#cv-widget-styles')) return;\n\n const style = document.createElement('style');\n style.id = 'cv-widget-styles';\n style.textContent = WIDGET_STYLES;\n document.head.appendChild(style);\n}\n","import { injectWidgetStyles } from \"../styles/widget-styles\";\nimport type { CustomViewsCore } from \"./core\";\nimport type { State } from \"../types/types\";\nimport { URLStateManager } from \"./url-state-manager\";\n\nimport { TabManager } from \"./tab-manager\";\nimport { getGearIcon, getCloseIcon, getResetIcon, getCopyIcon, getTickIcon, getNavHeadingOnIcon, getNavHeadingOffIcon, getNavDashed, getShareIcon, getGitHubIcon } from \"../utils/icons\";\n\nexport interface WidgetOptions {\n /** The CustomViews core instance to control */\n core: CustomViewsCore;\n\n /** Container element where the widget should be rendered */\n container?: HTMLElement;\n\n /** Widget position: 'top-right', 'top-left', 'bottom-right', 'bottom-left', 'middle-left', 'middle-right' */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'middle-left' | 'middle-right';\n\n /** Widget theme: 'light' or 'dark' */\n theme?: 'light' | 'dark';\n\n /** Whether to show reset button */\n showReset?: boolean;\n\n /** Widget title */\n title?: string;\n\n /** Widget description text */\n description?: string;\n\n /** Whether to show welcome modal on first visit */\n showWelcome?: boolean;\n\n /** Welcome modal title (only used if showWelcome is true) */\n welcomeTitle?: string;\n\n /** Welcome modal message (only used if showWelcome is true) */\n welcomeMessage?: string;\n\n /** Whether to show tab groups section in widget (default: true) */\n showTabGroups?: boolean;\n}\n\nexport class CustomViewsWidget {\n private core: CustomViewsCore;\n private container: HTMLElement;\n private widgetIcon: HTMLElement | null = null;\n private options: Required<WidgetOptions>;\n private _hasVisibleConfig = false;\n private pageToggleIds: Set<string> = new Set();\n private pageTabIds: Set<string> = new Set();\n private currentTab: 'customize' | 'share' = 'customize';\n\n // Modal state\n private stateModal: HTMLElement | null = null;\n\n\n constructor(options: WidgetOptions) {\n this.core = options.core;\n this.container = options.container || document.body;\n\n // Set defaults\n this.options = {\n core: options.core,\n container: this.container,\n position: options.position || 'middle-left',\n theme: options.theme || 'light',\n showReset: options.showReset ?? true,\n title: options.title || 'Customize View',\n description: options.description || '',\n showWelcome: options.showWelcome ?? false,\n welcomeTitle: options.welcomeTitle || 'Site Customization',\n welcomeMessage: options.welcomeMessage || 'This site is powered by Custom Views. Use the widget on the side (⚙) to customize your experience. Your preferences will be saved and can be shared via URL.<br><br>Learn more at <a href=\"https://github.com/customviews-js/customviews\" target=\"_blank\">customviews GitHub</a>.',\n showTabGroups: options.showTabGroups ?? true\n };\n\n // Determine if there are any configurations to show\n const config = this.core.getConfig();\n const allToggles = config?.toggles || [];\n const visibleToggles = allToggles.filter(toggle => {\n if (toggle.isLocal) {\n return !!document.querySelector(`[data-cv-toggle=\"${toggle.id}\"], [data-cv-toggle-group-id=\"${toggle.id}\"]`);\n }\n return true;\n });\n\n const allTabGroups = this.core.getTabGroups() || [];\n const visibleTabGroups = allTabGroups.filter(group => {\n if (group.isLocal) {\n return !!document.querySelector(`cv-tabgroup[id=\"${group.id}\"]`);\n }\n return true;\n });\n\n if (visibleToggles.length > 0 || (this.options.showTabGroups && visibleTabGroups.length > 0)) {\n this._hasVisibleConfig = true;\n }\n\n // Scan for page-declared local components and cache them\n // Do this on initialization to avoid querying DOM repeatedly\n const pageTogglesAttr = document.querySelector('[data-cv-page-local-toggles]')?.getAttribute('data-cv-page-local-toggles') || '';\n this.pageToggleIds = new Set(pageTogglesAttr.split(',').map(id => id.trim()).filter(id => id));\n\n const pageTabsAttr = document.querySelector('[data-cv-page-local-tabs]')?.getAttribute('data-cv-page-local-tabs') || '';\n this.pageTabIds = new Set(pageTabsAttr.split(',').map(id => id.trim()).filter(id => id));\n\n }\n\n /**\n * Render the widget modal icon\n * \n * Does not render if there are no visible toggles or tab groups.\n */\n public renderModalIcon(): HTMLElement | undefined {\n if (!this._hasVisibleConfig) {\n return;\n }\n\n this.widgetIcon = this.createWidgetIcon();\n this.attachEventListeners();\n\n // Always append to body since it's a floating icon\n document.body.appendChild(this.widgetIcon);\n\n // Show welcome modal on first visit if enabled\n if (this.options.showWelcome) {\n this.showWelcomeModalIfFirstVisit();\n }\n\n return this.widgetIcon;\n }\n\n /**\n * Create the simple widget icon\n */\n private createWidgetIcon(): HTMLElement {\n const icon = document.createElement('div');\n icon.className = `cv-widget-icon cv-widget-${this.options.position}`;\n icon.innerHTML = '⚙';\n icon.title = this.options.title;\n icon.setAttribute('aria-label', 'Open Custom Views');\n\n // Add styles\n injectWidgetStyles();\n\n return icon;\n }\n\n /**\n * Remove the widget from DOM\n */\n public destroy(): void {\n if (this.widgetIcon) {\n this.widgetIcon.remove();\n this.widgetIcon = null;\n }\n\n // Clean up modal\n if (this.stateModal) {\n this.stateModal.remove();\n this.stateModal = null;\n }\n }\n\n private attachEventListeners(): void {\n if (!this.widgetIcon) return;\n\n // Click to open customization modal directly\n this.widgetIcon.addEventListener('click', () => this.openStateModal());\n }\n\n /**\n * Close the modal\n */\n private closeModal(): void {\n if (this.stateModal) {\n this.stateModal.classList.add('cv-hidden');\n }\n }\n\n /**\n * Open the custom state creator\n */\n private openStateModal(): void {\n if (!this.stateModal) {\n this._createStateModal();\n }\n this._updateStateModalContent();\n this.stateModal!.classList.remove('cv-hidden');\n }\n\n /**\n * Create the custom state creator modal shell and attach listeners\n */\n private _createStateModal(): void {\n this.stateModal = document.createElement('div');\n this.stateModal.className = 'cv-widget-modal-overlay cv-hidden';\n this.applyThemeToModal();\n\n document.body.appendChild(this.stateModal);\n this._attachStateModalFrameEventListeners();\n }\n\n /**\n * Update the content of the state modal\n */\n private _updateStateModalContent(): void {\n if (!this.stateModal) return;\n\n const pageToggleIds = this.pageToggleIds;\n const pageTabIds = this.pageTabIds;\n\n // Get toggles from current configuration\n const config = this.core.getConfig();\n const allToggles = config?.toggles || [];\n\n // Filter toggles to only include global and visible/declared local toggles\n const visibleToggles = allToggles.filter(toggle => {\n if (toggle.isLocal) {\n return pageToggleIds.has(toggle.id) || !!document.querySelector(`[data-cv-toggle=\"${toggle.id}\"], [data-cv-toggle-group-id=\"${toggle.id}\"]`);\n }\n return true; // Keep global toggles\n });\n\n const toggleControlsHtml = visibleToggles.map(toggle => `\n <div class=\"cv-toggle-card\">\n <div class=\"cv-toggle-content\">\n <div>\n <p class=\"cv-toggle-title\">${toggle.label || toggle.id}</p>\n </div>\n <div class=\"cv-toggle-radios\">\n <label class=\"cv-radio-label\" title=\"Hide\">\n <input class=\"cv-toggle-input\" type=\"radio\" name=\"cv-toggle-${toggle.id}\" value=\"hide\" data-toggle=\"${toggle.id}\"/>\n <span>Hide</span>\n </label>\n <label class=\"cv-radio-label\" title=\"Peek\">\n <input class=\"cv-toggle-input\" type=\"radio\" name=\"cv-toggle-${toggle.id}\" value=\"peek\" data-toggle=\"${toggle.id}\"/>\n <span>Peek</span>\n </label>\n <label class=\"cv-radio-label\" title=\"Show\">\n <input class=\"cv-toggle-input\" type=\"radio\" name=\"cv-toggle-${toggle.id}\" value=\"show\" data-toggle=\"${toggle.id}\"/>\n <span>Show</span>\n </label>\n </div>\n </div>\n </div>\n `).join('');\n\n // Get tab groups\n const allTabGroups = this.core.getTabGroups() || [];\n const tabGroups = allTabGroups.filter(group => {\n if (group.isLocal) {\n return pageTabIds.has(group.id) || !!document.querySelector(`cv-tabgroup[id=\"${group.id}\"]`);\n }\n return true; // Keep global tab groups\n });\n\n let tabGroupControlsHTML = '';\n if (this.options.showTabGroups && tabGroups && tabGroups.length > 0) {\n const initialNavsVisible = TabManager.areNavsVisible(document.body);\n\n tabGroupControlsHTML = `\n <div class=\"cv-tabgroup-card cv-tabgroup-header\">\n <div class=\"cv-tabgroup-row\">\n <div class=\"cv-tabgroup-logo-box\" id=\"cv-nav-icon-box\">\n <div class=\"cv-nav-icon\" id=\"cv-nav-icon\">${initialNavsVisible ? getNavHeadingOnIcon() : getNavHeadingOffIcon()}</div>\n </div>\n <div class=\"cv-tabgroup-info\">\n <div class=\"cv-tabgroup-title-container\">\n <p class=\"cv-tabgroup-title\">Show only the selected tab</p>\n </div>\n <p class=\"cv-tabgroup-description\">Hide the navigation headers</p>\n </div>\n <label class=\"cv-toggle-switch cv-nav-toggle\">\n <input class=\"cv-nav-pref-input\" type=\"checkbox\" ${initialNavsVisible ? '' : 'checked'} aria-label=\"Show only the selected tab\" />\n <span class=\"cv-switch-bg\"></span>\n <span class=\"cv-switch-knob\"></span>\n </label>\n </div>\n </div>\n <div class=\"cv-tab-groups-list\">\n ${tabGroups.map(group => `\n <div class=\"cv-tabgroup-card cv-tabgroup-item\">\n <label class=\"cv-tabgroup-label\" for=\"tab-group-${group.id}\">\n ${group.label || group.id}\n </label>\n <select id=\"tab-group-${group.id}\" class=\"cv-tabgroup-select\" data-group-id=\"${group.id}\">\n ${group.tabs.map(tab => `<option value=\"${tab.id}\">${tab.label || tab.id}</option>`).join('')}\n </select>\n </div>\n `).join('')}\n </div>\n `;\n }\n\n this.stateModal.innerHTML = `\n <div class=\"cv-widget-modal cv-custom-state-modal\">\n <header class=\"cv-modal-header\">\n <div class=\"cv-modal-header-content\">\n <div class=\"cv-modal-icon\">\n ${getGearIcon()}\n </div>\n <div class=\"cv-modal-title\">${this.options.title}</div>\n </div>\n <button class=\"cv-modal-close\" aria-label=\"Close modal\">\n ${getCloseIcon()}\n </button>\n </header>\n <main class=\"cv-modal-main\">\n ${this.options.description ? `<p class=\"cv-modal-description\">${this.options.description}</p>` : ''}\n \n <div class=\"cv-modal-tabs\">\n <button class=\"cv-modal-tab ${this.currentTab === 'customize' ? 'active' : ''}\" data-tab=\"customize\">Customize</button>\n <button class=\"cv-modal-tab ${this.currentTab === 'share' ? 'active' : ''}\" data-tab=\"share\">Share</button>\n </div>\n\n <div class=\"cv-tab-content ${this.currentTab === 'customize' ? 'active' : ''}\" data-content=\"customize\">\n ${visibleToggles.length ? `\n <div class=\"cv-content-section\">\n <div class=\"cv-section-heading\">Toggles</div>\n <div class=\"cv-toggles-container\">\n ${toggleControlsHtml}\n </div>\n </div>\n ` : ''}\n \n ${this.options.showTabGroups && tabGroups && tabGroups.length > 0 ? `\n <div class=\"cv-content-section\">\n <div class=\"cv-section-heading\">Tab Groups</div>\n <div class=\"cv-tabgroups-container\">\n ${tabGroupControlsHTML}\n </div>\n </div>\n ` : ''}\n </div>\n\n <div class=\"cv-tab-content ${this.currentTab === 'share' ? 'active' : ''}\" data-content=\"share\">\n <div class=\"cv-share-content\">\n <div class=\"cv-share-instruction\">\n Create a shareable link for your current customization, or select specific parts of the page to share.\n </div>\n \n <button class=\"cv-share-action-btn primary cv-start-share-btn\">\n <span class=\"cv-btn-icon\">${getShareIcon()}</span>\n <span>Select elements to share</span>\n </button>\n \n <button class=\"cv-share-action-btn cv-copy-url-btn\">\n <span class=\"cv-btn-icon\">${getCopyIcon()}</span>\n <span>Copy Shareable URL of Settings</span>\n </button>\n </div>\n </div>\n </main>\n\n <footer class=\"cv-modal-footer\">\n ${this.options.showReset ? `\n <button class=\"cv-reset-btn\" title=\"Reset to Default\">\n <span class=\"cv-reset-btn-icon\">${getResetIcon()}</span>\n <span>Reset</span>\n </button>\n ` : '<div></div>'}\n \n <a href=\"https://github.com/customviews-js/customviews\" target=\"_blank\" class=\"cv-footer-link\">\n ${getGitHubIcon()}\n <span>View on GitHub</span>\n </a>\n\n <button class=\"cv-done-btn\">Done</button>\n </footer>\n </div>\n `;\n\n this._attachStateModalContentEventListeners();\n this.loadCurrentStateIntoForm();\n }\n\n /**\n * Attach event listeners for the modal frame (delegated events)\n */\n private _attachStateModalFrameEventListeners(): void {\n if (!this.stateModal) return;\n\n // Delegated click events\n this.stateModal.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n\n // Close button\n if (target.closest('.cv-modal-close')) {\n this.closeModal();\n return;\n }\n\n\n // Reset to default button\n if (target.closest('.cv-reset-btn')) {\n const resetBtn = target.closest('.cv-reset-btn');\n const resetIcon = resetBtn?.querySelector('.cv-reset-btn-icon');\n if (resetIcon) {\n resetIcon.classList.add('cv-spinning');\n }\n\n this.core.resetToDefault();\n this.loadCurrentStateIntoForm();\n\n setTimeout(() => {\n if (resetIcon) {\n resetIcon.classList.remove('cv-spinning');\n }\n }, 600);\n return;\n }\n\n // Done button\n if (target.closest('.cv-done-btn')) {\n this.closeModal();\n return;\n }\n\n // Overlay click to close\n if (e.target === this.stateModal) {\n this.closeModal();\n }\n });\n\n // Escape key to close\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.closeModal();\n }\n };\n // We can't remove this listener easily if it's anonymous, so we attach it to the document\n // and it will stay for the lifetime of the widget. This is acceptable.\n document.addEventListener('keydown', handleEscape);\n }\n\n /**\n * Attach event listeners for custom state creator's dynamic content\n */\n private _attachStateModalContentEventListeners(): void {\n if (!this.stateModal) return;\n\n // Listen to toggle switches\n const toggleInputs = this.stateModal.querySelectorAll('.cv-toggle-input') as NodeListOf<HTMLInputElement>;\n toggleInputs.forEach(toggleInput => {\n toggleInput.addEventListener('change', () => {\n const state = this.getCurrentCustomStateFromModal();\n this.core.applyState(state, { source: 'widget' });\n });\n });\n\n // Listen to tab group selects\n const tabGroupSelects = this.stateModal.querySelectorAll('.cv-tabgroup-select') as NodeListOf<HTMLSelectElement>;\n tabGroupSelects.forEach(select => {\n select.addEventListener('change', () => {\n const groupId = select.dataset.groupId;\n const tabId = select.value;\n if (groupId && tabId) {\n const currentTabs = this.core.getCurrentActiveTabs();\n currentTabs[groupId] = tabId;\n\n\n const currentState = this.core.getCurrentState();\n\n const newState: State = {\n shownToggles: currentState.shownToggles || [],\n peekToggles: currentState.peekToggles || [], // Preserve peek state, fallback to empty array\n tabs: currentTabs,\n };\n this.core.applyState(newState, { source: 'widget' });\n }\n });\n });\n\n // Listener for show/hide tab navs\n const tabNavToggle = this.stateModal.querySelector('.cv-nav-pref-input') as HTMLInputElement | null;\n const navIcon = this.stateModal?.querySelector('#cv-nav-icon');\n const navHeaderCard = this.stateModal?.querySelector('.cv-tabgroup-card.cv-tabgroup-header') as HTMLElement | null;\n\n if (tabNavToggle && navIcon && navHeaderCard) {\n const updateIcon = (isVisible: boolean, isHovering: boolean = false) => {\n if (isHovering) {\n navIcon.innerHTML = getNavDashed();\n } else {\n navIcon.innerHTML = isVisible ? getNavHeadingOnIcon() : getNavHeadingOffIcon();\n }\n };\n\n navHeaderCard.addEventListener('mouseenter', () => updateIcon(!tabNavToggle.checked, true));\n navHeaderCard.addEventListener('mouseleave', () => updateIcon(!tabNavToggle.checked, false));\n\n tabNavToggle.addEventListener('change', () => {\n const visible = !tabNavToggle.checked;\n updateIcon(visible, false);\n this.core.persistTabNavVisibility(visible);\n try {\n TabManager.setNavsVisibility(document.body, visible);\n } catch (e) {\n console.error('Failed to set tab nav visibility:', e);\n }\n });\n }\n\n // Tab switching\n const tabs = this.stateModal.querySelectorAll('.cv-modal-tab');\n tabs.forEach(tab => {\n tab.addEventListener('click', () => {\n const tabId = (tab as HTMLElement).dataset.tab;\n if (tabId === 'customize' || tabId === 'share') {\n this.currentTab = tabId;\n\n // Update UI without full re-render\n tabs.forEach(t => t.classList.remove('active'));\n tab.classList.add('active');\n\n const contents = this.stateModal?.querySelectorAll('.cv-tab-content');\n contents?.forEach(c => {\n c.classList.remove('active');\n if ((c as HTMLElement).dataset.content === tabId) {\n c.classList.add('active');\n }\n });\n }\n });\n });\n\n // Share buttons (inside content)\n const startShareBtn = this.stateModal.querySelector('.cv-start-share-btn');\n if (startShareBtn) {\n startShareBtn.addEventListener('click', () => {\n this.closeModal();\n this.core.toggleShareMode();\n });\n }\n\n const copyUrlBtn = this.stateModal.querySelector('.cv-copy-url-btn');\n if (copyUrlBtn) {\n copyUrlBtn.addEventListener('click', () => {\n this.copyShareableURL();\n const iconContainer = copyUrlBtn.querySelector('.cv-btn-icon');\n if (iconContainer) {\n const originalIcon = iconContainer.innerHTML;\n iconContainer.innerHTML = getTickIcon();\n setTimeout(() => {\n iconContainer.innerHTML = originalIcon;\n }, 2000);\n }\n });\n }\n }\n\n /**\n * Apply theme class to the modal overlay based on options\n */\n private applyThemeToModal(): void {\n if (!this.stateModal) return;\n if (this.options.theme === 'dark') {\n this.stateModal.classList.add('cv-widget-theme-dark');\n } else {\n this.stateModal.classList.remove('cv-widget-theme-dark');\n }\n }\n\n\n /**\n * Get current state from form values\n */\n private getCurrentCustomStateFromModal(): State {\n if (!this.stateModal) {\n return {};\n }\n\n // Collect toggle values\n const toggles: string[] = [];\n const peekToggles: string[] = [];\n\n // Get all radio inputs\n const radios = this.stateModal.querySelectorAll('input[type=\"radio\"]:checked');\n radios.forEach(radio => {\n const input = radio as HTMLInputElement;\n const toggleId = input.getAttribute('data-toggle');\n if (toggleId) {\n if (input.value === 'show') {\n toggles.push(toggleId);\n } else if (input.value === 'peek') {\n peekToggles.push(toggleId);\n }\n }\n });\n\n const result: State = { shownToggles: toggles, peekToggles };\n\n // Get active tabs from selects\n const selects = this.stateModal.querySelectorAll('select[data-group-id]');\n if (selects.length > 0) {\n result.tabs = {};\n selects.forEach(select => {\n const el = select as HTMLSelectElement;\n const groupId = el.getAttribute('data-group-id');\n if (groupId) {\n result.tabs![groupId] = el.value;\n }\n });\n }\n\n return result;\n }\n\n /**\n * Copy shareable URL to clipboard\n */\n private copyShareableURL(): void {\n const customState = this.getCurrentCustomStateFromModal();\n const url = URLStateManager.generateShareableURL(customState);\n\n navigator.clipboard.writeText(url).then(() => {\n console.log('Shareable URL copied to clipboard!');\n }).catch(() => { console.error('Failed to copy URL!'); });\n }\n\n /**\n * Load current state into form based on currently active toggles\n */\n private loadCurrentStateIntoForm(): void {\n if (!this.stateModal) return;\n\n // We need complete state for both shown and peek toggles\n const currentState = this.core.getCurrentState();\n const currentToggles = currentState.shownToggles || [];\n const currentPeekToggles = currentState.peekToggles || [];\n\n // Reset all inputs first (optional, but good for clarity)\n const allToggleInputs = this.stateModal.querySelectorAll('.cv-toggle-input') as NodeListOf<HTMLInputElement>;\n\n // Identify unique toggles present in the modal\n const uniqueToggles = new Set<string>();\n allToggleInputs.forEach(input => {\n if (input.dataset.toggle) uniqueToggles.add(input.dataset.toggle);\n });\n\n uniqueToggles.forEach(toggleId => {\n let valueToSelect = 'hide';\n if (currentToggles.includes(toggleId)) {\n valueToSelect = 'show';\n } else if (currentPeekToggles.includes(toggleId)) {\n valueToSelect = 'peek';\n }\n\n const input = this.stateModal!.querySelector(`input[name=\"cv-toggle-${toggleId}\"][value=\"${valueToSelect}\"]`) as HTMLInputElement;\n if (input) {\n input.checked = true;\n }\n });\n\n // Load tab group selections\n const activeTabs = this.core.getCurrentActiveTabs();\n const tabGroupSelects = this.stateModal.querySelectorAll('.cv-tabgroup-select') as NodeListOf<HTMLSelectElement>;\n tabGroupSelects.forEach(select => {\n const groupId = select.dataset.groupId;\n if (groupId && activeTabs[groupId]) {\n select.value = activeTabs[groupId];\n }\n });\n\n // Load tab nav visibility preference\n const navPref = ((): boolean => {\n const persisted = this.core.getPersistedTabNavVisibility();\n if (persisted !== null) {\n return persisted;\n }\n return TabManager.areNavsVisible(document.body);\n })();\n const tabNavToggle = this.stateModal.querySelector('.cv-nav-pref-input') as HTMLInputElement | null;\n const navIcon = this.stateModal?.querySelector('#cv-nav-icon');\n if (tabNavToggle) {\n tabNavToggle.checked = !navPref;\n // Ensure UI matches actual visibility\n TabManager.setNavsVisibility(document.body, navPref);\n\n // Update the nav icon to reflect the current state\n if (navIcon) {\n navIcon.innerHTML = navPref ? getNavHeadingOnIcon() : getNavHeadingOffIcon();\n }\n }\n }\n\n /**\n * Check if this is the first visit and show welcome modal\n */\n private showWelcomeModalIfFirstVisit(): void {\n if (!this._hasVisibleConfig) return;\n\n const STORAGE_KEY = 'cv-welcome-shown';\n\n // Check if welcome has been shown before\n const hasSeenWelcome = localStorage.getItem(STORAGE_KEY);\n\n if (!hasSeenWelcome) {\n // Show welcome modal after a short delay to let the page settle\n setTimeout(() => {\n this.createWelcomeModal();\n }, 500);\n\n // Mark as shown\n localStorage.setItem(STORAGE_KEY, 'true');\n }\n }\n\n /**\n * Create and show the welcome modal\n */\n private createWelcomeModal(): void {\n // Don't show if there's already a modal open\n if (this.stateModal && !this.stateModal.classList.contains('cv-hidden')) return;\n\n const welcomeModal = document.createElement('div');\n welcomeModal.className = 'cv-widget-modal-overlay cv-welcome-modal-overlay';\n if (this.options.theme === 'dark') {\n welcomeModal.classList.add('cv-widget-theme-dark');\n }\n\n welcomeModal.innerHTML = `\n <div class=\"cv-widget-modal cv-welcome-modal\">\n <header class=\"cv-modal-header\">\n <div class=\"cv-modal-header-content\">\n <div class=\"cv-modal-icon\">\n ${getGearIcon()}\n </div>\n <h1 class=\"cv-modal-title\">${this.options.welcomeTitle}</h1>\n </div>\n </header>\n <div class=\"cv-modal-main\">\n <p class=\"cv-welcome-message\">${this.options.welcomeMessage}</p>\n \n <div class=\"cv-welcome-widget-preview\">\n <div class=\"cv-welcome-widget-icon\">\n ${getGearIcon()}\n </div>\n <p class=\"cv-welcome-widget-label\">Look for this widget</p>\n </div>\n \n <button class=\"cv-welcome-got-it\">Got it!</button>\n </div>\n </div>\n `;\n\n document.body.appendChild(welcomeModal);\n this.attachWelcomeModalEventListeners(welcomeModal);\n }\n\n /**\n * Attach event listeners for welcome modal\n */\n private attachWelcomeModalEventListeners(welcomeModal: HTMLElement): void {\n const closeModal = () => {\n welcomeModal.remove();\n document.removeEventListener('keydown', handleEscape);\n };\n\n // Got it button\n const gotItBtn = welcomeModal.querySelector('.cv-welcome-got-it');\n if (gotItBtn) {\n gotItBtn.addEventListener('click', closeModal);\n }\n\n // Overlay click to close\n welcomeModal.addEventListener('click', (e) => {\n if (e.target === welcomeModal) {\n closeModal();\n }\n });\n\n // Escape key to close\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeModal();\n }\n };\n document.addEventListener('keydown', handleEscape);\n }\n\n\n}\n","import { CustomViews } from \"../lib/custom-views\";\nimport { CustomViewsWidget } from \"../core/widget\";\nimport { prependBaseUrl } from \"../utils/url-utils\";\n\n/**\n * Initialize CustomViews from script tag attributes and config file\n * This function handles the automatic initialization of CustomViews when included via script tag\n * \n * Data attributes supported:\n * - data-base-url: Base URL for the site (e.g., \"/customviews\" for subdirectory deployments)\n * - data-config-path: Path to config file (default: \"/customviews.config.json\")\n * \n * The function fetches the config file and uses it directly to initialize CustomViews.\n * Widget visibility is controlled via the config file (widget.enabled property).\n */\nexport default function initializeFromScript(): void {\n // Only run in browser environment\n if (typeof window === 'undefined') return;\n\n // Use the typed global `window` (see src/types/global.d.ts)\n // Idempotency guard: if already initialized, skip setting up listener again.\n if (window.__customViewsInitialized) {\n // Informational for developers; harmless in production.\n console.info('[CustomViews] Auto-init skipped: already initialized.');\n return;\n }\n\n document.addEventListener('DOMContentLoaded', async function() {\n // Prevent concurrent initialization runs (race conditions when script is loaded twice)\n if (window.__customViewsInitInProgress || window.__customViewsInitialized) {\n return;\n }\n window.__customViewsInitInProgress = true;\n \n try {\n // Find the script tag that loaded this script\n let scriptTag = document.currentScript as HTMLScriptElement | null;\n\n if (!scriptTag || !scriptTag.hasAttribute('data-base-url')) {\n const dataAttrMatch = document.querySelector('script[data-base-url]') as HTMLScriptElement | null;\n if (dataAttrMatch) {\n scriptTag = dataAttrMatch;\n } else {\n for (const script of document.scripts) {\n const src = script.src || '';\n if (/(?:custom[-_]views|@customviews-js\\/customviews)(?:\\.min)?\\.(?:esm\\.)?js($|\\?)/i.test(src)) {\n scriptTag = script as HTMLScriptElement;\n break;\n }\n }\n }\n }\n\n // Read data attributes from script tag\n let baseURL = '';\n let configPath = '/customviews.config.json';\n\n if (scriptTag) {\n baseURL = scriptTag.getAttribute('data-base-url') || '';\n configPath = scriptTag.getAttribute('data-config-path') || configPath;\n }\n\n // Fetch config file\n let configFile;\n try {\n const fullConfigPath = prependBaseUrl(configPath, baseURL);\n console.log(`[CustomViews] Loading config from: ${fullConfigPath}`);\n \n const response = await fetch(fullConfigPath);\n \n if (!response.ok) {\n console.warn(`[CustomViews] Config file not found at ${fullConfigPath}. Using defaults.`);\n // Provide minimal default config structure\n configFile = { \n config: { toggles: [], defaultState: {}},\n widget: { enabled: true }\n };\n } else {\n configFile = await response.json();\n console.log('[CustomViews] Config loaded successfully');\n }\n } catch (error) {\n console.error('[CustomViews] Error loading config file:', error);\n return; // Abort initialization\n }\n\n // Determine effective baseURL (data attribute takes precedence over config)\n const effectiveBaseURL = baseURL || configFile.baseURL || '';\n\n const options: any = {\n config: configFile.config,\n assetsJsonPath: configFile.assetsJsonPath,\n baseURL: effectiveBaseURL,\n }\n\n if (configFile.showUrl !== undefined) {\n options.showUrl = configFile.showUrl;\n }\n\n // Initialize CustomViews core\n const core = await CustomViews.init(options);\n\n if (!core) {\n console.error('[CustomViews] Failed to initialize core.');\n return; // Abort widget creation\n }\n\n // Store instance\n window.customViewsInstance = { core };\n\n // Initialize widget if enabled in config\n let widget;\n if (configFile.widget?.enabled !== false) {\n widget = new CustomViewsWidget({\n core,\n ...configFile.widget\n });\n widget.renderModalIcon();\n \n // Store widget instance\n window.customViewsInstance.widget = widget;\n console.log('[CustomViews] Widget initialized and rendered');\n } else {\n console.log('[CustomViews] Widget disabled in config - skipping initialization');\n }\n\n // Dispatch ready event\n const readyEvent = new CustomEvent('customviews:ready', {\n detail: {\n core,\n widget\n }\n });\n document.dispatchEvent(readyEvent);\n\n // Mark initialized and clear in-progress flag\n window.__customViewsInitialized = true;\n window.__customViewsInitInProgress = false;\n\n } catch (error) {\n // Clear in-progress flag so a future attempt can retry\n window.__customViewsInitInProgress = false;\n console.error('[CustomViews] Auto-initialization error:', error);\n }\n });\n}\n","// Import from new modules\nimport { CustomViews } from \"./lib/custom-views\";\nimport initializeFromScript from \"./entry/browser-entry\";\nimport { CustomViewsWidget } from \"./core/widget\";\n\n// Export public API\nexport { CustomViewsCore } from \"./core/core\";\nexport type { CustomViewsOptions } from \"./core/core\";\nexport { CustomViewsWidget } from \"./core/widget\";\nexport type { WidgetOptions } from \"./core/widget\";\nexport { CustomViews } from \"./lib/custom-views\";\nexport type { initOptions } from \"./lib/custom-views\";\nexport { PersistenceManager } from \"./core/persistence\";\nexport { URLStateManager } from \"./core/url-state-manager\";\nexport { AssetsManager } from \"./core/assets-manager\";\nexport type { Config } from \"./types/types\";\nexport type { ConfigFile } from \"./types/types\";\n\n// Set up globals and auto-initialization\nif (typeof window !== \"undefined\") {\n // Expose to window to enable usage (e.g. const app = new window.CustomViews(...))\n window.CustomViews = CustomViews;\n window.CustomViewsWidget = CustomViewsWidget;\n \n // Run auto-initialization\n initializeFromScript();\n}"],"names":["TABGROUP_SELECTOR"],"mappings":"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"}
|