From 168e41858df38f12ba27513dd5713e0fea14cf71 Mon Sep 17 00:00:00 2001 From: docvars Date: Thu, 13 Nov 2025 18:39:33 -0600 Subject: [PATCH 1/5] working left navbar --- assets/css/style.css | 179 ++++++++++ includes/common/class-path-pilot-shared.php | 66 ++-- scripts/index.js | 352 +++++++++++++++----- 3 files changed, 486 insertions(+), 111 deletions(-) diff --git a/assets/css/style.css b/assets/css/style.css index 19a8663..b0a6237 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -455,3 +455,182 @@ body .pp-drawer a:not(.pp-footer-link):active { margin-bottom: 12px; } + +/* ====================== + New Left Sidebar UI + ====================== */ +.pp-sidebar { + position: fixed; + top: 0; + left: 0; + height: 100vh; + width: 48px; /* collapsed width */ + background: #212426; + color: var(--pp-white, #fff); + z-index: 9999; + display: flex; + flex-direction: row; + align-items: stretch; + font-family: "DM Sans", sans-serif !important; + overflow: hidden; + transition: + width 0.38s cubic-bezier(.25, .8, .25, 1), + box-shadow 0.38s cubic-bezier(.25, .8, .25, 1); +} +.pp-sidebar.expanded { + width: 368px; /* 48 nav + 320 panel */ +} +.pp-sidebar.collapsed { + width: 48px; +} +.pp-sidebar-inner { + width: 48px; + display: flex; + flex-direction: column; + align-items: center; + padding: 8px 0; + gap: 4px; + background: #212426; + flex-shrink: 0; +} +.pp-sidebar-brand { + width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-size: 1.2rem; + background: transparent; + border: none; + padding: 0; + margin: 0; + cursor: pointer; + appearance: none; +} +.pp-sidebar-nav { + display: flex; + flex-direction: column; + width: 100%; + gap: 2px; +} +.pp-sidebar-nav .pp-nav-btn { + width: 48px; + height: 44px; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + background: transparent; + border: none; + color: #878888; /* default icon/text color */ + cursor: pointer; + transition: background 0.15s ease, color 0.15s ease; + text-align: left; + position: relative; /* for active indicator */ +} +.pp-sidebar-nav .pp-nav-btn i { + font-size: 1.1rem; + color: inherit; +} +.pp-sidebar-nav .pp-nav-btn svg.pp-icon { + width: 20px; + height: 20px; + flex-shrink: 0; +} +.pp-sidebar-nav .pp-nav-btn span { + display: none; + font-size: 0.92rem; + color: inherit; +} +.pp-sidebar-nav .pp-nav-btn:hover { + color: #ffffff; +} +.pp-sidebar-nav .pp-nav-btn.is-active { + color: #ffffff; +} + +/* Active tab indicator strip on the left */ +.pp-sidebar-nav .pp-nav-btn::before { + content: ''; + position: absolute; + left: 0; + top: 8px; + bottom: 8px; + width: 2px; + border-radius: 2px; + background: transparent; +} +.pp-sidebar-nav .pp-nav-btn.is-active::before { + background: #ffffff; +} +.pp-sidebar-nav .pp-collapse { + margin-top: auto; +} +.pp-sidebar-content { + width: 320px; + background: #282a2c; + color: #fff; + padding: 12px 20px 0 20px; + height: 100vh; + overflow-y: auto; + position: relative; /* anchor panel close button */ + /* Start slightly hidden and slid under the rail */ + opacity: 0; + transform: translateX(-24px); + pointer-events: none; + transition: + opacity 0.38s cubic-bezier(.25, .8, .25, 1) 40ms, + transform 0.38s cubic-bezier(.25, .8, .25, 1) 40ms; +} +.pp-sidebar.expanded .pp-sidebar-content { + opacity: 1; + transform: translateX(0); + pointer-events: auto; +} + +/* Panel close button (top-right) */ +.pp-panel-close { + position: absolute; + top: 8px; + right: 8px; + width: 32px; + height: 32px; + border: none; + background: transparent; + color: #878888; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +} +.pp-panel-close svg.pp-icon { + width: 20px; + height: 20px; +} +.pp-panel-close:hover { + color: #ffffff; +} + +/* Push page content when sidebar is present / expanded */ +body.pp-sidebar-present { + margin-left: 48px !important; /* reserve space for collapsed rail (rail width) */ + transition: margin-left 0.38s cubic-bezier(.25,.8,.25,1); +} +body.pp-sidebar-open { + margin-left: 376px !important; /* rail + content panel */ + transition: margin-left 0.38s cubic-bezier(.25,.8,.25,1); +} + +@media (max-width: 600px) { + .pp-sidebar.expanded { + width: 100vw; + } + .pp-sidebar.expanded .pp-sidebar-content { + width: calc(100vw - 48px); + } + body.pp-sidebar-present, + body.pp-sidebar-open { + margin-left: 0 !important; + } +} \ No newline at end of file diff --git a/includes/common/class-path-pilot-shared.php b/includes/common/class-path-pilot-shared.php index f7d9c17..18b5a53 100644 --- a/includes/common/class-path-pilot-shared.php +++ b/includes/common/class-path-pilot-shared.php @@ -490,42 +490,38 @@ public static function enqueue_scripts() { ); Log::info('Path Pilot: wp_localize_script result = ' . ($localize_result ? 'success' : 'failed')); - // Conditionally enqueue UI/interactivity based on show_drawer setting - // If drawer is disabled, we skip the UI but keep tracking active - if ($show_drawer) { - Log::info('Path Pilot: Enqueuing index.js script...'); - $script_url = plugins_url('scripts/index.js', $main_plugin_file); - Log::info('Path Pilot: Script URL = ' . $script_url); - - wp_enqueue_script( - 'path-pilot-interactivity', - $script_url, - [], - PATH_PILOT_VERSION, - false // Load in header instead of footer - ); + // Always enqueue UI/interactivity; the script itself will respect the + // insights_only / show_drawer flags and no-op when the drawer is disabled. + Log::info('Path Pilot: Enqueuing index.js script...'); + $script_url = plugins_url('scripts/index.js', $main_plugin_file); + Log::info('Path Pilot: Script URL = ' . $script_url); - wp_localize_script( - 'path-pilot-interactivity', - 'PathPilotStatus', - [ - 'ready' => $ready, - 'dev_mode' => $dev_mode, - 'insights_only' => $insights_only, - 'show_drawer' => $show_drawer, - 'cta_text' => $cta_text, - 'recommend_label' => $recommend_label, - 'chat_label' => $chat_label, - 'is_pro' =>Path_Pilot::is_pro(), - 'has_valid_api_key' => $has_valid_api_key, - 'chat_enabled' => $chat_enabled, - 'icon_css_url' => plugins_url('assets/css/path-pilot-icons.css', $main_plugin_file), - 'nonce' => wp_create_nonce('wp_rest'), - ] - ); - } else { - Log::info('Path Pilot: Drawer disabled - skipping UI scripts but keeping tracking active'); - } + wp_enqueue_script( + 'path-pilot-interactivity', + $script_url, + [], + PATH_PILOT_VERSION, + false // Load in header instead of footer + ); + + wp_localize_script( + 'path-pilot-interactivity', + 'PathPilotStatus', + [ + 'ready' => $ready, + 'dev_mode' => $dev_mode, + 'insights_only' => $insights_only, + 'show_drawer' => $show_drawer, + 'cta_text' => $cta_text, + 'recommend_label' => $recommend_label, + 'chat_label' => $chat_label, + 'is_pro' =>Path_Pilot::is_pro(), + 'has_valid_api_key' => $has_valid_api_key, + 'chat_enabled' => $chat_enabled, + 'icon_css_url' => plugins_url('assets/css/path-pilot-icons.css', $main_plugin_file), + 'nonce' => wp_create_nonce('wp_rest'), + ] + ); } // Get most common page 2 hops before goal page (for basic recommendations) diff --git a/scripts/index.js b/scripts/index.js index f10cb08..c085a70 100644 --- a/scripts/index.js +++ b/scripts/index.js @@ -1,6 +1,43 @@ // Path Pilot left-side navigation drawer (vanilla JS) (function() { + // Lightweight inline SVG icon helper (Material-style, no extra requests) + function ppIcon(name) { + switch (name) { + case 'compass': // recommendations + return ( + '' + ); + case 'info': // page summary + return ( + '' + ); + case 'search': // magnifying glass + return ( + '' + ); + case 'dockRight': // drawer closer + return ( + '' + ); + default: + return ''; + } + } + // Wait for DOM to be ready document.addEventListener('DOMContentLoaded', function() { initPathPilot(); @@ -60,76 +97,159 @@ return response; } - // --- Inject icon font CSS if not present --- - if (!document.querySelector('link[href*="path-pilot-icons.css"]')) { - var iconFontLink = document.createElement('link'); - iconFontLink.rel = 'stylesheet'; - iconFontLink.href = (window.PathPilotStatus && window.PathPilotStatus.icon_css_url) || '/wp-content/plugins/path-pilot/assets/css/path-pilot-icons.css'; - document.head.appendChild(iconFontLink); + // --- Sidebar state --- + let isExpanded = false; + let activeTabId = null; + const DRAWER_STORAGE_KEY = 'path_pilot_drawer_state'; + + function loadDrawerState() { + try { + const raw = window.localStorage ? localStorage.getItem(DRAWER_STORAGE_KEY) : null; + if (!raw) return null; + return JSON.parse(raw); + } catch (e) { + return null; + } } - // --- Drawer State --- - let drawerOpen = false; - - // --- Drawer Container --- - const drawer = document.createElement('div'); - drawer.id = 'path-pilot-drawer'; - drawer.className = 'pp-drawer minimized'; - drawer.setAttribute('role', 'complementary'); - drawer.setAttribute('aria-label', 'Path Pilot recommendations panel'); - drawer.setAttribute('aria-hidden', 'true'); - document.body.appendChild(drawer); - - // --- Drawer Handle (Modern, slim, right-rounded rectangle) --- - const drawerHandle = document.createElement('button'); - drawerHandle.className = 'pp-drawer-handle'; - drawerHandle.type = 'button'; - drawerHandle.setAttribute('aria-label', 'Open Path Pilot panel'); - drawerHandle.setAttribute('aria-controls', 'path-pilot-drawer'); - drawerHandle.setAttribute('aria-expanded', 'false'); - drawerHandle.innerHTML = ''; - drawer.appendChild(drawerHandle); - - // Beacon effect after 15s, only if drawer is closed - setTimeout(function() { - if (!drawer.classList.contains('expanded')) { - drawerHandle.classList.add('pp-beacon'); + function persistDrawerState() { + try { + if (!window.localStorage) return; + const state = { + open: isExpanded, + tab: activeTabId || null + }; + localStorage.setItem(DRAWER_STORAGE_KEY, JSON.stringify(state)); + } catch (e) { + // fail silently if storage is unavailable } - }, 15000); - drawerHandle.addEventListener('click', function() { - drawerHandle.classList.remove('pp-beacon'); - }); + } + + // --- Tab configuration (pluggable) --- + const TAB_DEFS = [ + { + id: 'recommendations', + label: 'Recommendations', + icon: 'compass', + }, + { + id: 'summary', + label: 'Page summary', + icon: 'info', + }, + { + id: 'search', + label: 'Search', + icon: 'search', + }, + ]; - // Also remove beacon if drawer is opened by any means - const observer = new MutationObserver(function() { - if (drawer.classList.contains('expanded')) { - drawerHandle.classList.remove('pp-beacon'); + // --- Sidebar Container (always visible on the left) --- + const sidebar = document.createElement('div'); + sidebar.id = 'path-pilot-sidebar'; + sidebar.className = 'pp-sidebar collapsed'; + sidebar.setAttribute('role', 'complementary'); + sidebar.setAttribute('aria-label', 'Path Pilot panel'); + sidebar.setAttribute('aria-hidden', 'true'); + document.body.appendChild(sidebar); + // Let the theme know to reserve space for the sidebar + document.body.classList.add('pp-sidebar-present'); + + // Inner container to stack brand + nav + const sidebarInner = document.createElement('div'); + sidebarInner.className = 'pp-sidebar-inner'; + sidebar.appendChild(sidebarInner); + + // --- Brand / top icon (links to pathpilot.app) --- + const brand = document.createElement('button'); + brand.type = 'button'; + brand.className = 'pp-sidebar-brand'; + brand.innerHTML = ''; + brand.setAttribute('title', 'Path Pilot'); + brand.setAttribute('aria-label', 'Open Path Pilot website'); + brand.addEventListener('click', function () { + try { + window.open('https://pathpilot.app', '_blank', 'noopener,noreferrer'); + } catch (e) { + // Fallback: change location if popup blocked + window.location.href = 'https://pathpilot.app'; } }); - observer.observe(drawer, { attributes: true, attributeFilter: ['class'] }); + sidebarInner.appendChild(brand); + + // --- Vertical Nav --- + const nav = document.createElement('nav'); + nav.className = 'pp-sidebar-nav'; + nav.setAttribute('aria-label', 'Path Pilot navigation'); + sidebarInner.appendChild(nav); - // --- Drawer Content --- - const drawerContent = document.createElement('div'); - drawerContent.className = 'pp-drawer-content'; - drawer.appendChild(drawerContent); + // --- Content panel (appears to the right of the nav when expanded) --- + const panel = document.createElement('div'); + panel.className = 'pp-sidebar-content'; + sidebar.appendChild(panel); - // --- Recommendations Section (Dynamic) --- + // Panel close button (top-right inside drawer) + const panelClose = document.createElement('button'); + panelClose.type = 'button'; + panelClose.className = 'pp-panel-close'; + panelClose.setAttribute('aria-label', 'Close Path Pilot panel'); + panelClose.innerHTML = ppIcon('dockRight'); + panel.appendChild(panelClose); + + // Panel header title (changes with active tab) + const panelHeader = document.createElement('div'); + panelHeader.className = 'pp-drawer-title'; + panelHeader.textContent = 'Recommendations'; + panel.appendChild(panelHeader); + + // --- Tab content containers --- + // Recommendations (Dynamic) const recSection = document.createElement('div'); - recSection.className = 'pp-drawer-recommendations'; - recSection.innerHTML = ` -
RECOMMENDED FOR YOU
- - `; - const recList = recSection.querySelector('.pp-drawer-rec-list'); - drawerContent.appendChild(recSection); - - // --- Chat functionality is now handled by Path Pilot Pro plugin --- - - // --- Path Pilot Advert/Footer --- - const footer = document.createElement('div'); - footer.className = 'pp-drawer-footer'; - footer.innerHTML = 'Path Pilot — pathpilot.app'; - drawerContent.appendChild(footer); + recSection.className = 'pp-tab-root pp-tab-recommendations'; + const recList = document.createElement('ul'); + recList.className = 'pp-drawer-rec-list'; + recSection.appendChild(recList); + panel.appendChild(recSection); + + // Page summary (placeholder for now) + const summarySection = document.createElement('div'); + summarySection.className = 'pp-tab-root pp-tab-summary'; + summarySection.style.display = 'none'; + summarySection.innerHTML = '
Page summary coming soon.
'; + panel.appendChild(summarySection); + + // Search (placeholder for now) + const searchSection = document.createElement('div'); + searchSection.className = 'pp-tab-root pp-tab-search'; + searchSection.style.display = 'none'; + searchSection.innerHTML = '
Search coming soon.
'; + panel.appendChild(searchSection); + + // Map sections by tab id for pluggable use + const TAB_SECTIONS = { + recommendations: recSection, + summary: summarySection, + search: searchSection, + }; + + // Build nav buttons from TAB_DEFS + const tabs = TAB_DEFS.map(def => { + const btn = document.createElement('button'); + btn.type = 'button'; + btn.className = 'pp-nav-btn'; + btn.setAttribute('data-view', def.id); + btn.setAttribute('title', def.label); + btn.setAttribute('aria-label', def.label); + btn.innerHTML = ppIcon(def.icon); + nav.appendChild(btn); + return { + ...def, + button: btn, + section: TAB_SECTIONS[def.id] || null, + }; + }); + + // --- Recommendations Logic --- function renderRecommendations(recs) { @@ -205,7 +325,7 @@ } function showRecommendationSkeletons(count = 3) { - const ul = document.querySelector('.pp-drawer-rec-list'); + const ul = panel.querySelector('.pp-drawer-rec-list'); if (!ul) return; ul.innerHTML = ''; for (let i = 0; i < count; i++) { @@ -247,22 +367,102 @@ renderRecommendations([]); }); } - fetchRecommendations(); - - // --- Toggle Drawer --- - drawerHandle.addEventListener('click', function() { - drawerOpen = !drawerOpen; - drawer.classList.toggle('minimized', !drawerOpen); - drawer.classList.toggle('expanded', drawerOpen); - drawer.setAttribute('aria-hidden', drawerOpen ? 'false' : 'true'); - drawerHandle.setAttribute('aria-expanded', String(drawerOpen)); - drawerHandle.setAttribute('aria-label', drawerOpen ? 'Close Path Pilot panel' : 'Open Path Pilot panel'); - if (drawerOpen) { - document.body.classList.add('pp-drawer-open'); - } else { - document.body.classList.remove('pp-drawer-open'); + // Default view shows recs when panel first expands + + // helper to update panel title when tab changes + function setPanelTitle(text) { + const header = panel.querySelector('.pp-drawer-title'); + if (header) { + header.textContent = text; + } + } + + // --- Expand/Collapse helpers --- + function expandSidebar() { + if (isExpanded) return; + isExpanded = true; + sidebar.classList.remove('collapsed'); + sidebar.classList.add('expanded'); + sidebar.setAttribute('aria-hidden', 'false'); + document.body.classList.add('pp-sidebar-open'); + // Load data on first open + if (!panel.dataset.loaded) { + fetchRecommendations(); + panel.dataset.loaded = '1'; + } + persistDrawerState(); + } + + function collapseSidebar() { + if (!isExpanded) return; + isExpanded = false; + sidebar.classList.remove('expanded'); + sidebar.classList.add('collapsed'); + sidebar.setAttribute('aria-hidden', 'true'); + document.body.classList.remove('pp-sidebar-open'); + activeTabId = null; + persistDrawerState(); + } + + function setActiveTab(tabId) { + activeTabId = tabId; + tabs.forEach(tab => { + const isActive = tab.id === tabId; + if (tab.button) { + tab.button.classList.toggle('is-active', isActive); + } + if (tab.section) { + tab.section.style.display = isActive ? 'block' : 'none'; + } + }); + const tabMeta = tabs.find(t => t.id === tabId); + if (tabMeta) { + setPanelTitle(tabMeta.label); + } + } + + function handleTabClick(tab) { + if (!isExpanded) { + setActiveTab(tab.id); + expandSidebar(); + return; + } + setActiveTab(tab.id); + persistDrawerState(); + } + + // --- Nav interactions --- + tabs.forEach(tab => { + if (!tab.button) return; + tab.button.addEventListener('click', function() { + handleTabClick(tab); + }); + }); + + // Panel close button (top-right) + panelClose.addEventListener('click', function() { + collapseSidebar(); + }); + + // Close with Escape + document.addEventListener('keydown', function(e) { + if (e.key === 'Escape') { + collapseSidebar(); } }); + + // --- Restore persisted state on load --- + const savedState = loadDrawerState(); + if (savedState && savedState.open) { + const fallbackId = tabs.length ? tabs[0].id : null; + const tabId = savedState.tab && tabs.some(t => t.id === savedState.tab) + ? savedState.tab + : fallbackId; + if (tabId) { + setActiveTab(tabId); + expandSidebar(); + } + } } // End of initPathPilot function From dc87c7bdf1367aac48d12c18216bea4490c486c0 Mon Sep 17 00:00:00 2001 From: docvars Date: Thu, 13 Nov 2025 21:38:09 -0600 Subject: [PATCH 2/5] style updates... moved the js and css into minified files that can be hosted externally... created plugin architecture for tabs --- assets/css/style.css | 28 +- assets/dist/pp.css | 1 + assets/dist/pp.js | 1 + frontend/index.js | 7 + includes/common/class-path-pilot-shared.php | 36 +- package-lock.json | 3322 +++++++++++++++++++ package.json | 23 + rollup.config.mjs | 28 + scripts/index.js | 26 +- 9 files changed, 3456 insertions(+), 16 deletions(-) create mode 100644 assets/dist/pp.css create mode 100644 assets/dist/pp.js create mode 100644 frontend/index.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 rollup.config.mjs diff --git a/assets/css/style.css b/assets/css/style.css index b0a6237..cc4250c 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -495,7 +495,7 @@ body .pp-drawer a:not(.pp-footer-link):active { } .pp-sidebar-brand { width: 48px; - height: 48px; + height: 34px; display: flex; align-items: center; justify-content: center; @@ -573,7 +573,9 @@ body .pp-drawer a:not(.pp-footer-link):active { color: #fff; padding: 12px 20px 0 20px; height: 100vh; - overflow-y: auto; + display: flex; + flex-direction: column; + overflow-y: hidden; /* outer panel never scrolls; inner sections handle their own scroll */ position: relative; /* anchor panel close button */ /* Start slightly hidden and slid under the rail */ opacity: 0; @@ -589,6 +591,28 @@ body .pp-drawer a:not(.pp-footer-link):active { pointer-events: auto; } +/* Generic tab root takes remaining height inside panel */ +.pp-tab-root { + flex: 1 1 auto; +} + +/* Recommendations tab: allow its content to scroll internally */ +.pp-tab-root.pp-tab-recommendations { + overflow-y: auto; +} + +/* Layout for Search tab (chat): keep separator above and chat block pinned + towards the bottom while chat history scrolls inside its own container */ +.pp-tab-root.pp-tab-search { + display: flex; + flex-direction: column; + height: 100%; +} +.pp-tab-root.pp-tab-search .pp-drawer-chat { + margin-top: auto; + margin-bottom: 16px; +} + /* Panel close button (top-right) */ .pp-panel-close { position: absolute; diff --git a/assets/dist/pp.css b/assets/dist/pp.css new file mode 100644 index 0000000..93f7d23 --- /dev/null +++ b/assets/dist/pp.css @@ -0,0 +1 @@ +@font-face{font-display:swap;font-family:DM Sans;font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/dmsans/v15/rP2Hp2ywxg089UriCZOIHQ.woff2) format("woff2")}.pp-rec-skeleton{border-radius:8px;margin-bottom:16px;min-height:60px;overflow:hidden;padding:16px;position:relative}.pp-skeleton-synopsis,.pp-skeleton-title{animation:pp-skeleton-loading 1.2s linear infinite;background:#e0e0e0;border-radius:4px;height:18px;margin-bottom:8px;width:80%}.pp-skeleton-synopsis{height:14px;width:95%}@keyframes pp-skeleton-loading{0%{background-color:#303030}50%{background-color:#555}to{background-color:#303030}}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.pp-drawer-rec-synopsis{color:#999;display:block;font-size:.8rem;line-height:1.4;margin-bottom:4px;margin-top:2px;white-space:normal}.pp-drawer-rec-badge{background:#eee;border-radius:6px;color:#444;display:inline-block;font-size:.5rem;font-weight:600;letter-spacing:.02em;line-height:.6rem;margin-top:0;padding:2px 8px;text-transform:uppercase;vertical-align:middle}.pp-badge-conversion_path{background:#1976d2!important;color:#fff!important}.pp-badge-popular{background:#c58723!important;color:#fff!important}.pp-badge-related{background:#8e24aa!important;color:#fff!important}.pp-badge-newest{background:#0e7d15!important;color:#fff!important}.pp-drawer-content{display:flex;flex-direction:column;height:100%}.pp-drawer-footer,.pp-drawer-recommendations{flex-shrink:0}:root{--pp-drawer-handle-top:0.5rem}.pp-drawer{align-items:stretch;color:var(--pp-white,#fff);font-family:DM Sans,sans-serif!important;left:0;overflow:visible;position:fixed;transition:width .3s cubic-bezier(.4,0,.2,1);width:0;z-index:9999}.pp-drawer,.pp-drawer .pp-drawer-content{background:var(--pp-dark,#181818);display:flex;flex-direction:column;height:100vh;top:0}.pp-drawer .pp-drawer-content{box-sizing:border-box;left:-320px;overflow:hidden;padding:11px 20px 0 24px;pointer-events:none;position:absolute;width:320px}.pp-drawer.expanded{left:0;width:320px}.pp-drawer.expanded .pp-drawer-content{left:0;opacity:1;pointer-events:auto;position:relative;transition:left .3s cubic-bezier(.4,0,.2,1)}body .pp-drawer .pp-drawer-handle,body .pp-drawer button.pp-drawer-handle,body button.pp-drawer-handle{align-items:center;background:#232323;background-color:#232323;border:none;border-radius:12px;box-shadow:none;color:#fff;cursor:pointer;display:flex;font-family:inherit;font-size:1.2rem;font-weight:400;height:24px;justify-content:center;left:.5rem;line-height:1;margin:0;max-height:none;max-width:none;min-height:auto;min-width:auto;outline:none;padding:0;position:absolute;text-align:center;text-decoration:none;top:.5rem;transition:all .3s cubic-bezier(.4,0,.2,1);vertical-align:baseline;width:24px;z-index:10000}body .pp-drawer .pp-drawer-handle:focus{box-shadow:0 0 0 3px rgba(25,118,210,.3);outline:2px solid #1976d2}body .pp-drawer .pp-drawer-handle i,body .pp-drawer button.pp-drawer-handle i,body button.pp-drawer-handle i{background:none;border:none;color:#fff;font-size:1.1rem;font-weight:400;line-height:1;margin:0;padding:0;text-decoration:none}.pp-drawer-handle:after{background:#232323;border-radius:4px;color:#fff;content:"Need a hand? Click here for recommendations.";font-size:.9rem;left:100%;margin-left:10px;opacity:0;padding:8px 12px;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);transition:none;white-space:nowrap}.pp-drawer.minimized .pp-drawer-handle:hover:after{opacity:1;transition:opacity .2s ease .3s}body .pp-drawer.expanded .pp-drawer-handle,body .pp-drawer.expanded button.pp-drawer-handle{background:#232323;background-color:#232323;left:290px;opacity:1;transform:rotate(0deg)}.pp-drawer.expanded .pp-drawer-handle:after{opacity:0!important;visibility:hidden!important}body .pp-drawer.minimized .pp-drawer-handle,body .pp-drawer.minimized button.pp-drawer-handle{background:#232323;background-color:#232323;left:.5rem;top:.5rem;transform:rotate(-1turn)}.pp-drawer-title{color:var(--pp-lighter-text,#646970);font-size:.95rem;font-weight:700;letter-spacing:1.5px;margin-bottom:18px;text-transform:uppercase}.pp-drawer-rec-list{list-style:none;margin:0 0 24px;padding:0}.pp-drawer-rec-list li{align-items:flex-start;display:flex;flex-wrap:wrap;margin-bottom:20px}.pp-drawer-rec-title-row{align-items:flex-start;display:flex;flex-direction:column;margin-bottom:0}.pp-drawer-rec-title{color:#fff;flex-grow:1;font-size:.95rem;font-weight:600;line-height:1.3;margin:0}.pp-rec-meta{align-items:center;display:flex;flex-shrink:0;gap:4px;margin-bottom:4px}.pp-drawer-rec-percent{color:#888;flex-shrink:0;font-size:.6rem;font-weight:600;line-height:.7rem}.pp-drawer-footer{bottom:0;color:#aaa;font-size:11px;left:0;line-height:2rem;margin:0;opacity:.7;padding:0;pointer-events:auto;position:absolute;right:0;text-align:center;width:100%;z-index:1}body .pp-drawer .pp-drawer-footer a.pp-footer-link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:visited{color:#ccc;font-size:11px;opacity:.8;text-decoration:none;transition:color .2s}body .pp-drawer .pp-drawer-footer a.pp-footer-link:active,body .pp-drawer .pp-drawer-footer a.pp-footer-link:focus,body .pp-drawer .pp-drawer-footer a.pp-footer-link:hover{color:#fff;opacity:1;text-decoration:underline}.pp-drawer .pp-drawer-content{overflow-y:auto;padding-bottom:2rem}body.pp-drawer-open{margin-left:320px!important;transition:margin-left .3s cubic-bezier(.4,0,.2,1)}.pp-drawer.minimized{width:0!important}.pp-drawer.minimized .pp-drawer-content{opacity:0!important;pointer-events:none!important}.pp-drawer.minimized .pp-drawer-handle{left:.5rem;top:.5rem}@media (max-width:600px){.pp-drawer.expanded{background:hsla(0,0%,9%,.96);left:0;width:100vw}.pp-drawer.expanded .pp-drawer-handle{left:auto;right:.5rem}.pp-drawer.expanded .pp-drawer-content{background:transparent;left:0;width:100vw}body.pp-drawer-open{margin-left:0!important}}body .pp-drawer a:not(.pp-footer-link),body .pp-drawer a:not(.pp-footer-link):link,body .pp-drawer a:not(.pp-footer-link):visited{background:none;border:none;color:#ddd;text-decoration:underline}body .pp-drawer a:not(.pp-footer-link):active,body .pp-drawer a:not(.pp-footer-link):focus,body .pp-drawer a:not(.pp-footer-link):hover{background:none;color:#fff;text-decoration:underline}@keyframes pp-beacon-pulse{0%{box-shadow:0 0 0 0 rgba(25,118,210,.5)}70%{box-shadow:0 0 0 12px rgba(25,118,210,0)}to{box-shadow:0 0 0 0 rgba(25,118,210,0)}}.pp-drawer-handle.pp-beacon{animation:pp-beacon-pulse 1.2s infinite}.pp-content-types-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.pp-content-type-item{background:#f9f9f9;border:2px solid #e0e0e0;border-radius:6px;padding:12px 14px;transition:all .2s ease}.pp-content-type-item:hover{background:#f0f8ff;border-color:#1976d2}.pp-content-type-item input[type=checkbox]:checked+div{color:#1976d2;font-weight:600}.pp-content-type-item input[type=checkbox]:checked{accent-color:#1976d2}.pp-content-types-section .pp-home-protip{margin-bottom:12px}.pp-sidebar{align-items:stretch;background:#212426;color:var(--pp-white,#fff);display:flex;flex-direction:row;font-family:DM Sans,sans-serif!important;height:100vh;left:0;overflow:hidden;position:fixed;top:0;transition:width .38s cubic-bezier(.25,.8,.25,1),box-shadow .38s cubic-bezier(.25,.8,.25,1);width:48px;z-index:9999}.pp-sidebar.expanded{width:368px}.pp-sidebar.collapsed{width:48px}.pp-sidebar-inner{background:#212426;flex-direction:column;flex-shrink:0;gap:4px;padding:8px 0}.pp-sidebar-brand,.pp-sidebar-inner{align-items:center;display:flex;width:48px}.pp-sidebar-brand{appearance:none;background:transparent;border:none;color:#fff;cursor:pointer;font-size:1.2rem;height:34px;justify-content:center;margin:0;padding:0}.pp-sidebar-nav{display:flex;flex-direction:column;gap:2px;width:100%}.pp-sidebar-nav .pp-nav-btn{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;gap:10px;height:44px;justify-content:center;position:relative;text-align:left;transition:background .15s ease,color .15s ease;width:48px}.pp-sidebar-nav .pp-nav-btn i{color:inherit;font-size:1.1rem}.pp-sidebar-nav .pp-nav-btn svg.pp-icon{flex-shrink:0;height:20px;width:20px}.pp-sidebar-nav .pp-nav-btn span{color:inherit;display:none;font-size:.92rem}.pp-sidebar-nav .pp-nav-btn.is-active,.pp-sidebar-nav .pp-nav-btn:hover{color:#fff}.pp-sidebar-nav .pp-nav-btn:before{background:transparent;border-radius:2px;bottom:8px;content:"";left:0;position:absolute;top:8px;width:2px}.pp-sidebar-nav .pp-nav-btn.is-active:before{background:#fff}.pp-sidebar-nav .pp-collapse{margin-top:auto}.pp-sidebar-content{background:#282a2c;color:#fff;display:flex;flex-direction:column;height:100vh;opacity:0;overflow-y:hidden;padding:12px 20px 0;pointer-events:none;position:relative;transform:translateX(-24px);transition:opacity .38s cubic-bezier(.25,.8,.25,1) 40ms,transform .38s cubic-bezier(.25,.8,.25,1) 40ms;width:320px}.pp-sidebar.expanded .pp-sidebar-content{opacity:1;pointer-events:auto;transform:translateX(0)}.pp-tab-root{flex:1 1 auto}.pp-tab-root.pp-tab-recommendations{overflow-y:auto}.pp-tab-root.pp-tab-search{display:flex;flex-direction:column;height:100%}.pp-tab-root.pp-tab-search .pp-drawer-chat{margin-bottom:16px;margin-top:auto}.pp-panel-close{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;height:32px;justify-content:center;position:absolute;right:8px;top:8px;width:32px}.pp-panel-close svg.pp-icon{height:20px;width:20px}.pp-panel-close:hover{color:#fff}body.pp-sidebar-present{margin-left:48px!important}body.pp-sidebar-open,body.pp-sidebar-present{transition:margin-left .38s cubic-bezier(.25,.8,.25,1)}body.pp-sidebar-open{margin-left:376px!important}@media (max-width:600px){.pp-sidebar.expanded{width:100vw}.pp-sidebar.expanded .pp-sidebar-content{width:calc(100vw - 48px)}body.pp-sidebar-open,body.pp-sidebar-present{margin-left:0!important}} \ No newline at end of file diff --git a/assets/dist/pp.js b/assets/dist/pp.js new file mode 100644 index 0000000..f37ac84 --- /dev/null +++ b/assets/dist/pp.js @@ -0,0 +1 @@ +!function(){"use strict";!function(){function e(e){switch(e){case"compass":return'';case"info":return'';case"search":return'';case"dockRight":return'';default:return""}}document.addEventListener("DOMContentLoaded",function(){!function(){if(window.PathPilotStatus&&!0===window.PathPilotStatus.insights_only)return void console.log("Path Pilot: Insights only mode enabled - skipping drawer initialization");if(!document.querySelector('link[href*="path-pilot-icons.css"]')){var t=document.createElement("link");t.rel="stylesheet",t.href=window.PathPilotStatus&&window.PathPilotStatus.icon_css_url||"/wp-content/plugins/path-pilot/assets/css/path-pilot-icons.css",document.head.appendChild(t)}let n=window.PathPilotStatus?window.PathPilotStatus.nonce:null;function o(){return fetch("/wp-json/path-pilot/v1/nonce").then(e=>e.json()).then(e=>(e.nonce&&(n=e.nonce),n)).catch(()=>n)}async function a(e,t){const a=n=>{const o={...t.headers,"X-WP-Nonce":n};return fetch(e,{...t,headers:o})};let i=await a(n);if(403===i.status){const e=await o();i=await a(e)}return i}o();let i=!1,s=null;const c="path_pilot_drawer_state";function r(){try{const e=window.localStorage?localStorage.getItem(c):null;return e?JSON.parse(e):null}catch(e){return null}}function l(){try{if(!window.localStorage)return;const e={open:i,tab:s||null};localStorage.setItem(c,JSON.stringify(e))}catch(e){}}const d=[{id:"recommendations",label:"Recommendations",icon:"compass"},{id:"summary",label:"Page summary",icon:"info"},{id:"search",label:"Search",icon:"search"}],p=document.createElement("div");p.id="path-pilot-sidebar",p.className="pp-sidebar collapsed",p.setAttribute("role","complementary"),p.setAttribute("aria-label","Path Pilot panel"),p.setAttribute("aria-hidden","true"),document.body.appendChild(p),document.body.classList.add("pp-sidebar-present");const u=document.createElement("div");u.className="pp-sidebar-inner",p.appendChild(u);const h=document.createElement("button");h.type="button",h.className="pp-sidebar-brand",h.innerHTML='',h.setAttribute("title","Path Pilot"),h.setAttribute("aria-label","Open Path Pilot website"),h.addEventListener("click",function(){try{window.open("https://pathpilot.app","_blank","noopener,noreferrer")}catch(e){window.location.href="https://pathpilot.app"}}),u.appendChild(h);const m=document.createElement("nav");m.className="pp-sidebar-nav",m.setAttribute("aria-label","Path Pilot navigation"),u.appendChild(m);const b=document.createElement("div");b.className="pp-sidebar-content",p.appendChild(b);const f=document.createElement("button");f.type="button",f.className="pp-panel-close",f.setAttribute("aria-label","Close Path Pilot panel"),f.innerHTML=e("dockRight"),b.appendChild(f);const w=document.createElement("div");w.className="pp-drawer-title",w.textContent="Recommendations",b.appendChild(w);const y=document.createElement("div");y.className="pp-tab-root pp-tab-recommendations";const v=document.createElement("ul");v.className="pp-drawer-rec-list",y.appendChild(v),b.appendChild(y);const g=document.createElement("div");g.className="pp-tab-root pp-tab-summary",g.style.display="none",b.appendChild(g);const C=document.createElement("div");C.className="pp-tab-root pp-tab-search",C.style.display="none",b.appendChild(C);const P={recommendations:y,summary:g,search:C},E=d.map(t=>{const n=document.createElement("button");return n.type="button",n.className="pp-nav-btn",n.setAttribute("data-view",t.id),n.setAttribute("title",t.label),n.setAttribute("aria-label",t.label),n.innerHTML=e(t.icon),m.appendChild(n),{...t,button:n,section:P[t.id]||null}});function k(e){v.innerHTML="",e&&0!==e.length?e.forEach(function(e){const t=document.createElement("li"),n=document.createElement("div");n.className="pp-drawer-rec-title-row";const o=document.createElement("div");if(o.className="pp-rec-meta",e.badge){const t=document.createElement("span");t.className="pp-drawer-rec-badge pp-badge-"+e.badge,"conversion_path"===e.badge?t.textContent="Recommended":"popular"===e.badge?t.textContent="Popular":"related"===e.badge?t.textContent="Related":"newest"===e.badge&&(t.textContent="Newest"),o.appendChild(t)}if(e.score&&e.score>0){const t=document.createElement("span");t.className="pp-drawer-rec-percent",t.textContent=Math.round(e.score)+"%",o.appendChild(t)}o.children.length>0&&n.appendChild(o);const i=document.createElement("span");if(i.className="pp-drawer-rec-title",i.textContent=e.title,n.appendChild(i),t.appendChild(n),e.synopsis){const n=document.createElement("div");n.className="pp-drawer-rec-synopsis",n.textContent=e.synopsis,t.appendChild(n)}t.style.cursor="pointer",t.addEventListener("click",function(){if(void 0!==e.page_id){const t=(document.cookie.match(/path_pilot_sid=([^;]+)/)||[])[1]||"";a("/wp-json/path-pilot/v1/rec-click",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({session_id:t,page_id:e.page_id})})}window.location.href=e.url}),v.appendChild(t)}):v.innerHTML='
  • No recommendations yet.
  • '}function N(e=3){const t=b.querySelector(".pp-drawer-rec-list");if(t){t.innerHTML="";for(let n=0;n\n
    \n
    \n
    \n \n '}}function x(){N(3),a("/wp-json/path-pilot/v1/suggest",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({current:window.location.pathname,history:JSON.parse(sessionStorage.getItem("path_pilot_history")||"[]")})}).then(e=>e.json()).then(e=>{console.log("Path Pilot: Received recommendations data:",e),e&&e.recommendations?k(e.recommendations):(console.warn("Path Pilot: No recommendations in response"),k([]))}).catch(e=>{console.error("Path Pilot: Error fetching recommendations:",e),k([])})}function S(e){const t=b.querySelector(".pp-drawer-title");t&&(t.textContent=e)}function L(){i||(i=!0,p.classList.remove("collapsed"),p.classList.add("expanded"),p.setAttribute("aria-hidden","false"),document.body.classList.add("pp-sidebar-open"),b.dataset.loaded||(x(),b.dataset.loaded="1"),l())}function _(){if(i){try{const e=document.activeElement;if(e&&p.contains(e)){const e=p.querySelector(".pp-sidebar-brand")||document.body;e&&"function"==typeof e.focus&&e.focus()}}catch(e){}i=!1,p.classList.remove("expanded"),p.classList.add("collapsed"),p.setAttribute("aria-hidden","true"),document.body.classList.remove("pp-sidebar-open"),s=null,l()}}function A(e){s=e,E.forEach(t=>{const n=t.id===e;t.button&&t.button.classList.toggle("is-active",n),t.section&&(t.section.style.display=n?"":"none")});const t=E.find(t=>t.id===e);t&&S(t.label)}function T(e){if(!i)return A(e.id),void L();A(e.id),l()}E.forEach(e=>{e.button&&e.button.addEventListener("click",function(){T(e)})}),f.addEventListener("click",function(){_()}),document.addEventListener("keydown",function(e){"Escape"===e.key&&_()});const M=r();if(M&&M.open){const e=E.length?E[0].id:null,t=M.tab&&E.some(e=>e.id===M.tab)?M.tab:e;t&&(A(t),L())}}()})}()}(); diff --git a/frontend/index.js b/frontend/index.js new file mode 100644 index 0000000..88fc9d1 --- /dev/null +++ b/frontend/index.js @@ -0,0 +1,7 @@ +// Bundle entry for Path Pilot front-end +// Imports main CSS and JS as side effects so Rollup can produce pp.css and pp.js + +import '../assets/css/style.css'; +import '../scripts/index.js'; + + diff --git a/includes/common/class-path-pilot-shared.php b/includes/common/class-path-pilot-shared.php index 18b5a53..0dd6996 100644 --- a/includes/common/class-path-pilot-shared.php +++ b/includes/common/class-path-pilot-shared.php @@ -454,13 +454,26 @@ public static function enqueue_scripts() { $recommend_label = get_option('path_pilot_recommend_label', 'Recommended for you:'); $chat_label = get_option('path_pilot_chat_label', 'Path Pilot'); - // Get the main plugin file path - $main_plugin_file = dirname(dirname(dirname(__FILE__))) . '/path-pilot-pro.php'; + // Get the main plugin file path (free plugin) + $main_plugin_file = dirname(dirname(dirname(__FILE__))) . '/path-pilot.php'; + + // Decide whether to use dev (unbundled) assets or bundled dist assets. + // When dev mode is enabled, we load the original index.js + style.css + // for easier debugging. Otherwise, we load the optimized pp.js / pp.css + // from assets/dist. + $use_dev_assets = $dev_mode; + + if ($use_dev_assets) { + // Dev: use original stylesheet + $styles_url = plugins_url('assets/css/style.css', $main_plugin_file); + } else { + // Prod: use bundled CSS (pp.css) from assets/dist + $styles_url = plugins_url('assets/dist/pp.css', $main_plugin_file); + } - // Enqueue CSS wp_enqueue_style( self::SLUG . '-styles', - plugins_url('assets/css/style.css', $main_plugin_file), + $styles_url, [], PATH_PILOT_VERSION ); @@ -490,11 +503,16 @@ public static function enqueue_scripts() { ); Log::info('Path Pilot: wp_localize_script result = ' . ($localize_result ? 'success' : 'failed')); - // Always enqueue UI/interactivity; the script itself will respect the - // insights_only / show_drawer flags and no-op when the drawer is disabled. - Log::info('Path Pilot: Enqueuing index.js script...'); - $script_url = plugins_url('scripts/index.js', $main_plugin_file); - Log::info('Path Pilot: Script URL = ' . $script_url); + // Enqueue UI/interactivity script. Switch between bundled and dev + // assets based on the same $use_dev_assets flag. + if ($use_dev_assets) { + Log::info('Path Pilot: Enqueuing dev index.js script...'); + $script_url = plugins_url('scripts/index.js', $main_plugin_file); + } else { + Log::info('Path Pilot: Enqueuing bundled pp.js script from assets/dist...'); + $script_url = plugins_url('assets/dist/pp.js', $main_plugin_file); + } + Log::info('Path Pilot: Interactivity script URL = ' . $script_url); wp_enqueue_script( 'path-pilot-interactivity', diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a84abb6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3322 @@ +{ + "name": "path-pilot", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "path-pilot", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@fullhuman/postcss-purgecss": "^7.0.2", + "@rollup/plugin-commonjs": "^29.0.0", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-terser": "^0.4.4", + "cssnano": "^7.1.2", + "postcss": "^8.5.6", + "rollup": "^4.53.2", + "rollup-plugin-postcss": "^4.0.2" + } + }, + "node_modules/@fullhuman/postcss-purgecss": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-7.0.2.tgz", + "integrity": "sha512-U4zAXNaVztbDxO9EdcLp51F3UxxYsb/7DN89rFxFJhfk2Wua2pvw2Kf3HdspbPhW/wpHjSjsxWYoIlbTgRSjbQ==", + "dev": true, + "dependencies": { + "purgecss": "^7.0.2" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.0.tgz", + "integrity": "sha512-U2YHaxR2cU/yAiwKJtJRhnyLk7cifnQw0zUpISsocBDoHDJn+HTV74ABqnwr5bEgWUwFZC9oFL6wLe21lHu5eQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz", + "integrity": "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.2.tgz", + "integrity": "sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.2.tgz", + "integrity": "sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.2.tgz", + "integrity": "sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.2.tgz", + "integrity": "sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.2.tgz", + "integrity": "sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.2.tgz", + "integrity": "sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.2.tgz", + "integrity": "sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.2.tgz", + "integrity": "sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.2.tgz", + "integrity": "sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.2.tgz", + "integrity": "sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.2.tgz", + "integrity": "sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.2.tgz", + "integrity": "sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.2.tgz", + "integrity": "sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.2.tgz", + "integrity": "sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.2.tgz", + "integrity": "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.2.tgz", + "integrity": "sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.2.tgz", + "integrity": "sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.2.tgz", + "integrity": "sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.2.tgz", + "integrity": "sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.2.tgz", + "integrity": "sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.2.tgz", + "integrity": "sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.28", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz", + "integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001754", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", + "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.2.tgz", + "integrity": "sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^7.0.10", + "lilconfig": "^3.1.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.10.tgz", + "integrity": "sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA==", + "dev": true, + "dependencies": { + "browserslist": "^4.27.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.1", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.5", + "postcss-convert-values": "^7.0.8", + "postcss-discard-comments": "^7.0.5", + "postcss-discard-duplicates": "^7.0.2", + "postcss-discard-empty": "^7.0.1", + "postcss-discard-overridden": "^7.0.1", + "postcss-merge-longhand": "^7.0.5", + "postcss-merge-rules": "^7.0.7", + "postcss-minify-font-values": "^7.0.1", + "postcss-minify-gradients": "^7.0.1", + "postcss-minify-params": "^7.0.5", + "postcss-minify-selectors": "^7.0.5", + "postcss-normalize-charset": "^7.0.1", + "postcss-normalize-display-values": "^7.0.1", + "postcss-normalize-positions": "^7.0.1", + "postcss-normalize-repeat-style": "^7.0.1", + "postcss-normalize-string": "^7.0.1", + "postcss-normalize-timing-functions": "^7.0.1", + "postcss-normalize-unicode": "^7.0.5", + "postcss-normalize-url": "^7.0.1", + "postcss-normalize-whitespace": "^7.0.1", + "postcss-ordered-values": "^7.0.2", + "postcss-reduce-initial": "^7.0.5", + "postcss-reduce-transforms": "^7.0.1", + "postcss-svgo": "^7.1.0", + "postcss-unique-selectors": "^7.0.4" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-utils": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", + "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.250", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz", + "integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "dev": true, + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "dev": true, + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + }, + "node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-colormin": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.5.tgz", + "integrity": "sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA==", + "dev": true, + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-convert-values": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.8.tgz", + "integrity": "sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg==", + "dev": true, + "dependencies": { + "browserslist": "^4.27.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-comments": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.5.tgz", + "integrity": "sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", + "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-empty": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", + "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", + "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", + "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.5" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-merge-rules": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.7.tgz", + "integrity": "sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew==", + "dev": true, + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.1", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", + "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", + "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", + "dev": true, + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-params": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.5.tgz", + "integrity": "sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.27.0", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", + "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-modules": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", + "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", + "dev": true, + "dependencies": { + "generic-names": "^4.0.0", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", + "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", + "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", + "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", + "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", + "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", + "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.5.tgz", + "integrity": "sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q==", + "dev": true, + "dependencies": { + "browserslist": "^4.27.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-url": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", + "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", + "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-ordered-values": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", + "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", + "dev": true, + "dependencies": { + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.5.tgz", + "integrity": "sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA==", + "dev": true, + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", + "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz", + "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^4.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", + "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/promise.series": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", + "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/purgecss": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-7.0.2.tgz", + "integrity": "sha512-4Ku8KoxNhOWi9X1XJ73XY5fv+I+hhTRedKpGs/2gaBKU8ijUiIKF/uyyIyh7Wo713bELSICF5/NswjcuOqYouQ==", + "dev": true, + "dependencies": { + "commander": "^12.1.0", + "glob": "^11.0.0", + "postcss": "^8.4.47", + "postcss-selector-parser": "^6.1.2" + }, + "bin": { + "purgecss": "bin/purgecss.js" + } + }, + "node_modules/purgecss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.2.tgz", + "integrity": "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.2", + "@rollup/rollup-android-arm64": "4.53.2", + "@rollup/rollup-darwin-arm64": "4.53.2", + "@rollup/rollup-darwin-x64": "4.53.2", + "@rollup/rollup-freebsd-arm64": "4.53.2", + "@rollup/rollup-freebsd-x64": "4.53.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", + "@rollup/rollup-linux-arm-musleabihf": "4.53.2", + "@rollup/rollup-linux-arm64-gnu": "4.53.2", + "@rollup/rollup-linux-arm64-musl": "4.53.2", + "@rollup/rollup-linux-loong64-gnu": "4.53.2", + "@rollup/rollup-linux-ppc64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-musl": "4.53.2", + "@rollup/rollup-linux-s390x-gnu": "4.53.2", + "@rollup/rollup-linux-x64-gnu": "4.53.2", + "@rollup/rollup-linux-x64-musl": "4.53.2", + "@rollup/rollup-openharmony-arm64": "4.53.2", + "@rollup/rollup-win32-arm64-msvc": "4.53.2", + "@rollup/rollup-win32-ia32-msvc": "4.53.2", + "@rollup/rollup-win32-x64-gnu": "4.53.2", + "@rollup/rollup-win32-x64-msvc": "4.53.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-postcss": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", + "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "concat-with-sourcemaps": "^1.1.0", + "cssnano": "^5.0.1", + "import-cwd": "^3.0.0", + "p-queue": "^6.6.2", + "pify": "^5.0.0", + "postcss-load-config": "^3.0.0", + "postcss-modules": "^4.0.0", + "promise.series": "^0.2.0", + "resolve": "^1.19.0", + "rollup-pluginutils": "^2.8.2", + "safe-identifier": "^0.4.2", + "style-inject": "^0.3.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "8.x" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", + "dev": true + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/style-inject": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", + "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", + "dev": true + }, + "node_modules/stylehacks": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.7.tgz", + "integrity": "sha512-bJkD0JkEtbRrMFtwgpJyBbFIwfDDONQ1Ov3sDLZQP8HuJ73kBOyx66H4bOcAbVWmnfLdvQ0AJwXxOMkpujcO6g==", + "dev": true, + "dependencies": { + "browserslist": "^4.27.0", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "dev": true, + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.4.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/terser": { + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d2576cc --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "path-pilot", + "version": "1.0.0", + "description": "=== Path Pilot ===\r Requires at least: 6.0\r Tested up to: 6.8.3\r Requires PHP: 7.4\r Stable tag: 1.1.0\r License: GPLv2 or later\r License URI: https://www.gnu.org/licenses/gpl-2.0.html\r Tags: analytics, conversion optimization, cro, user engagement, ai", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build:pp": "rollup -c" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@fullhuman/postcss-purgecss": "^7.0.2", + "@rollup/plugin-commonjs": "^29.0.0", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-terser": "^0.4.4", + "cssnano": "^7.1.2", + "postcss": "^8.5.6", + "rollup": "^4.53.2", + "rollup-plugin-postcss": "^4.0.2" + } +} diff --git a/rollup.config.mjs b/rollup.config.mjs new file mode 100644 index 0000000..7408fd1 --- /dev/null +++ b/rollup.config.mjs @@ -0,0 +1,28 @@ +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import terser from '@rollup/plugin-terser'; +import postcss from 'rollup-plugin-postcss'; +import cssnano from 'cssnano'; + +export default { + input: 'frontend/index.js', + output: { + file: 'assets/dist/pp.js', + format: 'iife', + name: 'PathPilotBundle', + sourcemap: false, + }, + plugins: [ + resolve(), + commonjs(), + postcss({ + // Extract CSS next to the JS bundle as assets/dist/pp.css + extract: true, + minimize: true, + plugins: [cssnano()], + }), + terser(), + ], +}; + + diff --git a/scripts/index.js b/scripts/index.js index c085a70..42880e0 100644 --- a/scripts/index.js +++ b/scripts/index.js @@ -211,18 +211,16 @@ recSection.appendChild(recList); panel.appendChild(recSection); - // Page summary (placeholder for now) + // Page summary tab root (content managed by its controller / plugin) const summarySection = document.createElement('div'); summarySection.className = 'pp-tab-root pp-tab-summary'; summarySection.style.display = 'none'; - summarySection.innerHTML = '
    Page summary coming soon.
    '; panel.appendChild(summarySection); - // Search (placeholder for now) + // Search tab root (Pro chat plugs into this container) const searchSection = document.createElement('div'); searchSection.className = 'pp-tab-root pp-tab-search'; searchSection.style.display = 'none'; - searchSection.innerHTML = '
    Search coming soon.
    '; panel.appendChild(searchSection); // Map sections by tab id for pluggable use @@ -395,6 +393,22 @@ function collapseSidebar() { if (!isExpanded) return; + + // If focus is inside the sidebar (e.g., on the close button), + // move focus out before hiding it from assistive tech. + try { + const activeEl = document.activeElement; + if (activeEl && sidebar.contains(activeEl)) { + // Prefer focusing the brand button; fall back to body. + const fallbackTarget = sidebar.querySelector('.pp-sidebar-brand') || document.body; + if (fallbackTarget && typeof fallbackTarget.focus === 'function') { + fallbackTarget.focus(); + } + } + } catch (e) { + // Ignore focus errors + } + isExpanded = false; sidebar.classList.remove('expanded'); sidebar.classList.add('collapsed'); @@ -412,7 +426,9 @@ tab.button.classList.toggle('is-active', isActive); } if (tab.section) { - tab.section.style.display = isActive ? 'block' : 'none'; + // For active tabs, rely on CSS-defined display (flex/block). + // For inactive tabs, hide via inline style. + tab.section.style.display = isActive ? '' : 'none'; } }); const tabMeta = tabs.find(t => t.id === tabId); From 7ccbf181b668d6bbb73b2f022e544eabc63e8060 Mon Sep 17 00:00:00 2001 From: docvars Date: Fri, 14 Nov 2025 16:09:32 -0600 Subject: [PATCH 3/5] Style updates and added in recently viewed --- assets/css/style.css | 179 +++++++++++++++++++--- assets/dist/pp.css | 2 +- assets/dist/pp.js | 2 +- scripts/index.js | 358 ++++++++++++++++++++++++++++++++++--------- 4 files changed, 444 insertions(+), 97 deletions(-) diff --git a/assets/css/style.css b/assets/css/style.css index cc4250c..48d9f7b 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -263,31 +263,12 @@ body .pp-drawer.minimized button.pp-drawer-handle { letter-spacing: 1.5px; text-transform: uppercase; } + /* Legacy recommendation classes kept for skeleton + backwards compatibility */ .pp-drawer-rec-list { list-style: none; padding: 0; margin: 0 0 24px 0; } - .pp-drawer-rec-list li { - margin-bottom: 20px; - display: flex; - flex-wrap: wrap; - align-items: flex-start; - } - .pp-drawer-rec-title-row { - display: flex; - flex-direction: column; - align-items: flex-start; - margin-bottom: 0; - } - .pp-drawer-rec-title { - flex-grow: 1; - font-weight: 600; - font-size: 0.95rem; - line-height: 1.3; - color: #fff; - margin: 0; - } /* New container for badge and percent */ .pp-rec-meta { @@ -571,7 +552,7 @@ body .pp-drawer a:not(.pp-footer-link):active { width: 320px; background: #282a2c; color: #fff; - padding: 12px 20px 0 20px; + padding: 12px 14px 0 14px; height: 100vh; display: flex; flex-direction: column; @@ -601,6 +582,162 @@ body .pp-drawer a:not(.pp-footer-link):active { overflow-y: auto; } +/* Summary tab styling */ +.pp-summary-body { + font-size: 0.95rem; + line-height: 1.5; + color: #ddd; + margin-bottom: 16px; +} +.pp-summary-page-title { + font-size: 1.05rem; + font-weight: 600; + color: #ffffff; + margin-bottom: 10px; +} +.pp-summary-body p { + margin: 0 0 10px 0; +} +.pp-summary-body a, +.pp-summary-body a:link, +.pp-summary-body a:visited { + color: #ddd; + text-decoration: underline; +} +.pp-summary-body a:hover, +.pp-summary-body a:focus { + color: #fff; +} +.pp-summary-related-title { + font-size: 0.8rem; + text-transform: uppercase; + letter-spacing: 1.2px; + color: #888; + margin-bottom: 6px; +} +.pp-summary-related-list { + list-style: none; + padding: 0; + margin: 0; +} +.pp-summary-related-list li { + margin-bottom: 4px; +} +.pp-summary-related-list a { + color: #ddd; + text-decoration: underline; +} +.pp-summary-related-list a:hover, +.pp-summary-related-list a:focus { + color: #fff; +} + +/* ====================== + New Recommendations Layout + ====================== */ +.pp-rec-layout { + display: flex; + flex-direction: column; + gap: 32px; +} +.pp-rec-layout-header { + font-size: 0.9rem; + font-weight: 700; + letter-spacing: 1.4px; + text-transform: uppercase; + color: #bbbbbb; +} +.pp-rec-group { + display: flex; + flex-direction: column; + gap: 10px; +} +.pp-rec-group-suggested { + background: #363636; + border-radius: 6px; + padding: 12px 6px 10px; + position: relative; +} +.pp-rec-group-title { + font-size: 0.75rem; + font-weight: 400; + color: #888; + padding-left: 6px; +} +.pp-rec-card-row { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + background: transparent; + border: none; + color: #f5f5f5; + padding: 0; + cursor: pointer; + text-align: left; +} +.pp-rec-card-row:hover, +.pp-rec-card-row:focus { + outline: none; + color: #ffffff; +} +.pp-rec-card-title { + font-size: 0.98rem; + font-weight: 300; + color: #e0e0e0; +} +.pp-rec-card-row:hover .pp-rec-card-title, +.pp-rec-card-row:focus .pp-rec-card-title { + color: #ffffff; + text-decoration: underline; +} +.pp-rec-card-meta { + display: flex; + align-items: center; + gap: 4px; + font-size: 0.85rem; + color: #b0b0b0; +} +.pp-rec-card-percent { + font-weight: 600; +} +.pp-rec-ai-badge { + position: absolute; + top: 8px; + right: 8px; + width: 22px; + height: 22px; + display: flex; + align-items: center; + justify-content: center; +} +.pp-rec-ai-badge svg { + display: block; +} +.pp-rec-list { + list-style: none; + padding: 0 0 0 6px; + margin: 0; +} +.pp-rec-list-item { + margin-bottom: 4px; +} +.pp-rec-list-link { + background: transparent; + border: none; + padding: 0; + margin: 0; + cursor: pointer; + color: #e0e0e0; + font-size: 0.98rem; + text-align: left; +} +.pp-rec-list-link:hover, +.pp-rec-list-link:focus { + color: #ffffff; + text-decoration: underline; +} + /* Layout for Search tab (chat): keep separator above and chat block pinned towards the bottom while chat history scrolls inside its own container */ .pp-tab-root.pp-tab-search { diff --git a/assets/dist/pp.css b/assets/dist/pp.css index 93f7d23..65502eb 100644 --- a/assets/dist/pp.css +++ b/assets/dist/pp.css @@ -1 +1 @@ -@font-face{font-display:swap;font-family:DM Sans;font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/dmsans/v15/rP2Hp2ywxg089UriCZOIHQ.woff2) format("woff2")}.pp-rec-skeleton{border-radius:8px;margin-bottom:16px;min-height:60px;overflow:hidden;padding:16px;position:relative}.pp-skeleton-synopsis,.pp-skeleton-title{animation:pp-skeleton-loading 1.2s linear infinite;background:#e0e0e0;border-radius:4px;height:18px;margin-bottom:8px;width:80%}.pp-skeleton-synopsis{height:14px;width:95%}@keyframes pp-skeleton-loading{0%{background-color:#303030}50%{background-color:#555}to{background-color:#303030}}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.pp-drawer-rec-synopsis{color:#999;display:block;font-size:.8rem;line-height:1.4;margin-bottom:4px;margin-top:2px;white-space:normal}.pp-drawer-rec-badge{background:#eee;border-radius:6px;color:#444;display:inline-block;font-size:.5rem;font-weight:600;letter-spacing:.02em;line-height:.6rem;margin-top:0;padding:2px 8px;text-transform:uppercase;vertical-align:middle}.pp-badge-conversion_path{background:#1976d2!important;color:#fff!important}.pp-badge-popular{background:#c58723!important;color:#fff!important}.pp-badge-related{background:#8e24aa!important;color:#fff!important}.pp-badge-newest{background:#0e7d15!important;color:#fff!important}.pp-drawer-content{display:flex;flex-direction:column;height:100%}.pp-drawer-footer,.pp-drawer-recommendations{flex-shrink:0}:root{--pp-drawer-handle-top:0.5rem}.pp-drawer{align-items:stretch;color:var(--pp-white,#fff);font-family:DM Sans,sans-serif!important;left:0;overflow:visible;position:fixed;transition:width .3s cubic-bezier(.4,0,.2,1);width:0;z-index:9999}.pp-drawer,.pp-drawer .pp-drawer-content{background:var(--pp-dark,#181818);display:flex;flex-direction:column;height:100vh;top:0}.pp-drawer .pp-drawer-content{box-sizing:border-box;left:-320px;overflow:hidden;padding:11px 20px 0 24px;pointer-events:none;position:absolute;width:320px}.pp-drawer.expanded{left:0;width:320px}.pp-drawer.expanded .pp-drawer-content{left:0;opacity:1;pointer-events:auto;position:relative;transition:left .3s cubic-bezier(.4,0,.2,1)}body .pp-drawer .pp-drawer-handle,body .pp-drawer button.pp-drawer-handle,body button.pp-drawer-handle{align-items:center;background:#232323;background-color:#232323;border:none;border-radius:12px;box-shadow:none;color:#fff;cursor:pointer;display:flex;font-family:inherit;font-size:1.2rem;font-weight:400;height:24px;justify-content:center;left:.5rem;line-height:1;margin:0;max-height:none;max-width:none;min-height:auto;min-width:auto;outline:none;padding:0;position:absolute;text-align:center;text-decoration:none;top:.5rem;transition:all .3s cubic-bezier(.4,0,.2,1);vertical-align:baseline;width:24px;z-index:10000}body .pp-drawer .pp-drawer-handle:focus{box-shadow:0 0 0 3px rgba(25,118,210,.3);outline:2px solid #1976d2}body .pp-drawer .pp-drawer-handle i,body .pp-drawer button.pp-drawer-handle i,body button.pp-drawer-handle i{background:none;border:none;color:#fff;font-size:1.1rem;font-weight:400;line-height:1;margin:0;padding:0;text-decoration:none}.pp-drawer-handle:after{background:#232323;border-radius:4px;color:#fff;content:"Need a hand? Click here for recommendations.";font-size:.9rem;left:100%;margin-left:10px;opacity:0;padding:8px 12px;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);transition:none;white-space:nowrap}.pp-drawer.minimized .pp-drawer-handle:hover:after{opacity:1;transition:opacity .2s ease .3s}body .pp-drawer.expanded .pp-drawer-handle,body .pp-drawer.expanded button.pp-drawer-handle{background:#232323;background-color:#232323;left:290px;opacity:1;transform:rotate(0deg)}.pp-drawer.expanded .pp-drawer-handle:after{opacity:0!important;visibility:hidden!important}body .pp-drawer.minimized .pp-drawer-handle,body .pp-drawer.minimized button.pp-drawer-handle{background:#232323;background-color:#232323;left:.5rem;top:.5rem;transform:rotate(-1turn)}.pp-drawer-title{color:var(--pp-lighter-text,#646970);font-size:.95rem;font-weight:700;letter-spacing:1.5px;margin-bottom:18px;text-transform:uppercase}.pp-drawer-rec-list{list-style:none;margin:0 0 24px;padding:0}.pp-drawer-rec-list li{align-items:flex-start;display:flex;flex-wrap:wrap;margin-bottom:20px}.pp-drawer-rec-title-row{align-items:flex-start;display:flex;flex-direction:column;margin-bottom:0}.pp-drawer-rec-title{color:#fff;flex-grow:1;font-size:.95rem;font-weight:600;line-height:1.3;margin:0}.pp-rec-meta{align-items:center;display:flex;flex-shrink:0;gap:4px;margin-bottom:4px}.pp-drawer-rec-percent{color:#888;flex-shrink:0;font-size:.6rem;font-weight:600;line-height:.7rem}.pp-drawer-footer{bottom:0;color:#aaa;font-size:11px;left:0;line-height:2rem;margin:0;opacity:.7;padding:0;pointer-events:auto;position:absolute;right:0;text-align:center;width:100%;z-index:1}body .pp-drawer .pp-drawer-footer a.pp-footer-link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:visited{color:#ccc;font-size:11px;opacity:.8;text-decoration:none;transition:color .2s}body .pp-drawer .pp-drawer-footer a.pp-footer-link:active,body .pp-drawer .pp-drawer-footer a.pp-footer-link:focus,body .pp-drawer .pp-drawer-footer a.pp-footer-link:hover{color:#fff;opacity:1;text-decoration:underline}.pp-drawer .pp-drawer-content{overflow-y:auto;padding-bottom:2rem}body.pp-drawer-open{margin-left:320px!important;transition:margin-left .3s cubic-bezier(.4,0,.2,1)}.pp-drawer.minimized{width:0!important}.pp-drawer.minimized .pp-drawer-content{opacity:0!important;pointer-events:none!important}.pp-drawer.minimized .pp-drawer-handle{left:.5rem;top:.5rem}@media (max-width:600px){.pp-drawer.expanded{background:hsla(0,0%,9%,.96);left:0;width:100vw}.pp-drawer.expanded .pp-drawer-handle{left:auto;right:.5rem}.pp-drawer.expanded .pp-drawer-content{background:transparent;left:0;width:100vw}body.pp-drawer-open{margin-left:0!important}}body .pp-drawer a:not(.pp-footer-link),body .pp-drawer a:not(.pp-footer-link):link,body .pp-drawer a:not(.pp-footer-link):visited{background:none;border:none;color:#ddd;text-decoration:underline}body .pp-drawer a:not(.pp-footer-link):active,body .pp-drawer a:not(.pp-footer-link):focus,body .pp-drawer a:not(.pp-footer-link):hover{background:none;color:#fff;text-decoration:underline}@keyframes pp-beacon-pulse{0%{box-shadow:0 0 0 0 rgba(25,118,210,.5)}70%{box-shadow:0 0 0 12px rgba(25,118,210,0)}to{box-shadow:0 0 0 0 rgba(25,118,210,0)}}.pp-drawer-handle.pp-beacon{animation:pp-beacon-pulse 1.2s infinite}.pp-content-types-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.pp-content-type-item{background:#f9f9f9;border:2px solid #e0e0e0;border-radius:6px;padding:12px 14px;transition:all .2s ease}.pp-content-type-item:hover{background:#f0f8ff;border-color:#1976d2}.pp-content-type-item input[type=checkbox]:checked+div{color:#1976d2;font-weight:600}.pp-content-type-item input[type=checkbox]:checked{accent-color:#1976d2}.pp-content-types-section .pp-home-protip{margin-bottom:12px}.pp-sidebar{align-items:stretch;background:#212426;color:var(--pp-white,#fff);display:flex;flex-direction:row;font-family:DM Sans,sans-serif!important;height:100vh;left:0;overflow:hidden;position:fixed;top:0;transition:width .38s cubic-bezier(.25,.8,.25,1),box-shadow .38s cubic-bezier(.25,.8,.25,1);width:48px;z-index:9999}.pp-sidebar.expanded{width:368px}.pp-sidebar.collapsed{width:48px}.pp-sidebar-inner{background:#212426;flex-direction:column;flex-shrink:0;gap:4px;padding:8px 0}.pp-sidebar-brand,.pp-sidebar-inner{align-items:center;display:flex;width:48px}.pp-sidebar-brand{appearance:none;background:transparent;border:none;color:#fff;cursor:pointer;font-size:1.2rem;height:34px;justify-content:center;margin:0;padding:0}.pp-sidebar-nav{display:flex;flex-direction:column;gap:2px;width:100%}.pp-sidebar-nav .pp-nav-btn{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;gap:10px;height:44px;justify-content:center;position:relative;text-align:left;transition:background .15s ease,color .15s ease;width:48px}.pp-sidebar-nav .pp-nav-btn i{color:inherit;font-size:1.1rem}.pp-sidebar-nav .pp-nav-btn svg.pp-icon{flex-shrink:0;height:20px;width:20px}.pp-sidebar-nav .pp-nav-btn span{color:inherit;display:none;font-size:.92rem}.pp-sidebar-nav .pp-nav-btn.is-active,.pp-sidebar-nav .pp-nav-btn:hover{color:#fff}.pp-sidebar-nav .pp-nav-btn:before{background:transparent;border-radius:2px;bottom:8px;content:"";left:0;position:absolute;top:8px;width:2px}.pp-sidebar-nav .pp-nav-btn.is-active:before{background:#fff}.pp-sidebar-nav .pp-collapse{margin-top:auto}.pp-sidebar-content{background:#282a2c;color:#fff;display:flex;flex-direction:column;height:100vh;opacity:0;overflow-y:hidden;padding:12px 20px 0;pointer-events:none;position:relative;transform:translateX(-24px);transition:opacity .38s cubic-bezier(.25,.8,.25,1) 40ms,transform .38s cubic-bezier(.25,.8,.25,1) 40ms;width:320px}.pp-sidebar.expanded .pp-sidebar-content{opacity:1;pointer-events:auto;transform:translateX(0)}.pp-tab-root{flex:1 1 auto}.pp-tab-root.pp-tab-recommendations{overflow-y:auto}.pp-tab-root.pp-tab-search{display:flex;flex-direction:column;height:100%}.pp-tab-root.pp-tab-search .pp-drawer-chat{margin-bottom:16px;margin-top:auto}.pp-panel-close{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;height:32px;justify-content:center;position:absolute;right:8px;top:8px;width:32px}.pp-panel-close svg.pp-icon{height:20px;width:20px}.pp-panel-close:hover{color:#fff}body.pp-sidebar-present{margin-left:48px!important}body.pp-sidebar-open,body.pp-sidebar-present{transition:margin-left .38s cubic-bezier(.25,.8,.25,1)}body.pp-sidebar-open{margin-left:376px!important}@media (max-width:600px){.pp-sidebar.expanded{width:100vw}.pp-sidebar.expanded .pp-sidebar-content{width:calc(100vw - 48px)}body.pp-sidebar-open,body.pp-sidebar-present{margin-left:0!important}} \ No newline at end of file +@font-face{font-display:swap;font-family:DM Sans;font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/dmsans/v15/rP2Hp2ywxg089UriCZOIHQ.woff2) format("woff2")}.pp-rec-skeleton{border-radius:8px;margin-bottom:16px;min-height:60px;overflow:hidden;padding:16px;position:relative}.pp-skeleton-synopsis,.pp-skeleton-title{animation:pp-skeleton-loading 1.2s linear infinite;background:#e0e0e0;border-radius:4px;height:18px;margin-bottom:8px;width:80%}.pp-skeleton-synopsis{height:14px;width:95%}@keyframes pp-skeleton-loading{0%{background-color:#303030}50%{background-color:#555}to{background-color:#303030}}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.pp-drawer-rec-synopsis{color:#999;display:block;font-size:.8rem;line-height:1.4;margin-bottom:4px;margin-top:2px;white-space:normal}.pp-drawer-rec-badge{background:#eee;border-radius:6px;color:#444;display:inline-block;font-size:.5rem;font-weight:600;letter-spacing:.02em;line-height:.6rem;margin-top:0;padding:2px 8px;text-transform:uppercase;vertical-align:middle}.pp-badge-conversion_path{background:#1976d2!important;color:#fff!important}.pp-badge-popular{background:#c58723!important;color:#fff!important}.pp-badge-related{background:#8e24aa!important;color:#fff!important}.pp-badge-newest{background:#0e7d15!important;color:#fff!important}.pp-drawer-content{display:flex;flex-direction:column;height:100%}.pp-drawer-footer,.pp-drawer-recommendations{flex-shrink:0}:root{--pp-drawer-handle-top:0.5rem}.pp-drawer{align-items:stretch;color:var(--pp-white,#fff);font-family:DM Sans,sans-serif!important;left:0;overflow:visible;position:fixed;transition:width .3s cubic-bezier(.4,0,.2,1);width:0;z-index:9999}.pp-drawer,.pp-drawer .pp-drawer-content{background:var(--pp-dark,#181818);display:flex;flex-direction:column;height:100vh;top:0}.pp-drawer .pp-drawer-content{box-sizing:border-box;left:-320px;overflow:hidden;padding:11px 20px 0 24px;pointer-events:none;position:absolute;width:320px}.pp-drawer.expanded{left:0;width:320px}.pp-drawer.expanded .pp-drawer-content{left:0;opacity:1;pointer-events:auto;position:relative;transition:left .3s cubic-bezier(.4,0,.2,1)}body .pp-drawer .pp-drawer-handle,body .pp-drawer button.pp-drawer-handle,body button.pp-drawer-handle{align-items:center;background:#232323;background-color:#232323;border:none;border-radius:12px;box-shadow:none;color:#fff;cursor:pointer;display:flex;font-family:inherit;font-size:1.2rem;font-weight:400;height:24px;justify-content:center;left:.5rem;line-height:1;margin:0;max-height:none;max-width:none;min-height:auto;min-width:auto;outline:none;padding:0;position:absolute;text-align:center;text-decoration:none;top:.5rem;transition:all .3s cubic-bezier(.4,0,.2,1);vertical-align:baseline;width:24px;z-index:10000}body .pp-drawer .pp-drawer-handle:focus{box-shadow:0 0 0 3px rgba(25,118,210,.3);outline:2px solid #1976d2}body .pp-drawer .pp-drawer-handle i,body .pp-drawer button.pp-drawer-handle i,body button.pp-drawer-handle i{background:none;border:none;color:#fff;font-size:1.1rem;font-weight:400;line-height:1;margin:0;padding:0;text-decoration:none}.pp-drawer-handle:after{background:#232323;border-radius:4px;color:#fff;content:"Need a hand? Click here for recommendations.";font-size:.9rem;left:100%;margin-left:10px;opacity:0;padding:8px 12px;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);transition:none;white-space:nowrap}.pp-drawer.minimized .pp-drawer-handle:hover:after{opacity:1;transition:opacity .2s ease .3s}body .pp-drawer.expanded .pp-drawer-handle,body .pp-drawer.expanded button.pp-drawer-handle{background:#232323;background-color:#232323;left:290px;opacity:1;transform:rotate(0deg)}.pp-drawer.expanded .pp-drawer-handle:after{opacity:0!important;visibility:hidden!important}body .pp-drawer.minimized .pp-drawer-handle,body .pp-drawer.minimized button.pp-drawer-handle{background:#232323;background-color:#232323;left:.5rem;top:.5rem;transform:rotate(-1turn)}.pp-drawer-title{color:var(--pp-lighter-text,#646970);font-size:.95rem;font-weight:700;letter-spacing:1.5px;margin-bottom:18px;text-transform:uppercase}.pp-drawer-rec-list{list-style:none;margin:0 0 24px;padding:0}.pp-rec-meta{align-items:center;display:flex;flex-shrink:0;gap:4px;margin-bottom:4px}.pp-drawer-rec-percent{color:#888;flex-shrink:0;font-size:.6rem;font-weight:600;line-height:.7rem}.pp-drawer-footer{bottom:0;color:#aaa;font-size:11px;left:0;line-height:2rem;margin:0;opacity:.7;padding:0;pointer-events:auto;position:absolute;right:0;text-align:center;width:100%;z-index:1}body .pp-drawer .pp-drawer-footer a.pp-footer-link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:visited{color:#ccc;font-size:11px;opacity:.8;text-decoration:none;transition:color .2s}body .pp-drawer .pp-drawer-footer a.pp-footer-link:active,body .pp-drawer .pp-drawer-footer a.pp-footer-link:focus,body .pp-drawer .pp-drawer-footer a.pp-footer-link:hover{color:#fff;opacity:1;text-decoration:underline}.pp-drawer .pp-drawer-content{overflow-y:auto;padding-bottom:2rem}body.pp-drawer-open{margin-left:320px!important;transition:margin-left .3s cubic-bezier(.4,0,.2,1)}.pp-drawer.minimized{width:0!important}.pp-drawer.minimized .pp-drawer-content{opacity:0!important;pointer-events:none!important}.pp-drawer.minimized .pp-drawer-handle{left:.5rem;top:.5rem}@media (max-width:600px){.pp-drawer.expanded{background:hsla(0,0%,9%,.96);left:0;width:100vw}.pp-drawer.expanded .pp-drawer-handle{left:auto;right:.5rem}.pp-drawer.expanded .pp-drawer-content{background:transparent;left:0;width:100vw}body.pp-drawer-open{margin-left:0!important}}body .pp-drawer a:not(.pp-footer-link),body .pp-drawer a:not(.pp-footer-link):link,body .pp-drawer a:not(.pp-footer-link):visited{background:none;border:none;color:#ddd;text-decoration:underline}body .pp-drawer a:not(.pp-footer-link):active,body .pp-drawer a:not(.pp-footer-link):focus,body .pp-drawer a:not(.pp-footer-link):hover{background:none;color:#fff;text-decoration:underline}@keyframes pp-beacon-pulse{0%{box-shadow:0 0 0 0 rgba(25,118,210,.5)}70%{box-shadow:0 0 0 12px rgba(25,118,210,0)}to{box-shadow:0 0 0 0 rgba(25,118,210,0)}}.pp-drawer-handle.pp-beacon{animation:pp-beacon-pulse 1.2s infinite}.pp-content-types-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.pp-content-type-item{background:#f9f9f9;border:2px solid #e0e0e0;border-radius:6px;padding:12px 14px;transition:all .2s ease}.pp-content-type-item:hover{background:#f0f8ff;border-color:#1976d2}.pp-content-type-item input[type=checkbox]:checked+div{color:#1976d2;font-weight:600}.pp-content-type-item input[type=checkbox]:checked{accent-color:#1976d2}.pp-content-types-section .pp-home-protip{margin-bottom:12px}.pp-sidebar{align-items:stretch;background:#212426;color:var(--pp-white,#fff);display:flex;flex-direction:row;font-family:DM Sans,sans-serif!important;height:100vh;left:0;overflow:hidden;position:fixed;top:0;transition:width .38s cubic-bezier(.25,.8,.25,1),box-shadow .38s cubic-bezier(.25,.8,.25,1);width:48px;z-index:9999}.pp-sidebar.expanded{width:368px}.pp-sidebar.collapsed{width:48px}.pp-sidebar-inner{background:#212426;flex-direction:column;flex-shrink:0;gap:4px;padding:8px 0}.pp-sidebar-brand,.pp-sidebar-inner{align-items:center;display:flex;width:48px}.pp-sidebar-brand{appearance:none;background:transparent;border:none;color:#fff;cursor:pointer;font-size:1.2rem;height:34px;justify-content:center;margin:0;padding:0}.pp-sidebar-nav{display:flex;flex-direction:column;gap:2px;width:100%}.pp-sidebar-nav .pp-nav-btn{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;gap:10px;height:44px;justify-content:center;position:relative;text-align:left;transition:background .15s ease,color .15s ease;width:48px}.pp-sidebar-nav .pp-nav-btn i{color:inherit;font-size:1.1rem}.pp-sidebar-nav .pp-nav-btn svg.pp-icon{flex-shrink:0;height:20px;width:20px}.pp-sidebar-nav .pp-nav-btn span{color:inherit;display:none;font-size:.92rem}.pp-sidebar-nav .pp-nav-btn.is-active,.pp-sidebar-nav .pp-nav-btn:hover{color:#fff}.pp-sidebar-nav .pp-nav-btn:before{background:transparent;border-radius:2px;bottom:8px;content:"";left:0;position:absolute;top:8px;width:2px}.pp-sidebar-nav .pp-nav-btn.is-active:before{background:#fff}.pp-sidebar-nav .pp-collapse{margin-top:auto}.pp-sidebar-content{background:#282a2c;color:#fff;display:flex;flex-direction:column;height:100vh;opacity:0;overflow-y:hidden;padding:12px 14px 0;pointer-events:none;position:relative;transform:translateX(-24px);transition:opacity .38s cubic-bezier(.25,.8,.25,1) 40ms,transform .38s cubic-bezier(.25,.8,.25,1) 40ms;width:320px}.pp-sidebar.expanded .pp-sidebar-content{opacity:1;pointer-events:auto;transform:translateX(0)}.pp-tab-root{flex:1 1 auto}.pp-tab-root.pp-tab-recommendations{overflow-y:auto}.pp-summary-body{color:#ddd;font-size:.95rem;line-height:1.5;margin-bottom:16px}.pp-summary-page-title{color:#fff;font-size:1.05rem;font-weight:600;margin-bottom:10px}.pp-summary-body p{margin:0 0 10px}.pp-summary-body a,.pp-summary-body a:link,.pp-summary-body a:visited{color:#ddd;text-decoration:underline}.pp-summary-body a:focus,.pp-summary-body a:hover{color:#fff}.pp-summary-related-title{color:#888;font-size:.8rem;letter-spacing:1.2px;margin-bottom:6px;text-transform:uppercase}.pp-summary-related-list{list-style:none;margin:0;padding:0}.pp-summary-related-list li{margin-bottom:4px}.pp-summary-related-list a{color:#ddd;text-decoration:underline}.pp-summary-related-list a:focus,.pp-summary-related-list a:hover{color:#fff}.pp-rec-layout{display:flex;flex-direction:column;gap:32px}.pp-rec-layout-header{color:#bbb;font-size:.9rem;font-weight:700;letter-spacing:1.4px;text-transform:uppercase}.pp-rec-group{display:flex;flex-direction:column;gap:10px}.pp-rec-group-suggested{background:#363636;border-radius:6px;padding:12px 6px 10px;position:relative}.pp-rec-group-title{color:#888;font-size:.75rem;font-weight:400;padding-left:6px}.pp-rec-card-row{align-items:center;background:transparent;border:none;color:#f5f5f5;cursor:pointer;display:flex;justify-content:space-between;padding:0;text-align:left;width:100%}.pp-rec-card-row:focus,.pp-rec-card-row:hover{color:#fff;outline:none}.pp-rec-card-title{color:#e0e0e0;font-size:.98rem;font-weight:300}.pp-rec-card-row:focus .pp-rec-card-title,.pp-rec-card-row:hover .pp-rec-card-title{color:#fff;text-decoration:underline}.pp-rec-card-meta{align-items:center;color:#b0b0b0;display:flex;font-size:.85rem;gap:4px}.pp-rec-card-percent{font-weight:600}.pp-rec-ai-badge{align-items:center;display:flex;height:22px;justify-content:center;position:absolute;right:8px;top:8px;width:22px}.pp-rec-ai-badge svg{display:block}.pp-rec-list{list-style:none;margin:0;padding:0 0 0 6px}.pp-rec-list-item{margin-bottom:4px}.pp-rec-list-link{background:transparent;border:none;color:#e0e0e0;cursor:pointer;font-size:.98rem;margin:0;padding:0;text-align:left}.pp-rec-list-link:focus,.pp-rec-list-link:hover{color:#fff;text-decoration:underline}.pp-tab-root.pp-tab-search{display:flex;flex-direction:column;height:100%}.pp-tab-root.pp-tab-search .pp-drawer-chat{margin-bottom:16px;margin-top:auto}.pp-panel-close{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;height:32px;justify-content:center;position:absolute;right:8px;top:8px;width:32px}.pp-panel-close svg.pp-icon{height:20px;width:20px}.pp-panel-close:hover{color:#fff}body.pp-sidebar-present{margin-left:48px!important}body.pp-sidebar-open,body.pp-sidebar-present{transition:margin-left .38s cubic-bezier(.25,.8,.25,1)}body.pp-sidebar-open{margin-left:376px!important}@media (max-width:600px){.pp-sidebar.expanded{width:100vw}.pp-sidebar.expanded .pp-sidebar-content{width:calc(100vw - 48px)}body.pp-sidebar-open,body.pp-sidebar-present{margin-left:0!important}} \ No newline at end of file diff --git a/assets/dist/pp.js b/assets/dist/pp.js index f37ac84..da11b8d 100644 --- a/assets/dist/pp.js +++ b/assets/dist/pp.js @@ -1 +1 @@ -!function(){"use strict";!function(){function e(e){switch(e){case"compass":return'';case"info":return'';case"search":return'';case"dockRight":return'';default:return""}}document.addEventListener("DOMContentLoaded",function(){!function(){if(window.PathPilotStatus&&!0===window.PathPilotStatus.insights_only)return void console.log("Path Pilot: Insights only mode enabled - skipping drawer initialization");if(!document.querySelector('link[href*="path-pilot-icons.css"]')){var t=document.createElement("link");t.rel="stylesheet",t.href=window.PathPilotStatus&&window.PathPilotStatus.icon_css_url||"/wp-content/plugins/path-pilot/assets/css/path-pilot-icons.css",document.head.appendChild(t)}let n=window.PathPilotStatus?window.PathPilotStatus.nonce:null;function o(){return fetch("/wp-json/path-pilot/v1/nonce").then(e=>e.json()).then(e=>(e.nonce&&(n=e.nonce),n)).catch(()=>n)}async function a(e,t){const a=n=>{const o={...t.headers,"X-WP-Nonce":n};return fetch(e,{...t,headers:o})};let i=await a(n);if(403===i.status){const e=await o();i=await a(e)}return i}o();let i=!1,s=null;const c="path_pilot_drawer_state";function r(){try{const e=window.localStorage?localStorage.getItem(c):null;return e?JSON.parse(e):null}catch(e){return null}}function l(){try{if(!window.localStorage)return;const e={open:i,tab:s||null};localStorage.setItem(c,JSON.stringify(e))}catch(e){}}const d=[{id:"recommendations",label:"Recommendations",icon:"compass"},{id:"summary",label:"Page summary",icon:"info"},{id:"search",label:"Search",icon:"search"}],p=document.createElement("div");p.id="path-pilot-sidebar",p.className="pp-sidebar collapsed",p.setAttribute("role","complementary"),p.setAttribute("aria-label","Path Pilot panel"),p.setAttribute("aria-hidden","true"),document.body.appendChild(p),document.body.classList.add("pp-sidebar-present");const u=document.createElement("div");u.className="pp-sidebar-inner",p.appendChild(u);const h=document.createElement("button");h.type="button",h.className="pp-sidebar-brand",h.innerHTML='',h.setAttribute("title","Path Pilot"),h.setAttribute("aria-label","Open Path Pilot website"),h.addEventListener("click",function(){try{window.open("https://pathpilot.app","_blank","noopener,noreferrer")}catch(e){window.location.href="https://pathpilot.app"}}),u.appendChild(h);const m=document.createElement("nav");m.className="pp-sidebar-nav",m.setAttribute("aria-label","Path Pilot navigation"),u.appendChild(m);const b=document.createElement("div");b.className="pp-sidebar-content",p.appendChild(b);const f=document.createElement("button");f.type="button",f.className="pp-panel-close",f.setAttribute("aria-label","Close Path Pilot panel"),f.innerHTML=e("dockRight"),b.appendChild(f);const w=document.createElement("div");w.className="pp-drawer-title",w.textContent="Recommendations",b.appendChild(w);const y=document.createElement("div");y.className="pp-tab-root pp-tab-recommendations";const v=document.createElement("ul");v.className="pp-drawer-rec-list",y.appendChild(v),b.appendChild(y);const g=document.createElement("div");g.className="pp-tab-root pp-tab-summary",g.style.display="none",b.appendChild(g);const C=document.createElement("div");C.className="pp-tab-root pp-tab-search",C.style.display="none",b.appendChild(C);const P={recommendations:y,summary:g,search:C},E=d.map(t=>{const n=document.createElement("button");return n.type="button",n.className="pp-nav-btn",n.setAttribute("data-view",t.id),n.setAttribute("title",t.label),n.setAttribute("aria-label",t.label),n.innerHTML=e(t.icon),m.appendChild(n),{...t,button:n,section:P[t.id]||null}});function k(e){v.innerHTML="",e&&0!==e.length?e.forEach(function(e){const t=document.createElement("li"),n=document.createElement("div");n.className="pp-drawer-rec-title-row";const o=document.createElement("div");if(o.className="pp-rec-meta",e.badge){const t=document.createElement("span");t.className="pp-drawer-rec-badge pp-badge-"+e.badge,"conversion_path"===e.badge?t.textContent="Recommended":"popular"===e.badge?t.textContent="Popular":"related"===e.badge?t.textContent="Related":"newest"===e.badge&&(t.textContent="Newest"),o.appendChild(t)}if(e.score&&e.score>0){const t=document.createElement("span");t.className="pp-drawer-rec-percent",t.textContent=Math.round(e.score)+"%",o.appendChild(t)}o.children.length>0&&n.appendChild(o);const i=document.createElement("span");if(i.className="pp-drawer-rec-title",i.textContent=e.title,n.appendChild(i),t.appendChild(n),e.synopsis){const n=document.createElement("div");n.className="pp-drawer-rec-synopsis",n.textContent=e.synopsis,t.appendChild(n)}t.style.cursor="pointer",t.addEventListener("click",function(){if(void 0!==e.page_id){const t=(document.cookie.match(/path_pilot_sid=([^;]+)/)||[])[1]||"";a("/wp-json/path-pilot/v1/rec-click",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({session_id:t,page_id:e.page_id})})}window.location.href=e.url}),v.appendChild(t)}):v.innerHTML='
  • No recommendations yet.
  • '}function N(e=3){const t=b.querySelector(".pp-drawer-rec-list");if(t){t.innerHTML="";for(let n=0;n\n
    \n
    \n
    \n \n '}}function x(){N(3),a("/wp-json/path-pilot/v1/suggest",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({current:window.location.pathname,history:JSON.parse(sessionStorage.getItem("path_pilot_history")||"[]")})}).then(e=>e.json()).then(e=>{console.log("Path Pilot: Received recommendations data:",e),e&&e.recommendations?k(e.recommendations):(console.warn("Path Pilot: No recommendations in response"),k([]))}).catch(e=>{console.error("Path Pilot: Error fetching recommendations:",e),k([])})}function S(e){const t=b.querySelector(".pp-drawer-title");t&&(t.textContent=e)}function L(){i||(i=!0,p.classList.remove("collapsed"),p.classList.add("expanded"),p.setAttribute("aria-hidden","false"),document.body.classList.add("pp-sidebar-open"),b.dataset.loaded||(x(),b.dataset.loaded="1"),l())}function _(){if(i){try{const e=document.activeElement;if(e&&p.contains(e)){const e=p.querySelector(".pp-sidebar-brand")||document.body;e&&"function"==typeof e.focus&&e.focus()}}catch(e){}i=!1,p.classList.remove("expanded"),p.classList.add("collapsed"),p.setAttribute("aria-hidden","true"),document.body.classList.remove("pp-sidebar-open"),s=null,l()}}function A(e){s=e,E.forEach(t=>{const n=t.id===e;t.button&&t.button.classList.toggle("is-active",n),t.section&&(t.section.style.display=n?"":"none")});const t=E.find(t=>t.id===e);t&&S(t.label)}function T(e){if(!i)return A(e.id),void L();A(e.id),l()}E.forEach(e=>{e.button&&e.button.addEventListener("click",function(){T(e)})}),f.addEventListener("click",function(){_()}),document.addEventListener("keydown",function(e){"Escape"===e.key&&_()});const M=r();if(M&&M.open){const e=E.length?E[0].id:null,t=M.tab&&E.some(e=>e.id===M.tab)?M.tab:e;t&&(A(t),L())}}()})}()}(); +!function(){"use strict";!function(){function e(e){switch(e){case"compass":return'';case"info":return'';case"search":return'';case"dockRight":return'';default:return""}}document.addEventListener("DOMContentLoaded",function(){!function(){if(window.PathPilotStatus&&!0===window.PathPilotStatus.insights_only)return void console.log("Path Pilot: Insights only mode enabled - skipping drawer initialization");if(!document.querySelector('link[href*="path-pilot-icons.css"]')){var t=document.createElement("link");t.rel="stylesheet",t.href=window.PathPilotStatus&&window.PathPilotStatus.icon_css_url||"/wp-content/plugins/path-pilot/assets/css/path-pilot-icons.css",document.head.appendChild(t)}let n=window.PathPilotStatus?window.PathPilotStatus.nonce:null;function a(){return fetch("/wp-json/path-pilot/v1/nonce").then(e=>e.json()).then(e=>(e.nonce&&(n=e.nonce),n)).catch(()=>n)}async function o(e,t){const o=n=>{const a={...t.headers,"X-WP-Nonce":n};return fetch(e,{...t,headers:a})};let i=await o(n);if(403===i.status){const e=await a();i=await o(e)}return i}a();let i=!1,s=null;const r="path_pilot_drawer_state";function l(){try{const e=window.localStorage?localStorage.getItem(r):null;return e?JSON.parse(e):null}catch(e){return null}}function c(){try{if(!window.localStorage)return;const e={open:i,tab:s||null};localStorage.setItem(r,JSON.stringify(e))}catch(e){}}const d=[{id:"recommendations",label:"Site navigation",icon:"compass"},{id:"summary",label:"Page summary",icon:"info"},{id:"search",label:"Search",icon:"search"}],p=document.createElement("div");p.id="path-pilot-sidebar",p.className="pp-sidebar collapsed",p.setAttribute("role","complementary"),p.setAttribute("aria-label","Path Pilot panel"),p.setAttribute("aria-hidden","true"),document.body.appendChild(p),document.body.classList.add("pp-sidebar-present");const u=document.createElement("div");u.className="pp-sidebar-inner",p.appendChild(u);const m=document.createElement("button");m.type="button",m.className="pp-sidebar-brand",m.innerHTML='',m.setAttribute("title","Path Pilot"),m.setAttribute("aria-label","Open Path Pilot website"),m.addEventListener("click",function(){try{window.open("https://pathpilot.app","_blank","noopener,noreferrer")}catch(e){window.location.href="https://pathpilot.app"}}),u.appendChild(m);const h=document.createElement("nav");h.className="pp-sidebar-nav",h.setAttribute("aria-label","Path Pilot navigation"),u.appendChild(h);const f=document.createElement("div");f.className="pp-sidebar-content",p.appendChild(f);const y=document.createElement("button");y.type="button",y.className="pp-panel-close",y.setAttribute("aria-label","Close Path Pilot panel"),y.innerHTML=e("dockRight"),f.appendChild(y);const g=document.createElement("div");g.className="pp-drawer-title",g.textContent="Site navigation",f.appendChild(g);const w=document.createElement("div");w.className="pp-tab-root pp-tab-recommendations",f.appendChild(w);const v=document.createElement("div");v.className="pp-tab-root pp-tab-summary",v.style.display="none",f.appendChild(v);const b=document.createElement("div");b.className="pp-tab-root pp-tab-search",b.style.display="none",f.appendChild(b);const C={recommendations:w,summary:v,search:b},S=d.map(t=>{const n=document.createElement("button");return n.type="button",n.className="pp-nav-btn",n.setAttribute("data-view",t.id),n.setAttribute("title",t.label),n.setAttribute("aria-label",t.label),n.innerHTML=e(t.icon),h.appendChild(n),{...t,button:n,section:C[t.id]||null}});function E(){if("undefined"==typeof window||!window.localStorage)return[];try{const e=localStorage.getItem("path_pilot_recent_pages");if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch(e){return[]}}function N(){if("undefined"==typeof window||!window.localStorage)return;const e=window.location.pathname||"",t=window.location.href||e||"",n=document.title||t||e||"";let a=E().filter(t=>t.path!==e);a.unshift({path:e,url:t,title:n}),a.length>3&&(a=a.slice(0,3));try{localStorage.setItem("path_pilot_recent_pages",JSON.stringify(a))}catch(e){}}function P(e){return function(t){if(t&&"function"==typeof t.preventDefault&&t.preventDefault(),void 0!==e.page_id){const t=(document.cookie.match(/path_pilot_sid=([^;]+)/)||[])[1]||"";o("/wp-json/path-pilot/v1/rec-click",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({session_id:t,page_id:e.page_id})})}window.location.href=e.url}}function _(e,t){const n=!t||!1!==t.showScore,a=document.createElement("a");a.className="pp-rec-card-row",e.url&&(a.href=e.url);const o=document.createElement("div");o.className="pp-rec-card-title",o.textContent=e.title,a.appendChild(o);const i=document.createElement("div");if(i.className="pp-rec-card-meta",n&&e.score&&e.score>0){const t=document.createElement("span");t.className="pp-rec-card-percent",t.textContent=Math.round(e.score)+"%",i.appendChild(t)}return a.appendChild(i),a.addEventListener("click",P(e)),a}function k(e,t){const n=document.createElement("li");n.className="pp-rec-list-item";const a=_(e,t);return n.appendChild(a),n}function L(e){if(w.innerHTML="",!e||0===e.length)return void(w.innerHTML='
    No recommendations yet.
    ');const t=document.createElement("div");t.className="pp-rec-layout",w.appendChild(t);const n=e.filter(e=>"conversion_path"===e.badge),a=e.filter(e=>"popular"===e.badge);e.filter(e=>"related"===e.badge);const o=e.filter(e=>"newest"===e.badge);function i(t,n,a){return t.length?t:e.slice(n,a)}const s=i(n,0,3),r=i(a,0,3),l=i(o,6,9),c=window.location&&window.location.pathname?window.location.pathname:"",d=E().filter(e=>e.path!==c);function p(e,n,a={}){if(!n||!n.length)return;const o=document.createElement("section");o.className="pp-rec-group",a.isSuggested&&o.classList.add("pp-rec-group-suggested");const i=document.createElement("div");if(i.className="pp-rec-group-title",i.textContent=e,o.appendChild(i),a.isSuggested){const e=document.createElement("div");e.className="pp-rec-ai-badge",e.innerHTML='',o.appendChild(e)}const s=document.createElement("ul");s.className="pp-rec-list",n.forEach(e=>{s.appendChild(k(e,{showScore:!!a.isSuggested}))}),o.appendChild(s),t.appendChild(o)}p("Suggested Next",s,{isSuggested:!0}),p("Most Popular",r),p("Recently Visited",d),p("Trending",l)}function x(e=3){w.innerHTML="";const t=document.createElement("div");t.className="pp-rec-skeleton-wrap";for(let n=0;n\n
    \n
    \n
    \n \n ';w.appendChild(t)}function T(){x(3),o("/wp-json/path-pilot/v1/suggest",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({current:window.location.pathname,history:JSON.parse(sessionStorage.getItem("path_pilot_history")||"[]")})}).then(e=>e.json()).then(e=>{console.log("Path Pilot: Received recommendations data:",e),e&&e.recommendations?L(e.recommendations):(console.warn("Path Pilot: No recommendations in response"),L([]))}).catch(e=>{console.error("Path Pilot: Error fetching recommendations:",e),L([])})}N();let A=!1;function M(e=3){v.innerHTML="";for(let t=0;t\n
    \n
    \n
    \n \n '}async function H(){if(A)return;A=!0;const e="path_pilot_summary_"+window.location.pathname;try{if(window.localStorage){const t=localStorage.getItem(e);if(t){const e=JSON.parse(t),n=864e5;if(e&&e.timestamp&&Date.now()-e.timestampRelated pages\n \n `,v.appendChild(t)}return}}}}catch(e){}M(3);try{const t=await fetch("/wp-json/path-pilot/v1/summary",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({path:window.location.pathname})}),n=await t.json();v.innerHTML="";const a=document.createElement("div");if(a.className="pp-summary-page-title",a.textContent=document.title||"",v.appendChild(a),!n||n.error)return void(v.innerHTML=`
    ${n&&n.error||"Unable to load summary."}
    `);const o=document.createElement("div");if(o.className="pp-summary-body",o.innerHTML=n.summary_html,v.appendChild(o),Array.isArray(n.related_pages)&&n.related_pages.length){const e=document.createElement("div");e.className="pp-summary-related",e.innerHTML=`\n \n \n `,v.appendChild(e)}try{window.localStorage&&localStorage.setItem(e,JSON.stringify({timestamp:Date.now(),summary_html:n.summary_html,related_pages:n.related_pages||[]}))}catch(e){}}catch(e){console.error("Path Pilot: Error loading page summary:",e),v.innerHTML='
    Error loading summary.
    '}}function O(e){const t=f.querySelector(".pp-drawer-title");t&&(t.textContent=e)}function j(){i||(i=!0,p.classList.remove("collapsed"),p.classList.add("expanded"),p.setAttribute("aria-hidden","false"),document.body.classList.add("pp-sidebar-open"),f.dataset.loaded||(T(),f.dataset.loaded="1"),c())}function J(){if(i){try{const e=document.activeElement;if(e&&p.contains(e)){const e=p.querySelector(".pp-sidebar-brand")||document.body;e&&"function"==typeof e.focus&&e.focus()}}catch(e){}i=!1,p.classList.remove("expanded"),p.classList.add("collapsed"),p.setAttribute("aria-hidden","true"),document.body.classList.remove("pp-sidebar-open"),s=null,c()}}function I(e){s=e,S.forEach(t=>{const n=t.id===e;t.button&&t.button.classList.toggle("is-active",n),t.section&&(t.section.style.display=n?"":"none")});const t=S.find(t=>t.id===e);t&&O(t.label)}function $(e){if(!i)return I(e.id),"summary"===e.id&&H(),void j();I(e.id),"summary"===e.id&&H(),c()}S.forEach(e=>{e.button&&e.button.addEventListener("click",function(){$(e)})}),y.addEventListener("click",function(){J()}),document.addEventListener("keydown",function(e){"Escape"===e.key&&J()});const R=l();if(R&&R.open){const e=S.length?S[0].id:null,t=R.tab&&S.some(e=>e.id===R.tab)?R.tab:e;t&&(I(t),j(),"summary"===t&&H())}}()})}()}(); diff --git a/scripts/index.js b/scripts/index.js index 42880e0..9b19c59 100644 --- a/scripts/index.js +++ b/scripts/index.js @@ -129,7 +129,7 @@ const TAB_DEFS = [ { id: 'recommendations', - label: 'Recommendations', + label: 'Site navigation', icon: 'compass', }, { @@ -199,16 +199,13 @@ // Panel header title (changes with active tab) const panelHeader = document.createElement('div'); panelHeader.className = 'pp-drawer-title'; - panelHeader.textContent = 'Recommendations'; + panelHeader.textContent = 'Site navigation'; panel.appendChild(panelHeader); // --- Tab content containers --- // Recommendations (Dynamic) const recSection = document.createElement('div'); recSection.className = 'pp-tab-root pp-tab-recommendations'; - const recList = document.createElement('ul'); - recList.className = 'pp-drawer-rec-list'; - recSection.appendChild(recList); panel.appendChild(recSection); // Page summary tab root (content managed by its controller / plugin) @@ -250,91 +247,176 @@ // --- Recommendations Logic --- + // Client-side tracking of recently visited pages (last 3 distinct) + function getRecentPageHistory() { + if (typeof window === 'undefined' || !window.localStorage) return []; + try { + const raw = localStorage.getItem('path_pilot_recent_pages'); + if (!raw) return []; + const parsed = JSON.parse(raw); + return Array.isArray(parsed) ? parsed : []; + } catch (e) { + return []; + } + } + + function recordCurrentPageInHistory() { + if (typeof window === 'undefined' || !window.localStorage) return; + const path = window.location.pathname || ''; + const url = window.location.href || path || ''; + const title = document.title || url || path || ''; + + let history = getRecentPageHistory().filter(p => p.path !== path); + history.unshift({ path, url, title }); + if (history.length > 3) { + history = history.slice(0, 3); + } + + try { + localStorage.setItem('path_pilot_recent_pages', JSON.stringify(history)); + } catch (e) { + // Ignore storage failures + } + } + + // Record this page as visited as soon as Path Pilot initializes + recordCurrentPageInHistory(); + + function createRecClickHandler(rec) { + return function (event) { + if (event && typeof event.preventDefault === 'function') { + event.preventDefault(); + } + if (typeof rec.page_id !== 'undefined') { + const sid = (document.cookie.match(/path_pilot_sid=([^;]+)/) || [])[1] || ''; + apiFetch('/wp-json/path-pilot/v1/rec-click', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ session_id: sid, page_id: rec.page_id }) + }); + } + window.location.href = rec.url; + }; + } + + function buildCardRow(rec, opts) { + const showScore = !opts || opts.showScore !== false; + + const row = document.createElement('a'); + row.className = 'pp-rec-card-row'; + if (rec.url) { + row.href = rec.url; + } + + const title = document.createElement('div'); + title.className = 'pp-rec-card-title'; + title.textContent = rec.title; + row.appendChild(title); + + const meta = document.createElement('div'); + meta.className = 'pp-rec-card-meta'; + + if (showScore && rec.score && rec.score > 0) { + const percent = document.createElement('span'); + percent.className = 'pp-rec-card-percent'; + percent.textContent = Math.round(rec.score) + '%'; + meta.appendChild(percent); + } + + row.appendChild(meta); + row.addEventListener('click', createRecClickHandler(rec)); + return row; + } + + function buildSimpleListItem(rec, opts) { + const li = document.createElement('li'); + li.className = 'pp-rec-list-item'; + const row = buildCardRow(rec, opts); + li.appendChild(row); + return li; + } + function renderRecommendations(recs) { - recList.innerHTML = ''; + recSection.innerHTML = ''; if (!recs || recs.length === 0) { - recList.innerHTML = '
  • No recommendations yet.
  • '; + recSection.innerHTML = '
    No recommendations yet.
    '; return; } - recs.forEach(function(rec) { - const li = document.createElement('li'); - // Title row with title, percent, and badge(s) horizontally aligned - const titleRow = document.createElement('div'); - titleRow.className = 'pp-drawer-rec-title-row'; - - // New meta container for badge and percent - const recMeta = document.createElement('div'); - recMeta.className = 'pp-rec-meta'; - - // Badge pill - if (rec.badge) { - const badge = document.createElement('span'); - badge.className = 'pp-drawer-rec-badge pp-badge-' + rec.badge; - if (rec.badge === 'conversion_path') badge.textContent = 'Recommended'; - else if (rec.badge === 'popular') badge.textContent = 'Popular'; - else if (rec.badge === 'related') badge.textContent = 'Related'; - else if (rec.badge === 'newest') badge.textContent = 'Newest'; - recMeta.appendChild(badge); - } - // Percentage (small, subtle, dark gray, no pill) - if (rec.score && rec.score > 0) { - const percent = document.createElement('span'); - percent.className = 'pp-drawer-rec-percent'; - percent.textContent = Math.round(rec.score) + '%'; - recMeta.appendChild(percent); - } - - // Append meta only if it has content - if (recMeta.children.length > 0) { - titleRow.appendChild(recMeta); + + const layout = document.createElement('div'); + layout.className = 'pp-rec-layout'; + recSection.appendChild(layout); + + // Group recs by badge where possible + const suggested = recs.filter(r => r.badge === 'conversion_path'); + const popular = recs.filter(r => r.badge === 'popular'); + const related = recs.filter(r => r.badge === 'related'); + const newest = recs.filter(r => r.badge === 'newest'); + + function fallback(source, start, end) { + if (source.length) return source; + return recs.slice(start, end); + } + + const suggestedNext = fallback(suggested, 0, 3); + // Always ensure "Most Popular" has something to show by falling back + // to the first few overall recommendations when there are no explicit "popular" items. + const mostPopular = fallback(popular, 0, 3); + const trending = fallback(newest, 6, 9); + const currentPath = window.location && window.location.pathname ? window.location.pathname : ''; + const recentPages = getRecentPageHistory().filter(p => p.path !== currentPath); + + function addListGroup(titleText, items, options = {}) { + if (!items || !items.length) return; + const group = document.createElement('section'); + group.className = 'pp-rec-group'; + if (options.isSuggested) { + group.classList.add('pp-rec-group-suggested'); } - - // Title - const title = document.createElement('span'); - title.className = 'pp-drawer-rec-title'; - title.textContent = rec.title; - titleRow.appendChild(title); - - li.appendChild(titleRow); - // Add synopsis under the title - if (rec.synopsis) { - const synopsis = document.createElement('div'); - synopsis.className = 'pp-drawer-rec-synopsis'; - synopsis.textContent = rec.synopsis; - li.appendChild(synopsis); + + const title = document.createElement('div'); + title.className = 'pp-rec-group-title'; + title.textContent = titleText; + group.appendChild(title); + + if (options.isSuggested) { + const aiBadge = document.createElement('div'); + aiBadge.className = 'pp-rec-ai-badge'; + aiBadge.innerHTML = ''; + group.appendChild(aiBadge); } - li.style.cursor = 'pointer'; - li.addEventListener('click', function() { - // Track click - if (typeof rec.page_id !== 'undefined') { - const sid = (document.cookie.match(/path_pilot_sid=([^;]+)/) || [])[1] || ''; - apiFetch('/wp-json/path-pilot/v1/rec-click', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ session_id: sid, page_id: rec.page_id }) - }); - } - window.location.href = rec.url; + + const ul = document.createElement('ul'); + ul.className = 'pp-rec-list'; + items.forEach(rec => { + ul.appendChild(buildSimpleListItem(rec, { showScore: !!options.isSuggested })); }); - recList.appendChild(li); - }); + group.appendChild(ul); + layout.appendChild(group); + } + + addListGroup('Suggested Next', suggestedNext, { isSuggested: true }); + addListGroup('Most Popular', mostPopular); + addListGroup('Recently Visited', recentPages); + addListGroup('Trending', trending); } function showRecommendationSkeletons(count = 3) { - const ul = panel.querySelector('.pp-drawer-rec-list'); - if (!ul) return; - ul.innerHTML = ''; + recSection.innerHTML = ''; + const skeletonWrap = document.createElement('div'); + skeletonWrap.className = 'pp-rec-skeleton-wrap'; for (let i = 0; i < count; i++) { - ul.innerHTML += ` -
  • + skeletonWrap.innerHTML += ` +
    -
  • + `; } + recSection.appendChild(skeletonWrap); } function fetchRecommendations() { @@ -367,6 +449,125 @@ } // Default view shows recs when panel first expands + // --- Summary tab logic --- + let summaryLoaded = false; + + function showSummarySkeletons(count = 3) { + summarySection.innerHTML = ''; + for (let i = 0; i < count; i++) { + summarySection.innerHTML += ` +
    +
    +
    +
    +
    + `; + } + } + + async function loadPageSummary() { + if (summaryLoaded) return; + summaryLoaded = true; + + const cacheKey = 'path_pilot_summary_' + window.location.pathname; + + // Try localStorage cache first (24h TTL) + try { + if (window.localStorage) { + const raw = localStorage.getItem(cacheKey); + if (raw) { + const cached = JSON.parse(raw); + const ttl = 24 * 60 * 60 * 1000; // 24h + if (cached && cached.timestamp && (Date.now() - cached.timestamp) < ttl) { + summarySection.innerHTML = ''; + + const pageTitleEl = document.createElement('div'); + pageTitleEl.className = 'pp-summary-page-title'; + pageTitleEl.textContent = document.title || ''; + summarySection.appendChild(pageTitleEl); + + const summaryBody = document.createElement('div'); + summaryBody.className = 'pp-summary-body'; + summaryBody.innerHTML = cached.summary_html || ''; + summarySection.appendChild(summaryBody); + + if (Array.isArray(cached.related_pages) && cached.related_pages.length) { + const relatedWrap = document.createElement('div'); + relatedWrap.className = 'pp-summary-related'; + relatedWrap.innerHTML = ` + + + `; + summarySection.appendChild(relatedWrap); + } + return; + } + } + } + } catch (e) { + // Ignore cache errors and fall back to network + } + + showSummarySkeletons(3); + + try { + const res = await fetch('/wp-json/path-pilot/v1/summary', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + credentials: 'same-origin', + body: JSON.stringify({ path: window.location.pathname }) + }); + const data = await res.json(); + + summarySection.innerHTML = ''; + + const pageTitleEl = document.createElement('div'); + pageTitleEl.className = 'pp-summary-page-title'; + pageTitleEl.textContent = document.title || ''; + summarySection.appendChild(pageTitleEl); + + if (!data || data.error) { + summarySection.innerHTML = `
    ${(data && data.error) || 'Unable to load summary.'}
    `; + return; + } + + const summaryBody = document.createElement('div'); + summaryBody.className = 'pp-summary-body'; + summaryBody.innerHTML = data.summary_html; + summarySection.appendChild(summaryBody); + + if (Array.isArray(data.related_pages) && data.related_pages.length) { + const relatedWrap = document.createElement('div'); + relatedWrap.className = 'pp-summary-related'; + relatedWrap.innerHTML = ` + + + `; + summarySection.appendChild(relatedWrap); + } + + // Persist to localStorage cache for 24 hours + try { + if (window.localStorage) { + localStorage.setItem(cacheKey, JSON.stringify({ + timestamp: Date.now(), + summary_html: data.summary_html, + related_pages: data.related_pages || [] + })); + } + } catch (e) { + // Ignore storage errors + } + } catch (err) { + console.error('Path Pilot: Error loading page summary:', err); + summarySection.innerHTML = '
    Error loading summary.
    '; + } + } + // helper to update panel title when tab changes function setPanelTitle(text) { const header = panel.querySelector('.pp-drawer-title'); @@ -440,10 +641,16 @@ function handleTabClick(tab) { if (!isExpanded) { setActiveTab(tab.id); + if (tab.id === 'summary') { + loadPageSummary(); + } expandSidebar(); return; } setActiveTab(tab.id); + if (tab.id === 'summary') { + loadPageSummary(); + } persistDrawerState(); } @@ -477,6 +684,9 @@ if (tabId) { setActiveTab(tabId); expandSidebar(); + if (tabId === 'summary') { + loadPageSummary(); + } } } From 2fb60945ae3fe2ac66dc3eaa4b191a2a39d30938 Mon Sep 17 00:00:00 2001 From: docvars Date: Sat, 15 Nov 2025 08:33:50 -0600 Subject: [PATCH 4/5] mobile nav --- assets/css/style.css | 83 ++++++++++++++++++++++++++++++++++++++++---- assets/dist/pp.css | 2 +- assets/dist/pp.js | 2 +- scripts/index.js | 81 +++++++++++++++++++++++++++++++----------- 4 files changed, 140 insertions(+), 28 deletions(-) diff --git a/assets/css/style.css b/assets/css/style.css index 48d9f7b..73bee47 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -461,9 +461,6 @@ body .pp-drawer a:not(.pp-footer-link):active { .pp-sidebar.expanded { width: 368px; /* 48 nav + 320 panel */ } -.pp-sidebar.collapsed { - width: 48px; -} .pp-sidebar-inner { width: 48px; display: flex; @@ -488,6 +485,8 @@ body .pp-drawer a:not(.pp-footer-link):active { margin: 0; cursor: pointer; appearance: none; + /* Temporarily hidden on all viewports */ + display: none; } .pp-sidebar-nav { display: flex; @@ -531,7 +530,7 @@ body .pp-drawer a:not(.pp-footer-link):active { color: #ffffff; } -/* Active tab indicator strip on the left */ +/* Active tab indicator (desktop: left strip by default) */ .pp-sidebar-nav .pp-nav-btn::before { content: ''; position: absolute; @@ -783,15 +782,87 @@ body.pp-sidebar-open { transition: margin-left 0.38s cubic-bezier(.25,.8,.25,1); } -@media (max-width: 600px) { +@media (max-width: 900px) { + /* Mobile: sidebar becomes a full-width top bar + full-screen overlay when open */ + .pp-sidebar { + top: 0; + left: 0; + width: 100vw; + height: 40px; + flex-direction: column; + transition: + height 0.3s cubic-bezier(.25,.8,.25,1), + box-shadow 0.3s cubic-bezier(.25,.8,.25,1); + } .pp-sidebar.expanded { width: 100vw; + height: 100vh; + } + .pp-sidebar-inner { + width: 100%; + flex-direction: row; + align-items: center; + justify-content: flex-start; + padding: 0; + gap: 0; + } + .pp-sidebar-nav { + flex-direction: row; + width: auto; + } + .pp-sidebar-brand { + display: none; + } + .pp-sidebar-nav .pp-nav-btn { + width: 52px; + height: 40px; + } + /* Mobile: active indicator becomes a top bar above the icon */ + .pp-sidebar-nav .pp-nav-btn::before { + left: 6px; + right: 6px; + top: 0; + bottom: auto; + height: 2px; + width: 40px; + border-radius: 999px; + } + .pp-sidebar-content { + width: 100%; + height: calc(100vh - 40px); + margin-left: 0; + opacity: 0; + transform: translateY(-8px); + pointer-events: none; } .pp-sidebar.expanded .pp-sidebar-content { - width: calc(100vw - 48px); + opacity: 1; + transform: translateY(0); + pointer-events: auto; } body.pp-sidebar-present, body.pp-sidebar-open { margin-left: 0 !important; + margin-top: 56px !important; /* reserve space for top toolbar */ + } +} + +@media (min-width: 901px) { + /* Desktop: collapsed sidebar rail width */ + .pp-sidebar { + width: 48px; + } + .pp-sidebar.expanded { + width: 368px; + } + /* Desktop: nav icons start ~1/3 down; brand icon sits at the bottom */ + .pp-sidebar-inner { + align-items: center; + } + .pp-sidebar-nav { + margin-top: 1vh; + } + .pp-sidebar-brand { + margin-top: auto; } } \ No newline at end of file diff --git a/assets/dist/pp.css b/assets/dist/pp.css index 65502eb..5d54248 100644 --- a/assets/dist/pp.css +++ b/assets/dist/pp.css @@ -1 +1 @@ -@font-face{font-display:swap;font-family:DM Sans;font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/dmsans/v15/rP2Hp2ywxg089UriCZOIHQ.woff2) format("woff2")}.pp-rec-skeleton{border-radius:8px;margin-bottom:16px;min-height:60px;overflow:hidden;padding:16px;position:relative}.pp-skeleton-synopsis,.pp-skeleton-title{animation:pp-skeleton-loading 1.2s linear infinite;background:#e0e0e0;border-radius:4px;height:18px;margin-bottom:8px;width:80%}.pp-skeleton-synopsis{height:14px;width:95%}@keyframes pp-skeleton-loading{0%{background-color:#303030}50%{background-color:#555}to{background-color:#303030}}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.pp-drawer-rec-synopsis{color:#999;display:block;font-size:.8rem;line-height:1.4;margin-bottom:4px;margin-top:2px;white-space:normal}.pp-drawer-rec-badge{background:#eee;border-radius:6px;color:#444;display:inline-block;font-size:.5rem;font-weight:600;letter-spacing:.02em;line-height:.6rem;margin-top:0;padding:2px 8px;text-transform:uppercase;vertical-align:middle}.pp-badge-conversion_path{background:#1976d2!important;color:#fff!important}.pp-badge-popular{background:#c58723!important;color:#fff!important}.pp-badge-related{background:#8e24aa!important;color:#fff!important}.pp-badge-newest{background:#0e7d15!important;color:#fff!important}.pp-drawer-content{display:flex;flex-direction:column;height:100%}.pp-drawer-footer,.pp-drawer-recommendations{flex-shrink:0}:root{--pp-drawer-handle-top:0.5rem}.pp-drawer{align-items:stretch;color:var(--pp-white,#fff);font-family:DM Sans,sans-serif!important;left:0;overflow:visible;position:fixed;transition:width .3s cubic-bezier(.4,0,.2,1);width:0;z-index:9999}.pp-drawer,.pp-drawer .pp-drawer-content{background:var(--pp-dark,#181818);display:flex;flex-direction:column;height:100vh;top:0}.pp-drawer .pp-drawer-content{box-sizing:border-box;left:-320px;overflow:hidden;padding:11px 20px 0 24px;pointer-events:none;position:absolute;width:320px}.pp-drawer.expanded{left:0;width:320px}.pp-drawer.expanded .pp-drawer-content{left:0;opacity:1;pointer-events:auto;position:relative;transition:left .3s cubic-bezier(.4,0,.2,1)}body .pp-drawer .pp-drawer-handle,body .pp-drawer button.pp-drawer-handle,body button.pp-drawer-handle{align-items:center;background:#232323;background-color:#232323;border:none;border-radius:12px;box-shadow:none;color:#fff;cursor:pointer;display:flex;font-family:inherit;font-size:1.2rem;font-weight:400;height:24px;justify-content:center;left:.5rem;line-height:1;margin:0;max-height:none;max-width:none;min-height:auto;min-width:auto;outline:none;padding:0;position:absolute;text-align:center;text-decoration:none;top:.5rem;transition:all .3s cubic-bezier(.4,0,.2,1);vertical-align:baseline;width:24px;z-index:10000}body .pp-drawer .pp-drawer-handle:focus{box-shadow:0 0 0 3px rgba(25,118,210,.3);outline:2px solid #1976d2}body .pp-drawer .pp-drawer-handle i,body .pp-drawer button.pp-drawer-handle i,body button.pp-drawer-handle i{background:none;border:none;color:#fff;font-size:1.1rem;font-weight:400;line-height:1;margin:0;padding:0;text-decoration:none}.pp-drawer-handle:after{background:#232323;border-radius:4px;color:#fff;content:"Need a hand? Click here for recommendations.";font-size:.9rem;left:100%;margin-left:10px;opacity:0;padding:8px 12px;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);transition:none;white-space:nowrap}.pp-drawer.minimized .pp-drawer-handle:hover:after{opacity:1;transition:opacity .2s ease .3s}body .pp-drawer.expanded .pp-drawer-handle,body .pp-drawer.expanded button.pp-drawer-handle{background:#232323;background-color:#232323;left:290px;opacity:1;transform:rotate(0deg)}.pp-drawer.expanded .pp-drawer-handle:after{opacity:0!important;visibility:hidden!important}body .pp-drawer.minimized .pp-drawer-handle,body .pp-drawer.minimized button.pp-drawer-handle{background:#232323;background-color:#232323;left:.5rem;top:.5rem;transform:rotate(-1turn)}.pp-drawer-title{color:var(--pp-lighter-text,#646970);font-size:.95rem;font-weight:700;letter-spacing:1.5px;margin-bottom:18px;text-transform:uppercase}.pp-drawer-rec-list{list-style:none;margin:0 0 24px;padding:0}.pp-rec-meta{align-items:center;display:flex;flex-shrink:0;gap:4px;margin-bottom:4px}.pp-drawer-rec-percent{color:#888;flex-shrink:0;font-size:.6rem;font-weight:600;line-height:.7rem}.pp-drawer-footer{bottom:0;color:#aaa;font-size:11px;left:0;line-height:2rem;margin:0;opacity:.7;padding:0;pointer-events:auto;position:absolute;right:0;text-align:center;width:100%;z-index:1}body .pp-drawer .pp-drawer-footer a.pp-footer-link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:visited{color:#ccc;font-size:11px;opacity:.8;text-decoration:none;transition:color .2s}body .pp-drawer .pp-drawer-footer a.pp-footer-link:active,body .pp-drawer .pp-drawer-footer a.pp-footer-link:focus,body .pp-drawer .pp-drawer-footer a.pp-footer-link:hover{color:#fff;opacity:1;text-decoration:underline}.pp-drawer .pp-drawer-content{overflow-y:auto;padding-bottom:2rem}body.pp-drawer-open{margin-left:320px!important;transition:margin-left .3s cubic-bezier(.4,0,.2,1)}.pp-drawer.minimized{width:0!important}.pp-drawer.minimized .pp-drawer-content{opacity:0!important;pointer-events:none!important}.pp-drawer.minimized .pp-drawer-handle{left:.5rem;top:.5rem}@media (max-width:600px){.pp-drawer.expanded{background:hsla(0,0%,9%,.96);left:0;width:100vw}.pp-drawer.expanded .pp-drawer-handle{left:auto;right:.5rem}.pp-drawer.expanded .pp-drawer-content{background:transparent;left:0;width:100vw}body.pp-drawer-open{margin-left:0!important}}body .pp-drawer a:not(.pp-footer-link),body .pp-drawer a:not(.pp-footer-link):link,body .pp-drawer a:not(.pp-footer-link):visited{background:none;border:none;color:#ddd;text-decoration:underline}body .pp-drawer a:not(.pp-footer-link):active,body .pp-drawer a:not(.pp-footer-link):focus,body .pp-drawer a:not(.pp-footer-link):hover{background:none;color:#fff;text-decoration:underline}@keyframes pp-beacon-pulse{0%{box-shadow:0 0 0 0 rgba(25,118,210,.5)}70%{box-shadow:0 0 0 12px rgba(25,118,210,0)}to{box-shadow:0 0 0 0 rgba(25,118,210,0)}}.pp-drawer-handle.pp-beacon{animation:pp-beacon-pulse 1.2s infinite}.pp-content-types-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.pp-content-type-item{background:#f9f9f9;border:2px solid #e0e0e0;border-radius:6px;padding:12px 14px;transition:all .2s ease}.pp-content-type-item:hover{background:#f0f8ff;border-color:#1976d2}.pp-content-type-item input[type=checkbox]:checked+div{color:#1976d2;font-weight:600}.pp-content-type-item input[type=checkbox]:checked{accent-color:#1976d2}.pp-content-types-section .pp-home-protip{margin-bottom:12px}.pp-sidebar{align-items:stretch;background:#212426;color:var(--pp-white,#fff);display:flex;flex-direction:row;font-family:DM Sans,sans-serif!important;height:100vh;left:0;overflow:hidden;position:fixed;top:0;transition:width .38s cubic-bezier(.25,.8,.25,1),box-shadow .38s cubic-bezier(.25,.8,.25,1);width:48px;z-index:9999}.pp-sidebar.expanded{width:368px}.pp-sidebar.collapsed{width:48px}.pp-sidebar-inner{background:#212426;flex-direction:column;flex-shrink:0;gap:4px;padding:8px 0}.pp-sidebar-brand,.pp-sidebar-inner{align-items:center;display:flex;width:48px}.pp-sidebar-brand{appearance:none;background:transparent;border:none;color:#fff;cursor:pointer;font-size:1.2rem;height:34px;justify-content:center;margin:0;padding:0}.pp-sidebar-nav{display:flex;flex-direction:column;gap:2px;width:100%}.pp-sidebar-nav .pp-nav-btn{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;gap:10px;height:44px;justify-content:center;position:relative;text-align:left;transition:background .15s ease,color .15s ease;width:48px}.pp-sidebar-nav .pp-nav-btn i{color:inherit;font-size:1.1rem}.pp-sidebar-nav .pp-nav-btn svg.pp-icon{flex-shrink:0;height:20px;width:20px}.pp-sidebar-nav .pp-nav-btn span{color:inherit;display:none;font-size:.92rem}.pp-sidebar-nav .pp-nav-btn.is-active,.pp-sidebar-nav .pp-nav-btn:hover{color:#fff}.pp-sidebar-nav .pp-nav-btn:before{background:transparent;border-radius:2px;bottom:8px;content:"";left:0;position:absolute;top:8px;width:2px}.pp-sidebar-nav .pp-nav-btn.is-active:before{background:#fff}.pp-sidebar-nav .pp-collapse{margin-top:auto}.pp-sidebar-content{background:#282a2c;color:#fff;display:flex;flex-direction:column;height:100vh;opacity:0;overflow-y:hidden;padding:12px 14px 0;pointer-events:none;position:relative;transform:translateX(-24px);transition:opacity .38s cubic-bezier(.25,.8,.25,1) 40ms,transform .38s cubic-bezier(.25,.8,.25,1) 40ms;width:320px}.pp-sidebar.expanded .pp-sidebar-content{opacity:1;pointer-events:auto;transform:translateX(0)}.pp-tab-root{flex:1 1 auto}.pp-tab-root.pp-tab-recommendations{overflow-y:auto}.pp-summary-body{color:#ddd;font-size:.95rem;line-height:1.5;margin-bottom:16px}.pp-summary-page-title{color:#fff;font-size:1.05rem;font-weight:600;margin-bottom:10px}.pp-summary-body p{margin:0 0 10px}.pp-summary-body a,.pp-summary-body a:link,.pp-summary-body a:visited{color:#ddd;text-decoration:underline}.pp-summary-body a:focus,.pp-summary-body a:hover{color:#fff}.pp-summary-related-title{color:#888;font-size:.8rem;letter-spacing:1.2px;margin-bottom:6px;text-transform:uppercase}.pp-summary-related-list{list-style:none;margin:0;padding:0}.pp-summary-related-list li{margin-bottom:4px}.pp-summary-related-list a{color:#ddd;text-decoration:underline}.pp-summary-related-list a:focus,.pp-summary-related-list a:hover{color:#fff}.pp-rec-layout{display:flex;flex-direction:column;gap:32px}.pp-rec-layout-header{color:#bbb;font-size:.9rem;font-weight:700;letter-spacing:1.4px;text-transform:uppercase}.pp-rec-group{display:flex;flex-direction:column;gap:10px}.pp-rec-group-suggested{background:#363636;border-radius:6px;padding:12px 6px 10px;position:relative}.pp-rec-group-title{color:#888;font-size:.75rem;font-weight:400;padding-left:6px}.pp-rec-card-row{align-items:center;background:transparent;border:none;color:#f5f5f5;cursor:pointer;display:flex;justify-content:space-between;padding:0;text-align:left;width:100%}.pp-rec-card-row:focus,.pp-rec-card-row:hover{color:#fff;outline:none}.pp-rec-card-title{color:#e0e0e0;font-size:.98rem;font-weight:300}.pp-rec-card-row:focus .pp-rec-card-title,.pp-rec-card-row:hover .pp-rec-card-title{color:#fff;text-decoration:underline}.pp-rec-card-meta{align-items:center;color:#b0b0b0;display:flex;font-size:.85rem;gap:4px}.pp-rec-card-percent{font-weight:600}.pp-rec-ai-badge{align-items:center;display:flex;height:22px;justify-content:center;position:absolute;right:8px;top:8px;width:22px}.pp-rec-ai-badge svg{display:block}.pp-rec-list{list-style:none;margin:0;padding:0 0 0 6px}.pp-rec-list-item{margin-bottom:4px}.pp-rec-list-link{background:transparent;border:none;color:#e0e0e0;cursor:pointer;font-size:.98rem;margin:0;padding:0;text-align:left}.pp-rec-list-link:focus,.pp-rec-list-link:hover{color:#fff;text-decoration:underline}.pp-tab-root.pp-tab-search{display:flex;flex-direction:column;height:100%}.pp-tab-root.pp-tab-search .pp-drawer-chat{margin-bottom:16px;margin-top:auto}.pp-panel-close{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;height:32px;justify-content:center;position:absolute;right:8px;top:8px;width:32px}.pp-panel-close svg.pp-icon{height:20px;width:20px}.pp-panel-close:hover{color:#fff}body.pp-sidebar-present{margin-left:48px!important}body.pp-sidebar-open,body.pp-sidebar-present{transition:margin-left .38s cubic-bezier(.25,.8,.25,1)}body.pp-sidebar-open{margin-left:376px!important}@media (max-width:600px){.pp-sidebar.expanded{width:100vw}.pp-sidebar.expanded .pp-sidebar-content{width:calc(100vw - 48px)}body.pp-sidebar-open,body.pp-sidebar-present{margin-left:0!important}} \ No newline at end of file +@font-face{font-display:swap;font-family:DM Sans;font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/dmsans/v15/rP2Hp2ywxg089UriCZOIHQ.woff2) format("woff2")}.pp-rec-skeleton{border-radius:8px;margin-bottom:16px;min-height:60px;overflow:hidden;padding:16px;position:relative}.pp-skeleton-synopsis,.pp-skeleton-title{animation:pp-skeleton-loading 1.2s linear infinite;background:#e0e0e0;border-radius:4px;height:18px;margin-bottom:8px;width:80%}.pp-skeleton-synopsis{height:14px;width:95%}@keyframes pp-skeleton-loading{0%{background-color:#303030}50%{background-color:#555}to{background-color:#303030}}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.pp-drawer-rec-synopsis{color:#999;display:block;font-size:.8rem;line-height:1.4;margin-bottom:4px;margin-top:2px;white-space:normal}.pp-drawer-rec-badge{background:#eee;border-radius:6px;color:#444;display:inline-block;font-size:.5rem;font-weight:600;letter-spacing:.02em;line-height:.6rem;margin-top:0;padding:2px 8px;text-transform:uppercase;vertical-align:middle}.pp-badge-conversion_path{background:#1976d2!important;color:#fff!important}.pp-badge-popular{background:#c58723!important;color:#fff!important}.pp-badge-related{background:#8e24aa!important;color:#fff!important}.pp-badge-newest{background:#0e7d15!important;color:#fff!important}.pp-drawer-content{display:flex;flex-direction:column;height:100%}.pp-drawer-footer,.pp-drawer-recommendations{flex-shrink:0}:root{--pp-drawer-handle-top:0.5rem}.pp-drawer{align-items:stretch;color:var(--pp-white,#fff);font-family:DM Sans,sans-serif!important;left:0;overflow:visible;position:fixed;transition:width .3s cubic-bezier(.4,0,.2,1);width:0;z-index:9999}.pp-drawer,.pp-drawer .pp-drawer-content{background:var(--pp-dark,#181818);display:flex;flex-direction:column;height:100vh;top:0}.pp-drawer .pp-drawer-content{box-sizing:border-box;left:-320px;overflow:hidden;padding:11px 20px 0 24px;pointer-events:none;position:absolute;width:320px}.pp-drawer.expanded{left:0;width:320px}.pp-drawer.expanded .pp-drawer-content{left:0;opacity:1;pointer-events:auto;position:relative;transition:left .3s cubic-bezier(.4,0,.2,1)}body .pp-drawer .pp-drawer-handle,body .pp-drawer button.pp-drawer-handle,body button.pp-drawer-handle{align-items:center;background:#232323;background-color:#232323;border:none;border-radius:12px;box-shadow:none;color:#fff;cursor:pointer;display:flex;font-family:inherit;font-size:1.2rem;font-weight:400;height:24px;justify-content:center;left:.5rem;line-height:1;margin:0;max-height:none;max-width:none;min-height:auto;min-width:auto;outline:none;padding:0;position:absolute;text-align:center;text-decoration:none;top:.5rem;transition:all .3s cubic-bezier(.4,0,.2,1);vertical-align:baseline;width:24px;z-index:10000}body .pp-drawer .pp-drawer-handle:focus{box-shadow:0 0 0 3px rgba(25,118,210,.3);outline:2px solid #1976d2}body .pp-drawer .pp-drawer-handle i,body .pp-drawer button.pp-drawer-handle i,body button.pp-drawer-handle i{background:none;border:none;color:#fff;font-size:1.1rem;font-weight:400;line-height:1;margin:0;padding:0;text-decoration:none}.pp-drawer-handle:after{background:#232323;border-radius:4px;color:#fff;content:"Need a hand? Click here for recommendations.";font-size:.9rem;left:100%;margin-left:10px;opacity:0;padding:8px 12px;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);transition:none;white-space:nowrap}.pp-drawer.minimized .pp-drawer-handle:hover:after{opacity:1;transition:opacity .2s ease .3s}body .pp-drawer.expanded .pp-drawer-handle,body .pp-drawer.expanded button.pp-drawer-handle{background:#232323;background-color:#232323;left:290px;opacity:1;transform:rotate(0deg)}.pp-drawer.expanded .pp-drawer-handle:after{opacity:0!important;visibility:hidden!important}body .pp-drawer.minimized .pp-drawer-handle,body .pp-drawer.minimized button.pp-drawer-handle{background:#232323;background-color:#232323;left:.5rem;top:.5rem;transform:rotate(-1turn)}.pp-drawer-title{color:var(--pp-lighter-text,#646970);font-size:.95rem;font-weight:700;letter-spacing:1.5px;margin-bottom:18px;text-transform:uppercase}.pp-drawer-rec-list{list-style:none;margin:0 0 24px;padding:0}.pp-rec-meta{align-items:center;display:flex;flex-shrink:0;gap:4px;margin-bottom:4px}.pp-drawer-rec-percent{color:#888;flex-shrink:0;font-size:.6rem;font-weight:600;line-height:.7rem}.pp-drawer-footer{bottom:0;color:#aaa;font-size:11px;left:0;line-height:2rem;margin:0;opacity:.7;padding:0;pointer-events:auto;position:absolute;right:0;text-align:center;width:100%;z-index:1}body .pp-drawer .pp-drawer-footer a.pp-footer-link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:link,body .pp-drawer .pp-drawer-footer a.pp-footer-link:visited{color:#ccc;font-size:11px;opacity:.8;text-decoration:none;transition:color .2s}body .pp-drawer .pp-drawer-footer a.pp-footer-link:active,body .pp-drawer .pp-drawer-footer a.pp-footer-link:focus,body .pp-drawer .pp-drawer-footer a.pp-footer-link:hover{color:#fff;opacity:1;text-decoration:underline}.pp-drawer .pp-drawer-content{overflow-y:auto;padding-bottom:2rem}body.pp-drawer-open{margin-left:320px!important;transition:margin-left .3s cubic-bezier(.4,0,.2,1)}.pp-drawer.minimized{width:0!important}.pp-drawer.minimized .pp-drawer-content{opacity:0!important;pointer-events:none!important}.pp-drawer.minimized .pp-drawer-handle{left:.5rem;top:.5rem}@media (max-width:600px){.pp-drawer.expanded{background:hsla(0,0%,9%,.96);left:0;width:100vw}.pp-drawer.expanded .pp-drawer-handle{left:auto;right:.5rem}.pp-drawer.expanded .pp-drawer-content{background:transparent;left:0;width:100vw}body.pp-drawer-open{margin-left:0!important}}body .pp-drawer a:not(.pp-footer-link),body .pp-drawer a:not(.pp-footer-link):link,body .pp-drawer a:not(.pp-footer-link):visited{background:none;border:none;color:#ddd;text-decoration:underline}body .pp-drawer a:not(.pp-footer-link):active,body .pp-drawer a:not(.pp-footer-link):focus,body .pp-drawer a:not(.pp-footer-link):hover{background:none;color:#fff;text-decoration:underline}@keyframes pp-beacon-pulse{0%{box-shadow:0 0 0 0 rgba(25,118,210,.5)}70%{box-shadow:0 0 0 12px rgba(25,118,210,0)}to{box-shadow:0 0 0 0 rgba(25,118,210,0)}}.pp-drawer-handle.pp-beacon{animation:pp-beacon-pulse 1.2s infinite}.pp-content-types-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.pp-content-type-item{background:#f9f9f9;border:2px solid #e0e0e0;border-radius:6px;padding:12px 14px;transition:all .2s ease}.pp-content-type-item:hover{background:#f0f8ff;border-color:#1976d2}.pp-content-type-item input[type=checkbox]:checked+div{color:#1976d2;font-weight:600}.pp-content-type-item input[type=checkbox]:checked{accent-color:#1976d2}.pp-content-types-section .pp-home-protip{margin-bottom:12px}.pp-sidebar{align-items:stretch;background:#212426;color:var(--pp-white,#fff);display:flex;flex-direction:row;font-family:DM Sans,sans-serif!important;height:100vh;left:0;overflow:hidden;position:fixed;top:0;transition:width .38s cubic-bezier(.25,.8,.25,1),box-shadow .38s cubic-bezier(.25,.8,.25,1);width:48px;z-index:9999}.pp-sidebar.expanded{width:368px}.pp-sidebar-inner{background:#212426;flex-direction:column;flex-shrink:0;gap:4px;padding:8px 0}.pp-sidebar-brand,.pp-sidebar-inner{align-items:center;display:flex;width:48px}.pp-sidebar-brand{appearance:none;background:transparent;border:none;color:#fff;cursor:pointer;display:none;font-size:1.2rem;height:34px;justify-content:center;margin:0;padding:0}.pp-sidebar-nav{display:flex;flex-direction:column;gap:2px;width:100%}.pp-sidebar-nav .pp-nav-btn{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;gap:10px;height:44px;justify-content:center;position:relative;text-align:left;transition:background .15s ease,color .15s ease;width:48px}.pp-sidebar-nav .pp-nav-btn i{color:inherit;font-size:1.1rem}.pp-sidebar-nav .pp-nav-btn svg.pp-icon{flex-shrink:0;height:20px;width:20px}.pp-sidebar-nav .pp-nav-btn span{color:inherit;display:none;font-size:.92rem}.pp-sidebar-nav .pp-nav-btn.is-active,.pp-sidebar-nav .pp-nav-btn:hover{color:#fff}.pp-sidebar-nav .pp-nav-btn:before{background:transparent;border-radius:2px;bottom:8px;content:"";left:0;position:absolute;top:8px;width:2px}.pp-sidebar-nav .pp-nav-btn.is-active:before{background:#fff}.pp-sidebar-nav .pp-collapse{margin-top:auto}.pp-sidebar-content{background:#282a2c;color:#fff;display:flex;flex-direction:column;height:100vh;opacity:0;overflow-y:hidden;padding:12px 14px 0;pointer-events:none;position:relative;transform:translateX(-24px);transition:opacity .38s cubic-bezier(.25,.8,.25,1) 40ms,transform .38s cubic-bezier(.25,.8,.25,1) 40ms;width:320px}.pp-sidebar.expanded .pp-sidebar-content{opacity:1;pointer-events:auto;transform:translateX(0)}.pp-tab-root{flex:1 1 auto}.pp-tab-root.pp-tab-recommendations{overflow-y:auto}.pp-summary-body{color:#ddd;font-size:.95rem;line-height:1.5;margin-bottom:16px}.pp-summary-page-title{color:#fff;font-size:1.05rem;font-weight:600;margin-bottom:10px}.pp-summary-body p{margin:0 0 10px}.pp-summary-body a,.pp-summary-body a:link,.pp-summary-body a:visited{color:#ddd;text-decoration:underline}.pp-summary-body a:focus,.pp-summary-body a:hover{color:#fff}.pp-summary-related-title{color:#888;font-size:.8rem;letter-spacing:1.2px;margin-bottom:6px;text-transform:uppercase}.pp-summary-related-list{list-style:none;margin:0;padding:0}.pp-summary-related-list li{margin-bottom:4px}.pp-summary-related-list a{color:#ddd;text-decoration:underline}.pp-summary-related-list a:focus,.pp-summary-related-list a:hover{color:#fff}.pp-rec-layout{display:flex;flex-direction:column;gap:32px}.pp-rec-layout-header{color:#bbb;font-size:.9rem;font-weight:700;letter-spacing:1.4px;text-transform:uppercase}.pp-rec-group{display:flex;flex-direction:column;gap:10px}.pp-rec-group-suggested{background:#363636;border-radius:6px;padding:12px 6px 10px;position:relative}.pp-rec-group-title{color:#888;font-size:.75rem;font-weight:400;padding-left:6px}.pp-rec-card-row{align-items:center;background:transparent;border:none;color:#f5f5f5;cursor:pointer;display:flex;justify-content:space-between;padding:0;text-align:left;width:100%}.pp-rec-card-row:focus,.pp-rec-card-row:hover{color:#fff;outline:none}.pp-rec-card-title{color:#e0e0e0;font-size:.98rem;font-weight:300}.pp-rec-card-row:focus .pp-rec-card-title,.pp-rec-card-row:hover .pp-rec-card-title{color:#fff;text-decoration:underline}.pp-rec-card-meta{align-items:center;color:#b0b0b0;display:flex;font-size:.85rem;gap:4px}.pp-rec-card-percent{font-weight:600}.pp-rec-ai-badge{align-items:center;display:flex;height:22px;justify-content:center;position:absolute;right:8px;top:8px;width:22px}.pp-rec-ai-badge svg{display:block}.pp-rec-list{list-style:none;margin:0;padding:0 0 0 6px}.pp-rec-list-item{margin-bottom:4px}.pp-rec-list-link{background:transparent;border:none;color:#e0e0e0;cursor:pointer;font-size:.98rem;margin:0;padding:0;text-align:left}.pp-rec-list-link:focus,.pp-rec-list-link:hover{color:#fff;text-decoration:underline}.pp-tab-root.pp-tab-search{display:flex;flex-direction:column;height:100%}.pp-tab-root.pp-tab-search .pp-drawer-chat{margin-bottom:16px;margin-top:auto}.pp-panel-close{align-items:center;background:transparent;border:none;color:#878888;cursor:pointer;display:flex;height:32px;justify-content:center;position:absolute;right:8px;top:8px;width:32px}.pp-panel-close svg.pp-icon{height:20px;width:20px}.pp-panel-close:hover{color:#fff}body.pp-sidebar-present{margin-left:48px!important}body.pp-sidebar-open,body.pp-sidebar-present{transition:margin-left .38s cubic-bezier(.25,.8,.25,1)}body.pp-sidebar-open{margin-left:376px!important}@media (max-width:900px){.pp-sidebar{flex-direction:column;height:40px;left:0;top:0;transition:height .3s cubic-bezier(.25,.8,.25,1),box-shadow .3s cubic-bezier(.25,.8,.25,1);width:100vw}.pp-sidebar.expanded{height:100vh;width:100vw}.pp-sidebar-inner{align-items:center;flex-direction:row;gap:0;justify-content:flex-start;padding:0;width:100%}.pp-sidebar-nav{flex-direction:row;width:auto}.pp-sidebar-brand{display:none}.pp-sidebar-nav .pp-nav-btn{height:40px;width:52px}.pp-sidebar-nav .pp-nav-btn:before{border-radius:999px;bottom:auto;height:2px;left:6px;right:6px;top:0;width:40px}.pp-sidebar-content{height:calc(100vh - 40px);margin-left:0;opacity:0;pointer-events:none;transform:translateY(-8px);width:100%}.pp-sidebar.expanded .pp-sidebar-content{opacity:1;pointer-events:auto;transform:translateY(0)}body.pp-sidebar-open,body.pp-sidebar-present{margin-left:0!important;margin-top:56px!important}}@media (min-width:901px){.pp-sidebar{width:48px}.pp-sidebar.expanded{width:368px}.pp-sidebar-inner{align-items:center}.pp-sidebar-nav{margin-top:1vh}.pp-sidebar-brand{margin-top:auto}} \ No newline at end of file diff --git a/assets/dist/pp.js b/assets/dist/pp.js index da11b8d..b590aa2 100644 --- a/assets/dist/pp.js +++ b/assets/dist/pp.js @@ -1 +1 @@ -!function(){"use strict";!function(){function e(e){switch(e){case"compass":return'';case"info":return'';case"search":return'';case"dockRight":return'';default:return""}}document.addEventListener("DOMContentLoaded",function(){!function(){if(window.PathPilotStatus&&!0===window.PathPilotStatus.insights_only)return void console.log("Path Pilot: Insights only mode enabled - skipping drawer initialization");if(!document.querySelector('link[href*="path-pilot-icons.css"]')){var t=document.createElement("link");t.rel="stylesheet",t.href=window.PathPilotStatus&&window.PathPilotStatus.icon_css_url||"/wp-content/plugins/path-pilot/assets/css/path-pilot-icons.css",document.head.appendChild(t)}let n=window.PathPilotStatus?window.PathPilotStatus.nonce:null;function a(){return fetch("/wp-json/path-pilot/v1/nonce").then(e=>e.json()).then(e=>(e.nonce&&(n=e.nonce),n)).catch(()=>n)}async function o(e,t){const o=n=>{const a={...t.headers,"X-WP-Nonce":n};return fetch(e,{...t,headers:a})};let i=await o(n);if(403===i.status){const e=await a();i=await o(e)}return i}a();let i=!1,s=null;const r="path_pilot_drawer_state";function l(){try{const e=window.localStorage?localStorage.getItem(r):null;return e?JSON.parse(e):null}catch(e){return null}}function c(){try{if(!window.localStorage)return;const e={open:i,tab:s||null};localStorage.setItem(r,JSON.stringify(e))}catch(e){}}const d=[{id:"recommendations",label:"Site navigation",icon:"compass"},{id:"summary",label:"Page summary",icon:"info"},{id:"search",label:"Search",icon:"search"}],p=document.createElement("div");p.id="path-pilot-sidebar",p.className="pp-sidebar collapsed",p.setAttribute("role","complementary"),p.setAttribute("aria-label","Path Pilot panel"),p.setAttribute("aria-hidden","true"),document.body.appendChild(p),document.body.classList.add("pp-sidebar-present");const u=document.createElement("div");u.className="pp-sidebar-inner",p.appendChild(u);const m=document.createElement("button");m.type="button",m.className="pp-sidebar-brand",m.innerHTML='',m.setAttribute("title","Path Pilot"),m.setAttribute("aria-label","Open Path Pilot website"),m.addEventListener("click",function(){try{window.open("https://pathpilot.app","_blank","noopener,noreferrer")}catch(e){window.location.href="https://pathpilot.app"}}),u.appendChild(m);const h=document.createElement("nav");h.className="pp-sidebar-nav",h.setAttribute("aria-label","Path Pilot navigation"),u.appendChild(h);const f=document.createElement("div");f.className="pp-sidebar-content",p.appendChild(f);const y=document.createElement("button");y.type="button",y.className="pp-panel-close",y.setAttribute("aria-label","Close Path Pilot panel"),y.innerHTML=e("dockRight"),f.appendChild(y);const g=document.createElement("div");g.className="pp-drawer-title",g.textContent="Site navigation",f.appendChild(g);const w=document.createElement("div");w.className="pp-tab-root pp-tab-recommendations",f.appendChild(w);const v=document.createElement("div");v.className="pp-tab-root pp-tab-summary",v.style.display="none",f.appendChild(v);const b=document.createElement("div");b.className="pp-tab-root pp-tab-search",b.style.display="none",f.appendChild(b);const C={recommendations:w,summary:v,search:b},S=d.map(t=>{const n=document.createElement("button");return n.type="button",n.className="pp-nav-btn",n.setAttribute("data-view",t.id),n.setAttribute("title",t.label),n.setAttribute("aria-label",t.label),n.innerHTML=e(t.icon),h.appendChild(n),{...t,button:n,section:C[t.id]||null}});function E(){if("undefined"==typeof window||!window.localStorage)return[];try{const e=localStorage.getItem("path_pilot_recent_pages");if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch(e){return[]}}function N(){if("undefined"==typeof window||!window.localStorage)return;const e=window.location.pathname||"",t=window.location.href||e||"",n=document.title||t||e||"";let a=E().filter(t=>t.path!==e);a.unshift({path:e,url:t,title:n}),a.length>3&&(a=a.slice(0,3));try{localStorage.setItem("path_pilot_recent_pages",JSON.stringify(a))}catch(e){}}function P(e){return function(t){if(t&&"function"==typeof t.preventDefault&&t.preventDefault(),void 0!==e.page_id){const t=(document.cookie.match(/path_pilot_sid=([^;]+)/)||[])[1]||"";o("/wp-json/path-pilot/v1/rec-click",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({session_id:t,page_id:e.page_id})})}window.location.href=e.url}}function _(e,t){const n=!t||!1!==t.showScore,a=document.createElement("a");a.className="pp-rec-card-row",e.url&&(a.href=e.url);const o=document.createElement("div");o.className="pp-rec-card-title",o.textContent=e.title,a.appendChild(o);const i=document.createElement("div");if(i.className="pp-rec-card-meta",n&&e.score&&e.score>0){const t=document.createElement("span");t.className="pp-rec-card-percent",t.textContent=Math.round(e.score)+"%",i.appendChild(t)}return a.appendChild(i),a.addEventListener("click",P(e)),a}function k(e,t){const n=document.createElement("li");n.className="pp-rec-list-item";const a=_(e,t);return n.appendChild(a),n}function L(e){if(w.innerHTML="",!e||0===e.length)return void(w.innerHTML='
    No recommendations yet.
    ');const t=document.createElement("div");t.className="pp-rec-layout",w.appendChild(t);const n=e.filter(e=>"conversion_path"===e.badge),a=e.filter(e=>"popular"===e.badge);e.filter(e=>"related"===e.badge);const o=e.filter(e=>"newest"===e.badge);function i(t,n,a){return t.length?t:e.slice(n,a)}const s=i(n,0,3),r=i(a,0,3),l=i(o,6,9),c=window.location&&window.location.pathname?window.location.pathname:"",d=E().filter(e=>e.path!==c);function p(e,n,a={}){if(!n||!n.length)return;const o=document.createElement("section");o.className="pp-rec-group",a.isSuggested&&o.classList.add("pp-rec-group-suggested");const i=document.createElement("div");if(i.className="pp-rec-group-title",i.textContent=e,o.appendChild(i),a.isSuggested){const e=document.createElement("div");e.className="pp-rec-ai-badge",e.innerHTML='',o.appendChild(e)}const s=document.createElement("ul");s.className="pp-rec-list",n.forEach(e=>{s.appendChild(k(e,{showScore:!!a.isSuggested}))}),o.appendChild(s),t.appendChild(o)}p("Suggested Next",s,{isSuggested:!0}),p("Most Popular",r),p("Recently Visited",d),p("Trending",l)}function x(e=3){w.innerHTML="";const t=document.createElement("div");t.className="pp-rec-skeleton-wrap";for(let n=0;n\n
    \n
    \n
    \n \n ';w.appendChild(t)}function T(){x(3),o("/wp-json/path-pilot/v1/suggest",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({current:window.location.pathname,history:JSON.parse(sessionStorage.getItem("path_pilot_history")||"[]")})}).then(e=>e.json()).then(e=>{console.log("Path Pilot: Received recommendations data:",e),e&&e.recommendations?L(e.recommendations):(console.warn("Path Pilot: No recommendations in response"),L([]))}).catch(e=>{console.error("Path Pilot: Error fetching recommendations:",e),L([])})}N();let A=!1;function M(e=3){v.innerHTML="";for(let t=0;t\n
    \n
    \n
    \n \n '}async function H(){if(A)return;A=!0;const e="path_pilot_summary_"+window.location.pathname;try{if(window.localStorage){const t=localStorage.getItem(e);if(t){const e=JSON.parse(t),n=864e5;if(e&&e.timestamp&&Date.now()-e.timestampRelated pages\n \n `,v.appendChild(t)}return}}}}catch(e){}M(3);try{const t=await fetch("/wp-json/path-pilot/v1/summary",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({path:window.location.pathname})}),n=await t.json();v.innerHTML="";const a=document.createElement("div");if(a.className="pp-summary-page-title",a.textContent=document.title||"",v.appendChild(a),!n||n.error)return void(v.innerHTML=`
    ${n&&n.error||"Unable to load summary."}
    `);const o=document.createElement("div");if(o.className="pp-summary-body",o.innerHTML=n.summary_html,v.appendChild(o),Array.isArray(n.related_pages)&&n.related_pages.length){const e=document.createElement("div");e.className="pp-summary-related",e.innerHTML=`\n \n \n `,v.appendChild(e)}try{window.localStorage&&localStorage.setItem(e,JSON.stringify({timestamp:Date.now(),summary_html:n.summary_html,related_pages:n.related_pages||[]}))}catch(e){}}catch(e){console.error("Path Pilot: Error loading page summary:",e),v.innerHTML='
    Error loading summary.
    '}}function O(e){const t=f.querySelector(".pp-drawer-title");t&&(t.textContent=e)}function j(){i||(i=!0,p.classList.remove("collapsed"),p.classList.add("expanded"),p.setAttribute("aria-hidden","false"),document.body.classList.add("pp-sidebar-open"),f.dataset.loaded||(T(),f.dataset.loaded="1"),c())}function J(){if(i){try{const e=document.activeElement;if(e&&p.contains(e)){const e=p.querySelector(".pp-sidebar-brand")||document.body;e&&"function"==typeof e.focus&&e.focus()}}catch(e){}i=!1,p.classList.remove("expanded"),p.classList.add("collapsed"),p.setAttribute("aria-hidden","true"),document.body.classList.remove("pp-sidebar-open"),s=null,c()}}function I(e){s=e,S.forEach(t=>{const n=t.id===e;t.button&&t.button.classList.toggle("is-active",n),t.section&&(t.section.style.display=n?"":"none")});const t=S.find(t=>t.id===e);t&&O(t.label)}function $(e){if(!i)return I(e.id),"summary"===e.id&&H(),void j();I(e.id),"summary"===e.id&&H(),c()}S.forEach(e=>{e.button&&e.button.addEventListener("click",function(){$(e)})}),y.addEventListener("click",function(){J()}),document.addEventListener("keydown",function(e){"Escape"===e.key&&J()});const R=l();if(R&&R.open){const e=S.length?S[0].id:null,t=R.tab&&S.some(e=>e.id===R.tab)?R.tab:e;t&&(I(t),j(),"summary"===t&&H())}}()})}()}(); +!function(){"use strict";!function(){function e(e){switch(e){case"compass":return'';case"info":return'';case"search":return'';case"dockRight":return'';case"close":return'';default:return""}}document.addEventListener("DOMContentLoaded",function(){!function(){if(window.PathPilotStatus&&!0===window.PathPilotStatus.insights_only)return void console.log("Path Pilot: Insights only mode enabled - skipping drawer initialization");if(!document.querySelector('link[href*="path-pilot-icons.css"]')){var t=document.createElement("link");t.rel="stylesheet",t.href=window.PathPilotStatus&&window.PathPilotStatus.icon_css_url||"/wp-content/plugins/path-pilot/assets/css/path-pilot-icons.css",document.head.appendChild(t)}let n=window.PathPilotStatus?window.PathPilotStatus.nonce:null;function a(){return fetch("/wp-json/path-pilot/v1/nonce").then(e=>e.json()).then(e=>(e.nonce&&(n=e.nonce),n)).catch(()=>n)}async function o(e,t){const o=n=>{const a={...t.headers,"X-WP-Nonce":n};return fetch(e,{...t,headers:a})};let i=await o(n);if(403===i.status){const e=await a();i=await o(e)}return i}function i(){if("undefined"==typeof window)return!1;if(window.matchMedia)try{return window.matchMedia("(max-width: 900px)").matches}catch(e){}return window.innerWidth<=900}a();let s=!1,r=null;const l="path_pilot_drawer_state";function c(){try{const e=window.localStorage?localStorage.getItem(l):null;return e?JSON.parse(e):null}catch(e){return null}}function d(){try{if(!window.localStorage)return;if(i())return void localStorage.removeItem(l);const e={open:s,tab:r||null};localStorage.setItem(l,JSON.stringify(e))}catch(e){}}const p=[{id:"recommendations",label:"Site navigation",icon:"compass"},...window.PathPilotPro||window.PathPilotStatus&&(window.PathPilotStatus.has_pro||window.PathPilotStatus.is_pro)?[{id:"summary",label:"Page summary",icon:"info"},{id:"search",label:"Search",icon:"search"}]:[]],u=document.createElement("div");u.id="path-pilot-sidebar",u.className="pp-sidebar collapsed",u.setAttribute("role","complementary"),u.setAttribute("aria-label","Path Pilot panel"),u.setAttribute("aria-hidden","true"),document.body.appendChild(u),document.body.classList.add("pp-sidebar-present");const m=document.createElement("div");m.className="pp-sidebar-inner",u.appendChild(m);const h=document.createElement("button");h.type="button",h.className="pp-sidebar-brand",h.innerHTML='',h.setAttribute("title","Path Pilot"),h.setAttribute("aria-label","Open Path Pilot website"),h.addEventListener("click",function(){try{window.open("https://pathpilot.app","_blank","noopener,noreferrer")}catch(e){window.location.href="https://pathpilot.app"}}),m.appendChild(h);const f=document.createElement("nav");f.className="pp-sidebar-nav",f.setAttribute("aria-label","Path Pilot navigation"),m.appendChild(f);const y=document.createElement("div");y.className="pp-sidebar-content",u.appendChild(y);const w=document.createElement("button");w.type="button",w.className="pp-panel-close",w.setAttribute("aria-label","Close Path Pilot panel"),w.innerHTML=i()?e("close"):e("dockRight"),y.appendChild(w);const g=document.createElement("div");g.className="pp-drawer-title",g.textContent="Site navigation",y.appendChild(g);const v=document.createElement("div");v.className="pp-tab-root pp-tab-recommendations",y.appendChild(v);const b=document.createElement("div");b.className="pp-tab-root pp-tab-summary",b.style.display="none",y.appendChild(b);const C=document.createElement("div");C.className="pp-tab-root pp-tab-search",C.style.display="none",y.appendChild(C);const S={recommendations:v,summary:b,search:C},P=p.map(t=>{const n=document.createElement("button");return n.type="button",n.className="pp-nav-btn",n.setAttribute("data-view",t.id),n.setAttribute("title",t.label),n.setAttribute("aria-label",t.label),n.innerHTML=e(t.icon),f.appendChild(n),{...t,button:n,section:S[t.id]||null}});function E(){if("undefined"==typeof window||!window.localStorage)return[];try{const e=localStorage.getItem("path_pilot_recent_pages");if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch(e){return[]}}function N(){if("undefined"==typeof window||!window.localStorage)return;const e=window.location.pathname||"",t=window.location.href||e||"",n=document.title||t||e||"";let a=E().filter(t=>t.path!==e);a.unshift({path:e,url:t,title:n}),a.length>3&&(a=a.slice(0,3));try{localStorage.setItem("path_pilot_recent_pages",JSON.stringify(a))}catch(e){}}function k(e){return function(t){if(t&&"function"==typeof t.preventDefault&&t.preventDefault(),void 0!==e.page_id){const t=(document.cookie.match(/path_pilot_sid=([^;]+)/)||[])[1]||"";o("/wp-json/path-pilot/v1/rec-click",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({session_id:t,page_id:e.page_id})})}window.location.href=e.url}}function _(e,t){const n=!t||!1!==t.showScore,a=document.createElement("a");a.className="pp-rec-card-row",e.url&&(a.href=e.url);const o=document.createElement("div");o.className="pp-rec-card-title",o.textContent=e.title,a.appendChild(o);const i=document.createElement("div");if(i.className="pp-rec-card-meta",n&&e.score&&e.score>0){const t=document.createElement("span");t.className="pp-rec-card-percent",t.textContent=Math.round(e.score)+"%",i.appendChild(t)}return a.appendChild(i),a.addEventListener("click",k(e)),a}function L(e,t){const n=document.createElement("li");n.className="pp-rec-list-item";const a=_(e,t);return n.appendChild(a),n}function x(e){if(v.innerHTML="",!e||0===e.length)return void(v.innerHTML='
    No recommendations yet.
    ');const t=document.createElement("div");t.className="pp-rec-layout",v.appendChild(t);const n=e.filter(e=>"conversion_path"===e.badge),a=e.filter(e=>"popular"===e.badge);e.filter(e=>"related"===e.badge);const o=e.filter(e=>"newest"===e.badge);function i(t,n,a){return t.length?t:e.slice(n,a)}const s=i(n,0,3),r=i(a,0,3),l=i(o,6,9),c=window.location&&window.location.pathname?window.location.pathname:"",d=E().filter(e=>e.path!==c);function p(e,n,a={}){if(!n||!n.length)return;const o=document.createElement("section");o.className="pp-rec-group",a.isSuggested&&o.classList.add("pp-rec-group-suggested");const i=document.createElement("div");if(i.className="pp-rec-group-title",i.textContent=e,o.appendChild(i),a.isSuggested){const e=document.createElement("div");e.className="pp-rec-ai-badge",e.innerHTML='',o.appendChild(e)}const s=document.createElement("ul");s.className="pp-rec-list",n.forEach(e=>{s.appendChild(L(e,{showScore:!!a.isSuggested}))}),o.appendChild(s),t.appendChild(o)}p("Suggested Next",s,{isSuggested:!0}),p("Most Popular",r),p("Recently Visited",d),p("Trending",l)}function M(e=3){v.innerHTML="";const t=document.createElement("div");t.className="pp-rec-skeleton-wrap";for(let n=0;n\n
    \n
    \n
    \n \n ';v.appendChild(t)}function T(){M(3),o("/wp-json/path-pilot/v1/suggest",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({current:window.location.pathname,history:JSON.parse(sessionStorage.getItem("path_pilot_history")||"[]")})}).then(e=>e.json()).then(e=>{console.log("Path Pilot: Received recommendations data:",e),e&&e.recommendations?x(e.recommendations):(console.warn("Path Pilot: No recommendations in response"),x([]))}).catch(e=>{console.error("Path Pilot: Error fetching recommendations:",e),x([])})}N(),T();let A=!1;function H(e=3){b.innerHTML="";for(let t=0;t\n
    \n
    \n
    \n \n '}async function O(){if(A)return;A=!0;const e="path_pilot_summary_"+window.location.pathname;try{if(window.localStorage){const t=localStorage.getItem(e);if(t){const e=JSON.parse(t),n=864e5;if(e&&e.timestamp&&Date.now()-e.timestampRelated pages\n \n `,b.appendChild(t)}return}}}}catch(e){}H(3);try{const t=await fetch("/wp-json/path-pilot/v1/summary",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({path:window.location.pathname})}),n=await t.json();b.innerHTML="";const a=document.createElement("div");if(a.className="pp-summary-page-title",a.textContent=document.title||"",b.appendChild(a),!n||n.error)return void(b.innerHTML=`
    ${n&&n.error||"Unable to load summary."}
    `);const o=document.createElement("div");if(o.className="pp-summary-body",o.innerHTML=n.summary_html,b.appendChild(o),Array.isArray(n.related_pages)&&n.related_pages.length){const e=document.createElement("div");e.className="pp-summary-related",e.innerHTML=`\n \n \n `,b.appendChild(e)}try{window.localStorage&&localStorage.setItem(e,JSON.stringify({timestamp:Date.now(),summary_html:n.summary_html,related_pages:n.related_pages||[]}))}catch(e){}}catch(e){console.error("Path Pilot: Error loading page summary:",e),b.innerHTML='
    Error loading summary.
    '}}function j(e){const t=y.querySelector(".pp-drawer-title");t&&(t.textContent=e)}function J(){s||(s=!0,u.classList.remove("collapsed"),u.classList.add("expanded"),u.setAttribute("aria-hidden","false"),document.body.classList.add("pp-sidebar-open"),d())}function I(){if(s){try{const e=document.activeElement;if(e&&u.contains(e)){const e=u.querySelector(".pp-sidebar-brand")||document.body;e&&"function"==typeof e.focus&&e.focus()}}catch(e){}s=!1,u.classList.remove("expanded"),u.classList.add("collapsed"),u.setAttribute("aria-hidden","true"),document.body.classList.remove("pp-sidebar-open"),r=null,P.forEach(e=>{e.button&&e.button.classList.remove("is-active"),e.section&&(e.section.style.display="none")}),d()}}function $(e){r=e,P.forEach(t=>{const n=t.id===e;t.button&&t.button.classList.toggle("is-active",n),t.section&&(t.section.style.display=n?"":"none")});const t=P.find(t=>t.id===e);t&&j(t.label)}function B(e){if(!s)return $(e.id),"summary"===e.id&&O(),void J();$(e.id),"summary"===e.id&&O(),d()}P.forEach(e=>{e.button&&e.button.addEventListener("click",function(){B(e)})}),w.addEventListener("click",function(){I()}),document.addEventListener("keydown",function(e){"Escape"===e.key&&I()});const R=i()?null:c();if(R&&R.open){const e=P.length?P[0].id:null,t=R.tab&&P.some(e=>e.id===R.tab)?R.tab:e;t&&($(t),J(),"summary"===t&&O())}}()})}()}(); diff --git a/scripts/index.js b/scripts/index.js index 9b19c59..0aa4abd 100644 --- a/scripts/index.js +++ b/scripts/index.js @@ -26,13 +26,20 @@ '' + '' ); - case 'dockRight': // drawer closer + case 'dockRight': // drawer closer (desktop) return ( '' ); + case 'close': // mobile close icon + return ( + '' + ); default: return ''; } @@ -98,6 +105,17 @@ } // --- Sidebar state --- + function isMobileViewport() { + if (typeof window === 'undefined') return false; + if (window.matchMedia) { + try { + return window.matchMedia('(max-width: 900px)').matches; + } catch (e) { + // fall through + } + } + return window.innerWidth <= 900; + } let isExpanded = false; let activeTabId = null; const DRAWER_STORAGE_KEY = 'path_pilot_drawer_state'; @@ -115,6 +133,12 @@ function persistDrawerState() { try { if (!window.localStorage) return; + // On mobile, do not persist open state so the panel always + // starts collapsed on each page load. + if (isMobileViewport()) { + localStorage.removeItem(DRAWER_STORAGE_KEY); + return; + } const state = { open: isExpanded, tab: activeTabId || null @@ -126,22 +150,33 @@ } // --- Tab configuration (pluggable) --- + // Free version should only expose the Site Navigation tab. + // Pro adds Page Summary and Search (chat) tabs. + const hasProFeatures = + !!(window.PathPilotPro) || + !!(window.PathPilotStatus && (window.PathPilotStatus.has_pro || window.PathPilotStatus.is_pro)); + const TAB_DEFS = [ { id: 'recommendations', label: 'Site navigation', icon: 'compass', }, - { - id: 'summary', - label: 'Page summary', - icon: 'info', - }, - { - id: 'search', - label: 'Search', - icon: 'search', - }, + // Conditionally include Pro-only tabs + ...(hasProFeatures + ? [ + { + id: 'summary', + label: 'Page summary', + icon: 'info', + }, + { + id: 'search', + label: 'Search', + icon: 'search', + }, + ] + : []), ]; // --- Sidebar Container (always visible on the left) --- @@ -193,7 +228,8 @@ panelClose.type = 'button'; panelClose.className = 'pp-panel-close'; panelClose.setAttribute('aria-label', 'Close Path Pilot panel'); - panelClose.innerHTML = ppIcon('dockRight'); + // Desktop uses dockRight icon; mobile uses X/close icon + panelClose.innerHTML = isMobileViewport() ? ppIcon('close') : ppIcon('dockRight'); panel.appendChild(panelClose); // Panel header title (changes with active tab) @@ -447,7 +483,8 @@ renderRecommendations([]); }); } - // Default view shows recs when panel first expands + // Default view: start loading recommendations as soon as Path Pilot initializes + fetchRecommendations(); // --- Summary tab logic --- let summaryLoaded = false; @@ -584,11 +621,6 @@ sidebar.classList.add('expanded'); sidebar.setAttribute('aria-hidden', 'false'); document.body.classList.add('pp-sidebar-open'); - // Load data on first open - if (!panel.dataset.loaded) { - fetchRecommendations(); - panel.dataset.loaded = '1'; - } persistDrawerState(); } @@ -616,6 +648,15 @@ sidebar.setAttribute('aria-hidden', 'true'); document.body.classList.remove('pp-sidebar-open'); activeTabId = null; + // Clear active visuals and hide tab sections when collapsed + tabs.forEach(tab => { + if (tab.button) { + tab.button.classList.remove('is-active'); + } + if (tab.section) { + tab.section.style.display = 'none'; + } + }); persistDrawerState(); } @@ -674,8 +715,8 @@ } }); - // --- Restore persisted state on load --- - const savedState = loadDrawerState(); + // --- Restore persisted state on load (desktop only) --- + const savedState = isMobileViewport() ? null : loadDrawerState(); if (savedState && savedState.open) { const fallbackId = tabs.length ? tabs[0].id : null; const tabId = savedState.tab && tabs.some(t => t.id === savedState.tab) From a411fd5e1e52cdc97b40da9cd7602c69a6a86f99 Mon Sep 17 00:00:00 2001 From: docvars Date: Tue, 18 Nov 2025 07:46:03 -0600 Subject: [PATCH 5/5] front-end build update --- frontend/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/index.js b/frontend/index.js index 88fc9d1..1602957 100644 --- a/frontend/index.js +++ b/frontend/index.js @@ -5,3 +5,4 @@ import '../assets/css/style.css'; import '../scripts/index.js'; +