{"version":3,"file":"cssettings.umd.cjs","sources":["../src/scripts/config.ts","../src/scripts/state.ts","../src/scripts/utils.ts","../src/scripts/storage.ts","../src/scripts/styles.ts","../src/scripts/panel.ts","../src/scripts/parser.ts","../src/main.ts"],"sourcesContent":["import packageJson from \"../../package.json\";\n\nexport const CONFIG = {\n  VERSION: packageJson.version,\n  PANEL_ID: \"settings-panel\",\n  STORAGE_PREFIX: \"settings-\",\n  SELECTORS: {\n    STYLE_TAGS: \"style\"\n  },\n  PATTERNS: {\n    INLINE_SETTING: /(--[\\w-]+):\\s*([^;]+);?\\s*\\/\\*\\s*@settings\\s+(?:\\[(data-[\\w-]+)\\]\\s*)?(.+?)\\s*\\*\\//,\n    VARIABLE: /(--[\\w-]+):\\s*([^;]+);?/,\n    COMMENT_SETTING: /\\/\\*\\s*@settings\\s+(?:\\[(data-[\\w-]+)\\]\\s*)?(.+?)\\s*\\*\\//\n  },\n};\n","export interface Setting {\n  variable: string;\n  value: string;\n  values: string[];\n  dataAttr?: string;\n  selector: string;\n}\n\nexport interface PendingBlock {\n  selector: string;\n  settings: Setting[];\n  id: number;\n}\n\nexport interface State {\n  settings: Setting[];\n  pendingBlocks: PendingBlock[];\n  blockId: number;\n  storageKey: string;\n  lockPosition: string;\n  offsetX: number;\n  offsetY: number;\n  initialX: number;\n  initialY: number;\n  isCollapsed: boolean;\n  panelSize: {\n    width: number | null;\n    height: number | null;\n  };\n  collapsedGroups: Set<string>;\n}\n\nexport let isRestoring = false;\n\nexport const CANONICAL_ID = (() => {\n  const canonicalLink = document.querySelector('link[rel=\"canonical\"]');\n  if (!canonicalLink) return null;\n  const href = canonicalLink.getAttribute(\"href\");\n  const match = href?.match(/pen\\/([\\w-]+)/);\n  return match?.[1] || null;\n})();\n\nexport const STORAGE_KEY = (suffix: string) => {\n  const id = `${CANONICAL_ID}-${location.pathname}-${window.location}`;\n  return `settings-panel-${id}-${suffix}`;\n};\n\nexport const state: State = {\n  settings: [],\n  pendingBlocks: [],\n  blockId: 0,\n  storageKey: STORAGE_KEY(\"main\"),\n  lockPosition: \"\",\n  offsetX: 0,\n  offsetY: 0,\n  initialX: 0,\n  initialY: 0,\n  isCollapsed: false,\n  panelSize: { width: null, height: null },\n  collapsedGroups: new Set()\n};\n\nexport const setIsRestoring = (value: boolean) => {\n  isRestoring = value;\n};\n","export const utils = {\n  createElement(tag: string, styles = {}, domProps = {}, htmlAttributes = {}) {\n    const element = document.createElement(tag);\n    Object.assign(element.style, styles);\n\n    // Séparer les propriétés DOM des attributs HTML\n    for (const [key, value] of Object.entries(domProps)) {\n      if (key in element) {\n        (element as any)[key] = value;\n      } else {\n        element.setAttribute(key, String(value));\n      }\n    }\n\n    // Appliquer les attributs HTML explicites\n    for (const [key, value] of Object.entries(htmlAttributes)) {\n      element.setAttribute(key, String(value));\n    }\n\n    return element;\n  },\n\n  applyStyles(element: HTMLElement, styles: Record<string, string>) {\n    Object.assign(element.style, styles);\n  },\n\n  safeQuerySelector(selector: string) {\n    try {\n      return document.querySelector(selector);\n    } catch (err) {\n      console.warn(`❌ Selector issue: ${selector}`, err);\n      return null;\n    }\n  },\n\n  getComputedValue(selector: string, variable: string, defaultValue: string) {\n    try {\n      const element = this.safeQuerySelector(selector);\n      if (element) {\n        const computedValue = getComputedStyle(element).getPropertyValue(\n          variable\n        );\n        return computedValue ? computedValue.trim() : defaultValue;\n      }\n    } catch (err) {\n      console.warn(\n        `❌ Failed to get computed value for ${variable} on ${selector}`,\n        err\n      );\n    }\n    return defaultValue;\n  },\n\n  isHorizontalLock(position: string) {\n    return position === \"top\" || position === \"bottom\";\n  },\n\n  isVerticalLock(position: string) {\n    return position === \"left\" || position === \"right\";\n  }\n};\n","import { isRestoring, state } from \"./state\";\nimport { utils } from \"./utils\";\n\nexport const storage = {\n  save() {\n    console.log(\n      \"💾 save() called\",\n      JSON.stringify(storage.getVariableValues())\n    );\n\n    if (isRestoring) {\n      console.log(\"⏸️ Skipping save during restore\");\n      return;\n    }\n    const data = {\n      lockPosition: state.lockPosition,\n      isCollapsed: state.isCollapsed,\n      panelSize: state.panelSize,\n      collapsedGroups: Array.from(state.collapsedGroups),\n      variableValues: this.getVariableValues()\n    };\n    localStorage.setItem(state.storageKey, JSON.stringify(data));\n    console.log(\"💾 Settings saved to localStorage\");\n  },\n\n  applyVariableValues(variableValues: Record<string, string>) {\n    Object.entries(variableValues).forEach(([key, value]) => {\n      const lastColon = key.lastIndexOf(\":\");\n      if (lastColon <= 0) return;\n\n      const selector = key.slice(0, lastColon);\n      const variable = key.slice(lastColon);\n\n      try {\n        const targets = document.querySelectorAll(selector);\n        targets.forEach((target) => {\n          if (target instanceof HTMLElement) {\n            target.style.setProperty(variable, value);\n          }\n        });\n        console.log(`🎯 ${variable} = ${value} on ${selector}`);\n      } catch (e) {\n        console.warn(\n          `⚠️ Failed to apply variable ${variable} on ${selector}:`,\n          e\n        );\n      }\n    });\n  },\n\n  load() {\n    const raw = localStorage.getItem(state.storageKey);\n    if (!raw) return null;\n    try {\n      const data = JSON.parse(raw);\n\n      if (data.collapsedGroups && Array.isArray(data.collapsedGroups)) {\n        state.collapsedGroups = new Set(data.collapsedGroups);\n      }\n\n      console.log(\"📂 Settings loaded from localStorage\");\n      return data;\n    } catch (err) {\n      console.warn(\"⚠️ Failed to parse settings from localStorage\", err);\n      return null;\n    }\n  },\n  getVariableValues() {\n    const values: Record<string, string> = {};\n    state.settings.forEach((setting: { selector: string; variable: string }) => {\n      const element = utils.safeQuerySelector(setting.selector);\n      if (!element) return;\n\n      let value = (element as HTMLElement).style.getPropertyValue(setting.variable)?.trim();\n      if (!value) {\n        value = getComputedStyle(element)\n          .getPropertyValue(setting.variable)\n          ?.trim();\n      }\n\n      if (value) {\n        values[`${setting.selector}:${setting.variable}`] = value;\n      }\n    });\n    return values;\n  },\n\n\n};\n","import type { CONFIG } from \"./config\";\n\nexport const PANEL_STYLES = (config: typeof CONFIG) => `\n      /* Reset styles for shadow DOM */\n      * {\n        margin: 0;\n        padding: 0;\n        box-sizing: border-box;\n      }\n\n      /* Global styles */\n      :host {\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100vw;\n        height: 100vh;\n        pointer-events: none;\n        z-index: 9999;\n        letter-spacing: normal;\n        word-spacing: normal;\n        line-height: 1.4;\n        text-transform: none;\n        font-weight: normal;\n        font-style: normal;\n        text-decoration: none;\n      }\n\n      /* Panel states */\n      #${config.PANEL_ID} {\n        pointer-events: auto;\n        position: fixed;\n        background: rgba(15, 23, 42, 0.95);\n        backdrop-filter: blur(20px) saturate(180%);\n        border: 1px solid rgba(148, 163, 184, 0.2);\n        border-radius: 8px;\n        box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.05);\n        color: #f8fafc;\n        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n        overflow: hidden;\n        z-index: 9999;\n        max-width: 420px;\n        min-width: 280px;\n        width: auto;\n        height: auto;\n        max-height: 500px;\n        user-select: none;\n        bottom: 1.5rem;\n        left: 1.5rem;\n        display: flex;\n        flex-direction: column;\n        resize: both;\n        opacity: 1;\n        transform: translateY(0) scale(1);\n        transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      }\n\n      /* Panel states classes */\n      #${config.PANEL_ID}.panel-hidden {\n        display: none;\n      }\n\n      #${config.PANEL_ID}.panel-opening {\n        opacity: 0;\n        transform: translateY(20px) scale(0.95);\n      }\n\n      #${config.PANEL_ID}.panel-closing {\n        opacity: 0;\n        transform: translateY(10px) scale(0.98);\n      }\n\n      #${config.PANEL_ID}.panel-visible {\n        opacity: 1;\n        transform: translateY(0) scale(1);\n      }\n\n      /* Content visibility states */\n      #${config.PANEL_ID} .content-visible {\n        opacity: 1;\n        transform: translateY(0);\n        transition: all 0.2s ease;\n        display: flex;\n        flex-direction: column;\n        align-items: flex-start;\n        overflow-y: auto;\n        overflow-x: hidden;\n        min-height: 0;\n        position: relative;\n        gap: 0.5rem;\n        padding: 0.5rem;\n      }\n\n      #${config.PANEL_ID} .content-hidden {\n        display: none !important;\n        opacity: 0;\n        transform: translateY(-5px);\n      }\n\n      /* Description block styles */\n      #${config.PANEL_ID} .description-block {\n        flex-shrink: 0;\n        padding: 0.75rem;\n        background: rgba(15, 23, 42, 0.6);\n        border-bottom: 1px solid rgba(148, 163, 184, 0.1);\n        text-wrap: pretty;\n      }\n\n      #${config.PANEL_ID} .description-text {\n        color: #cbd5e1;\n        font-size: 0.75rem;\n        line-height: 1.4;\n        margin: 0;\n        opacity: 0.9;\n        text-wrap: pretty;\n      }\n\n      /* Scrollbar styles */\n      #${config.PANEL_ID} *::-webkit-scrollbar {\n        width: 6px;\n      }\n      #${config.PANEL_ID} *::-webkit-scrollbar-track {\n        background: rgba(30, 41, 59, 0.3);\n        border-radius: 3px;\n      }\n      #${config.PANEL_ID} *::-webkit-scrollbar-thumb {\n        background: rgba(148, 163, 184, 0.3);\n        border-radius: 3px;\n        transition: background 0.2s ease;\n      }\n      #${config.PANEL_ID} *::-webkit-scrollbar-thumb:hover {\n        background: rgba(148, 163, 184, 0.5);\n      }\n      \n      /* Range slider styles */\n      #${config.PANEL_ID} input[type=\"range\"] {\n        -webkit-appearance: none;\n        height: 6px;\n        background: rgba(148, 163, 184, 0.3);\n        border-radius: 3px;\n        outline: none;\n        opacity: 0.7;\n        transition: opacity 0.2s;\n        flex: 1 1 auto;\n        min-width: 100px;\n        cursor: pointer;\n      }\n      \n      #${config.PANEL_ID} input[type=\"range\"]:hover {\n        opacity: 1;\n      }\n      \n      #${config.PANEL_ID} input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        appearance: none;\n        width: 16px;\n        height: 16px;\n        border-radius: 50%;\n        background: #667eea;\n        cursor: pointer;\n        box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n        transition: all 0.2s ease;\n      }\n      \n      #${config.PANEL_ID} input[type=\"range\"]::-webkit-slider-thumb:hover {\n        background: #818cf8;\n        transform: scale(1.1);\n      }\n      \n      #${config.PANEL_ID} input[type=\"range\"]::-moz-range-thumb {\n        width: 16px;\n        height: 16px;\n        border-radius: 50%;\n        background: #667eea;\n        cursor: pointer;\n        border: none;\n        box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n      }\n\n      /* Header styles */\n      #${config.PANEL_ID} .panel-header {\n        flex-shrink: 0;\n        position: sticky;\n        top: 0;\n        z-index: 2;\n        background: rgba(15, 23, 42, 0.95);\n        background-image: linear-gradient(135deg, rgba(99, 102, 241, 0.1) 0%, rgba(168, 85, 247, 0.1) 100%);\n        border-bottom: 1px solid rgba(148, 163, 184, 0.1);\n        padding: 0.5rem 0.75rem;\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n      }\n\n      #${config.PANEL_ID} .panel-header .header-left {\n        display: flex;\n        align-items: center;\n        gap: 0.5rem;\n      }\n\n      #${config.PANEL_ID} .panel-header .header-title {\n        font-weight: 600;\n        color: #e2e8f0;\n        font-size: 0.9rem;\n      }\n\n      #${config.PANEL_ID} .panel-header.draggable {\n        cursor: grab;\n      }\n\n      #${config.PANEL_ID} .panel-header.dragging {\n        cursor: grabbing;\n      }\n\n      /* Button styles */\n      #${config.PANEL_ID} .btn {\n        background: rgba(148, 163, 184, 0.1);\n        border: 1px solid rgba(148, 163, 184, 0.2);\n        border-radius: 8px;\n        color: #cbd5e1;\n        cursor: pointer;\n        font-size: 12px;\n        padding: 0.25rem 0.5rem;\n        transition: all 0.2s ease;\n        min-width: 24px;\n        height: 24px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n      }\n\n      #${config.PANEL_ID} .btn:hover {\n        background: rgba(148, 163, 184, 0.2);\n        border-color: rgba(148, 163, 184, 0.3);\n        color: #f8fafc;\n      }\n\n      #${config.PANEL_ID} .btn-close {\n        background: rgba(239, 68, 68, 0.1);\n        border-color: rgba(239, 68, 68, 0.2);\n        color: #fca5a5;\n      }\n\n      #${config.PANEL_ID} .btn-close:hover {\n        background: rgba(239, 68, 68, 0.2);\n        border-color: rgba(239, 68, 68, 0.3);\n        color: #f87171;\n      }\n\n      /* Select control styles */\n      #${config.PANEL_ID} .lock-select {\n        background: rgba(30, 41, 59, 0.8);\n        border: 1px solid rgba(148, 163, 184, 0.2);\n        border-radius: 8px;\n        color: #cbd5e1;\n        cursor: pointer;\n        font-size: 12px;\n        padding: 0.25rem 0.5rem;\n        transition: all 0.2s ease;\n        min-width: 100px;\n      }\n\n      #${config.PANEL_ID} .lock-select:focus {\n        border-color: rgba(99, 102, 241, 0.5);\n        box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.1);\n      }\n\n      /* Group styles */\n      #${config.PANEL_ID} .group {\n        margin-bottom: 0;\n        background: rgba(30, 41, 59, 0.3);\n        border-radius: 6px;\n        padding: 0;\n        border: 1px solid rgba(148, 163, 184, 0.1);\n        transition: all 0.2s ease;\n        overflow: hidden;\n        width: 100%;\n      }\n\n      #${config.PANEL_ID} .group:hover {\n        background: rgba(30, 41, 59, 0.4);\n        border-color: rgba(148, 163, 184, 0.2);\n      }\n\n      #${config.PANEL_ID} .group-header {\n        font-weight: 600;\n        color: #e2e8f0;\n        font-size: 0.875rem;\n        display: flex;\n        align-items: center;\n        gap: 0.5rem;\n        padding: 0.25rem;\n        cursor: pointer;\n        transition: all 0.2s ease;\n        background: rgba(15, 23, 42, 0.2);\n      }\n\n      #${config.PANEL_ID} .group-header:hover {\n        background: rgba(15, 23, 42, 0.4);\n      }\n\n      #${config.PANEL_ID} .group-header.has-border {\n        border-bottom: 1px solid rgba(148, 163, 184, 0.1);\n      }\n\n      #${config.PANEL_ID} .chevron {\n        font-size: 0.7rem;\n        transition: transform 0.2s ease;\n        color: #94a3b8;\n      }\n\n      #${config.PANEL_ID} .chevron.rotated {\n        transform: rotate(-90deg);\n      }\n\n      #${config.PANEL_ID} .selector-text {\n        flex: 1;\n      }\n\n      #${config.PANEL_ID} .count-badge {\n        background: rgba(99, 102, 241, 0.2);\n        color: #a5b4fc;\n        padding: 0.125rem 0.375rem;\n        border-radius: 10px;\n        font-size: 0.7rem;\n        font-weight: 500;\n      }\n\n      #${config.PANEL_ID} .group-content {\n        padding: 0.5rem;\n        max-height: none;\n        overflow: hidden;\n        opacity: 1;\n        transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      }\n  \n      #${config.PANEL_ID} .group-content.collapsed {\n        max-height: 0;\n        opacity: 0;\n        padding: 0;\n      }\n\n      /* Variable control styles */\n      #${config.PANEL_ID} .variable-control {\n        display: flex;\n        align-items: center;\n        gap: 0.25rem;\n        flex-direction: row;\n        flex: 1 1 auto;\n        margin-bottom: 0.5rem;\n        padding: 0.5rem;\n        border-radius: 8px;\n        background: rgba(15, 23, 42, 0.5);\n        border: 1px solid rgba(148, 163, 184, 0.05);\n        transition: all 0.2s ease;\n      }\n\n      #${config.PANEL_ID} .variable-control:hover {\n        background: rgba(15, 23, 42, 0.7);\n        border-color: rgba(148, 163, 184, 0.1);\n      }\n\n      #${config.PANEL_ID} .variable-label {\n        font-weight: 500;\n        color: #cbd5e1;\n        font-size: 0.8rem;\n        min-width: 80px;\n        flex: 0 0 auto;\n      }\n\n      /* Control specific styles */\n      #${config.PANEL_ID} .select-control {\n        padding: 0.25rem 0.35rem;\n        border-radius: 8px;\n        border: 1px solid rgba(148, 163, 184, 0.2);\n        background: rgba(30, 41, 59, 0.8);\n        color: #f8fafc;\n        cursor: pointer;\n        font-size: 0.8rem;\n        flex: 1 1 auto;\n        transition: all 0.2s ease;\n        min-width: 120px;\n      }\n\n      #${config.PANEL_ID} .select-control:focus {\n        border-color: rgba(99, 102, 241, 0.5);\n        box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.1);\n        background: rgba(30, 41, 59, 0.9);\n      }\n\n      #${config.PANEL_ID} .select-option {\n        background: #1e293b;\n        color: #f8fafc;\n      }\n\n      /* Color control styles */\n      #${config.PANEL_ID} .color-control {\n        display: flex;\n        align-items: center;\n        gap: 0.5rem;\n        flex: 1 1 auto;\n      }\n\n      #${config.PANEL_ID} .color-input {\n        border-radius: 6px;\n        border: 1px solid rgba(148, 163, 184, 0.2);\n        background: rgba(30, 41, 59, 0.8);\n        cursor: pointer;\n        width: 40px;\n        height: 32px;\n        padding: 2px;\n      }\n\n      #${config.PANEL_ID} .color-palette {\n        display: flex;\n        gap: 0.25rem;\n        flex-wrap: wrap;\n        flex: 1 1 auto;\n      }\n\n      #${config.PANEL_ID} .color-swatch {\n        width: 20px;\n        height: 20px;\n        border-radius: 4px;\n        border: 2px solid rgba(148, 163, 184, 0.3);\n        cursor: pointer;\n        transition: all 0.2s ease;\n      }\n\n      #${config.PANEL_ID} .color-swatch:hover {\n        transform: scale(1.1);\n        border-color: rgba(99, 102, 241, 0.5);\n      }\n\n      #${config.PANEL_ID} .color-swatch.selected {\n        box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.5);\n      }\n\n      /* Range control styles */\n      #${config.PANEL_ID} .range-control {\n        display: flex;\n        align-items: center;\n        gap: 0.5rem;\n        flex: 1 1 auto;\n      }\n\n      #${config.PANEL_ID} .range-value {\n        min-width: 50px;\n        font-size: 0.8rem;\n        color: #cbd5e1;\n        font-weight: 500;\n        text-align: center;\n        background: rgba(30, 41, 59, 0.6);\n        padding: 0.25rem 0.5rem;\n        border-radius: 4px;\n        border: 1px solid rgba(148, 163, 184, 0.2);\n      }\n  \n      /* Footer styles */\n      #${config.PANEL_ID} .panel-footer {\n        flex-shrink: 0;\n        position: fixed;\n        bottom: 0;\n        z-index: 2;\n        background: rgba(15, 23, 42, 0.95);\n        background-image: linear-gradient(135deg, rgba(99, 102, 241, 0.1) 0%, rgba(168, 85, 247, 0.1) 100%);\n        border-top: 1px solid rgba(148, 163, 184, 0.1);\n        padding: 0.5rem 0.75rem;\n        width: 100%;\n        bottom: 0;\n        z-index: 1000;\n      }\n\n      #${config.PANEL_ID} .footer-text {\n        color: #cbd5e1;\n        font-size: 12px;\n        text-align: center;\n        margin: 0;\n      }\n    `\n","import { CONFIG } from \"./config\"\nimport { state } from \"./state\"\nimport { storage } from \"./storage\"\nimport { utils } from \"./utils\"\nimport type { Setting } from \"./state\"\nimport { PANEL_STYLES } from \"./styles\"\n\nconst COG_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" width=\"800\" height=\"800\" version=\"1.0\" viewBox=\"0 0 64 64\"><g fill=\"#fff\"><path d=\"M32 19.998c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm0 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8z\"/><path d=\"M60 23.998h-5.371a23.446 23.446 0 0 0-.97-2.348l3.798-3.797a4.003 4.003 0 0 0-.002-5.658l-5.658-5.656a3.999 3.999 0 0 0-5.655 0l-3.798 3.798A23.945 23.945 0 0 0 40 9.369V3.996a4.003 4.003 0 0 0-4.002-4l-8 .001a4 4 0 0 0-4 3.999V9.37a23.7 23.7 0 0 0-2.344.968l-3.797-3.797a4 4 0 0 0-5.657.001l-5.657 5.657a4 4 0 0 0 0 5.656l3.797 3.797c-.363.76-.686 1.544-.969 2.346H4a4 4 0 0 0-4 4v8a4 4 0 0 0 4 4h5.371c.283.803.605 1.587.97 2.348l-3.798 3.797a4.003 4.003 0 0 0 .002 5.658l5.658 5.656a3.999 3.999 0 0 0 5.655 0l3.798-3.798c.76.363 1.543.685 2.344.968V60a4.003 4.003 0 0 0 4.002 4l8-.001a4 4 0 0 0 4-3.999v-5.374a23.7 23.7 0 0 0 2.344-.968l3.797 3.797a4 4 0 0 0 5.657-.001l5.657-5.657a4 4 0 0 0 0-5.656l-3.797-3.797c.363-.76.686-1.544.969-2.346H60a4 4 0 0 0 4-4v-8a4 4 0 0 0-4-4zm-28 22c-7.732 0-14-6.268-14-14s6.268-14 14-14 14 6.268 14 14-6.268 14-14 14z\"/><circle cx=\"32\" cy=\"31.998\" r=\"2\"/></g></svg>`\n\n\n\nfunction injectSettingsToggle(panelInstance: SettingsPanel) {\n  const cog = utils.createElement(\n    \"button\",\n    {\n      position: \"fixed\",\n      bottom: \"1.5rem\",\n      right: \"1.5rem\",\n      zIndex: 9998,\n      background: \"rgba(10, 18, 52, 0.4)\",\n      backdropFilter: \"blur(10px)\",\n      color: \"#fff\",\n      border: \"none\",\n      borderRadius: \"50%\",\n      width: \"32px\",\n      height: \"32px\",\n      fontSize: \"18px\",\n      cursor: \"pointer\",\n      boxShadow: \"0 8px 25px rgba(102, 126, 234, 0.4), 0 4px 10px rgba(0,0,0,0.15)\",\n      transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n      display: \"flex\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n    },\n    {\n      id: \"settings-cog\",\n      innerHTML: COG_SVG,\n      title: \"Open Settings Panel\",\n    },\n  )\n\n  // Enhanced hover effects\n  cog.addEventListener(\"mouseenter\", () => {\n    utils.applyStyles(cog, {\n      transform: \"scale(1.1) rotate(90deg)\",\n      boxShadow: \"0 12px 35px rgba(102, 126, 234, 0.6), 0 6px 15px rgba(0,0,0,0.2)\",\n    })\n  })\n\n  cog.addEventListener(\"mouseleave\", () => {\n    utils.applyStyles(cog, {\n      transform: \"scale(1) rotate(0deg)\",\n      boxShadow: \"0 8px 25px rgba(102, 126, 234, 0.4), 0 4px 10px rgba(0,0,0,0.15)\",\n    })\n  })\n\n  cog.onclick = () => panelInstance.handleOpen()\n\n  document.body.appendChild(cog)\n}\n\nexport class SettingsPanel {\n  panel: HTMLElement | null\n  content: HTMLElement | null\n  lockSelect: HTMLElement | null\n  toggleBtn: HTMLElement | null\n  resizeObserver: ResizeObserver | null\n  shadowHost: HTMLElement | null\n  shadowRoot: ShadowRoot | null\n  isDragging = false;\n  startX = 0;\n  startY = 0;\n  startWidth = 0;\n  startHeight = 0;\n  private boundHandleMouseDown = this.handleMouseDown.bind(this);\n  // Créez des méthodes bound une fois\n  private boundMouseEnter = () => {\n    this.isMouseOverPanel = true;\n    this.handleBodyScroll();\n  };\n\n  private boundMouseLeave = () => {\n    this.isMouseOverPanel = false;\n    this.handleBodyScroll();\n  };\n\n  private highlightedElements: Element[] = [];\n\n  constructor() {\n    this.panel = null\n    this.content = null\n    this.lockSelect = null\n    this.toggleBtn = null\n    this.resizeObserver = null\n    this.shadowHost = null\n    this.shadowRoot = null\n    this.highlightedElements = []\n  }\n\n  private isMouseOverPanel: boolean = false\n  private handleBodyScroll() {\n    if (this.isMouseOverPanel && !state.isCollapsed) {\n      document.body.style.overflow = \"hidden\"\n    } else {\n      document.body.style.overflow = \"\"\n    }\n  }\n\n  create() {\n    this.destroy()\n    console.log(\"🔄 Creating shadow DOM...\")\n    this.createShadowDOM()\n    console.log(\"🔄 Creating main panel...\")\n    this.createMainPanel()\n    console.log(\"🔄 Creating header...\")\n    this.createHeader()\n\n    console.log(\"🔄 Creating content...\")\n    this.createContent()\n    console.log(\"🔄 Creating description block...\")\n    this.createDescriptionBlock()\n    console.log(\"🔄 Creating footer...\")\n    this.createFooter()\n    console.log(\"🔄 Setting up event listeners...\")\n    this.setupEventListeners()\n    console.log(\"🔄 Rendering settings...\")\n    this.renderSettings()\n    console.log(\"🔄 Applying initial state...\")\n    this.applyInitialState()\n\n    if (this.panel && this.shadowHost) {\n      this.panel.style.display = \"none\"\n      this.shadowRoot?.appendChild(this.panel)\n      document.body.appendChild(this.shadowHost)\n      injectSettingsToggle(this)\n      console.log(\"🧩 Injected enhanced settings panel in Shadow DOM.\")\n\n\n\n      // Puis utilisez-les\n      this.panel.addEventListener('mouseenter', this.boundMouseEnter);\n      this.panel.addEventListener('mouseleave', this.boundMouseLeave);\n    }\n  }\n\n  private restoreBodyStyles() {\n    // Supprimer tous les styles de docking\n    document.body.style.removeProperty('height');\n    document.body.style.removeProperty('width');\n    document.body.style.removeProperty('margin-top');\n    document.body.style.removeProperty('margin-bottom');\n    document.body.style.removeProperty('margin-left');\n    document.body.style.removeProperty('margin-right');\n    document.body.style.removeProperty('position');\n    document.body.style.removeProperty('top');\n    document.body.style.removeProperty('bottom');\n    document.body.style.removeProperty('left');\n    document.body.style.removeProperty('right');\n    document.body.style.removeProperty('box-sizing');\n  }\n\n\n  createShadowDOM() {\n    // Create shadow host element\n    this.shadowHost = document.createElement('div')\n    this.shadowHost.id = 'settings-panel-shadow-host'\n\n    // Attach shadow root\n    this.shadowRoot = this.shadowHost.attachShadow({ mode: 'closed' })\n\n    // Add global styles to shadow DOM\n    const styleSheet = document.createElement('style')\n    styleSheet.textContent = PANEL_STYLES(CONFIG)\n    this.shadowRoot.appendChild(styleSheet)\n  }\n\n  private handleClose() {\n    if (this.panel) {\n      // Remove any active highlights\n      this.removeHighlight();\n\n      // Animation de fermeture avec classes CSS\n      this.panel.classList.remove('panel-visible');\n      this.panel.classList.add('panel-closing');\n\n      // Attendre la fin de l'animation\n      setTimeout(() => {\n        this.destroy();\n\n        // Supprimer tous les cogs existants\n        const existingCogs = document.querySelectorAll('#settings-cog');\n        existingCogs.forEach(cog => cog.remove());\n\n        // Réinjecter un nouveau cog\n        injectSettingsToggle(this);\n\n        // Mettre à jour l'état\n        state.isCollapsed = true;\n        storage.save();\n      }, 300); // Durée de l'animation CSS\n      this.restoreBodyStyles()\n    }\n  }\n\n  public handleOpen() {\n    const existingCogs = document.querySelectorAll('#settings-cog');\n    existingCogs.forEach(cog => cog.remove());\n\n    // Supprimer l'ancien panel s'il existe\n    if (this.panel) {\n      this.panel.remove();\n    }\n\n    // Recréer complètement le panel\n    this.create();\n\n    // Animation d'ouverture avec classes CSS\n    if (this.panel) {\n      this.panel.classList.add('panel-opening');\n      this.panel.style.display = \"block\";\n\n      // Mettre à jour le contenu\n      if (this.content) {\n        this.content.classList.add('content-visible');\n        this.content.classList.remove('content-hidden');\n      }\n\n      // Déclencher l'animation d'ouverture\n      requestAnimationFrame(() => {\n        this.panel?.classList.remove('panel-opening');\n        this.panel?.classList.add('panel-visible');\n      });\n    }\n\n    // Mettre à jour l'état\n    state.isCollapsed = false;\n    storage.save();\n  }\n\n  destroy() {\n    // Remove any active highlights before destroying\n    this.removeHighlight();\n\n    // Nettoyer tous les événements\n    if (this.panel) {\n      const newPanel = this.panel.cloneNode(true) as HTMLElement;\n      this.panel.parentNode?.replaceChild(newPanel, this.panel);\n      this.panel = newPanel;\n      console.log(\"🗑️ Settings panel destroyed.\")\n\n      const header = this.panel.querySelector(\"div\");\n      if (header) {\n        header.removeEventListener(\"mousedown\", this.boundHandleMouseDown);\n      }\n\n      console.log(\"🗑️ Event listeners removed.\")\n    }\n\n    // Nettoyer le ResizeObserver\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n      this.resizeObserver = null;\n      console.log(\"🗑️ ResizeObserver destroyed.\")\n    }\n\n    // Supprimer le panel\n    if (this.panel) {\n      this.panel.remove();\n      this.panel = null;\n    }\n\n    // Nettoyer le Shadow DOM\n    if (this.shadowHost && this.shadowHost.parentNode) {\n      this.shadowHost.parentNode.removeChild(this.shadowHost);\n      document.body.style.overflow = \"\";\n      console.log(\"🗑️ ShadowHost destroyed.\")\n    }\n\n    // Réinitialiser toutes les propriétés\n    this.panel = null;\n    this.content = null;\n    this.lockSelect = null;\n    this.toggleBtn = null;\n    this.shadowHost = null;\n    this.shadowRoot = null;\n    this.isMouseOverPanel = false;\n    this.resizeObserver = null;\n    this.highlightedElements = [];\n\n    // Forcer le garbage collector (si possible)\n    if ((window as any).gc) {\n      (window as any).gc();\n    }\n  }\n\n  update() {\n    if (this.panel) {\n      this.destroy()\n    }\n    this.create()\n    console.log(\"🔄 Settings panel updated.\")\n  }\n\n  createMainPanel() {\n    this.panel = utils.createElement(\n      \"div\",\n      {}, // Remove all styles since they're now in Shadow DOM CSS\n      {\n        id: CONFIG.PANEL_ID,\n      },\n    )\n    this.setupResizeCapability()\n  }\n\n  createDescriptionBlock() {\n    const descriptionBlock = utils.createElement(\n      \"div\",\n      {},\n      {\n        className: 'description-block',\n      }\n    )\n    const descriptionText = utils.createElement(\n      \"p\",\n      {},\n      {\n        className: 'description-text',\n        textContent: `CSSettings is a tool that allows you to easily manage your CSS variables.\n        You can use it to change the values of your CSS variables and see the changes in real time.\n        You can also use it to create a styleguide for your project. A simple syntax to annotate your CSS variables is available. Learn more at https://github.com/cssettings/cssettings`,\n      }\n    )\n    descriptionBlock.appendChild(descriptionText)\n    this.panel?.appendChild(descriptionBlock)\n  }\n\n  createFooter() {\n    const footer = utils.createElement(\n      \"div\",\n      {},\n      {\n        className: 'panel-footer',\n      }\n    )\n\n    const footerText = utils.createElement(\n      \"p\",\n      {},\n      {\n        className: 'footer-text',\n        textContent: `Powered by CSSettings (v${CONFIG.VERSION})`,\n      }\n    )\n\n    footer.appendChild(footerText)\n    this.panel?.appendChild(footer)\n  }\n\n  setupResizeCapability() {\n    if (window.ResizeObserver) {\n      let timeout: number;\n      const observer: ResizeObserver = new ResizeObserver((entries) => {\n        // Debounce les mises à jour\n        clearTimeout(timeout);\n        timeout = setTimeout(() => {\n          for (const entry of entries) {\n            const { width, height } = entry.contentRect;\n            if (state.panelSize) {\n              state.panelSize.width = width;\n              state.panelSize.height = height;\n            }\n          }\n\n        }, 100);\n      });\n\n      if (this.panel) {\n        observer.observe(this.panel);\n        this.resizeObserver = observer;\n      }\n    }\n  }\n\n  createHeader() {\n    const header = utils.createElement(\n      \"div\",\n      {},\n      {\n        className: `panel-header ${state.lockPosition ? '' : 'draggable'}`,\n      }\n    )\n\n    const leftSide = utils.createElement(\n      \"div\",\n      {},\n      {\n        className: 'header-left',\n      }\n    )\n\n    const title = utils.createElement(\n      \"strong\",\n      {},\n      {\n        className: 'header-title',\n        textContent: \"⚙️ Settings Panel\",\n      }\n    )\n\n    const toggleBtn = utils.createElement(\n      \"button\",\n      {},\n      {\n        className: 'btn',\n        textContent: state.isCollapsed ? \"▼\" : \"▲\",\n        title: \"Toggle panel\",\n      }\n    )\n    leftSide.appendChild(title)\n\n    toggleBtn.onclick = () => this.toggleCollapse()\n    this.toggleBtn = toggleBtn\n    leftSide.appendChild(toggleBtn)\n\n    header.appendChild(leftSide)\n\n    const rightSide = utils.createElement(\"div\", {\n      display: \"flex\",\n      alignItems: \"center\",\n      gap: \"0.25rem\",\n    })\n\n    this.lockSelect = this.createLockSelect()\n    rightSide.appendChild(this.lockSelect)\n\n    const closeBtn = utils.createElement(\n      \"button\",\n      {},\n      {\n        className: 'btn btn-close',\n        textContent: \"✕\",\n        title: \"Close panel\",\n      },\n    )\n\n    closeBtn.onclick = () => {\n      this.handleClose()\n    }\n\n    rightSide.appendChild(closeBtn)\n    header.appendChild(rightSide)\n    this.panel?.appendChild(header)\n\n    return header\n  }\n\n  createLockSelect() {\n    const select = utils.createElement(\n      \"select\",\n      {},\n      {\n        className: 'lock-select',\n      },\n    ) as HTMLSelectElement\n\n    const options = [\n      { value: \"\", text: \"🔓 Draggable\" },\n      { value: \"top\", text: \"📌 Top\" },\n      { value: \"bottom\", text: \"📌 Bottom\" },\n      { value: \"left\", text: \"📌 Left\" },\n      { value: \"right\", text: \"📌 Right\" },\n    ]\n\n    options.forEach(({ value, text }) => {\n      const option = utils.createElement(\"option\", {}, {\n        value,\n        textContent: text,\n        selected: value === state.lockPosition,\n      })\n      select.appendChild(option)\n    })\n\n    select.onchange = () => this.handleLockChange()\n    return select\n  }\n\n  createContent() {\n    this.content = utils.createElement(\"div\", {}, {\n      className: state.isCollapsed ? 'content-hidden' : 'content-visible'\n    })\n\n    this.panel?.appendChild(this.content)\n  }\n\n  toggleCollapse() {\n    state.isCollapsed = !state.isCollapsed\n    if (this.content) {\n      if (state.isCollapsed) {\n        utils.applyStyles(this.content, {\n          opacity: \"0\",\n          transform: \"translateY(-10px)\",\n          transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n        })\n        setTimeout(() => {\n          if (this.content) {\n            this.content.style.display = \"none\"\n          }\n        }, 300)\n      } else {\n        this.content.style.display = \"flex\"\n        utils.applyStyles(this.content, {\n          opacity: \"0\",\n          transform: \"translateY(-10px)\",\n        })\n        requestAnimationFrame(() => {\n          utils.applyStyles(this.content as HTMLElement, {\n            opacity: \"1\",\n            transform: \"translateY(0)\",\n            transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n          })\n        })\n      }\n    }\n    if (this.toggleBtn) {\n      this.toggleBtn.textContent = state.isCollapsed ? \"▼\" : \"▲\"\n    }\n    this.handleBodyScroll()\n\n    console.log(`📁 Panel ${state.isCollapsed ? \"collapsed\" : \"expanded\"}`)\n  }\n\n  handleLockChange() {\n    const select = this.lockSelect as HTMLSelectElement;\n    const oldPosition = state.lockPosition;\n    state.lockPosition = select.value;\n\n    // Si on passe de locked à unlocked\n    if (oldPosition && !state.lockPosition) {\n      this.resetToDefaultPosition();\n    }\n    // Si on passe de unlocked à locked ou qu'on change de position\n    else if (state.lockPosition) {\n      this.applyLockStyles();\n    }\n\n    // Sauvegarder l'état\n    storage.save();\n\n    console.log(`🔒 Lock position changed from \"${oldPosition}\" to \"${state.lockPosition}\"`);\n  }\n\n  applyLockPosition() {\n    this.restoreBodyStyles();\n\n    // Reset toutes les positions du panel\n    utils.applyStyles(this.panel as HTMLElement, {\n      top: \"\",\n      bottom: \"\",\n      left: \"\",\n      right: \"\",\n    });\n\n    if (!state.lockPosition) return;\n\n    // Obtenir les dimensions réelles du panel\n    const panelRect = this.panel!.getBoundingClientRect();\n    const panelHeight = Math.round(panelRect.height);\n    const panelWidth = Math.round(panelRect.width);\n\n    // Appliquer le positionnement du panel\n    const positions = {\n      left: { left: \"0\", top: \"0\", bottom: \"0\", right: \"unset\" },\n      right: { right: \"0\", top: \"0\", bottom: \"0\", left: \"unset\" },\n      top: { top: \"0\", left: \"0\", right: \"0\", bottom: \"unset\" },\n      bottom: { bottom: \"0\", left: \"0\", right: \"0\", top: \"unset\" },\n    };\n\n    if (positions[state.lockPosition as keyof typeof positions]) {\n      utils.applyStyles(this.panel as HTMLElement, positions[state.lockPosition as keyof typeof positions]);\n    }\n\n    // Ajuster le body pour faire de la place au panel\n    this.adjustBodyForPanel(state.lockPosition, panelWidth, panelHeight);\n  }\n\n  private adjustBodyForPanel(position: string, panelWidth: number, panelHeight: number) {\n    // S'assurer que le body utilise box-sizing: border-box\n    document.body.style.boxSizing = 'border-box';\n\n    switch (position) {\n      case 'top':\n        document.body.style.marginTop = `${panelHeight}px`;\n        break;\n\n      case 'bottom':\n        document.body.style.marginBottom = `${panelHeight}px`;\n        break;\n\n      case 'left':\n        document.body.style.marginLeft = `${panelWidth}px`;\n        break;\n\n      case 'right':\n        document.body.style.marginRight = `${panelWidth}px`;\n        break;\n    }\n  }\n\n  applyLockStyles() {\n    this.restoreBodyStyles();\n\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n    }\n\n    const panelStyles: Record<string, string> = {\n      borderRadius: \"0\",\n      minHeight: \"60px\",\n      minWidth: \"280px\",\n    };\n\n    if (utils.isHorizontalLock(state.lockPosition)) {\n      // Pour top/bottom : le panel prend toute la largeur\n      Object.assign(panelStyles, {\n        maxWidth: \"100%\",\n        width: \"100%\",\n        resize: \"vertical\",\n        maxHeight: \"50vh\", // Limite à 50% de la hauteur de l'écran\n        height: state.panelSize.height ? `${Math.min(state.panelSize.height, window.innerHeight * 0.5)}px` : \"auto\",\n      });\n    } else if (utils.isVerticalLock(state.lockPosition)) {\n      // Pour left/right : le panel garde sa largeur et prend toute la hauteur\n      Object.assign(panelStyles, {\n        height: \"100vh\",\n        maxHeight: \"100vh\",\n        resize: \"horizontal\",\n        maxWidth: \"50vw\", // Limite à 50% de la largeur de l'écran\n        width: state.panelSize.width ? `${Math.min(state.panelSize.width, window.innerWidth * 0.5)}px` : \"320px\",\n        overflowY: \"auto\",\n      });\n    }\n\n    utils.applyStyles(this.panel as HTMLElement, panelStyles);\n\n    // Réactiver l'observer après avoir appliqué les styles\n    if (this.resizeObserver) {\n      this.resizeObserver.observe(this.panel as HTMLElement);\n    }\n\n    // Appliquer la position après que les styles soient appliqués\n    requestAnimationFrame(() => {\n      this.applyLockPosition();\n    });\n  }\n\n\n\n  resetToDefaultPosition() {\n    // Nettoyer les styles du body\n    this.restoreBodyStyles();\n\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n    }\n\n    // Remettre le panel à sa position par défaut\n    utils.applyStyles(this.panel as HTMLElement, {\n      position: \"fixed\", // S'assurer que c'est bien fixed\n      top: \"\",\n      bottom: \"1.5rem\",\n      left: \"1.5rem\",\n      right: \"\",\n      maxWidth: \"420px\",\n      minWidth: \"280px\",\n      width: \"\",\n      height: \"\",\n      maxHeight: \"500px\",\n      borderRadius: \"16px\",\n      resize: \"none\",\n    });\n\n    if (this.content) {\n      this.content.style.flexDirection = \"column\";\n    }\n\n    // Réactiver l'observer\n    if (this.resizeObserver) {\n      this.resizeObserver.observe(this.panel as HTMLElement);\n    }\n  }\n\n  applyInitialState() {\n    if (state.lockPosition) {\n      this.applyLockStyles()\n      this.applyLockPosition()\n    }\n\n    if (this.resizeObserver && this.panel) {\n      this.resizeObserver.observe(this.panel)\n    }\n  }\n\n  setupEventListeners() {\n    const header = this.panel?.querySelector(\"div\")\n    if (header) {\n      header.addEventListener(\"mousedown\", this.boundHandleMouseDown)\n\n      // Add visual feedback for dragging\n      header.addEventListener(\"mousedown\", () => {\n        if (!state.lockPosition) {\n          utils.applyStyles(header, {\n            cursor: \"grabbing\",\n          })\n        }\n      })\n\n      document.addEventListener(\"mouseup\", () => {\n        utils.applyStyles(header, {\n          cursor: state.lockPosition ? \"default\" : \"grab\",\n        })\n      })\n    }\n  }\n\n  handleMouseDown(e: MouseEvent) {\n    if (state.lockPosition || e.target === this.toggleBtn || e.target === this.lockSelect) return\n\n    state.offsetX = e.clientX - (this.panel?.offsetLeft || 0)\n    state.offsetY = e.clientY - (this.panel?.offsetTop || 0)\n\n    const handleMouseMove = (e: MouseEvent) => this.handleDrag(e)\n    const handleMouseUp = () => {\n      document.removeEventListener(\"mousemove\", handleMouseMove)\n      document.removeEventListener(\"mouseup\", handleMouseUp)\n    }\n\n    document.addEventListener(\"mousemove\", handleMouseMove)\n    document.addEventListener(\"mouseup\", handleMouseUp)\n  }\n\n  handleDrag(e: MouseEvent) {\n    utils.applyStyles(this.panel as HTMLElement, {\n      left: e.clientX - state.offsetX + \"px\",\n      top: e.clientY - state.offsetY + \"px\",\n      bottom: \"\",\n      right: \"\",\n      translate: \"\",\n    })\n  }\n\n  renderSettings() {\n    const { selectorOrder, settingsBySelector } = this.organizeSettings()\n    console.log(\"📚 Final selectorOrder:\", selectorOrder)\n\n    selectorOrder.forEach((selector) => {\n      console.log(`🧱 Rendering block for selector: \"${selector}\"`)\n      this.renderSelectorGroup(selector, settingsBySelector[selector as keyof typeof settingsBySelector])\n    })\n  }\n\n  organizeSettings() {\n    const selectorOrder = []\n    const settingsBySelector: Record<string, any[]> = {}\n    for (const setting of state.settings) {\n      const selector = (setting as any).selector\n      if (!settingsBySelector[selector]) {\n        selectorOrder.push(selector)\n        settingsBySelector[selector] = []\n      }\n      settingsBySelector[selector].push(setting)\n    }\n\n    return { selectorOrder, settingsBySelector }\n  }\n\n  renderSelectorGroup(selector: string, variables: Setting[]) {\n    const group = utils.createElement(\n      \"div\",\n      {},\n      {\n        className: 'group',\n      }\n    )\n\n    const header = utils.createElement(\n      \"div\",\n      {},\n      {\n        className: 'group-header',\n        title: \"Click to toggle group\",\n      }\n    )\n\n    const isCollapsed = state.collapsedGroups.has(selector)\n\n    // Chevron indicator\n    const chevron = utils.createElement(\"span\", {}, {\n      className: isCollapsed ? 'chevron rotated' : 'chevron',\n      textContent: \"▼\"\n    })\n\n    // Selector text\n    const selectorText = utils.createElement(\"span\", {}, {\n      className: 'selector-text',\n      textContent: `🎯 ${selector}`\n    })\n\n    // Variables count\n    const countBadge = utils.createElement(\"span\", {}, {\n      className: 'count-badge',\n      textContent: variables.length.toString()\n    })\n\n    header.appendChild(chevron)\n    header.appendChild(selectorText)\n    header.appendChild(countBadge)\n\n    // Content container for variables\n    const content = utils.createElement(\"div\", {}, {\n      className: isCollapsed ? 'group-content collapsed' : 'group-content',\n    })\n\n    // Add variables to content\n    variables.forEach((variable) => {\n      const container = this.createVariableControl(variable as any)\n      content.appendChild(container)\n    })\n\n    // Toggle functionality\n    header.addEventListener(\"click\", () => {\n      const wasCollapsed = state.collapsedGroups.has(selector)\n\n      if (wasCollapsed) {\n        state.collapsedGroups.delete(selector)\n        // Expand\n        content.classList.remove('collapsed')\n        chevron.classList.remove('rotated')\n        header.classList.add('has-border')\n      } else {\n        state.collapsedGroups.add(selector)\n        // Collapse\n        content.classList.add('collapsed')\n        chevron.classList.add('rotated')\n        header.classList.remove('has-border')\n      }\n\n      storage.save()\n      console.log(`📁 Group \"${selector}\" ${wasCollapsed ? 'expanded' : 'collapsed'}`)\n    })\n\n    // Highlight functionality on hover\n    group.addEventListener(\"mouseenter\", () => {\n      this.highlightElements(selector);\n    });\n\n    group.addEventListener(\"mouseleave\", () => {\n      this.removeHighlight();\n    });\n\n    group.appendChild(header)\n    group.appendChild(content)\n    this.content?.appendChild(group)\n  }\n\n  createVariableControl({\n    variable,\n    value,\n    values,\n    dataAttr,\n    selector,\n  }: { variable: string; value: string; values: string[]; dataAttr: string; selector: string }) {\n    const container = utils.createElement(\"div\", {}, {\n      className: 'variable-control',\n    })\n\n    const label = utils.createElement(\n      \"label\",\n      {},\n      {\n        textContent: variable.replace(\"--\", \"\"),\n        className: 'variable-label',\n      },\n    )\n\n    // Determine the type of control needed\n    const computedValue = utils.getComputedValue(selector, variable, value)\n\n    // Check if all values are colors\n    const areAllColors = values.every(v => this.isColor(v))\n\n    // Check if values form a numeric range\n    const rangeInfo = this.isNumericRange(values)\n\n    let control: HTMLElement\n\n    // Debug logging\n    console.log(`🔍 Variable: ${variable}`)\n    console.log(`📊 Values: [${values.join(', ')}]`)\n    console.log(`🎨 Are all colors: ${areAllColors}`)\n    console.log(`📏 Range info:`, rangeInfo)\n\n    if (areAllColors) {\n      // Create color picker control\n      console.log(`🎨 Creating color control for ${variable}`)\n      control = this.createColorControl(variable, computedValue, values, dataAttr, selector)\n    } else if (rangeInfo.isRange) {\n      // Create range slider control\n      console.log(`📏 Creating range control for ${variable} (${rangeInfo.min} - ${rangeInfo.max}, step: ${rangeInfo.step})`)\n      control = this.createRangeControl(variable, computedValue, values, dataAttr, selector, rangeInfo)\n    } else {\n      // Create default select control\n      console.log(`📋 Creating select control for ${variable}`)\n      control = this.createSelect(variable, computedValue, values, dataAttr, selector)\n    }\n\n    container.appendChild(label)\n    container.appendChild(control)\n    return container\n  }\n\n  createSelect(variable: string, value: string, values: string[], dataAttr: string, selector: string) {\n    const select = utils.createElement(\"select\", {}, {\n      className: 'select-control',\n    })\n\n    const computedValue = utils.getComputedValue(selector, variable, value)\n\n    values.forEach((optionValue) => {\n      const option = utils.createElement(\n        \"option\",\n        {},\n        {\n          className: 'select-option',\n          value: optionValue,\n          textContent: optionValue,\n          selected: optionValue === computedValue,\n        },\n      )\n      select.appendChild(option)\n    })\n\n    select.onchange = (e) => this.handleVariableChange(e, variable, dataAttr, selector)\n    return select\n  }\n\n  createColorControl(variable: string, value: string, values: string[], dataAttr: string, selector: string) {\n    const container = utils.createElement(\"div\", {}, {\n      className: 'color-control',\n    })\n\n    // Color input\n    const colorInput = utils.createElement(\"input\", {}, {\n      className: 'color-input',\n      value: this.colorToHex(value)\n    }) as HTMLInputElement\n    colorInput.type = \"color\"\n\n    // Color palette (clickable color swatches)\n    const palette = utils.createElement(\"div\", {}, {\n      className: 'color-palette',\n    })\n\n    values.forEach((colorValue) => {\n      const swatch = utils.createElement(\"div\", {\n        background: colorValue,\n      }, {\n        title: colorValue,\n        className: value === colorValue ? 'color-swatch selected' : 'color-swatch',\n      })\n\n      swatch.addEventListener(\"click\", () => {\n        // Update the color input\n        colorInput.value = this.colorToHex(colorValue)\n\n        // Update visual feedback\n        palette.querySelectorAll(\".color-swatch\").forEach(s => {\n          s.classList.remove('selected')\n        })\n        swatch.classList.add('selected')\n\n        // Trigger change\n        this.handleVariableChange({ target: { value: colorValue } } as any, variable, dataAttr, selector)\n      })\n\n      palette.appendChild(swatch)\n    })\n\n    colorInput.addEventListener(\"input\", (e) => {\n      // Clear swatch selection\n      palette.querySelectorAll(\".color-swatch\").forEach(s => {\n        s.classList.remove('selected')\n      })\n\n      this.handleVariableChange(e, variable, dataAttr, selector)\n    })\n\n    container.appendChild(colorInput)\n    container.appendChild(palette)\n    return container\n  }\n\n  createRangeControl(variable: string, value: string, values: string[], dataAttr: string, selector: string, rangeInfo: { min: number; max: number; step: number }) {\n    const container = utils.createElement(\"div\", {}, {\n      className: 'range-control',\n    })\n\n    // Extract numeric value from the current value\n    const currentNumericValue = parseFloat(value.match(/-?\\d+(\\.\\d+)?/)?.[0] || rangeInfo.min.toString())\n\n    // Range slider\n    const rangeInput = document.createElement(\"input\")\n    rangeInput.type = \"range\"\n    rangeInput.min = rangeInfo.min.toString()\n    rangeInput.max = rangeInfo.max.toString()\n    rangeInput.step = rangeInfo.step.toString()\n    rangeInput.value = currentNumericValue.toString()\n\n    // Value display\n    const valueDisplay = utils.createElement(\"span\", {}, {\n      textContent: value,\n      className: 'range-value',\n    })\n\n    rangeInput.addEventListener(\"input\", (e) => {\n      const numericValue = (e.target as HTMLInputElement).value\n\n      // Find the corresponding original value format\n      let matchedValue = numericValue\n      const targetNumber = parseFloat(numericValue)\n\n      for (const originalValue of values) {\n        const originalNumber = parseFloat(originalValue.match(/-?\\d+(\\.\\d+)?/)?.[0] || \"0\")\n        if (Math.abs(originalNumber - targetNumber) < rangeInfo.step / 2) {\n          matchedValue = originalValue\n          break\n        }\n      }\n\n      valueDisplay.textContent = matchedValue\n      this.handleVariableChange({ target: { value: matchedValue } } as any, variable, dataAttr, selector)\n    })\n\n    container.appendChild(rangeInput)\n    container.appendChild(valueDisplay)\n    return container\n  }\n\n  handleVariableChange(event: Event, variable: string, dataAttr: string, selector: string) {\n    const newValue = (event.target as HTMLSelectElement).value\n    const targets = document.querySelectorAll(selector)\n\n    if (!targets.length) {\n      console.warn(`⚠️ No elements match ${selector}`)\n      return\n    }\n\n    targets.forEach((target) => {\n      console.log(`🎯 ${variable} = ${newValue} on ${selector}`)\n        ; (target as HTMLElement).style.setProperty(variable, newValue)\n\n      if (dataAttr) {\n        target.setAttribute(dataAttr, newValue)\n        console.log(`🏷️ [${dataAttr}=\"${newValue}\"] set`)\n      }\n    })\n\n\n  }\n\n  // Helper function to check if a value is a color\n  private isColor(value: string): boolean {\n    // Check for hex colors\n    if (/^#([0-9A-Fa-f]{3}){1,2}$/.test(value)) {\n      return true;\n    }\n\n    // Check for rgb/rgba\n    if (/^rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*(,\\s*[\\d.]+)?\\s*\\)$/.test(value)) {\n      return true;\n    }\n\n    // Check for hsl/hsla\n    if (/^hsla?\\(\\s*\\d+\\s*,\\s*\\d+%\\s*,\\s*\\d+%\\s*(,\\s*[\\d.]+)?\\s*\\)$/.test(value)) {\n      return true;\n    }\n\n    // Check for oklch colors\n    if (/^oklch\\(\\s*[\\d.]+[\\s,]+[\\d.]+[\\s,]+[\\d.]+(\\s*\\/\\s*[\\d.]+)?\\s*\\)$/.test(value)) {\n      return true;\n    }\n\n    // Check for oklab colors\n    if (/^oklab\\(\\s*[\\d.]+[\\s,]+[\\d.-]+[\\s,]+[\\d.-]+(\\s*\\/\\s*[\\d.]+)?\\s*\\)$/.test(value)) {\n      return true;\n    }\n\n    // Check for lch colors\n    if (/^lch\\(\\s*[\\d.]+%?[\\s,]+[\\d.]+[\\s,]+[\\d.]+(\\s*\\/\\s*[\\d.]+)?\\s*\\)$/.test(value)) {\n      return true;\n    }\n\n    // Check for lab colors\n    if (/^lab\\(\\s*[\\d.]+%?[\\s,]+[\\d.-]+[\\s,]+[\\d.-]+(\\s*\\/\\s*[\\d.]+)?\\s*\\)$/.test(value)) {\n      return true;\n    }\n\n    // Check for hwb colors\n    if (/^hwb\\(\\s*\\d+\\s+[\\d.]+%\\s+[\\d.]+%(\\s*\\/\\s*[\\d.]+)?\\s*\\)$/.test(value)) {\n      return true;\n    }\n\n    // Check for p3 colors\n    if (/^p3\\(\\s*[\\d.]+%?\\s+[\\d.]+%?\\s+[\\d.]+%?(\\s*\\/\\s*[\\d.]+)?\\s*\\)$/.test(value)) {\n      return true;\n    }\n\n    // Check for CSS color names\n    const cssColors = [\n      'aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige', 'bisque', 'black', 'blanchedalmond',\n      'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral',\n      'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray',\n      'darkgreen', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred',\n      'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkturquoise', 'darkviolet',\n      'deeppink', 'deepskyblue', 'dimgray', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen',\n      'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow',\n      'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush',\n      'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow',\n      'lightgray', 'lightgreen', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue',\n      'lightslategray', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 'linen', 'magenta',\n      'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen',\n      'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue',\n      'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab',\n      'orange', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred',\n      'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple', 'red', 'rosybrown',\n      'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver',\n      'skyblue', 'slateblue', 'slategray', 'snow', 'springgreen', 'steelblue', 'tan', 'teal',\n      'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen',\n    ]\n\n    return cssColors.includes(value.toLowerCase())\n  }\n\n  // Helper function to check if values form a numeric range\n  private isNumericRange(values: string[]): { isRange: boolean; min: number; max: number; step: number } {\n    // Need at least 2 values\n    if (values.length < 2) {\n      return { isRange: false, min: 0, max: 0, step: 1 }\n    }\n\n    const numbers = values.map(v => {\n      // Extract number from string, handling units like px, em, %, etc.\n      const match = v.match(/-?\\d+(\\.\\d+)?/)\n      return match ? parseFloat(match[0]) : NaN\n    })\n\n    const validNumbers = numbers.filter(n => !isNaN(n))\n\n    // All values must be valid numbers\n    if (validNumbers.length !== values.length) {\n      return { isRange: false, min: 0, max: 0, step: 1 }\n    }\n\n    // Sort to get min/max\n    const sorted = [...validNumbers].sort((a, b) => a - b)\n    const min = sorted[0]\n    const max = sorted[sorted.length - 1]\n\n    // If we have more than 2 values, check if it's a sequence\n    if (sorted.length >= 3) {\n      const step = sorted[1] - sorted[0]\n      // Check if it forms a reasonably consistent sequence\n      const isSequence = sorted.every((num, index) => {\n        if (index === 0) return true\n        const expectedValue = sorted[0] + step * index\n        return Math.abs(num - expectedValue) < Math.max(0.1, step * 0.1) // Allow some tolerance\n      })\n\n      if (isSequence && step > 0) {\n        return { isRange: true, min, max, step }\n      }\n    }\n\n    // Even if not a perfect sequence, if all values are numbers and span a range, treat as range\n    if (validNumbers.length >= 2 && max > min) {\n      const step = Math.min(1, (max - min) / (validNumbers.length - 1))\n      return { isRange: true, min, max, step }\n    }\n\n    return { isRange: false, min, max, step: 1 }\n  }\n\n  // Helper function to convert color to hex for input[type=\"color\"]\n  private colorToHex(color: string): string {\n    // If already hex, return as is\n    if (/^#([0-9A-Fa-f]{3}){1,2}$/.test(color)) {\n      return color.length === 4 ?\n        '#' + color[1] + color[1] + color[2] + color[2] + color[3] + color[3] :\n        color\n    }\n\n    // For modern color formats (oklch, oklab, lch, lab, hwb), \n    // we'll use a temporary element to get computed color\n    if (/^(oklch|oklab|lch|lab|hwb)\\(/.test(color)) {\n      try {\n        const temp = document.createElement('div')\n        temp.style.color = color\n        document.body.appendChild(temp)\n        const computedColor = getComputedStyle(temp).color\n        document.body.removeChild(temp)\n\n        // Extract RGB values and convert to hex\n        const match = computedColor.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/)\n        if (match) {\n          const r = parseInt(match[1])\n          const g = parseInt(match[2])\n          const b = parseInt(match[3])\n          return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)\n        }\n      } catch (error) {\n        console.warn(`⚠️ Could not convert color \"${color}\" to hex:`, error)\n      }\n    }\n\n    // For other formats, we'll use a temporary element to get computed color\n    const temp = document.createElement('div')\n    temp.style.color = color\n    document.body.appendChild(temp)\n    const computedColor = getComputedStyle(temp).color\n    document.body.removeChild(temp)\n\n    // Extract RGB values and convert to hex\n    const match = computedColor.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/)\n    if (match) {\n      const r = parseInt(match[1])\n      const g = parseInt(match[2])\n      const b = parseInt(match[3])\n      return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)\n    }\n\n    return '#000000' // Fallback\n  }\n\n  /**\n   * Highlight elements that match the given selector\n   */\n  private highlightElements(selector: string) {\n    try {\n      // Find all elements that match the selector\n      const elements = document.querySelectorAll(selector);\n\n      if (elements.length === 0) {\n        console.warn(`⚠️ No elements found for selector: ${selector}`);\n        return;\n      }\n\n      // Store the highlighted elements\n      this.highlightedElements = Array.from(elements);\n\n      // Apply highlight styles to each element\n      this.highlightedElements.forEach((element, index) => {\n        const htmlElement = element as HTMLElement;\n\n        // Store the original styles\n        const originalOutline = htmlElement.style.outline;\n        const originalBoxShadow = htmlElement.style.boxShadow;\n        const originalZIndex = htmlElement.style.zIndex;\n        const originalPosition = htmlElement.style.position;\n\n        // Store original values as data attributes\n        htmlElement.setAttribute('data-original-outline', originalOutline || '');\n        htmlElement.setAttribute('data-original-box-shadow', originalBoxShadow || '');\n        htmlElement.setAttribute('data-original-z-index', originalZIndex || '');\n        htmlElement.setAttribute('data-original-position', originalPosition || '');\n\n        // Apply highlight styles\n        htmlElement.style.outline = '2px dashed #667eea';\n        htmlElement.style.boxShadow = '0 0 0 4px rgba(102, 126, 234, 0.2), 0 0 20px rgba(102, 126, 234, 0.3)';\n        htmlElement.style.zIndex = '9998';\n\n        // If element is not positioned, make it relative\n        const computedPosition = getComputedStyle(htmlElement).position;\n        if (computedPosition === 'static') {\n          htmlElement.style.position = 'relative';\n        }\n\n        // Add a number badge for multiple elements\n        if (elements.length > 1) {\n          const badge = document.createElement('div');\n          badge.className = 'css-settings-highlight-badge';\n          badge.textContent = (index + 1).toString();\n          badge.style.cssText = `\n            position: absolute;\n            top: -8px;\n            right: -8px;\n            background: #667eea;\n            color: white;\n            border-radius: 50%;\n            width: 18px;\n            height: 18px;\n            font-size: 10px;\n            font-weight: bold;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            z-index: 9999;\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n          `;\n          htmlElement.appendChild(badge);\n        }\n      });\n\n      console.log(`✨ Highlighted ${this.highlightedElements.length} element(s) for selector: ${selector}`);\n\n    } catch (error) {\n      console.error(`❌ Error highlighting elements for selector \"${selector}\":`, error);\n    }\n  }\n\n  /**\n   * Remove highlight from all previously highlighted elements\n   */\n  private removeHighlight() {\n    this.highlightedElements.forEach(element => {\n      const htmlElement = element as HTMLElement;\n\n      // Restore original styles\n      const originalOutline = htmlElement.getAttribute('data-original-outline') || '';\n      const originalBoxShadow = htmlElement.getAttribute('data-original-box-shadow') || '';\n      const originalZIndex = htmlElement.getAttribute('data-original-z-index') || '';\n      const originalPosition = htmlElement.getAttribute('data-original-position') || '';\n\n      htmlElement.style.outline = originalOutline;\n      htmlElement.style.boxShadow = originalBoxShadow;\n      htmlElement.style.zIndex = originalZIndex;\n      htmlElement.style.position = originalPosition;\n\n      // Remove data attributes\n      htmlElement.removeAttribute('data-original-outline');\n      htmlElement.removeAttribute('data-original-box-shadow');\n      htmlElement.removeAttribute('data-original-z-index');\n      htmlElement.removeAttribute('data-original-position');\n\n      // Remove highlight badge if it exists\n      const badge = htmlElement.querySelector('.css-settings-highlight-badge');\n      if (badge) {\n        badge.remove();\n      }\n    });\n\n    this.highlightedElements = [];\n    console.log('🧹 Removed all highlights');\n  }\n}\n","import { CONFIG } from './config';\nimport { state } from './state';\n\nexport class CSSParser {\n  styleTags: Element[];\n  constructor() {\n    this.styleTags = [\n      ...document.querySelectorAll(CONFIG.SELECTORS.STYLE_TAGS)\n    ];\n    console.log(`📄 Found ${this.styleTags.length} <style> tag(s).`);\n  }\n\n  // Helper function to parse space-separated values while respecting quotes and parentheses\n  parseSpaceValues(input: string): string[] {\n    const values: string[] = [];\n    let current = '';\n    let inQuotes = false;\n    let quoteChar = '';\n    let parenthesesDepth = 0;\n\n    for (let i = 0; i < input.length; i++) {\n      const char = input[i];\n\n      if (!inQuotes) {\n        if (char === '\"' || char === \"'\") {\n          inQuotes = true;\n          quoteChar = char;\n          current += char;\n        } else if (char === '(') {\n          parenthesesDepth++;\n          current += char;\n        } else if (char === ')') {\n          parenthesesDepth--;\n          current += char;\n        } else if ((char === ' ' || char === '\\t') && parenthesesDepth === 0) {\n          if (current.trim()) {\n            values.push(current.trim());\n          }\n          current = '';\n        } else {\n          current += char;\n        }\n      } else {\n        current += char;\n        if (char === quoteChar) {\n          // Check if it's an escaped quote\n          if (i === 0 || input[i - 1] !== '\\\\') {\n            inQuotes = false;\n            quoteChar = '';\n          }\n        }\n      }\n    }\n\n    // Add the last value\n    if (current.trim()) {\n      values.push(current.trim());\n    }\n\n    return values;\n  }\n\n  parse() {\n    for (const tag of this.styleTags) {\n      console.log(\"📘 Parsing <style> content:\", tag);\n      this.parseStyleTag(tag as HTMLStyleElement);\n    }\n\n    if (state.pendingBlocks.length === 0) {\n      console.warn(\"⚠️ No @settings detected.\");\n      return false;\n    }\n\n    this.processPendingBlocks();\n    console.log(\"✅ Full list of collected settings:\", state.settings);\n    return true;\n  }\n\n  parseStyleTag(tag: HTMLStyleElement) {\n    const lines = tag.innerHTML.split(\"\\n\");\n    let blockDepth = 0;\n    let selectorStack: string[] = [];\n    let currentBody: string[][] = [];\n    let blockOrder: { selector: string, id: number }[] = [];\n\n    for (let i = 0; i < lines.length; i++) {\n      const line = lines[i].trim();\n\n      if (line.endsWith(\"{\")) {\n        this.handleOpenBrace(\n          line,\n          blockDepth,\n          selectorStack,\n          currentBody,\n          blockOrder\n        );\n        blockDepth++;\n      } else if (line === \"}\") {\n        blockDepth--;\n        this.handleCloseBrace(selectorStack, currentBody, blockOrder);\n      } else if (blockDepth > 0) {\n        currentBody[currentBody.length - 1].push(line);\n      }\n    }\n  }\n\n  handleOpenBrace(line: string, blockDepth: number, selectorStack: string[], currentBody: string[][], blockOrder: { selector: string, id: number }[]) {\n    const rawSelector = line.slice(0, -1).trim();\n\n    if (blockDepth === 0) {\n      selectorStack.length = 0;\n      selectorStack.push(rawSelector);\n      currentBody.length = 0;\n      currentBody.push([]);\n      blockOrder.push({ selector: rawSelector, id: state.blockId++ });\n    } else {\n      const parentSelector = selectorStack[selectorStack.length - 1];\n      const resolvedSelector = rawSelector.includes(\"&\")\n        ? rawSelector.replace(/&/g, parentSelector)\n        : `${parentSelector} ${rawSelector}`;\n\n      selectorStack.push(resolvedSelector);\n      currentBody.push([]);\n      blockOrder.push({ selector: resolvedSelector, id: state.blockId++ });\n    }\n  }\n\n  handleCloseBrace(selectorStack: string[], currentBody: string[][], blockOrder: { selector: string, id: number }[]) {\n    const finalSelector = selectorStack.pop();\n    const bodyLines = currentBody.pop();\n    const thisBlockId = blockOrder.pop()?.id;\n\n    if (bodyLines && finalSelector) {\n      const localSettings = this.extractSettings(bodyLines, finalSelector);\n\n      if (localSettings.length > 0) {\n        console.log(\n          `📦 Found block for selector: \"${finalSelector}\" with ${localSettings.length} setting(s)`\n        );\n        state.pendingBlocks.push({\n          selector: finalSelector,\n          settings: localSettings,\n          id: thisBlockId ?? state.blockId++\n        });\n      }\n    }\n  }\n\n  extractSettings(bodyLines: string[], selector: string) {\n    const localSettings = [];\n    let localLastVar = null;\n\n    for (const line of bodyLines.filter(Boolean)) {\n      // Traitement des paramètres inline\n      const inlineMatch = line.match(CONFIG.PATTERNS.INLINE_SETTING);\n      if (inlineMatch) {\n        const [, variable, value, dataAttr, options] = inlineMatch;\n        localSettings.push({\n          variable,\n          value: value.trim(),\n          values: this.parseSpaceValues(options),\n          dataAttr,\n          selector\n        });\n        continue;\n      }\n\n      // Traitement des variables CSS\n      const varMatch = line.match(CONFIG.PATTERNS.VARIABLE);\n      if (varMatch) {\n        const [, variable, value] = varMatch;\n        localLastVar = {\n          variable,\n          value: value.trim(),\n          selector\n        };\n        continue;\n      }\n\n      // Traitement des commentaires @settings\n      const commentMatch = line.match(CONFIG.PATTERNS.COMMENT_SETTING);\n      if (commentMatch && localLastVar) {\n        const [, dataAttr, options] = commentMatch;\n        localSettings.push({\n          ...localLastVar,\n          values: this.parseSpaceValues(options),\n          dataAttr\n        });\n        localLastVar = null;\n      }\n    }\n\n    return localSettings;\n  }\n\n  processPendingBlocks() {\n    state.pendingBlocks\n      .sort((a, b) => (a.id ?? 0) - (b.id ?? 0))\n      .forEach((block) => {\n        if (block.settings && block.settings.length > 0) {\n          state.settings.push(...block.settings);\n        }\n      });\n  }\n}\n","import { SettingsPanel } from \"./scripts/panel\";\nimport { CSSParser } from \"./scripts/parser\";\nimport { storage } from \"./scripts/storage\";\n\n(() => {\n  console.log(\"🔧 Init: Scanning @settings...\");\n\n  // Exécution principale\n  function main() {\n    const savedData = storage.load(); // charge mais ne restaure pas ici\n\n    const parser = new CSSParser();\n    const hasSettings = parser.parse();\n    if (!hasSettings) return;\n\n    const panel = new SettingsPanel();\n    panel.create();\n\n    // ✅ Restaurer les variables uniquement une fois que tout est rendu\n    requestAnimationFrame(() => {\n      if (savedData?.variableValues) {\n        storage.applyVariableValues(savedData.variableValues);\n        console.log(\"🎨 Variable values restored from localStorage\");\n      }\n    });\n  }\n\n  main();\n})();\n"],"names":["CONFIG","CANONICAL_ID","canonicalLink","href","match","state","suffix","utils","tag","styles","domProps","htmlAttributes","element","key","value","selector","err","variable","defaultValue","computedValue","position","storage","data","variableValues","lastColon","target","e","raw","values","setting","_a","_b","PANEL_STYLES","config","COG_SVG","injectSettingsToggle","panelInstance","cog","SettingsPanel","__publicField","styleSheet","newPanel","header","descriptionBlock","descriptionText","footer","footerText","timeout","observer","entries","entry","width","height","leftSide","title","toggleBtn","rightSide","closeBtn","select","text","option","oldPosition","panelRect","panelHeight","panelWidth","positions","panelStyles","handleMouseMove","handleMouseUp","selectorOrder","settingsBySelector","variables","group","isCollapsed","chevron","selectorText","countBadge","content","container","wasCollapsed","dataAttr","label","areAllColors","v","rangeInfo","control","optionValue","colorInput","palette","colorValue","swatch","s","currentNumericValue","rangeInput","valueDisplay","numericValue","matchedValue","targetNumber","originalValue","originalNumber","event","newValue","targets","validNumbers","n","sorted","a","b","min","max","step","num","index","expectedValue","color","temp","computedColor","r","g","error","elements","htmlElement","originalOutline","originalBoxShadow","originalZIndex","originalPosition","badge","CSSParser","input","current","inQuotes","quoteChar","parenthesesDepth","i","char","lines","blockDepth","selectorStack","currentBody","blockOrder","line","rawSelector","parentSelector","resolvedSelector","finalSelector","bodyLines","thisBlockId","localSettings","localLastVar","inlineMatch","options","varMatch","commentMatch","block","main","savedData"],"mappings":"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"}