{"version":3,"sources":["/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/code/utils/highlight-api.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/code/utils/syntax-highlighter-theme.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/code/utils/syntax-grammars.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/code/utils/syntax-tokenizer.ts","../src/decorators/Component.ts","../src/decorators/Prop.ts","../src/decorators/Query.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/code/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/bezier-conversion.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/styles.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/types.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/utils.ts","../src/decorators/Listen.ts","../src/elements/shared.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/constants.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/svg-renderer.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/canvas.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/canvas-controls.ts","../src/elements/icons/interface/minus.ts","../src/elements/icons/interface/plus.ts","../src/elements/button/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/controls.ts","../src/components/code/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/output.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/popover/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/utils/dismiss-controller.ts","../src/utils/outside-click.ts","../src/decorators/OutsideClick.ts","../src/elements/tooltip/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/toolbar.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/curve/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/button/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/shared.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/checkbox/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/animation/chevron.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/dropdown/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/input/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/color/utils.ts","../src/utils/template-helpers.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/arrows-vertical.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/picker.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/color/picker.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/color/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/field/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/animation/clear.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/animation/grid.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/animation/loading.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/animation/snap.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/anchor-add.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/anchor-remove.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/arrow-up.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/bezier.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/bezier-angle.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/bezier-distribute.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/bezier-length.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/bezier-mirror.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/check.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/circle-arrow-left.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/circle-arrow-right.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/code.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/dots.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/mention.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/minus.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/plus.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/interface/settings.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/logo/index.ts","../src/decorators/Watch.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/monitor/fps.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/monitor/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/number/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/origin/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/panel/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/radio/option.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/radio/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/radio/input.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/slider/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/state/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/toggle/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/tooltip/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/internal/style-inject.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/internal/fonts.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/internal/component-loaders.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/internal/lazy-load.ts","../src/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/components/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Component.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Listen.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/OutsideClick.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Prop.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Query.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Watch.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/folder/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/elements/icons/animation/folder.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/theme/tokens.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/theme/presets.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/theme/registry.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/theme/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/init.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/utils/template-helpers.ts"],"sourcesContent":["interface HighlightAPI {\n  Highlight: new (...ranges: Range[]) => unknown;\n  highlights: Map<string, unknown>;\n}\n\ninterface WindowWithHighlightAPI extends Window {\n  CSS: {\n    highlights: Map<string, unknown>;\n  };\n  Highlight: new (...ranges: Range[]) => unknown;\n}\n\nexport const SUPPORTS_HIGHLIGHT_API =\n  typeof window !== 'undefined' &&\n  typeof (window as unknown as WindowWithHighlightAPI).CSS !== 'undefined' &&\n  !!(window as unknown as WindowWithHighlightAPI).CSS?.highlights &&\n  typeof (window as unknown as WindowWithHighlightAPI).Highlight === 'function';\n\nexport const getHighlightAPI = (): HighlightAPI | null => {\n  if (!SUPPORTS_HIGHLIGHT_API) {\n    return null;\n  }\n\n  const w = window as unknown as WindowWithHighlightAPI;\n  return {\n    Highlight: w.Highlight,\n    highlights: w.CSS.highlights\n  };\n};\n","import type { TokenType } from './syntax-highlighter-types';\n\nexport const DEFAULT_THEME: Record<TokenType, string> = {\n  keyword: 'var(--ease-syntax-keyword, #e47ab4)',\n  string: 'var(--ease-syntax-string, #6ad09d)',\n  comment: 'var(--ease-syntax-comment, var(--color-gray-700))',\n  number: 'var(--ease-syntax-number, #f2c24b)',\n  operator: 'var(--ease-syntax-operator, var(--color-gray-500))',\n  tag: 'var(--ease-syntax-tag, #c36571)',\n  attribute: 'var(--ease-syntax-attribute, #ff6600)',\n  property: 'var(--ease-syntax-property, #61bf90)',\n  type: 'var(--ease-syntax-type, #FFAB77)',\n  variable: 'var(--ease-syntax-variable, #ea7987)',\n  selector: 'var(--ease-syntax-selector, #4F9CED)',\n  function: 'var(--ease-syntax-function, #71a4f4)'\n};\n\nexport const generateHighlightStyles = (\n  instanceId: string,\n  theme: Record<TokenType, string> = DEFAULT_THEME\n): string => {\n  let styles = '';\n\n  for (const [type, color] of Object.entries(theme)) {\n    const highlightName = `syntax-${type}-${instanceId}`;\n    const italic = type === 'comment' ? 'font-style: italic;' : '';\n    styles += `::highlight(${highlightName}) { color: ${color}; ${italic} }`;\n  }\n\n  return styles;\n};\n","import type { Grammar } from './syntax-highlighter-types';\n\nexport const JS_BASE: Grammar = [\n  ['comment', /(\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/)/m],\n  ['string', /('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")|(`[^`\\\\]*(?:\\\\.[^`\\\\]*)*`)/],\n  ['number', /\\b\\d+(\\.\\d+)?\\b|0x[a-fA-F0-9]+\\b/],\n  [\n    'keyword',\n    /\\b(if|else|while|for|do|return|const|let|var|function|class|new|try|catch|finally|throw|import|export|default|async|await|extends|super|break|continue|switch|case|in|of|instanceof|typeof|delete|this|true|false|null|from|as)\\b/\n  ],\n  ['function', /\\b\\w+(?=\\()/],\n  ['operator', /[+\\-*/%=<>!&|?.:]{1,3}/]\n];\n\nexport const TS_ADDITIONS: Grammar = [\n  [\n    'keyword',\n    /\\b(type|interface|enum|public|private|protected|readonly|namespace|module|declare|abstract|implements|static|any|unknown|never|string|number|boolean|void|symbol|bigint)\\b/\n  ],\n  ['type', /\\b([A-Z]\\w*)\\b/]\n];\n\nexport const HTML_BASE: Grammar = [\n  ['comment', /<!--[\\s\\S]*?-->/m],\n  ['attribute', /(\\s[a-zA-Z0-9_-]+)(?=\\s*=)/],\n  ['string', /('[^']*')|(\"[^\"]*\")/],\n  ['tag', /(<\\/?)([a-zA-Z0-9-]+)/],\n  ['keyword', /<!DOCTYPE[^>]*>/i]\n];\n\nexport const CSS_BASE: Grammar = [\n  ['comment', /\\/\\*[\\s\\S]*?\\*\\//m],\n  ['string', /('[^']*')|(\"[^\"]*\")/],\n  ['number', /(#[0-9a-fA-F]{3,8})|\\b-?\\d+(\\.\\d+)?(px|em|rem|%|deg|s|ms|vh|vw|vmin|vmax)?\\b/],\n  ['keyword', /(!important|@media|@import|@keyframes|@font-face|inherit|initial|unset|auto|none)\\b/],\n  ['variable', /(--[a-zA-Z0-9_-]+)/],\n  ['property', /([a-zA-Z-]+)\\s*(?=:)/],\n  ['selector', /(\\.|#)([a-zA-Z0-9_-]+)|\\[[^\\]]+\\]/],\n  ['tag', /\\b([a-zA-Z]+)(?=\\s*\\{)/]\n];\n\nexport const JSON_BASE: Grammar = [\n  ['property', /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"(?=\\s*:)/],\n  ['string', /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"/],\n  ['number', /\\b-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?\\b/],\n  ['keyword', /\\b(true|false|null)\\b/]\n];\n\nconst baseGrammars: Record<string, Grammar> = {\n  javascript: JS_BASE,\n  js: JS_BASE,\n  typescript: [...JS_BASE, ...TS_ADDITIONS],\n  ts: [...JS_BASE, ...TS_ADDITIONS],\n  html: HTML_BASE,\n  css: CSS_BASE,\n  json: JSON_BASE\n};\n\nconst TSX_GRAMMAR: Grammar = [\n  ...HTML_BASE,\n  ...(baseGrammars.typescript?.filter(([type]) => type !== 'operator') || [])\n];\n\nexport const GRAMMARS: Record<string, Grammar> = {\n  ...baseGrammars,\n  tsx: TSX_GRAMMAR,\n  jsx: TSX_GRAMMAR\n};\n","import type { Token, TokenType } from './syntax-highlighter-types';\n\nimport { GRAMMARS } from './syntax-grammars';\n\nexport const tokenize = (code: string, language: string): Token[] => {\n  const grammar = GRAMMARS[language.toLowerCase()];\n\n  if (!grammar) {\n    return [];\n  }\n\n  const regexParts: string[] = [];\n  const groupMap = new Map<string, TokenType>();\n  let groupIndex = 0;\n\n  grammar.forEach(([type, pattern]) => {\n    const groupName = `G${groupIndex++}`;\n    groupMap.set(groupName, type);\n    regexParts.push(`(?<${groupName}>${pattern.source})`);\n  });\n\n  const masterRegex = new RegExp(regexParts.join('|'), 'gm');\n  const tokens: Token[] = [];\n\n  let match: RegExpExecArray | null;\n\n  while (true) {\n    match = masterRegex.exec(code);\n    if (match === null) {\n      break;\n    }\n    if (match.index === masterRegex.lastIndex) {\n      masterRegex.lastIndex++;\n    }\n\n    if (match.groups) {\n      for (const groupName in match.groups) {\n        if (match.groups[groupName] !== undefined) {\n          const type = groupMap.get(groupName);\n          if (type) {\n            const start = match.index;\n            const end = start + match[0].length;\n\n            if ((language === 'html' || language === 'tsx' || language === 'jsx') && type === 'tag') {\n              const tagNameMatch = match[0].match(/[a-zA-Z0-9-]+/);\n              if (tagNameMatch && tagNameMatch.index !== undefined) {\n                const tagNameStart = start + tagNameMatch.index;\n                const tagNameEnd = tagNameStart + tagNameMatch[0].length;\n                tokens.push({ type, start: tagNameStart, end: tagNameEnd });\n                break;\n              }\n            }\n\n            tokens.push({ type, start, end });\n            break;\n          }\n        }\n      }\n    }\n  }\n\n  return tokens;\n};\n\nexport const normalizeIndent = (code: string): string => {\n  const lines = code.split('\\n').filter((line) => line.trim());\n\n  if (!lines.length) {\n    return '';\n  }\n\n  const minIndent = Math.min(...lines.map((line) => line.match(/^\\s*/)?.[0].length || 0));\n\n  return lines.map((line) => line.substring(minIndent)).join('\\n');\n};\n","import { html, render, type TemplateResult } from 'lit-html';\n\ntype Constructor<T extends HTMLElement> = new (...args: unknown[]) => T;\n\ninterface LifecycleElement {\n  connectedCallback?(): void;\n  disconnectedCallback?(): void;\n  attributeChangedCallback?(name: string, oldValue: string | null, newValue: string | null): void;\n}\n\ntype RenderableElement = HTMLElement & {\n  render?(): TemplateResult | null | undefined;\n  afterRender?(): void;\n  wrapRender?(commit: () => void, context: RenderContext): void;\n  onAttributeChange?(name: string, oldValue: string | null, newValue: string | null): void;\n  requestRender?(): void;\n  renderRoot?: ShadowRoot | HTMLElement;\n};\n\ntype TemplateValue<TElement extends RenderableElement> =\n  | TemplateResult\n  | null\n  | undefined\n  | ((this: TElement, host: TElement) => TemplateResult | null | undefined);\n\ninterface ComponentOptions<TElement extends RenderableElement = RenderableElement> {\n  tag: string;\n  template?: TemplateValue<TElement>;\n  styles?: string;\n  styleUrls?: string[];\n  observedAttributes?: string[];\n  shadowMode?: ShadowRootMode;\n  autoSlot?: boolean;\n}\n\n// Exporting RenderContext\nexport interface RenderContext {\n  fragment: DocumentFragment;\n  root: ShadowRoot | HTMLElement;\n}\n\nconst styleCache = new Map<string, Promise<string>>();\n\nconst normalizeTemplate = <TElement extends RenderableElement>(\n  template?: TemplateValue<TElement>\n): ((this: TElement, host: TElement) => TemplateResult | null | undefined) => {\n  if (typeof template === 'function') {\n    return template as (this: TElement, host: TElement) => TemplateResult | null | undefined;\n  }\n\n  if (template && typeof template === 'object' && '_$litTemplate$' in template) {\n    return function (this: TElement): TemplateResult | null | undefined {\n      return template as TemplateResult;\n    };\n  }\n\n  return function (this: TElement): TemplateResult | null | undefined {\n    return null;\n  };\n};\n\nconst fetchStyles = async (urls: readonly string[]): Promise<string[]> =>\n  Promise.all(\n    urls.map((url) => {\n      const cached = styleCache.get(url);\n      if (cached) {\n        return cached;\n      }\n\n      const request = fetch(url)\n        .then((response) => (response.ok ? response.text() : ''))\n        .catch(() => '');\n\n      styleCache.set(url, request);\n      return request;\n    })\n  );\n\nexport const Component =\n  <TElement extends RenderableElement = RenderableElement>(options: ComponentOptions<TElement>) =>\n  <TBase extends Constructor<TElement> & { observedAttributes?: string[] }>(\n    Base: TBase,\n    _context: ClassDecoratorContext\n  ): TBase => {\n    const {\n      tag,\n      template,\n      styles = '',\n      styleUrls = [],\n      observedAttributes = [],\n      shadowMode = 'open',\n      autoSlot = true\n    } = options;\n\n    if (!tag) {\n      throw new Error('@Component requires a \"tag\" option.');\n    }\n\n    const templateFn = normalizeTemplate<TElement>(template);\n\n    class Decorated extends (Base as unknown as Constructor<RenderableElement>) {\n      static get observedAttributes(): string[] {\n        const parent =\n          'observedAttributes' in Base && Array.isArray(Base.observedAttributes)\n            ? (Base.observedAttributes as string[])\n            : [];\n        const own = Array.isArray(observedAttributes) ? observedAttributes : [];\n        return Array.from(new Set([...parent, ...own]));\n      }\n\n      #shadow: ShadowRoot;\n      #styles = styles;\n      #styleUrls = [...styleUrls];\n      #renderScheduled = false;\n\n      constructor(...args: unknown[]) {\n        super(...args);\n        this.#shadow = this.attachShadow({ mode: shadowMode });\n        this.renderRoot = this.#shadow;\n      }\n\n      get shadow(): HTMLElement | ShadowRoot | undefined {\n        return this.renderRoot;\n      }\n\n      connectedCallback(): void {\n        (Base.prototype as LifecycleElement).connectedCallback?.call(this);\n\n        void this.#loadStyles().finally(() => {\n          this.requestRender();\n        });\n      }\n\n      disconnectedCallback(): void {\n        (Base.prototype as LifecycleElement).disconnectedCallback?.call(this);\n        this.#renderScheduled = false;\n      }\n\n      attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n        (Base.prototype as LifecycleElement).attributeChangedCallback?.call(this, name, oldValue, newValue);\n\n        if (oldValue !== newValue) {\n          this.onAttributeChange?.(name, oldValue, newValue);\n        }\n      }\n\n      requestRender(): void {\n        if (this.#renderScheduled) {\n          return;\n        }\n\n        this.#renderScheduled = true;\n\n        requestAnimationFrame(() => {\n          this.#renderScheduled = false;\n          this.#render();\n        });\n      }\n\n      async #loadStyles(): Promise<void> {\n        if (!this.#styleUrls.length) {\n          return;\n        }\n\n        const fetched = await fetchStyles(this.#styleUrls);\n        const inlineStyles = this.#styles ? [this.#styles] : [];\n        this.#styles = [...inlineStyles, ...fetched.filter(Boolean)].join('\\n');\n      }\n\n      #render(): void {\n        const root = this.#shadow;\n\n        let templateResult: TemplateResult | null | undefined;\n\n        if (typeof this.render === 'function') {\n          templateResult = this.render();\n        } else {\n          templateResult = templateFn.call(this as unknown as TElement, this as unknown as TElement);\n        }\n\n        const styleTemplate = this.#styles ? html`<style>${this.#styles}</style>` : null;\n        const slotTemplate = autoSlot ? html`<slot></slot>` : null;\n\n        const completeTemplate = html`\n          ${styleTemplate}\n          ${templateResult ?? null}\n          ${slotTemplate}\n        `;\n\n        const commit = (): void => {\n          render(completeTemplate, root);\n          this.afterRender?.();\n        };\n\n        if (typeof this.wrapRender === 'function') {\n          const fragment = document.createDocumentFragment();\n          const tempDiv = document.createElement('div');\n\n          render(completeTemplate, tempDiv);\n\n          fragment.append(...tempDiv.childNodes);\n\n          this.wrapRender(commit, { fragment, root });\n          return;\n        }\n\n        commit();\n      }\n    }\n\n    // SSR safety: only register in browser environments\n    if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n      customElements.define(tag, Decorated as unknown as CustomElementConstructor);\n    }\n\n    return Decorated as unknown as TBase;\n  };\n","type RenderHost = HTMLElement & {\n  requestRender?(): void;\n  render?(): void;\n  connectedCallback?(): void;\n  disconnectedCallback?(...args: unknown[]): void;\n};\n\ntype PropTypeDescriptor =\n  | BooleanConstructor\n  | NumberConstructor\n  | StringConstructor\n  | ObjectConstructor\n  | ArrayConstructor\n  | 'boolean'\n  | 'number'\n  | 'string'\n  | 'json';\n\ntype Formatter<TValue, THost extends RenderHost> = (this: THost, value: TValue) => string | null | undefined;\ntype Parser<TValue, THost extends RenderHost> = (this: THost, value: string | null) => TValue;\n\ninterface PropOptions<TValue, THost extends RenderHost> {\n  attribute?: string;\n  reflect?: boolean;\n  type?: PropTypeDescriptor;\n  parse?: Parser<TValue, THost>;\n  format?: Formatter<TValue, THost>;\n  defaultValue?: TValue | ((this: THost) => TValue);\n  compare?: (previous: TValue, next: TValue) => boolean;\n  onChange?: (this: THost, next: TValue, previous: TValue) => void;\n  onAttributeChange?: (this: THost, next: TValue, previous: TValue) => void;\n}\n\ninterface AttributeObserverEntry {\n  observer: MutationObserver;\n  callbacks: Map<string, Set<(value: string | null) => void>>;\n}\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\nconst cleanupRegistry = new WeakMap<RenderHost, Set<() => void>>();\nconst observerRegistry = new WeakMap<RenderHost, AttributeObserverEntry>();\nconst internalMutations = new WeakMap<RenderHost, Set<string>>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n  if (typeof instance.requestRender === 'function') {\n    instance.requestRender();\n    return;\n  }\n\n  if (typeof instance.render !== 'function') {\n    return;\n  }\n\n  if (renderQueue.get(instance)) {\n    return;\n  }\n\n  renderQueue.set(instance, true);\n\n  requestAnimationFrame(() => {\n    renderQueue.delete(instance);\n    instance.render?.();\n  });\n};\n\nconst toKebabCase = (value: PropertyKey): string =>\n  String(value)\n    .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n    .replace(/[_\\s]+/g, '-')\n    .toLowerCase();\n\nconst registerCleanup = (instance: RenderHost, cleanup: () => void): void => {\n  let callbacks = cleanupRegistry.get(instance);\n\n  if (!callbacks) {\n    callbacks = new Set();\n    cleanupRegistry.set(instance, callbacks);\n\n    const original = instance.disconnectedCallback;\n\n    instance.disconnectedCallback = function (this: RenderHost, ...args: unknown[]) {\n      const registered = cleanupRegistry.get(this);\n      registered?.forEach((callback) => {\n        try {\n          callback();\n        } catch (error) {\n          console.error('[Prop] cleanup failed', error);\n        }\n      });\n      cleanupRegistry.delete(this);\n\n      if (typeof original === 'function') {\n        return original.apply(this, args as []);\n      }\n\n      return undefined;\n    } as typeof instance.disconnectedCallback;\n  }\n\n  callbacks.add(cleanup);\n};\n\nconst markInternalMutation = (host: RenderHost, attribute: string): void => {\n  let attributes = internalMutations.get(host);\n\n  if (!attributes) {\n    attributes = new Set();\n    internalMutations.set(host, attributes);\n  }\n\n  attributes.add(attribute);\n};\n\nconst isInternalMutation = (host: RenderHost, attribute: string): boolean => {\n  const attributes = internalMutations.get(host);\n\n  if (!attributes) {\n    return false;\n  }\n\n  const hasAttribute = attributes.has(attribute);\n\n  if (hasAttribute) {\n    attributes.delete(attribute);\n    if (attributes.size === 0) {\n      internalMutations.delete(host);\n    }\n  }\n\n  return hasAttribute;\n};\n\nconst observeAttribute = (host: RenderHost, attribute: string, handler: (value: string | null) => void): void => {\n  let entry = observerRegistry.get(host);\n\n  if (!entry) {\n    const callbacks = new Map<string, Set<(value: string | null) => void>>();\n    const observer = new MutationObserver((records) => {\n      records.forEach((record) => {\n        const attributeName = record.attributeName;\n\n        if (!attributeName) {\n          return;\n        }\n\n        if (isInternalMutation(host, attributeName)) {\n          return;\n        }\n\n        const listeners = callbacks.get(attributeName);\n        if (!listeners) {\n          return;\n        }\n\n        const currentValue = (record.target as Element).getAttribute(attributeName);\n\n        for (const listener of listeners) {\n          listener(currentValue);\n        }\n      });\n    });\n\n    observer.observe(host, { attributes: true });\n\n    entry = { observer, callbacks };\n    observerRegistry.set(host, entry);\n\n    registerCleanup(host, () => {\n      observer.disconnect();\n      observerRegistry.delete(host);\n    });\n  }\n\n  let listeners = entry.callbacks.get(attribute);\n\n  if (!listeners) {\n    listeners = new Set();\n    entry.callbacks.set(attribute, listeners);\n  }\n\n  listeners.add(handler);\n};\n\nconst updateAttribute = (host: RenderHost, attribute: string, value: string | null | undefined | boolean): void => {\n  markInternalMutation(host, attribute);\n\n  if (value === undefined || value === null || value === false) {\n    host.removeAttribute(attribute);\n    return;\n  }\n\n  if (value === true) {\n    host.setAttribute(attribute, '');\n    return;\n  }\n\n  host.setAttribute(attribute, String(value));\n};\n\nconst resolveType = (type: PropTypeDescriptor | undefined): 'boolean' | 'number' | 'json' | 'string' | null => {\n  if (!type) {\n    return null;\n  }\n\n  if (type === Boolean || type === 'boolean') {\n    return 'boolean';\n  }\n\n  if (type === Number || type === 'number') {\n    return 'number';\n  }\n\n  if (type === Object || type === Array || type === 'json') {\n    return 'json';\n  }\n\n  return 'string';\n};\n\nconst typeParsers: Record<'boolean' | 'number' | 'json' | 'string', Parser<unknown, RenderHost>> = {\n  boolean(value: string | null): boolean {\n    return value !== null;\n  },\n  number(value: string | null): number | null {\n    if (value === null || value === '') {\n      return null;\n    }\n\n    const parsed = Number(value);\n    return Number.isNaN(parsed) ? null : parsed;\n  },\n  json(value: string | null): unknown {\n    if (!value) {\n      return null;\n    }\n\n    try {\n      return JSON.parse(value);\n    } catch (error) {\n      console.warn('[Prop] failed to parse JSON attribute', error);\n      return null;\n    }\n  },\n  string(value: string | null): string | null {\n    return value;\n  }\n};\n\nconst typeFormatters: Record<'boolean' | 'number' | 'json' | 'string', Formatter<unknown, RenderHost>> = {\n  boolean(value: unknown): string | null {\n    return value ? '' : null;\n  },\n  number(value: unknown): string | null {\n    if (value === null || value === undefined || value === '') {\n      return null;\n    }\n    return String(value);\n  },\n  json(value: unknown): string | null {\n    if (value === null || value === undefined) {\n      return null;\n    }\n    try {\n      return JSON.stringify(value);\n    } catch {\n      return null;\n    }\n  },\n  string(value: unknown): string | null {\n    if (value === null || value === undefined) {\n      return null;\n    }\n    return String(value);\n  }\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\nexport function Prop<TValue, THost extends RenderHost = RenderHost>(options: PropOptions<TValue, THost> = {}) {\n  const {\n    attribute,\n    reflect = true,\n    type,\n    parse,\n    format,\n    defaultValue,\n    compare = defaultCompare,\n    onChange,\n    onAttributeChange\n  } = options;\n\n  const resolvedType = resolveType(type);\n\n  const parseValue: Parser<TValue, THost> = parse\n    ? parse\n    : function (this: THost, value) {\n        if (!resolvedType) {\n          return value as unknown as TValue;\n        }\n        return typeParsers[resolvedType].call(this, value) as TValue;\n      };\n\n  const formatValue: Formatter<TValue, THost> = format\n    ? format\n    : function (this: THost, value) {\n        if (!resolvedType) {\n          return (value as unknown as string | null | undefined) ?? null;\n        }\n        return typeFormatters[resolvedType].call(this, value as unknown) as string | null;\n      };\n\n  return (\n    accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n    context: ClassAccessorDecoratorContext<THost, TValue>\n  ): ClassAccessorDecoratorResult<THost, TValue> => {\n    if (context.kind !== 'accessor') {\n      throw new Error('@Prop requires the \"accessor\" keyword on the property.');\n    }\n\n    const attributeName = attribute ?? toKebabCase(context.name);\n\n    context.addInitializer(function (this: THost) {\n      if (!reflect) {\n        return;\n      }\n\n      observeAttribute(this, attributeName, (rawValue) => {\n        if (isInternalMutation(this, attributeName)) {\n          return;\n        }\n\n        const parsed = parseValue.call(this, rawValue);\n        const previous = accessor.get.call(this);\n\n        if (compare(previous, parsed)) {\n          return;\n        }\n\n        accessor.set.call(this, parsed);\n\n        onAttributeChange?.call(this, parsed, previous);\n        scheduleRender(this);\n      });\n    });\n\n    return {\n      get(this: THost): TValue {\n        return accessor.get.call(this);\n      },\n      set(this: THost, value: TValue): void {\n        const previous = accessor.get.call(this);\n\n        if (compare(previous, value)) {\n          return;\n        }\n\n        accessor.set.call(this, value);\n\n        if (reflect) {\n          const formatted = formatValue.call(this, value);\n          updateAttribute(this, attributeName, formatted);\n        }\n\n        onChange?.call(this, value, previous);\n        scheduleRender(this);\n      },\n      init(this: THost, initialValue: TValue): TValue {\n        let value = initialValue;\n\n        if (this.hasAttribute(attributeName)) {\n          value = parseValue.call(this, this.getAttribute(attributeName));\n        } else if (value === undefined && defaultValue !== undefined) {\n          value =\n            typeof defaultValue === 'function' ? (defaultValue as (this: THost) => TValue).call(this) : defaultValue;\n        }\n\n        if (reflect) {\n          const formatted = formatValue.call(this, value);\n          updateAttribute(this, attributeName, formatted);\n        }\n\n        return value;\n      }\n    };\n  };\n}\n","type QueryRoot = 'shadow' | 'light' | 'document';\n\ntype QueryHost = HTMLElement & {\n  renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype QueryFallback<TResult, THost extends QueryHost> = TResult | ((host: THost) => TResult);\n\ninterface BaseQueryOptions<TResult, THost extends QueryHost> {\n  from?: QueryRoot;\n  fallback?: QueryFallback<TResult, THost>;\n}\n\ninterface QueryAllOptions<TElement extends Element, THost extends QueryHost>\n  extends BaseQueryOptions<TElement[], THost> {\n  all: true;\n  closest?: false;\n}\n\ninterface QueryClosestOptions<THost extends QueryHost> extends BaseQueryOptions<Element | null, THost> {\n  closest: true;\n  all?: false;\n}\n\ninterface QuerySingleOptions<TElement extends Element, THost extends QueryHost>\n  extends BaseQueryOptions<TElement | null, THost> {\n  all?: false;\n  closest?: false;\n}\n\ntype QueryOptions<TElement extends Element, THost extends QueryHost> =\n  | QueryAllOptions<TElement, THost>\n  | QueryClosestOptions<THost>\n  | QuerySingleOptions<TElement, THost>;\n\ntype QueryReturnType<\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n> =\n  TOptions extends QueryAllOptions<TElement, THost>\n    ? TElement[]\n    : TOptions extends QueryClosestOptions<THost>\n      ? Element | null\n      : TElement | null;\n\ntype QueryDecorator<\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n> = (\n  target: ClassAccessorDecoratorTarget<THost, QueryReturnType<TElement, THost, TOptions>> | undefined,\n  context:\n    | ClassFieldDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n    | ClassAccessorDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n) => ClassAccessorDecoratorResult<THost, QueryReturnType<TElement, THost, TOptions>> | undefined;\n\nconst defaultOptions = {\n  all: false,\n  closest: false,\n  from: 'shadow' as QueryRoot | undefined,\n  fallback: null\n} as const satisfies QuerySingleOptions<Element, QueryHost>;\n\nconst resolveFallback = <TResult, THost extends QueryHost>(\n  fallback: QueryFallback<TResult, THost> | undefined,\n  host: THost\n): TResult | undefined => {\n  if (typeof fallback === 'function') {\n    return (fallback as (instance: THost) => TResult)(host);\n  }\n\n  return fallback;\n};\n\nconst resolveRoot = (host: QueryHost, option: QueryRoot | undefined): ParentNode | null => {\n  switch (option) {\n    case 'document':\n      return document;\n    case 'light':\n      return host;\n    default:\n      return host.renderRoot ?? host.shadowRoot ?? host;\n  }\n};\n\nconst resolveQuery = <\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n>(\n  host: THost,\n  selector: string,\n  options: TOptions\n) => {\n  if (options.closest) {\n    const result = host.closest(selector);\n    return result ?? resolveFallback(options.fallback as QueryFallback<Element | null, THost>, host) ?? null;\n  }\n\n  const root = resolveRoot(host, options.from);\n\n  if (!root) {\n    return options.all\n      ? (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? [])\n      : (resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null);\n  }\n\n  if (options.all) {\n    const elements = Array.from(root.querySelectorAll<TElement>(selector));\n    return elements.length > 0\n      ? elements\n      : (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? []);\n  }\n\n  const match = root.querySelector<TElement>(selector);\n  return match ?? resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null;\n};\n\nconst createQueryDecorator = <\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n>(\n  selector: string,\n  options: TOptions\n): QueryDecorator<TElement, THost, TOptions> => {\n  type Result = QueryReturnType<TElement, THost, TOptions>;\n\n  return (\n    _target: ClassAccessorDecoratorTarget<THost, Result> | undefined,\n    context: ClassFieldDecoratorContext<THost, Result> | ClassAccessorDecoratorContext<THost, Result>\n  ): ClassAccessorDecoratorResult<THost, Result> | undefined => {\n    if (context.kind === 'accessor') {\n      const descriptor: ClassAccessorDecoratorResult<THost, Result> = {\n        get(this: THost) {\n          return resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result;\n        },\n        set(_value: Result) {\n          // Readonly accessor\n        }\n      };\n      return descriptor;\n    }\n\n    context.addInitializer(function (this: THost) {\n      Object.defineProperty(this, context.name, {\n        configurable: true,\n        enumerable: true,\n        get: () => resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result\n      });\n    });\n\n    return;\n  };\n};\n\nexport function Query<\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n>(selector: string, userOptions: TOptions): QueryDecorator<TElement, THost, TOptions>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n  selector: string\n): QueryDecorator<TElement, THost, QuerySingleOptions<TElement, THost>>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n  selector: string,\n  userOptions?: QueryOptions<TElement, THost>\n) {\n  if (!selector) {\n    throw new Error('@Query requires a selector.');\n  }\n\n  if (userOptions) {\n    const merged = { ...defaultOptions, ...userOptions } as QueryOptions<TElement, THost>;\n    return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n  }\n\n  const merged = defaultOptions as QuerySingleOptions<TElement, THost>;\n  return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n}\n","import type { TokenType } from './utils/syntax-highlighter-types';\n\nimport { html } from 'lit-html';\n\nimport { getHighlightAPI, SUPPORTS_HIGHLIGHT_API } from './utils/highlight-api';\nimport { generateHighlightStyles } from './utils/syntax-highlighter-theme';\nimport { normalizeIndent, tokenize } from './utils/syntax-tokenizer';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-code',\n  shadowMode: 'open',\n  autoSlot: false,\n  styles: `\n    :host {\n      display: block;\n      position: relative;\n      color: var(--ease-code-color, var(--color-blue-100));\n    }\n\n    pre {\n      margin: 0;\n      font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n      font-size: var(--ease-code-font-size, var(--ease-font-size-sm, 12px));\n      line-height: var(--ease-code-line-height, 1.4);\n    }\n\n    code {\n      white-space: pre-wrap;\n    }\n  `,\n  template() {\n    return html`<pre><code><slot></slot></code></pre>`;\n  }\n})\nexport class Code extends HTMLElement {\n  declare requestRender: () => void;\n\n  #instanceId: string = `hl-${crypto.randomUUID()}`;\n  #registeredHighlights: Set<string> = new Set();\n  #observer: MutationObserver | null = null;\n\n  @Prop<string | null>({ reflect: true })\n  accessor language: string | null = null;\n\n  @Query<HTMLElement>('code')\n  accessor codeElement: HTMLElement | null = null;\n\n  connectedCallback(): void {\n    this.#observer = new MutationObserver(() => this.#processContent());\n\n    this.#observer.observe(this, {\n      childList: true,\n      subtree: true,\n      characterData: true\n    });\n\n    this.#processContent();\n  }\n\n  disconnectedCallback(): void {\n    this.#observer?.disconnect();\n    this.#cleanupHighlights();\n  }\n\n  attributeChangedCallback(name: string): void {\n    if (name === 'language') {\n      this.#processContent();\n    }\n  }\n\n  get currentLanguage(): string {\n    return this.language?.toLowerCase() ?? 'plaintext';\n  }\n\n  afterRender(): void {\n    this.#processContent();\n  }\n\n  #renderStyles = (): void => {\n    const style = document.createElement('style');\n\n    style.setAttribute('data-highlight-styles', this.#instanceId);\n\n    const highlightStyles = generateHighlightStyles(this.#instanceId);\n    style.textContent = highlightStyles;\n\n    if (this.shadowRoot) {\n      this.shadowRoot.appendChild(style);\n    }\n  };\n\n  #cleanupStyles() {\n    const styles = this.shadowRoot?.querySelectorAll<HTMLStyleElement>(\n      `style[data-highlight-styles=\"${this.#instanceId}\"]`\n    );\n\n    if (styles) {\n      for (const style of styles) {\n        style.remove();\n      }\n    }\n  }\n\n  #getHighlightName(type: TokenType): string {\n    return `syntax-${type}-${this.#instanceId}`;\n  }\n\n  #processContent() {\n    let rawCode = this.textContent || '';\n    rawCode = normalizeIndent(rawCode);\n\n    if (!this.codeElement) {\n      return;\n    }\n\n    this.codeElement.textContent = rawCode;\n\n    this.#cleanupHighlights();\n\n    if (!rawCode.trim() || !SUPPORTS_HIGHLIGHT_API) {\n      return;\n    }\n\n    const textNode = this.codeElement.firstChild as Text;\n\n    if (!textNode) {\n      return;\n    }\n\n    this.#highlightCode(rawCode, this.currentLanguage, textNode);\n  }\n\n  #highlightCode(code: string, language: string, textNode: Text) {\n    const api = getHighlightAPI();\n\n    if (!api) {\n      return;\n    }\n\n    const tokens = tokenize(code, language);\n    const highlightMap = new Map<TokenType, Range[]>();\n\n    for (const token of tokens) {\n      if (token.start >= token.end) {\n        continue;\n      }\n\n      try {\n        this.#renderStyles();\n\n        const range = document.createRange();\n        range.setStart(textNode, token.start);\n        range.setEnd(textNode, token.end);\n\n        if (!highlightMap.has(token.type)) {\n          highlightMap.set(token.type, []);\n        }\n\n        highlightMap.get(token.type)?.push(range);\n      } catch {\n        // Ignore range creation errors\n      }\n    }\n\n    for (const [type, ranges] of highlightMap.entries()) {\n      if (ranges.length) {\n        const highlightName = this.#getHighlightName(type);\n        const highlight = new api.Highlight(...ranges);\n        api.highlights.set(highlightName, highlight);\n        this.#registeredHighlights.add(highlightName);\n      }\n    }\n  }\n\n  #cleanupHighlights() {\n    const api = getHighlightAPI();\n\n    if (!api) {\n      return;\n    }\n\n    for (const name of this.#registeredHighlights) {\n      api.highlights.delete(name);\n    }\n\n    this.#cleanupStyles();\n\n    this.#registeredHighlights.clear();\n  }\n}\n","import type { CubicBezierPoints, LinearPoints } from './types';\n\nexport const cubicBezierToLinearPoints = (points: CubicBezierPoints): LinearPoints => {\n  const start = {\n    x: 0,\n    y: 0,\n    cpOutX: points.p1.x,\n    cpOutY: points.p1.y,\n    isLinked: true,\n    mirrorLength: true\n  };\n\n  const end = {\n    x: 1,\n    y: 1,\n    cpInX: points.p2.x - 1,\n    cpInY: points.p2.y - 1,\n    isLinked: true,\n    mirrorLength: true\n  };\n\n  return [start, end];\n};\n","export const canvasStyles = `\n  :host {\n    display: block;\n    width: 100%;\n    max-width: 500px;\n    position: relative;\n  }\n\n  svg {\n    width: 300px;\n    height: auto;\n    cursor: pointer;\n    touch-action: none;\n    user-select: none;\n    overflow: visible;\n    border-radius: 8px;\n  }\n\n  .grid-line {\n    stroke: var(--color-white-4);\n    stroke-width: .75;\n  }\n\n  .curve-path {\n    stroke: var(--color-blue-100);\n    stroke-width: 2.5;\n    fill: none;\n    stroke-linecap: round;\n    stroke-linejoin: round;\n    transition: stroke-width 150ms ease;\n  }\n\n  .curve-path--preview {\n    stroke: var(--color-blue-800);\n    stroke-width: 2.5;\n    stroke-dasharray: 5, 5;\n    opacity: 0;\n    pointer-events: none;\n    animation: previewPathFade 180ms ease forwards;\n  }\n\n  .control-point {\n    fill: var(--color-blue-700);\n    stroke: var(--color-blue-900);\n    stroke-width: 1.5;\n    cursor: grab;\n  }\n\n  .control-point:active {\n    cursor: grabbing;\n  }\n\n  .control-point.selected {\n  }\n\n  .anchor-point-start {\n    fill: var(--color-blue-100);\n    pointer-events: none;\n    r: 5px;\n    transition: r .2s;\n  }\n\n  .anchor-point {\n    fill: var(--color-blue-900);\n    stroke: var(--color-blue-900);\n    stroke-width: 1;\n    pointer-events: none;\n    r: 5px;\n    transition: r .2s;\n  }\n\n  .anchor-point:hover {\n    r: 5.5px;\n  }\n\n  .control-line {\n    stroke: var(--color-blue-800);\n    stroke-width: 3;\n    pointer-events: none;\n    display: none;\n  }\n\n  .linear-point {\n    fill: var(--color-blue-100);\n    cursor: grab;\n    r: 3px;\n    transition: r .2s;\n  }\n\n  .hit-area-point:hover + .linear-point,\n  .linear-point:hover,\n  .linear-point:active,\n  .linear-point.selected {\n    r: 5px;\n  }\n\n  .linear-point.selected {\n    fill: var(--color-blue-300);\n    stroke-width: 1.5;\n  }\n\n  .linear-handle-line {\n    stroke: var(--color-blue-800);\n    stroke-width: 3;\n    pointer-events: none;\n    transition: opacity 150ms ease;\n    display: none;\n  }\n\n  .linear-handle {\n    fill: var(--color-blue-700);\n    stroke: var(--color-blue-900);\n    stroke-width: 1;\n    cursor: grab;\n  }\n\n  .linear-handle.selected {\n  }\n\n  .linear-handle:active {\n    cursor: grabbing;\n  }\n\n  .hit-area-point,\n  .hit-area-handle {\n    fill: transparent;\n    stroke: transparent;\n    pointer-events: all;\n    cursor: inherit;\n    r: 10px;\n  }\n\n  @keyframes pulse {\n    0% {\n      opacity: 1;\n    }\n    50% {\n      opacity: 0.6;\n    }\n    100% {\n      opacity: 1;\n    }\n  }\n\n  .curve-path.animating {\n    animation: pulse 1s ease-in-out infinite;\n  }\n\n  @keyframes previewPathFade {\n    from {\n      opacity: 0;\n    }\n    to {\n      opacity: 0.6;\n    }\n  }\n\n  @keyframes previewElementFade {\n    from {\n      opacity: 0;\n    }\n    to {\n      opacity: 0.85;\n    }\n  }\n\n  .linear-preview-group {\n    pointer-events: none;\n  }\n\n  .linear-point--preview,\n  .linear-handle--preview,\n  .linear-handle-line--preview {\n    animation: previewElementFade 180ms ease forwards;\n  }\n\n  .linear-point--preview {\n    fill: var(--color-blue-100);\n  }\n\n  .linear-handle--preview {\n    fill: var(--color-blue-700);\n    stroke: var(--color-blue-900);\n    stroke-width: 1.5;\n  }\n\n  .linear-handle-line--preview {\n    stroke: var(--color-blue-800);\n    stroke-width: 2.5;\n    stroke-dasharray: 4 4;\n    display: none;\n  }\n`;\n\nexport const controlsStyles = `\n  :host {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    gap: 0.75rem;\n  }\n\n  [part=\"radio-group\"] {\n    width: 100%;\n    box-sizing: border-box;\n  }\n\n  [part=\"easing-type-dropdown\"] {\n    --ease-dropdown-max-height: 212px;\n  }\n`;\n\nexport const outputStyles = `\n  :host {\n    display: block;\n  }\n\n  .output-container {\n    display: flex;\n    flex-direction: column;\n    gap: 1rem;\n  }\n\n  .output-group {\n    position: relative;\n    display: block;\n  }\n\n  .output-label {\n    font-size: 0.875rem;\n    font-weight: 600;\n    color: var(--color-gray-1000);\n    margin: 0;\n  }\n\n  .output-code {\n    font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n    font-size: 0.8125rem;\n    line-height: 1.6;\n    padding: 1rem;\n    background: var(--color-gray-1000);\n    color: var(--color-gray-700);\n    border-radius: 0.375rem;\n    border: 1px solid #334155;\n    white-space: pre-wrap;\n    word-break: break-word;\n    overflow-x: auto;\n    max-width: 100%;\n    tab-size: 2;\n  }\n\n  .copy-button {\n    align-self: flex-start;\n    padding: 0.425rem 0.875rem;\n    border: 1px solid var(--color-white-6);\n    border-radius: 0.375rem;\n    background: white;\n    color: var(--color-gray-1000);\n    font-size: 0.875rem;\n    font-weight: 500;\n    cursor: pointer;\n    transition: all 150ms ease;\n    user-select: none;\n  }\n\n  .copy-button:hover {\n    background: var(--color-gray-1000);\n    border-color: #9ca3af;\n    transform: translateY(-1px);\n  }\n\n  .copy-button:active {\n    transform: translateY(0);\n  }\n\n  .copy-button:focus-visible {\n    outline: 2px solid var(--color-blue-700);\n    outline-offset: 2px;\n  }\n\n  .copy-button.copied {\n    background: var(--color-blue-100);\n    border-color: var(--color-blue-100);\n    color: white;\n  }\n\n  .preview-container {\n    display: flex;\n    flex-direction: column;\n    gap: 0.75rem;\n  }\n\n  .preview-box {\n    width: 100%;\n    max-width: 300px;\n    height: 80px;\n    background: linear-gradient(135deg, var(--color-blue-700) 0%, var(--color-blue-100) 100%);\n    border-radius: 0.5rem;\n    position: relative;\n    overflow: hidden;\n    cursor: pointer;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n    transition: box-shadow 150ms ease;\n  }\n\n  .preview-box:hover {\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n  }\n\n  .preview-animation {\n    width: 24px;\n    height: 24px;\n    background: white;\n    border-radius: 50%;\n    position: absolute;\n    top: 50%;\n    left: 12px;\n    transform: translateY(-50%);\n    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n    transition-property: transform;\n    transition-duration: 2s;\n  }\n\n  .preview-animation.animate {\n    transform: translateY(-50%) translateX(calc(100% - 48px));\n  }\n`;\n\nexport const containerStyles = `\n  :host {\n    display: block;\n  }\n\n  .curve-container {\n    display: flex;\n    flex-direction: column;\n    position: relative;\n  }\n\n  .curve-header {\n  }\n\n  .curve-canvas-wrapper {\n    position: relative;\n    margin-top: 16px;\n  }\n\n  .curve-canvas {\n    background-color: var(--color-white-2);\n    box-shadow: 0 0 32px 0 var(--color-white-2) inset;\n    border-radius: 7px;\n  }\n\n  .curve-toolbar {\n    margin-top: 8px;\n  }\n`;\n\nexport const canvasControlsStyles = `\n  :host {\n    position: absolute;\n    top: 8px;\n    left: 8px;\n    z-index: 10;\n    display: flex;\n    flex-direction: column;\n    gap: 4px;\n    pointer-events: none;\n  }\n\n  :host([hidden]) {\n    display: none;\n  }\n\n  .overlay-controls {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 4px;\n    pointer-events: auto;\n  }\n\n  .overlay-button {\n    --ease-icon-size: 16px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 4px;\n    color: var(--color-gray-600);\n    border-radius: var(--radii-md);\n    background-color: var(--color-gray-875);\n    box-shadow: inset 0 1px .25px 0 var(--color-white-4), 0 1px 2.5px 0 var(--color-black-8);\n    cursor: pointer;\n    transition: color 0.2s;\n    appearance: none;\n    border: none;\n    outline: none;\n    margin: 0;\n  }\n\n  .overlay-button:hover {\n    color: var(--color-gray-300);\n  }\n\n  .overlay-button:disabled {\n    color: var(--color-gray-700);\n    cursor: not-allowed;\n  }\n\n  .overlay-button.inactive {\n    color: var(--color-blue-100);\n  }\n`;\n\nexport const toolbarStyles = `\n  :host {\n    display: block;\n    width: 100%;\n  }\n\n  .toolbar-container {\n    width: 100%;\n    display: grid;\n    gap: 8px;\n  }\n\n  .toolbar-group {\n    width: 100%;\n    display: flex;\n    gap: 8px;\n    box-sizing: border-box;\n    align-items: center;\n    padding: 6px;\n    border-radius: var(--radii-md);\n    background-color: var(--color-gray-875);\n    box-shadow: inset 0 1px .25px 0 var(--color-white-4), 0 1px 2.5px 0 var(--color-black-8);\n  }\n\n  .toolbar-button {\n    --ease-icon-size: 16px;\n\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: 4px;\n    color: var(--color-gray-600);\n    background-color: transparent;\n    border: none;\n    outline: none;\n    margin: 0;\n    appearance: none;\n    cursor: pointer;\n    transition: color 0.2s;\n  }\n\n  .toolbar-button:hover {\n    color: var(--color-blue-100);\n  }\n\n  .toolbar-button:disabled {\n    color: var(--color-gray-700);\n    cursor: not-allowed;\n  }\n\n  .grid-size-controls {\n    display: grid;\n    grid-template-columns: 24px auto 24px;\n    align-items: center;\n    justify-content: center;\n    margin-left: auto;\n  }\n\n  .grid-size-controls ease-button {\n    --ease-icon-size: 14px;\n    width: 24px;\n    height: 24px;\n    box-sizing: border-box;\n    display: flex;\n    padding: 0;\n    align-items: center;\n    justify-content: center;\n  }\n\n  .grid-size-value {\n    display: flex;\n    width: 20px;\n    justify-content: center;\n    align-items: center;\n    font-feature-settings: 'tnum' on;\n    font-variant-numeric: tabular-nums;\n    font-size: 11px;\n    font-weight: 500;\n    line-height: 14px;\n    text-align: center;\n  }\n`;\n","export enum EasingType {\n  CUBIC_BEZIER = 'cubic-bezier',\n  LINEAR = 'linear'\n}\n\nexport interface Point {\n  x: number;\n  y: number;\n}\n\nexport interface CSSCode {\n  code: string;\n  timingFunction: string;\n}\n\nexport interface LinearPoint extends Point {\n  cpInX?: number;\n  cpInY?: number;\n  cpOutX?: number;\n  cpOutY?: number;\n  isLinked?: boolean;\n  mirrorLength?: boolean;\n  id?: string;\n}\n\nexport interface CubicBezierPoints {\n  p1: Point;\n  p2: Point;\n}\n\nexport type LinearPoints = LinearPoint[];\n\nexport interface EasingData {\n  type: EasingType;\n  points: CubicBezierPoints | LinearPoints;\n  name: string;\n}\n\nexport const MIN_LINEAR_POINTS = 2;\nexport const MAX_LINEAR_POINTS = 30;\n","import type { CSSCode, CubicBezierPoints, LinearPoint, LinearPoints, Point } from './types';\n\nexport const clampPoint = (\n  point: Point,\n  bounds?: { minX?: number; maxX?: number; minY?: number; maxY?: number }\n): Point => {\n  const minX = bounds?.minX ?? 0;\n  const maxX = bounds?.maxX ?? 1;\n  const minY = bounds?.minY ?? 0;\n  const maxY = bounds?.maxY ?? 1;\n\n  return {\n    x: Math.max(minX, Math.min(maxX, point.x)),\n    y: Math.max(minY, Math.min(maxY, point.y))\n  };\n};\n\nexport const MIN_LINEAR_DELTA = 0.0001;\n\nlet linearPointIdCounter = 0;\n\nconst nextLinearPointId = (): string => {\n  linearPointIdCounter += 1;\n  return `linear-point-${linearPointIdCounter}`;\n};\n\nexport const ensureLinearPointId = (point: LinearPoint): string => {\n  if (!point.id) {\n    point.id = nextLinearPointId();\n  }\n  return point.id;\n};\n\nexport const cloneLinearPoint = (point: LinearPoint): LinearPoint => {\n  const sourceId = ensureLinearPointId(point);\n  return {\n    ...point,\n    id: sourceId\n  };\n};\n\nexport const cubicBezierPath = (points: CubicBezierPoints): string => {\n  const { p1, p2 } = points;\n  const startX = 0;\n  const startY = 300;\n  const endX = 400;\n  const endY = 0;\n\n  const cp1x = p1.x * 400;\n  const cp1y = (1 - p1.y) * 300;\n  const cp2x = p2.x * 400;\n  const cp2y = (1 - p2.y) * 300;\n\n  return `M ${startX} ${startY} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${endX} ${endY}`;\n};\n\nexport const linearDisplayPath = (points: LinearPoints): string => {\n  if (points.length < 2) {\n    return '';\n  }\n\n  const toSvg = (p: Point): Point => {\n    return {\n      x: p.x * 400,\n      y: (1 - p.y) * 300\n    };\n  };\n\n  const startPoint = points[0];\n  if (!startPoint) {\n    return '';\n  }\n\n  const start = toSvg(startPoint);\n  let d = `M ${start.x} ${start.y}`;\n\n  for (let index = 0; index < points.length - 1; index += 1) {\n    const p1 = points[index];\n    const p2 = points[index + 1];\n\n    if (!p1 || !p2) {\n      continue;\n    }\n\n    const cp1 = {\n      x: p1.x + (p1.cpOutX ?? 0),\n      y: p1.y + (p1.cpOutY ?? 0)\n    };\n\n    const cp2 = {\n      x: p2.x + (p2.cpInX ?? 0),\n      y: p2.y + (p2.cpInY ?? 0)\n    };\n\n    if (cp1.x === p1.x && cp1.y === p1.y && cp2.x === p2.x && cp2.y === p2.y) {\n      const end = toSvg(p2);\n      d += ` L ${end.x} ${end.y}`;\n    } else {\n      const svgCp1 = toSvg(cp1);\n      const svgCp2 = toSvg(cp2);\n      const end = toSvg(p2);\n      d += ` C ${svgCp1.x} ${svgCp1.y}, ${svgCp2.x} ${svgCp2.y}, ${end.x} ${end.y}`;\n    }\n  }\n\n  return d;\n};\n\nconst perpendicularDistance = (point: Point, lineStart: Point, lineEnd: Point): number => {\n  const dx = lineEnd.x - lineStart.x;\n  const dy = lineEnd.y - lineStart.y;\n\n  if (dx === 0 && dy === 0) {\n    return Math.sqrt((point.x - lineStart.x) ** 2 + (point.y - lineStart.y) ** 2);\n  }\n\n  const numerator = Math.abs(dy * point.x - dx * point.y + lineEnd.x * lineStart.y - lineEnd.y * lineStart.x);\n  const denominator = Math.sqrt(dx * dx + dy * dy);\n\n  return numerator / denominator;\n};\n\nconst simplifyPoints = (points: Point[], epsilon: number): Point[] => {\n  if (points.length < 3) {\n    return points;\n  }\n\n  let dmax = 0;\n  let index = 0;\n  const end = points.length - 1;\n  const startPoint = points[0];\n  const endPoint = points[end];\n\n  if (!startPoint || !endPoint) {\n    return points;\n  }\n\n  for (let i = 1; i < end; i++) {\n    const point = points[i];\n    if (!point) {\n      continue;\n    }\n\n    const d = perpendicularDistance(point, startPoint, endPoint);\n    if (d > dmax) {\n      index = i;\n      dmax = d;\n    }\n  }\n\n  if (dmax > epsilon) {\n    const recResults1 = simplifyPoints(points.slice(0, index + 1), epsilon);\n    const recResults2 = simplifyPoints(points.slice(index, end + 1), epsilon);\n\n    return [...recResults1.slice(0, -1), ...recResults2];\n  }\n\n  return [startPoint, endPoint];\n};\n\nexport const generateCubicBezierCSS = (\n  points: CubicBezierPoints,\n  name: string,\n  variant: 'animation' | 'transition' = 'animation'\n): CSSCode => {\n  const { p1, p2 } = points;\n  const timingFunction = `cubic-bezier(${p1.x.toFixed(3)}, ${p1.y.toFixed(3)}, ${p2.x.toFixed(3)}, ${p2.y.toFixed(3)})`;\n  const code = `\n    .${name} {\n      ${variant}-timing-function: ${timingFunction};\n    }\n  `;\n\n  return {\n    code,\n    timingFunction\n  };\n};\n\nexport const getLinearApproximation = (\n  points: LinearPoints,\n  options: { simplify?: number; round?: number } = {}\n): Point[] => {\n  const { simplify = 0, round = 5 } = options;\n\n  const samples: Point[] = [];\n  const numSamplesPerSegment = 20;\n\n  const sortedPoints = [...points].sort((a, b) => a.x - b.x);\n\n  for (let index = 0; index < sortedPoints.length - 1; index += 1) {\n    const p1 = sortedPoints[index];\n    const p2 = sortedPoints[index + 1];\n\n    if (!p1 || !p2) {\n      continue;\n    }\n\n    if (index === 0) {\n      samples.push({ x: p1.x, y: p1.y });\n    }\n\n    const cp1 = {\n      x: p1.x + (p1.cpOutX ?? 0),\n      y: p1.y + (p1.cpOutY ?? 0)\n    };\n\n    const cp2 = {\n      x: p2.x + (p2.cpInX ?? 0),\n      y: p2.y + (p2.cpInY ?? 0)\n    };\n\n    for (let step = 1; step <= numSamplesPerSegment; step += 1) {\n      const t = step / numSamplesPerSegment;\n      const x = cubicBezier(t, p1.x, cp1.x, cp2.x, p2.x);\n      const y = cubicBezier(t, p1.y, cp1.y, cp2.y, p2.y);\n      samples.push({ x, y });\n    }\n  }\n\n  const normalizedSamples: Point[] = [];\n  let lastX = -Infinity;\n\n  for (const sample of samples) {\n    const clampedX = Math.max(0, Math.min(1, sample.x));\n    const clampedY = Math.max(-2, Math.min(3, sample.y));\n\n    if (clampedX > lastX + MIN_LINEAR_DELTA) {\n      normalizedSamples.push({ x: clampedX, y: clampedY });\n      lastX = clampedX;\n    }\n  }\n\n  if (normalizedSamples.length < 2) {\n    return [\n      { x: 0, y: 0 },\n      { x: 1, y: 1 }\n    ];\n  }\n\n  const firstPoint = sortedPoints[0];\n  if (firstPoint && Math.abs(firstPoint.x) < MIN_LINEAR_DELTA && normalizedSamples.length > 0) {\n    const firstSample = normalizedSamples[0];\n    if (firstSample) {\n      firstSample.x = 0;\n    }\n  }\n\n  const lastPoint = sortedPoints[sortedPoints.length - 1];\n  if (lastPoint && Math.abs(lastPoint.x - 1) < MIN_LINEAR_DELTA && normalizedSamples.length > 0) {\n    const lastSample = normalizedSamples[normalizedSamples.length - 1];\n    if (lastSample) {\n      lastSample.x = 1;\n    }\n  }\n\n  let finalSamples = normalizedSamples;\n  if (simplify > 0) {\n    finalSamples = simplifyPoints(normalizedSamples, simplify);\n  }\n\n  return finalSamples.map((sample) => {\n    return {\n      x: sample.x,\n      y: Number(sample.y.toFixed(round))\n    };\n  });\n};\n\nexport const generateLinearCSS = (\n  points: LinearPoints | undefined,\n  name: string,\n  variant: 'animation' | 'transition' = 'animation',\n  options: { simplify?: number; round?: number } = {}\n): CSSCode => {\n  if (!Array.isArray(points) || points.length < 2) {\n    return { code: '', timingFunction: '' };\n  }\n\n  const finalSamples = getLinearApproximation(points, options);\n\n  const parts = finalSamples.map((sample) => {\n    const y = sample.y;\n    const x = Number((sample.x * 100).toFixed(2));\n    return `${y} ${x}%`;\n  });\n  const timingFunction = `linear(${parts.join(', ')})`;\n  const code = `\n      .${name} {\n        ${variant}-timing-function: ${timingFunction};\n      }\n    `;\n\n  return { code, timingFunction };\n};\n\nexport const cubicBezierToLinear = (points: CubicBezierPoints, steps: number = 20): LinearPoints => {\n  const linearPoints: LinearPoints = [];\n\n  for (let i = 0; i <= steps; i++) {\n    const t = i / steps;\n    const x = cubicBezier(t, 0, points.p1.x, points.p2.x, 1);\n    const y = cubicBezier(t, 0, points.p1.y, points.p2.y, 1);\n    linearPoints.push({ x, y });\n  }\n\n  return linearPoints;\n};\n\nconst cubicBezier = (t: number, p0: number, p1: number, p2: number, p3: number): number => {\n  const u = 1 - t;\n  const tt = t * t;\n  const uu = u * u;\n  const uuu = uu * u;\n  const ttt = tt * t;\n\n  return uuu * p0 + 3 * uu * t * p1 + 3 * u * tt * p2 + ttt * p3;\n};\n\nexport const validateCubicBezierPoints = (points: CubicBezierPoints): boolean => {\n  const { p1, p2 } = points;\n  return p1.x >= 0 && p1.x <= 1 && p2.x >= 0 && p2.x <= 1;\n};\n\nexport const validateLinearPoints = (points: LinearPoints): boolean => {\n  if (points.length < 2) {\n    return false;\n  }\n\n  const sortedPoints = [...points].sort((a, b) => a.x - b.x);\n\n  for (let index = 0; index < sortedPoints.length; index += 1) {\n    const point = sortedPoints[index];\n\n    if (!point) {\n      return false;\n    }\n    if (point.x < 0 || point.x > 1) {\n      return false;\n    }\n\n    if (index >= sortedPoints.length - 1) {\n      continue;\n    }\n\n    const next = sortedPoints[index + 1];\n\n    if (!next) {\n      return false;\n    }\n\n    if (next.x <= point.x + MIN_LINEAR_DELTA) {\n      return false;\n    }\n  }\n\n  const first = sortedPoints[0];\n  const last = sortedPoints[sortedPoints.length - 1];\n  if (first && Math.abs(first.x) > MIN_LINEAR_DELTA) {\n    return false;\n  }\n  if (last && Math.abs(last.x - 1) > MIN_LINEAR_DELTA) {\n    return false;\n  }\n\n  return true;\n};\n\nexport const normalizeLinearPoints = (points: LinearPoints): LinearPoints => {\n  if (points.length === 0) {\n    return [];\n  }\n\n  const normalized: LinearPoints = [...points].sort((a, b) => a.x - b.x).map((point) => cloneLinearPoint(point));\n\n  const first = normalized[0];\n  if (first) {\n    first.x = 0;\n  }\n\n  const last = normalized[normalized.length - 1];\n  if (last) {\n    last.x = 1;\n  }\n\n  for (let index = 0; index < normalized.length; index += 1) {\n    const point = normalized[index];\n    if (!point) {\n      continue;\n    }\n\n    const minY = -2;\n    const maxY = 3;\n    point.y = Math.max(minY, Math.min(maxY, point.y));\n\n    if ((point.cpInX ?? 0) > 0) {\n      point.cpInX = 0;\n    }\n    if ((point.cpOutX ?? 0) < 0) {\n      point.cpOutX = 0;\n    }\n\n    const handleThreshold = 0;\n    if (Math.abs(point.cpInX ?? 0) < handleThreshold && Math.abs(point.cpInY ?? 0) < handleThreshold) {\n      delete point.cpInX;\n      delete point.cpInY;\n    }\n    if (Math.abs(point.cpOutX ?? 0) < handleThreshold && Math.abs(point.cpOutY ?? 0) < handleThreshold) {\n      delete point.cpOutX;\n      delete point.cpOutY;\n    }\n\n    if (point.cpInX === undefined && point.cpOutX === undefined) {\n      delete point.isLinked;\n      delete point.mirrorLength;\n    } else if (point.isLinked !== true) {\n      point.mirrorLength = false;\n    }\n  }\n\n  return normalized;\n};\n\nconst clamp01 = (value: number): number => {\n  if (Number.isNaN(value)) {\n    return 0;\n  }\n  return Math.min(1, Math.max(0, value));\n};\n\nexport const parseCubicBezierValue = (input: string): CubicBezierPoints | null => {\n  const match = input.trim().match(/^cubic-bezier\\s*\\((.+)\\)$/i);\n\n  if (!match) {\n    return null;\n  }\n\n  const body = match[1];\n  if (!body) {\n    return null;\n  }\n\n  const parts = body\n    .split(',')\n    .map((part) => Number.parseFloat(part.trim()))\n    .filter((value) => Number.isFinite(value));\n\n  if (parts.length !== 4) {\n    return null;\n  }\n\n  const [x1, y1, x2, y2] = parts as [number, number, number, number];\n\n  if ([x1, y1, x2, y2].some((value) => Number.isNaN(value))) {\n    return null;\n  }\n\n  return {\n    p1: { x: clamp01(x1), y: y1 },\n    p2: { x: clamp01(x2), y: y2 }\n  };\n};\n\ntype LinearStop = {\n  y: number;\n  x: number | null;\n};\n\nconst ensureStopPositions = (stops: LinearStop[]): void => {\n  if (stops.length === 0) {\n    return;\n  }\n\n  const first = stops[0];\n  if (first && first.x == null) {\n    first.x = 0;\n  }\n\n  const lastIndex = stops.length - 1;\n  const last = stops[lastIndex];\n  if (last && last.x == null) {\n    last.x = 1;\n  }\n\n  const assignBetween = (startIndex: number, endIndex: number): void => {\n    const startStop = stops[startIndex];\n    const endStop = stops[endIndex];\n\n    if (!startStop || !endStop || startStop.x == null || endStop.x == null) {\n      return;\n    }\n\n    const span = endStop.x - startStop.x;\n    const segments = endIndex - startIndex;\n\n    if (segments <= 1) {\n      return;\n    }\n\n    for (let offset = 1; offset < segments; offset += 1) {\n      const index = startIndex + offset;\n      const ratio = offset / segments;\n      const target = stops[index];\n      if (target) {\n        target.x = startStop.x + span * ratio;\n      }\n    }\n  };\n\n  let lastDefined = 0;\n\n  for (let index = 1; index < stops.length; index += 1) {\n    if (stops[index]?.x != null) {\n      assignBetween(lastDefined, index);\n      lastDefined = index;\n    }\n  }\n\n  if (lastDefined < stops.length - 1) {\n    assignBetween(lastDefined, stops.length - 1);\n  }\n};\n\nexport const parseLinearTimingFunction = (input: string): LinearPoints | null => {\n  const match = input.trim().match(/^linear\\s*\\((.+)\\)$/is);\n\n  if (!match) {\n    return null;\n  }\n\n  const body = match[1];\n  if (!body) {\n    return null;\n  }\n\n  const segments = body\n    .split(',')\n    .map((segment) => segment.trim())\n    .filter((segment) => segment.length > 0);\n\n  if (segments.length < 2) {\n    return null;\n  }\n\n  const stops: LinearStop[] = [];\n\n  for (const segment of segments) {\n    const parts = segment.split(/\\s+/).filter((part) => part.length > 0);\n    if (parts.length === 0) {\n      continue;\n    }\n\n    const valueToken = parts[0];\n    if (!valueToken) {\n      continue;\n    }\n    const value = Number.parseFloat(valueToken);\n    if (Number.isNaN(value)) {\n      return null;\n    }\n\n    let position: number | null = null;\n\n    for (let index = 1; index < parts.length; index += 1) {\n      const token = parts[index];\n      if (!token) {\n        continue;\n      }\n      const percentMatch = token.match(/^(-?\\d+(?:\\.\\d+)?)%$/);\n      if (percentMatch) {\n        const [, percentValue] = percentMatch;\n        if (percentValue === undefined) {\n          break;\n        }\n        const parsed = Number.parseFloat(percentValue);\n        if (!Number.isNaN(parsed)) {\n          position = clamp01(parsed / 100);\n        }\n        break;\n      }\n    }\n\n    stops.push({ y: value, x: position });\n  }\n\n  if (stops.length < 2) {\n    return null;\n  }\n\n  ensureStopPositions(stops);\n\n  const rawPoints: LinearPoints = stops.map((stop) => {\n    const x = stop.x ?? 0;\n    return { x: clamp01(x), y: stop.y };\n  });\n\n  return normalizeLinearPoints(rawPoints);\n};\n\nexport const vectorLength = (dx: number, dy: number): number => Math.sqrt(dx * dx + dy * dy);\n\nexport const normalizeVector = (dx: number, dy: number): { dx: number; dy: number } => {\n  const length = vectorLength(dx, dy);\n\n  if (length === 0) {\n    return { dx: 0, dy: 0 };\n  }\n\n  return { dx: dx / length, dy: dy / length };\n};\n\nexport const smoothLinearPoints = (points: LinearPoints, tension = 0.25): LinearPoints => {\n  if (points.length < 2) {\n    return points;\n  }\n\n  return points.map((point, index) => {\n    const prev = points[index - 1];\n    const next = points[index + 1];\n\n    const smoothedPoint: LinearPoint = { ...point, isLinked: true, mirrorLength: true };\n\n    if (index === 0 && next) {\n      const dx = next.x - point.x;\n      const dy = next.y - point.y;\n      const length = Math.sqrt(dx * dx + dy * dy);\n      const handleLength = length * tension;\n\n      if (length > 0) {\n        smoothedPoint.cpOutX = (dx / length) * handleLength;\n        smoothedPoint.cpOutY = (dy / length) * handleLength;\n      }\n      return smoothedPoint;\n    }\n\n    if (index === points.length - 1 && prev) {\n      const dx = point.x - prev.x;\n      const dy = point.y - prev.y;\n      const length = Math.sqrt(dx * dx + dy * dy);\n      const handleLength = length * tension;\n\n      if (length > 0) {\n        smoothedPoint.cpInX = -(dx / length) * handleLength;\n        smoothedPoint.cpInY = -(dy / length) * handleLength;\n      }\n      return smoothedPoint;\n    }\n\n    if (prev && next) {\n      const tangentX = next.x - prev.x;\n      const tangentY = next.y - prev.y;\n      const tangentLength = Math.sqrt(tangentX * tangentX + tangentY * tangentY);\n\n      if (tangentLength > 0) {\n        const normalizedTx = tangentX / tangentLength;\n        const normalizedTy = tangentY / tangentLength;\n\n        const distToPrev = Math.sqrt((point.x - prev.x) ** 2 + (point.y - prev.y) ** 2);\n        const distToNext = Math.sqrt((next.x - point.x) ** 2 + (next.y - point.y) ** 2);\n\n        const inHandleLength = distToPrev * tension;\n        const outHandleLength = distToNext * tension;\n\n        smoothedPoint.cpInX = -normalizedTx * inHandleLength;\n        smoothedPoint.cpInY = -normalizedTy * inHandleLength;\n        smoothedPoint.cpOutX = normalizedTx * outHandleLength;\n        smoothedPoint.cpOutY = normalizedTy * outHandleLength;\n      }\n    }\n\n    return smoothedPoint;\n  });\n};\n","type ListenHost = HTMLElement & {\n  renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype LifecycleHookName = 'connectedCallback' | 'disconnectedCallback';\n\ntype LifecycleCallback<THost extends ListenHost> = (this: THost) => void;\n\ntype ListenTargetResolver<THost extends ListenHost> =\n  | 'document'\n  | 'window'\n  | 'shadow'\n  | 'root'\n  | 'light'\n  | EventTarget\n  | ((host: THost) => EventTarget | null | undefined);\n\ntype Predicate<TEvent extends Event, TElement extends Element> = (event: TEvent, matched: TElement | null) => boolean;\n\ninterface ListenOptions<THost extends ListenHost, TElement extends Element, TEvent extends Event> {\n  selector?: string;\n  target?: ListenTargetResolver<THost>;\n  prevent?: boolean;\n  stop?: boolean;\n  stopImmediate?: boolean;\n  once?: boolean;\n  passive?: boolean;\n  capture?: boolean;\n  when?: Predicate<TEvent, TElement>;\n}\n\ntype Cleanup = () => void;\n\nconst lifecycleHooks: Record<LifecycleHookName, WeakMap<ListenHost, Set<LifecycleCallback<ListenHost>>>> = {\n  connectedCallback: new WeakMap(),\n  disconnectedCallback: new WeakMap()\n};\n\nconst cleanupRegistry = new WeakMap<ListenHost, Set<Cleanup>>();\n\nconst addLifecycleHook = <THost extends ListenHost>(\n  instance: THost,\n  hookName: LifecycleHookName,\n  handler: LifecycleCallback<THost>\n): void => {\n  const store = lifecycleHooks[hookName] as WeakMap<THost, Set<LifecycleCallback<THost>>>;\n  let callbacks = store.get(instance);\n\n  if (!callbacks) {\n    callbacks = new Set<LifecycleCallback<THost>>();\n    store.set(instance, callbacks);\n\n    const original = (instance as unknown as Record<LifecycleHookName, unknown>)[hookName];\n\n    (instance as unknown as Record<LifecycleHookName, unknown>)[hookName] = function (...args: unknown[]) {\n      callbacks?.forEach((callback) => {\n        callback.apply(this as THost);\n      });\n\n      if (typeof original === 'function') {\n        return (original as (...params: unknown[]) => unknown).apply(this, args);\n      }\n\n      return undefined;\n    };\n  }\n\n  callbacks.add(handler);\n};\n\nconst registerCleanup = <THost extends ListenHost>(instance: THost, cleanup: Cleanup): void => {\n  let callbacks = cleanupRegistry.get(instance);\n\n  if (!callbacks) {\n    callbacks = new Set();\n    cleanupRegistry.set(instance, callbacks);\n\n    addLifecycleHook(instance, 'disconnectedCallback', function (this: THost) {\n      const registered = cleanupRegistry.get(this);\n      registered?.forEach((fn) => {\n        try {\n          fn();\n        } catch (error) {\n          console.error('[Listen] cleanup failed', error);\n        }\n      });\n      cleanupRegistry.delete(this);\n    });\n  }\n\n  callbacks.add(cleanup);\n};\n\nconst resolveTarget = <THost extends ListenHost>(\n  host: THost,\n  target: ListenTargetResolver<THost> | undefined\n): EventTarget | null => {\n  if (typeof target === 'function') {\n    return target(host) ?? null;\n  }\n\n  if (target instanceof EventTarget) {\n    return target;\n  }\n\n  switch (target) {\n    case 'document':\n      return document;\n    case 'window':\n      return window;\n    case 'light':\n      return host;\n    default:\n      return host.renderRoot ?? host.shadowRoot ?? host;\n  }\n};\n\nconst normalizeOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n  selectorOrOptions: string | ListenOptions<THost, TElement, TEvent> | undefined\n): ListenOptions<THost, TElement, TEvent> => {\n  if (typeof selectorOrOptions === 'string') {\n    return { selector: selectorOrOptions };\n  }\n\n  return selectorOrOptions ?? {};\n};\n\nconst buildOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n  options: ListenOptions<THost, TElement, TEvent>\n) => {\n  return {\n    selector: options.selector ?? null,\n    target: options.target ?? 'shadow',\n    prevent: options.prevent ?? false,\n    stop: options.stop ?? false,\n    stopImmediate: options.stopImmediate ?? false,\n    once: options.once ?? false,\n    passive: options.passive,\n    capture: options.capture ?? false,\n    when: options.when ?? null\n  };\n};\n\nexport function Listen<THost extends ListenHost, TEvent extends Event = Event, TElement extends Element = Element>(\n  eventName: keyof HTMLElementEventMap | string,\n  selectorOrOptions?: string | ListenOptions<THost, TElement, TEvent>\n) {\n  if (!eventName) {\n    throw new Error('@Listen requires an event name.');\n  }\n\n  const listenConfig = buildOptions(normalizeOptions(selectorOrOptions));\n\n  return (\n    originalMethod: (this: THost, event: TEvent, matched?: TElement | null) => unknown,\n    context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n  ): void => {\n    context.addInitializer(function (this: THost) {\n      let attached = false;\n\n      const attach = () => {\n        if (attached) {\n          return;\n        }\n\n        const target = resolveTarget(this, listenConfig.target);\n\n        if (!target || typeof (target as EventTarget).addEventListener !== 'function') {\n          console.warn(`@Listen unable to resolve target for ${String(eventName)}`);\n          return;\n        }\n\n        const eventOptions: AddEventListenerOptions = {\n          capture: listenConfig.capture,\n          once: listenConfig.once,\n          passive: listenConfig.passive !== undefined ? listenConfig.passive : !listenConfig.prevent\n        };\n\n        const handler = (event: Event): void => {\n          const typedEvent = event as TEvent;\n\n          if (listenConfig.prevent) {\n            typedEvent.preventDefault();\n          }\n\n          if (listenConfig.stopImmediate) {\n            typedEvent.stopImmediatePropagation();\n          } else if (listenConfig.stop) {\n            typedEvent.stopPropagation();\n          }\n\n          let matched: TElement | null = null;\n\n          if (listenConfig.selector) {\n            const path = typedEvent.composedPath();\n            matched =\n              path.find(\n                (node): node is TElement => node instanceof Element && node.matches(listenConfig.selector as string)\n              ) ?? null;\n\n            if (!matched) {\n              return;\n            }\n          }\n\n          if (listenConfig.when && !listenConfig.when(typedEvent, matched)) {\n            return;\n          }\n\n          if (listenConfig.selector) {\n            void originalMethod.call(this, typedEvent, matched);\n          } else {\n            const targetNode = (\n              typedEvent.target instanceof Element ? (typedEvent.target as TElement) : null\n            ) as TElement | null;\n            void originalMethod.call(this, typedEvent, targetNode);\n          }\n        };\n\n        target.addEventListener(eventName as string, handler, eventOptions);\n        attached = true;\n\n        registerCleanup(this, () => {\n          target.removeEventListener(eventName as string, handler, eventOptions);\n          attached = false;\n        });\n      };\n\n      // IMPORTANT:\n      // Many components are created inside templates/shadow DOM. At construction time they are often not connected yet,\n      // and patching instance lifecycle callbacks is not reliably invoked by the platform.\n      // Attach the listener ASAP (microtask) so it works for nested components as well.\n      queueMicrotask(attach);\n\n      // Best-effort attach on connect too (idempotent).\n      addLifecycleHook(this, 'connectedCallback', attach);\n    });\n  };\n}\n","/**\n * Standard control event detail interface for Leva/lil-gui style state aggregation.\n * All control components should dispatch events with this shape.\n */\nexport interface ControlEventDetail<TValue = unknown> {\n  /** The control's name/identifier for state aggregation */\n  name?: string;\n  /** The current value of the control */\n  value: TValue;\n  /** The original DOM event that triggered this change */\n  event: Event;\n}\n\n/** The standard event type for control value changes */\nexport const CONTROL_CHANGE_EVENT = 'control-change';\n\n/**\n * Dispatch a control change event with standard shape.\n * Events bubble and are composed (cross shadow DOM boundaries).\n *\n * @param host - The element dispatching the event\n * @param type - Event type (prefer CONTROL_CHANGE_EVENT for standard controls)\n * @param detail - Event detail with value and optional name\n *\n * @example\n * ```ts\n * dispatchControlEvent(this, CONTROL_CHANGE_EVENT, {\n *   name: this.name,\n *   value: this.value,\n *   event: e\n * });\n * ```\n */\nexport const dispatchControlEvent = <THost extends HTMLElement, TValue>(\n  host: THost,\n  type: string,\n  detail: ControlEventDetail<TValue>\n): void => {\n  host.dispatchEvent(\n    new CustomEvent<ControlEventDetail<TValue>>(type, {\n      detail,\n      bubbles: true,\n      composed: true\n    })\n  );\n};\n\nexport const setBooleanAttribute = (element: Element | null | undefined, name: string, value: boolean): void => {\n  if (!element) {\n    return;\n  }\n\n  if (value) {\n    element.setAttribute(name, '');\n  } else {\n    element.removeAttribute(name);\n  }\n};\n\nexport const coerceNumber = (value: string): number | null => {\n  if (value === '') {\n    return null;\n  }\n\n  const parsed = Number(value);\n  return Number.isNaN(parsed) ? null : parsed;\n};\n\ntype ControlElement = Element & {\n  value?: unknown;\n  checked?: unknown;\n};\n\nexport const readControlValue = (element: ControlElement): string | null => {\n  if (typeof element.value === 'string' || typeof element.value === 'number') {\n    return String(element.value);\n  }\n\n  if (typeof element.checked === 'boolean') {\n    return element.checked ? 'true' : 'false';\n  }\n\n  if ('getAttribute' in element) {\n    const attr = (element as Element).getAttribute('value');\n    if (attr !== null) {\n      return attr;\n    }\n  }\n\n  return element.textContent?.trim() ?? null;\n};\n","export const HANDLE_RADIUS = 5;\nexport const POINT_RADIUS = 6;\nexport const HIT_AREA_RADIUS = 12;\n\nexport const LINEAR_HIT_THRESHOLD = 0.1;\nexport const LINEAR_PATH_SAMPLES = 40;\nexport const DRAG_ACTIVATION_DISTANCE_PX = 4;\nexport const DRAG_ACTIVATION_DISTANCE_PX_SQUARED = DRAG_ACTIVATION_DISTANCE_PX * DRAG_ACTIVATION_DISTANCE_PX;\n\nexport const DEFAULT_HANDLE_LENGTH = 0.15;\nexport const SVG_WIDTH = 400;\nexport const SVG_HEIGHT = 300;\n\nexport const GRID_SNAP_THRESHOLD = 0.05;\n\nexport const BEZIER_CONTROL_MIN_Y = -0.5;\nexport const BEZIER_CONTROL_MAX_Y = 1.5;\n\ntype EasingPresetOption = {\n  value: string;\n  label: string;\n};\n\ntype EasingPreset = {\n  label: string;\n  options: EasingPresetOption[];\n};\n\nexport const EASING_PRESETS: EasingPreset[] = [\n  {\n    label: 'Standard',\n    options: [\n      {\n        value: 'cubic-bezier(0.25, 0.1, 0.25, 1)',\n        label: 'ease'\n      },\n      {\n        value: 'cubic-bezier(0.42, 0, 1, 1)',\n        label: 'ease-in'\n      },\n      {\n        value: 'cubic-bezier(0, 0, 0.58, 1)',\n        label: 'ease-out'\n      },\n      {\n        value: 'cubic-bezier(0.42, 0, 0.58, 1)',\n        label: 'ease-in-out'\n      }\n    ]\n  },\n  {\n    label: 'Cubic',\n    options: [\n      {\n        value: 'cubic-bezier(0.55, 0.055, 0.675, 0.19)',\n        label: 'easeInCubic'\n      },\n      {\n        value: 'cubic-bezier(0.215, 0.61, 0.355, 1)',\n        label: 'easeOutCubic'\n      },\n      {\n        value: 'cubic-bezier(0.645, 0.045, 0.355, 1)',\n        label: 'easeInOutCubic'\n      }\n    ]\n  },\n  {\n    label: 'Back (overshoot)',\n    options: [\n      {\n        value: 'cubic-bezier(0.6, -0.28, 0.735, 0.045)',\n        label: 'easeInBack'\n      },\n      {\n        value: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',\n        label: 'easeOutBack'\n      },\n      {\n        value: 'cubic-bezier(0.68, -0.4, 0.32, 1.4)',\n        label: 'easeInOutBack'\n      }\n    ]\n  },\n  {\n    label: 'Spring',\n    options: [\n      {\n        value: 'linear(0, 0.6 18%, 1.1 36%, 0.94 48%, 1.02 60%, 0.98 72%, 1.01 84%, 1)',\n        label: 'springGentle'\n      },\n      {\n        value: 'linear(0, 0.8 12%, 1.2 28%, 0.88 44%, 1.08 58%, 0.96 72%, 1.02 86%, 1)',\n        label: 'springBouncy'\n      },\n      {\n        value: 'linear(0, 1.4 20%, 0.85 40%, 1.1 60%, 0.95 80%, 1)',\n        label: 'springSnappy'\n      },\n      {\n        value:\n          'linear(0, 0.03 1.1%, 0.125 2.4%, 0.906 9.8%, 1.046 12.3%, 1.11 15%, 1.116 16.3%, 1.11 17.8%, 1.014 25.8%, 0.987 31.2%, 1.001 47.2%, 1)',\n        label: 'springSnap'\n      },\n      {\n        value:\n          'linear(0, 0.012 0.9%, 0.05 2%, 0.411 9.2%, 0.517 11.8%, 0.611 14.6%, 0.694 17.7%, 0.765 21.1%, 0.824 24.8%, 0.872 28.9%, 0.91 33.4%, 0.939 38.4%, 0.977 50.9%, 0.994 68.4%, 1)',\n        label: 'springGlide'\n      },\n      {\n        value:\n          'linear(0, 0.008 1.1%, 0.034 2.3%, 0.134 4.9%, 0.264 7.3%, 0.683 14.3%, 0.797 16.5%, 0.89 18.6%, 0.967 20.7%, 1.027 22.8%, 1.073 25%, 1.104 27.3%, 1.123 30.6%, 1.119 34.3%, 1.018 49.5%, 0.988 58.6%, 0.985 65.2%, 1 84.5%, 1)',\n        label: 'springLazy'\n      }\n    ]\n  },\n  {\n    label: 'Bounce',\n    options: [\n      {\n        value: 'linear(0, 0.22 15%, 0.5 30%, 0.78 45%, 1 60%, 0.88 70%, 1 80%, 0.95 88%, 1)',\n        label: 'bounceOut'\n      },\n      {\n        value: 'linear(0, 0.05 12%, 0 24%, 0.12 36%, 0.5 50%, 0.88 64%, 1 76%, 0.95 88%, 1)',\n        label: 'bounceInOut'\n      },\n      {\n        value:\n          'linear(0, 0.008 1.1%, 0.034 2.3%, 0.134 4.9%, 0.264 7.3%, 0.683 14.3%, 0.797 16.5%, 0.89 18.6%, 0.967 20.7%, 1.027 22.8%, 1.073 25%, 1.104 27.3%, 1.123 30.6%, 1.119 34.3%, 1.018 49.5%, 0.988 58.6%, 0.985 65.2%, 1 84.5%, 1)',\n        label: 'bounceGentle'\n      },\n      {\n        value:\n          'linear(0, 0.453 7.8%, 0.803 16.1%, 1.048 24.9%, 1.132 29.5%, 1.194 34.4%, 1.227 38.4%, 1.245 42.5%, 1.25 46.9%, 1.242 51.7%, 1.2 60.5%, 1.038 84.9%, 1.009 92.5%, 1)',\n        label: 'bounceSmooth'\n      }\n    ]\n  },\n  {\n    label: 'Elastic',\n    options: [\n      {\n        value: 'linear(0, 1.3 24%, 0.85 42%, 1.1 58%, 0.95 74%, 1.02 88%, 1)',\n        label: 'elasticOut'\n      },\n      {\n        value: 'linear(0, -0.1 18%, 0.15 36%, 0.5 50%, 0.85 64%, 1.1 82%, 1)',\n        label: 'elasticInOut'\n      },\n      {\n        value:\n          'linear(0, 0.43 3.9%, 0.72 7.4%, 0.95 14.2%, 0.77 20.8%, -0.1 35.9%, -0.3 46.3%, -0.05 63.6%, 0.03 77.2%, 0)',\n        label: 'elasticBounce'\n      },\n      {\n        value:\n          'linear(0, 0.59 6.1%, 0.77 11.4%, 0.6 16.9%, -0.24 29%, -0.41 35.7%, 0.03 51.2%, 0.14 59.9%, -0.02 82.8%, 0)',\n        label: 'elasticBounceHard'\n      }\n    ]\n  },\n  {\n    label: 'Overshoot',\n    options: [\n      {\n        value: 'linear(0, 1 44.7%, 0.898 51.8%, 0.874 55.1%, 0.866 58.4%, 0.888 64.3%, 1 77.4%, 0.98 84.5%, 1)',\n        label: 'overshootSettle'\n      },\n      {\n        value:\n          'linear(0, 0.402 7.4%, 0.711 15.3%, 0.929 23.7%, 1.008 28.2%, 1.067 33%, 1.099 36.9%, 1.12 41%, 1.13 45.4%, 1.13 50.1%, 1.111 58.5%, 1.019 83.2%, 1.004 91.3%, 1)',\n        label: 'overshootSmooth'\n      },\n      {\n        value:\n          'linear(0, 0.544 5.5%, 0.947 11.5%, 1.14 18.1%, 1.23 25.5%, 1.25 31.1%, 1.23 37.6%, 1.08 61.8%, 1.03 73.7%, 1)',\n        label: 'overshootStrong'\n      },\n      {\n        value:\n          'linear(0, -0.004 8.7%, -0.019 16.8%, -0.111 41.5%, -0.13 49.9%, -0.13 54.6%, -0.12 59%, -0.099 63.1%, -0.067 67%, -0.008 71.8%, 0.071 76.3%, 0.289 84.7%, 0.598 92.6%, 1)',\n        label: 'overshootSoftIn'\n      },\n      {\n        value:\n          'linear(0, 0.402 7.4%, 0.711 15.3%, 0.929 23.7%, 1.008 28.2%, 1.067 33%, 1.099 36.9%, 1.12 41%, 1.13 45.4%, 1.13 50.1%, 1.111 58.5%, 1.019 83.2%, 1.004 91.3%, 1)',\n        label: 'overshootSoftOut'\n      },\n      {\n        value:\n          'linear(0, -0.004 4.9%, -0.02 9.4%, -0.124 26.4%, -0.126 30.5%, -0.104 34.1%, -0.027 38.8%, 0.108 43.1%, 0.299 47%, 0.817 55.2%, 0.97 59.1%, 1.071 63.4%, 1.118 67.7%, 1.127 72.6%, 1.108 77.2%, 1.019 90.7%, 1.004 95.2%, 1)',\n        label: 'overshootSoftInOut'\n      }\n    ]\n  },\n  {\n    label: 'Anticipate',\n    options: [\n      {\n        value:\n          'linear(0, -0.009 7.5%, -0.038 15.1%, -0.2 39.5%, -0.242 48.3%, -0.25 53.1%, -0.245 57.5%, -0.227 61.6%, -0.194 65.6%, -0.132 70.5%, -0.048 75.1%, 0.197 83.9%, 0.547 92.2%, 1)',\n        label: 'anticipate'\n      },\n      {\n        value:\n          'linear(0, -0.008 4.1%, -0.035 8.3%, -0.179 21.1%, -0.216 25.3%, -0.228 29.5%, -0.208 33.3%, -0.121 38.2%, 0.036 42.7%, 0.261 46.8%, 0.881 55.6%, 1.058 59.7%, 1.172 64.1%, 1.222 68.6%, 1.228 71.1%, 1.221 73.7%, 1.183 78.5%, 1.034 91.8%, 1.008 95.9%, 1)',\n        label: 'anticipateOvershoot'\n      }\n    ]\n  },\n  {\n    label: 'Expo',\n    options: [\n      {\n        value: 'cubic-bezier(0.95, 0.05, 0.795, 0.035)',\n        label: 'easeInExpo'\n      },\n      {\n        value: 'cubic-bezier(0.19, 1, 0.22, 1)',\n        label: 'easeOutExpo'\n      },\n      {\n        value: 'cubic-bezier(1, 0, 0, 1)',\n        label: 'easeInOutExpo'\n      }\n    ]\n  }\n];\n","import type { LinearPoint, Point } from './types';\n\nimport { type SVGTemplateResult, svg } from 'lit-html';\n\nimport { HANDLE_RADIUS, HIT_AREA_RADIUS, POINT_RADIUS, SVG_HEIGHT, SVG_WIDTH } from './constants';\n\nexport const generateGridLines = (gridStep: number): SVGTemplateResult[] => {\n  const lines: SVGTemplateResult[] = [];\n\n  const xSteps = Math.ceil(SVG_WIDTH / gridStep);\n  const ySteps = Math.ceil(SVG_HEIGHT / gridStep);\n\n  for (let i = 0; i <= xSteps; i++) {\n    const x = i * gridStep;\n    if (x > SVG_WIDTH) {\n      break;\n    }\n\n    lines.push(svg`\n      <line\n        class=\"grid-line\"\n        x1=${x}\n        y1=\"0\"\n        x2=${x}\n        y2=${SVG_HEIGHT}\n      />\n    `);\n  }\n\n  for (let i = 0; i <= ySteps; i++) {\n    const y = i * gridStep;\n    if (y > SVG_HEIGHT) {\n      break;\n    }\n\n    lines.push(svg`\n      <line\n        class=\"grid-line\"\n        x1=\"0\"\n        y1=${y}\n        x2=${SVG_WIDTH}\n        y2=${y}\n      />\n    `);\n  }\n\n  return lines;\n};\n\nexport const renderBezierControlPoint = (\n  point: Point,\n  anchor: Point,\n  isSelected: boolean,\n  onPointerDown: (event: PointerEvent) => void\n): SVGTemplateResult => {\n  const x = point.x * SVG_WIDTH;\n  const y = (1 - point.y) * SVG_HEIGHT;\n  const anchorX = anchor.x * SVG_WIDTH;\n  const anchorY = (1 - anchor.y) * SVG_HEIGHT;\n\n  return svg`\n    <g>\n      <line\n        class=\"control-line\"\n        x1=${anchorX}\n        y1=${anchorY}\n        x2=${x}\n        y2=${y}\n      />\n      <circle\n        class=\"control-point ${isSelected ? 'selected' : ''}\"\n        cx=${x}\n        cy=${y}\n        r=${POINT_RADIUS}\n        @pointerdown=${onPointerDown}\n      />\n      <circle\n        class=\"hit-area-point\"\n        cx=${x}\n        cy=${y}\n        r=${HIT_AREA_RADIUS}\n        @pointerdown=${onPointerDown}\n      />\n    </g>\n  `;\n};\n\nexport const renderLinearPoint = (\n  point: LinearPoint,\n  index: number,\n  isSelected: boolean,\n  isFocused: boolean,\n  onPointerDown: (event: PointerEvent) => void,\n  onHandlePointerDown?: (event: PointerEvent, handleType: 'in' | 'out') => void\n): SVGTemplateResult => {\n  const x = point.x * SVG_WIDTH;\n  const y = (1 - point.y) * SVG_HEIGHT;\n\n  const handles: SVGTemplateResult[] = [];\n\n  if (point.cpInX !== undefined && point.cpInY !== undefined) {\n    const handleX = x + point.cpInX * SVG_WIDTH;\n    const handleY = y - point.cpInY * SVG_HEIGHT;\n\n    handles.push(svg`\n      <g>\n        <line\n          class=\"linear-handle-line\"\n          x1=${x}\n          y1=${y}\n          x2=${handleX}\n          y2=${handleY}\n        />\n        <circle\n          class=\"linear-handle ${isSelected ? 'selected' : ''}\"\n          cx=${handleX}\n          cy=${handleY}\n          r=${HANDLE_RADIUS}\n          @pointerdown=${(e: PointerEvent) => onHandlePointerDown?.(e, 'in')}\n        />\n        <circle\n          class=\"hit-area-handle\"\n          cx=${handleX}\n          cy=${handleY}\n          r=${HIT_AREA_RADIUS}\n          @pointerdown=${(e: PointerEvent) => onHandlePointerDown?.(e, 'in')}\n        />\n      </g>\n    `);\n  }\n\n  if (point.cpOutX !== undefined && point.cpOutY !== undefined) {\n    const handleX = x + point.cpOutX * SVG_WIDTH;\n    const handleY = y - point.cpOutY * SVG_HEIGHT;\n\n    handles.push(svg`\n      <g>\n        <line\n          class=\"linear-handle-line\"\n          x1=${x}\n          y1=${y}\n          x2=${handleX}\n          y2=${handleY}\n        />\n        <circle\n          class=\"linear-handle ${isSelected ? 'selected' : ''}\"\n          cx=${handleX}\n          cy=${handleY}\n          r=${HANDLE_RADIUS}\n          @pointerdown=${(e: PointerEvent) => onHandlePointerDown?.(e, 'out')}\n        />\n        <circle\n          class=\"hit-area-handle\"\n          cx=${handleX}\n          cy=${handleY}\n          r=${HIT_AREA_RADIUS}\n          @pointerdown=${(e: PointerEvent) => onHandlePointerDown?.(e, 'out')}\n        />\n      </g>\n    `);\n  }\n\n  return svg`\n    <g>\n      ${handles}\n      <circle\n        class=\"linear-point ${isSelected ? 'selected' : ''} ${isFocused ? 'focused' : ''}\"\n        cx=${x}\n        cy=${y}\n        r=${POINT_RADIUS}\n        tabindex=${isFocused ? '0' : '-1'}\n        role=\"slider\"\n        aria-label=\"Linear point ${index + 1}\"\n        aria-valuenow=${point.x}\n        aria-valuemin=\"0\"\n        aria-valuemax=\"1\"\n        @pointerdown=${onPointerDown}\n      />\n      <circle\n        class=\"hit-area-point\"\n        cx=${x}\n        cy=${y}\n        r=${HIT_AREA_RADIUS}\n        @pointerdown=${onPointerDown}\n      />\n    </g>\n  `;\n};\n\nexport const toSvgCoords = (point: Point): Point => {\n  return {\n    x: point.x * SVG_WIDTH,\n    y: (1 - point.y) * SVG_HEIGHT\n  };\n};\n\nexport const fromSvgCoords = (x: number, y: number): Point => {\n  return {\n    x: x / SVG_WIDTH,\n    y: 1 - y / SVG_HEIGHT\n  };\n};\n\nexport const getSvgBounds = (svg: SVGSVGElement): DOMRect => svg.getBoundingClientRect();\n\nexport const clientToSvgCoords = (clientX: number, clientY: number, svgBounds: DOMRect): Point => {\n  const x = ((clientX - svgBounds.left) / svgBounds.width) * SVG_WIDTH;\n  const y = ((clientY - svgBounds.top) / svgBounds.height) * SVG_HEIGHT;\n\n  return { x, y };\n};\n","import { html, type SVGTemplateResult, svg } from 'lit-html';\n\nimport {\n  BEZIER_CONTROL_MAX_Y,\n  BEZIER_CONTROL_MIN_Y,\n  DEFAULT_HANDLE_LENGTH,\n  DRAG_ACTIVATION_DISTANCE_PX_SQUARED,\n  HIT_AREA_RADIUS,\n  LINEAR_HIT_THRESHOLD,\n  LINEAR_PATH_SAMPLES,\n  SVG_HEIGHT,\n  SVG_WIDTH\n} from './constants';\nimport { canvasStyles } from './styles';\nimport { generateGridLines } from './svg-renderer';\nimport {\n  type CubicBezierPoints,\n  EasingType,\n  type LinearPoint,\n  type LinearPoints,\n  MAX_LINEAR_POINTS,\n  type Point\n} from './types';\nimport {\n  clampPoint,\n  cloneLinearPoint,\n  cubicBezierPath,\n  ensureLinearPointId,\n  getLinearApproximation,\n  linearDisplayPath,\n  MIN_LINEAR_DELTA,\n  normalizeLinearPoints,\n  normalizeVector,\n  vectorLength\n} from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\nimport { type ControlEventDetail, dispatchControlEvent } from '~/elements/shared';\n\ntype CurveHost = HTMLElement & {\n  name?: string;\n  points: CubicBezierPoints | LinearPoints;\n  handlePointsChange?: (event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>) => void;\n};\n\ntype LinearInsertPreview = {\n  path: string;\n  normalizedPoints: LinearPoints;\n  insertedIndex: number;\n  insertedPoint: LinearPoint;\n};\n\n@Component({\n  tag: 'ease-curve-canvas',\n  styles: canvasStyles,\n  template(this: CurveCanvas) {\n    const hoverPreviewPath = this.getHoverCurvePath();\n    const controlElements = this.getControlElements();\n    const hoverInsertElements = this.getHoverInsertElements();\n    const curvePath = this.getCurvePath();\n\n    return html`\n      <svg\n        viewBox=\"0 0 ${SVG_WIDTH} ${SVG_HEIGHT}\"\n        width=\"${SVG_WIDTH}\"\n        height=\"${SVG_HEIGHT}\"\n        @pointerdown=${this.handlePointerDown}\n        @pointermove=${this.handlePointerMove}\n        @pointerup=${this.handlePointerUp}\n        @pointerleave=${this.handlePointerLeave}\n        @pointercancel=${this.handlePointerLeave}\n      >\n        ${this.showGrid ? svg`<g style=\"view-transition-name: grid-lines\">${this.getGridLines()}</g>` : null}\n        ${hoverPreviewPath ? html`<path class=\"curve-path curve-path--preview\" d=${hoverPreviewPath}></path>` : null}\n        <path class=\"curve-path\" d=${curvePath} />\n        ${controlElements}\n        ${hoverInsertElements}\n      </svg>\n    `;\n  }\n})\nexport class CurveCanvas extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<EasingType>({ reflect: true })\n  accessor easingType!: EasingType;\n\n  @Prop<CubicBezierPoints | LinearPoints>({ type: Object, reflect: false })\n  accessor points!: CubicBezierPoints | LinearPoints;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: true })\n  accessor showGrid!: boolean;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n  accessor snapToGrid!: boolean;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 8 })\n  accessor gridSize: number = 8;\n\n  @Prop<number | null>({ type: Number, reflect: false, defaultValue: null })\n  accessor focusedLinearIndex: number | null = null;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 0 })\n  accessor simplify: number = 0;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 5 })\n  accessor round: number = 5;\n\n  @Query<SVGSVGElement>('svg')\n  accessor svgElement!: SVGSVGElement | null;\n\n  #isDragging = false;\n  #dragIndex: number | null = null;\n  #dragMode: 'point' | 'handleIn' | 'handleOut' | null = null;\n  #hoverPoint: Point | null = null;\n  #hoverInsertPreview: LinearInsertPreview | null = null;\n  #dragStartPoints: Map<string, LinearPoint> | null = null;\n  #dragPointId: string | null = null;\n  #pendingDrag: { mode: 'point' | 'handleIn' | 'handleOut'; index: number; startX: number; startY: number } | null =\n    null;\n\n  #getEventTarget = (): CurveHost => {\n    const root = this.getRootNode();\n    if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n      return root.host as CurveHost;\n    }\n    return this as CurveHost;\n  };\n\n  #renderCubicBezier = (): SVGTemplateResult[] => {\n    const points = this.#getCubicBezierPoints();\n\n    if (!points) {\n      console.warn('Invalid cubic-bezier points for rendering:', this.points);\n      return [];\n    }\n\n    try {\n      const anchorStart = this.#toSvgCoords({ x: 0, y: 0 });\n      const anchorEnd = this.#toSvgCoords({ x: 1, y: 1 });\n      const controlOne = this.#toSvgCoords(points.p1);\n      const controlTwo = this.#toSvgCoords(points.p2);\n\n      const elements: SVGTemplateResult[] = [];\n\n      const handlePathOne = this.#createHandlePath(anchorStart, controlOne);\n      const handlePathTwo = this.#createHandlePath(anchorEnd, controlTwo);\n\n      elements.push(svg`<circle\n        class=\"hit-area-point\"\n        cx=\"${controlOne.x}\"\n        cy=\"${controlOne.y}\"\n        r=\"${HIT_AREA_RADIUS}\"\n        data-index=\"0\"\n        data-role=\"point\"\n      />`);\n      elements.push(svg`<circle\n        class=\"hit-area-point\"\n        cx=\"${controlTwo.x}\"\n        cy=\"${controlTwo.y}\"\n        r=\"${HIT_AREA_RADIUS}\"\n        data-index=\"1\"\n        data-role=\"point\"\n      />`);\n\n      if (handlePathOne) {\n        elements.push(svg`<path\n          class=\"control-point ${this.#dragIndex === 0 && this.#dragMode === 'point' ? 'selected' : ''}\"\n          d=\"${handlePathOne}\"\n          data-index=\"0\"\n          data-role=\"point\"\n        />`);\n      }\n\n      if (handlePathTwo) {\n        elements.push(svg`<path\n          class=\"control-point ${this.#dragIndex === 1 && this.#dragMode === 'point' ? 'selected' : ''}\"\n          d=\"${handlePathTwo}\"\n          data-index=\"1\"\n          data-role=\"point\"\n        />`);\n      }\n\n      elements.push(svg`<circle class=\"anchor-point-start\" cx=\"${anchorStart.x}\" cy=\"${anchorStart.y}\" />`);\n      elements.push(svg`<circle class=\"anchor-point-start\" cx=\"${anchorEnd.x}\" cy=\"${anchorEnd.y}\" />`);\n\n      return elements;\n    } catch (error) {\n      console.error('Error rendering cubic-bezier elements:', error);\n      return [];\n    }\n  };\n\n  #toSvgCoords = (p: Point) => {\n    return {\n      x: p.x * SVG_WIDTH,\n      y: (1 - p.y) * SVG_HEIGHT\n    };\n  };\n\n  #renderLinear = (): SVGTemplateResult[] => {\n    const points = this.#getLinearPoints();\n\n    if (!points) {\n      return [];\n    }\n\n    try {\n      const elements: SVGTemplateResult[] = [];\n      const focusedIndex = this.focusedLinearIndex;\n\n      points.forEach((point, index) => {\n        if (!point) {\n          return;\n        }\n\n        const isPointFocused = focusedIndex === index;\n        const isDraggingPoint = this.#isDragging && this.#dragIndex === index;\n\n        if (!isPointFocused && !isDraggingPoint) {\n          return;\n        }\n\n        const anchorSvg = this.#toSvgCoords(point);\n\n        if (index > 0 && (point.cpInX !== undefined || point.cpInY !== undefined)) {\n          this.#renderLinearHandle(elements, point, anchorSvg, index, 'In');\n        }\n\n        if (index < points.length - 1 && (point.cpOutX !== undefined || point.cpOutY !== undefined)) {\n          this.#renderLinearHandle(elements, point, anchorSvg, index, 'Out');\n        }\n      });\n\n      points.forEach((point, index) => {\n        if (!point) {\n          return;\n        }\n\n        const isPointFocused = focusedIndex === index;\n        const isPointActive = (this.#dragMode === 'point' && this.#dragIndex === index) || isPointFocused;\n\n        const anchorSvg = this.#toSvgCoords(point);\n\n        elements.push(svg`<circle\n          class=\"hit-area-point\"\n          cx=\"${anchorSvg.x}\"\n          cy=\"${anchorSvg.y}\"\n          r=\"${HIT_AREA_RADIUS}\"\n          data-index=\"${index}\"\n          data-role=\"point\"\n        />`);\n        elements.push(svg`<circle\n          class=\"linear-point ${isPointActive ? 'selected' : ''}\"\n          cx=\"${anchorSvg.x}\"\n          cy=\"${anchorSvg.y}\"\n          data-index=\"${index}\"\n          data-role=\"point\"\n          title=\"Point P${index + 1}: ${Math.round(point.x * 100)}%, ${Math.round(point.y * 100)}%\"\n        />`);\n      });\n\n      return elements;\n    } catch (error) {\n      console.error('Error rendering linear points:', error);\n      return [];\n    }\n  };\n\n  #renderLinearHandle(\n    elements: SVGTemplateResult[],\n    point: LinearPoint,\n    anchorSvg: Point,\n    index: number,\n    direction: 'In' | 'Out'\n  ): void {\n    const dx = direction === 'In' ? (point.cpInX ?? 0) : (point.cpOutX ?? 0);\n    const dy = direction === 'In' ? (point.cpInY ?? 0) : (point.cpOutY ?? 0);\n\n    const handlePos = { x: point.x + dx, y: point.y + dy };\n    const handleSvg = this.#toSvgCoords(handlePos);\n    const role = direction === 'In' ? 'handleIn' : 'handleOut';\n    const dragMode = direction === 'In' ? 'handleIn' : 'handleOut';\n\n    const isHandleActive = this.#dragMode === dragMode && this.#dragIndex === index;\n\n    const handlePath = this.#createHandlePath(anchorSvg, handleSvg);\n\n    if (!handlePath) {\n      return;\n    }\n\n    elements.push(svg`<circle\n        class=\"hit-area-handle\"\n        cx=\"${handleSvg.x}\"\n        cy=\"${handleSvg.y}\"\n        r=\"${HIT_AREA_RADIUS}\"\n        data-index=\"${index}\"\n        data-role=\"${role}\"\n    />`);\n\n    elements.push(svg`<path\n        class=\"linear-handle ${isHandleActive ? 'selected' : ''}\"\n        d=\"${handlePath}\"\n        data-index=\"${index}\"\n        data-role=\"${role}\"\n        title=\"Handle ${direction}: ${Math.round(handlePos.x * 100)}%, ${Math.round(handlePos.y * 100)}%\"\n    />`);\n  }\n\n  #getCurvePath = (): string => {\n    try {\n      if (this.easingType === EasingType.CUBIC_BEZIER) {\n        const points = this.#getCubicBezierPoints();\n\n        if (!points) {\n          console.warn('Invalid cubic-bezier points:', this.points);\n          return '';\n        }\n\n        return cubicBezierPath(points);\n      }\n\n      const points = this.#getLinearPoints();\n\n      if (!points || points.length < 2) {\n        return '';\n      }\n\n      if (this.simplify > 0) {\n        const approxPoints = getLinearApproximation(points, {\n          simplify: this.simplify,\n          round: this.round\n        });\n        return linearDisplayPath(approxPoints as LinearPoints);\n      }\n\n      return linearDisplayPath(points);\n    } catch (error) {\n      console.error('Error generating curve path:', error);\n      return '';\n    }\n  };\n\n  #getHoverCurvePath = (): string => {\n    if (this.#isDragging) {\n      return '';\n    }\n\n    try {\n      if (this.easingType === EasingType.CUBIC_BEZIER) {\n        const hoverPoint = this.#hoverPoint;\n        if (!hoverPoint) {\n          return '';\n        }\n\n        const points = this.#getCubicBezierPoints();\n        if (!points) {\n          return '';\n        }\n\n        return cubicBezierPath({\n          p1: hoverPoint,\n          p2: points.p2\n        });\n      }\n\n      if (this.easingType === EasingType.LINEAR) {\n        return this.#hoverInsertPreview?.path ?? '';\n      }\n\n      return '';\n    } catch (error) {\n      console.error('Error generating hover curve path:', error);\n      return '';\n    }\n  };\n\n  getHoverInsertElements(): SVGTemplateResult | null {\n    if (this.easingType !== EasingType.LINEAR) {\n      return null;\n    }\n\n    const preview = this.#hoverInsertPreview;\n    if (!preview || !preview.insertedPoint) {\n      return null;\n    }\n\n    const point = preview.insertedPoint;\n    const anchor = this.#toSvgCoords(point);\n    const elements: SVGTemplateResult[] = [];\n\n    if (point.cpInX !== undefined || point.cpInY !== undefined) {\n      const handlePoint = this.#toSvgCoords({\n        x: point.x + (point.cpInX ?? 0),\n        y: point.y + (point.cpInY ?? 0)\n      });\n      const handlePath = this.#createHandlePath(anchor, handlePoint);\n      if (handlePath) {\n        elements.push(\n          svg`<path\n            class=\"linear-handle linear-handle--preview\"\n            d=\"${handlePath}\"\n          />`\n        );\n      }\n    }\n\n    if (point.cpOutX !== undefined || point.cpOutY !== undefined) {\n      const handlePoint = this.#toSvgCoords({\n        x: point.x + (point.cpOutX ?? 0),\n        y: point.y + (point.cpOutY ?? 0)\n      });\n      const handlePath = this.#createHandlePath(anchor, handlePoint);\n      if (handlePath) {\n        elements.push(\n          svg`<path\n            class=\"linear-handle linear-handle--preview\"\n            d=\"${handlePath}\"\n          />`\n        );\n      }\n    }\n\n    elements.push(svg`<circle class=\"linear-point linear-point--preview\" cx=\"${anchor.x}\" cy=\"${anchor.y}\" />`);\n\n    return svg`<g class=\"linear-preview-group\" pointer-events=\"none\">${elements}</g>`;\n  }\n\n  #createHandlePath(anchorSvg: Point, handleSvg: Point): string | null {\n    const vecX = handleSvg.x - anchorSvg.x;\n    const vecY = handleSvg.y - anchorSvg.y;\n    const length = Math.sqrt(vecX * vecX + vecY * vecY);\n\n    const circleRadius = 4.5;\n    const barHalfHeight = 0.66;\n\n    if (length < circleRadius + 2) {\n      return null;\n    }\n\n    const dirX = vecX / length;\n    const dirY = vecY / length;\n    const perpX = -dirY;\n    const perpY = dirX;\n\n    const cx = handleSvg.x;\n    const cy = handleSvg.y;\n\n    const transitionZone = Math.min(8, (length - circleRadius) * 0.5);\n\n    const barEndDist = length - circleRadius - transitionZone;\n\n    const barTopStartX = anchorSvg.x + perpX * barHalfHeight;\n    const barTopStartY = anchorSvg.y + perpY * barHalfHeight;\n    const barBottomStartX = anchorSvg.x - perpX * barHalfHeight;\n    const barBottomStartY = anchorSvg.y - perpY * barHalfHeight;\n\n    const barTopEndX = anchorSvg.x + dirX * barEndDist + perpX * barHalfHeight;\n    const barTopEndY = anchorSvg.y + dirY * barEndDist + perpY * barHalfHeight;\n    const barBottomEndX = anchorSvg.x + dirX * barEndDist - perpX * barHalfHeight;\n    const barBottomEndY = anchorSvg.y + dirY * barEndDist - perpY * barHalfHeight;\n\n    const circleTopX = cx + perpX * circleRadius;\n    const circleTopY = cy + perpY * circleRadius;\n    const circleBottomX = cx - perpX * circleRadius;\n    const circleBottomY = cy - perpY * circleRadius;\n\n    const ctrl1Dist = transitionZone * 0.35;\n    const ctrl2Dist = transitionZone * 0.65;\n\n    const ctrl1TopX = barTopEndX + dirX * ctrl1Dist;\n    const ctrl1TopY = barTopEndY + dirY * ctrl1Dist;\n    const ctrl2TopX = circleTopX - dirX * ctrl2Dist;\n    const ctrl2TopY = circleTopY - dirY * ctrl2Dist;\n\n    const ctrl1BottomX = barBottomEndX + dirX * ctrl1Dist;\n    const ctrl1BottomY = barBottomEndY + dirY * ctrl1Dist;\n    const ctrl2BottomX = circleBottomX - dirX * ctrl2Dist;\n    const ctrl2BottomY = circleBottomY - dirY * ctrl2Dist;\n\n    return `\n      M ${circleBottomX} ${circleBottomY}\n      C ${ctrl2BottomX} ${ctrl2BottomY} ${ctrl1BottomX} ${ctrl1BottomY} ${barBottomEndX} ${barBottomEndY}\n      L ${barBottomStartX} ${barBottomStartY}\n      A ${barHalfHeight} ${barHalfHeight} 0 0 0 ${barTopStartX} ${barTopStartY}\n      L ${barTopEndX} ${barTopEndY}\n      C ${ctrl1TopX} ${ctrl1TopY} ${ctrl2TopX} ${ctrl2TopY} ${circleTopX} ${circleTopY}\n      A ${circleRadius} ${circleRadius} 0 1 0 ${circleBottomX} ${circleBottomY}\n      Z\n    `;\n  }\n\n  #getCubicBezierPoints = (): CubicBezierPoints | null => {\n    if (Array.isArray(this.points)) {\n      return null;\n    }\n\n    return this.points ?? null;\n  };\n\n  #getLinearPoints = (): LinearPoints | null => {\n    if (!Array.isArray(this.points)) {\n      return null;\n    }\n\n    this.#ensureLinearPointIds(this.points);\n    return this.points;\n  };\n\n  #ensureLinearPointIds = (points: LinearPoints | null): void => {\n    if (!points) {\n      return;\n    }\n\n    for (const point of points) {\n      if (!point) {\n        continue;\n      }\n      ensureLinearPointId(point);\n    }\n  };\n\n  #createLinearStartPointMap = (points: LinearPoints | null): Map<string, LinearPoint> | null => {\n    if (!points) {\n      return null;\n    }\n\n    const map = new Map<string, LinearPoint>();\n\n    for (const point of points) {\n      if (!point) {\n        continue;\n      }\n      const id = ensureLinearPointId(point);\n      map.set(id, cloneLinearPoint(point));\n    }\n\n    return map;\n  };\n\n  #getDistanceToLinearPath(point: Point, points: LinearPoints): number {\n    if (points.length < 2) {\n      return Number.POSITIVE_INFINITY;\n    }\n\n    let minDistanceSquared = Number.POSITIVE_INFINITY;\n\n    for (let index = 0; index < points.length - 1; index += 1) {\n      const start = points[index];\n      const end = points[index + 1];\n\n      if (!start || !end) {\n        continue;\n      }\n\n      const cp1 = {\n        x: start.x + (start.cpOutX ?? 0),\n        y: start.y + (start.cpOutY ?? 0)\n      };\n\n      const cp2 = {\n        x: end.x + (end.cpInX ?? 0),\n        y: end.y + (end.cpInY ?? 0)\n      };\n\n      for (let sample = 0; sample <= LINEAR_PATH_SAMPLES; sample += 1) {\n        const t = sample / LINEAR_PATH_SAMPLES;\n        const samplePoint = evaluateCubicPointNormalized(t, start, cp1, cp2, end);\n        const dx = point.x - samplePoint.x;\n        const dy = point.y - samplePoint.y;\n        const distanceSquared = dx * dx + dy * dy;\n        if (distanceSquared < minDistanceSquared) {\n          minDistanceSquared = distanceSquared;\n        }\n      }\n    }\n\n    return Math.sqrt(minDistanceSquared);\n  }\n\n  #isPointNearLinearPath(point: Point, points: LinearPoints): boolean {\n    const distance = this.#getDistanceToLinearPath(point, points);\n    return distance <= LINEAR_HIT_THRESHOLD;\n  }\n\n  #isNearExistingPointOrHandle(position: Point, points: LinearPoints): boolean {\n    const mouseSvg = this.#toSvgCoords(position);\n    const thresholdSquared = HIT_AREA_RADIUS * HIT_AREA_RADIUS;\n\n    for (const point of points) {\n      if (!point) {\n        continue;\n      }\n\n      const pointSvg = this.#toSvgCoords(point);\n      const dx = pointSvg.x - mouseSvg.x;\n      const dy = pointSvg.y - mouseSvg.y;\n\n      if (dx * dx + dy * dy < thresholdSquared) {\n        return true;\n      }\n\n      if (point.cpInX !== undefined || point.cpInY !== undefined) {\n        const handleIn = {\n          x: point.x + (point.cpInX ?? 0),\n          y: point.y + (point.cpInY ?? 0)\n        };\n        const handleInSvg = this.#toSvgCoords(handleIn);\n        const hdx = handleInSvg.x - mouseSvg.x;\n        const hdy = handleInSvg.y - mouseSvg.y;\n\n        if (hdx * hdx + hdy * hdy < thresholdSquared) {\n          return true;\n        }\n      }\n\n      if (point.cpOutX !== undefined || point.cpOutY !== undefined) {\n        const handleOut = {\n          x: point.x + (point.cpOutX ?? 0),\n          y: point.y + (point.cpOutY ?? 0)\n        };\n        const handleOutSvg = this.#toSvgCoords(handleOut);\n        const hdx = handleOutSvg.x - mouseSvg.x;\n        const hdy = handleOutSvg.y - mouseSvg.y;\n\n        if (hdx * hdx + hdy * hdy < thresholdSquared) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  #getMousePosition = (event: PointerEvent, options?: { skipSnap?: boolean }): Point => {\n    const svgElement = this.svgElement;\n\n    if (!svgElement) {\n      return { x: 0, y: 0 };\n    }\n\n    const rect = svgElement.getBoundingClientRect();\n    const svgX = event.clientX - rect.left;\n    const svgY = event.clientY - rect.top;\n\n    let x = svgX / rect.width;\n    let y = 1 - svgY / rect.height;\n\n    const skipSnap = options?.skipSnap ?? false;\n\n    const shouldSnap =\n      !skipSnap &&\n      this.snapToGrid &&\n      !(this.#isDragging && (this.#dragMode === 'handleIn' || this.#dragMode === 'handleOut'));\n\n    if (shouldSnap) {\n      const ratioX = SVG_WIDTH / this.gridSize;\n      const ratioY = SVG_HEIGHT / this.gridSize;\n      x = Math.round(x * ratioX) / ratioX;\n      y = Math.round(y * ratioY) / ratioY;\n    }\n\n    const bezierBounds =\n      this.easingType === EasingType.CUBIC_BEZIER\n        ? { minY: BEZIER_CONTROL_MIN_Y, maxY: BEZIER_CONTROL_MAX_Y }\n        : undefined;\n\n    return clampPoint({ x, y }, bezierBounds);\n  };\n\n  #constrainLinearPoint = (index: number, position: Point, points: LinearPoints): LinearPoint => {\n    let x = position.x;\n\n    if (index === 0) {\n      x = 0;\n    } else if (index === points.length - 1) {\n      x = 1;\n    } else {\n      x = Math.min(Math.max(x, MIN_LINEAR_DELTA), 1 - MIN_LINEAR_DELTA);\n    }\n\n    const clamped = clampPoint({ x, y: position.y }, { minY: -2, maxY: 3 });\n    const sourcePoint = points[index];\n\n    return {\n      ...sourcePoint,\n      x: clamped.x,\n      y: clamped.y\n    };\n  };\n\n  #emitPoints = (value: CubicBezierPoints | LinearPoints, event: Event): void => {\n    const target = this.#getEventTarget();\n    const detail: ControlEventDetail<CubicBezierPoints | LinearPoints> = { name: target.name, value, event };\n\n    dispatchControlEvent(target, 'points-change', detail);\n  };\n\n  #notifyLinearFocus = (index: number | null, event: Event): void => {\n    if (this.easingType !== EasingType.LINEAR) {\n      return;\n    }\n    const target = this.#getEventTarget();\n    const detail: ControlEventDetail<number | null> = { name: target.name, value: index, event };\n    dispatchControlEvent(target, 'linear-point-focus', detail);\n  };\n\n  #toggleLinearHandleLinking = (index: number, event: Event): void => {\n    const points = this.#getLinearPoints();\n    if (!points || index < 0 || index >= points.length) {\n      return;\n    }\n\n    const point = points[index];\n    if (!point) {\n      return;\n    }\n\n    const updatedPoints = [...points];\n    const updatedPoint = { ...point };\n    updatedPoints[index] = updatedPoint;\n\n    const newLinkingState = !updatedPoint.isLinked;\n    updatedPoint.isLinked = newLinkingState;\n    updatedPoint.mirrorLength = Boolean(newLinkingState);\n\n    if (newLinkingState) {\n      this.#ensureLinkedHandles(updatedPoint, index, points);\n    }\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.points = normalizedPoints;\n    this.#emitPoints(normalizedPoints, event);\n    this.#notifyLinearFocus(index, event);\n    this.requestRender();\n  };\n\n  #ensureLinkedHandles(point: LinearPoint, index: number, points: LinearPoints): void {\n    const prev = points[index - 1];\n    const next = points[index + 1];\n\n    let refDx = point.cpOutX ?? -(point.cpInX ?? 0);\n    let refDy = point.cpOutY ?? -(point.cpInY ?? 0);\n\n    if (refDx === 0 && refDy === 0) {\n      let dirX = 0;\n      let dirY = 0;\n\n      if (prev && next) {\n        dirX = next.x - prev.x;\n        dirY = next.y - prev.y;\n      } else if (next) {\n        dirX = next.x - point.x;\n        dirY = next.y - point.y;\n      } else if (prev) {\n        dirX = point.x - prev.x;\n        dirY = point.y - prev.y;\n      } else {\n        dirX = 1;\n        dirY = 0;\n      }\n\n      const direction = normalizeVector(dirX, dirY);\n      const length = DEFAULT_HANDLE_LENGTH;\n\n      point.cpInX = -direction.dx * length;\n      point.cpInY = -direction.dy * length;\n      point.cpOutX = direction.dx * length;\n      point.cpOutY = direction.dy * length;\n      refDx = point.cpOutX;\n      refDy = point.cpOutY;\n    }\n\n    if (refDx === 0 && refDy === 0) {\n      return;\n    }\n\n    const normalized = normalizeVector(refDx, refDy);\n    const referenceLength = vectorLength(refDx, refDy) || DEFAULT_HANDLE_LENGTH;\n\n    const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0) || referenceLength;\n    point.cpInX = -normalized.dx * inLength;\n    point.cpInY = -normalized.dy * inLength;\n\n    const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0) || referenceLength;\n    point.cpOutX = normalized.dx * outLength;\n    point.cpOutY = normalized.dy * outLength;\n\n    if (point.mirrorLength !== false) {\n      this.#alignLinkedHandleLengths(point);\n    }\n  }\n\n  #alignLinkedHandleLengths(point: LinearPoint): void {\n    if (!point.isLinked) {\n      point.mirrorLength = false;\n      return;\n    }\n\n    const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0);\n    const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0);\n    const targetLength = Math.max(outLength, inLength);\n\n    if (targetLength <= 0) {\n      return;\n    }\n\n    if (outLength > 0) {\n      const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n      point.cpOutX = outDirection.dx * targetLength;\n      point.cpOutY = outDirection.dy * targetLength;\n    } else if (inLength > 0) {\n      const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n      point.cpOutX = -inDirection.dx * targetLength;\n      point.cpOutY = -inDirection.dy * targetLength;\n    }\n\n    if (inLength > 0) {\n      const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n      point.cpInX = inDirection.dx * targetLength;\n      point.cpInY = inDirection.dy * targetLength;\n    } else if (outLength > 0) {\n      const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n      point.cpInX = -outDirection.dx * targetLength;\n      point.cpInY = -outDirection.dy * targetLength;\n    }\n  }\n\n  getGridLines(): SVGTemplateResult[] {\n    return generateGridLines(this.gridSize);\n  }\n\n  getControlElements(): SVGTemplateResult[] {\n    return this.easingType === EasingType.CUBIC_BEZIER ? this.#renderCubicBezier() : this.#renderLinear();\n  }\n\n  getCurvePath(): string {\n    return this.#getCurvePath();\n  }\n\n  getHoverCurvePath(): string {\n    return this.#getHoverCurvePath();\n  }\n\n  readonly handlePointerDown = (event: PointerEvent): void => {\n    event.preventDefault();\n    let linearPoints = this.easingType === EasingType.LINEAR ? this.#getLinearPoints() : null;\n    this.#dragStartPoints = this.#createLinearStartPointMap(linearPoints);\n    this.#pendingDrag = null;\n    this.#dragPointId = null;\n\n    const target = event.target;\n\n    if (!(target instanceof SVGElement)) {\n      return;\n    }\n\n    const role = target.getAttribute('data-role');\n    const indexAttribute = target.getAttribute('data-index');\n\n    if (indexAttribute !== null) {\n      const index = Number.parseInt(indexAttribute, 10);\n      if (Number.isNaN(index)) {\n        return;\n      }\n\n      if (this.easingType === EasingType.LINEAR) {\n        if (role === 'handleIn' || role === 'handleOut') {\n          const point = linearPoints?.[index];\n          if (point) {\n            this.#dragPointId = ensureLinearPointId(point);\n          }\n          this.svgElement?.setPointerCapture(event.pointerId);\n          this.#isDragging = true;\n          this.#dragMode = role;\n          this.#dragIndex = index;\n          this.#pendingDrag = null;\n          this.#hoverPoint = null;\n          this.#notifyLinearFocus(index, event);\n          this.handlePointerMove(event);\n          this.requestRender();\n          return;\n        }\n\n        if (role === 'point') {\n          if (event.detail === 2) {\n            this.#toggleLinearHandleLinking(index, event);\n            return;\n          }\n\n          const point = linearPoints?.[index];\n          if (point) {\n            this.#dragPointId = ensureLinearPointId(point);\n          }\n          this.#notifyLinearFocus(index, event);\n          this.svgElement?.setPointerCapture(event.pointerId);\n          this.#isDragging = false;\n          this.#dragMode = 'point';\n          this.#dragIndex = index;\n          this.#pendingDrag = {\n            mode: 'point',\n            index,\n            startX: event.clientX,\n            startY: event.clientY\n          };\n          this.#hoverPoint = null;\n          this.requestRender();\n          return;\n        }\n      }\n\n      if (this.easingType === EasingType.CUBIC_BEZIER && role === 'point') {\n        this.svgElement?.setPointerCapture(event.pointerId);\n        this.#isDragging = true;\n        this.#dragMode = 'point';\n        this.#dragIndex = index;\n        this.#hoverPoint = null;\n        this.requestRender();\n        return;\n      }\n    }\n\n    if (indexAttribute === null) {\n      if (this.easingType === EasingType.LINEAR) {\n        const insertResult = this.#insertLinearPoint(this.#getMousePosition(event), event);\n\n        if (insertResult) {\n          linearPoints = this.#getLinearPoints();\n          this.#dragStartPoints = this.#createLinearStartPointMap(linearPoints);\n          this.#dragPointId = insertResult.pointId;\n          this.svgElement?.setPointerCapture(event.pointerId);\n          this.#isDragging = true;\n          this.#dragMode = 'point';\n          this.#dragIndex = insertResult.index;\n          this.#pendingDrag = null;\n          this.#hoverPoint = null;\n          this.#notifyLinearFocus(insertResult.index, event);\n          this.requestRender();\n          return;\n        } else {\n          this.#notifyLinearFocus(null, event);\n        }\n      }\n\n      if (this.easingType === EasingType.CUBIC_BEZIER) {\n        this.#hoverPoint = this.#getMousePosition(event);\n        this.svgElement?.setPointerCapture(event.pointerId);\n        this.#isDragging = true;\n        this.#dragMode = 'point';\n        this.#dragIndex = 0;\n        this.#pendingDrag = null;\n        this.handlePointerMove(event);\n        this.requestRender();\n        return;\n      }\n    }\n  };\n\n  readonly handlePointerMove = (event: PointerEvent): void => {\n    if (!this.svgElement) {\n      return;\n    }\n\n    const skipSnapForPending = !this.#isDragging && this.#pendingDrag !== null && this.#pendingDrag.mode === 'point';\n    let position = this.#getMousePosition(event, { skipSnap: skipSnapForPending });\n\n    if (this.#pendingDrag && !this.#isDragging) {\n      const deltaX = event.clientX - this.#pendingDrag.startX;\n      const deltaY = event.clientY - this.#pendingDrag.startY;\n      const distanceSquared = deltaX * deltaX + deltaY * deltaY;\n\n      if (distanceSquared >= DRAG_ACTIVATION_DISTANCE_PX_SQUARED) {\n        this.#isDragging = true;\n        this.#pendingDrag = null;\n\n        if (skipSnapForPending) {\n          position = this.#getMousePosition(event);\n        }\n      } else {\n        return;\n      }\n    }\n\n    if (this.#isDragging && this.#dragIndex !== null) {\n      event.preventDefault();\n      this.#hoverInsertPreview = null;\n\n      if (this.easingType === EasingType.LINEAR) {\n        const points = this.#getLinearPoints();\n        if (!points || this.#dragIndex >= points.length) {\n          return;\n        }\n\n        if (this.#dragMode === 'point') {\n          this.#handleLinearPointDrag(points, this.#dragIndex, position, event);\n          return;\n        }\n\n        if (this.#dragMode === 'handleIn' || this.#dragMode === 'handleOut') {\n          this.#handleLinearHandleDrag(points, this.#dragIndex, position, event);\n          return;\n        }\n      }\n\n      if (this.easingType === EasingType.CUBIC_BEZIER) {\n        const points = this.#getCubicBezierPoints();\n        if (!points) {\n          return;\n        }\n\n        const updatedPoints: CubicBezierPoints = { ...points };\n        let adjustedPosition = position;\n\n        if (event.shiftKey) {\n          const reference = this.#dragIndex === 0 ? points.p1 : points.p2;\n\n          if (reference) {\n            const deltaX = Math.abs(position.x - reference.x);\n            const deltaY = Math.abs(position.y - reference.y);\n\n            adjustedPosition = deltaX > deltaY ? { x: position.x, y: reference.y } : { x: reference.x, y: position.y };\n          }\n        }\n\n        const clampedPosition = clampPoint(adjustedPosition, {\n          minY: BEZIER_CONTROL_MIN_Y,\n          maxY: BEZIER_CONTROL_MAX_Y\n        });\n\n        if (this.#dragIndex === 0) {\n          updatedPoints.p1 = clampedPosition;\n        } else if (this.#dragIndex === 1) {\n          updatedPoints.p2 = clampedPosition;\n        } else {\n          return;\n        }\n\n        this.points = updatedPoints;\n        this.#emitPoints(updatedPoints, event);\n        this.requestRender();\n        return;\n      }\n\n      return;\n    }\n\n    if (this.easingType === EasingType.LINEAR) {\n      const points = this.#getLinearPoints();\n      // Use rawPosition for the hit test to avoid flickering when snapToGrid is on\n      if (points && this.#isNearExistingPointOrHandle(position, points)) {\n        this.#hoverInsertPreview = null;\n        this.#hoverPoint = null;\n        this.requestRender();\n        return;\n      }\n\n      const preview = this.#buildLinearInsertPreview(position);\n      this.#hoverInsertPreview = preview;\n      if (!preview) {\n        this.#hoverPoint = null;\n        this.requestRender();\n        return;\n      }\n    } else {\n      this.#hoverInsertPreview = null;\n    }\n\n    this.#hoverPoint = position;\n    this.requestRender();\n  };\n\n  #handleLinearPointDrag(points: LinearPoints, index: number, position: Point, event: PointerEvent): void {\n    let workingPosition = position;\n    const currentPoint = points[index];\n    const activePointId = currentPoint ? (this.#dragPointId ?? ensureLinearPointId(currentPoint)) : null;\n\n    if (event.shiftKey && this.#dragStartPoints && activePointId) {\n      const startPoint = this.#dragStartPoints.get(activePointId);\n      if (startPoint) {\n        const deltaX = Math.abs(position.x - startPoint.x);\n        const deltaY = Math.abs(position.y - startPoint.y);\n        workingPosition = deltaX > deltaY ? { x: position.x, y: startPoint.y } : { x: startPoint.x, y: position.y };\n      }\n    }\n\n    const constrainedPoint = this.#constrainLinearPoint(index, workingPosition, points);\n    const updatedPoints: LinearPoints = points.map((point, i) => {\n      if (i === index) {\n        return constrainedPoint;\n      }\n      return { ...point };\n    });\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.points = normalizedPoints;\n    this.#emitPoints(normalizedPoints, event);\n\n    if (activePointId) {\n      const newIndex = normalizedPoints.findIndex((point) => point?.id === activePointId);\n      if (newIndex !== -1) {\n        this.#dragIndex = newIndex;\n        this.#dragPointId = activePointId;\n        this.#notifyLinearFocus(newIndex, event);\n      } else {\n        this.#notifyLinearFocus(index, event);\n      }\n    } else {\n      this.#notifyLinearFocus(index, event);\n    }\n\n    this.requestRender();\n  }\n\n  #handleLinearHandleDrag(points: LinearPoints, index: number, position: Point, event: PointerEvent): void {\n    const point = points[index];\n    if (!point) {\n      return;\n    }\n\n    const activePointId = this.#dragPointId ?? ensureLinearPointId(point);\n    const direction = this.#dragMode === 'handleIn' ? 'In' : 'Out';\n\n    let dx = position.x - point.x;\n    const dy = position.y - point.y;\n\n    if (direction === 'In') {\n      dx = Math.min(0, dx);\n    } else {\n      dx = Math.max(0, dx);\n    }\n\n    let isLinked = point.isLinked ?? false;\n    if (event.shiftKey) {\n      isLinked = false;\n    }\n\n    const updatedPoints = [...points];\n    const updatedPoint = { ...point };\n    updatedPoints[index] = updatedPoint;\n\n    updatedPoint.isLinked = isLinked;\n\n    if (direction === 'In') {\n      updatedPoint.cpInX = dx;\n      updatedPoint.cpInY = dy;\n    } else {\n      updatedPoint.cpOutX = dx;\n      updatedPoint.cpOutY = dy;\n    }\n\n    const mirrorAngle = isLinked;\n    const mirrorLength = mirrorAngle && updatedPoint.mirrorLength !== false;\n\n    if (mirrorAngle || mirrorLength) {\n      const draggedLength = vectorLength(dx, dy);\n\n      if (draggedLength <= MIN_LINEAR_DELTA) {\n        if (direction === 'In') {\n          delete updatedPoint.cpInX;\n          delete updatedPoint.cpInY;\n          if (mirrorAngle) {\n            delete updatedPoint.cpOutX;\n            delete updatedPoint.cpOutY;\n          }\n        } else {\n          delete updatedPoint.cpOutX;\n          delete updatedPoint.cpOutY;\n          if (mirrorAngle) {\n            delete updatedPoint.cpInX;\n            delete updatedPoint.cpInY;\n          }\n        }\n      } else {\n        const normalized = normalizeVector(dx, dy);\n\n        if (mirrorAngle) {\n          if (direction === 'In') {\n            const existingLength = mirrorLength\n              ? draggedLength\n              : vectorLength(updatedPoint.cpOutX ?? 0, updatedPoint.cpOutY ?? 0) || draggedLength;\n            updatedPoint.cpOutX = -normalized.dx * existingLength;\n            updatedPoint.cpOutY = -normalized.dy * existingLength;\n          } else {\n            const existingLength = mirrorLength\n              ? draggedLength\n              : vectorLength(updatedPoint.cpInX ?? 0, updatedPoint.cpInY ?? 0) || draggedLength;\n            updatedPoint.cpInX = -normalized.dx * existingLength;\n            updatedPoint.cpInY = -normalized.dy * existingLength;\n          }\n        } else if (mirrorLength) {\n          if (direction === 'In') {\n            const inDirection = normalizeVector(updatedPoint.cpInX ?? 0, updatedPoint.cpInY ?? 0);\n            const outDirection = normalizeVector(updatedPoint.cpOutX ?? 0, updatedPoint.cpOutY ?? 0);\n            const outLength = vectorLength(updatedPoint.cpOutX ?? 0, updatedPoint.cpOutY ?? 0);\n            if (outLength > 0) {\n              updatedPoint.cpOutX = outDirection.dx * draggedLength;\n              updatedPoint.cpOutY = outDirection.dy * draggedLength;\n            }\n            updatedPoint.cpInX = inDirection.dx * draggedLength;\n            updatedPoint.cpInY = inDirection.dy * draggedLength;\n          } else {\n            const inDirection = normalizeVector(updatedPoint.cpInX ?? 0, updatedPoint.cpInY ?? 0);\n            const outDirection = normalizeVector(updatedPoint.cpOutX ?? 0, updatedPoint.cpOutY ?? 0);\n            const inLength = vectorLength(updatedPoint.cpInX ?? 0, updatedPoint.cpInY ?? 0);\n            if (inLength > 0) {\n              updatedPoint.cpInX = inDirection.dx * draggedLength;\n              updatedPoint.cpInY = inDirection.dy * draggedLength;\n            }\n            updatedPoint.cpOutX = outDirection.dx * draggedLength;\n            updatedPoint.cpOutY = outDirection.dy * draggedLength;\n          }\n        }\n\n        if (mirrorLength) {\n          this.#alignLinkedHandleLengths(updatedPoint);\n        }\n      }\n    }\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.points = normalizedPoints;\n    this.#emitPoints(normalizedPoints, event);\n\n    if (activePointId) {\n      const newIndex = normalizedPoints.findIndex((candidate) => candidate?.id === activePointId);\n      if (newIndex !== -1) {\n        this.#dragIndex = newIndex;\n        this.#dragPointId = activePointId;\n        this.#notifyLinearFocus(newIndex, event);\n      } else {\n        this.#notifyLinearFocus(index, event);\n      }\n    } else {\n      this.#notifyLinearFocus(index, event);\n    }\n\n    this.requestRender();\n  }\n\n  readonly handlePointerUp = (event: PointerEvent): void => {\n    const previousIndex = this.#dragIndex;\n\n    if (this.svgElement?.hasPointerCapture(event.pointerId)) {\n      this.svgElement.releasePointerCapture(event.pointerId);\n    }\n\n    this.#isDragging = false;\n    this.#dragIndex = null;\n    this.#dragMode = null;\n    this.#dragStartPoints = null;\n    this.#dragPointId = null;\n    this.#pendingDrag = null;\n    this.#hoverInsertPreview = null;\n\n    if (previousIndex !== null && this.easingType === EasingType.LINEAR) {\n      this.#notifyLinearFocus(previousIndex, event);\n    }\n    this.requestRender();\n  };\n\n  readonly handlePointerLeave = (event: PointerEvent): void => {\n    if (this.#isDragging) {\n      this.handlePointerUp(event);\n    }\n\n    this.#pendingDrag = null;\n    this.#hoverPoint = null;\n    this.#dragPointId = null;\n    this.#hoverInsertPreview = null;\n    this.requestRender();\n  };\n\n  #insertLinearPoint(position: Point, event: PointerEvent): { index: number; pointId: string | null } | null {\n    const preview = this.#hoverInsertPreview ?? this.#buildLinearInsertPreview(position);\n    if (!preview) {\n      return null;\n    }\n\n    const { normalizedPoints, insertedIndex, insertedPoint } = preview;\n    const insertedPointId = insertedPoint ? ensureLinearPointId(insertedPoint) : null;\n\n    this.points = normalizedPoints;\n    this.#emitPoints(normalizedPoints, event);\n    this.requestRender();\n    this.#hoverInsertPreview = null;\n\n    return {\n      index: insertedIndex,\n      pointId: insertedPointId\n    };\n  }\n\n  #buildLinearInsertPreview(position: Point): LinearInsertPreview | null {\n    if (this.easingType !== EasingType.LINEAR) {\n      return null;\n    }\n\n    const points = this.#getLinearPoints();\n    if (!points || points.length >= MAX_LINEAR_POINTS) {\n      return null;\n    }\n\n    // Allow Y values outside [0, 1] for bounce/elastic effects\n    const clamped = clampPoint(position, { minY: -2, maxY: 3 });\n    if (!this.#isPointNearLinearPath(clamped, points)) {\n      return null;\n    }\n\n    const insertIndex = points.findIndex((point) => clamped.x < point.x);\n    if (insertIndex <= 0) {\n      return null;\n    }\n\n    const prev = points[insertIndex - 1];\n    const next = points[insertIndex];\n\n    if (!prev || !next) {\n      return null;\n    }\n\n    if (clamped.x - prev.x < MIN_LINEAR_DELTA || next.x - clamped.x < MIN_LINEAR_DELTA) {\n      return null;\n    }\n\n    let updatedPoints: LinearPoints;\n    let insertedPointId: string | null = null;\n\n    const splitResult = splitCurveSegment(prev, next, clamped);\n\n    if (splitResult) {\n      const { prev: newPrev, newPoint, next: newNext } = splitResult;\n      insertedPointId = ensureLinearPointId(newPoint);\n      updatedPoints = [\n        ...points.slice(0, insertIndex - 1),\n        newPrev,\n        newPoint,\n        newNext,\n        ...points.slice(insertIndex + 1)\n      ];\n    } else {\n      const newPoint: LinearPoint = {\n        x: clamped.x,\n        y: clamped.y,\n        cpInX: -0.1,\n        cpInY: 0,\n        cpOutX: 0.1,\n        cpOutY: 0,\n        isLinked: true,\n        mirrorLength: true\n      };\n      insertedPointId = ensureLinearPointId(newPoint);\n      updatedPoints = [...points.slice(0, insertIndex), newPoint, ...points.slice(insertIndex)];\n    }\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    const normalizedIndex =\n      insertedPointId !== null ? normalizedPoints.findIndex((point) => point?.id === insertedPointId) : -1;\n\n    const insertedIndex = normalizedIndex !== -1 ? normalizedIndex : insertIndex;\n    const insertedPoint = normalizedPoints[insertedIndex];\n\n    if (!insertedPoint) {\n      return null;\n    }\n\n    return {\n      path: linearDisplayPath(normalizedPoints),\n      normalizedPoints,\n      insertedIndex,\n      insertedPoint\n    };\n  }\n}\n\nconst lerp = (a: number, b: number, t: number): number => a + (b - a) * t;\n\nconst lerpPoint = (p1: Point, p2: Point, t: number): Point => {\n  return {\n    x: lerp(p1.x, p2.x, t),\n    y: lerp(p1.y, p2.y, t)\n  };\n};\n\n// Helper to find t for a given x on a cubic bezier curve\nconst findTForX = (x: number, p0: Point, cp1: Point, cp2: Point, p3: Point): number => {\n  let minT = 0;\n  let maxT = 1;\n  let t = 0.5;\n  const tolerance = 0.0001;\n  const maxIterations = 20;\n\n  // Use binary search since x is monotonic\n  for (let i = 0; i < maxIterations; i++) {\n    const px = (1 - t) ** 3 * p0.x + 3 * (1 - t) ** 2 * t * cp1.x + 3 * (1 - t) * t ** 2 * cp2.x + t ** 3 * p3.x;\n\n    if (Math.abs(px - x) < tolerance) {\n      return t;\n    }\n\n    if (px < x) {\n      minT = t;\n    } else {\n      maxT = t;\n    }\n    t = (minT + maxT) / 2;\n  }\n\n  return t;\n};\n\nconst splitCurveSegment = (\n  prev: LinearPoint,\n  next: LinearPoint,\n  position: Point\n): { prev: LinearPoint; newPoint: LinearPoint; next: LinearPoint } | null => {\n  const cp1 = {\n    x: prev.x + (prev.cpOutX ?? 0),\n    y: prev.y + (prev.cpOutY ?? 0)\n  };\n  const cp2 = {\n    x: next.x + (next.cpInX ?? 0),\n    y: next.y + (next.cpInY ?? 0)\n  };\n\n  const wasCurved = prev.cpOutX || prev.cpOutY || next.cpInX || next.cpInY;\n\n  if (!wasCurved) {\n    return null;\n  }\n\n  // Find the correct t parameter that corresponds to the mouse X position\n  const t = findTForX(position.x, prev, cp1, cp2, next);\n\n  const P01 = lerpPoint(prev, cp1, t);\n  const P12 = lerpPoint(cp1, cp2, t);\n  const P23 = lerpPoint(cp2, next, t);\n\n  const P012 = lerpPoint(P01, P12, t);\n  const P123 = lerpPoint(P12, P23, t);\n\n  const P_new = lerpPoint(P012, P123, t);\n\n  const newPoint: LinearPoint = {\n    x: P_new.x,\n    y: P_new.y,\n    cpInX: P012.x - P_new.x,\n    cpInY: P012.y - P_new.y,\n    cpOutX: P123.x - P_new.x,\n    cpOutY: P123.y - P_new.y,\n    isLinked: true,\n    mirrorLength: prev.mirrorLength === false && next.mirrorLength\n  };\n  ensureLinearPointId(newPoint);\n\n  const newPrev: LinearPoint = {\n    ...prev,\n    cpOutX: P01.x - prev.x,\n    cpOutY: P01.y - prev.y\n  };\n\n  const newNext: LinearPoint = {\n    ...next,\n    cpInX: P23.x - next.x,\n    cpInY: P23.y - next.y\n  };\n\n  return {\n    prev: newPrev,\n    newPoint,\n    next: newNext\n  };\n};\n\nconst evaluateCubicPointNormalized = (t: number, p0: Point, cp1: Point, cp2: Point, p3: Point): Point => {\n  const P01 = lerpPoint(p0, cp1, t);\n  const P12 = lerpPoint(cp1, cp2, t);\n  const P23 = lerpPoint(cp2, p3, t);\n\n  const P012 = lerpPoint(P01, P12, t);\n  const P123 = lerpPoint(P12, P23, t);\n\n  return lerpPoint(P012, P123, t);\n};\n","import { html } from 'lit-html';\n\nimport { DEFAULT_HANDLE_LENGTH } from './constants';\nimport { canvasControlsStyles } from './styles';\nimport { type CubicBezierPoints, EasingType, type LinearPoint, type LinearPoints } from './types';\nimport { normalizeLinearPoints, normalizeVector, vectorLength } from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { type ControlEventDetail, dispatchControlEvent } from '~/elements/shared';\n\ntype CurveHost = HTMLElement & {\n  name?: string;\n  easingType: EasingType;\n  points: CubicBezierPoints | LinearPoints;\n  focusedLinearIndex: number | null;\n  handlePointsChange?: (event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>) => void;\n  handleLinearPointFocus?: (event: CustomEvent<ControlEventDetail<number | null>>) => void;\n};\n\nconst HOST_HANDLER_MAP = {\n  'points-change': 'handlePointsChange',\n  'linear-point-focus': 'handleLinearPointFocus'\n} as const;\n\ntype HostEventType = keyof typeof HOST_HANDLER_MAP;\n\n@Component({\n  tag: 'ease-curve-canvas-controls',\n  styles: canvasControlsStyles,\n  template(this: CanvasControls) {\n    if (this.easingType !== EasingType.LINEAR || !Array.isArray(this.points)) {\n      return null;\n    }\n\n    const focusedIndex = this.focusedLinearIndex;\n    if (focusedIndex === null) {\n      return null;\n    }\n\n    const points = this.points as LinearPoints;\n    const selectedPoint = points[focusedIndex];\n    if (!selectedPoint) {\n      return null;\n    }\n\n    const isInnerPoint = focusedIndex > 0 && focusedIndex < points.length - 1;\n    if (!isInnerPoint) {\n      return null;\n    }\n\n    const hasInHandle = selectedPoint.cpInX !== undefined || selectedPoint.cpInY !== undefined;\n    const hasOutHandle = selectedPoint.cpOutX !== undefined || selectedPoint.cpOutY !== undefined;\n    const hasAnyHandle = hasInHandle || hasOutHandle;\n\n    return html`\n      <div class=\"overlay-controls\">\n        <button\n          type=\"button\"\n          class=\"overlay-button ${selectedPoint.isLinked ? 'active' : 'inactive'}\"\n          @click=${this.handleToggleMirrorAngle}\n        >\n          <ease-icon-bezier-angle></ease-icon-bezier-angle>\n        </button>\n        <button\n          type=\"button\"\n          class=\"overlay-button ${selectedPoint.mirrorLength !== false && selectedPoint.isLinked ? 'active' : 'inactive'}\"\n          @click=${this.handleToggleMirrorLength}\n          ?disabled=${!selectedPoint.isLinked}\n        >\n          <ease-icon-bezier-length></ease-icon-bezier-length>\n        </button>\n        ${\n          hasAnyHandle\n            ? html`\n            <button\n              type=\"button\"\n              class=\"overlay-button\"\n              @click=${this.handleRemoveSmoothing}\n            >\n              <ease-icon-bezier></ease-icon-bezier>\n            </button>\n          `\n            : html`\n            <button\n              type=\"button\"\n              class=\"overlay-button\"\n              @click=${this.handleAddSmoothing}\n            >\n              <ease-icon-bezier-mirror></ease-icon-bezier-mirror>\n            </button>\n          `\n        }\n      </div>\n    `;\n  }\n})\nexport class CanvasControls extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<EasingType>({ reflect: true })\n  accessor easingType!: EasingType;\n\n  @Prop<CubicBezierPoints | LinearPoints>({ type: Object, reflect: false })\n  accessor points!: CubicBezierPoints | LinearPoints;\n\n  @Prop<number | null>({ type: Number, reflect: false, defaultValue: null })\n  accessor focusedLinearIndex: number | null = null;\n\n  #getEventTarget = (): CurveHost => {\n    const root = this.getRootNode();\n    if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n      return root.host as CurveHost;\n    }\n    return this as unknown as CurveHost;\n  };\n\n  #getLinearPoints = (): LinearPoints | null => {\n    if (!Array.isArray(this.points)) {\n      return null;\n    }\n    return this.points;\n  };\n\n  #notifyHost = <TValue>(type: HostEventType, value: TValue, event: Event): void => {\n    const target = this.#getEventTarget();\n    const detail: ControlEventDetail<TValue> = { name: target.name, value, event };\n    dispatchControlEvent(target, type, detail);\n  };\n\n  #emitPoints = (points: LinearPoints, event: Event): void => {\n    this.points = points;\n    this.#notifyHost('points-change', points, event);\n  };\n\n  readonly handleToggleMirrorAngle = (event: Event): void => {\n    event.preventDefault();\n    const points = this.#getLinearPoints();\n    if (!points) {\n      return;\n    }\n\n    const index = this.focusedLinearIndex;\n    if (index === null) {\n      return;\n    }\n\n    const point = points[index];\n    if (!point) {\n      return;\n    }\n\n    const updatedPoints = [...points];\n    const updatedPoint = { ...point };\n    updatedPoints[index] = updatedPoint;\n\n    const nextState = !updatedPoint.isLinked;\n    if (nextState) {\n      this.#ensureSmoothHandles(updatedPoint, index, points);\n      updatedPoint.mirrorLength = true;\n      this.#alignMirrorLength(updatedPoint);\n    } else {\n      updatedPoint.mirrorLength = false;\n    }\n    updatedPoint.isLinked = nextState;\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.focusedLinearIndex = index;\n    this.#notifyHost('linear-point-focus', index, event);\n  };\n\n  readonly handleToggleMirrorLength = (event: Event): void => {\n    event.preventDefault();\n    const points = this.#getLinearPoints();\n    if (!points) {\n      return;\n    }\n\n    const index = this.focusedLinearIndex;\n    if (index === null) {\n      return;\n    }\n\n    const point = points[index];\n    if (!point || !point.isLinked) {\n      return;\n    }\n\n    const updatedPoints = [...points];\n    const updatedPoint = { ...point };\n    updatedPoints[index] = updatedPoint;\n\n    const nextState = updatedPoint.mirrorLength === false;\n    updatedPoint.mirrorLength = nextState;\n    if (nextState) {\n      this.#ensureSmoothHandles(updatedPoint, index, points);\n      this.#alignMirrorLength(updatedPoint);\n    }\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.focusedLinearIndex = index;\n    this.#notifyHost('linear-point-focus', index, event);\n  };\n\n  readonly handleRemoveSmoothing = (event: Event): void => {\n    event.preventDefault();\n    const points = this.#getLinearPoints();\n    if (!points) {\n      return;\n    }\n\n    const index = this.focusedLinearIndex;\n    if (index === null) {\n      return;\n    }\n\n    const existingPoint = points[index];\n    if (!existingPoint) {\n      return;\n    }\n\n    const updatedPoints = [...points];\n    const updatedPoint: LinearPoint = { ...existingPoint };\n    updatedPoints[index] = updatedPoint;\n\n    delete updatedPoint.cpInX;\n    delete updatedPoint.cpInY;\n    delete updatedPoint.cpOutX;\n    delete updatedPoint.cpOutY;\n    delete updatedPoint.isLinked;\n    delete updatedPoint.mirrorLength;\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.focusedLinearIndex = index;\n    this.#notifyHost('linear-point-focus', index, event);\n  };\n\n  readonly handleAddSmoothing = (event: Event): void => {\n    event.preventDefault();\n    const points = this.#getLinearPoints();\n    if (!points) {\n      return;\n    }\n\n    const index = this.focusedLinearIndex;\n    if (index === null) {\n      return;\n    }\n\n    const point = points[index];\n    if (!point) {\n      return;\n    }\n\n    const updatedPoints = [...points];\n    const updatedPoint = { ...point };\n    updatedPoints[index] = updatedPoint;\n\n    this.#ensureSmoothHandles(updatedPoint, index, points);\n    updatedPoint.isLinked = true;\n    updatedPoint.mirrorLength = true;\n    this.#alignMirrorLength(updatedPoint);\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.focusedLinearIndex = index;\n    this.#notifyHost('linear-point-focus', index, event);\n  };\n\n  #ensureSmoothHandles(point: LinearPoint, index: number, points: LinearPoints): void {\n    const prev = points[index - 1];\n    const next = points[index + 1];\n\n    let refDx = point.cpOutX ?? -(point.cpInX ?? 0);\n    let refDy = point.cpOutY ?? -(point.cpInY ?? 0);\n\n    if (refDx === 0 && refDy === 0) {\n      let dirX = 0;\n      let dirY = 0;\n\n      if (prev && next) {\n        dirX = next.x - prev.x;\n        dirY = next.y - prev.y;\n      } else if (next) {\n        dirX = next.x - point.x;\n        dirY = next.y - point.y;\n      } else if (prev) {\n        dirX = point.x - prev.x;\n        dirY = point.y - prev.y;\n      } else {\n        dirX = 1;\n        dirY = 0;\n      }\n\n      const direction = normalizeVector(dirX, dirY);\n      const length = DEFAULT_HANDLE_LENGTH;\n\n      point.cpInX = -direction.dx * length;\n      point.cpInY = -direction.dy * length;\n      point.cpOutX = direction.dx * length;\n      point.cpOutY = direction.dy * length;\n      refDx = point.cpOutX;\n      refDy = point.cpOutY;\n    }\n\n    if (refDx === 0 && refDy === 0) {\n      return;\n    }\n\n    const normalized = normalizeVector(refDx, refDy);\n    const referenceLength = vectorLength(refDx, refDy);\n\n    const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0) || referenceLength;\n    point.cpInX = -normalized.dx * inLength;\n    point.cpInY = -normalized.dy * inLength;\n\n    const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0) || referenceLength;\n    point.cpOutX = normalized.dx * outLength;\n    point.cpOutY = normalized.dy * outLength;\n  }\n\n  #alignMirrorLength(point: LinearPoint): void {\n    if (!point.isLinked) {\n      point.mirrorLength = false;\n      return;\n    }\n\n    const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0);\n    const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0);\n    const targetLength = Math.max(outLength, inLength);\n\n    if (targetLength <= 0) {\n      return;\n    }\n\n    if (outLength > 0) {\n      const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n      point.cpOutX = outDirection.dx * targetLength;\n      point.cpOutY = outDirection.dy * targetLength;\n    } else if (inLength > 0) {\n      const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n      point.cpOutX = -inDirection.dx * targetLength;\n      point.cpOutY = -inDirection.dy * targetLength;\n    }\n\n    if (inLength > 0) {\n      const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n      point.cpInX = inDirection.dx * targetLength;\n      point.cpInY = inDirection.dy * targetLength;\n    } else if (outLength > 0) {\n      const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n      point.cpInX = -outDirection.dx * targetLength;\n      point.cpInY = -outDirection.dy * targetLength;\n    }\n  }\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-minus',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M5 7.99995H11\" />\n      </svg>\n    `;\n  }\n})\nexport class IconMinus extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-plus',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M8.00018 4.28591C8.00018 4.28591 8.00018 8.42263 8.00018 11.714M4.28613 7.99995H11.7142\" />\n      </svg>\n    `;\n  }\n})\nexport class IconPlus extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\n@Component({\n  tag: 'ease-button',\n  autoSlot: true,\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: block;\n      width: 100%;\n    }\n\n    :host([data-variant=\"headless\"]) {\n      display: inline-flex;\n      width: auto;\n    }\n\n    button {\n      appearance: none;\n      font-family: var(--ease-font-family, inherit);\n      font-optical-sizing: auto;\n      font-size: var(--ease-button-font-size, var(--ease-font-size-sm, 12px));\n      font-weight: 550;\n      color: var(--ease-button-color, var(--color-blue-100));\n      min-width: 0;\n      padding: var(--ease-button-padding, 7px 8px);\n      display: block;\n      border-radius: var(--ease-button-radius, 5px);\n      background-color: var(--ease-button-background, var(--color-gray-850));\n      border: none;\n      outline: none;\n      margin: 0;\n      line-height: var(--ease-button-line-height, 14px);\n      box-shadow: inset 0 1px .25px 0 var(--color-white-4), 0 1px 2.5px 0 var(--color-black-8);\n      transition: color 0.2s, background-color 0.2s, scale 0.2s, box-shadow 0.2s;\n      cursor: pointer;\n      min-width: var(--ease-button-min-width, 88px);\n      white-space: nowrap;\n      overflow: hidden;\n      position: relative;\n      text-overflow: ellipsis;\n      text-align: center;\n\n      &[data-pill=\"true\"] {\n        border-radius: 999px;\n      }\n\n      &[data-full-width=\"true\"] {\n        width: 100%;\n      }\n\n      &[data-block=\"icon\"] {\n        --ease-icon-size: 16px;\n        width: 28px;\n        height: 28px;\n        min-width: 28px;\n        padding: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        color: var(--color-gray-700);\n\n        &:hover,\n        &:focus-visible {\n          color: var(--ease-button-hover-color, var(--color-blue-100));\n        }\n\n        &[data-variant=\"headless\"] {\n          --ease-icon-size: 16px;\n          width: auto;\n          height: auto;\n          padding: 0;\n          min-width: 0;\n          margin: -1px;\n        }\n      }\n      \n      &[data-block=\"small\"] {\n        padding: 5px 8px;\n        font-size: 12px;\n        line-height: 14px;\n        border-radius: 5px;\n      }\n      \n      &[data-block=\"large\"] {\n        padding: 9px 12px;\n        font-size: 13px;\n        line-height: 14px;\n        border-radius: 8px;\n      }\n\n      &:hover,\n      &:focus-visible {\n        background-color: var(--ease-button-hover-background-color, var(--color-gray-825));\n        color: var(--ease-button-hover-color, var(--color-blue-100));\n      }\n\n      &[data-variant=\"headless\"],\n      &[data-variant=\"headless-muted\"] {\n        background-color: transparent;\n        box-shadow: none;\n        min-width: 0;\n        width: auto;\n        padding: 0;\n        transition: scale 0.2s, color 0.2s;\n\n        &:hover,\n        &:focus-visible {\n          scale: 1.05;\n        }\n\n        &:active {\n          scale: 0.95;\n        }\n      }\n\n      &[data-variant=\"headless-muted\"] {\n        color: var(--ease-button-color, var(--color-gray-600));\n\n        &:hover,\n        &:focus-visible {\n          color: var(--ease-button-hover-color, var(--color-blue-100));\n        }\n      }\n\n      &[data-variant=\"link\"] {\n        background-color: transparent;\n        box-shadow: none;\n\n        &:hover,\n        &:focus-visible {\n          background-color: var(--ease-button-hover-background-color, var(--color-gray-875));\n        }\n      }\n\n      &[data-variant=\"primary\"] {\n        color: var(--color-blue-100);\n        font-weight: 450;\n        border-radius: 36px;\n        \n        background: radial-gradient(217.29% 45.98% at 99.13% 4.17%, rgba(21, 24, 220, 0.40) 0%, rgba(21, 24, 220, 0.00) 100%), radial-gradient(104.75% 41.7% at 3.06% 100%, rgba(233, 208, 254, 0.30) 0%, rgba(21, 24, 220, 0.00) 100%), radial-gradient(30.53% 47.92% at 46.51% -14.58%, rgba(233, 208, 254, 0.60) 0%, rgba(21, 24, 220, 0.00) 100%), radial-gradient(22.57% 35.42% at 46.29% 112.5%, rgba(233, 208, 254, 0.20) 0%, rgba(21, 24, 220, 0.00) 100%), rgba(255, 255, 255, 0.12);\n        background-repeat: no-repeat;\n\n        box-shadow: \n          0px 1px 0px 0px rgba(255, 255, 255, 0.2), \n          inset 0px 0px 50px 0px rgba(255, 255, 255, 0.02), \n          inset 0px 0px 0px 1px rgba(255, 255, 255, 0.02), \n          inset 0px 0px 4px 0px rgba(69, 40, 255, 0.4);\n\n\n        &::before {\n          content: '';\n          position: absolute;\n          inset: 0;\n          background-color: var(--color-white-2);\n          box-shadow: inset 0px 0.5px 0.75px 0px var(--color-white-30);\n          mix-blend-mode: overlay;\n          pointer-events: none;\n          z-index: 1;\n          border-radius: inherit;\n        }\n\n        &:hover,\n        &:focus-visible {\n           filter: brightness(1.1);\n        }\n      }\n    }\n  `\n})\nexport class Button extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled: boolean = false;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor pill: boolean = false;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor fullWidth: boolean = false;\n\n  @Prop<'submit' | 'reset' | 'button'>({ type: String, reflect: true, defaultValue: 'button' })\n  accessor type!: 'submit' | 'reset' | 'button';\n\n  @Prop<'icon' | 'small' | 'medium' | 'large'>({\n    type: String,\n    reflect: true,\n    defaultValue: 'medium',\n    onAttributeChange() {\n      this.requestRender?.();\n    }\n  })\n  accessor block: 'icon' | 'small' | 'medium' | 'large' = 'medium';\n\n  @Prop<'default' | 'primary' | 'headless' | 'headless-muted' | 'link'>({\n    type: String,\n    reflect: true,\n    defaultValue: 'default'\n  })\n  accessor variant!: 'default' | 'primary' | 'headless' | 'headless-muted' | 'link';\n\n  render(): TemplateResult {\n    return html`\n      <button\n        type=${this.type}\n        ?disabled=${this.disabled}\n        data-variant=${this.variant}\n        data-full-width=${this.fullWidth}\n        data-pill=${this.pill}\n        data-block=\"${this.block}\"\n      >\n        <slot></slot>\n      </button>\n    `;\n  }\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { DEFAULT_HANDLE_LENGTH, EASING_PRESETS } from './constants';\nimport { controlsStyles } from './styles';\nimport {\n  type CubicBezierPoints,\n  EasingType,\n  type LinearPoint,\n  type LinearPoints,\n  MAX_LINEAR_POINTS,\n  MIN_LINEAR_POINTS\n} from './types';\nimport {\n  clampPoint,\n  MIN_LINEAR_DELTA,\n  normalizeLinearPoints,\n  normalizeVector,\n  parseCubicBezierValue,\n  parseLinearTimingFunction,\n  smoothLinearPoints,\n  vectorLength\n} from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { type ControlEventDetail, dispatchControlEvent } from '~/elements/shared';\n\nimport '~/elements/icons/interface/minus';\nimport '~/elements/icons/interface/plus';\nimport '~/elements/button';\n\ntype CurveHost = HTMLElement & {\n  name?: string;\n  easingType: EasingType;\n  points: CubicBezierPoints | LinearPoints;\n  showGrid: boolean;\n  snapToGrid: boolean;\n  gridSize: number;\n  focusedLinearIndex: number | null;\n  handleEasingTypeChange?: (event: CustomEvent<ControlEventDetail<EasingType>>) => void;\n  handleGridToggle?: (event: CustomEvent<ControlEventDetail<boolean>>) => void;\n  handleGridSizeChange?: (event: KeyboardEvent) => void;\n  handleSnapToggle?: (event: CustomEvent<ControlEventDetail<boolean>>) => void;\n  handlePointsChange?: (event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>) => void;\n  handleLinearPointFocus?: (event: CustomEvent<ControlEventDetail<number | null>>) => void;\n};\n\nconst HOST_HANDLER_MAP = {\n  'easing-type-change': 'handleEasingTypeChange',\n  'grid-toggle': 'handleGridToggle',\n  'snap-toggle': 'handleSnapToggle',\n  'grid-size-change': 'handleGridSizeChange',\n  'points-change': 'handlePointsChange',\n  'linear-point-focus': 'handleLinearPointFocus'\n} as const;\n\ntype HostEventType = keyof typeof HOST_HANDLER_MAP;\n\n@Component({\n  tag: 'ease-curve-controls',\n  styles: controlsStyles,\n  template(this: CurveControls) {\n    return html`\n      <ease-field label=\"Easing\">\n        <ease-dropdown\n          part=\"easing-type-dropdown\"\n          placeholder=\"Select\"\n          id=\"demo-easing-type\"\n          name=\"demo-easing-type\"\n          searchable\n          .value=${this._activePresetValue}\n          @change=${this.handlePresetSelection}\n        >\n          ${EASING_PRESETS.map(\n            ({ label, options }, index) => html`\n            ${index > 0 ? html`<hr slot=\"content\" />` : null}\n\n            <h4 slot=\"content\">${label}</h4>\n            ${options.map(\n              ({ value, label }) => html`\n              <button slot=\"content\" type=\"button\" value=${value}>${label}</button>`\n            )}\n          `\n          )}\n        </ease-dropdown>\n      </ease-field>\n\n      <ease-field label=\"Type\">\n        <ease-radio-group .value=${this.easingType} @change=${this.handleTypeChange} part=\"radio-group\">\n          <button slot=\"content\" value=${EasingType.CUBIC_BEZIER}>Cubic</button>\n          <button slot=\"content\" value=${EasingType.LINEAR}>Linear</button>\n        </ease-radio-group>\n      </ease-field>\n    `;\n  }\n})\nexport class CurveControls extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<EasingType>({ reflect: true })\n  accessor easingType!: EasingType;\n\n  @Prop<CubicBezierPoints | LinearPoints, CurveControls>({\n    type: Object,\n    reflect: false,\n    onChange(this: CurveControls) {\n      this.handlePointsPropChange();\n    }\n  })\n  accessor points!: CubicBezierPoints | LinearPoints;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: true })\n  accessor showGrid!: boolean;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n  accessor snapToGrid!: boolean;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 8 })\n  accessor gridSize: number = 8;\n\n  @Prop<number | null, CurveControls>({\n    type: Number,\n    reflect: false,\n    defaultValue: null,\n    onChange(this: CurveControls, value: number | null) {\n      this.handleFocusedLinearIndexPropChange(value);\n    }\n  })\n  accessor focusedLinearIndex: number | null = null;\n\n  private _activePresetValue: string | null = null;\n  private isApplyingPreset = false;\n\n  #setActivePreset(value: string | null): void {\n    if (this._activePresetValue === value) {\n      return;\n    }\n    this._activePresetValue = value;\n    this.requestRender();\n  }\n\n  #clearActivePreset(): void {\n    if (this._activePresetValue === null) {\n      return;\n    }\n    this._activePresetValue = null;\n    this.requestRender();\n  }\n\n  handleFocusedLinearIndexPropChange(_value: number | null): void {\n    this.requestRender();\n  }\n\n  handlePointsPropChange(): void {\n    if (this.isApplyingPreset) {\n      return;\n    }\n    this.#clearActivePreset();\n  }\n\n  get maxPointsReached(): boolean {\n    const points = this.#getLinearPoints();\n    return points !== null && points.length >= MAX_LINEAR_POINTS;\n  }\n\n  get minPointsReached(): boolean {\n    const points = this.#getLinearPoints();\n    return points !== null && points.length <= MIN_LINEAR_POINTS;\n  }\n\n  #getEventTarget = (): CurveHost => {\n    const root = this.getRootNode();\n    if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n      return root.host as CurveHost;\n    }\n    return this as CurveHost;\n  };\n\n  #getLinearPoints = (): LinearPoints | null => {\n    if (!Array.isArray(this.points)) {\n      return null;\n    }\n\n    return this.points;\n  };\n\n  renderLinearDetailsControls(): TemplateResult | null {\n    const points = this.#getLinearPoints();\n\n    if (!points) {\n      return null;\n    }\n\n    if (points.length < MIN_LINEAR_POINTS) {\n      return html`\n        <div class=\"control-group details-group\">\n          <span class=\"details-empty\">Curve requires at least 2 points.</span>\n        </div>\n      `;\n    }\n\n    const focusedIndex = this.focusedLinearIndex;\n\n    if (focusedIndex === null) {\n      return html`\n        <div class=\"control-group details-group\">\n            <div class=\"details-panel\">\n              <span class=\"details-empty\">Select a point on the canvas to edit its details.</span>\n            </div>\n        </div>\n      `;\n    }\n\n    const selectedPoint = points[focusedIndex];\n    if (!selectedPoint) {\n      return null;\n    }\n\n    const previousIndex = focusedIndex > 0 ? focusedIndex - 1 : null;\n    const nextIndex = focusedIndex < points.length - 1 ? focusedIndex + 1 : null;\n\n    const isInnerPoint = focusedIndex > 0 && focusedIndex < points.length - 1;\n\n    const pointMeta = `${(selectedPoint.x * 100).toFixed(0)}%, ${(selectedPoint.y * 100).toFixed(0)}%`;\n    const pointType = selectedPoint.isLinked ? 'Smooth' : 'Corner';\n    const hasInHandle = selectedPoint.cpInX !== undefined || selectedPoint.cpInY !== undefined;\n    const hasOutHandle = selectedPoint.cpOutX !== undefined || selectedPoint.cpOutY !== undefined;\n    const hasAnyHandle = hasInHandle || hasOutHandle;\n\n    return html`\n      <div class=\"control-group details-group\">\n        <div class=\"details-panel\" role=\"group\" aria-label=\"Linear point details\">\n          <div class=\"point-navigation\">\n            <button\n              type=\"button\"\n              class=\"control-button\"\n              @click=${(event: Event) => this.#focusIndex(event, previousIndex)}\n              ?disabled=${previousIndex === null}\n            >\n              Previous\n            </button>\n            <div class=\"point-state\" aria-live=\"polite\">\n              <span>P${focusedIndex + 1}</span>\n              <span>${pointMeta}</span>\n              <span>(${pointType})</span>\n            </div>\n            <button\n              type=\"button\"\n              class=\"control-button\"\n              @click=${(event: Event) => this.#focusIndex(event, nextIndex)}\n              ?disabled=${nextIndex === null}\n            >\n              Next\n            </button>\n          </div>\n\n          <div class=\"coordinate-editor\" role=\"group\" aria-label=\"Point coordinates\">\n            <label class=\"coordinate-field\">\n              <span>X</span>\n              <input\n                type=\"number\"\n                min=\"0\"\n                max=\"1\"\n                step=\"0.01\"\n                .value=${selectedPoint.x.toFixed(2)}\n                data-axis=\"x\"\n                ?disabled=${!isInnerPoint}\n                @change=${this.#handleCoordinateInput}\n              />\n            </label>\n            <label class=\"coordinate-field\">\n              <span>Y</span>\n              <input\n                type=\"number\"\n                min=\"0\"\n                max=\"1\"\n                step=\"0.01\"\n                .value=${selectedPoint.y.toFixed(2)}\n                data-axis=\"y\"\n                @change=${this.#handleCoordinateInput}\n              />\n            </label>\n            <button\n              type=\"button\"\n              class=\"coordinate-remove\"\n              ?disabled=${!isInnerPoint || points.length <= MIN_LINEAR_POINTS}\n              @click=${this.#handleRemoveSelectedPoint}\n            >\n              Remove\n            </button>\n          </div>\n\n          ${\n            isInnerPoint\n              ? html`\n                  <div class=\"point-type-controls\" role=\"group\" aria-label=\"Point type controls\">\n                    <button\n                      type=\"button\"\n                      class=\"control-button ${!selectedPoint.isLinked ? 'active' : ''}\"\n                      data-type=\"corner\"\n                      @click=${this.#handlePointTypeChange}\n                    >\n                      Corner (Independent)\n                    </button>\n                    <button\n                      type=\"button\"\n                      class=\"control-button ${selectedPoint.isLinked ? 'active' : ''}\"\n                      data-type=\"smooth\"\n                      @click=${this.#handlePointTypeChange}\n                    >\n                      Smooth (Linked)\n                    </button>\n                    <button\n                      type=\"button\"\n                      class=\"control-button ${selectedPoint.isLinked ? 'active' : ''}\"\n                      data-type=\"mirror-angle\"\n                      @click=${this.#handlePointTypeChange}\n                    >\n                      Mirror Angle: ${selectedPoint.isLinked ? 'On' : 'Off'}\n                    </button>\n                    <button\n                      type=\"button\"\n                      class=\"control-button ${selectedPoint.mirrorLength !== false ? 'active' : ''}\"\n                      data-type=\"mirror-length\"\n                      @click=${this.#handlePointTypeChange}\n                      ?disabled=${!selectedPoint.isLinked}\n                    >\n                      Mirror Length: ${selectedPoint.mirrorLength === false ? 'Off' : 'On'}\n                    </button>\n                  </div>\n\n                  <div class=\"handle-actions\" role=\"group\" aria-label=\"Handle removal controls\">\n                    <button\n                      type=\"button\"\n                      class=\"control-button\"\n                      data-handle=\"both\"\n                      @click=${this.#handleRemoveHandles}\n                      ?disabled=${!hasAnyHandle}\n                    >\n                      Remove Both Handles\n                    </button>\n                    <button\n                      type=\"button\"\n                      class=\"control-button\"\n                      data-handle=\"in\"\n                      @click=${this.#handleRemoveHandles}\n                      ?disabled=${!hasInHandle}\n                    >\n                      Remove Incoming Handle\n                    </button>\n                    <button\n                      type=\"button\"\n                      class=\"control-button\"\n                      data-handle=\"out\"\n                      @click=${this.#handleRemoveHandles}\n                      ?disabled=${!hasOutHandle}\n                    >\n                      Remove Outgoing Handle\n                    </button>\n                  </div>\n                `\n              : this.#renderEndpointHandleControls(selectedPoint, focusedIndex)\n          }\n        </div>\n      </div>\n    `;\n  }\n\n  #handleCoordinateInput = (event: Event): void => {\n    const target = event.target;\n    if (!(target instanceof HTMLInputElement)) {\n      return;\n    }\n\n    const axis = target.dataset.axis;\n    if (axis !== 'x' && axis !== 'y') {\n      return;\n    }\n\n    const points = this.#getLinearPoints();\n    if (!points) {\n      return;\n    }\n\n    const index = this.focusedLinearIndex;\n    if (index === null) {\n      return;\n    }\n\n    const selectedPoint = points[index];\n    if (!selectedPoint) {\n      return;\n    }\n\n    const parsed = Number.parseFloat(target.value);\n\n    if (Number.isNaN(parsed)) {\n      target.value = selectedPoint[axis].toFixed(2);\n      return;\n    }\n\n    const updatedPoints: LinearPoints = points.map((point, pointIndex) => {\n      if (pointIndex !== index) {\n        return { ...point };\n      }\n\n      const updated: LinearPoint = { ...point };\n\n      if (axis === 'x') {\n        if (index === 0 || index === points.length - 1) {\n          return updated;\n        }\n\n        const previous = points[index - 1];\n        const next = points[index + 1];\n        const minX = previous ? previous.x + MIN_LINEAR_DELTA : 0;\n        const maxX = next ? next.x - MIN_LINEAR_DELTA : 1;\n        updated.x = Math.min(Math.max(parsed, minX), maxX);\n      } else {\n        updated.y = Math.min(Math.max(parsed, 0), 1);\n      }\n\n      return updated;\n    });\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.focusedLinearIndex = index;\n    this.#notifyHost('linear-point-focus', index, event);\n\n    const refreshedPoint = normalizedPoints[index];\n\n    if (refreshedPoint) {\n      target.value = refreshedPoint[axis].toFixed(2);\n    }\n  };\n\n  #handleRemoveSelectedPoint = (event: Event): void => {\n    const index = this.focusedLinearIndex;\n\n    if (index === null) {\n      return;\n    }\n\n    this.#removeLinearPointAt(index, event);\n  };\n\n  #handlePointTypeChange = (event: Event): void => {\n    event.preventDefault();\n    const target = event.currentTarget;\n    if (!(target instanceof HTMLButtonElement)) {\n      return;\n    }\n\n    const type = target.dataset.type;\n    const points = this.#getLinearPoints();\n    if (!points) {\n      return;\n    }\n\n    const index = this.focusedLinearIndex;\n    if (index === null) {\n      return;\n    }\n\n    const point = points[index];\n    if (!point) {\n      return;\n    }\n\n    const updatedPoints = [...points];\n    const updatedPoint = { ...point };\n    updatedPoints[index] = updatedPoint;\n\n    switch (type) {\n      case 'corner': {\n        updatedPoint.isLinked = false;\n        updatedPoint.mirrorLength = false;\n        break;\n      }\n      case 'smooth': {\n        this.#ensureSmoothHandles(updatedPoint, index, points);\n        updatedPoint.isLinked = true;\n        updatedPoint.mirrorLength = true;\n        this.#alignMirrorLength(updatedPoint);\n        break;\n      }\n      case 'mirror-angle': {\n        const nextState = !updatedPoint.isLinked;\n        if (nextState) {\n          this.#ensureSmoothHandles(updatedPoint, index, points);\n          updatedPoint.mirrorLength = true;\n          this.#alignMirrorLength(updatedPoint);\n        } else {\n          updatedPoint.mirrorLength = false;\n        }\n        updatedPoint.isLinked = nextState;\n        break;\n      }\n      case 'mirror-length': {\n        if (!updatedPoint.isLinked) {\n          break;\n        }\n        const nextState = updatedPoint.mirrorLength === false;\n        updatedPoint.mirrorLength = nextState;\n        if (nextState) {\n          this.#ensureSmoothHandles(updatedPoint, index, points);\n          this.#alignMirrorLength(updatedPoint);\n        }\n        break;\n      }\n      default:\n        return;\n    }\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.focusedLinearIndex = index;\n    this.#notifyHost('linear-point-focus', index, event);\n  };\n\n  #ensureSmoothHandles(point: LinearPoint, index: number, points: LinearPoints): void {\n    const prev = points[index - 1];\n    const next = points[index + 1];\n\n    let refDx = point.cpOutX ?? -(point.cpInX ?? 0);\n    let refDy = point.cpOutY ?? -(point.cpInY ?? 0);\n\n    if (refDx === 0 && refDy === 0) {\n      let dirX = 0;\n      let dirY = 0;\n\n      if (prev && next) {\n        dirX = next.x - prev.x;\n        dirY = next.y - prev.y;\n      } else if (next) {\n        dirX = next.x - point.x;\n        dirY = next.y - point.y;\n      } else if (prev) {\n        dirX = point.x - prev.x;\n        dirY = point.y - prev.y;\n      } else {\n        dirX = 1;\n        dirY = 0;\n      }\n\n      const direction = normalizeVector(dirX, dirY);\n      const length = DEFAULT_HANDLE_LENGTH;\n\n      point.cpInX = -direction.dx * length;\n      point.cpInY = -direction.dy * length;\n      point.cpOutX = direction.dx * length;\n      point.cpOutY = direction.dy * length;\n      refDx = point.cpOutX;\n      refDy = point.cpOutY;\n    }\n\n    if (refDx === 0 && refDy === 0) {\n      return;\n    }\n\n    const normalized = normalizeVector(refDx, refDy);\n    const referenceLength = vectorLength(refDx, refDy);\n\n    const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0) || referenceLength;\n    point.cpInX = -normalized.dx * inLength;\n    point.cpInY = -normalized.dy * inLength;\n\n    const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0) || referenceLength;\n    point.cpOutX = normalized.dx * outLength;\n    point.cpOutY = normalized.dy * outLength;\n  }\n\n  #alignMirrorLength(point: LinearPoint): void {\n    if (!point.isLinked) {\n      point.mirrorLength = false;\n      return;\n    }\n\n    const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0);\n    const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0);\n    const targetLength = Math.max(outLength, inLength);\n\n    if (targetLength <= 0) {\n      return;\n    }\n\n    if (outLength > 0) {\n      const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n      point.cpOutX = outDirection.dx * targetLength;\n      point.cpOutY = outDirection.dy * targetLength;\n    } else if (inLength > 0) {\n      const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n      point.cpOutX = -inDirection.dx * targetLength;\n      point.cpOutY = -inDirection.dy * targetLength;\n    }\n\n    if (inLength > 0) {\n      const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n      point.cpInX = inDirection.dx * targetLength;\n      point.cpInY = inDirection.dy * targetLength;\n    } else if (outLength > 0) {\n      const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n      point.cpInX = -outDirection.dx * targetLength;\n      point.cpInY = -outDirection.dy * targetLength;\n    }\n  }\n\n  #handleRemoveHandles = (event: Event): void => {\n    event.preventDefault();\n    const target = event.currentTarget;\n    if (!(target instanceof HTMLButtonElement)) {\n      return;\n    }\n\n    const mode = (target.dataset.handle as 'in' | 'out' | 'both' | undefined) ?? 'both';\n\n    const points = this.#getLinearPoints();\n    if (!points) {\n      return;\n    }\n\n    const index = this.focusedLinearIndex;\n    if (index === null) {\n      return;\n    }\n\n    const updatedPoints = [...points];\n    const existingPoint = updatedPoints[index];\n    if (!existingPoint) {\n      return;\n    }\n\n    const updatedPoint: LinearPoint = { ...existingPoint };\n    updatedPoints[index] = updatedPoint;\n\n    const removeIncoming = mode === 'both' || mode === 'in';\n    const removeOutgoing = mode === 'both' || mode === 'out';\n\n    if (removeIncoming) {\n      delete updatedPoint.cpInX;\n      delete updatedPoint.cpInY;\n    }\n\n    if (removeOutgoing) {\n      delete updatedPoint.cpOutX;\n      delete updatedPoint.cpOutY;\n    }\n\n    if (removeIncoming && removeOutgoing) {\n      delete updatedPoint.isLinked;\n      delete updatedPoint.mirrorLength;\n    } else if (removeIncoming || removeOutgoing) {\n      updatedPoint.isLinked = false;\n      updatedPoint.mirrorLength = false;\n    }\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.focusedLinearIndex = index;\n    this.#notifyHost('linear-point-focus', index, event);\n  };\n\n  #renderEndpointHandleControls(point: LinearPoint, index: number): TemplateResult {\n    const isStart = index === 0;\n    const handleKey: 'in' | 'out' = isStart ? 'out' : 'in';\n    const handleLabel = isStart ? 'Outgoing' : 'Incoming';\n    const hasHandle =\n      handleKey === 'out'\n        ? point.cpOutX !== undefined || point.cpOutY !== undefined\n        : point.cpInX !== undefined || point.cpInY !== undefined;\n\n    return html`\n      <div class=\"handle-actions\" role=\"group\" aria-label=\"${handleLabel} handle controls\">\n        <button\n          type=\"button\"\n          class=\"control-button\"\n          data-handle=${handleKey}\n          @click=${this.#handleEndpointHandleAdd}\n          ?disabled=${hasHandle}\n        >\n          Add ${handleLabel} Handle\n        </button>\n        <button\n          type=\"button\"\n          class=\"control-button\"\n          data-handle=${handleKey}\n          @click=${this.#handleRemoveHandles}\n          ?disabled=${!hasHandle}\n        >\n          Remove ${handleLabel} Handle\n        </button>\n      </div>\n    `;\n  }\n\n  #handleEndpointHandleAdd = (event: Event): void => {\n    event.preventDefault();\n    const target = event.currentTarget;\n    if (!(target instanceof HTMLButtonElement)) {\n      return;\n    }\n\n    const handle = target.dataset.handle;\n    if (handle !== 'in' && handle !== 'out') {\n      return;\n    }\n\n    const points = this.#getLinearPoints();\n    if (!points) {\n      return;\n    }\n\n    const index = this.focusedLinearIndex;\n    if (index === null) {\n      return;\n    }\n\n    const neighborIndex = handle === 'out' ? index + 1 : index - 1;\n    const neighbor = points[neighborIndex];\n    if (!neighbor) {\n      return;\n    }\n\n    const updatedPoints = [...points];\n    const existingPoint = updatedPoints[index];\n    if (!existingPoint) {\n      return;\n    }\n\n    const updatedPoint: LinearPoint = { ...existingPoint };\n    updatedPoints[index] = updatedPoint;\n\n    this.#createEndpointHandle(updatedPoint, neighbor, handle);\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.focusedLinearIndex = index;\n    this.#notifyHost('linear-point-focus', index, event);\n  };\n\n  #createEndpointHandle(point: LinearPoint, neighbor: LinearPoint, handle: 'in' | 'out'): void {\n    const dx = neighbor.x - point.x;\n    const dy = neighbor.y - point.y;\n\n    const direction = normalizeVector(dx, dy);\n    const fallbackDirection = handle === 'out' ? { dx: 1, dy: 0 } : { dx: -1, dy: 0 };\n    const finalDirection = direction.dx === 0 && direction.dy === 0 ? fallbackDirection : direction;\n\n    const gap = Math.abs(dx);\n    const baseLength = gap > 0 ? gap * 0.5 : MIN_LINEAR_DELTA * 0.5;\n    const length = Math.min(DEFAULT_HANDLE_LENGTH, Math.max(MIN_LINEAR_DELTA * 0.5, baseLength));\n\n    if (handle === 'out') {\n      point.cpOutX = finalDirection.dx * length;\n      point.cpOutY = finalDirection.dy * length;\n    } else {\n      point.cpInX = finalDirection.dx * length;\n      point.cpInY = finalDirection.dy * length;\n    }\n\n    point.isLinked = false;\n    point.mirrorLength = false;\n  }\n\n  #removeLinearPointAt(index: number, event: Event): void {\n    const points = this.#getLinearPoints();\n\n    if (!points || points.length <= MIN_LINEAR_POINTS) {\n      return;\n    }\n\n    if (index <= 0 || index >= points.length - 1) {\n      return;\n    }\n\n    const updatedPoints: LinearPoints = points\n      .filter((_, pointIndex) => pointIndex !== index)\n      .map((point) => {\n        return { ...point };\n      });\n\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n\n    const nextIndex = index - 1;\n\n    this.focusedLinearIndex = nextIndex;\n    this.#notifyHost('linear-point-focus', nextIndex, event);\n  }\n\n  readonly resetCurve = (event: Event): void => {\n    event.preventDefault();\n    this.#clearActivePreset();\n\n    if (this.easingType === EasingType.CUBIC_BEZIER) {\n      const defaults: CubicBezierPoints = {\n        p1: { x: 0.25, y: 0.1 },\n        p2: { x: 0.25, y: 1 }\n      };\n      this.points = defaults;\n      this.#notifyHost('points-change', defaults, event);\n      return;\n    }\n\n    const defaults: LinearPoints = [\n      { x: 0, y: 0 },\n      { x: 1, y: 1 }\n    ];\n    this.points = defaults;\n    this.#notifyHost('points-change', defaults, event);\n    this.focusedLinearIndex = null;\n    this.#notifyHost('linear-point-focus', null, event);\n  };\n\n  readonly distributeLinearPoints = (event: Event): void => {\n    event.preventDefault();\n\n    const points = this.#getLinearPoints();\n\n    if (!points || points.length <= MIN_LINEAR_POINTS) {\n      return;\n    }\n\n    const lastIndex = points.length - 1;\n    const step = lastIndex > 0 ? 1 / lastIndex : 0;\n\n    const distributed: LinearPoints = points.map((point, index) => {\n      const updated: LinearPoint = { ...point };\n\n      if (index === 0) {\n        updated.x = 0;\n      } else if (index === lastIndex) {\n        updated.x = 1;\n      } else {\n        updated.x = Number.parseFloat((step * index).toFixed(4));\n      }\n\n      delete updated.cpInX;\n      delete updated.cpInY;\n      delete updated.cpOutX;\n      delete updated.cpOutY;\n      delete updated.isLinked;\n\n      return updated;\n    });\n\n    const normalizedPoints = normalizeLinearPoints(distributed);\n    this.#emitPoints(normalizedPoints, event);\n\n    if (this.focusedLinearIndex !== null) {\n      this.#notifyHost('linear-point-focus', this.focusedLinearIndex, event);\n    }\n  };\n\n  #focusIndex = (event: Event, index: number | null): void => {\n    event.preventDefault();\n    if (index !== null) {\n      this.focusedLinearIndex = index;\n      this.#notifyHost('linear-point-focus', index, event);\n    }\n  };\n\n  #setEasingType = (type: EasingType, event: Event): void => {\n    if (this.easingType === type) {\n      return;\n    }\n\n    if (!this.isApplyingPreset) {\n      this.#clearActivePreset();\n    }\n\n    this.easingType = type;\n    this.#notifyHost('easing-type-change', type, event);\n  };\n\n  #emitPoints = (points: LinearPoints, event: Event): void => {\n    if (!this.isApplyingPreset) {\n      this.#clearActivePreset();\n    }\n    this.points = points;\n    this.#notifyHost('points-change', points, event);\n  };\n\n  #applyPreset = (\n    points: CubicBezierPoints | LinearPoints,\n    type: EasingType,\n    presetValue: string,\n    event: Event\n  ): void => {\n    this.isApplyingPreset = true;\n    if (this.easingType !== type) {\n      this.#setEasingType(type, event);\n    }\n\n    this.points = points;\n    this.focusedLinearIndex = null;\n    this.#setActivePreset(presetValue);\n    this.#notifyHost('points-change', points, event);\n\n    if (type === EasingType.LINEAR) {\n      this.#notifyHost('linear-point-focus', null, event);\n    }\n\n    this.isApplyingPreset = false;\n  };\n\n  readonly handleTypeChange = (event: CustomEvent<ControlEventDetail<string>>): void => {\n    const detail = event.detail;\n\n    if (!detail) {\n      return;\n    }\n\n    const { value, event: originEvent } = detail;\n\n    if (value === EasingType.CUBIC_BEZIER || value === EasingType.LINEAR) {\n      this.#clearActivePreset();\n      this.#setEasingType(value, originEvent ?? event);\n    }\n  };\n\n  readonly handlePresetSelection = (event: CustomEvent<ControlEventDetail<string>>): void => {\n    const detail = event.detail;\n\n    if (!detail) {\n      return;\n    }\n\n    const rawValue = detail.value;\n    const originEvent = detail.event ?? event;\n\n    if (typeof rawValue !== 'string') {\n      return;\n    }\n\n    const cssValue = rawValue.trim();\n\n    if (cssValue.length === 0) {\n      this.#clearActivePreset();\n      return;\n    }\n\n    if (cssValue.startsWith(EasingType.CUBIC_BEZIER)) {\n      const parsed = parseCubicBezierValue(cssValue);\n      if (!parsed) {\n        this.#clearActivePreset();\n        return;\n      }\n      this.#applyPreset(parsed, EasingType.CUBIC_BEZIER, cssValue, originEvent);\n      return;\n    }\n\n    if (cssValue.startsWith(EasingType.LINEAR)) {\n      const parsedLinear = parseLinearTimingFunction(cssValue);\n      if (!parsedLinear) {\n        this.#clearActivePreset();\n        return;\n      }\n      // Apply smoothing to linear presets for better visual curves\n      const smoothedLinear = smoothLinearPoints(parsedLinear, 0.3);\n      this.#applyPreset(smoothedLinear, EasingType.LINEAR, cssValue, originEvent);\n      return;\n    }\n\n    this.#clearActivePreset();\n  };\n\n  readonly handleSelectCubic = (event: Event): void => {\n    event.preventDefault();\n    this.#setEasingType(EasingType.CUBIC_BEZIER, event);\n  };\n\n  readonly handleSelectLinear = (event: Event): void => {\n    event.preventDefault();\n    this.#setEasingType(EasingType.LINEAR, event);\n  };\n\n  readonly addLinearPoint = (event: Event): void => {\n    event.preventDefault();\n\n    if (this.easingType !== EasingType.LINEAR) {\n      return;\n    }\n\n    const points = this.#getLinearPoints();\n    if (!points || this.maxPointsReached) {\n      return;\n    }\n\n    let insertIndex = 0;\n    let largestGap = -Infinity;\n\n    for (let index = 0; index < points.length - 1; index += 1) {\n      const start = points[index];\n      const end = points[index + 1];\n\n      if (!start || !end) {\n        continue;\n      }\n\n      const gap = end.x - start.x;\n\n      if (gap > largestGap) {\n        largestGap = gap;\n        insertIndex = index;\n      }\n    }\n\n    const startPoint = points[insertIndex];\n    const endPoint = points[insertIndex + 1];\n\n    if (!startPoint || !endPoint) {\n      return;\n    }\n\n    const newPointPosition = clampPoint({\n      x: (startPoint.x + endPoint.x) / 2,\n      y: (startPoint.y + endPoint.y) / 2\n    });\n    const newPoint: LinearPoint = {\n      x: newPointPosition.x,\n      y: newPointPosition.y,\n      cpInX: -0.1,\n      cpInY: 0,\n      cpOutX: 0.1,\n      cpOutY: 0,\n      isLinked: true,\n      mirrorLength: true\n    };\n\n    const updatedPoints: LinearPoints = [\n      ...points.slice(0, insertIndex + 1),\n      newPoint,\n      ...points.slice(insertIndex + 1)\n    ];\n\n    const insertedIndex = insertIndex + 1;\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.focusedLinearIndex = insertedIndex;\n    this.#notifyHost('linear-point-focus', insertedIndex, event);\n  };\n\n  readonly removeLinearPoint = (event: Event): void => {\n    event.preventDefault();\n\n    if (this.easingType !== EasingType.LINEAR) {\n      return;\n    }\n\n    const points = this.#getLinearPoints();\n    if (!points || this.minPointsReached) {\n      return;\n    }\n\n    let removeIndex = 1;\n    let smallestSpan = Number.POSITIVE_INFINITY;\n\n    for (let index = 1; index < points.length - 1; index += 1) {\n      const previous = points[index - 1];\n      const next = points[index + 1];\n\n      if (!previous || !next) {\n        continue;\n      }\n\n      const span = next.x - previous.x;\n\n      if (span < smallestSpan) {\n        smallestSpan = span;\n        removeIndex = index;\n      }\n    }\n\n    if (removeIndex > 0 && removeIndex < points.length - 1) {\n      this.#removeLinearPointAt(removeIndex, event);\n    }\n  };\n\n  readonly toggleGrid = (event: Event): void => {\n    event.preventDefault();\n\n    const nextValue = !this.showGrid;\n    this.showGrid = nextValue;\n    this.#notifyHost('grid-toggle', nextValue, event);\n  };\n\n  readonly toggleSnapToGrid = (event: Event): void => {\n    event.preventDefault();\n\n    const nextValue = !this.snapToGrid;\n    this.snapToGrid = nextValue;\n    this.#notifyHost('snap-toggle', nextValue, event);\n  };\n\n  readonly incrementGridSize = (event: Event): void => {\n    event.preventDefault();\n\n    this.#commitGridSize(this.gridSize + 1, event);\n  };\n\n  readonly decrementGridSize = (event: Event): void => {\n    event.preventDefault();\n\n    this.#commitGridSize(this.gridSize - 1, event);\n  };\n\n  readonly handleGridSliderInput = (event: Event): void => {\n    event.preventDefault();\n    const target = event.target;\n    if (!(target instanceof HTMLInputElement)) {\n      return;\n    }\n    this.#commitGridSize(Number(target.value), event);\n  };\n\n  readonly handleGridSizeChange = (event: Event): void => {\n    event.preventDefault();\n    const target = event.target;\n    if (!(target instanceof HTMLInputElement)) {\n      return;\n    }\n    const parsed = Number(target.value);\n    if (Number.isNaN(parsed)) {\n      target.value = String(this.gridSize);\n      return;\n    }\n    this.#commitGridSize(parsed, event);\n    target.value = String(this.gridSize);\n  };\n\n  #clampGridSize = (value: number): number => Math.max(1, Math.min(24, Math.round(value)));\n\n  #commitGridSize = (value: number, event: Event): void => {\n    const nextValue = this.#clampGridSize(value);\n    if (this.gridSize === nextValue) {\n      this.requestRender();\n      return;\n    }\n    this.gridSize = nextValue;\n    this.#notifyHost('grid-size-change', this.gridSize, event);\n    this.requestRender();\n  };\n\n  #notifyHost = <TValue>(type: HostEventType, value: TValue, event: Event): void => {\n    const target = this.#getEventTarget();\n    const detail: ControlEventDetail<TValue> = { name: target.name, value, event };\n\n    dispatchControlEvent(target, type, detail);\n  };\n}\n","import type { TokenType } from './utils/syntax-highlighter-types';\n\nimport { html } from 'lit-html';\n\nimport { getHighlightAPI, SUPPORTS_HIGHLIGHT_API } from './utils/highlight-api';\nimport { generateHighlightStyles } from './utils/syntax-highlighter-theme';\nimport { normalizeIndent, tokenize } from './utils/syntax-tokenizer';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-code',\n  shadowMode: 'open',\n  autoSlot: false,\n  styles: `\n    :host {\n      display: block;\n      position: relative;\n      color: var(--ease-code-color, var(--color-blue-100));\n    }\n\n    pre {\n      margin: 0;\n      font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n      font-size: var(--ease-code-font-size, var(--ease-font-size-sm, 12px));\n      line-height: var(--ease-code-line-height, 1.4);\n    }\n\n    code {\n      white-space: pre-wrap;\n    }\n  `,\n  template() {\n    return html`<pre><code><slot></slot></code></pre>`;\n  }\n})\nexport class Code extends HTMLElement {\n  declare requestRender: () => void;\n\n  #instanceId: string = `hl-${crypto.randomUUID()}`;\n  #registeredHighlights: Set<string> = new Set();\n  #observer: MutationObserver | null = null;\n\n  @Prop<string | null>({ reflect: true })\n  accessor language: string | null = null;\n\n  @Query<HTMLElement>('code')\n  accessor codeElement: HTMLElement | null = null;\n\n  connectedCallback(): void {\n    this.#observer = new MutationObserver(() => this.#processContent());\n\n    this.#observer.observe(this, {\n      childList: true,\n      subtree: true,\n      characterData: true\n    });\n\n    this.#processContent();\n  }\n\n  disconnectedCallback(): void {\n    this.#observer?.disconnect();\n    this.#cleanupHighlights();\n  }\n\n  attributeChangedCallback(name: string): void {\n    if (name === 'language') {\n      this.#processContent();\n    }\n  }\n\n  get currentLanguage(): string {\n    return this.language?.toLowerCase() ?? 'plaintext';\n  }\n\n  afterRender(): void {\n    this.#processContent();\n  }\n\n  #renderStyles = (): void => {\n    const style = document.createElement('style');\n\n    style.setAttribute('data-highlight-styles', this.#instanceId);\n\n    const highlightStyles = generateHighlightStyles(this.#instanceId);\n    style.textContent = highlightStyles;\n\n    if (this.shadowRoot) {\n      this.shadowRoot.appendChild(style);\n    }\n  };\n\n  #cleanupStyles() {\n    const styles = this.shadowRoot?.querySelectorAll<HTMLStyleElement>(\n      `style[data-highlight-styles=\"${this.#instanceId}\"]`\n    );\n\n    if (styles) {\n      for (const style of styles) {\n        style.remove();\n      }\n    }\n  }\n\n  #getHighlightName(type: TokenType): string {\n    return `syntax-${type}-${this.#instanceId}`;\n  }\n\n  #processContent() {\n    let rawCode = this.textContent || '';\n    rawCode = normalizeIndent(rawCode);\n\n    if (!this.codeElement) {\n      return;\n    }\n\n    this.codeElement.textContent = rawCode;\n\n    this.#cleanupHighlights();\n\n    if (!rawCode.trim() || !SUPPORTS_HIGHLIGHT_API) {\n      return;\n    }\n\n    const textNode = this.codeElement.firstChild as Text;\n\n    if (!textNode) {\n      return;\n    }\n\n    this.#highlightCode(rawCode, this.currentLanguage, textNode);\n  }\n\n  #highlightCode(code: string, language: string, textNode: Text) {\n    const api = getHighlightAPI();\n\n    if (!api) {\n      return;\n    }\n\n    const tokens = tokenize(code, language);\n    const highlightMap = new Map<TokenType, Range[]>();\n\n    for (const token of tokens) {\n      if (token.start >= token.end) {\n        continue;\n      }\n\n      try {\n        this.#renderStyles();\n\n        const range = document.createRange();\n        range.setStart(textNode, token.start);\n        range.setEnd(textNode, token.end);\n\n        if (!highlightMap.has(token.type)) {\n          highlightMap.set(token.type, []);\n        }\n\n        highlightMap.get(token.type)?.push(range);\n      } catch {\n        // Ignore range creation errors\n      }\n    }\n\n    for (const [type, ranges] of highlightMap.entries()) {\n      if (ranges.length) {\n        const highlightName = this.#getHighlightName(type);\n        const highlight = new api.Highlight(...ranges);\n        api.highlights.set(highlightName, highlight);\n        this.#registeredHighlights.add(highlightName);\n      }\n    }\n  }\n\n  #cleanupHighlights() {\n    const api = getHighlightAPI();\n\n    if (!api) {\n      return;\n    }\n\n    for (const name of this.#registeredHighlights) {\n      api.highlights.delete(name);\n    }\n\n    this.#cleanupStyles();\n\n    this.#registeredHighlights.clear();\n  }\n}\n","import { html } from 'lit-html';\n\nimport { outputStyles } from './styles';\nimport { type CSSCode, type CubicBezierPoints, EasingType, type LinearPoints } from './types';\nimport { generateCubicBezierCSS, generateLinearCSS } from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport '~/components/code';\n\n@Component({\n  tag: 'ease-curve-output',\n  styles: outputStyles,\n  template(this: CurveOutput) {\n    return html`\n      <div class=\"output-container\">\n        <div class=\"output-group\">\n          <h4 class=\"output-label\">CSS Easing Function</h4>\n          <ease-code language=\"css\">${this.generatedCSS.code}</ease-code>\n          <button class=\"copy-button\" @click=${this.handleCopyClick}>\n            ${this.copyStatus}\n          </button>\n        </div>\n      </div>\n    `;\n  }\n})\nexport class CurveOutput extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<EasingType>({ type: String, reflect: true })\n  accessor easingType!: EasingType;\n\n  @Prop<CubicBezierPoints | LinearPoints>({ type: Object, reflect: false })\n  accessor points!: CubicBezierPoints | LinearPoints;\n\n  @Prop<string>({ reflect: true, defaultValue: 'ease-custom' })\n  accessor name!: string;\n\n  @Prop<'animation' | 'transition'>({ reflect: true, defaultValue: 'animation' })\n  accessor variant!: 'animation' | 'transition';\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 0 })\n  accessor simplify!: number;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 5 })\n  accessor round!: number;\n\n  #copyTimeout: number | null = null;\n  #animationTimeout: number | null = null;\n  #isAnimating = false;\n\n  get timingFunction(): string {\n    const { timingFunction } = this.generatedCSS;\n    return timingFunction;\n  }\n\n  get generatedCSS(): CSSCode {\n    if (this.easingType === EasingType.CUBIC_BEZIER) {\n      if (!this.points || Array.isArray(this.points)) {\n        const timingFunction = 'cubic-bezier(0.25, 0.1, 0.25, 1)';\n        const code = `\n          .${this.name} {\n            ${this.variant}-timing-function: ${timingFunction};\n          }\n        `;\n\n        return { code, timingFunction };\n      }\n\n      return generateCubicBezierCSS(this.points as CubicBezierPoints, this.name, this.variant);\n    }\n\n    if (this.easingType === EasingType.LINEAR) {\n      if (Array.isArray(this.points)) {\n        return generateLinearCSS(this.points, this.name, this.variant, {\n          simplify: this.simplify,\n          round: this.round\n        });\n      }\n\n      const timingFunction = 'linear(0, 1)';\n      const code = `\n        .${this.name} {\n          ${this.variant}-timing-function: ${timingFunction};\n        }\n      `;\n\n      return { code, timingFunction };\n    }\n\n    const timingFunction = 'ease';\n    const code = `\n      .${this.name} {\n        ${this.variant}-timing-function: ${timingFunction};\n      }\n    `;\n\n    return { code, timingFunction };\n  }\n\n  get copyStatus(): string {\n    return this.#copyTimeout ? 'Copied!' : 'Copy CSS';\n  }\n\n  get isAnimating(): boolean {\n    return this.#isAnimating;\n  }\n\n  #copyToClipboard = async (event: Event): Promise<void> => {\n    event.preventDefault();\n\n    try {\n      await navigator.clipboard.writeText(this.timingFunction);\n\n      if (this.#copyTimeout) {\n        clearTimeout(this.#copyTimeout);\n      }\n\n      this.#copyTimeout = window.setTimeout(() => {\n        this.#copyTimeout = null;\n        this.requestRender();\n      }, 2000);\n\n      this.requestRender();\n    } catch (error) {\n      console.error('Failed to copy to clipboard:', error);\n    }\n  };\n\n  #playPreview = (event: Event): void => {\n    event.preventDefault();\n\n    if (this.#isAnimating) {\n      this.#isAnimating = false;\n      this.requestRender();\n      void this.offsetHeight;\n    }\n\n    if (this.#animationTimeout) {\n      clearTimeout(this.#animationTimeout);\n    }\n\n    this.#isAnimating = true;\n    this.requestRender();\n\n    this.#animationTimeout = window.setTimeout(() => {\n      this.#isAnimating = false;\n\n      this.requestRender();\n    }, 2000);\n  };\n\n  readonly handleCopyClick = (event: Event): void => {\n    void this.#copyToClipboard(event);\n  };\n\n  handlePreviewClick(event: Event): void {\n    this.#playPreview(event);\n  }\n\n  disconnectedCallback(): void {\n    if (this.#copyTimeout) {\n      clearTimeout(this.#copyTimeout);\n\n      this.#copyTimeout = null;\n    }\n\n    if (this.#animationTimeout) {\n      clearTimeout(this.#animationTimeout);\n\n      this.#animationTimeout = null;\n    }\n  }\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\nexport type Placement =\n  | 'top-start'\n  | 'top-center'\n  | 'top-end'\n  | 'bottom-start'\n  | 'bottom-center'\n  | 'bottom-end'\n  | 'left-start'\n  | 'left-center'\n  | 'left-end'\n  | 'right-start'\n  | 'right-center'\n  | 'right-end';\n\nconst nextAnchorName = (): string => `--ease-popover-anchor-${crypto.randomUUID().slice(0, 8)}`;\n\n@Component({\n  tag: 'ease-popover',\n  autoSlot: false,\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: contents;\n      --ease-popover-offset: 8px;\n      --ease-popover-transform-origin: center center;\n      --ease-popover-duration: 200ms;\n      --ease-popover-content-min-width: auto;\n      --ease-popover-content-max-width: none;\n      --ease-popover-content-width: max-content;\n    }\n\n    ::slotted([slot=\"trigger\"]) {\n      anchor-name: var(--ease-popover-anchor-name);\n    }\n\n    [part=\"content\"] {\n      position: fixed;\n      position-anchor: var(--ease-popover-anchor-name);\n      margin: 0;\n      padding: 0;\n      border: none;\n      background: transparent;\n      overflow: visible;\n      width: var(--ease-popover-content-width);\n      min-width: var(--ease-popover-content-min-width);\n      max-width: var(--ease-popover-content-max-width);\n      box-sizing: border-box;\n    }\n\n    [part=\"content\"]:popover-open {\n      display: block;\n    }\n\n    :host([placement=\"top-start\"]) [part=\"content\"] {\n      position-area: top span-right;\n      margin-bottom: var(--ease-popover-offset);\n    }\n    :host([placement=\"top-center\"]) [part=\"content\"] {\n      position-area: top center;\n      margin-bottom: var(--ease-popover-offset);\n    }\n    :host([placement=\"top-end\"]) [part=\"content\"] {\n      position-area: top span-left;\n      margin-bottom: var(--ease-popover-offset);\n    }\n    :host([placement=\"bottom-start\"]) [part=\"content\"] {\n      position-area: bottom span-right;\n      margin-top: var(--ease-popover-offset);\n    }\n    :host([placement=\"bottom-center\"]) [part=\"content\"] {\n      position-area: bottom center;\n      margin-top: var(--ease-popover-offset);\n    }\n    :host([placement=\"bottom-end\"]) [part=\"content\"] {\n      position-area: bottom span-left;\n      margin-top: var(--ease-popover-offset);\n    }\n    :host([placement=\"left-start\"]) [part=\"content\"] {\n      position-area: left span-bottom;\n      margin-right: var(--ease-popover-offset);\n    }\n    :host([placement=\"left-center\"]) [part=\"content\"] {\n      position-area: left center;\n      margin-right: var(--ease-popover-offset);\n    }\n    :host([placement=\"left-end\"]) [part=\"content\"] {\n      position-area: left span-top;\n      margin-right: var(--ease-popover-offset);\n    }\n    :host([placement=\"right-start\"]) [part=\"content\"] {\n      position-area: right span-bottom;\n      margin-left: var(--ease-popover-offset);\n    }\n    :host([placement=\"right-center\"]) [part=\"content\"] {\n      position-area: right center;\n      margin-left: var(--ease-popover-offset);\n    }\n    :host([placement=\"right-end\"]) [part=\"content\"] {\n      position-area: right span-top;\n      margin-left: var(--ease-popover-offset);\n    }\n  `\n})\nexport class Popover extends HTMLElement {\n  declare requestRender: () => void;\n\n  #anchorName = nextAnchorName();\n\n  @Query<HTMLElement>('[part=\"content\"]')\n  accessor contentElement!: HTMLElement | null;\n\n  @Prop<Placement>({\n    reflect: true,\n    defaultValue: 'bottom-start'\n  })\n  accessor placement!: Placement;\n\n  @Prop<number>({\n    type: Number,\n    reflect: true,\n    defaultValue: 8,\n    onChange() {\n      (this as Popover).handleOffsetChange();\n    }\n  })\n  accessor offset = 8;\n\n  @Prop<boolean>({\n    type: Boolean,\n    reflect: true,\n    onChange() {\n      (this as Popover).handleOpenChange();\n    }\n  })\n  accessor open = false;\n\n  handleOffsetChange(): void {\n    const offset = Number.isFinite(this.offset) ? this.offset : 8;\n    this.style.setProperty('--ease-popover-offset', `${offset}px`);\n  }\n\n  handleOpenChange(): void {\n    const content = this.contentElement;\n    if (!content) {\n      return;\n    }\n\n    if (this.open) {\n      content.showPopover();\n    } else {\n      content.hidePopover();\n    }\n  }\n\n  connectedCallback(): void {\n    this.style.setProperty('--ease-popover-anchor-name', this.#anchorName);\n    this.handleOffsetChange();\n  }\n\n  afterRender(): void {\n    const content = this.contentElement;\n    if (content && this.open) {\n      try {\n        content.showPopover();\n      } catch (_e) {}\n    }\n  }\n\n  render(): TemplateResult {\n    return html`\n      <slot name=\"trigger\"></slot>\n      <div part=\"content\" popover=\"manual\" role=\"region\">\n        <slot></slot>\n      </div>\n    `;\n  }\n}\n\nexport default {\n  Popover\n};\n","export interface DismissContext {\n  owner: HTMLElement;\n  content?: HTMLElement | null;\n  triggers?: Array<HTMLElement | null | undefined>;\n}\n\nexport interface DismissControllerOptions {\n  onDismiss: (event: Event) => void;\n}\n\nexport class DismissController {\n  #onDismiss: (event: Event) => void;\n  #context: {\n    owner: HTMLElement;\n    content: HTMLElement | null;\n    triggers: HTMLElement[];\n  } | null = null;\n  #active = false;\n\n  constructor(options: DismissControllerOptions) {\n    this.#onDismiss = options.onDismiss;\n  }\n\n  connect(context: DismissContext): void {\n    this.#context = {\n      owner: context.owner,\n      content: context.content ?? null,\n      triggers: (context.triggers ?? []).filter((el): el is HTMLElement => el instanceof HTMLElement)\n    };\n\n    if (!this.#active) {\n      document.addEventListener('pointerdown', this.#handlePointerDown, true);\n      document.addEventListener('keydown', this.#handleKeyDown, true);\n      this.#active = true;\n    }\n  }\n\n  disconnect(): void {\n    if (!this.#active) {\n      return;\n    }\n\n    document.removeEventListener('pointerdown', this.#handlePointerDown, true);\n    document.removeEventListener('keydown', this.#handleKeyDown, true);\n    this.#active = false;\n    this.#context = null;\n  }\n\n  #handlePointerDown = (event: PointerEvent): void => {\n    if (!this.#context) {\n      return;\n    }\n\n    const { owner, content, triggers } = this.#context;\n    const path = event.composedPath();\n\n    if (path.some((node) => node instanceof Element && node.hasAttribute('data-select-ignore'))) {\n      return;\n    }\n\n    if (path.includes(owner)) {\n      return;\n    }\n\n    if (content && path.includes(content)) {\n      return;\n    }\n\n    if (triggers.some((trigger) => path.includes(trigger))) {\n      return;\n    }\n\n    this.#onDismiss(event);\n  };\n\n  #handleKeyDown = (event: KeyboardEvent): void => {\n    if (event.key !== 'Escape' || !this.#context) {\n      return;\n    }\n\n    event.preventDefault();\n\n    const active = document.activeElement as HTMLElement | null;\n\n    if (!active) {\n      this.#onDismiss(event);\n      return;\n    }\n\n    const { owner, content, triggers } = this.#context;\n    const path = event.composedPath();\n\n    if (path.includes(owner) || owner.contains(active)) {\n      this.#onDismiss(event);\n      return;\n    }\n\n    if (content && (path.includes(content) || content.contains(active))) {\n      this.#onDismiss(event);\n      return;\n    }\n\n    if (triggers.some((trigger) => path.includes(trigger) || trigger.contains(active))) {\n      this.#onDismiss(event);\n    }\n  };\n}\n","import type { DismissContext } from './dismiss-controller';\n\nimport { DismissController } from './dismiss-controller';\n\nexport interface OutsideClickResolution {\n  owner?: HTMLElement | null | undefined;\n  content?: HTMLElement | null | undefined;\n  triggers?: Array<HTMLElement | null | undefined>;\n}\n\nexport interface OutsideClickHandle {\n  update(): void;\n  disconnect(): void;\n}\n\nexport interface OutsideClickHandleOptions<THost extends HTMLElement> {\n  resolve: (host: THost) => OutsideClickResolution | null | undefined;\n  disabled?: (host: THost) => boolean;\n}\n\nconst registry = new WeakMap<HTMLElement, Set<OutsideClickHandle>>();\n\nconst toDismissContext = <THost extends HTMLElement>(\n  host: THost,\n  options: OutsideClickHandleOptions<THost>\n): DismissContext | null => {\n  if (options.disabled?.(host)) {\n    return null;\n  }\n\n  const resolved = options.resolve(host);\n\n  if (!resolved) {\n    return null;\n  }\n\n  const owner = resolved.owner ?? host ?? null;\n\n  if (!(owner instanceof HTMLElement)) {\n    return null;\n  }\n\n  const content = resolved.content && resolved.content instanceof HTMLElement ? resolved.content : null;\n\n  const triggers = resolved.triggers?.filter((element): element is HTMLElement => element instanceof HTMLElement) ?? [];\n\n  return {\n    owner,\n    content,\n    triggers\n  };\n};\n\nexport const createOutsideClickHandle = <THost extends HTMLElement>(\n  host: THost,\n  onDismiss: (this: THost, event: Event) => void,\n  options: OutsideClickHandleOptions<THost>\n): OutsideClickHandle => {\n  const controller = new DismissController({\n    onDismiss(event) {\n      if (options.disabled?.(host)) {\n        return;\n      }\n\n      onDismiss.call(host, event);\n    }\n  });\n\n  return {\n    update(): void {\n      const context = toDismissContext(host, options);\n      if (!context) {\n        controller.disconnect();\n        return;\n      }\n\n      controller.connect(context);\n    },\n    disconnect(): void {\n      controller.disconnect();\n    }\n  };\n};\n\nexport const registerOutsideClickHandle = (host: HTMLElement, handle: OutsideClickHandle): void => {\n  let handles = registry.get(host);\n\n  if (!handles) {\n    handles = new Set();\n    registry.set(host, handles);\n  }\n\n  handles.add(handle);\n};\n\nexport const updateOutsideClickHandles = (host: HTMLElement): void => {\n  const handles = registry.get(host);\n\n  if (!handles) {\n    return;\n  }\n\n  handles.forEach((handle) => {\n    handle.update();\n  });\n};\n\nexport const disconnectOutsideClickHandles = (host: HTMLElement): void => {\n  const handles = registry.get(host);\n\n  if (!handles) {\n    return;\n  }\n\n  handles.forEach((handle) => {\n    handle.disconnect();\n  });\n};\n\nexport const requestOutsideClickUpdate = (host: HTMLElement): void => {\n  updateOutsideClickHandles(host);\n};\n","import type { OutsideClickResolution } from '~/utils/outside-click';\n\nimport {\n  createOutsideClickHandle,\n  disconnectOutsideClickHandles,\n  registerOutsideClickHandle,\n  updateOutsideClickHandles\n} from '~/utils/outside-click';\n\ntype OutsideClickHost = HTMLElement & {\n  connectedCallback?: (...args: unknown[]) => unknown;\n  disconnectedCallback?: (...args: unknown[]) => unknown;\n  afterRender?: (...args: unknown[]) => unknown;\n};\n\ntype HookName = 'connectedCallback' | 'disconnectedCallback' | 'afterRender';\n\ninterface OutsideClickOptions<THost extends OutsideClickHost> {\n  resolve?: (host: THost) => OutsideClickResolution | null | undefined;\n  owner?: (host: THost) => HTMLElement | null | undefined;\n  content?: (host: THost) => HTMLElement | null | undefined;\n  triggers?: (host: THost) => Array<HTMLElement | null | undefined>;\n  disabled?: (host: THost) => boolean;\n}\n\nconst lifecycleApplied = new WeakSet<OutsideClickHost>();\n\nconst wrapMethod = (\n  host: OutsideClickHost,\n  name: HookName,\n  hook: (this: OutsideClickHost) => void,\n  callHookFirst = false\n): void => {\n  const original = host[name];\n\n  (host as Required<OutsideClickHost>)[name] = function (...args: unknown[]) {\n    if (callHookFirst) {\n      hook.call(this);\n    }\n\n    let result: unknown;\n\n    if (typeof original === 'function') {\n      result = (original as (...params: unknown[]) => unknown).apply(this, args);\n    }\n\n    if (!callHookFirst) {\n      hook.call(this);\n    }\n\n    return result;\n  };\n};\n\nconst ensureLifecycle = (host: OutsideClickHost): void => {\n  if (lifecycleApplied.has(host)) {\n    return;\n  }\n\n  lifecycleApplied.add(host);\n\n  wrapMethod(host, 'connectedCallback', function (this: OutsideClickHost) {\n    updateOutsideClickHandles(this);\n  });\n\n  wrapMethod(host, 'afterRender', function (this: OutsideClickHost) {\n    updateOutsideClickHandles(this);\n  });\n\n  wrapMethod(\n    host,\n    'disconnectedCallback',\n    function (this: OutsideClickHost) {\n      disconnectOutsideClickHandles(this);\n    },\n    true\n  );\n};\n\nexport function OutsideClick<THost extends OutsideClickHost, TEvent extends Event = Event>(\n  options: OutsideClickOptions<THost> = {}\n) {\n  return (\n    originalMethod: (this: THost, event: TEvent) => unknown,\n    context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n  ): void => {\n    context.addInitializer(function (this: THost) {\n      ensureLifecycle(this);\n\n      const resolve =\n        options.resolve ??\n        ((host: THost): OutsideClickResolution => {\n          return {\n            owner: options.owner?.(host),\n            content: options.content?.(host),\n            triggers: options.triggers?.(host)\n          };\n        });\n\n      const handle = createOutsideClickHandle(\n        this,\n        (event) => {\n          originalMethod.call(this, event as TEvent);\n        },\n        {\n          resolve,\n          disabled: options.disabled\n        }\n      );\n\n      registerOutsideClickHandle(this, handle);\n\n      if (this.isConnected) {\n        updateOutsideClickHandles(this);\n      }\n    });\n  };\n}\n\nexport type { OutsideClickOptions };\n\nexport { requestOutsideClickUpdate } from '~/utils/outside-click';\n","import type { Placement } from '~/elements/popover';\nimport '../popover';\n\nimport { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { OutsideClick, requestOutsideClickUpdate } from '~/decorators/OutsideClick';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-tooltip',\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: inline-block;\n      position: relative;\n    }\n\n    ease-popover::part(content) {\n      inset: auto;\n    }\n\n    [data-tooltip-content] {\n      background-color: var(--ease-tooltip-background, var(--color-gray-400));\n      color: var(--ease-tooltip-color, var(--color-gray-900));\n      padding: var(--ease-tooltip-padding, 4px 8px);\n      border-radius: var(--ease-tooltip-radius, 4px);\n      font-family: var(--ease-font-family, inherit);\n      font-size: var(--ease-tooltip-font-size, 10px);\n      font-weight: var(--ease-tooltip-font-weight, 500);\n      max-width: var(--ease-tooltip-max-width, 220px);\n      box-shadow: var(--ease-tooltip-shadow, 0 2px 8px rgba(0, 0, 0, 0.2));\n      display: none;\n    }\n\n    :host([open]) [data-tooltip-content] {\n      display: block;\n    }\n  `\n})\nexport class Tooltip extends HTMLElement {\n  #hoverTimer: number | null = null;\n\n  #trigger: HTMLElement | null = null;\n  #content: HTMLElement | null = null;\n\n  declare requestRender: () => void;\n\n  @Prop<boolean>({\n    type: Boolean,\n    reflect: true,\n    onChange(next, previous) {\n      (this as Tooltip)._handleOpenChange(next, previous);\n    }\n  })\n  accessor open = false;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 300 })\n  accessor delay = 300;\n\n  @Prop<Placement>({ reflect: true, defaultValue: 'top-center' })\n  accessor placement: Placement = 'top-center';\n\n  @Query<HTMLElement>('[slot=\"trigger\"]')\n  accessor triggerElement!: HTMLElement | null;\n\n  @Query<HTMLElement>('[data-tooltip-content]')\n  accessor contentElement!: HTMLElement | null;\n\n  disconnectedCallback(): void {\n    this.#clearTimer();\n    if (this.#trigger) {\n      this.#trigger.removeEventListener('mouseenter', this.#handleEnter);\n      this.#trigger.removeEventListener('mouseleave', this.#handleLeave);\n      this.#trigger.removeEventListener('focusin', this.#handleFocusIn);\n      this.#trigger.removeEventListener('focusout', this.#handleFocusOut);\n      this.#trigger = null;\n    }\n\n    if (this.#content) {\n      this.#content.removeEventListener('mouseenter', this.#handleEnter);\n      this.#content.removeEventListener('mouseleave', this.#handleLeave);\n      this.#content = null;\n    }\n  }\n\n  afterRender(): void {\n    this.#updateListeners();\n    const content = this.contentElement;\n    const isVisible = this.open;\n\n    if (content) {\n      content.setAttribute('role', 'tooltip');\n      content.setAttribute('aria-hidden', isVisible ? 'false' : 'true');\n      content.dataset.open = isVisible ? 'true' : 'false';\n      content.hidden = !isVisible;\n    }\n  }\n\n  render(): TemplateResult {\n    return html`\n      <ease-popover .placement=${this.placement} ?open=${this.open}>\n        <slot name=\"trigger\" slot=\"trigger\"></slot>\n        <div\n          data-tooltip-content\n          role=\"tooltip\"\n          data-open=${this.open ? 'true' : 'false'}\n          ?hidden=${!this.open}\n        >\n          <slot></slot>\n        </div>\n      </ease-popover>\n    `;\n  }\n\n  _handleOpenChange(next: boolean, previous: boolean): void {\n    if (next === previous) {\n      return;\n    }\n\n    if (!next) {\n      this.#clearTimer();\n    }\n\n    requestOutsideClickUpdate(this);\n  }\n\n  @OutsideClick<Tooltip>({\n    content: (host) => host.contentElement,\n    triggers: (host) => [host.triggerElement],\n    disabled: (host) => !host.open\n  })\n  handleOutsideDismiss(): void {\n    if (!this.open) {\n      return;\n    }\n\n    this.#clearTimer();\n    this.open = false;\n  }\n\n  #clearTimer(): void {\n    if (this.#hoverTimer !== null) {\n      window.clearTimeout(this.#hoverTimer);\n      this.#hoverTimer = null;\n    }\n  }\n\n  #startTimer(callback: () => void): void {\n    this.#clearTimer();\n    const wait = this.delay ?? 0;\n\n    if (wait > 0) {\n      this.#hoverTimer = window.setTimeout(callback, wait);\n    } else {\n      callback();\n    }\n  }\n\n  #handleEnter = (): void => {\n    this.#startTimer(() => {\n      this.open = true;\n    });\n  };\n\n  #handleLeave = (): void => {\n    this.#clearTimer();\n    this.open = false;\n  };\n\n  #handleFocusIn = (): void => {\n    this.#clearTimer();\n    this.open = true;\n  };\n\n  #handleFocusOut = (): void => {\n    this.#clearTimer();\n    this.open = false;\n  };\n\n  #updateListeners(): void {\n    const trigger = this.triggerElement;\n    const content = this.contentElement ?? null;\n\n    if (trigger !== this.#trigger) {\n      if (this.#trigger) {\n        this.#trigger.removeEventListener('mouseenter', this.#handleEnter);\n        this.#trigger.removeEventListener('mouseleave', this.#handleLeave);\n        this.#trigger.removeEventListener('focusin', this.#handleFocusIn);\n        this.#trigger.removeEventListener('focusout', this.#handleFocusOut);\n      }\n      if (trigger) {\n        trigger.addEventListener('mouseenter', this.#handleEnter);\n        trigger.addEventListener('mouseleave', this.#handleLeave);\n        trigger.addEventListener('focusin', this.#handleFocusIn);\n        trigger.addEventListener('focusout', this.#handleFocusOut);\n      }\n      this.#trigger = trigger;\n    }\n\n    if (content !== this.#content) {\n      if (this.#content) {\n        this.#content.removeEventListener('mouseenter', this.#handleEnter);\n        this.#content.removeEventListener('mouseleave', this.#handleLeave);\n      }\n      if (content) {\n        content.addEventListener('mouseenter', this.#handleEnter);\n        content.addEventListener('mouseleave', this.#handleLeave);\n      }\n      this.#content = content ?? null;\n    }\n  }\n}\n","import { html } from 'lit-html';\n\nimport { toolbarStyles } from './styles';\nimport {\n  type CubicBezierPoints,\n  EasingType,\n  type LinearPoint,\n  type LinearPoints,\n  MAX_LINEAR_POINTS,\n  MIN_LINEAR_POINTS\n} from './types';\nimport { clampPoint, normalizeLinearPoints } from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { type ControlEventDetail, dispatchControlEvent } from '~/elements/shared';\n\nimport '~/elements/icons/interface/minus';\nimport '~/elements/icons/interface/plus';\nimport '~/elements/button';\nimport '~/elements/tooltip';\n\ntype CurveHost = HTMLElement & {\n  name?: string;\n  easingType: EasingType;\n  points: CubicBezierPoints | LinearPoints;\n  showGrid: boolean;\n  snapToGrid: boolean;\n  gridSize: number;\n  focusedLinearIndex: number | null;\n  handleGridToggle?: (event: CustomEvent<ControlEventDetail<boolean>>) => void;\n  handleSnapToggle?: (event: CustomEvent<ControlEventDetail<boolean>>) => void;\n  handleGridSizeChange?: (event: KeyboardEvent) => void;\n  handlePointsChange?: (event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>) => void;\n  handleLinearPointFocus?: (event: CustomEvent<ControlEventDetail<number | null>>) => void;\n  handleSimplifyChange?: (event: CustomEvent<ControlEventDetail<number>>) => void;\n  handleRoundChange?: (event: CustomEvent<ControlEventDetail<number>>) => void;\n};\n\nconst HOST_HANDLER_MAP = {\n  'grid-toggle': 'handleGridToggle',\n  'snap-toggle': 'handleSnapToggle',\n  'grid-size-change': 'handleGridSizeChange',\n  'points-change': 'handlePointsChange',\n  'linear-point-focus': 'handleLinearPointFocus',\n  'simplify-change': 'handleSimplifyChange',\n  'round-change': 'handleRoundChange'\n} as const;\n\ntype HostEventType = keyof typeof HOST_HANDLER_MAP;\n\n@Component({\n  tag: 'ease-curve-toolbar',\n  styles: toolbarStyles,\n  template(this: CurveToolbar) {\n    const isGridAtMinimum = this.gridSize <= 1;\n    const isGridAtMaximum = this.gridSize >= 24;\n    const isLinear = this.easingType === EasingType.LINEAR;\n    const points = isLinear && Array.isArray(this.points) ? (this.points as LinearPoints) : null;\n\n    return html`\n      <div class=\"toolbar-container\">\n        <div class=\"toolbar-group\">\n\n          <ease-tooltip placement=\"top-center\">\n            <button\n              type=\"button\"\n              class=\"toolbar-button ${this.showGrid ? 'active' : ''}\"\n              @click=${this.toggleGrid}\n              slot=\"trigger\"\n            >\n              <ease-icon-grid state=${this.showGrid ? 'hide' : 'show'}></ease-icon-grid>\n            </button>\n            Toggle Grid\n          </ease-tooltip>\n\n          <ease-tooltip placement=\"top-center\">\n            <button\n              type=\"button\"\n              class=\"toolbar-button ${this.snapToGrid ? 'active' : ''}\"\n              @click=${this.toggleSnapToGrid}\n              slot=\"trigger\"\n            >\n              <ease-icon-snap state=${this.snapToGrid ? 'active' : 'default'}></ease-icon-snap>\n            </button>\n            Snap to Grid\n          </ease-tooltip>\n\n          <ease-tooltip placement=\"top-center\">\n            <button\n              type=\"button\"\n              class=\"toolbar-button\"\n              @click=${this.resetCurve}\n              slot=\"trigger\"\n            >\n              <ease-icon-clear></ease-icon-clear>\n            </button>\n            Reset Curve\n          </ease-tooltip>\n\n          <ease-tooltip placement=\"top-center\">\n            <button\n              type=\"button\"\n              class=\"toolbar-button\"\n              @click=${this.addLinearPoint}\n              ?disabled=${(points && points.length >= MAX_LINEAR_POINTS) || !isLinear}\n              slot=\"trigger\"\n            >\n              <ease-icon-anchor-add></ease-icon-anchor-add>\n            </button>\n            Add Point\n          </ease-tooltip>\n\n          <ease-tooltip placement=\"top-center\">\n            <button\n              type=\"button\"\n              class=\"toolbar-button\"\n              @click=${this.removeLinearPoint}\n              ?disabled=${(points && points.length <= MIN_LINEAR_POINTS) || !isLinear}\n              slot=\"trigger\"\n            >\n              <ease-icon-anchor-remove></ease-icon-anchor-remove>\n            </button>\n            Remove Point\n          </ease-tooltip>\n\n          <ease-tooltip placement=\"top-center\">\n            <button\n              type=\"button\"\n              class=\"toolbar-button\"\n              @click=${this.distributeLinearPoints}\n              ?disabled=${!isLinear}\n              slot=\"trigger\"\n            >\n              <ease-icon-bezier-distribute></ease-icon-bezier-distribute>\n            </button>\n            Distribute Points\n          </ease-tooltip>\n\n          <div class=\"grid-size-controls\">\n            <ease-button\n              class=\"grid-size-button minus\"\n              type=\"button\"\n              block=\"icon\"\n              pill=\"true\"\n              variant=\"headless\"\n              @click=${this.decrementGridSize}\n              ?disabled=${isGridAtMinimum}\n            >\n              <ease-icon-minus></ease-icon-minus>\n            </ease-button>\n            <div class=\"grid-size-value\">\n              ${this.gridSize}x\n            </div>\n            <ease-button\n              class=\"grid-size-button plus\"\n              type=\"button\"\n              block=\"icon\"\n              pill=\"true\"\n              variant=\"headless\"\n              @click=${this.incrementGridSize}\n              ?disabled=${isGridAtMaximum}\n            >\n              <ease-icon-plus></ease-icon-plus>\n            </ease-button>\n          </div>\n        </div>\n\n        <ease-field label=\"Simplify\">\n          <ease-slider .value=${this.simplify} .min=${0} .max=${0.05} .step=${0.001} @input=${this.handleSimplifyInput}></ease-slider>\n        </ease-field>\n\n        <ease-field label=\"Round\">\n          <ease-slider .value=${this.round} .min=${0} .max=${5} .step=${1} @input=${this.handleRoundInput}></ease-slider>\n        </ease-field>\n\n      </div>\n    `;\n  }\n})\nexport class CurveToolbar extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<EasingType>({ reflect: true })\n  accessor easingType!: EasingType;\n\n  @Prop<CubicBezierPoints | LinearPoints>({ type: Object, reflect: false })\n  accessor points!: CubicBezierPoints | LinearPoints;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: true })\n  accessor showGrid!: boolean;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n  accessor snapToGrid!: boolean;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 8 })\n  accessor gridSize: number = 8;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 0 })\n  accessor simplify: number = 0;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 5 })\n  accessor round: number = 5;\n\n  #getEventTarget = (): CurveHost => {\n    const root = this.getRootNode();\n    if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n      return root.host as CurveHost;\n    }\n    return this as unknown as CurveHost;\n  };\n\n  #getLinearPoints = (): LinearPoints | null => {\n    if (!Array.isArray(this.points)) {\n      return null;\n    }\n    return this.points;\n  };\n\n  #notifyHost = <TValue>(type: HostEventType, value: TValue, event: Event): void => {\n    const target = this.#getEventTarget();\n    const detail: ControlEventDetail<TValue> = { name: target.name, value, event };\n    dispatchControlEvent(target, type, detail);\n  };\n\n  #emitPoints = (points: LinearPoints, event: Event): void => {\n    this.points = points;\n    this.#notifyHost('points-change', points, event);\n  };\n\n  readonly toggleGrid = (event: Event): void => {\n    event.preventDefault();\n    const nextValue = !this.showGrid;\n    this.showGrid = nextValue;\n    this.#notifyHost('grid-toggle', nextValue, event);\n  };\n\n  readonly toggleSnapToGrid = (event: Event): void => {\n    event.preventDefault();\n    const nextValue = !this.snapToGrid;\n    this.snapToGrid = nextValue;\n    this.#notifyHost('snap-toggle', nextValue, event);\n  };\n\n  readonly resetCurve = (event: Event): void => {\n    event.preventDefault();\n\n    if (this.easingType === EasingType.CUBIC_BEZIER) {\n      const defaults: CubicBezierPoints = {\n        p1: { x: 0.25, y: 0.1 },\n        p2: { x: 0.25, y: 1 }\n      };\n      this.points = defaults;\n      this.#notifyHost('points-change', defaults, event);\n      return;\n    }\n\n    const defaults: LinearPoints = [\n      { x: 0, y: 0 },\n      { x: 1, y: 1 }\n    ];\n    this.points = defaults;\n    this.#notifyHost('points-change', defaults, event);\n    this.#notifyHost('linear-point-focus', null, event);\n  };\n\n  readonly distributeLinearPoints = (event: Event): void => {\n    event.preventDefault();\n\n    const points = this.#getLinearPoints();\n    if (!points || points.length <= MIN_LINEAR_POINTS) {\n      return;\n    }\n\n    const lastIndex = points.length - 1;\n    const step = lastIndex > 0 ? 1 / lastIndex : 0;\n\n    const distributed: LinearPoints = points.map((point, index) => {\n      const updated: LinearPoint = { ...point };\n\n      if (index === 0) {\n        updated.x = 0;\n      } else if (index === lastIndex) {\n        updated.x = 1;\n      } else {\n        updated.x = Number.parseFloat((step * index).toFixed(4));\n      }\n\n      delete updated.cpInX;\n      delete updated.cpInY;\n      delete updated.cpOutX;\n      delete updated.cpOutY;\n      delete updated.isLinked;\n\n      return updated;\n    });\n\n    const normalizedPoints = normalizeLinearPoints(distributed);\n    this.#emitPoints(normalizedPoints, event);\n  };\n\n  readonly addLinearPoint = (event: Event): void => {\n    event.preventDefault();\n\n    if (this.easingType !== EasingType.LINEAR) {\n      return;\n    }\n\n    const points = this.#getLinearPoints();\n    if (!points || points.length >= MAX_LINEAR_POINTS) {\n      return;\n    }\n\n    let insertIndex = 0;\n    let largestGap = -Infinity;\n\n    for (let index = 0; index < points.length - 1; index += 1) {\n      const start = points[index];\n      const end = points[index + 1];\n\n      if (!start || !end) {\n        continue;\n      }\n\n      const gap = end.x - start.x;\n\n      if (gap > largestGap) {\n        largestGap = gap;\n        insertIndex = index;\n      }\n    }\n\n    const startPoint = points[insertIndex];\n    const endPoint = points[insertIndex + 1];\n\n    if (!startPoint || !endPoint) {\n      return;\n    }\n\n    const newPointPosition = clampPoint(\n      {\n        x: (startPoint.x + endPoint.x) / 2,\n        y: (startPoint.y + endPoint.y) / 2\n      },\n      { minY: -2, maxY: 3 }\n    );\n    const newPoint: LinearPoint = {\n      x: newPointPosition.x,\n      y: newPointPosition.y,\n      cpInX: -0.1,\n      cpInY: 0,\n      cpOutX: 0.1,\n      cpOutY: 0,\n      isLinked: true,\n      mirrorLength: true\n    };\n\n    const updatedPoints: LinearPoints = [\n      ...points.slice(0, insertIndex + 1),\n      newPoint,\n      ...points.slice(insertIndex + 1)\n    ];\n\n    const insertedIndex = insertIndex + 1;\n    const normalizedPoints = normalizeLinearPoints(updatedPoints);\n    this.#emitPoints(normalizedPoints, event);\n    this.#notifyHost('linear-point-focus', insertedIndex, event);\n  };\n\n  readonly removeLinearPoint = (event: Event): void => {\n    event.preventDefault();\n\n    if (this.easingType !== EasingType.LINEAR) {\n      return;\n    }\n\n    const points = this.#getLinearPoints();\n    if (!points || points.length <= MIN_LINEAR_POINTS) {\n      return;\n    }\n\n    let removeIndex = 1;\n    let smallestSpan = Number.POSITIVE_INFINITY;\n\n    for (let index = 1; index < points.length - 1; index += 1) {\n      const previous = points[index - 1];\n      const next = points[index + 1];\n\n      if (!previous || !next) {\n        continue;\n      }\n\n      const span = next.x - previous.x;\n\n      if (span < smallestSpan) {\n        smallestSpan = span;\n        removeIndex = index;\n      }\n    }\n\n    if (removeIndex > 0 && removeIndex < points.length - 1) {\n      const updatedPoints: LinearPoints = points\n        .filter((_, pointIndex) => pointIndex !== removeIndex)\n        .map((point) => {\n          return { ...point };\n        });\n\n      const normalizedPoints = normalizeLinearPoints(updatedPoints);\n      this.#emitPoints(normalizedPoints, event);\n\n      const nextIndex = removeIndex - 1;\n      this.#notifyHost('linear-point-focus', nextIndex, event);\n    }\n  };\n\n  readonly incrementGridSize = (event: Event): void => {\n    event.preventDefault();\n    this.#commitGridSize(this.gridSize + 1, event);\n  };\n\n  readonly decrementGridSize = (event: Event): void => {\n    event.preventDefault();\n    this.#commitGridSize(this.gridSize - 1, event);\n  };\n\n  readonly handleSimplifyInput = (event: Event): void => {\n    const customEvent = event as CustomEvent<ControlEventDetail<number>>;\n    const value = customEvent.detail?.value ?? 0;\n    this.simplify = Number(value);\n    this.#notifyHost('simplify-change', this.simplify, event);\n  };\n\n  readonly handleRoundInput = (event: Event): void => {\n    const customEvent = event as CustomEvent<ControlEventDetail<number>>;\n    const value = customEvent.detail?.value ?? 0;\n    this.round = Number(value);\n    this.#notifyHost('round-change', this.round, event);\n  };\n\n  #clampGridSize = (value: number): number => Math.max(1, Math.min(24, Math.round(value)));\n\n  #commitGridSize = (value: number, event: Event): void => {\n    const nextValue = this.#clampGridSize(value);\n    if (this.gridSize === nextValue) {\n      this.requestRender();\n      return;\n    }\n    this.gridSize = nextValue;\n    this.#notifyHost('grid-size-change', this.gridSize, event);\n    this.requestRender();\n  };\n}\n","import { html } from 'lit-html';\n\nimport { cubicBezierToLinearPoints } from './bezier-conversion';\nimport { containerStyles } from './styles';\nimport { type CubicBezierPoints, EasingType, type LinearPoints, MIN_LINEAR_POINTS } from './types';\nimport { MIN_LINEAR_DELTA, normalizeLinearPoints } from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { type ControlEventDetail, dispatchControlEvent } from '~/elements/shared';\n\n@Component({\n  tag: 'ease-curve',\n  styles: containerStyles,\n  template(this: Curve) {\n    return html`\n      <div class=\"curve-container\">\n        <div class=\"curve-header\">\n          <ease-curve-controls\n            .easingType=${this.easingType}\n            .points=${this.points}\n            .showGrid=${this.showGrid}\n            .snapToGrid=${this.snapToGrid}\n            .gridSize=${this.gridSize}\n            .focusedLinearIndex=${this.focusedLinearIndex}\n          ></ease-curve-controls>\n        </div>\n\n        <div class=\"curve-canvas-wrapper\">\n          <div class=\"curve-canvas\">\n            <ease-curve-canvas\n              .easingType=${this.easingType}\n              .points=${this.points}\n              .showGrid=${this.showGrid}\n              .snapToGrid=${this.snapToGrid}\n              .gridSize=${this.gridSize}\n              .focusedLinearIndex=${this.focusedLinearIndex}\n              .simplify=${this.simplify}\n              .round=${this.round}\n            ></ease-curve-canvas>\n          </div>\n          <ease-curve-canvas-controls\n            .easingType=${this.easingType}\n            .points=${this.points}\n            .focusedLinearIndex=${this.focusedLinearIndex}\n          ></ease-curve-canvas-controls>\n        </div>\n\n        <div class=\"curve-toolbar\">\n          <ease-curve-toolbar\n            .easingType=${this.easingType}\n            .points=${this.points}\n            .showGrid=${this.showGrid}\n            .snapToGrid=${this.snapToGrid}\n            .gridSize=${this.gridSize}\n            .simplify=${this.simplify}\n            .round=${this.round}\n          ></ease-curve-toolbar>\n        </div>\n\n        <!-- <div class=\"curve-footer\">\n          <ease-curve-output\n            .easingType=${this.easingType}\n            .points=${this.points}\n            .name=${this.name}\n            .simplify=${this.simplify}\n            .round=${this.round}\n          ></ease-curve-output>\n        </div> -->\n      </div>\n    `;\n  }\n})\nexport class Curve extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<string>({ reflect: true, defaultValue: 'ease-custom' })\n  accessor name!: string;\n\n  @Prop<EasingType, Curve>({\n    reflect: true,\n    defaultValue: EasingType.CUBIC_BEZIER,\n    onChange(this: Curve, next: EasingType, previous: EasingType) {\n      if (next !== previous) {\n        this.points = this.getDefaultPointsForType(next);\n        this.focusedLinearIndex = null;\n      }\n    }\n  })\n  accessor easingType!: EasingType;\n\n  @Prop<CubicBezierPoints | LinearPoints>({\n    type: Object,\n    reflect: false,\n    defaultValue: () => {\n      return { p1: { x: 0.25, y: 0.1 }, p2: { x: 0.25, y: 1 } };\n    }\n  })\n  accessor points!: CubicBezierPoints | LinearPoints;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: true })\n  accessor showGrid!: boolean;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n  accessor snapToGrid!: boolean;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 8 })\n  accessor gridSize!: number;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 0 })\n  accessor simplify!: number;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 5 })\n  accessor round!: number;\n\n  @Prop<number | null>({ type: Number, reflect: false, defaultValue: null })\n  accessor focusedLinearIndex: number | null = null;\n\n  private getDefaultPointsForType(type: EasingType): CubicBezierPoints | LinearPoints {\n    return type === EasingType.CUBIC_BEZIER\n      ? { p1: { x: 0.25, y: 0.1 }, p2: { x: 0.25, y: 1 } }\n      : [\n          { x: 0, y: 0 },\n          { x: 1, y: 1 }\n        ];\n  }\n\n  @Listen<Curve, CustomEvent<ControlEventDetail<EasingType>>>('easing-type-change', { target: 'light' })\n  handleEasingTypeChange(event: CustomEvent<ControlEventDetail<EasingType>>): void {\n    const { value } = event.detail;\n\n    if (this.easingType === value) {\n      return;\n    }\n\n    const previousType = this.easingType;\n    const previousPoints = this.points;\n    this.easingType = value;\n    this.focusedLinearIndex = null;\n\n    if (previousType === EasingType.CUBIC_BEZIER && value === EasingType.LINEAR) {\n      if (previousPoints && !Array.isArray(previousPoints)) {\n        const bezierPoints = previousPoints as CubicBezierPoints;\n        const linearPoints = cubicBezierToLinearPoints(bezierPoints);\n        this.points = linearPoints;\n        this.emitPointsChange(linearPoints, event.detail.event);\n        return;\n      } else {\n        this.points = this.getDefaultPointsForType(value);\n        this.emitPointsChange(this.points, event.detail.event);\n        return;\n      }\n    } else if (previousType === EasingType.LINEAR && value === EasingType.CUBIC_BEZIER) {\n      this.points = this.getDefaultPointsForType(value);\n      this.emitPointsChange(this.points, event.detail.event);\n      return;\n    } else {\n      this.points = this.getDefaultPointsForType(value);\n      this.emitPointsChange(this.points, event.detail.event);\n      return;\n    }\n  }\n\n  @Listen<Curve, CustomEvent<ControlEventDetail<boolean>>>('grid-toggle', { target: 'light' })\n  handleGridToggle(event: CustomEvent<ControlEventDetail<boolean>>): void {\n    const { value } = event.detail;\n\n    if (this.showGrid === value) {\n      return;\n    }\n\n    this.showGrid = value;\n  }\n\n  @Listen<Curve, CustomEvent<ControlEventDetail<boolean>>>('snap-toggle', { target: 'light' })\n  handleSnapToggle(event: CustomEvent<ControlEventDetail<boolean>>): void {\n    const { value } = event.detail;\n\n    if (this.snapToGrid === value) {\n      return;\n    }\n\n    this.snapToGrid = value;\n  }\n\n  @Listen<Curve, CustomEvent<ControlEventDetail<number>>>('grid-size-change', { target: 'light' })\n  handleGridSizeChange(event: CustomEvent<ControlEventDetail<number>>): void {\n    let { value } = event.detail;\n    value = Math.max(1, Math.min(24, value));\n    if (this.gridSize === value) {\n      return;\n    }\n    this.gridSize = value;\n    this.requestRender();\n  }\n\n  @Listen<Curve, CustomEvent<ControlEventDetail<number>>>('simplify-change', { target: 'light' })\n  handleSimplifyChange(event: CustomEvent<ControlEventDetail<number>>): void {\n    const { value } = event.detail;\n    if (this.simplify === value) {\n      return;\n    }\n    this.simplify = value;\n    this.requestRender();\n  }\n\n  @Listen<Curve, CustomEvent<ControlEventDetail<number>>>('round-change', { target: 'light' })\n  handleRoundChange(event: CustomEvent<ControlEventDetail<number>>): void {\n    const { value } = event.detail;\n    if (this.round === value) {\n      return;\n    }\n    this.round = value;\n    this.requestRender();\n  }\n\n  @Listen<Curve, CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>>('points-change', {\n    target: 'light'\n  })\n  handlePointsChange(event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>): void {\n    const { value } = event.detail;\n    this.points = value;\n\n    if (Array.isArray(value)) {\n      if (this.focusedLinearIndex !== null) {\n        if (this.focusedLinearIndex >= value.length) {\n          this.focusedLinearIndex = value.length - 1;\n        }\n      }\n    } else {\n      this.focusedLinearIndex = null;\n    }\n  }\n\n  @Listen<Curve, KeyboardEvent>('keydown', { target: 'window', passive: false })\n  handleKeyboardShortcuts(event: KeyboardEvent): void {\n    if (event.defaultPrevented) {\n      return;\n    }\n\n    const activeElement = event.target;\n\n    if (\n      activeElement instanceof HTMLInputElement ||\n      activeElement instanceof HTMLTextAreaElement ||\n      (activeElement instanceof HTMLElement && activeElement.isContentEditable)\n    ) {\n      return;\n    }\n\n    if (this.easingType !== EasingType.LINEAR || !Array.isArray(this.points)) {\n      return;\n    }\n\n    const index = this.focusedLinearIndex;\n\n    if (index === null) {\n      return;\n    }\n\n    const lastIndex = this.points.length - 1;\n    const clonedPoints: LinearPoints = this.points.map((point) => {\n      return { ...point };\n    });\n    const point = clonedPoints[index];\n\n    if (!point) {\n      return;\n    }\n\n    const step = event.shiftKey ? 0.05 : 0.01;\n    let handled = false;\n\n    switch (event.key) {\n      case 'ArrowLeft': {\n        if (index <= 0 || index >= lastIndex) {\n          break;\n        }\n        const previous = clonedPoints[index - 1];\n        const next = clonedPoints[index + 1];\n\n        if (!previous || !next) {\n          break;\n        }\n\n        const minX = previous.x + MIN_LINEAR_DELTA;\n        const maxX = next.x - MIN_LINEAR_DELTA;\n        point.x = Math.min(Math.max(point.x - step, minX), maxX);\n        handled = true;\n        break;\n      }\n      case 'ArrowRight': {\n        if (index <= 0 || index >= lastIndex) {\n          break;\n        }\n        const previous = clonedPoints[index - 1];\n        const next = clonedPoints[index + 1];\n\n        if (!previous || !next) {\n          break;\n        }\n\n        const minX = previous.x + MIN_LINEAR_DELTA;\n        const maxX = next.x - MIN_LINEAR_DELTA;\n        point.x = Math.min(Math.max(point.x + step, minX), maxX);\n        handled = true;\n        break;\n      }\n      case 'ArrowUp': {\n        point.y = Math.min(Math.max(point.y + step, 0), 1);\n        handled = true;\n        break;\n      }\n      case 'ArrowDown': {\n        point.y = Math.min(Math.max(point.y - step, 0), 1);\n        handled = true;\n        break;\n      }\n      case 'Delete':\n      case 'Backspace': {\n        if (clonedPoints.length <= MIN_LINEAR_POINTS || index <= 0 || index >= lastIndex) {\n          break;\n        }\n\n        clonedPoints.splice(index, 1);\n\n        const normalized = normalizeLinearPoints(clonedPoints);\n        this.points = normalized;\n        this.emitPointsChange(normalized, event);\n\n        const nextFocus = index - 1;\n\n        this.focusedLinearIndex = nextFocus;\n        handled = true;\n        break;\n      }\n      default:\n        break;\n    }\n\n    if (handled && event.key !== 'Delete' && event.key !== 'Backspace') {\n      const normalized = normalizeLinearPoints(clonedPoints);\n      this.points = normalized;\n      this.emitPointsChange(normalized, event);\n      this.focusedLinearIndex = index;\n    }\n\n    if (handled) {\n      event.preventDefault();\n    }\n  }\n\n  @Listen<Curve, CustomEvent<ControlEventDetail<number | null>>>('linear-point-focus', { target: 'light' })\n  handleLinearPointFocus(event: CustomEvent<ControlEventDetail<number | null>>): void {\n    const { value } = event.detail;\n    if (this.focusedLinearIndex === value) {\n      return;\n    }\n    this.focusedLinearIndex = value ?? null;\n  }\n\n  private emitPointsChange(value: CubicBezierPoints | LinearPoints, sourceEvent?: Event): void {\n    const detail: ControlEventDetail<CubicBezierPoints | LinearPoints> = {\n      name: this.name,\n      value,\n      event: sourceEvent ?? new Event('points-change')\n    };\n\n    dispatchControlEvent(this, 'points-change', detail);\n  }\n}\n\nimport './canvas';\nimport './canvas-controls';\nimport './controls';\nimport './output';\nimport './toolbar';\n\nexport {\n  type CubicBezierPoints,\n  type EasingData,\n  EasingType,\n  type LinearPoints,\n  type Point\n} from './types';\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\n@Component({\n  tag: 'ease-button',\n  autoSlot: true,\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: block;\n      width: 100%;\n    }\n\n    :host([data-variant=\"headless\"]) {\n      display: inline-flex;\n      width: auto;\n    }\n\n    button {\n      appearance: none;\n      font-family: var(--ease-font-family, inherit);\n      font-optical-sizing: auto;\n      font-size: var(--ease-button-font-size, var(--ease-font-size-sm, 12px));\n      font-weight: 550;\n      color: var(--ease-button-color, var(--color-blue-100));\n      min-width: 0;\n      padding: var(--ease-button-padding, 7px 8px);\n      display: block;\n      border-radius: var(--ease-button-radius, 5px);\n      background-color: var(--ease-button-background, var(--color-gray-850));\n      border: none;\n      outline: none;\n      margin: 0;\n      line-height: var(--ease-button-line-height, 14px);\n      box-shadow: inset 0 1px .25px 0 var(--color-white-4), 0 1px 2.5px 0 var(--color-black-8);\n      transition: color 0.2s, background-color 0.2s, scale 0.2s, box-shadow 0.2s;\n      cursor: pointer;\n      min-width: var(--ease-button-min-width, 88px);\n      white-space: nowrap;\n      overflow: hidden;\n      position: relative;\n      text-overflow: ellipsis;\n      text-align: center;\n\n      &[data-pill=\"true\"] {\n        border-radius: 999px;\n      }\n\n      &[data-full-width=\"true\"] {\n        width: 100%;\n      }\n\n      &[data-block=\"icon\"] {\n        --ease-icon-size: 16px;\n        width: 28px;\n        height: 28px;\n        min-width: 28px;\n        padding: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        color: var(--color-gray-700);\n\n        &:hover,\n        &:focus-visible {\n          color: var(--ease-button-hover-color, var(--color-blue-100));\n        }\n\n        &[data-variant=\"headless\"] {\n          --ease-icon-size: 16px;\n          width: auto;\n          height: auto;\n          padding: 0;\n          min-width: 0;\n          margin: -1px;\n        }\n      }\n      \n      &[data-block=\"small\"] {\n        padding: 5px 8px;\n        font-size: 12px;\n        line-height: 14px;\n        border-radius: 5px;\n      }\n      \n      &[data-block=\"large\"] {\n        padding: 9px 12px;\n        font-size: 13px;\n        line-height: 14px;\n        border-radius: 8px;\n      }\n\n      &:hover,\n      &:focus-visible {\n        background-color: var(--ease-button-hover-background-color, var(--color-gray-825));\n        color: var(--ease-button-hover-color, var(--color-blue-100));\n      }\n\n      &[data-variant=\"headless\"],\n      &[data-variant=\"headless-muted\"] {\n        background-color: transparent;\n        box-shadow: none;\n        min-width: 0;\n        width: auto;\n        padding: 0;\n        transition: scale 0.2s, color 0.2s;\n\n        &:hover,\n        &:focus-visible {\n          scale: 1.05;\n        }\n\n        &:active {\n          scale: 0.95;\n        }\n      }\n\n      &[data-variant=\"headless-muted\"] {\n        color: var(--ease-button-color, var(--color-gray-600));\n\n        &:hover,\n        &:focus-visible {\n          color: var(--ease-button-hover-color, var(--color-blue-100));\n        }\n      }\n\n      &[data-variant=\"link\"] {\n        background-color: transparent;\n        box-shadow: none;\n\n        &:hover,\n        &:focus-visible {\n          background-color: var(--ease-button-hover-background-color, var(--color-gray-875));\n        }\n      }\n\n      &[data-variant=\"primary\"] {\n        color: var(--color-blue-100);\n        font-weight: 450;\n        border-radius: 36px;\n        \n        background: radial-gradient(217.29% 45.98% at 99.13% 4.17%, rgba(21, 24, 220, 0.40) 0%, rgba(21, 24, 220, 0.00) 100%), radial-gradient(104.75% 41.7% at 3.06% 100%, rgba(233, 208, 254, 0.30) 0%, rgba(21, 24, 220, 0.00) 100%), radial-gradient(30.53% 47.92% at 46.51% -14.58%, rgba(233, 208, 254, 0.60) 0%, rgba(21, 24, 220, 0.00) 100%), radial-gradient(22.57% 35.42% at 46.29% 112.5%, rgba(233, 208, 254, 0.20) 0%, rgba(21, 24, 220, 0.00) 100%), rgba(255, 255, 255, 0.12);\n        background-repeat: no-repeat;\n\n        box-shadow: \n          0px 1px 0px 0px rgba(255, 255, 255, 0.2), \n          inset 0px 0px 50px 0px rgba(255, 255, 255, 0.02), \n          inset 0px 0px 0px 1px rgba(255, 255, 255, 0.02), \n          inset 0px 0px 4px 0px rgba(69, 40, 255, 0.4);\n\n\n        &::before {\n          content: '';\n          position: absolute;\n          inset: 0;\n          background-color: var(--color-white-2);\n          box-shadow: inset 0px 0.5px 0.75px 0px var(--color-white-30);\n          mix-blend-mode: overlay;\n          pointer-events: none;\n          z-index: 1;\n          border-radius: inherit;\n        }\n\n        &:hover,\n        &:focus-visible {\n           filter: brightness(1.1);\n        }\n      }\n    }\n  `\n})\nexport class Button extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled: boolean = false;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor pill: boolean = false;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor fullWidth: boolean = false;\n\n  @Prop<'submit' | 'reset' | 'button'>({ type: String, reflect: true, defaultValue: 'button' })\n  accessor type!: 'submit' | 'reset' | 'button';\n\n  @Prop<'icon' | 'small' | 'medium' | 'large'>({\n    type: String,\n    reflect: true,\n    defaultValue: 'medium',\n    onAttributeChange() {\n      this.requestRender?.();\n    }\n  })\n  accessor block: 'icon' | 'small' | 'medium' | 'large' = 'medium';\n\n  @Prop<'default' | 'primary' | 'headless' | 'headless-muted' | 'link'>({\n    type: String,\n    reflect: true,\n    defaultValue: 'default'\n  })\n  accessor variant!: 'default' | 'primary' | 'headless' | 'headless-muted' | 'link';\n\n  render(): TemplateResult {\n    return html`\n      <button\n        type=${this.type}\n        ?disabled=${this.disabled}\n        data-variant=${this.variant}\n        data-full-width=${this.fullWidth}\n        data-pill=${this.pill}\n        data-block=\"${this.block}\"\n      >\n        <slot></slot>\n      </button>\n    `;\n  }\n}\n","/**\n * Standard control event detail interface for Leva/lil-gui style state aggregation.\n * All control components should dispatch events with this shape.\n */\nexport interface ControlEventDetail<TValue = unknown> {\n  /** The control's name/identifier for state aggregation */\n  name?: string;\n  /** The current value of the control */\n  value: TValue;\n  /** The original DOM event that triggered this change */\n  event: Event;\n}\n\n/** The standard event type for control value changes */\nexport const CONTROL_CHANGE_EVENT = 'control-change';\n\n/**\n * Dispatch a control change event with standard shape.\n * Events bubble and are composed (cross shadow DOM boundaries).\n *\n * @param host - The element dispatching the event\n * @param type - Event type (prefer CONTROL_CHANGE_EVENT for standard controls)\n * @param detail - Event detail with value and optional name\n *\n * @example\n * ```ts\n * dispatchControlEvent(this, CONTROL_CHANGE_EVENT, {\n *   name: this.name,\n *   value: this.value,\n *   event: e\n * });\n * ```\n */\nexport const dispatchControlEvent = <THost extends HTMLElement, TValue>(\n  host: THost,\n  type: string,\n  detail: ControlEventDetail<TValue>\n): void => {\n  host.dispatchEvent(\n    new CustomEvent<ControlEventDetail<TValue>>(type, {\n      detail,\n      bubbles: true,\n      composed: true\n    })\n  );\n};\n\nexport const setBooleanAttribute = (element: Element | null | undefined, name: string, value: boolean): void => {\n  if (!element) {\n    return;\n  }\n\n  if (value) {\n    element.setAttribute(name, '');\n  } else {\n    element.removeAttribute(name);\n  }\n};\n\nexport const coerceNumber = (value: string): number | null => {\n  if (value === '') {\n    return null;\n  }\n\n  const parsed = Number(value);\n  return Number.isNaN(parsed) ? null : parsed;\n};\n\ntype ControlElement = Element & {\n  value?: unknown;\n  checked?: unknown;\n};\n\nexport const readControlValue = (element: ControlElement): string | null => {\n  if (typeof element.value === 'string' || typeof element.value === 'number') {\n    return String(element.value);\n  }\n\n  if (typeof element.checked === 'boolean') {\n    return element.checked ? 'true' : 'false';\n  }\n\n  if ('getAttribute' in element) {\n    const attr = (element as Element).getAttribute('value');\n    if (attr !== null) {\n      return attr;\n    }\n  }\n\n  return element.textContent?.trim() ?? null;\n};\n","import { html } from 'lit-html';\n\nimport { CONTROL_CHANGE_EVENT, dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-checkbox',\n  styles: `\n    .checkbox {\n      display: table;\n      border-radius: var(--ease-checkbox-radius, 5px);\n      position: relative;\n\n      svg {\n        display: block;\n        position: absolute;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        top: 0;\n        pointer-events: none;\n        fill: var(--ease-checkbox-check-color, var(--color-blue-100));\n        transform: scale(1.01) translateZ(0);\n\n        .tick {\n          fill: none;\n          stroke-width: 3px;\n          stroke-linecap: round;\n          stroke-linejoin: round;\n          stroke: var(--ease-checkbox-check-color, var(--color-blue-100));\n          transform-origin: 10.5px 16px;\n          transform: scale(1) translateZ(0);\n        }\n\n        .dot {\n          transform-origin: 10.5px 15.5px;\n          transform: scale(1) translateZ(0);\n          transform-box: fill-box;\n        }\n\n         .drop {\n          transform-origin: 25px -1px;\n          transform: scale(1) translateZ(0);\n          opacity: 0;\n        }\n      }\n    }\n\n    [part=\"checkbox\"] {\n      display: table;\n      margin: 0;\n      padding: 0;\n      appearance: none;\n      cursor: pointer;\n      background: none;\n      border: none;\n      outline: none;\n    }\n\n    [part=\"control\"] {\n      appearance: none;\n      outline: none;\n      border: none;\n      background: none;\n      display: block;\n      cursor: pointer;\n      margin: 0;\n      padding: 0;\n      border-radius: inherit;\n      width: var(--ease-checkbox-size, 24px);\n      height: var(--ease-checkbox-size, 24px);\n    }\n\n    [part=\"control\"] {\n      box-shadow: inset 0 0 0 var(--ease-checkbox-border-width, 2px) var(--ease-checkbox-border-color, var(--color-gray-700));\n    }\n\n    .tick {\n      stroke-dasharray: 16px 33px;\n      stroke-dashoffset: 20.5px;\n    }\n\n    .dot {\n      transform: translate(14px, -14px) scale(1) translateZ(0);\n      opacity: 0;\n    }\n\n    [part=\"control\"]:checked {\n      box-shadow: inset 0 0 0 var(--ease-checkbox-checked-fill-size, 12px) var(--ease-checkbox-checked-fill, var(--color-blue-800));\n    }\n\n    [part=\"control\"]:checked + svg .tick {\n      stroke-dasharray: 16.5px 33px;\n      stroke-dashoffset: 46.5px;\n    }\n\n    [part=\"control\"]:checked + svg .dot {\n      transform: translate(0px, 0px) scale(1) translateZ(0);\n      opacity: 1;\n    }\n\n    [part=\"checkbox\"] [part=\"control\"].anim-checked {\n      animation: checkbox-border-fill 0.2s ease-out forwards, checkbox-morph 0.5s ease-out forwards;\n    }\n\n    [part=\"checkbox\"] [part=\"control\"].anim-checked + svg {\n      .tick {\n        animation: checkbox-tick 0.65s ease-out forwards;\n      }\n\n      .dot {\n        animation: checkbox-dot-move 0.6s ease-out forwards;\n      }\n    }\n\n    [part=\"checkbox\"] [part=\"control\"].anim-unchecked {\n      animation: checkbox-border-default 0.4s ease-out forwards;\n    }\n\n    [part=\"checkbox\"] [part=\"control\"].anim-unchecked + svg {\n      .tick {\n        animation: checkbox-tick-default 0.2s ease-out forwards;\n      }\n      .dot {\n        animation: checkbox-dot-hide 0.2s ease-out forwards;\n      }\n    }\n      \n    @keyframes checkbox-border-fill {\n      0% {\n        box-shadow: inset 0 0 0 var(--ease-checkbox-border-width, 2px) var(--ease-checkbox-border-color, var(--color-gray-700));\n      }\n        100% {\n            box-shadow: inset 0 0 0 var(--ease-checkbox-checked-fill-size, 12px) var(--ease-checkbox-checked-fill, var(--color-blue-800));\n        }\n    }\n\n    @keyframes checkbox-morph {\n      0%, 40% {\n        border-radius: 5px 14px 5px 5px;\n      }\n      100% {\n        border-radius: 5px;\n      }\n    }\n\n    @keyframes checkbox-tick {\n        0% {\n            stroke-dasharray: 16px 33px;\n            stroke-dashoffset: 20.5px;\n        }\n        47% {\n            stroke-dasharray: 14px 33px;\n            stroke-dashoffset: 48px;\n        }\n        100% {\n            stroke-dasharray: 16.5px 33px;\n            stroke-dashoffset: 46.5px;\n        }\n    }\n\n    @keyframes checkbox-dot-move {\n        0%, 40% {\n            transform: translate(14px, -14px) scale(1) translateZ(0);\n            opacity: 0;\n        }\n        100% {\n            transform: translate(0px, 0px) scale(1) translateZ(0);\n            opacity: 1;\n        }\n    }\n\n    @keyframes checkbox-dot-hide {\n        0% {\n            transform: translate(0px, 0px) scale(1) translateZ(0);\n            opacity: 1;\n        }\n        100% {\n            transform: translate(14px, -14px) scale(1) translateZ(0);\n            opacity: 0;\n        }\n    }\n\n    @keyframes checkbox-border-default {\n        0%,\n        40% {\n            box-shadow: inset 0 0 0 var(--ease-checkbox-checked-fill-size, 12px) var(--ease-checkbox-checked-fill, var(--color-blue-800));\n        }\n        100% {\n            box-shadow: inset 0 0 0 var(--ease-checkbox-border-width, 2px) var(--ease-checkbox-border-color, var(--color-gray-700));\n        }\n    }\n\n    @keyframes checkbox-tick-default {\n        0% {\n            stroke-dasharray: 16.5px 33px;\n            stroke-dashoffset: 46.5px;\n        }\n        100% {\n            stroke-dasharray: 16px 33px;\n            stroke-dashoffset: 20.5px;\n        }\n    }\n  `,\n  template(this: Checkbox) {\n    return html`\n      <button\n        part=\"checkbox\"\n        type=\"button\"\n        role=\"checkbox\"\n        aria-checked=${this.checked}\n        ?disabled=${this.disabled}\n      >\n        <div class=\"checkbox\">\n          <input\n            part=\"control\"\n            name=${this.name}\n            value=${this.value}\n            ?checked=${this.checked}\n            ?disabled=${this.disabled}\n            type=\"checkbox\"\n          />\n          <svg viewBox=\"0 0 24 24\" filter=\"url(#${this.filterId})\">\n            <path class=\"tick\" d=\"M4.5 10L10.5 16L24.5 1\" />\n            <circle class=\"dot\" cx=\"10.5\" cy=\"15.5\" r=\"1.5\" />\n            <circle class=\"drop\" cx=\"25\" cy=\"-1\" r=\"2\" />\n          </svg>\n        </div>\n\n        <svg style=\"display: none;\">\n          <defs>\n            <filter id=\"${this.filterId}\">\n              <feGaussianBlur\n                in=\"SourceGraphic\"\n                stdDeviation=\"1.25\"\n                result=\"blur\"\n              />\n              <feColorMatrix\n                in=\"blur\"\n                mode=\"matrix\"\n                values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 20 -9\"\n                result=\"gooey\"\n              />\n              <feBlend in=\"SourceGraphic\" in2=\"gooey\" />\n            </filter>\n          </defs>\n        </svg>\n      </button>\n    `;\n  }\n})\nexport class Checkbox extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor checked!: boolean;\n\n  @Prop<string | null>({ reflect: true })\n  accessor name!: string | null;\n\n  @Prop<string | null>({ reflect: true })\n  accessor value!: string | null;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled!: boolean;\n\n  @Query<HTMLButtonElement>('button')\n  accessor control!: HTMLButtonElement | null;\n\n  private _prevChecked?: boolean;\n\n  filterId: string = `goo-${crypto.randomUUID()}`;\n\n  connectedCallback(): void {\n    this._prevChecked = this.checked;\n  }\n\n  afterRender(): void {\n    if (!this.control) {\n      return;\n    }\n\n    const changed = typeof this._prevChecked !== 'undefined' && this.checked !== this._prevChecked;\n\n    if (changed) {\n      this._triggerAnimation(this.checked);\n      this._prevChecked = this.checked;\n    }\n\n    const control = this.control;\n    control.setAttribute('aria-checked', this.checked ? 'true' : 'false');\n    control.disabled = Boolean(this.disabled);\n    setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n  }\n\n  private _triggerAnimation(checked: boolean): void {\n    const control = this.shadowRoot?.querySelector('[part=\"control\"]');\n    const svg = this.shadowRoot?.querySelector('svg');\n    if (!control || !svg) {\n      return;\n    }\n\n    control.classList.remove('anim-checked', 'anim-unchecked');\n    svg.classList.remove('anim-checked', 'anim-unchecked');\n\n    const animClass = checked ? 'anim-checked' : 'anim-unchecked';\n    const duration = checked ? 650 : 400;\n\n    control.classList.add(animClass);\n    svg.classList.add(animClass);\n\n    setTimeout(() => {\n      control.classList.remove(animClass);\n      svg.classList.remove(animClass);\n    }, duration);\n  }\n\n  @Listen<Checkbox, MouseEvent, HTMLButtonElement>('click', {\n    selector: 'button'\n  })\n  handleClick(event: MouseEvent): void {\n    if (this.disabled) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      return;\n    }\n\n    this.checked = !this.checked;\n\n    const name = this.name ?? this.getAttribute('name') ?? undefined;\n\n    const detail = { name, value: this.checked, event };\n\n    dispatchControlEvent(this, 'checkbox', detail);\n    dispatchControlEvent(this, 'change', detail);\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\ntype ChevronState = 'down' | 'up';\ntype ChevronPath = Record<ChevronState, string>;\n\n@Component({\n  tag: 'ease-icon-chevron',\n  styles: `\n    :host {\n      display: contents;\n    }\n\n    [part=\"chevron\"] {\n      display: block;\n      width: var(--ease-icon-size, 16px);\n      height: var(--ease-icon-size, 16px);\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  observedAttributes: ['state']\n})\nexport class IconChevron extends HTMLElement {\n  declare requestRender: () => void;\n\n  accessor paths: ChevronPath = {\n    down: 'M5 7L8 10L11 7',\n    up: 'M5 9L8 6L11 9'\n  };\n\n  @Prop<ChevronState>({\n    reflect: true,\n    attribute: 'state',\n    defaultValue: 'down',\n    onAttributeChange(next: ChevronState, previous: ChevronState) {\n      this.shadowRoot\n        ?.querySelector<SVGPathElement>('path')\n        ?.animate(\n          [\n            { d: `path('${(this as IconChevron).paths[previous]}')` },\n            { d: `path('${(this as IconChevron).paths[next]}')` }\n          ],\n          {\n            duration: 200,\n            easing: 'cubic-bezier(0.25, 0, 0.5, 1)'\n          }\n        );\n    }\n  })\n  accessor state!: ChevronState;\n\n  render(): TemplateResult {\n    return html`\n      <svg part=\"chevron\" viewBox=\"0 0 16 16\" state=${this.state} xmlns=\"http://www.w3.org/2000/svg \">\n        <path d=${this.paths[this.state]} />\n      </svg>\n    `;\n  }\n}\n","import type { Placement } from '~/elements/popover';\nimport '../popover';\nimport '../icons/animation/chevron';\n\nimport { html, type TemplateResult } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { OutsideClick, requestOutsideClickUpdate } from '~/decorators/OutsideClick';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\ninterface OptionRecord {\n  element: HTMLElement;\n  value: string;\n  label: string;\n  id: string;\n  handlers: {\n    click: (event: Event) => void;\n    keydown: (event: KeyboardEvent) => void;\n  };\n}\n\nconst nextOptionId = (() => {\n  let counter = 0;\n  return () => {\n    counter += 1;\n    return `ease-dropdown-option-${counter}`;\n  };\n})();\n\nconst nextPanelId = (() => {\n  let counter = 0;\n  return () => {\n    counter += 1;\n    return `ease-dropdown-content-${counter}`;\n  };\n})();\n\n@Component({\n  tag: 'ease-dropdown',\n  styles: `\n    :host {\n      display: grid;\n      width: 100%;\n    }\n\n    ease-popover {\n      --ease-popover-content-min-width: var(--ease-dropdown-panel-min-width, anchor-size(width));\n      --ease-popover-content-width: var(--ease-dropdown-panel-width, max-content);\n      --ease-popover-content-max-width: var(--ease-dropdown-panel-max-width, none);\n    }\n\n    [part=\"trigger\"] {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      width: 100%;\n      gap: 8px;\n      padding: var(--ease-dropdown-trigger-padding, 8px 8px 8px 12px);\n      border-radius: var(--ease-dropdown-radius, var(--radii-md));\n      background-color: var(--ease-dropdown-background, var(--color-gray-850));\n      cursor: pointer;\n      box-shadow: var(\n        --ease-dropdown-shadow,\n        inset 0 1px 0.25px 0 var(--color-white-4),\n        0 1px 2.5px 0 var(--color-black-8)\n      );\n      font-family: var(--ease-font-family, inherit);\n      font-optical-sizing: auto;\n      box-sizing: border-box;\n      font-size: var(--ease-dropdown-font-size, var(--ease-font-size, 13px));\n      font-weight: var(--ease-dropdown-font-weight, 500);\n      color: var(--ease-dropdown-color, var(--color-foreground));\n      min-width: 0;\n      border: none;\n      outline: none;\n      margin: 0;\n      line-height: var(--ease-dropdown-line-height, 14px);\n      transition: color 0.2s, background-color 0.2s;\n      text-align: left;\n\n      &:hover,\n      &:focus-within {\n        background-color: var(--ease-dropdown-background-hover, var(--color-gray-825));\n      }\n\n      [part=\"trigger-icon\"] {\n        display: block;\n        margin: -1px 0 -1px -2px;\n      }\n\n      &[data-pill=\"true\"] {\n        border-radius: 999px;\n      }\n\n      &[data-block=\"small\"] {\n        padding: 4px 8px 4px 4px;\n      }\n\n      &[data-headless=\"true\"] {\n        background: transparent;\n        box-shadow: none;\n        padding: 0;\n        border-radius: 0;\n        gap: 4px;\n\n        &:hover,\n        &:focus-within {\n          background: transparent;\n        }\n      }\n    }\n\n    input[part=\"trigger-input\"] {\n      background: transparent;\n      border: none;\n      outline: none;\n      color: inherit;\n      font: inherit;\n      width: fit-content;\n      min-width: 0;\n      padding: 0;\n      margin: 0;\n      cursor: pointer;\n      field-sizing: var(--ease-dropdown-field-sizing, fixed);\n    }\n    \n    :host([open]) input[part=\"trigger-input\"] {\n      cursor: text;\n    }\n\n    [part=\"trigger\"][data-placeholder=\"true\"],\n    [part=\"trigger\"] [part=\"trigger-label\"][data-placeholder=\"true\"],\n    input[part=\"trigger-input\"]::placeholder {\n      color: var(--ease-dropdown-placeholder-color, var(--color-gray-600));\n    }\n\n    [part=\"trigger\"] [part=\"trigger-label\"] {\n      flex-grow: 1;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      white-space: nowrap;\n    }\n\n    [part=\"content\"] {\n      border-radius: var(--ease-dropdown-panel-radius, var(--ease-dropdown-radius, var(--radii-md)));\n      background: var(--ease-dropdown-panel-background, var(--color-gray-875));\n      border: none;\n      outline: none;\n      box-shadow: var(\n        --ease-dropdown-panel-shadow,\n        0 5px 20px 0 var(--color-black-15),\n        0 1px 4px 0 var(--color-black-15),\n        0 0 0 .5px var(--color-white-4) inset,\n        0 1px 0 0 var(--color-white-4) inset\n      );\n      background-clip: padding-box;\n      border: .25px solid var(--ease-dropdown-panel-border-color, var(--color-gray-825));\n      box-sizing: border-box;\n      padding: var(--ease-dropdown-panel-padding, 4px);\n    }\n    \n    [part=\"content\"] ::slotted(hr) {\n      margin: 4px 0;\n      height: 1px;\n      background-color: var(--color-white-4);\n      border: none;\n\n      &:first-child,\n      &:last-child {\n        display: none;\n      }\n    }\n\n    [part=\"content\"] ::slotted(h4) {\n      margin: 4px 0 !important;\n      font-size: var(--ease-dropdown-group-label-font-size, 11px);\n      line-height: 1;\n      padding: var(--ease-dropdown-group-label-padding, 0 8px);\n      font-family: var(--ease-font-family, inherit);\n      font-weight: 450;\n      color: var(--ease-dropdown-group-label-color, var(--color-gray-700));\n      display: block;\n\n      &:first-child,\n      &:last-child {\n        display: none;\n      }\n    }\n\n    [part=\"section\"] {\n      flex-grow: 1;\n      min-width: max(100%, var(--ease-dropdown-min-width, 140px));\n      display: grid;\n      grid-gap: 3px;\n      max-height: var(--ease-dropdown-max-height, auto);\n      overflow-y: auto;\n      overscroll-behavior: contain;\n      container-type: inline-size;\n      container-name: scroll-area;\n      mask: linear-gradient(to bottom,\n        #0000,\n        #ffff var(--top-fade) calc(100% - var(--bottom-fade)),\n        #0000\n      );\n      animation: scroll;\n      animation-timeline: --scroll;\n      scroll-timeline: --scroll y;\n      scroll-snap-type: y mandatory;\n      scrollbar-width: none;\n      -ms-overflow-style: none;\n      box-sizing: border-box;\n    }\n\n    [part=\"section\"]::-webkit-scrollbar {\n      width: 0;\n      height: 0;\n      display: none;\n    }\n\n    @property --top-fade {\n      syntax: '<length>';\n      inherits: false;\n      initial-value: 0;\n    }\n\n    @property --bottom-fade {\n      syntax: '<length>';\n      inherits: false;\n      initial-value: 0;\n    }\n\n    @keyframes scroll {\n      0% {\n        --bottom-fade: 16px;\n        --top-fade: 0;\n      }\n      10%,\n      100% {\n        --top-fade: 16px;\n      }\n      90% {\n        --bottom-fade: 16px;\n      }\n      100% {\n        --bottom-fade: 0;\n      }\n    }\n\n    ::slotted(button[slot=\"content\"]) {\n      appearance: none;\n      font-family: var(--ease-font-family, inherit);\n      font-optical-sizing: auto;\n      font-size: var(--ease-dropdown-option-font-size, var(--ease-font-size-sm, 12px));\n      font-weight: var(--ease-dropdown-option-font-weight, 400);\n      color: var(--ease-dropdown-option-color, var(--color-blue-100));\n      min-width: 0;\n      padding: var(--ease-dropdown-option-padding, 7px 8px);\n      display: block;\n      border-radius: var(--ease-dropdown-option-radius, 5px);\n      background-color: var(--ease-dropdown-option-background, var(--color-gray-875));\n      border: none;\n      outline: none;\n      margin: 0;\n      line-height: var(--ease-dropdown-option-line-height, 14px);\n      transition: color 0.2s, background-color 0.2s;\n      cursor: pointer;\n      width: 100%;\n      text-align: left;\n    }\n\n    ::slotted(button[slot=\"content\"]:hover),\n    ::slotted(button[slot=\"content\"]:focus-visible),\n    ::slotted(button[slot=\"content\"][data-active=\"true\"]),\n    ::slotted(button[slot=\"content\"][aria-selected=\"true\"]) {\n      background-color: var(--ease-dropdown-option-background-active, var(--color-gray-825));\n      color: var(--ease-dropdown-option-color-active, var(--color-white));\n    }\n  `\n})\nexport class Dropdown extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<boolean>({\n    type: Boolean,\n    reflect: true,\n    onChange(next, previous) {\n      (this as Dropdown).handleOpenChange(next, previous);\n    }\n  })\n  accessor open = false;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled = false;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor pill = false;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor headless = false;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor searchable = false;\n\n  @Prop<'small' | 'medium' | 'large'>({\n    type: String,\n    reflect: true,\n    defaultValue: 'medium',\n    onAttributeChange() {\n      this.requestRender?.();\n    }\n  })\n  accessor block: 'small' | 'medium' | 'large' = 'medium';\n\n  @Prop<string>({\n    reflect: true,\n    defaultValue: 'auto',\n    onChange(next) {\n      (this as Dropdown).style.setProperty('--ease-dropdown-max-height', next ?? 'auto');\n    }\n  })\n  accessor maxHeight: string = 'auto';\n\n  @Prop<string | null>({ reflect: true, defaultValue: null })\n  accessor name: string | null = null;\n\n  @Prop<string | null>({ reflect: true, defaultValue: null })\n  accessor value: string | null = null;\n\n  @Prop<string | null>({\n    reflect: true,\n    attribute: 'placeholder',\n    defaultValue: 'Select an option'\n  })\n  accessor placeholder: string | null = 'Select an option';\n\n  @Prop<Placement>({ reflect: true, defaultValue: 'bottom-start' })\n  accessor placement: Placement = 'bottom-start';\n\n  @Query<HTMLElement>('[part=\"trigger\"]')\n  accessor trigger!: HTMLElement | null;\n\n  @Query<HTMLInputElement>('input[part=\"trigger-input\"]')\n  accessor searchInput!: HTMLInputElement | null;\n\n  @Query<HTMLElement>('[part=\"content\"]')\n  accessor panelContent!: HTMLElement | null;\n\n  @Query<HTMLSlotElement>('slot[name=\"content\"]')\n  accessor contentSlot!: HTMLSlotElement | null;\n\n  #options: OptionRecord[] = [];\n  #selectedLabel: string | null = null;\n  #currentSlot: HTMLSlotElement | null = null;\n  #pendingFocus: 'first' | 'last' | null = null;\n  #optionsInitialized = false;\n  #lastToggleOrigin: Event | null = null;\n  #handleSlotChange = (): void => {\n    this.#syncOptions();\n  };\n\n  connectedCallback(): void {\n    this.#ensureSlotListener();\n  }\n\n  disconnectedCallback(): void {\n    this.#removeSlotListener();\n    this.#teardownOptions();\n    this.#lastToggleOrigin = null;\n  }\n\n  afterRender(): void {\n    const trigger = this.trigger;\n    const ariaLabel = this.getAttribute('aria-label');\n\n    if (trigger) {\n      if (trigger instanceof HTMLButtonElement) {\n        trigger.disabled = Boolean(this.disabled);\n      }\n      trigger.setAttribute('aria-expanded', this.open && !this.disabled ? 'true' : 'false');\n      trigger.setAttribute('aria-haspopup', 'listbox');\n\n      if (trigger instanceof HTMLButtonElement) {\n        if (ariaLabel && ariaLabel.trim().length > 0) {\n          trigger.setAttribute('aria-label', ariaLabel.trim());\n        } else {\n          trigger.removeAttribute('aria-label');\n        }\n      }\n    }\n\n    if (this.searchInput) {\n      this.searchInput.disabled = Boolean(this.disabled);\n\n      if (ariaLabel && ariaLabel.trim().length > 0) {\n        this.searchInput.setAttribute('aria-label', ariaLabel.trim());\n      } else {\n        this.searchInput.removeAttribute('aria-label');\n      }\n    }\n\n    const panel = this.panelContent;\n    const isInteractive = this.open && !this.disabled;\n\n    if (panel) {\n      if (!panel.id) {\n        panel.id = nextPanelId();\n      }\n      panel.tabIndex = -1;\n      panel.setAttribute('role', 'listbox');\n      panel.setAttribute('aria-hidden', isInteractive ? 'false' : 'true');\n\n      if (trigger) {\n        trigger.setAttribute('aria-controls', panel.id);\n      }\n    } else if (trigger) {\n      trigger.removeAttribute('aria-controls');\n    }\n\n    setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n\n    this.#ensureSlotListener();\n\n    if (!this.#optionsInitialized) {\n      queueMicrotask(() => {\n        this.#syncOptions();\n      });\n    } else {\n      this.#updateOptionSelectionState();\n    }\n\n    if (this.disabled && this.open) {\n      this.#lastToggleOrigin = null;\n      this.open = false;\n    }\n  }\n\n  render(): TemplateResult {\n    const placeholderActive = this.#isPlaceholderActive();\n\n    return html`\n      <ease-popover\n        .placement=${this.placement}\n        .open=${this.open && !this.disabled}\n      >\n        ${this.searchable ? this.#renderSearchTrigger(placeholderActive) : this.#renderButtonTrigger(placeholderActive)}\n        <div\n          part=\"content\"\n          role=\"listbox\"\n          tabindex=\"-1\"\n          data-open=${this.open && !this.disabled ? 'true' : 'false'}\n          ?hidden=${!this.open || this.disabled}\n          @keydown=${this.#handlePanelKeydown}\n        >\n          <div part=\"section\">\n            <slot name=\"content\"></slot>\n          </div>\n        </div>\n      </ease-popover>\n    `;\n  }\n\n  #renderButtonTrigger(placeholderActive: boolean) {\n    return html`\n        <button\n          part=\"trigger\"\n          slot=\"trigger\"\n          type=\"button\"\n          data-placeholder=${placeholderActive ? 'true' : 'false'}\n          data-headless=${this.headless}\n          @keydown=${this.#handleTriggerKeydown}\n          @click=${this.#handleTriggerClick}\n          data-pill=${this.pill}\n        >\n          <slot name=\"trigger\">\n            <span part=\"trigger-label\" data-placeholder=${placeholderActive ? 'true' : 'false'}>\n              ${this.#getTriggerLabel()}\n            </span>\n\n            <ease-icon-chevron part=\"trigger-icon\" state=${this.open ? 'up' : 'down'} />\n          </slot>\n        </button>\n      `;\n  }\n\n  #renderSearchTrigger(placeholderActive: boolean) {\n    return html`\n        <div\n          part=\"trigger\"\n          slot=\"trigger\"\n          data-placeholder=${placeholderActive ? 'true' : 'false'}\n          data-headless=${this.headless}\n          @click=${this.#handleSearchTriggerClick}\n          data-pill=${this.pill}\n        >\n          <slot name=\"trigger\">\n             <input \n                part=\"trigger-input\"\n                type=\"text\"\n                .value=${this.open ? (this.searchInput?.value ?? '') : this.#getTriggerLabel()}\n                placeholder=${this.placeholder ?? ''}\n                ?readonly=${!this.open}\n                @input=${this.#handleSearchInput}\n                @keydown=${this.#handleTriggerKeydown}\n             />\n            <ease-icon-chevron part=\"trigger-icon\" state=${this.open ? 'up' : 'down'} />\n          </slot>\n        </div>\n      `;\n  }\n\n  #handleSearchTriggerClick = (event: Event): void => {\n    if (this.disabled) {\n      return;\n    }\n\n    if (!this.open) {\n      this.toggle(true, event);\n\n      if (this.searchInput) {\n        this.searchInput.value = '';\n        this.#filterOptions('');\n        this.searchInput.focus();\n      }\n    } else {\n      if (event.target !== this.searchInput) {\n        this.toggle(false, event);\n      }\n    }\n  };\n\n  #handleSearchInput = (event: Event): void => {\n    const input = event.target as HTMLInputElement;\n    this.#filterOptions(input.value);\n\n    if (!this.open) {\n      this.toggle(true, event);\n    }\n  };\n\n  #filterOptions(query: string): void {\n    const lowerQuery = query.toLowerCase();\n    this.#options.forEach((option) => {\n      const match = option.label.toLowerCase().includes(lowerQuery);\n      if (match) {\n        option.element.style.display = '';\n      } else {\n        option.element.style.display = 'none';\n      }\n    });\n  }\n\n  toggle(force?: boolean, originEvent?: Event): void {\n    if (this.disabled) {\n      return;\n    }\n\n    const current = this.open;\n    const next = force ?? !current;\n\n    if (current === next) {\n      return;\n    }\n\n    this.#lastToggleOrigin = originEvent ?? null;\n    this.open = next;\n\n    if (!next) {\n      this.#pendingFocus = null;\n      // Reset filter when closing\n      this.#filterOptions('');\n      // Restore label in input if searchable\n      if (this.searchable && this.searchInput) {\n        this.searchInput.value = this.#getTriggerLabel();\n        this.searchInput.blur(); // Blur to look like static text\n      }\n    }\n  }\n\n  handleOpenChange(next: boolean, previous: boolean): void {\n    if (next === previous) {\n      return;\n    }\n\n    if (!next) {\n      this.#pendingFocus = null;\n    }\n\n    const origin = this.#lastToggleOrigin ?? new Event(next ? 'open' : 'close');\n    this.#lastToggleOrigin = null;\n\n    if (next) {\n      if (this.searchable && this.searchInput) {\n        this.searchInput.focus();\n      } else {\n        queueMicrotask(() => this.#focusActiveOption());\n      }\n    }\n\n    dispatchControlEvent(this, 'toggle', { name: this.name ?? undefined, value: next, event: origin });\n    requestOutsideClickUpdate(this);\n  }\n\n  @OutsideClick<Dropdown>({\n    content: (host) => host.panelContent,\n    triggers: (host) => [host.trigger, host.panelContent],\n    disabled: (host) => host.disabled || !host.open\n  })\n  handleOutsideDismiss(event: Event): void {\n    if (!this.open) {\n      return;\n    }\n\n    this.toggle(false, event);\n  }\n\n  #handleTriggerKeydown = (event: KeyboardEvent): void => {\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        this.#pendingFocus = 'first';\n        this.toggle(true, event);\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        this.#pendingFocus = 'last';\n        this.toggle(true, event);\n        break;\n      case 'Enter':\n        if (!this.searchable) {\n          event.preventDefault();\n          this.toggle(true, event);\n        }\n        break;\n      case ' ': // Space\n        if (!this.searchable) {\n          event.preventDefault();\n          this.toggle(true, event);\n        }\n        break;\n      case 'Escape':\n        if (this.open) {\n          event.preventDefault();\n          this.toggle(false, event);\n        }\n        break;\n      default:\n        break;\n    }\n  };\n\n  #ensureSlotListener(): void {\n    const slot = this.contentSlot;\n\n    if (slot === this.#currentSlot) {\n      return;\n    }\n\n    if (this.#currentSlot) {\n      this.#currentSlot.removeEventListener('slotchange', this.#handleSlotChange);\n    }\n\n    if (slot) {\n      slot.addEventListener('slotchange', this.#handleSlotChange);\n    }\n\n    this.#currentSlot = slot ?? null;\n  }\n\n  #removeSlotListener(): void {\n    if (!this.#currentSlot) {\n      return;\n    }\n\n    this.#currentSlot.removeEventListener('slotchange', this.#handleSlotChange);\n    this.#currentSlot = null;\n  }\n\n  #handleTriggerClick = (event: Event): void => {\n    this.toggle(!this.open, event);\n  };\n\n  #syncOptions(): void {\n    const assigned = this.contentSlot?.assignedElements({ flatten: true }) ?? [];\n    const elements = assigned.filter((node): node is HTMLElement => node instanceof HTMLElement);\n\n    this.#removeOptionListeners(this.#options);\n\n    const options: OptionRecord[] = [];\n\n    elements.forEach((element) => {\n      if (element.hasAttribute('data-select-ignore') || element.getAttribute('role') === 'separator') {\n        return;\n      }\n\n      const value = this.#resolveOptionValue(element);\n      const label = this.#resolveOptionLabel(element, value);\n      const id = element.id && element.id.trim().length > 0 ? element.id : nextOptionId();\n\n      if (!element.id) {\n        element.id = id;\n      }\n\n      element.setAttribute('role', 'option');\n      element.setAttribute('aria-selected', 'false');\n      element.dataset.active = 'false';\n      element.tabIndex = -1;\n\n      const handlers = {\n        click: (event: Event) => {\n          event.preventDefault();\n          event.stopPropagation();\n          this.#selectOption(value, label, event);\n        },\n        keydown: (event: KeyboardEvent) => {\n          if (event.key === 'Enter' || event.key === ' ') {\n            event.preventDefault();\n            this.#selectOption(value, label, event);\n          }\n        }\n      } as OptionRecord['handlers'];\n\n      element.addEventListener('click', handlers.click, { passive: false });\n      element.addEventListener('keydown', handlers.keydown);\n\n      options.push({ element, value, label, id, handlers });\n    });\n\n    this.#options = options;\n    this.#optionsInitialized = options.length > 0;\n\n    if (this.value === null && options.length > 0) {\n      const preselected = options.find(\n        (option) =>\n          option.element.hasAttribute('selected') ||\n          option.element.dataset.selected === 'true' ||\n          option.element.getAttribute('aria-selected') === 'true'\n      );\n\n      if (preselected) {\n        this.value = preselected.value;\n      }\n    }\n\n    this.#updateOptionSelectionState();\n  }\n\n  #teardownOptions(): void {\n    this.#removeOptionListeners(this.#options);\n    this.#options = [];\n    this.#optionsInitialized = false;\n    this.#selectedLabel = null;\n  }\n\n  #removeOptionListeners(options: OptionRecord[]): void {\n    options.forEach((option) => {\n      option.element.removeEventListener('click', option.handlers.click);\n      option.element.removeEventListener('keydown', option.handlers.keydown);\n      option.element.dataset.active = 'false';\n      option.element.setAttribute('aria-selected', 'false');\n      option.element.tabIndex = -1;\n    });\n  }\n\n  #updateOptionSelectionState(): void {\n    if (!this.#optionsInitialized) {\n      this.toggleAttribute('data-has-value', false);\n      return;\n    }\n\n    let selectedLabel: string | null = null;\n    const previousLabel = this.#selectedLabel;\n\n    const options = this.#options;\n\n    options.forEach((option) => {\n      const isSelected = this.value !== null && option.value === this.value;\n      option.element.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n      option.element.dataset.active = isSelected ? 'true' : 'false';\n      option.element.tabIndex = isSelected ? 0 : -1;\n\n      if (isSelected) {\n        selectedLabel = option.label;\n      }\n    });\n\n    if (!selectedLabel) {\n      const fallback = options[0];\n      if (fallback) {\n        fallback.element.tabIndex = 0;\n      }\n    }\n\n    this.#selectedLabel = selectedLabel;\n    const hasValue = Boolean(this.value && this.#selectedLabel);\n    this.toggleAttribute('data-has-value', hasValue);\n\n    if (previousLabel !== this.#selectedLabel && typeof this.requestRender === 'function') {\n      this.requestRender();\n    }\n  }\n\n  #isPlaceholderActive(): boolean {\n    return !this.value || !this.#selectedLabel;\n  }\n\n  #getTriggerLabel(): string {\n    if (this.#selectedLabel) {\n      return this.#selectedLabel;\n    }\n\n    if (typeof this.placeholder === 'string' && this.placeholder.trim().length > 0) {\n      return this.placeholder.trim();\n    }\n\n    return 'Select';\n  }\n\n  #focusActiveOption(): void {\n    if (!this.open) {\n      return;\n    }\n\n    const options = this.#options.filter((o) => o.element.style.display !== 'none');\n\n    if (options.length === 0) {\n      this.panelContent?.focus();\n      return;\n    }\n\n    let target: OptionRecord | undefined = options[0];\n\n    if (this.#pendingFocus === 'first') {\n      target = options[0];\n    } else if (this.#pendingFocus === 'last') {\n      target = options[options.length - 1];\n    } else if (this.#pendingFocus === null && this.value !== null) {\n      const match = this.#findOptionByValue(this.value);\n      if (match && match.element.style.display !== 'none') {\n        target = match;\n      }\n    }\n\n    if (target) {\n      this.#focusOption(target);\n    }\n    this.#pendingFocus = null;\n  }\n\n  #focusOption(option: OptionRecord): void {\n    this.#options.forEach((entry) => {\n      entry.element.tabIndex = entry === option ? 0 : -1;\n    });\n\n    option.element.focus({ preventScroll: true });\n  }\n\n  #focusOptionByIndex(index: number): void {\n    const options = this.#options.filter((o) => o.element.style.display !== 'none');\n\n    if (options.length === 0) {\n      this.panelContent?.focus();\n      return;\n    }\n\n    const normalized = Math.max(0, Math.min(index, options.length - 1));\n    const option = options[normalized];\n    if (option) {\n      this.#focusOption(option);\n    }\n  }\n\n  #findOptionByValue(value: string | null): OptionRecord | undefined {\n    if (value === null) {\n      return undefined;\n    }\n\n    return this.#options.find((option) => option.value === value);\n  }\n\n  #moveFocus(step: number): void {\n    const options = this.#options.filter((o) => o.element.style.display !== 'none');\n\n    if (options.length === 0) {\n      this.panelContent?.focus();\n      return;\n    }\n\n    const activeElement = document.activeElement as HTMLElement | null;\n    const currentIndex = options.findIndex((option) => option.element === activeElement);\n\n    if (currentIndex === -1) {\n      this.#focusOptionByIndex(step > 0 ? 0 : options.length - 1);\n      return;\n    }\n\n    const nextIndex = (currentIndex + step + options.length) % options.length;\n    this.#focusOptionByIndex(nextIndex);\n  }\n\n  #handlePanelKeydown = (event: KeyboardEvent): void => {\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        this.#moveFocus(1);\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        this.#moveFocus(-1);\n        break;\n      case 'Home':\n        event.preventDefault();\n        this.#focusOptionByIndex(0);\n        break;\n      case 'End':\n        event.preventDefault();\n        this.#focusOptionByIndex(this.#options.length - 1);\n        break;\n      case 'Enter':\n      case ' ': {\n        event.preventDefault();\n        this.#activateFocusedOption(event);\n        break;\n      }\n      case 'Escape':\n        event.preventDefault();\n        this.toggle(false, event);\n        this.trigger?.focus();\n        break;\n      default:\n        break;\n    }\n  };\n\n  #activateFocusedOption(event: Event): void {\n    const active = this.#options.find((option) => option.element === document.activeElement);\n\n    if (active) {\n      this.#selectOption(active.value, active.label, event);\n    }\n  }\n\n  #selectOption(value: string, label: string, originEvent: Event): void {\n    if (this.disabled) {\n      return;\n    }\n\n    originEvent.preventDefault();\n    originEvent.stopPropagation();\n\n    const previousValue = this.value;\n    this.value = value;\n    this.#selectedLabel = label;\n    this.#updateOptionSelectionState();\n\n    this.toggle(false, originEvent);\n\n    if (previousValue !== value) {\n      this.#dispatchValueChange(value, label, originEvent);\n    }\n\n    if (!this.searchable) {\n      queueMicrotask(() => this.trigger?.focus());\n    }\n  }\n\n  #resolveOptionValue(element: HTMLElement): string {\n    const explicitValue = element.getAttribute('value') ?? element.getAttribute('data-value') ?? element.dataset.value;\n\n    if (explicitValue && explicitValue.trim().length > 0) {\n      return explicitValue.trim();\n    }\n\n    const text = element.textContent?.trim();\n\n    if (text && text.length > 0) {\n      return text;\n    }\n\n    const fallback = nextOptionId();\n    element.dataset.value = fallback;\n    return fallback;\n  }\n\n  #resolveOptionLabel(element: HTMLElement, fallback: string): string {\n    const explicitLabel = element.getAttribute('data-label') ?? element.getAttribute('aria-label');\n\n    if (explicitLabel && explicitLabel.trim().length > 0) {\n      return explicitLabel.trim();\n    }\n\n    const text = element.textContent?.trim();\n\n    if (text && text.length > 0) {\n      return text;\n    }\n\n    return fallback;\n  }\n\n  #dispatchValueChange(value: string, label: string, event: Event): void {\n    dispatchControlEvent(this, 'change', { name: this.name ?? undefined, value, event });\n\n    this.dispatchEvent(\n      new CustomEvent('value-change', {\n        detail: { value, label, event },\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n}\n","import { html } from 'lit-html';\n\nimport { CONTROL_CHANGE_EVENT, dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-input',\n  shadowMode: 'open',\n  autoSlot: true,\n  styles: `\n    :host {\n      display: contents;\n      cursor: text;\n    }\n\n    @keyframes custom-caret {\n      0%,\n      100% {\n        caret-color: transparent;\n      }\n      33.33%,\n      66.66% {\n        caret-color: var(--color-blue-300);\n      }\n    }\n\n    [part=\"container\"] {\n      display: grid;\n      align-items: center;\n      text-align: inherit;\n      width: 100%;\n      min-width: 0;\n      box-sizing: border-box;\n      padding: var(--ease-input-padding, 8px);\n      border-radius: var(--ease-input-radius, var(--radii-md));\n      background-color: var(--ease-input-background, var(--color-gray-875));\n      cursor: text;\n      animation: custom-caret 1s infinite;\n      caret-animation: manual;\n      transition: background-color 0.2s;\n      box-shadow: var(\n        --ease-input-shadow,\n        inset 0 1px 0.25px 0 var(--color-white-4),\n        0 1px 2.5px 0 var(--color-black-8)\n      );\n\n      &:not([data-has-prefix]):not([data-has-suffix]) {\n        padding: var(--ease-input-padding, 8px 12px);\n      }\n\n      &:has(input:disabled) {\n        cursor: not-allowed;\n        opacity: 0.75;\n      }\n\n      &:not(:has(input:disabled)) {\n\n        &:hover {\n          background-color: var(--ease-input-background-hover, var(--color-gray-850));\n        }\n\n        &:has(input:focus-visible) {\n          background-color: var(--ease-input-background-focus, var(--color-gray-825));\n        }\n\n      }\n\n      &[data-has-prefix][data-has-suffix] {\n        padding: var(--ease-input-padding, 0);\n        grid-template-columns: 30px 1fr 30px;\n      }\n\n      &[data-has-prefix]:not([data-has-suffix]) {\n        padding-right: var(--ease-input-padding, 12px);\n        grid-template-columns: 30px 1fr;\n      }\n\n      &[data-has-suffix]:not([data-has-prefix]) {\n        padding-left: var(--ease-input-padding, 12px);\n        grid-template-columns: 1fr 30px;\n      }\n\n      &[data-headless=\"true\"] {\n        background-color: transparent;\n        box-shadow: none;\n        border: none;\n        padding: 0;\n        margin: 0;\n        outline: none;\n        border-radius: 0;\n      }\n    }\n\n   ::slotted(button) {\n      --ease-icon-size: 12px;\n      width: 30px;\n      height: 30px;\n      appearance: none;\n      border: none;\n      outline: none;\n      background-color: transparent;\n      padding: 0;\n      margin: 0;\n      line-height: 14px;\n      transition: color 0.2s;\n      cursor: pointer;\n      display: grid;\n      place-items: center;\n      color: var(--color-gray-600);\n      transition: color 0.2s;\n\n      &:hover,\n      &:focus-visible {\n        color: var(--color-blue-100);\n      }\n\n      &.isActive {\n        animation: blink .6s forwards;\n      }\n\n      @keyframes blink {\n        50% {\n          background-color: var(--color-white-8);\n        }\n      }\n    }\n\n    ::slotted(button[slot=\"prefix\"]) {\n      border-radius: var(--radii-md) 0 0 var(--radii-md);\n      border-right: 1px solid var(--color-white-4);\n\n      &:empty {\n        display: none;\n      }\n    }\n\n    ::slotted([slot=\"prefix\"]:not(button)) {\n      margin: calc(var(--ease-input-padding, 8px) * -1);\n      margin-right: 0;\n      margin-left: 0;\n    }\n\n    ::slotted(button[slot=\"suffix\"]) {\n      border-radius: 0 var(--radii-md) var(--radii-md) 0;\n      border-left: 1px solid var(--color-white-4);\n\n      &:empty {\n        display: none;\n      }\n    }\n\n    input {\n      font-family: inherit;\n      font-optical-sizing: auto;\n      font-size: var(--ease-input-font-size, var(--ease-font-size, 13px));\n      appearance: none;\n      -moz-appearance: textfield;\n      font-weight: var(--ease-input-font-weight, 500);\n      color: var(--ease-input-color, var(--color-blue-100));\n      min-width: 0;\n      cursor: inherit;\n      text-align: inherit;\n      padding: 0;\n      background-color: transparent;\n      border: none;\n      outline: none;\n      margin: 0;\n      line-height: var(--ease-input-line-height, 14px);\n      transition: color 0.2s;\n\n      &::placeholder {\n        color: var(--ease-input-placeholder-color, var(--color-gray-600));\n        opacity: 1;\n      }\n\n      &::-webkit-outer-spin-button,\n      &::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n      }\n    }\n  `,\n  template(this: Input) {\n    return html`\n      <div part=\"container\" data-headless=${Boolean(this.headless)}>\n        <slot name=\"prefix\" part=\"prefix\"></slot>\n        <input part=\"control\" .disabled=${Boolean(this.disabled)} ?disabled=${Boolean(this.disabled)} ?aria-disabled=${Boolean(this.disabled)} />\n        \n        <slot name=\"suffix\" part=\"suffix\"></slot>\n      </div>\n    `;\n  }\n})\nexport class Input extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<string | null>({ reflect: true })\n  accessor value!: string | null;\n\n  @Prop<string | null>({ reflect: true })\n  accessor placeholder!: string | null;\n\n  @Prop<string>({ reflect: true, defaultValue: 'text' })\n  accessor type!: string;\n\n  @Prop<string | null>({ reflect: true })\n  accessor name!: string | null;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n  accessor disabled = false;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n  accessor headless = false;\n\n  @Query<HTMLInputElement>('input')\n  accessor control!: HTMLInputElement | null;\n\n  private updatePrefixAttribute(): void {\n    const container = this.shadowRoot?.querySelector('[part=\"container\"]');\n    if (!container) {\n      return;\n    }\n\n    const prefixSlot = this.shadowRoot?.querySelector('slot[name=\"prefix\"]') as HTMLSlotElement;\n    const hasPrefix = Boolean(prefixSlot?.assignedNodes({ flatten: true }).length > 0);\n    setBooleanAttribute(container, 'data-has-prefix', hasPrefix);\n  }\n\n  private updateSuffixAttribute(): void {\n    const container = this.shadowRoot?.querySelector('[part=\"container\"]');\n    if (!container) {\n      return;\n    }\n\n    const suffixSlot = this.shadowRoot?.querySelector('slot[name=\"suffix\"]') as HTMLSlotElement;\n    const hasSuffix = Boolean(suffixSlot?.assignedNodes({ flatten: true }).length > 0);\n    setBooleanAttribute(container, 'data-has-suffix', hasSuffix);\n  }\n\n  afterRender(): void {\n    if (!this.control) {\n      return;\n    }\n\n    const control = this.control;\n    const value = this.value ?? '';\n\n    if (control.value !== value) {\n      control.value = value;\n    }\n\n    control.type = this.type ?? 'text';\n    control.placeholder = this.placeholder ?? '';\n    control.name = this.name ?? '';\n    control.disabled = Boolean(this.disabled);\n\n    this.updatePrefixAttribute();\n    this.updateSuffixAttribute();\n\n    setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n  }\n\n  @Listen('slotchange', { selector: 'slot[name=\"prefix\"]' })\n  onPrefixSlotChange(): void {\n    this.updatePrefixAttribute();\n  }\n\n  @Listen('slotchange', { selector: 'slot[name=\"suffix\"]' })\n  onSuffixSlotChange(): void {\n    this.updateSuffixAttribute();\n  }\n\n  @Listen<Input, Event, HTMLInputElement>('input', { selector: 'input' })\n  handleInput(event: Event, target?: HTMLInputElement | null): void {\n    if (!target) {\n      return;\n    }\n\n    this.value = target.value;\n\n    const name = this.name ?? this.getAttribute('name') ?? undefined;\n    const detail = { name, value: this.value ?? '', event };\n\n    dispatchControlEvent(this, 'input', detail);\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n\n  @Listen<Input, Event, HTMLInputElement>('change', { selector: 'input' })\n  handleChange(event: Event, target?: HTMLInputElement | null): void {\n    if (!target) {\n      return;\n    }\n\n    this.value = target.value;\n\n    const name = this.name ?? this.getAttribute('name') ?? undefined;\n    const detail = { name, value: this.value ?? '', event };\n\n    dispatchControlEvent(this, 'change', detail);\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n}\n","export interface RGB {\n  r: number;\n  g: number;\n  b: number;\n}\n\nexport interface HSV {\n  h: number;\n  s: number;\n  v: number;\n}\n\nexport interface HSL {\n  h: number;\n  s: number;\n  l: number;\n}\n\nexport type ColorFormat = 'hex' | 'rgb' | 'hsl' | 'hsb';\n\nconst clamp01 = (value: number) => Math.max(0, Math.min(1, value));\n\nexport function hsvToRgb(h: number, s: number, v: number): RGB {\n  let hue = ((h % 360) + 360) % 360;\n  hue /= 60;\n\n  const saturation = clamp01(s);\n  const value = clamp01(v);\n  const c = value * saturation;\n  const x = c * (1 - Math.abs((hue % 2) - 1));\n  const m = value - c;\n\n  let r = 0;\n  let g = 0;\n  let b = 0;\n\n  if (hue < 1) {\n    r = c;\n    g = x;\n  } else if (hue < 2) {\n    r = x;\n    g = c;\n  } else if (hue < 3) {\n    g = c;\n    b = x;\n  } else if (hue < 4) {\n    g = x;\n    b = c;\n  } else if (hue < 5) {\n    r = x;\n    b = c;\n  } else {\n    r = c;\n    b = x;\n  }\n\n  return {\n    r: Math.round((r + m) * 255),\n    g: Math.round((g + m) * 255),\n    b: Math.round((b + m) * 255)\n  };\n}\n\nexport function rgbToHsv(r: number, g: number, b: number): HSV {\n  const rn = r / 255;\n  const gn = g / 255;\n  const bn = b / 255;\n\n  const max = Math.max(rn, gn, bn);\n  const min = Math.min(rn, gn, bn);\n  const delta = max - min;\n\n  let h = 0;\n  const s = max === 0 ? 0 : delta / max;\n  const v = max;\n\n  if (delta !== 0) {\n    switch (max) {\n      case rn:\n        h = (gn - bn) / delta + (gn < bn ? 6 : 0);\n        break;\n      case gn:\n        h = (bn - rn) / delta + 2;\n        break;\n      case bn:\n        h = (rn - gn) / delta + 4;\n        break;\n      default:\n        break;\n    }\n\n    h *= 60;\n  }\n\n  return { h, s, v };\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n  const toHex = (component: number) => component.toString(16).padStart(2, '0');\n  return `#${toHex(r)}${toHex(g)}${toHex(b)}`.toUpperCase();\n}\n\nexport function hexToRgb(hex: string): RGB | null {\n  let normalized = hex.trim();\n\n  if (/^#([0-9a-f]{3})$/i.test(normalized)) {\n    normalized = `#${normalized[1]}${normalized[1]}${normalized[2]}${normalized[2]}${normalized[3]}${normalized[3]}`;\n  }\n\n  const match = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(normalized);\n\n  if (!match || !match[1] || !match[2] || !match[3]) {\n    return null;\n  }\n\n  return {\n    r: parseInt(match[1], 16),\n    g: parseInt(match[2], 16),\n    b: parseInt(match[3], 16)\n  };\n}\n\nexport function hexToHsv(hex: string): HSV | null {\n  const rgb = hexToRgb(hex);\n  return rgb ? rgbToHsv(rgb.r, rgb.g, rgb.b) : null;\n}\n\nexport function hsvToHex(h: number, s: number, v: number): string {\n  const rgb = hsvToRgb(h, s, v);\n  return rgbToHex(rgb.r, rgb.g, rgb.b);\n}\n\nexport function isValidHex(hex: string): boolean {\n  return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(hex.trim());\n}\n\nexport function getLuminance(r: number, g: number, b: number): number {\n  return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n}\n\nexport function isLightColor(r: number, g: number, b: number): boolean {\n  return getLuminance(r, g, b) > 0.5;\n}\n\nexport function hsvToHsl(h: number, s: number, v: number): HSL {\n  const l = v * (1 - s / 2);\n  const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l);\n  return { h, s: sl, l };\n}\n\nexport function hslToHsv(h: number, s: number, l: number): HSV {\n  const v = l + s * Math.min(l, 1 - l);\n  const sv = v === 0 ? 0 : 2 * (1 - l / v);\n  return { h, s: sv, v };\n}\n\nexport function formatColor(hsv: HSV, format: ColorFormat, alpha = 1): string {\n  const { h, s, v } = hsv;\n\n  switch (format) {\n    case 'hex':\n      return hsvToHex(h, s, v);\n    case 'rgb': {\n      const rgb = hsvToRgb(h, s, v);\n      return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n    }\n    case 'hsl': {\n      const hsl = hsvToHsl(h, s, v);\n      return `hsla(${Math.round(hsl.h)}, ${Math.round(hsl.s * 100)}%, ${Math.round(hsl.l * 100)}%, ${alpha})`;\n    }\n    case 'hsb':\n      return `hsb(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(v * 100)}%)`;\n    default:\n      return hsvToHex(h, s, v);\n  }\n}\n\nexport interface ColorComponents {\n  labels: string[];\n  values: (string | number)[];\n  max: number[];\n  suffix: string[];\n}\n\nexport function getColorComponents(hsv: HSV, format: ColorFormat): ColorComponents {\n  const { h, s, v } = hsv;\n\n  switch (format) {\n    case 'hex':\n      return {\n        labels: ['Hex'],\n        values: [hsvToHex(h, s, v)],\n        max: [0],\n        suffix: ['']\n      };\n    case 'rgb': {\n      const rgb = hsvToRgb(h, s, v);\n      return {\n        labels: ['R', 'G', 'B'],\n        values: [rgb.r, rgb.g, rgb.b],\n        max: [255, 255, 255],\n        suffix: ['', '', '']\n      };\n    }\n    case 'hsl': {\n      const hsl = hsvToHsl(h, s, v);\n      return {\n        labels: ['H', 'S', 'L'],\n        values: [Math.round(hsl.h), Math.round(hsl.s * 100), Math.round(hsl.l * 100)],\n        max: [360, 100, 100],\n        suffix: ['°', '%', '%']\n      };\n    }\n    case 'hsb':\n      return {\n        labels: ['H', 'S', 'B'],\n        values: [Math.round(h), Math.round(s * 100), Math.round(v * 100)],\n        max: [360, 100, 100],\n        suffix: ['°', '%', '%']\n      };\n    default:\n      return {\n        labels: ['Hex'],\n        values: [hsvToHex(h, s, v)],\n        max: [0],\n        suffix: ['']\n      };\n  }\n}\n\nexport function updateHsvFromComponents(hsv: HSV, format: ColorFormat, index: number, value: number | string): HSV {\n  const newHsv = { ...hsv };\n\n  switch (format) {\n    case 'hex': {\n      if (typeof value === 'string' && isValidHex(value)) {\n        const parsed = hexToHsv(value);\n        if (parsed) {\n          return parsed;\n        }\n      }\n      break;\n    }\n    case 'rgb': {\n      const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n      const vals: [number, number, number] = [rgb.r, rgb.g, rgb.b];\n      vals[index] = Math.max(0, Math.min(255, Number(value)));\n      return rgbToHsv(vals[0], vals[1], vals[2]);\n    }\n    case 'hsl': {\n      const hsl = hsvToHsl(hsv.h, hsv.s, hsv.v);\n      const vals: [number, number, number] = [hsl.h, hsl.s * 100, hsl.l * 100];\n      vals[index] = Number(value);\n      vals[0] = Math.max(0, Math.min(360, vals[0]));\n      vals[1] = Math.max(0, Math.min(100, vals[1]));\n      vals[2] = Math.max(0, Math.min(100, vals[2]));\n      return hslToHsv(vals[0], vals[1] / 100, vals[2] / 100);\n    }\n    case 'hsb': {\n      const vals: [number, number, number] = [hsv.h, hsv.s * 100, hsv.v * 100];\n      vals[index] = Number(value);\n      vals[0] = Math.max(0, Math.min(360, vals[0]));\n      vals[1] = Math.max(0, Math.min(100, vals[1]));\n      vals[2] = Math.max(0, Math.min(100, vals[2]));\n      return { h: vals[0], s: vals[1] / 100, v: vals[2] / 100 };\n    }\n  }\n\n  return newHsv;\n}\n\nexport const COLOR_FORMATS: ColorFormat[] = ['hex', 'rgb', 'hsl', 'hsb'];\n","import type { TemplateResult } from 'lit-html';\n\nimport { nothing } from 'lit-html';\nimport { classMap } from 'lit-html/directives/class-map.js';\nimport { ifDefined } from 'lit-html/directives/if-defined.js';\nimport { repeat } from 'lit-html/directives/repeat.js';\nimport { styleMap } from 'lit-html/directives/style-map.js';\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js';\nimport { when } from 'lit-html/directives/when.js';\n\nexport { classMap, ifDefined, repeat, styleMap, unsafeHTML, when };\n\nexport function renderIf<T>(\n  condition: T | undefined | null,\n  template: TemplateResult | (() => TemplateResult)\n): TemplateResult | typeof nothing {\n  if (!condition) {\n    return nothing;\n  }\n\n  return typeof template === 'function' ? template() : template;\n}\n\nexport function renderList<T>(\n  items: readonly T[],\n  template: (item: T, index: number) => TemplateResult,\n  key: (item: T, index: number) => unknown = (item) => item\n): ReturnType<typeof repeat> {\n  return repeat(items, key, template);\n}\n\nexport function styleObject(input: Record<string, string | number | null | undefined>): ReturnType<typeof styleMap> {\n  const definedEntries = Object.entries(input).reduce<Record<string, string>>((acc, [property, value]) => {\n    if (value === null || value === undefined || value === '') {\n      return acc;\n    }\n\n    acc[property] = typeof value === 'number' ? `${value}` : value;\n    return acc;\n  }, {});\n\n  return styleMap(definedEntries);\n}\n\nexport const optionalAttribute = ifDefined;\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-arrows-vertical',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 24px);\n      height: var(--ease-icon-size, 24px);\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M8 9.00006L11.1161 5.88394C11.6043 5.39578 12.3957 5.39578 12.8839 5.88394L16 9.00006M8 15.0001L11.1161 18.1162C11.6043 18.6043 12.3957 18.6043 12.8839 18.1162L16 15.0001\"  />\n      </svg>\n    `;\n  }\n})\nexport class IconArrowsVertical extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-picker',\n  styles: `\n    :host {\n      display: contents;\n    }\n\n    [part=\"picker\"] {\n      display: block;\n      width: 12px;\n      height: 12px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.25;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg part=\"picker\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M5 3.50003L8.5 7.00003M2.14645 7.85358L7.5 2.50003C8.05228 1.94774 8.94772 1.94774 9.5 2.50003C10.0523 3.05231 10.0523 3.94774 9.5 4.50003L4.14645 9.85358C4.05268 9.94735 3.9255 10 3.79289 10H2.5C2.22386 10 2 9.77617 2 9.50003V8.20714C2 8.07453 2.05268 7.94735 2.14645 7.85358Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n      </svg>\n    `;\n  }\n})\nexport class IconPicker extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { dispatchControlEvent } from '../shared';\nimport {\n  COLOR_FORMATS,\n  type ColorFormat,\n  getColorComponents,\n  type HSV,\n  hexToHsv,\n  hsvToHex,\n  hsvToRgb,\n  isLightColor,\n  isValidHex,\n  updateHsvFromComponents\n} from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\nimport { styleMap } from '~/utils/template-helpers';\nimport '../icons/interface/arrows-vertical';\nimport '../icons/interface/picker';\n\n@Component({\n  tag: 'ease-color-picker',\n  autoSlot: false,\n  styles: `\n    :host {\n      display: grid;\n      grid-gap: 8px;\n      user-select: none;\n      -webkit-user-select: none;\n\n      --ease-color-picker-width: 180px;\n    }\n\n    [part=\"saturation\"] {\n      position: relative;\n      width: 100%;\n      height: 124px;\n      cursor: pointer;\n      background-image: linear-gradient(to top, black, transparent), linear-gradient(to right, white, transparent);\n      border-radius: 7px;\n      touch-action: none;\n    }\n\n    [part=\"saturation-handle\"] {\n      position: absolute;\n      width: 10px;\n      height: 10px;\n      box-shadow: inset 0 0 0 2px var(--color-blue-100);\n      border-radius: 50%;\n      pointer-events: none;\n    }\n\n    [part=\"hue\"] {\n      position: relative;\n      height: 8px;\n      align-self: center;\n      flex-grow: 1;\n      cursor: pointer;\n      border-radius: 9px;\n      background-image: linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00);\n      touch-action: none;\n    }\n\n    [part=\"hue-handle\"] {\n      position: absolute;\n      top: 0;\n      width: 8px;\n      height: 8px;\n      box-shadow: inset 0 0 0 2px var(--color-blue-100);\n      border-radius: 50%;\n      pointer-events: none;\n    }\n\n    [part=\"preview\"] {\n      position: relative;\n      width: 20px;\n      height: 20px;\n      border-radius: 5px;\n      box-shadow: inset 0 0 0 .75px var(--color-blue-80);\n      display: grid;\n      place-items: center;\n\n      &[data-eyedropper] {\n        cursor: pointer;\n\n        &:hover,\n        &:focus-visible {\n          ease-icon-picker {\n            scale: 1.1;\n          }\n        }\n\n        ease-icon-picker {\n          color: var(--icon-color, var(--color-blue-100));\n          transition: scale 0.2s, color 0.15s;\n          filter: drop-shadow(0 0 2px var(--color-black-15));\n        }\n      }\n    }\n\n    [part=\"toolbar\"] {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      gap: 8px;\n      position: relative;\n      z-index: 1;\n    }\n\n    [part=\"toolbar\"] ease-button {\n      padding: 4px;\n      width: max-content;\n    }\n\n    [part=\"format-container\"] {\n      display: grid;\n      grid-template-columns: 30px 1fr;\n      align-items: center;\n      gap: 8px;\n    }\n\n    [part=\"format-inputs\"] {\n      padding: 2px 4px;\n      width: 100%;\n      border-radius: var(--ease-color-picker-format-radius, var(--radii-md));\n      background-color: var(--ease-color-picker-format-background, var(--color-gray-850));\n      cursor: pointer;\n      box-shadow: var(\n        --ease-color-picker-format-shadow,\n        inset 0 1px 0.25px 0 var(--color-white-4),\n        0 1px 2.5px 0 var(--color-black-8)\n      );\n      box-sizing: border-box;\n      display: flex;\n      justify-content: space-around;\n\n      &:hover,\n      &:focus-within {\n        background-color: var(--ease-color-picker-format-background-hover, var(--color-gray-825));\n      }\n    }\n\n    [part=\"format-input\"] {\n      appearance: none;\n      -moz-appearance: textfield;\n      cursor: pointer;\n      box-sizing: border-box;\n      font-size: var(--ease-color-picker-format-font-size, 11px);\n      font-weight: 500;\n      color: var(--color-gray-600);\n      min-width: 0;\n      box-sizing: border-box;\n      border: none;\n      outline: none;\n      padding: 4px;\n      margin: 0;\n      background-color: transparent;\n      line-height: 12px;\n      transition: color 0.2s;\n      width: 100%;\n      text-align: center;\n      font-optical-sizing: auto;\n      font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n\n      &:hover,\n      &:focus-within {\n        color: var(--color-blue-100);\n      }\n\n      &::placeholder {\n        color: var(--color-gray-800);\n        opacity: 1;\n      }\n\n      &::-webkit-outer-spin-button,\n      &::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n      }\n    }\n\n    [part=\"color-container\"] {\n      display: grid;\n      grid-template-columns: 1fr 20px;\n      align-items: center;\n      gap: 8px;\n    }\n\n    [part=\"format-trigger\"] {\n      --ease-icon-size: var(--ease-color-picker-format-icon-size, 10px);\n\n      display: flex;\n      align-items: center;\n      gap: 2px;\n      font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n      font-optical-sizing: auto;\n      font-size: var(--ease-color-picker-format-trigger-font-size, 10px);\n      font-weight: 500;\n      color: var(--color-gray-400);\n      cursor: pointer;\n      transition: color 0.15s;\n      overflow: hidden;\n      position: relative;\n      height: 14px;\n\n      &:hover {\n        color: var(--color-gray-200);\n      }\n\n      ease-icon-arrows-vertical {\n        color: var(--color-gray-600);\n        flex-shrink: 0;\n      }\n    }\n\n    [part=\"format-label\"] {\n      display: inline-block;\n    }\n\n    [part=\"format-label\"][data-animating=\"out\"] {\n      animation: formatOut 0.15s ease-in forwards;\n    }\n\n    [part=\"format-label\"][data-animating=\"in\"] {\n      animation: formatIn 0.15s ease-out forwards;\n    }\n\n    @keyframes formatOut {\n      0% {\n        transform: translateY(0) scale(1);\n        opacity: 1;\n      }\n      100% {\n        transform: translateY(6px) scale(0.8);\n        opacity: 0;\n      }\n    }\n\n    @keyframes formatIn {\n      0% {\n        transform: translateY(-6px) scale(0.8);\n        opacity: 0;\n      }\n      100% {\n        transform: translateY(0) scale(1);\n        opacity: 1;\n      }\n    }\n\n  `,\n  template(this: ColorPicker) {\n    const { h, s, v } = this.hsv;\n    const pureHue = hsvToRgb(h, 1, 1);\n    const currentRgb = hsvToRgb(h, s, v);\n    const saturationBg = `rgb(${pureHue.r}, ${pureHue.g}, ${pureHue.b})`;\n    const huePercent = h / 360;\n    const vInverted = 1 - v;\n    // Position handles so they stay within container bounds (handle is 10px)\n    const saturationHandleStyles = {\n      left: `calc(${s * 100}% - ${s * 10}px)`,\n      top: `calc(${vInverted * 100}% - ${vInverted * 10}px)`\n    } as const;\n    const hueHandleStyles = {\n      left: `calc(${huePercent * 100}% - ${huePercent * 10}px)`\n    } as const;\n    const isLight = isLightColor(currentRgb.r, currentRgb.g, currentRgb.b);\n    const hasEyeDropper = 'EyeDropper' in window;\n    const previewStyles = {\n      backgroundColor: this.value,\n      '--icon-color': isLight ? 'var(--color-gray-900)' : 'var(--color-blue-100)'\n    } as const;\n    const components = getColorComponents(this.hsv, this.format);\n\n    return html`\n      <div \n        part=\"saturation\" \n        style=${styleMap({ backgroundColor: saturationBg })}\n        @pointerdown=${this.handleSaturationPointerDown}\n        @pointermove=${this.handleSaturationPointerMove}\n        @pointerup=${this.handleSaturationPointerUp}\n        @pointercancel=${this.handleSaturationPointerUp}\n      >\n        <div part=\"saturation-handle\" style=${styleMap(saturationHandleStyles)}></div>\n      </div>\n      <div part=\"color-container\">\n        <div \n          part=\"hue\"\n          @pointerdown=${this.handleHuePointerDown}\n          @pointermove=${this.handleHuePointerMove}\n          @pointerup=${this.handleHuePointerUp}\n          @pointercancel=${this.handleHuePointerUp}\n        >\n          <div part=\"hue-handle\" style=${styleMap(hueHandleStyles)}></div>\n        </div>\n\n        <div \n          part=\"preview\" \n          style=${styleMap(previewStyles)}\n          ?data-eyedropper=${hasEyeDropper}\n          @click=${hasEyeDropper ? this.handleEyeDropperClick : null}\n        >\n          ${hasEyeDropper ? html`<ease-icon-picker></ease-icon-picker>` : null}\n        </div>\n      </div>\n      <div part=\"format-container\">\n        <div part=\"format-trigger\" @click=${this.handleFormatCycle}>\n          <span part=\"format-label\" data-animating=${this.formatAnimating}>${this.format.toUpperCase()}</span>\n          <ease-icon-arrows-vertical />\n        </div>\n        <div part=\"format-inputs\">\n          ${\n            this.format === 'hex'\n              ? html`\n              <input \n                part=\"format-input\" \n                data-hex\n                type=\"text\" \n                .value=${components.values[0]}\n                @input=${(e: Event) => this.handleComponentChange(0, (e.target as HTMLInputElement).value)}\n              />\n            `\n              : components.labels.map(\n                  (_, i) => html`\n                <input \n                  part=\"format-input\" \n                  type=\"number\" \n                  min=\"0\"\n                  max=${components.max[i]}\n                  .value=${String(components.values[i])}\n                  @input=${(e: Event) => this.handleComponentChange(i, Number((e.target as HTMLInputElement).value))}\n                />\n            `\n                )\n          }\n        </div>\n      </div>\n      <div part=\"toolbar\">\n        <ease-button variant=\"headless-muted\" @click=${this.handleCancelButtonClick}>Cancel</ease-button>\n        <ease-button variant=\"headless\" @click=${this.handleApplyButtonClick}>Apply</ease-button>\n      </div>\n    `;\n  }\n})\nexport class ColorPicker extends HTMLElement {\n  declare requestRender: () => void;\n\n  private hsv: HSV = { h: 0, s: 1, v: 1 };\n  private originalValue: string = '#FF0000';\n  private format: ColorFormat = 'hex';\n  formatAnimating: 'out' | 'in' | 'none' = 'none';\n  #isDraggingSaturation = false;\n  #isDraggingHue = false;\n  #activeSaturationPointer: number | null = null;\n  #activeHuePointer: number | null = null;\n  isInternalUpdate = false;\n\n  @Query('[part=\"saturation\"]') accessor saturationArea!: HTMLElement | null;\n  @Query('[part=\"hue\"]') accessor hueArea!: HTMLElement | null;\n  @Query<HTMLInputElement>('[part=\"hex-input\"]') accessor hexInput!: HTMLInputElement | null;\n\n  @Prop({\n    reflect: true,\n    defaultValue: '#FF0000',\n    onChange(this: ColorPicker, value: string | null) {\n      if (!this.isInternalUpdate) {\n        this.updateFromHex(value ?? '#FF0000');\n      }\n    }\n  })\n  accessor value!: string;\n\n  connectedCallback(): void {\n    this.originalValue = this.value;\n    this.updateFromHex(this.value);\n  }\n\n  private updateFromHex(hex: string): void {\n    if (!isValidHex(hex)) {\n      return;\n    }\n\n    const hsv = hexToHsv(hex);\n\n    if (hsv) {\n      this.hsv = hsv;\n    }\n  }\n\n  #updateValue(event: Event | null): void {\n    const newValue = hsvToHex(this.hsv.h, this.hsv.s, this.hsv.v);\n\n    if (this.value !== newValue) {\n      this.isInternalUpdate = true;\n      this.value = newValue;\n      this.isInternalUpdate = false;\n\n      if (this.hexInput && document.activeElement !== this.hexInput) {\n        this.hexInput.value = newValue;\n      }\n\n      if (event) {\n        dispatchControlEvent(this, 'input', { value: this.value, event });\n      }\n    }\n  }\n\n  readonly handleSaturationPointerDown = (event: PointerEvent): void => {\n    if (!this.saturationArea) {\n      return;\n    }\n\n    if (event.button !== undefined && event.button !== 0) {\n      return;\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.#isDraggingSaturation = true;\n    this.#activeSaturationPointer = event.pointerId;\n    this.saturationArea.setPointerCapture(event.pointerId);\n    this.updateSaturationValue(event);\n  };\n\n  readonly handleSaturationPointerMove = (event: PointerEvent): void => {\n    if (!this.#isDraggingSaturation || event.pointerId !== this.#activeSaturationPointer) {\n      return;\n    }\n\n    event.preventDefault();\n    this.updateSaturationValue(event);\n  };\n\n  readonly handleSaturationPointerUp = (event: PointerEvent): void => {\n    if (!this.#isDraggingSaturation || event.pointerId !== this.#activeSaturationPointer) {\n      return;\n    }\n\n    this.#isDraggingSaturation = false;\n    this.#activeSaturationPointer = null;\n\n    if (this.saturationArea?.hasPointerCapture(event.pointerId)) {\n      this.saturationArea.releasePointerCapture(event.pointerId);\n    }\n\n    dispatchControlEvent(this, 'change', { value: this.value, event });\n  };\n\n  private updateSaturationValue(event: PointerEvent): void {\n    if (!this.saturationArea) {\n      return;\n    }\n    const rect = this.saturationArea.getBoundingClientRect();\n    const x = Math.max(0, Math.min(rect.width, event.clientX - rect.left));\n    const y = Math.max(0, Math.min(rect.height, event.clientY - rect.top));\n\n    this.hsv.s = x / rect.width;\n    this.hsv.v = 1 - y / rect.height;\n\n    this.#updateValue(event);\n    this.requestRender();\n  }\n\n  readonly handleHuePointerDown = (event: PointerEvent): void => {\n    if (!this.hueArea) {\n      return;\n    }\n\n    if (event.button !== undefined && event.button !== 0) {\n      return;\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.#isDraggingHue = true;\n    this.#activeHuePointer = event.pointerId;\n    this.hueArea.setPointerCapture(event.pointerId);\n    this.updateHue(event);\n  };\n\n  readonly handleHuePointerMove = (event: PointerEvent): void => {\n    if (!this.#isDraggingHue || event.pointerId !== this.#activeHuePointer) {\n      return;\n    }\n\n    event.preventDefault();\n    this.updateHue(event);\n  };\n\n  readonly handleHuePointerUp = (event: PointerEvent): void => {\n    if (!this.#isDraggingHue || event.pointerId !== this.#activeHuePointer) {\n      return;\n    }\n\n    this.#isDraggingHue = false;\n    this.#activeHuePointer = null;\n\n    if (this.hueArea?.hasPointerCapture(event.pointerId)) {\n      this.hueArea.releasePointerCapture(event.pointerId);\n    }\n\n    dispatchControlEvent(this, 'change', { value: this.value, event });\n  };\n\n  private updateHue(event: PointerEvent): void {\n    if (!this.hueArea) {\n      return;\n    }\n    const rect = this.hueArea.getBoundingClientRect();\n    const x = Math.max(0, Math.min(rect.width, event.clientX - rect.left));\n\n    this.hsv.h = (x / rect.width) * 360;\n\n    this.#updateValue(event);\n    this.requestRender();\n  }\n\n  readonly handleHexInputChange = (event: Event): void => {\n    const input = event.target as HTMLInputElement;\n    const newValue = input.value;\n\n    if (isValidHex(newValue)) {\n      this.updateFromHex(newValue);\n      this.#updateValue(event);\n      this.requestRender();\n      dispatchControlEvent(this, 'change', { value: this.value, event });\n    } else if (this.hexInput) {\n      this.hexInput.value = this.value;\n    }\n  };\n\n  readonly handleComponentChange = (index: number, value: number | string): void => {\n    this.hsv = updateHsvFromComponents(this.hsv, this.format, index, value);\n    this.#updateValue(null);\n    this.requestRender();\n  };\n\n  readonly handleFormatChange = (format: ColorFormat): void => {\n    this.format = format;\n    this.requestRender();\n  };\n\n  readonly handleFormatCycle = (): void => {\n    // Start exit animation\n    this.formatAnimating = 'out';\n    this.requestRender();\n\n    // After exit animation, change format and start enter animation\n    setTimeout(() => {\n      const currentIndex = COLOR_FORMATS.indexOf(this.format);\n      const nextIndex = (currentIndex + 1) % COLOR_FORMATS.length;\n      this.format = COLOR_FORMATS[nextIndex] as ColorFormat;\n      this.formatAnimating = 'in';\n      this.requestRender();\n\n      // Clear animation state after enter animation\n      setTimeout(() => {\n        this.formatAnimating = 'none';\n        this.requestRender();\n      }, 150);\n    }, 150);\n  };\n\n  readonly handleCancelButtonClick = (event: Event): void => {\n    this.updateFromHex(this.originalValue);\n    this.isInternalUpdate = true;\n    this.value = this.originalValue;\n    this.isInternalUpdate = false;\n    this.requestRender();\n    dispatchControlEvent(this, 'cancel', { value: this.originalValue, event });\n  };\n\n  readonly handleApplyButtonClick = (event: Event): void => {\n    this.originalValue = this.value;\n    dispatchControlEvent(this, 'apply', { value: this.value, event });\n  };\n\n  readonly handleEyeDropperClick = async (event: Event): Promise<void> => {\n    if (!('EyeDropper' in window)) {\n      return;\n    }\n\n    try {\n      const eyeDropper = new (\n        window as typeof window & { EyeDropper: new () => { open: () => Promise<{ sRGBHex: string }> } }\n      ).EyeDropper();\n      const result = await eyeDropper.open();\n\n      if (result.sRGBHex) {\n        this.updateFromHex(result.sRGBHex);\n        this.#updateValue(event);\n        this.requestRender();\n        dispatchControlEvent(this, 'change', { value: this.value, event });\n      }\n    } catch {\n      // User cancelled or API error - silently ignore\n    }\n  };\n}\n\nexport default {\n  ColorPicker\n};\n","import type { Placement } from '~/elements/popover';\n\nimport { html, type TemplateResult } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\nimport '../dropdown';\nimport '../input';\nimport './picker';\n\nimport { isValidHex } from './utils';\n\nimport { styleMap } from '~/utils/template-helpers';\n\n@Component({\n  tag: 'ease-color-input',\n  styles: `\n    :host {\n      display: block;\n      position: relative;\n    }\n\n    ease-dropdown {\n      --ease-dropdown-panel-min-width: auto;\n      --ease-dropdown-panel-width: max-content;\n      --ease-dropdown-panel-max-width: max-content;\n    }\n\n    :host(:not([custom-trigger])) ease-input {\n      --ease-input-padding: 0 4px 0 4px;\n      display: block;\n      width: 76px;\n      cursor: pointer;\n      font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n\n      &::part(control) {\n        margin-left: -12px;\n        cursor: pointer;\n      }\n    }\n\n    ease-dropdown::part(trigger):disabled {\n      cursor: default;\n      opacity: 0.75;\n    }\n\n    :host(:not([custom-trigger])) [slot=\"prefix\"] {\n      display: block;\n      width: 14px;\n      height: 14px;\n      margin-left: -4px;\n      border-radius: 4px;\n      box-shadow: inset 0 0 0 1px var(--color-white-10);\n    }\n\n    [part=\"value-text\"] {\n      font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n    }\n\n    ease-dropdown::part(content) {\n      padding: var(--ease-color-input-dropdown-padding, 12px 12px 8px 12px);\n      overflow: visible;\n    }\n\n    ::slotted([slot=\"trigger\"]) {\n      cursor: pointer;\n    }\n  `\n})\nexport class ColorInput extends HTMLElement {\n  declare requestRender: () => void;\n\n  #hasCustomTrigger = false;\n\n  @Query('ease-dropdown') accessor dropdown!: (HTMLElement & { open: boolean }) | null;\n\n  @Prop<string, ColorInput>({\n    reflect: true,\n    defaultValue: '#FF0000',\n    onChange(next) {\n      if (next && isValidHex(next)) {\n        const normalized = next.toUpperCase();\n        if (this.value !== normalized) {\n          this.value = normalized;\n        }\n      } else if (!next) {\n        this.value = '#000000';\n      }\n    }\n  })\n  accessor value!: string;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled = false;\n\n  @Prop<string | null>({ reflect: true, defaultValue: null })\n  accessor name: string | null = null;\n\n  @Prop<Placement>({ reflect: true, defaultValue: 'bottom-start' })\n  accessor placement: Placement = 'bottom-start';\n\n  connectedCallback(): void {\n    this.#hasCustomTrigger = this.querySelector('[slot=\"trigger\"]') !== null;\n    setBooleanAttribute(this, 'custom-trigger', this.#hasCustomTrigger);\n  }\n\n  afterRender(): void {\n    setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n  }\n\n  #renderDefaultTrigger(): TemplateResult {\n    const swatchStyle = {\n      backgroundColor: this.value\n    } as const;\n\n    return html`\n      <div slot=\"trigger\" part=\"trigger-content\">\n        <ease-input part=\"input\" type=\"text\" .value=${this.value} @change=${this.#handleInputChange} headless>\n          <div slot=\"prefix\" style=${styleMap(swatchStyle)}></div>\n        </ease-input>\n      </div>\n    `;\n  }\n\n  render(): TemplateResult {\n    return html`\n      <ease-dropdown .disabled=${this.disabled} .placement=${this.placement}>\n        ${this.#hasCustomTrigger ? html`<slot name=\"trigger\" slot=\"trigger\"></slot>` : this.#renderDefaultTrigger()}\n        <ease-color-picker slot=\"content\"\n          data-select-ignore\n          .value=${this.value}\n          @input=${this.#handlePickerInput}\n          @change=${this.#handlePickerChange}\n          @cancel=${this.#handlePickerCancel}\n          @apply=${this.#handlePickerApply}\n        ></ease-color-picker>\n      </ease-dropdown>\n    `;\n  }\n\n  #handleInputChange = (event: Event): void => {\n    this.value = (event.target as HTMLInputElement).value;\n    dispatchControlEvent(this, 'input', { name: this.name ?? undefined, value: this.value, event });\n  };\n\n  #handlePickerInput = (event: CustomEvent<{ value: string }>): void => {\n    this.value = event.detail.value;\n    dispatchControlEvent(this, 'input', { name: this.name ?? undefined, value: this.value, event });\n  };\n\n  #handlePickerChange = (event: CustomEvent<{ value: string }>): void => {\n    this.value = event.detail.value;\n    dispatchControlEvent(this, 'change', { name: this.name ?? undefined, value: this.value, event });\n  };\n\n  #handlePickerCancel = (event: CustomEvent<{ value: string }>): void => {\n    this.value = event.detail.value;\n    this.requestRender();\n    if (this.dropdown) {\n      this.dropdown.open = false;\n    }\n  };\n\n  #handlePickerApply = (event: CustomEvent<{ value: string }>): void => {\n    this.value = event.detail.value;\n    dispatchControlEvent(this, 'change', { name: this.name ?? undefined, value: this.value, event });\n    if (this.dropdown) {\n      this.dropdown.open = false;\n    }\n  };\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\n@Component({\n  tag: 'ease-field',\n  autoSlot: false,\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: block;\n      width: 100%;\n    }\n\n    [part=\"field\"] {\n      scroll-snap-align: start;\n      scroll-margin-top: 8px;\n      display: grid;\n      grid-template-columns: var(--ease-field-label-width, 36%) auto;\n      column-gap: var(--ease-field-column-gap, 12px);\n      row-gap: var(--ease-field-row-gap, 6px);\n      align-items: center;\n      width: 100%;\n      min-height: var(--ease-field-min-height, 30px);\n      margin: 0;\n      padding: 0;\n    }\n\n    :host([full-width]) [part=\"field\"] {\n      grid-template-columns: 1fr;\n    }\n\n    label {\n      grid-column: 1;\n      font-size: var(--ease-field-label-font-size, var(--ease-font-size-sm, 12px));\n      line-height: var(--ease-field-label-line-height, 1.25);\n      font-weight: var(--ease-field-label-font-weight, 400);\n      text-wrap: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      padding-left: var(--ease-field-label-padding-left, 4px);\n      box-sizing: border-box;\n      display: block;\n      max-width: 100%;\n      color: var(--ease-field-label-color, var(--color-gray-600));\n    }\n\n    [part=\"content\"] {\n      grid-column: 2;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: flex-end;\n    }\n\n    :host([full-width]) [part=\"content\"] {\n      grid-column: 1;\n      align-items: stretch;\n    }\n  `,\n  template(this: Field) {\n    return html`\n      <div part=\"field\">\n        <label>\n            ${this.label ?? ''}\n        </label>\n\n        <div part=\"content\" class=${this.fullWidth ? 'full-width' : ''}>\n          <slot></slot>\n        </div>\n      </div>\n    `;\n  }\n})\nexport class Field extends HTMLElement {\n  @Prop<string | null>({ reflect: true })\n  accessor label!: string | null;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor fullWidth = false;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-clear',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 16px);\n      height: var(--ease-icon-size, 16px);\n      fill: none;\n      stroke: currentColor;\n      stroke-width: .75;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n\n    [part=\"clear\"] {\n      & > path {\n\n        &:first-child {\n          translate: var(--ease-icon-clear-path-translate, 0);\n          transition: translate var(--ease-icon-clear-path-duration, 0.2s);\n          transition-delay: var(--ease-icon-clear-path-delay, 0s);\n        }\n\n        &:not(:first-child) {\n          stroke-dasharray: 100 0 100;\n          stroke-dashoffset: var(--ease-icon-clear-lines-offset, 100);\n          transition: stroke-dashoffset var(--ease-icon-clear-lines-duration, 0.2s);\n          transition-delay: var(--ease-icon-clear-lines-delay, 0s);\n        }\n      }\n\n      g {\n        path {\n          transform-box: fill-box;\n          transform-origin: 50% 50%;\n          transition: rotate var(--ease-icon-clear-star-duration, 0.2s), scale var(--ease-icon-clear-star-duration, 0.2s);\n\n          &:first-child {\n            rotate: var(--ease-icon-clear-star-1-rotate, 0deg);\n            scale: var(--ease-icon-clear-star-1-scale, 1);\n            transition-delay: var(--ease-icon-clear-star-1-delay, 0s);\n          }\n\n          &:last-child {\n            rotate: var(--ease-icon-clear-star-2-rotate, 0deg);\n            scale: var(--ease-icon-clear-star-2-scale, 1);\n            transition-delay: var(--ease-icon-clear-star-2-delay, 0s);\n          }\n        }\n      }\n    }\n  `,\n  template() {\n    return html`\n      <svg part=\"clear\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M11.7613 10.334L13.7071 12.2798C14.1011 12.6739 14.1011 13.3127 13.7071 13.7067C13.3131 14.1007 12.6742 14.1007 12.2802 13.7067L10.3344 11.7609M11.7613 10.334L10.9541 8.08932M11.7613 10.334L10.3344 11.7609M10.3344 11.7609L8.08973 10.9537M6.69581 12.3476L12.348 6.69544C12.6942 6.34922 12.6942 5.7879 12.348 5.44168L11.892 4.98574C11.5458 4.63952 10.9845 4.63952 10.6383 4.98574L4.9861 10.6379C4.63989 10.9841 4.63989 11.5454 4.9861 11.8917L5.44204 12.3476C5.78826 12.6938 6.34959 12.6938 6.69581 12.3476Z\" />\n        <g>\n          <path d=\"M3.3313 2.6645H4.66519M3.99824 1.99756V3.33145\" />\n          <path d=\"M4.66516 5.99946H5.99905M5.33211 5.33252V6.66641\" />\n        </g>\n        <path d=\"M7.33301 1.99756L8.6669 3.33145\" pathlength=\"100\" />\n        <path d=\"M3.6648 8.33386L1.99744 6.6665\" pathlength=\"100\" />\n      </svg>\n    `;\n  }\n})\nexport class IconClear extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\ntype GridState = 'show' | 'hide';\n\n@Component({\n  tag: 'ease-icon-grid',\n  styles: `\n    :host {\n      display: contents;\n    }\n\n    [part=\"grid\"] {\n      --ease-icon-grid-offset: 100;\n      --ease-icon-grid-rotate: 0deg;\n\n      display: block;\n      width: var(--ease-icon-size, 16px);\n      height: var(--ease-icon-size, 16px);\n      fill: none;\n      stroke: currentColor;\n      stroke-width: .75;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n\n      g {\n        &:first-of-type {\n          path {\n            stroke-dasharray: 100 0 100;\n            stroke-dashoffset: var(--ease-icon-grid-offset);\n            transition: stroke-dashoffset 0.2s;\n          }\n        }\n\n        &:last-child {\n          transform-origin: 72.92% 72.92%;\n          transition: rotate 0.35s linear(0, 0.472 7.5%, 0.832 15.5%, 0.97 19.7%, 1.081 24%, 1.166 28.5%, 1.226 33.2%, 1.255 36.9%, 1.271 40.8%, 1.275 44.9%, 1.266 49.4%, 1.222 57.8%, 1.092 75.1%, 1.042 83%, 1.01 91.4%, 1);\n          rotate: var(--ease-icon-grid-rotate);\n        }\n      }\n\n      [data-state=\"hide\"] {\n        --ease-icon-grid-offset: 200;\n        --ease-icon-grid-rotate: 45deg;\n      }\n    }\n  `,\n  observedAttributes: ['state']\n})\nexport class IconGrid extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<GridState>({\n    reflect: true,\n    attribute: 'state',\n    defaultValue: 'show'\n  })\n  accessor state!: GridState;\n\n  render(): TemplateResult {\n    return html`\n      <svg part=\"grid\" viewBox=\"0 0 12 12\" state=${this.state} xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M10.5018 5.49971V3.99909C10.5018 2.6178 9.38204 1.49805 8.00076 1.49805H3.99909C2.6178 1.49805 1.49805 2.6178 1.49805 3.99909V8.00076C1.49805 9.38204 2.6178 10.5018 3.99909 10.5018H5.49971\" />\n        <g data-state=${this.state}>\n          <path d=\"M7.50059 1.49805V5.49971\" pathlength=\"100\" />\n          <path d=\"M4.49937 1.49805V10.5018\" pathlength=\"100\" />\n          <path d=\"M1.49805 7.47081H5.49971\" pathlength=\"100\" />\n          <path d=\"M1.49805 4.46934H10.5018\" pathlength=\"100\" />\n        </g>\n        <path d=\"M8.75118 11.0019C7.50813 11.0018 6.50043 9.99415 6.50024 8.7511C6.51896 7.51461 7.5176 6.51719 8.75412 6.5C9.99728 6.50081 11.0044 7.50925 11.0036 8.75241C11.0028 9.99556 9.99434 11.0027 8.75118 11.0019\" />\n        <g data-state=${this.state}>\n          <path d=\"M8.7512 7.86672V9.63523\" />\n          <path d=\"M9.63545 8.75098H7.86694\" />\n        </g>\n      </svg>\n    `;\n  }\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-loading',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 12px);\n      height: var(--ease-icon-size, 12px);\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n\n    [part=\"loading\"] {\n      transform-origin: center center;\n      animation-name: loading, loading-dash, loading-dash-offset;\n      animation-duration: .4s, .8s, .8s;\n      animation-iteration-count: infinite;\n      animation-timing-function: linear;\n      stroke-dasharray: 35 65 35 65;\n      stroke-dashoffset: 75;\n    }\n\n    @keyframes loading {\n      0% {\n        transform: rotate(-90deg);\n      }\n      100% {\n        transform: rotate(270deg);\n      }\n    }\n\n    @keyframes loading-dash {\n      33% {\n        stroke-dasharray: 15 85 15 85;\n      }\n      66% {\n        stroke-dasharray: 45 55 45 55;\n      }\n    }\n\n    @keyframes loading-dash-offset {\n      33% {\n        stroke-dashoffset: 55;\n      }\n      66% {\n        stroke-dashoffset: 85;\n      }\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke-opacity=\"0.25\" />\n        <circle cx=\"6\" cy=\"6\" r=\"4.5\" part=\"loading\" pathlength=\"100\" />\n      </svg>\n    `;\n  }\n})\nexport class Loading extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\ntype SnapState = 'active' | 'default';\n\n@Component({\n  tag: 'ease-icon-snap',\n  styles: `\n    :host {\n      display: contents;\n    }\n    [part=\"snap\"] {\n      --ease-icon-snap-cursor-rotate: 0deg;\n      --ease-icon-snap-lines-rotate: 0deg;\n      --ease-icon-snap-lines-translate: 0 0;\n      --ease-icon-snap-lines-translate-1: 0 0;\n      --ease-icon-snap-lines-translate-2: 0 0;\n      --ease-icon-snap-lines-translate-3: 0 0;\n      --ease-icon-snap-lines-translate-4: 0 0;\n      --ease-icon-snap-lines-rotate-1: 0deg;\n      --ease-icon-snap-lines-rotate-2: 0deg;\n      --ease-icon-snap-lines-rotate-3: 0deg;\n      --ease-icon-snap-lines-rotate-4: 0deg;\n      display: block;\n      width: var(--ease-icon-size, 16px);\n      height: var(--ease-icon-size, 16px);\n      fill: none;\n      stroke: currentColor;\n      stroke-width: .75;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n      g {\n        transform-origin: 68.75% 68.75%;\n        &:first-child {\n          rotate: var(--ease-icon-snap-cursor-rotate);\n          transition: rotate 0.2s;\n\n          path {\n            transition: d 0.2s;\n          }\n        }\n        &:last-child {\n          rotate: var(--ease-icon-snap-lines-rotate);\n          translate: var(--ease-icon-snap-lines-translate);\n          transition: rotate 0.2s, translate 0.2s;\n          path {\n            transition: translate 0.2s;\n            transform-box: fill-box;\n            transform-origin: 50% 50%;\n            &:nth-child(1) {\n              translate: var(--ease-icon-snap-lines-translate-1);\n              rotate: var(--ease-icon-snap-lines-rotate-1);\n            }\n            &:nth-child(2) {\n              translate: var(--ease-icon-snap-lines-translate-2);\n              rotate: var(--ease-icon-snap-lines-rotate-2);\n            }\n            &:nth-child(3) {\n              translate: var(--ease-icon-snap-lines-translate-3);\n              rotate: var(--ease-icon-snap-lines-rotate-3);\n            }\n            &:nth-child(4) {\n              translate: var(--ease-icon-snap-lines-translate-4);\n              rotate: var(--ease-icon-snap-lines-rotate-4);\n            }\n          }\n        }\n      }\n    }\n    [part=\"cursor\"] {\n      stroke: transparent;\n      stroke-width: 0;\n      fill: currentColor;\n    }\n    [state=\"active\"] {\n      --ease-icon-snap-cursor-rotate: -90deg;\n      --ease-icon-snap-lines-rotate: -90deg;\n      --ease-icon-snap-lines-translate: -2.25px -2.25px;\n      --ease-icon-snap-lines-translate: -2.25px -2.25px;\n      --ease-icon-snap-lines-translate-1: 1.25px .5px;\n      --ease-icon-snap-lines-translate-2: 1.25px -.15px;\n      --ease-icon-snap-lines-translate-3: .15px -1.25px;\n      --ease-icon-snap-lines-translate-4: -.5px -1.25px;\n      --ease-icon-snap-lines-rotate-1: 5deg;\n      --ease-icon-snap-lines-rotate-2: 20deg;\n      --ease-icon-snap-lines-rotate-3: -20deg;\n      --ease-icon-snap-lines-rotate-4: -5deg;\n    }\n  `,\n  observedAttributes: ['state']\n})\nexport class Snap extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<SnapState>({\n    reflect: true,\n    attribute: 'state',\n    defaultValue: 'default'\n  })\n  accessor state!: SnapState;\n\n  render(): TemplateResult {\n    const defaultPath =\n      'M8.48446 6.48383C8.59007 6.37822 8.71218 6.29901 8.84253 6.24620C8.97289 6.19340 9.11149 6.16699 9.25009 6.16699C9.38869 6.16699 9.52729 6.19340 9.65764 6.24620C9.78799 6.29901 9.91009 6.37822 10.01570 6.48383C10.12128 6.58940 10.20044 6.71143 10.25320 6.84168C10.30597 6.97193 10.33233 7.11041 10.33231 7.24889C10.33229 7.38738 10.30589 7.52587 10.25312 7.65615C10.20034 7.78642 10.12120 7.90848 10.01570 8.01410C9.88354 8.14659 9.75139 8.27907 9.61923 8.41156C9.54601 8.48478 9.44981 8.52139 9.35361 8.52139C9.25741 8.52139 9.16120 8.48478 9.08798 8.41156C9.01476 8.33834 8.97815 8.24214 8.97815 8.14594C8.97815 8.04974 9.01476 7.95353 9.08798 7.88031C9.22014 7.74815 9.35230 7.61599 9.48446 7.48383C9.54924 7.41905 9.58163 7.33401 9.58163 7.24896C9.58163 7.16392 9.54924 7.07888 9.48446 7.01410C9.41974 6.94964 9.33492 6.91741 9.25009 6.91741C9.16526 6.91741 9.08043 6.94963 9.01571 7.01410C8.88355 7.14659 8.75139 7.27907 8.61923 7.41156C8.54601 7.48478 8.44981 7.52139 8.35361 7.52139C8.25741 7.52139 8.16120 7.48478 8.08798 7.41156C8.01476 7.33834 7.97815 7.24214 7.97815 7.14594C7.97815 7.04974 8.01476 6.95354 8.08798 6.88031C8.22014 6.74815 8.35230 6.61599 8.48446 6.48383C8.48446 6.48383 8.48446 6.48383 8.48446 6.48383Z';\n\n    const defaultPath2 =\n      'M6.88092 8.08737C6.91753 8.05076 6.95989 8.02330 7.00512 8.00500C7.05035 7.98669 7.09845 7.97754 7.14655 7.97754C7.24275 7.97754 7.33895 8.01415 7.41217 8.08737C7.44878 8.12398 7.47624 8.16634 7.49454 8.21156C7.51285 8.25679 7.52200 8.30489 7.52200 8.35299C7.52200 8.40110 7.51285 8.44920 7.49454 8.49443C7.47624 8.53965 7.44878 8.58201 7.41217 8.61862C7.34593 8.68470 7.27968 8.75078 7.21344 8.81686C7.14720 8.88294 7.08095 8.94902 7.01471 9.01510C6.95024 9.07982 6.91802 9.16465 6.91802 9.24948C6.91802 9.33431 6.95025 9.41914 7.01471 9.48385C7.07949 9.54863 7.16453 9.58102 7.24957 9.58102C7.33462 9.58102 7.41966 9.54863 7.48444 9.48385C7.55052 9.41777 7.61660 9.35169 7.68268 9.28561C7.74876 9.21953 7.81484 9.15345 7.88092 9.08737C7.91753 9.05076 7.95989 9.02330 8.00512 9.00500C8.05035 8.98669 8.09845 8.97754 8.14655 8.97754C8.24275 8.97754 8.33895 9.01415 8.41217 9.08737C8.44878 9.12398 8.47624 9.16634 8.49454 9.21156C8.51285 9.25679 8.52200 9.30489 8.52200 9.35299C8.52200 9.44920 8.48539 9.54540 8.41217 9.61862C8.34593 9.68470 8.27968 9.75078 8.21344 9.81686C8.14720 9.88294 8.08095 9.94902 8.01471 10.01510C7.96190 10.06785 7.90498 10.11401 7.84498 10.15358C7.78498 10.19315 7.72189 10.22613 7.65676 10.25252C7.59162 10.27890 7.52443 10.29870 7.45621 10.31190C7.38799 10.32510 7.31875 10.33170 7.24950 10.33171C7.18026 10.33172 7.11102 10.32514 7.04281 10.31195C6.97460 10.29877 6.90741 10.27898 6.84229 10.25260C6.77716 10.22622 6.71409 10.19324 6.65411 10.15365C6.59413 10.11407 6.53723 10.06789 6.48444 10.01510C6.43163 9.96230 6.38543 9.90537 6.34582 9.84534C6.30622 9.78532 6.27322 9.72221 6.24681 9.65703C6.22041 9.59186 6.20061 9.52462 6.18740 9.45635C6.17420 9.38808 6.16760 9.31878 6.16760 9.24948C6.16760 9.18018 6.17420 9.11088 6.18740 9.04261C6.20061 8.97434 6.22041 8.90710 6.24681 8.84192C6.27322 8.77675 6.30622 8.71363 6.34582 8.65361C6.38543 8.59359 6.43163 8.53666 6.48444 8.48385C6.55052 8.41777 6.61660 8.35169 6.68268 8.28561C6.74876 8.21953 6.81484 8.15345 6.88092 8.08737C6.88092 8.08737 6.88092 8.08737 6.88092 8.08737Z';\n\n    const activePath =\n      'M9.25193 6.28166C9.4768 6.23094 9.80415 6.20744 10.0781 6.48185C10.3368 6.74117 10.3461 7.05052 10.3008 7.29338C10.2792 7.40896 10.2435 7.52323 10.2119 7.61955C10.1784 7.72179 10.1479 7.80498 10.124 7.89201C10.12433 7.89234 10.12467 7.89266 10.125 7.89299C9.92512 8.64299 9.72525 9.39300 9.52537 10.14300C9.47203 10.34300 9.2664 10.46180 9.06638 10.40860C8.86627 10.35520 8.74739 10.14970 8.80076 9.94963C9.00063 9.19963 9.20050 8.44963 9.40037 7.69963C9.40069 7.69898 9.40102 7.69832 9.40134 7.69767C9.43192 7.58586 9.47025 7.47290 9.49900 7.38517C9.53005 7.29041 9.55180 7.21804 9.56345 7.15568C9.58449 7.04289 9.56329 7.02762 9.54685 7.01115C9.54547 7.00815 9.54373 6.98452 9.41697 7.01310C9.34508 7.02932 9.27319 7.05278 9.16502 7.08537C9.07787 7.11162 8.97189 7.13866 8.85837 7.15764C8.85870 7.15796 8.85902 7.15829 8.85935 7.15861C8.10935 7.35848 7.35935 7.55835 6.60935 7.75822C6.40924 7.81159 6.20373 7.69271 6.15037 7.49260C6.09724 7.29260 6.21600 7.08695 6.41599 7.03361C7.16599 6.83374 7.91599 6.63387 8.66599 6.43400C8.68104 6.42999 8.69646 6.42733 8.71189 6.42521C8.78100 6.41576 8.85573 6.39545 8.94822 6.36760C9.03125 6.34259 9.14580 6.30560 9.25193 6.28166C9.25193 6.28166 9.25193 6.28166 9.25193 6.28166Z';\n\n    const activePath2 =\n      'M6.30855 7.08196C6.48218 6.9692 6.71426 7.01871 6.8271 7.19231C6.93984 7.36595 6.89035 7.59803 6.71675 7.71087C6.55769 7.8143 6.51399 7.8829 6.50288 7.9052C6.50718 7.91375 6.51671 7.92905 6.53804 7.95208C6.59186 8.01016 6.676 8.06871 6.76265 8.11614C6.80333 8.1384 6.83994 8.15555 6.86519 8.16692C6.87727 8.17236 6.88667 8.1762 6.89253 8.17864C6.89522 8.17976 6.89739 8.18117 6.89839 8.18157C6.92411 8.19492 6.94982 8.20826 6.97554 8.22161C7.34059 8.4726 7.44425 8.52362 7.48433 8.54387C7.51885 8.56133 7.56761 8.58533 7.62788 8.63665C7.66711 8.67009 7.71609 8.719 7.77827 8.78118C7.84064 8.84354 7.88955 8.89167 7.9228 8.93059C7.97354 8.98999 7.99693 9.03787 8.0146 9.07219C8.02503 9.09247 8.04365 9.12833 8.09077 9.20501C8.1741 9.33099 8.25744 9.45696 8.34077 9.58294C8.35477 9.60931 8.36876 9.63567 8.38276 9.66204C8.38276 9.66171 8.38276 9.66139 8.38276 9.66106C8.38311 9.66194 8.3836 9.6642 8.38472 9.66692C8.38713 9.67278 8.39182 9.68272 8.39741 9.69524C8.40866 9.72041 8.42527 9.75637 8.44722 9.7968C8.49432 9.88353 8.55171 9.96872 8.60933 10.0224C8.63022 10.0418 8.64563 10.0499 8.65425 10.0546C8.67716 10.0429 8.74616 9.99929 8.84858 9.84173C8.96155 9.66836 9.19361 9.61954 9.36714 9.73235C9.54063 9.84525 9.59026 10.0773 9.47749 10.2509C9.29202 10.5362 9.06335 10.7493 8.77534 10.7988C8.47563 10.8502 8.24137 10.7041 8.09858 10.5712C7.95494 10.4374 7.85125 10.2716 7.78804 10.1552C7.75497 10.0943 7.72938 10.0401 7.71187 10.0009C7.70702 9.99006 7.70284 9.98022 7.69917 9.97161C7.45448 9.61671 7.38641 9.49034 7.34761 9.41497C7.34662 9.41306 7.34544 9.41155 7.34468 9.41009C7.33244 9.39698 7.30693 9.37136 7.24702 9.31145C7.18316 9.24759 7.15849 9.22387 7.14644 9.21282C7.07033 9.17434 6.9431 9.10751 6.58589 8.86321C6.57737 8.85954 6.56726 8.85532 6.55659 8.85052C6.51749 8.83289 6.46383 8.80746 6.40327 8.77434C6.28687 8.71066 6.12089 8.60606 5.98726 8.46184C5.85457 8.31851 5.70938 8.0836 5.76069 7.78411C5.81025 7.49606 6.02305 7.26752 6.30855 7.08196C6.30855 7.08196 6.30855 7.08196 6.30855 7.08196Z';\n\n    const path1 = this.state === 'active' ? activePath : defaultPath;\n    const path2 = this.state === 'active' ? activePath2 : defaultPath2;\n\n    return html`\n      <svg part=\"snap\" viewBox=\"0 0 12 12\" state=${this.state} xmlns=\"http://www.w3.org/2000/svg\">\n        <g part=\"cursor\">\n          <path d=${path1} />\n          <path d=${path2} />\n        </g>\n          \n        <path d=\"M2.5 3.5V8.5\" />\n        <path d=\"M9.5 5V3.5\" />\n        <path d=\"M3.5 9.5H5\" />\n        <path d=\"M8.5 2.5H3.5\" />\n        \n        <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.5 3.5V3.5C1.948 3.5 1.5 3.052 1.5 2.5V2.5C1.5 1.948 1.948 1.5 2.5 1.5V1.5C3.052 1.5 3.5 1.948 3.5 2.5V2.5C3.5 3.052 3.052 3.5 2.5 3.5Z\" />\n        <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.5 3.5V3.5C8.948 3.5 8.5 3.052 8.5 2.5V2.5C8.5 1.948 8.948 1.5 9.5 1.5V1.5C10.052 1.5 10.5 1.948 10.5 2.5V2.5C10.5 3.052 10.052 3.5 9.5 3.5Z\" />\n        <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.5 10.5V10.5C1.948 10.5 1.5 10.052 1.5 9.5V9.5C1.5 8.948 1.948 8.5 2.5 8.5V8.5C3.052 8.5 3.5 8.948 3.5 9.5V9.5C3.5 10.052 3.052 10.5 2.5 10.5Z\" />\n        \n        <g part=\"lines\">\n          <path d=\"M7.5 6V6.5\" />\n          <path d=\"M6.5 7.5H6\" />\n          <path d=\"M9 10.5V10\" />\n          <path d=\"M10 9H10.5\" />\n        </g>\n      </svg>\n    `;\n  }\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-anchor-add',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 12px);\n      height: var(--ease-icon-size, 12px);\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 0.75;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M2.70508 10.5003L5.30008 7.90527\" />\n        <path d=\"M6.59557 6.61121C6.95348 6.96913 6.95348 7.54942 6.59557 7.90734C6.23765 8.26525 5.65736 8.26525 5.29944 7.90734C4.94153 7.54942 4.94153 6.96913 5.29944 6.61121C5.65736 6.25329 6.23765 6.25329 6.59557 6.61121\" />\n        <path d=\"M9.20703 6.50016L8.39453 8.93866C8.27903 9.28516 7.98353 9.54066 7.62453 9.60616L2.70703 10.5002L3.39036 6.74393M9.20006 6.50016L9.72739 5.98984C10.2895 5.4459 10.2968 4.54693 9.74375 3.99385L9.22391 3.47402C8.68351 2.93361 7.80957 2.92644 7.26038 3.45792L6.98022 3.72904\" />\n        <path d=\"M3.49931 5.54525C2.36926 5.54516 1.45317 4.62914 1.453 3.49909C1.47001 2.37501 2.37788 1.46826 3.50198 1.45264C4.63212 1.45337 5.54769 2.37013 5.54695 3.50028C5.54621 4.63042 4.62945 5.54599 3.49931 5.54525\" />\n        <path d=\"M3.4993 2.69516V4.30289\" />\n        <path d=\"M4.30317 3.49902H2.69543\" />\n      </svg>\n    `;\n  }\n})\nexport class IconAnchorAdd extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-anchor-remove',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 12px);\n      height: var(--ease-icon-size, 12px);\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 0.75;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M2.70508 10.5003L5.30008 7.90527\" />\n        <path d=\"M6.59557 6.61121C6.95348 6.96913 6.95348 7.54942 6.59557 7.90734C6.23765 8.26525 5.65736 8.26525 5.29944 7.90734C4.94153 7.54942 4.94153 6.96913 5.29944 6.61121C5.65736 6.25329 6.23765 6.25329 6.59557 6.61121\" />\n        <path d=\"M9.20703 6.50016L8.39453 8.93866C8.27903 9.28516 7.98353 9.54066 7.62453 9.60616L2.70703 10.5002L3.39036 6.74393M9.20006 6.50016L9.72739 5.98984C10.2895 5.4459 10.2968 4.54693 9.74375 3.99385L9.22391 3.47402C8.68351 2.93361 7.80957 2.92644 7.26038 3.45792L6.98022 3.72904\" />\n        <path d=\"M3.49931 5.54525C2.36926 5.54516 1.45317 4.62914 1.453 3.49909C1.47001 2.37501 2.37788 1.46826 3.50198 1.45264C4.63212 1.45337 5.54769 2.37013 5.54695 3.50028C5.54621 4.63042 4.62945 5.54599 3.49931 5.54525\" />\n        <path d=\"M4.30317 3.49902H2.69543\" />\n      </svg>\n    `;\n  }\n})\nexport class IconAnchorRemove extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-arrow-up',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M6.99992 12.6666V3.33331M6.99992 3.33331L2.33325 7.99998M6.99992 3.33331L11.6666 7.99998\" />\n      </svg>\n    `;\n  }\n})\nexport class ArrowUp extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-bezier',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 12px);\n      height: var(--ease-icon-size, 12px);\n      fill: currentColor;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M9.44279 8.84005C9.56156 9.00972 9.79538 9.05098 9.96505 8.93221C10.1347 8.81344 10.176 8.57962 10.0572 8.40995L9.75 8.625L9.44279 8.84005ZM1.94279 8.40995C1.82402 8.57962 1.86528 8.81344 2.03495 8.93221C2.20462 9.05098 2.43844 9.00972 2.55721 8.84005L2.25 8.625L1.94279 8.40995ZM7.21875 4.21875H6.84375C6.84375 4.68474 6.46599 5.0625 6 5.0625V5.4375V5.8125C6.8802 5.8125 7.59375 5.09895 7.59375 4.21875H7.21875ZM6 5.4375V5.0625C5.53401 5.0625 5.15625 4.68474 5.15625 4.21875H4.78125H4.40625C4.40625 5.09895 5.1198 5.8125 6 5.8125V5.4375ZM4.78125 4.21875H5.15625C5.15625 3.75276 5.53401 3.375 6 3.375V3V2.625C5.1198 2.625 4.40625 3.33855 4.40625 4.21875H4.78125ZM6 3V3.375C6.46599 3.375 6.84375 3.75276 6.84375 4.21875H7.21875H7.59375C7.59375 3.33855 6.8802 2.625 6 2.625V3ZM7.125 4.875L6.81779 5.09005L9.44279 8.84005L9.75 8.625L10.0572 8.40995L7.43221 4.65995L7.125 4.875ZM4.875 4.875L4.56779 4.65995L1.94279 8.40995L2.25 8.625L2.55721 8.84005L5.18221 5.09005L4.875 4.875Z\" />\n      </svg>\n    `;\n  }\n})\nexport class IconBezier extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-bezier-angle',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 12px);\n      height: var(--ease-icon-size, 12px);\n      fill: currentColor;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M1.875 4.21875C1.875 4.63296 1.53921 4.96875 1.125 4.96875C0.710786 4.96875 0.375 4.63296 0.375 4.21875C0.375 3.80454 0.710786 3.46875 1.125 3.46875C1.53921 3.46875 1.875 3.80454 1.875 4.21875Z\"  fill-opacity=\"0.9\"/>\n        <path d=\"M1.64062 4.21875C1.64062 3.93398 1.40977 3.70312 1.125 3.70312C0.840228 3.70312 0.609375 3.93398 0.609375 4.21875C0.609375 4.50352 0.840228 4.73438 1.125 4.73438C1.40977 4.73438 1.64062 4.50352 1.64062 4.21875ZM2.10938 4.21875C2.10938 4.76241 1.66866 5.20312 1.125 5.20312C0.581345 5.20312 0.140625 4.76241 0.140625 4.21875C0.140625 3.67509 0.581345 3.23438 1.125 3.23438C1.66866 3.23438 2.10938 3.67509 2.10938 4.21875Z\" />\n        <path d=\"M9.23535 6.49023L8.76465 6.94727L6.88965 5.00977L7.36035 4.55273L9.23535 6.49023Z\" />\n        <path d=\"M10.25 7.34375C10.25 7.75796 9.91421 8.09375 9.5 8.09375C9.08579 8.09375 8.75 7.75796 8.75 7.34375C8.75 6.92954 9.08579 6.59375 9.5 6.59375C9.91421 6.59375 10.25 6.92954 10.25 7.34375Z\"  fill-opacity=\"0.9\"/>\n        <path d=\"M10.0156 7.34375C10.0156 7.05898 9.78477 6.82812 9.5 6.82812C9.21523 6.82812 8.98438 7.05898 8.98438 7.34375C8.98438 7.62852 9.21523 7.85938 9.5 7.85938C9.78477 7.85938 10.0156 7.62852 10.0156 7.34375ZM10.4844 7.34375C10.4844 7.88741 10.0437 8.32812 9.5 8.32812C8.95634 8.32812 8.51562 7.88741 8.51562 7.34375C8.51562 6.80009 8.95634 6.35938 9.5 6.35938C10.0437 6.35938 10.4844 6.80009 10.4844 7.34375Z\" />\n        <path d=\"M6.84375 4.21875C6.84375 3.75276 6.46599 3.375 6 3.375C5.53401 3.375 5.15625 3.75276 5.15625 4.21875C5.15625 4.68474 5.53401 5.0625 6 5.0625C6.46599 5.0625 6.84375 4.68474 6.84375 4.21875ZM7.59375 4.21875C7.59375 5.09895 6.8802 5.8125 6 5.8125C5.1198 5.8125 4.40625 5.09895 4.40625 4.21875C4.40625 3.33855 5.1198 2.625 6 2.625C6.8802 2.625 7.59375 3.33855 7.59375 4.21875Z\" />\n        <path d=\"M1.5 9C1.5 6.96377 2.30291 5.79798 3.14746 5.15137C3.56202 4.83404 3.9757 4.65002 4.28613 4.54492C4.44174 4.49225 4.57289 4.45885 4.66699 4.43848C4.71396 4.42831 4.75192 4.42158 4.7793 4.41699C4.79301 4.41469 4.80424 4.41234 4.8125 4.41113C4.81637 4.41057 4.81967 4.41051 4.82227 4.41016C4.82361 4.40997 4.82519 4.40931 4.82617 4.40918H4.82812L4.92188 5.15332C4.91878 5.15377 4.91158 5.15487 4.90332 5.15625C4.8868 5.15902 4.86011 5.16334 4.8252 5.1709C4.75525 5.18605 4.6519 5.21238 4.52637 5.25488C4.27438 5.34019 3.93785 5.49035 3.60254 5.74707C2.94718 6.24896 2.25 7.19277 2.25 9C2.25 9.20711 2.08211 9.375 1.875 9.375C1.66789 9.375 1.5 9.20711 1.5 9ZM7.5127 9C7.5127 7.09758 7.32324 6.08783 7.15039 5.56738C7.06453 5.30889 6.98595 5.1804 6.94434 5.125C6.92803 5.1033 6.91762 5.09324 6.91504 5.09082C6.91648 5.09202 6.92022 5.09529 6.92676 5.09961C6.93038 5.102 6.93521 5.10442 6.94043 5.10742C6.94302 5.10891 6.94624 5.11071 6.94922 5.1123C6.95072 5.1131 6.9525 5.11442 6.9541 5.11523L6.95703 5.11621L6.95801 5.11719L7.29199 4.44531L7.29297 4.44629C7.29386 4.44673 7.29499 4.4468 7.2959 4.44727C7.29775 4.44821 7.29983 4.44917 7.30176 4.4502C7.30557 4.45222 7.30938 4.45469 7.31348 4.45703C7.32177 4.46178 7.33053 4.46749 7.33984 4.47363C7.35849 4.48593 7.37956 4.50097 7.40137 4.51953C7.44494 4.55668 7.49313 4.60714 7.54395 4.6748C7.64536 4.80983 7.75747 5.0154 7.8623 5.33105C8.07087 5.95905 8.2627 7.0587 8.2627 9C8.2627 9.20711 8.0948 9.375 7.8877 9.375C7.68065 9.37492 7.5127 9.20706 7.5127 9Z\" />\n        <path d=\"M2.04004 3.89014H4.71004V4.55014H2.04004V3.89014Z\" />\n      </svg>\n    `;\n  }\n})\nexport class IconBezierAngle extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-bezier-distribute',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 12px);\n      height: var(--ease-icon-size, 12px);\n      fill: currentColor;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M5.125 5.64502C5.33211 5.64502 5.5 5.81291 5.5 6.02002C5.5 6.22713 5.33211 6.39502 5.125 6.39502H2.5C2.29289 6.39502 2.125 6.22713 2.125 6.02002C2.125 5.81291 2.29289 5.64502 2.5 5.64502H5.125Z\" />\n        <path d=\"M2.125 6.02002C2.125 5.81313 1.95689 5.64502 1.75 5.64502C1.54311 5.64502 1.375 5.81313 1.375 6.02002C1.375 6.22691 1.54311 6.39502 1.75 6.39502C1.95689 6.39502 2.125 6.22691 2.125 6.02002ZM2.875 6.02002C2.875 6.64113 2.37111 7.14502 1.75 7.14502C1.12889 7.14502 0.625 6.64113 0.625 6.02002C0.625 5.39891 1.12889 4.89502 1.75 4.89502C2.37111 4.89502 2.875 5.39891 2.875 6.02002Z\" />\n        <path d=\"M6.5 5.67285C6.5 5.60396 6.44389 5.54785 6.375 5.54785H5.625C5.55611 5.54785 5.5 5.60396 5.5 5.67285V6.42285C5.5 6.49174 5.55611 6.54785 5.625 6.54785H6.375C6.44389 6.54785 6.5 6.49174 6.5 6.42285V5.67285ZM7.25 6.42285C7.25 6.90596 6.85811 7.29785 6.375 7.29785H5.625C5.14189 7.29785 4.75 6.90596 4.75 6.42285V5.67285C4.75 5.18974 5.14189 4.79785 5.625 4.79785H6.375C6.85811 4.79785 7.25 5.18974 7.25 5.67285V6.42285Z\" />\n        <path d=\"M3.125 9.25C3.125 9.18111 3.06889 9.125 3 9.125H2.25C2.18111 9.125 2.125 9.18111 2.125 9.25V10C2.125 10.0689 2.18111 10.125 2.25 10.125H3C3.06889 10.125 3.125 10.0689 3.125 10V9.25ZM3.875 10C3.875 10.4831 3.48311 10.875 3 10.875H2.25C1.76689 10.875 1.375 10.4831 1.375 10V9.25C1.375 8.76689 1.76689 8.375 2.25 8.375H3C3.48311 8.375 3.875 8.76689 3.875 9.25V10Z\" />\n        <path d=\"M9.797 2C9.797 1.93111 9.74089 1.875 9.672 1.875H8.922C8.85285 1.875 8.797 1.93086 8.797 2V2.75C8.797 2.81889 8.8531 2.875 8.922 2.875H9.672C9.74089 2.875 9.797 2.81889 9.797 2.75V2ZM10.547 2.75C10.547 3.23311 10.1551 3.625 9.672 3.625H8.922C8.43889 3.625 8.047 3.23311 8.047 2.75V2C8.047 1.51714 8.43815 1.125 8.922 1.125H9.672C10.1551 1.125 10.547 1.51689 10.547 2V2.75Z\" />\n        <path d=\"M9.33883 2.87576C9.54514 2.89263 9.69927 3.07377 9.68258 3.28005C9.56091 4.76814 8.50457 5.99034 7.09078 6.34255C6.88985 6.39261 6.6858 6.27003 6.6357 6.06912C6.58565 5.86818 6.70822 5.66414 6.90914 5.61404C8.01222 5.33926 8.83909 4.38526 8.93453 3.21951C8.9514 3.01316 9.1325 2.859 9.33883 2.87576Z\" />\n        <path d=\"M9.5 5.60498C9.70711 5.60498 9.875 5.77287 9.875 5.97998C9.875 6.18709 9.70711 6.35498 9.5 6.35498H6.875C6.66789 6.35498 6.5 6.18709 6.5 5.97998C6.5 5.77287 6.66789 5.60498 6.875 5.60498H9.5Z\" />\n        <path d=\"M10.625 5.97998C10.625 5.77309 10.4569 5.60498 10.25 5.60498C10.0431 5.60498 9.875 5.77309 9.875 5.97998C9.875 6.18687 10.0431 6.35498 10.25 6.35498C10.4569 6.35498 10.625 6.18687 10.625 5.97998ZM11.375 5.97998C11.375 6.60109 10.8711 7.10498 10.25 7.10498C9.62889 7.10498 9.125 6.60109 9.125 5.97998C9.125 5.35887 9.62889 4.85498 10.25 4.85498C10.8711 4.85498 11.375 5.35887 11.375 5.97998Z\" />\n        <path d=\"M4.83132 5.65719C5.03226 5.60714 5.23631 5.72969 5.28639 5.93062C5.33644 6.13153 5.21382 6.33557 5.01296 6.3857C3.90988 6.66049 3.08301 7.61448 2.98757 8.78023C2.9707 8.98655 2.78956 9.14068 2.58327 9.12398C2.37696 9.10711 2.22283 8.92597 2.23952 8.71969C2.36119 7.23157 3.41749 6.00938 4.83132 5.65719Z\" />\n      </svg>\n    `;\n  }\n})\nexport class IconBezierDistribute extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-bezier-length',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 12px);\n      height: var(--ease-icon-size, 12px);\n      fill: currentColor;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M6.84375 4.21875C6.84375 3.75276 6.46599 3.375 6 3.375C5.53401 3.375 5.15625 3.75276 5.15625 4.21875C5.15625 4.68474 5.53401 5.0625 6 5.0625C6.46599 5.0625 6.84375 4.68474 6.84375 4.21875ZM7.59375 4.21875C7.59375 5.09895 6.8802 5.8125 6 5.8125C5.1198 5.8125 4.40625 5.09895 4.40625 4.21875C4.40625 3.33855 5.1198 2.625 6 2.625C6.8802 2.625 7.59375 3.33855 7.59375 4.21875Z\" />\n        <path d=\"M2.48438 4.21875C2.48438 4.76241 2.04366 5.20312 1.5 5.20312C0.956345 5.20312 0.515625 4.76241 0.515625 4.21875C0.515625 3.67509 0.956345 3.23438 1.5 3.23438C2.04366 3.23438 2.48438 3.67509 2.48438 4.21875Z\" />\n        <path d=\"M10.4844 4.21875C10.4844 4.76241 10.0437 5.20312 9.5 5.20312C8.95634 5.20312 8.51562 4.76241 8.51562 4.21875C8.51562 3.67509 8.95634 3.23438 9.5 3.23438C10.0437 3.23438 10.4844 3.67509 10.4844 4.21875Z\" />\n        <path d=\"M1.5 9C1.5 6.96377 2.30291 5.79798 3.14746 5.15137C3.56202 4.83404 3.9757 4.65002 4.28613 4.54492C4.44174 4.49225 4.57289 4.45885 4.66699 4.43848C4.71396 4.42831 4.75192 4.42158 4.7793 4.41699C4.79301 4.41469 4.80424 4.41234 4.8125 4.41113C4.81637 4.41057 4.81967 4.41051 4.82227 4.41016L4.82617 4.40918H4.82812L4.92188 5.15332C4.91878 5.15377 4.91158 5.15487 4.90332 5.15625C4.8868 5.15902 4.86011 5.16334 4.8252 5.1709C4.75525 5.18605 4.6519 5.21238 4.52637 5.25488C4.27438 5.34019 3.93785 5.49035 3.60254 5.74707C2.94718 6.24896 2.25 7.19277 2.25 9C2.25 9.20711 2.08211 9.375 1.875 9.375C1.66789 9.375 1.5 9.20711 1.5 9ZM9.75 9C9.75 7.19277 9.05282 6.24896 8.39746 5.74707C8.06215 5.49035 7.72562 5.34019 7.47363 5.25488C7.3481 5.21238 7.24475 5.18605 7.1748 5.1709C7.13989 5.16334 7.1132 5.15902 7.09668 5.15625C7.08842 5.15487 7.0822 5.15377 7.0791 5.15332L7.17188 4.40918H7.17383L7.17773 4.41016C7.18033 4.41051 7.18363 4.41057 7.1875 4.41113C7.19576 4.41234 7.20699 4.41469 7.2207 4.41699C7.24808 4.42158 7.28604 4.42831 7.33301 4.43848C7.42711 4.45885 7.55826 4.49225 7.71387 4.54492C8.0243 4.65002 8.43798 4.83404 8.85254 5.15137C9.69709 5.79798 10.5 6.96377 10.5 9C10.5 9.20711 10.3321 9.375 10.125 9.375C9.91789 9.375 9.75 9.20711 9.75 9Z\" />\n        <path d=\"M1.96997 3.83984H4.59997V4.49984H1.96997V3.83984Z\" />\n        <path d=\"M6.96997 3.83984H8.59997V4.49984H6.96997V3.83984Z\" />\n      </svg>\n    `;\n  }\n})\nexport class IconBezierLength extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-bezier-mirror',\n  styles: `\n    :host {\n      display: block;\n      width: var(--ease-icon-size, 12px);\n      height: var(--ease-icon-size, 12px);\n      fill: currentColor;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M6.84375 4.21875C6.84375 3.75276 6.46599 3.375 6 3.375C5.53401 3.375 5.15625 3.75276 5.15625 4.21875C5.15625 4.68474 5.53401 5.0625 6 5.0625C6.46599 5.0625 6.84375 4.68474 6.84375 4.21875ZM7.59375 4.21875C7.59375 5.09895 6.8802 5.8125 6 5.8125C5.1198 5.8125 4.40625 5.09895 4.40625 4.21875C4.40625 3.33855 5.1198 2.625 6 2.625C6.8802 2.625 7.59375 3.33855 7.59375 4.21875Z\" />\n        <path d=\"M2.48438 4.21875C2.48438 4.76241 2.04366 5.20312 1.5 5.20312C0.956345 5.20312 0.515625 4.76241 0.515625 4.21875C0.515625 3.67509 0.956345 3.23438 1.5 3.23438C2.04366 3.23438 2.48438 3.67509 2.48438 4.21875Z\" />\n        <path d=\"M11.4844 4.21875C11.4844 4.76241 11.0437 5.20312 10.5 5.20312C9.95634 5.20312 9.51562 4.76241 9.51562 4.21875C9.51562 3.67509 9.95634 3.23438 10.5 3.23438C11.0437 3.23438 11.4844 3.67509 11.4844 4.21875Z\" />\n        <path d=\"M1.5 9C1.5 6.96377 2.30291 5.79798 3.14746 5.15137C3.56202 4.83404 3.9757 4.65002 4.28613 4.54492C4.44174 4.49225 4.57289 4.45885 4.66699 4.43848C4.71396 4.42831 4.75192 4.42158 4.7793 4.41699C4.79301 4.41469 4.80424 4.41234 4.8125 4.41113C4.81637 4.41057 4.81967 4.41051 4.82227 4.41016C4.82361 4.40997 4.82519 4.40931 4.82617 4.40918H4.82812L4.92188 5.15332C4.91878 5.15377 4.91158 5.15487 4.90332 5.15625C4.8868 5.15902 4.86011 5.16334 4.8252 5.1709C4.75525 5.18605 4.6519 5.21238 4.52637 5.25488C4.27438 5.34019 3.93785 5.49035 3.60254 5.74707C2.94718 6.24896 2.25 7.19277 2.25 9C2.25 9.20711 2.08211 9.375 1.875 9.375C1.66789 9.375 1.5 9.20711 1.5 9ZM9.75 9C9.75 7.19277 9.05282 6.24896 8.39746 5.74707C8.06215 5.49035 7.72562 5.34019 7.47363 5.25488C7.3481 5.21238 7.24475 5.18605 7.1748 5.1709C7.13989 5.16334 7.1132 5.15902 7.09668 5.15625C7.08842 5.15487 7.0822 5.15377 7.0791 5.15332L7.17188 4.40918H7.17383C7.17481 4.40931 7.17639 4.40997 7.17773 4.41016C7.18033 4.41051 7.18363 4.41057 7.1875 4.41113C7.19576 4.41234 7.20699 4.41469 7.2207 4.41699C7.24808 4.42158 7.28604 4.42831 7.33301 4.43848C7.42711 4.45885 7.55826 4.49225 7.71387 4.54492C8.0243 4.65002 8.43798 4.83404 8.85254 5.15137C9.69709 5.79798 10.5 6.96377 10.5 9C10.5 9.20711 10.3321 9.375 10.125 9.375C9.91789 9.375 9.75 9.20711 9.75 9Z\" />\n        <path d=\"M1.96997 3.83984H4.59997V4.49984H1.96997V3.83984Z\" />\n        <path d=\"M6.96997 3.83984H9.59997V4.49984H6.96997V3.83984Z\" />\n      </svg>\n    `;\n  }\n})\nexport class IconBezierMirror extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-check',\n  styles: `\n    :host {\n      display: block;\n      width: 12px;\n      height: 12px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M3 6.5L5.33333 9L10 4\" path-length=\"100\" />\n      </svg>\n    `;\n  }\n})\nexport class IconCheck extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-circle-arrow-left',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M14.6667 6.66667C14.6667 6.66667 13.33 4.84548 12.2441 3.75883C11.1582 2.67218 9.6576 2 8 2C4.68629 2 2 4.68629 2 8C2 11.3137 4.68629 14 8 14C10.7354 14 13.0433 12.1695 13.7655 9.66667M14.6667 6.66667V2.66667M14.6667 6.66667H10.6667\" />\n      </svg>\n    `;\n  }\n})\nexport class IconCircleArrowLeft extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-circle-arrow-right',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M1.33333 6.66667C1.33333 6.66667 2.66999 4.84548 3.75589 3.75883C4.84179 2.67218 6.3424 2 8 2C11.3137 2 14 4.68629 14 8C14 11.3137 11.3137 14 8 14C5.2646 14 2.95674 12.1695 2.23451 9.66667M1.33333 6.66667V2.66667M1.33333 6.66667H5.33333\" />\n      </svg>\n    `;\n  }\n})\nexport class IconCircleArrowRight extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-code',\n  styles: `\n    :host {\n      display: block;\n      width: 12px;\n      height: 12px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M8 9L11 6L8 3M4 3L1 6L4 9\" />\n      </svg>\n    `;\n  }\n})\nexport class IconCode extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-dots',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M8.00008 8.66655C8.36827 8.66655 8.66675 8.36808 8.66675 7.99989C8.66675 7.6317 8.36827 7.33322 8.00008 7.33322C7.63189 7.33322 7.33341 7.6317 7.33341 7.99989C7.33341 8.36808 7.63189 8.66655 8.00008 8.66655Z\" />\n        <path d=\"M12.6667 8.66655C13.0349 8.66655 13.3334 8.36808 13.3334 7.99989C13.3334 7.6317 13.0349 7.33322 12.6667 7.33322C12.2986 7.33322 12.0001 7.6317 12.0001 7.99989C12.0001 8.36808 12.2986 8.66655 12.6667 8.66655Z\" />\n        <path d=\"M3.33341 8.66655C3.7016 8.66655 4.00008 8.36808 4.00008 7.99989C4.00008 7.6317 3.7016 7.33322 3.33341 7.33322C2.96522 7.33322 2.66675 7.6317 2.66675 7.99989C2.66675 8.36808 2.96522 8.66655 3.33341 8.66655Z\" />\n      </svg>\n    `;\n  }\n})\nexport class IconDots extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-mention',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M10.4 5.59963V8.59962C10.4 9.07701 10.5896 9.53485 10.9272 9.87242C11.2648 10.21 11.7226 10.3996 12.2 10.3996C12.6774 10.3996 13.1352 10.21 13.4728 9.87242C13.8104 9.53485 14 9.07701 14 8.59962V7.99962C13.9999 6.64544 13.5417 5.33111 12.7 4.27035C11.8582 3.20958 10.6823 2.46476 9.36359 2.15701C8.04484 1.84925 6.66076 1.99665 5.43641 2.57525C4.21206 3.15384 3.21944 4.1296 2.61996 5.34386C2.02048 6.55812 1.84939 7.93947 2.13451 9.26329C2.41963 10.5871 3.14419 11.7756 4.19038 12.6354C5.23657 13.4952 6.54286 13.9758 7.89684 13.9991C9.25083 14.0224 10.5729 13.587 11.648 12.7636M10.4 7.99962C10.4 9.32511 9.32549 10.3996 8 10.3996C6.67452 10.3996 5.6 9.32511 5.6 7.99962C5.6 6.67414 6.67452 5.59963 8 5.59963C9.32549 5.59963 10.4 6.67414 10.4 7.99962Z\" />\n      </svg>\n    `;\n  }\n})\nexport class IconMention extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-minus',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M5 7.99995H11\" />\n      </svg>\n    `;\n  }\n})\nexport class IconMinus extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-plus',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M8.00018 4.28591C8.00018 4.28591 8.00018 8.42263 8.00018 11.714M4.28613 7.99995H11.7142\" />\n      </svg>\n    `;\n  }\n})\nexport class IconPlus extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n  tag: 'ease-icon-settings',\n  styles: `\n    :host {\n      display: block;\n      width: 16px;\n      height: 16px;\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  template() {\n    return html`\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M2 5.33319L10 5.33319M10 5.33319C10 6.43776 10.8954 7.33319 12 7.33319C13.1046 7.33319 14 6.43776 14 5.33319C14 4.22862 13.1046 3.33319 12 3.33319C10.8954 3.33319 10 4.22862 10 5.33319ZM6 10.6665L14 10.6665M6 10.6665C6 11.7711 5.10457 12.6665 4 12.6665C2.89543 12.6665 2 11.7711 2 10.6665C2 9.56195 2.89543 8.66652 4 8.66652C5.10457 8.66652 6 9.56195 6 10.6665Z\" />\n      </svg>\n    `;\n  }\n})\nexport class Settings extends HTMLElement {\n  declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\ntype LogoLoaderState = 'idle' | 'intro' | 'loop' | 'exit';\n\nexport type LogoIntroVariant = 'wave' | 'particle';\n\ninterface DotData {\n  id: string;\n  cx: number;\n  cy: number;\n}\n\nconst CENTER = { x: 74, y: 74 };\n\nconst DOTS_DATA: DotData[] = [\n  { id: 'dot-1', cx: 7.22725, cy: 73.99975 },\n  { id: 'dot-2', cx: 8.0, cy: 107.63685 },\n  { id: 'dot-3', cx: 41.36365, cy: 7.72734 },\n  { id: 'dot-4', cx: 40.36105, cy: 40.36375 },\n  { id: 'dot-5', cx: 40.36105, cy: 107.63625 },\n  { id: 'dot-6', cx: 41.36365, cy: 140.77285 },\n  { id: 'dot-7', cx: 73.99995, cy: 7.22725 },\n  { id: 'dot-8', cx: 73.99995, cy: 140.77325 },\n  { id: 'dot-9', cx: 108.13785, cy: 7.72734 },\n  { id: 'dot-10', cx: 107.88425, cy: 73.99975 },\n  { id: 'dot-11', cx: 108.13785, cy: 140.77285 },\n  { id: 'dot-12', cx: 141.27285, cy: 40.86385 },\n  { id: 'dot-13', cx: 140.77225, cy: 73.99975 },\n  { id: 'dot-14', cx: 141.27285, cy: 107.63685 },\n  { id: 'dot-15', cx: 40.36165, cy: 73.99925 },\n  { id: 'dot-16', cx: 74.00125, cy: 40.36345 },\n  { id: 'dot-17', cx: 74.00125, cy: 73.99925 },\n  { id: 'dot-18', cx: 74.00125, cy: 107.63585 },\n  { id: 'dot-19', cx: 107.63485, cy: 40.36345 },\n  { id: 'dot-20', cx: 107.63485, cy: 107.63585 },\n  { id: 'dot-21', cx: 141.77, cy: 8.23 },\n  { id: 'dot-22', cx: 141.77, cy: 140.77 },\n  { id: 'dot-23', cx: 7.73019, cy: 140.77 },\n  { id: 'dot-24', cx: 7.72018, cy: 8.22 },\n  { id: 'dot-25', cx: 7.73518, cy: 40.865 }\n];\n\nconst INNER_DOT_IDS = ['dot-19', 'dot-20', 'dot-18', 'dot-15', 'dot-17', 'dot-16'];\n\nconst OUTER_DOT_IDS = DOTS_DATA.map((d) => d.id).filter((id) => !INNER_DOT_IDS.includes(id));\n\nconst forceReflow = (el: Element): void => {\n  void window.getComputedStyle(el).opacity;\n};\n\nconst getAngle = (dot: DotData): number => Math.atan2(dot.cy - CENTER.y, dot.cx - CENTER.x);\n\nconst sortByAngle = (ids: string[]): DotData[] =>\n  ids\n    .map((id) => DOTS_DATA.find((d) => d.id === id))\n    .filter((dot): dot is DotData => dot != null)\n    .sort((a, b) => getAngle(a) - getAngle(b));\n\nconst LOOP_DURATION = 1500;\nconst ROTATION_DURATION = 600;\n\n@Component({\n  tag: 'ease-logo-loader',\n  styles: `\n    :host {\n      display: inline-block;\n      --ease-out: cubic-bezier(0.22, 0.61, 0.36, 1);\n      --ease-in-out: cubic-bezier(0.45, 0, 0.55, 1);\n      --ease-overshoot: cubic-bezier(0.34, 1.56, 0.64, 1);\n      \n      --dot-dark: var(--color-gray-0, oklab(98.81% 0 0));\n      --dot-medium: var(--color-gray-600, oklab(65.21% -0.0019 -0.0144));\n      --dot-light: var(--color-gray-700, oklab(37.92% -0.0006 -0.0179));\n      --dot-accent: var(--color-blue-600, oklab(76.85% 0.0462 -0.1115));\n    }\n\n    .logo-loader {\n      position: relative;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: var(--logo-loader-size, 36px);\n      height: var(--logo-loader-size, 36px);\n    }\n\n    .logo-loader__svg {\n      width: 100%;\n      height: 100%;\n      display: block;\n      transform-origin: center;\n      overflow: visible;\n    }\n\n    .logo-loader__svg rect {\n      transform-box: fill-box;\n      transform-origin: center;\n      transition:\n        transform 380ms var(--ease-out),\n        fill 320ms ease,\n        opacity 320ms ease;\n    }\n\n    /* State: intro - dots are animating in */\n    .logo-loader[data-state='intro'] .logo-loader__svg rect {\n      opacity: 0;\n      transform: scale(0);\n    }\n\n    /* Outer dots loading animation */\n    @keyframes loading-outer {\n      0%, 100% {\n        transform: scale(var(--base-scale, 1));\n        fill: var(--dot-light);\n        opacity: 0.4;\n      }\n      15% {\n        transform: scale(calc(var(--base-scale, 1) * 1.35));\n        fill: var(--dot-dark);\n        opacity: 1;\n      }\n      35% {\n        transform: scale(var(--base-scale, 1));\n        fill: var(--dot-medium);\n        opacity: 0.8;\n      }\n    }\n\n    /* Inner dots loading animation */\n    @keyframes loading-inner {\n      0%, 100% {\n        transform: scale(var(--base-scale, 0.6));\n        opacity: 0.7;\n        fill: var(--dot-medium);\n      }\n      50% {\n        transform: scale(calc(var(--base-scale, 0.6) * 1.9));\n        opacity: 0.1;\n        fill: var(--dot-light);\n      }\n    }\n\n    .dot-loading {\n      animation-name: loading-outer;\n      animation-duration: 600ms;\n      animation-timing-function: cubic-bezier(0.3, 0.6, 0.4, 1);\n      animation-iteration-count: infinite;\n      animation-fill-mode: both;\n      animation-delay: var(--delay, 0ms);\n    }\n\n    .dot-loading-inner {\n      animation-name: loading-inner;\n      animation-duration: 1500ms;\n      animation-timing-function: ease-in-out;\n      animation-iteration-count: infinite;\n      animation-fill-mode: both;\n      animation-delay: var(--delay, 0ms);\n    }\n\n    /* Exit animation class */\n    .restoring {\n      transition:\n        transform 450ms cubic-bezier(0.25, 0, 0.5, 1),\n        fill 350ms ease,\n        opacity 350ms ease;\n    }\n\n    /* Particle intro animation */\n    @keyframes particle-bounce {\n      0% { transform: scale(1); }\n      40% { transform: scale(1.25); }\n      65% { transform: scale(0.95); }\n      85% { transform: scale(1.05); }\n      100% { transform: scale(1); }\n    }\n\n    .particle-bounce {\n      animation: particle-bounce 400ms var(--ease-overshoot) both;\n    }\n\n    /* Shockwave ring animation */\n    @keyframes shockwave-expansion {\n      0% {\n        transform: scale(1);\n        opacity: 1;\n        stroke-width: 1.5px;\n      }\n      100% {\n        transform: scale(4);\n        opacity: 0;\n        stroke-width: 0.5px;\n      }\n    }\n\n    .shockwave-ring {\n      fill: none;\n      stroke: var(--dot-dark);\n      transform-box: fill-box;\n      transform-origin: center;\n      animation: shockwave-expansion 900ms cubic-bezier(0.165, 0.84, 0.44, 1) both;\n    }\n\n    /* Pulse wave for intro */\n    @keyframes pulse-wave {\n      0% {\n        transform: scale(1);\n        filter: brightness(1);\n      }\n      50% {\n        transform: scale(1.2);\n        filter: brightness(1.6);\n        fill: var(--dot-light);\n      }\n      100% {\n        transform: scale(1);\n        filter: brightness(1);\n      }\n    }\n\n    .dot-pulse-wave {\n      animation: pulse-wave var(--pulse-duration, 500ms) var(--pulse-delay, 0ms) cubic-bezier(0.455, 0.03, 0.515, 0.955);\n    }\n\n    @media (prefers-reduced-motion: reduce) {\n      .logo-loader__svg {\n        transition: none;\n        transform: scale(1);\n      }\n      .logo-loader__svg rect {\n        animation: none !important;\n        transition: none;\n        transform: scale(1);\n        opacity: 1;\n      }\n    }\n  `,\n  template(host: LogoLoader) {\n    const size = host.size ?? 36;\n    const state = host.state;\n    const ariaLabel = host.ariaLabel;\n    const ariaLabelTrimmed = ariaLabel?.trim() ?? '';\n\n    return html`\n      <div\n        class=\"logo-loader\"\n        data-state=${state}\n        style=${`--logo-loader-size:${size}px;`}\n      >\n        <svg\n          viewBox=\"0 0 148 148\"\n          fill=\"none\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          class=\"logo-loader__svg\"\n          role=${ariaLabelTrimmed ? 'img' : null}\n          aria-label=${ariaLabelTrimmed || null}\n          aria-hidden=${ariaLabelTrimmed ? null : 'true'}\n          focusable=${ariaLabelTrimmed ? null : 'false'}\n        >\n          <g class=\"shockwave-container\"></g>\n          \n          <rect id=\"dot-1\" x=\"0.5\" y=\"67.2725\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n          <rect id=\"dot-2\" x=\"3.5\" y=\"103.152\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-medium)\" />\n          <rect id=\"dot-3\" x=\"36.8788\" y=\"3.24249\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-medium)\" />\n          <rect id=\"dot-4\" x=\"33.6338\" y=\"33.6365\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n          <rect id=\"dot-5\" x=\"33.6338\" y=\"100.909\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n          <rect id=\"dot-6\" x=\"36.8788\" y=\"136.288\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-medium)\" />\n          <rect id=\"dot-7\" x=\"67.2727\" y=\"0.5\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-light)\" />\n          <rect id=\"dot-8\" x=\"67.2727\" y=\"134.046\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n          <rect id=\"dot-9\" x=\"103.653\" y=\"3.24249\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-medium)\" />\n          <rect id=\"dot-10\" x=\"101.407\" y=\"67.2725\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n          <rect id=\"dot-11\" x=\"103.653\" y=\"136.288\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-light)\" />\n          <rect id=\"dot-12\" x=\"136.788\" y=\"36.379\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-light)\" />\n          <rect id=\"dot-13\" x=\"134.045\" y=\"67.2725\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-light)\" />\n          <rect id=\"dot-14\" x=\"136.788\" y=\"103.152\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-light)\" />\n          \n          <rect id=\"dot-15\" x=\"26.9071\" y=\"60.5447\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n          <rect id=\"dot-16\" x=\"60.5467\" y=\"26.9089\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n          <rect id=\"dot-17\" x=\"60.5467\" y=\"60.5447\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n          <rect id=\"dot-18\" x=\"60.5467\" y=\"94.1813\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n          <rect id=\"dot-19\" x=\"94.1803\" y=\"26.9089\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n          <rect id=\"dot-20\" x=\"94.1803\" y=\"94.1813\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n          \n          <rect id=\"dot-21\" x=\"139.53\" y=\"5.98999\" width=\"4.48\" height=\"4.48\" rx=\"2.24\" fill=\"var(--dot-light)\" />\n          <rect id=\"dot-22\" x=\"139.53\" y=\"138.53\" width=\"4.48\" height=\"4.48\" rx=\"2.24\" fill=\"var(--dot-light)\" />\n          <rect id=\"dot-23\" x=\"5.49019\" y=\"138.53\" width=\"4.48\" height=\"4.48\" rx=\"2.24\" fill=\"var(--dot-light)\" />\n          <rect id=\"dot-24\" x=\"5.48018\" y=\"5.97998\" width=\"4.48\" height=\"4.48\" rx=\"2.24\" fill=\"var(--dot-light)\" />\n          <rect id=\"dot-25\" x=\"4.37018\" y=\"37.5\" width=\"6.73\" height=\"6.73\" rx=\"3.365\" fill=\"var(--dot-light)\" />\n        </svg>\n      </div>\n    `;\n  }\n})\nexport class LogoLoader extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<boolean, LogoLoader>({\n    type: Boolean,\n    attribute: 'loading',\n    defaultValue: false,\n    onChange(next) {\n      (this as LogoLoader).handleLoadingChange(next);\n    }\n  })\n  accessor loading = false;\n\n  @Prop<LogoIntroVariant, LogoLoader>({\n    type: 'string',\n    attribute: 'intro',\n    defaultValue: 'wave'\n  })\n  accessor intro: LogoIntroVariant = 'wave';\n\n  @Prop<number | null, LogoLoader>({\n    type: Number,\n    attribute: 'size',\n    defaultValue: 36\n  })\n  accessor size: number | null = 36;\n\n  @Prop<string | null, LogoLoader>({\n    type: 'string',\n    attribute: 'aria-label',\n    defaultValue: null\n  })\n  accessor ariaLabel: string | null = null;\n\n  #state: LogoLoaderState = 'intro';\n  #loopStartTime = 0;\n  #animationTimers: number[] = [];\n  #introCompleted = false;\n\n  get state(): LogoLoaderState {\n    return this.#state;\n  }\n\n  set state(value: LogoLoaderState) {\n    if (this.#state === value) {\n      return;\n    }\n    this.#state = value;\n    if (typeof this.requestRender === 'function') {\n      this.requestRender();\n    }\n  }\n\n  connectedCallback(): void {\n    // Wait for first render before starting intro animation\n    // The Component decorator renders after connectedCallback via requestAnimationFrame\n    requestAnimationFrame(() => {\n      // Double RAF to ensure render is complete\n      requestAnimationFrame(() => {\n        if (this.loading) {\n          this.#runIntro(() => {\n            this.#introCompleted = true;\n            this.#startLoopAnimation();\n          });\n        } else {\n          this.#runIntro(() => {\n            this.#introCompleted = true;\n            this.state = 'idle';\n          });\n        }\n      });\n    });\n  }\n\n  disconnectedCallback(): void {\n    this.#clearTimers();\n  }\n\n  #clearTimers(): void {\n    for (const id of this.#animationTimers) {\n      window.clearTimeout(id);\n    }\n    this.#animationTimers = [];\n  }\n\n  #setTimeout(fn: () => void, delay: number): number {\n    const id = window.setTimeout(fn, delay);\n    this.#animationTimers.push(id);\n    return id;\n  }\n\n  #getDot(id: string): SVGRectElement | null {\n    const svg = this.shadowRoot?.querySelector('.logo-loader__svg');\n    return svg?.querySelector(`#${id}`) as SVGRectElement | null;\n  }\n\n  #getShockwaveContainer(): SVGGElement | null {\n    return this.shadowRoot?.querySelector('.shockwave-container') as SVGGElement | null;\n  }\n\n  #resetDotsState(instant = false, keepOpacity = false): void {\n    const container = this.#getShockwaveContainer();\n    if (container) {\n      container.innerHTML = '';\n    }\n\n    for (const dot of DOTS_DATA) {\n      const el = this.#getDot(dot.id);\n      if (!el) {\n        continue;\n      }\n\n      if (instant) {\n        el.style.transition = 'none';\n      } else {\n        el.style.transition = '';\n      }\n\n      // Remove all animation classes\n      el.classList.remove('dot-loading', 'dot-loading-inner', 'restoring', 'dot-pulse-wave', 'particle-bounce');\n\n      el.style.removeProperty('--base-scale');\n      el.style.removeProperty('--delay');\n      el.style.removeProperty('--pulse-delay');\n      el.style.removeProperty('--pulse-duration');\n\n      // Reset inline styles\n      el.style.transform = 'scale(1)';\n\n      if (!keepOpacity) {\n        el.style.opacity = instant ? '1' : '';\n      }\n      el.style.removeProperty('fill');\n      el.style.removeProperty('filter');\n\n      if (instant) {\n        forceReflow(el);\n        el.style.removeProperty('transition');\n      }\n    }\n  }\n\n  /** Ensure all dots are visible */\n  #ensureVisibility(): void {\n    for (const dot of DOTS_DATA) {\n      const el = this.#getDot(dot.id);\n      if (el && (el.style.opacity === '0' || el.style.opacity === '')) {\n        el.style.transition = 'opacity 200ms ease-out';\n        el.style.opacity = '1';\n      }\n    }\n  }\n\n  /** Run wave intro animation */\n  #runWaveIntro(onComplete?: () => void): void {\n    this.state = 'intro';\n\n    // Prepare dots hidden\n    for (const dot of DOTS_DATA) {\n      const el = this.#getDot(dot.id);\n      if (!el) {\n        continue;\n      }\n      el.style.transition = 'none';\n      el.style.opacity = '0';\n      el.style.transform = 'scale(0)';\n      forceReflow(el);\n    }\n\n    const innerDotIds = new Set(INNER_DOT_IDS);\n    const innerDots = DOTS_DATA.filter((d) => innerDotIds.has(d.id));\n    const outerDots = DOTS_DATA.filter((d) => !innerDotIds.has(d.id));\n\n    // WAVE 1: Inner dots appear at half scale\n    const orderedInner = sortByAngle(innerDots.map((d) => d.id));\n    orderedInner.forEach((dot, index) => {\n      const el = this.#getDot(dot.id);\n      if (!el) {\n        return;\n      }\n\n      el.style.fill = 'var(--dot-medium)';\n      forceReflow(el);\n      el.style.removeProperty('transition');\n\n      const delay = index * 75;\n      this.#setTimeout(() => {\n        el.style.transition = 'transform 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275), opacity 400ms ease-out';\n        el.style.opacity = '1';\n        el.style.transform = 'scale(0.5)';\n      }, delay);\n    });\n\n    // WAVE 2: Inner to full scale + outer appear\n    this.#setTimeout(() => {\n      // Inner dots to full scale\n      orderedInner.forEach((dot, index) => {\n        const el = this.#getDot(dot.id);\n        if (!el) {\n          return;\n        }\n\n        const delay = index * 65;\n        this.#setTimeout(() => {\n          el.style.transition = 'transform 600ms cubic-bezier(0.34, 1.56, 0.64, 1), fill 450ms ease-out';\n          el.style.transform = 'scale(1)';\n          el.style.removeProperty('fill');\n        }, delay);\n      });\n\n      // Outer dots appear\n      const orderedOuter = sortByAngle(outerDots.map((d) => d.id));\n      orderedOuter.forEach((dot, index) => {\n        const el = this.#getDot(dot.id);\n        if (!el) {\n          return;\n        }\n\n        el.style.removeProperty('transition');\n        const delay = 150 + index * 40;\n        this.#setTimeout(() => {\n          el.style.transition = 'transform 650ms cubic-bezier(0.34, 1.56, 0.64, 1), opacity 550ms ease-out';\n          el.style.opacity = '1';\n          el.style.transform = 'scale(1)';\n        }, delay);\n      });\n    }, 650);\n\n    // Completion\n    this.#setTimeout(() => {\n      onComplete?.();\n    }, 1400);\n  }\n\n  /** Run particle intro animation */\n  #runParticleIntro(onComplete?: () => void): void {\n    this.state = 'intro';\n\n    // Prepare dots hidden\n    for (const dot of DOTS_DATA) {\n      const el = this.#getDot(dot.id);\n      if (!el) {\n        continue;\n      }\n      el.style.transition = 'none';\n      el.style.opacity = '0';\n      el.style.transform = 'scale(0)';\n      forceReflow(el);\n    }\n\n    const innerDotIds = new Set(INNER_DOT_IDS);\n\n    // Create particle animation data\n    const particles = DOTS_DATA.map((dot, index) => {\n      const finalAngle = getAngle(dot);\n      const startDistance = 110 + Math.random() * 80;\n      const angleVariation = (Math.random() - 0.5) * Math.PI * 0.35;\n      const startAngle = finalAngle + angleVariation;\n      const startX = Math.cos(startAngle) * startDistance;\n      const startY = Math.sin(startAngle) * startDistance;\n\n      const curvature = Math.random() * 0.4 + 0.3;\n      const controlAngle = startAngle + (Math.random() - 0.5) * Math.PI * curvature;\n      const controlDistance = startDistance * 0.6;\n      const controlX = Math.cos(controlAngle) * controlDistance;\n      const controlY = Math.sin(controlAngle) * controlDistance;\n\n      const group = Math.floor(index / 5);\n      const groupDelay = group * 110;\n      const withinGroupDelay = (index % 5) * 40;\n      const delay = groupDelay + withinGroupDelay + Math.random() * 40;\n      const duration = 600 + Math.random() * 300;\n\n      return {\n        ...dot,\n        startX,\n        startY,\n        controlX,\n        controlY,\n        delay,\n        duration,\n        impactTime: delay + duration,\n        rotationSpeed: 720 + Math.random() * 360,\n        isInner: innerDotIds.has(dot.id)\n      };\n    });\n\n    particles.sort((a, b) => a.delay - b.delay);\n\n    // First 3 inner dots for shockwaves\n    const shockwaveParticles = particles\n      .filter((p) => p.isInner)\n      .sort((a, b) => a.impactTime - b.impactTime)\n      .slice(0, 3);\n    const shockwaveSet = new Set(shockwaveParticles.map((p) => p.id));\n\n    // Animate each particle\n    for (const particle of particles) {\n      const el = this.#getDot(particle.id);\n      if (!el) {\n        continue;\n      }\n\n      el.style.transform = `translate(${particle.startX}px, ${particle.startY}px) scale(0.05)`;\n\n      this.#setTimeout(() => {\n        el.style.opacity = '1';\n\n        const steps = 30;\n        let step = 0;\n\n        const animateStep = (): void => {\n          step++;\n          const progress = step / steps;\n          const t = progress;\n          const mt = 1 - t;\n\n          const x = mt * mt * particle.startX + 2 * mt * t * particle.controlX + t * t * 0;\n          const y = mt * mt * particle.startY + 2 * mt * t * particle.controlY + t * t * 0;\n\n          const easeOut = 1 - (1 - progress) ** 4;\n          const scale = 0.05 + easeOut * 0.95;\n          const rotation = progress * particle.rotationSpeed;\n\n          el.style.transition = 'transform 33ms linear';\n          el.style.transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotation}deg)`;\n\n          if (step < steps) {\n            requestAnimationFrame(animateStep);\n          } else {\n            // Impact - clear all transforms\n            const bounceDuration = 250;\n            el.style.transition = `transform ${bounceDuration}ms cubic-bezier(0.34, 1.56, 0.64, 1)`;\n            el.style.transform = 'scale(1)';\n\n            if (shockwaveSet.has(particle.id)) {\n              this.#triggerShockwave(particle);\n            }\n\n            this.#setTimeout(() => {\n              el.classList.add('particle-bounce');\n              this.#setTimeout(() => {\n                el.classList.remove('particle-bounce');\n              }, 400);\n            }, bounceDuration);\n          }\n        };\n\n        requestAnimationFrame(animateStep);\n      }, particle.delay);\n    }\n\n    // Early completion\n    const earlyRevealTime = Math.max(...particles.map((p) => p.delay)) * 0.6;\n    this.#setTimeout(() => {\n      onComplete?.();\n    }, earlyRevealTime);\n\n    // Final cleanup\n    const maxTime = Math.max(...particles.map((p) => p.impactTime + 500));\n    this.#setTimeout(() => {\n      this.#resetDotsState(false, true);\n    }, maxTime);\n  }\n\n  #triggerShockwave(dot: DotData): void {\n    const container = this.#getShockwaveContainer();\n    if (!container) {\n      return;\n    }\n\n    const ring = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n    ring.setAttribute('cx', String(dot.cx));\n    ring.setAttribute('cy', String(dot.cy));\n    ring.setAttribute('r', '13.45');\n    ring.classList.add('shockwave-ring');\n\n    container.appendChild(ring);\n\n    this.#setTimeout(() => {\n      ring.remove();\n    }, 900);\n  }\n\n  #runIntro(onComplete?: () => void): void {\n    if (this.intro === 'particle') {\n      this.#runParticleIntro(onComplete);\n    } else {\n      this.#runWaveIntro(onComplete);\n    }\n  }\n\n  #startLoopAnimation(): void {\n    this.#loopStartTime = performance.now();\n    this.#ensureVisibility();\n\n    // Inner dots - scale down with transition, then add animation class\n    const orderedInnerDots = sortByAngle(INNER_DOT_IDS);\n    let seedDelay = 0;\n\n    orderedInnerDots.forEach((dot) => {\n      this.#setTimeout(() => {\n        const el = this.#getDot(dot.id);\n        if (!el) {\n          return;\n        }\n\n        const targetScale = 0.6;\n\n        el.style.transition = 'all 450ms cubic-bezier(0.4, 0, 0.2, 1)';\n        el.style.transform = `scale(${targetScale})`;\n        el.style.fill = 'var(--dot-medium)';\n        el.style.opacity = '0.7';\n\n        el.style.setProperty('--base-scale', `${targetScale}`);\n\n        const angle = getAngle(dot);\n        const normalizedAngle = (angle + Math.PI) / (2 * Math.PI);\n        const animationDelayMs = normalizedAngle * LOOP_DURATION;\n        el.style.setProperty('--delay', `${animationDelayMs}ms`);\n\n        this.#setTimeout(() => {\n          el.classList.add('dot-loading-inner');\n        }, 100);\n      }, seedDelay);\n\n      seedDelay += 60;\n    });\n\n    const orderedOuterDots = sortByAngle(OUTER_DOT_IDS);\n    this.#setTimeout(() => {\n      orderedOuterDots.forEach((dot) => {\n        const el = this.#getDot(dot.id);\n        if (!el) {\n          return;\n        }\n\n        el.style.transition = 'all 350ms ease-out';\n\n        const baseScale = 1.2;\n        el.style.setProperty('--base-scale', `${baseScale}`);\n\n        const angle = getAngle(dot);\n        const normalizedAngle = (angle + Math.PI) / (2 * Math.PI);\n        const animationDelayMs = normalizedAngle * ROTATION_DURATION;\n        el.style.setProperty('--delay', `${animationDelayMs}ms`);\n\n        this.#setTimeout(() => {\n          el.classList.add('dot-loading');\n        }, 50);\n      });\n\n      this.state = 'loop';\n    }, seedDelay + 100);\n  }\n\n  #endLoopAnimation(): void {\n    const now = performance.now();\n    const elapsed = Math.max(0, now - this.#loopStartTime);\n\n    const timeInCycle = elapsed % LOOP_DURATION;\n    const timeLeft = LOOP_DURATION - timeInCycle + 50;\n\n    this.state = 'exit';\n\n    this.#setTimeout(() => {\n      const orderedAllDots = sortByAngle(DOTS_DATA.map((d) => d.id));\n\n      orderedAllDots.forEach((dot, i) => {\n        const el = this.#getDot(dot.id);\n        if (!el) {\n          return;\n        }\n\n        const delay = i * 18;\n\n        this.#setTimeout(() => {\n          el.classList.remove('dot-loading', 'dot-loading-inner');\n          el.style.removeProperty('--delay');\n          el.style.removeProperty('--base-scale');\n\n          el.classList.add('restoring');\n          el.style.transform = 'scale(1)';\n          el.style.opacity = '1';\n          el.style.removeProperty('fill');\n\n          this.#setTimeout(() => {\n            el.classList.remove('restoring');\n          }, 500);\n        }, delay);\n      });\n\n      this.#setTimeout(\n        () => {\n          this.state = 'idle';\n        },\n        orderedAllDots.length * 18 + 500\n      );\n    }, timeLeft);\n  }\n\n  handleLoadingChange(next: boolean): void {\n    if (!this.#introCompleted) {\n      return;\n    }\n\n    this.#clearTimers();\n\n    if (next) {\n      if (this.state === 'idle' || this.state === 'exit') {\n        this.#resetDotsState(true, true);\n        this.#startLoopAnimation();\n      }\n    } else {\n      if (this.state === 'loop') {\n        this.#endLoopAnimation();\n      } else if (this.state !== 'intro' && this.state !== 'exit') {\n        this.state = 'idle';\n      }\n    }\n  }\n\n  playIntro(variant?: LogoIntroVariant): void {\n    this.#clearTimers();\n    this.#resetDotsState(true);\n\n    const originalIntro = this.intro;\n    if (variant) {\n      this.intro = variant;\n    }\n\n    this.#runIntro(() => {\n      this.#introCompleted = true;\n      if (this.loading) {\n        this.#startLoopAnimation();\n      } else {\n        this.state = 'idle';\n      }\n    });\n\n    if (variant) {\n      this.intro = originalIntro;\n    }\n  }\n}\n","type RenderHost = HTMLElement & {\n  requestRender?(): void;\n  render?(): void;\n};\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n  if (typeof instance.requestRender === 'function') {\n    instance.requestRender();\n    return;\n  }\n\n  if (typeof instance.render !== 'function') {\n    return;\n  }\n\n  if (renderQueue.get(instance)) {\n    return;\n  }\n\n  renderQueue.set(instance, true);\n\n  requestAnimationFrame(() => {\n    renderQueue.set(instance, false);\n\n    instance.render?.();\n  });\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\ninterface WatchOptions<TValue, THost extends RenderHost> {\n  compare?: (previous: TValue, next: TValue) => boolean;\n  onChange?: (this: THost, next: TValue, previous: TValue) => void;\n  transform?: (this: THost, initial: TValue) => TValue;\n}\n\nexport function Watch<TValue, THost extends RenderHost = RenderHost>(options: WatchOptions<TValue, THost> = {}) {\n  const { compare = defaultCompare, onChange, transform } = options;\n\n  return (\n    accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n    context: ClassAccessorDecoratorContext<THost, TValue>\n  ): ClassAccessorDecoratorResult<THost, TValue> => {\n    if (context.kind !== 'accessor') {\n      throw new Error('@Watch requires the \"accessor\" keyword on the property.');\n    }\n\n    return {\n      get(this: THost): TValue {\n        return accessor.get.call(this);\n      },\n      set(this: THost, value: TValue): void {\n        const previous = accessor.get.call(this);\n\n        if (compare(previous, value)) {\n          return;\n        }\n\n        accessor.set.call(this, value);\n\n        if (onChange) {\n          onChange.call(this, value, previous);\n        }\n\n        scheduleRender(this);\n      },\n      init(this: THost, initialValue: TValue): TValue {\n        if (transform) {\n          return transform.call(this, initialValue);\n        }\n\n        return initialValue;\n      }\n    };\n  };\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\nexport type MonitorFpsDetail = {\n  fps: number | null;\n  refreshRate: number | null;\n  frameTimeAvg: number | null;\n  frameTimeP95: number | null;\n  frameTimeMax: number | null;\n  droppedFrames: number;\n  jankFrames: number;\n  longFrames: number;\n};\n\nconst clamp = (value: number, min: number, max: number): number => Math.max(min, Math.min(max, value));\n\nconst mean = (values: readonly number[]): number | null => {\n  if (values.length === 0) {\n    return null;\n  }\n  let sum = 0;\n  for (const value of values) {\n    sum += value;\n  }\n  return sum / values.length;\n};\n\nconst quantile = (sorted: readonly number[], q: number): number | null => {\n  if (sorted.length === 0) {\n    return null;\n  }\n  const clamped = clamp(q, 0, 1);\n  const index = Math.floor(clamped * (sorted.length - 1));\n  return sorted[index] ?? null;\n};\n\nconst computePercentile = (values: readonly number[], q: number): number | null => {\n  if (values.length === 0) {\n    return null;\n  }\n  const sorted = [...values].sort((a, b) => a - b);\n  return quantile(sorted, q);\n};\n\nconst computeMedian = (values: readonly number[]): number | null => computePercentile(values, 0.5);\n\nconst formatNumber = (value: number | null, decimals = 0): string => {\n  if (value === null || !Number.isFinite(value)) {\n    return '—';\n  }\n  return value.toFixed(decimals);\n};\n\nconst formatMs = (value: number | null, decimals = 1): string => {\n  if (value === null || !Number.isFinite(value)) {\n    return '—';\n  }\n  return `${value.toFixed(decimals)}ms`;\n};\n\nconst rateFps = (fps: number | null, targetFps: number | null): 'good' | 'needs-improvement' | 'poor' | 'unknown' => {\n  if (fps === null || !Number.isFinite(fps)) {\n    return 'unknown';\n  }\n  const target = targetFps && Number.isFinite(targetFps) ? targetFps : 60;\n  const ratio = fps / target;\n  if (ratio >= 0.92) {\n    return 'good';\n  }\n  if (ratio >= 0.75) {\n    return 'needs-improvement';\n  }\n  return 'poor';\n};\n\n@Component({\n  tag: 'ease-monitor-fps',\n  autoSlot: false,\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: block;\n      width: 100%;\n      color: var(--color-foreground);\n      font-family: var(--ease-font-family, \"Instrument Sans\", sans-serif);\n      font-variant-numeric: tabular-nums;\n    }\n\n    [part=\"container\"] {\n      display: grid;\n      gap: 8px;\n      width: 100%;\n    }\n\n    [part=\"header\"] {\n      display: flex;\n      align-items: baseline;\n      justify-content: space-between;\n      gap: 8px;\n      width: 100%;\n    }\n\n    [part=\"title\"] {\n      display: inline-flex;\n      align-items: baseline;\n      gap: 6px;\n      min-width: 0;\n    }\n\n    [part=\"fps\"] {\n      font-size: var(--ease-monitor-fps-font-size, 14px);\n      font-weight: 650;\n      letter-spacing: -0.01em;\n      line-height: 1;\n    }\n\n    [part=\"fps\"][data-rating=\"good\"] {\n      color: #22c55e;\n    }\n    [part=\"fps\"][data-rating=\"needs-improvement\"] {\n      color: #eab308;\n    }\n    [part=\"fps\"][data-rating=\"poor\"] {\n      color: #ef4444;\n    }\n    [part=\"fps\"][data-rating=\"unknown\"] {\n      color: var(--color-gray-600);\n    }\n\n    [part=\"unit\"] {\n      font-size: var(--ease-monitor-unit-font-size, var(--ease-font-size-sm, 12px));\n      color: var(--color-gray-600);\n      font-weight: 500;\n    }\n\n    [part=\"subtitle\"] {\n      font-size: var(--ease-monitor-subtitle-font-size, 11px);\n      color: var(--color-gray-600);\n      text-overflow: ellipsis;\n      overflow: hidden;\n      white-space: nowrap;\n      min-width: 0;\n      text-align: right;\n    }\n\n    canvas[part=\"graph\"] {\n      width: 100%;\n      height: 44px;\n      display: block;\n      background: var(--color-gray-900);\n      box-shadow: inset 0 0 0 1px var(--color-white-4);\n    }\n\n    [part=\"stats\"] {\n      display: grid;\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n      gap: 8px;\n      font-size: var(--ease-monitor-stats-font-size, var(--ease-font-size-sm, 12px));\n      padding-left: var(--ease-monitor-stats-padding-left, 4px);\n      color: var(--color-gray-600);\n    }\n\n    [part=\"stat\"] {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 8px;\n      min-width: 0;\n    }\n\n    [part=\"stat\"] strong {\n      font-weight: 550;\n      color: var(--color-gray-700);\n    }\n  `\n})\nexport class MonitorFps extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n  accessor paused: boolean = false;\n\n  @Query<HTMLCanvasElement>('canvas[part=\"graph\"]')\n  accessor canvasEl!: HTMLCanvasElement | null;\n\n  #rafId: number | null = null;\n  #lastNow = 0;\n  #lastSampleNow = 0;\n  #framesSinceSample = 0;\n\n  #frameDeltas: number[] = [];\n  #fpsSamples: number[] = [];\n\n  #maxFrameDeltas = 240;\n  #maxFpsSamples = 90; // 90 * 250ms = ~22.5s\n  #sampleIntervalMs = 250;\n  #statsWindowFrames = 120;\n\n  #data: MonitorFpsDetail = {\n    fps: null,\n    refreshRate: null,\n    frameTimeAvg: null,\n    frameTimeP95: null,\n    frameTimeMax: null,\n    droppedFrames: 0,\n    jankFrames: 0,\n    longFrames: 0\n  };\n\n  connectedCallback(): void {\n    this.#attachVisibilityHandling();\n    if (!this.paused && !document.hidden) {\n      this.#start();\n    }\n  }\n\n  disconnectedCallback(): void {\n    this.#stop();\n    document.removeEventListener('visibilitychange', this.#handleVisibilityChange);\n  }\n\n  afterRender(): void {\n    this.#syncCanvasSize();\n    this.#draw();\n  }\n\n  render(): TemplateResult {\n    const fps = this.#data.fps;\n    const hz = this.#data.refreshRate;\n    const rating = rateFps(fps, hz);\n\n    const subtitleParts = [\n      this.#data.frameTimeAvg !== null ? `avg ${formatMs(this.#data.frameTimeAvg)}` : null,\n      this.#data.frameTimeP95 !== null ? `p95 ${formatMs(this.#data.frameTimeP95)}` : null\n    ].filter(Boolean);\n\n    return html`\n      <div part=\"container\">\n        <div part=\"header\">\n          <div part=\"title\">\n            <span part=\"fps\" data-rating=${rating}>${formatNumber(fps, 0)}</span>\n            <span part=\"unit\">FPS</span>\n          </div>\n          <div part=\"subtitle\">${subtitleParts.join(' · ')}</div>\n        </div>\n\n        <canvas part=\"graph\" aria-label=\"FPS graph\"></canvas>\n\n        <div part=\"stats\">\n          <div part=\"stat\"><span>Refresh</span><strong>${hz ? `~${formatNumber(hz, 0)}Hz` : '—'}</strong></div>\n          <div part=\"stat\"><span>Dropped</span><strong>${this.#data.droppedFrames}</strong></div>\n          <div part=\"stat\"><span>Jank</span><strong>${this.#data.jankFrames}</strong></div>\n          <div part=\"stat\"><span>Long frames</span><strong>${this.#data.longFrames}</strong></div>\n          <div part=\"stat\"><span>Worst</span><strong>${formatMs(this.#data.frameTimeMax)}</strong></div>\n          <div part=\"stat\"><span>Avg</span><strong>${formatMs(this.#data.frameTimeAvg)}</strong></div>\n        </div>\n      </div>\n    `;\n  }\n\n  #attachVisibilityHandling(): void {\n    document.removeEventListener('visibilitychange', this.#handleVisibilityChange);\n    document.addEventListener('visibilitychange', this.#handleVisibilityChange, { passive: true });\n  }\n\n  #handleVisibilityChange = (): void => {\n    if (document.hidden) {\n      this.#stop();\n      return;\n    }\n\n    if (!this.paused) {\n      this.#start();\n    }\n  };\n\n  #start(): void {\n    if (this.#rafId !== null) {\n      return;\n    }\n\n    const now = performance.now();\n    this.#lastNow = now;\n    this.#lastSampleNow = now;\n    this.#framesSinceSample = 0;\n\n    this.#rafId = requestAnimationFrame(this.#tick);\n  }\n\n  #stop(): void {\n    if (this.#rafId !== null) {\n      cancelAnimationFrame(this.#rafId);\n      this.#rafId = null;\n    }\n  }\n\n  #tick = (now: number): void => {\n    if (this.paused) {\n      this.#stop();\n      return;\n    }\n\n    const delta = now - this.#lastNow;\n    this.#lastNow = now;\n\n    // Ignore huge deltas (tab switch / breakpoints).\n    if (delta > 0 && delta < 250) {\n      this.#frameDeltas.push(delta);\n      if (this.#frameDeltas.length > this.#maxFrameDeltas) {\n        this.#frameDeltas.shift();\n      }\n    }\n\n    this.#framesSinceSample += 1;\n\n    if (now - this.#lastSampleNow >= this.#sampleIntervalMs) {\n      const elapsed = now - this.#lastSampleNow;\n      const fpsSample = elapsed > 0 ? (this.#framesSinceSample * 1000) / elapsed : 0;\n\n      this.#fpsSamples.push(fpsSample);\n      if (this.#fpsSamples.length > this.#maxFpsSamples) {\n        this.#fpsSamples.shift();\n      }\n\n      this.#lastSampleNow = now;\n      this.#framesSinceSample = 0;\n\n      this.#updateStats();\n      this.#emit();\n      this.requestRender();\n    }\n\n    this.#rafId = requestAnimationFrame(this.#tick);\n  };\n\n  #updateStats(): void {\n    const frameWindow = this.#frameDeltas.slice(-this.#statsWindowFrames);\n    const fpsWindow = this.#fpsSamples.slice(-Math.min(4, this.#fpsSamples.length));\n\n    const frameAvg = mean(frameWindow);\n    const frameP95 = computePercentile(frameWindow, 0.95);\n    const frameMax = frameWindow.length > 0 ? Math.max(...frameWindow) : null;\n    const median = computeMedian(frameWindow);\n\n    const refreshRate =\n      median && median > 0 ? clamp((1000 / median) as number, 30, 240) : (this.#data.refreshRate ?? null);\n\n    const ideal = refreshRate ? 1000 / refreshRate : 1000 / 60;\n\n    let droppedFrames = 0;\n    let jankFrames = 0;\n    let longFrames = 0;\n\n    for (const ft of frameWindow) {\n      const missed = Math.max(0, Math.round(ft / ideal) - 1);\n      droppedFrames += missed;\n\n      if (ft > ideal * 1.5) {\n        jankFrames += 1;\n      }\n\n      if (ft > Math.max(50, ideal * 3)) {\n        longFrames += 1;\n      }\n    }\n\n    const fps = fpsWindow.length > 0 ? mean(fpsWindow) : null;\n\n    this.#data = {\n      fps,\n      refreshRate,\n      frameTimeAvg: frameAvg,\n      frameTimeP95: frameP95,\n      frameTimeMax: frameMax,\n      droppedFrames,\n      jankFrames,\n      longFrames\n    };\n  }\n\n  #emit(): void {\n    this.dispatchEvent(\n      new CustomEvent<MonitorFpsDetail>('monitor-fps', {\n        detail: this.#data,\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  #syncCanvasSize(): void {\n    const canvas = this.canvasEl;\n    if (!canvas) {\n      return;\n    }\n\n    const rect = canvas.getBoundingClientRect();\n    const dpr = Math.max(1, window.devicePixelRatio || 1);\n    const width = Math.max(1, Math.floor(rect.width * dpr));\n    const height = Math.max(1, Math.floor(rect.height * dpr));\n\n    if (canvas.width !== width || canvas.height !== height) {\n      canvas.width = width;\n      canvas.height = height;\n    }\n  }\n\n  #draw(): void {\n    const canvas = this.canvasEl;\n    if (!canvas) {\n      return;\n    }\n\n    const ctx = canvas.getContext('2d');\n    if (!ctx) {\n      return;\n    }\n\n    const dpr = Math.max(1, window.devicePixelRatio || 1);\n    const width = canvas.width / dpr;\n    const height = canvas.height / dpr;\n\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n    ctx.clearRect(0, 0, width, height);\n\n    const samples = this.#fpsSamples;\n    if (samples.length < 2) {\n      return;\n    }\n\n    const target = this.#data.refreshRate ?? 60;\n    const scaleMax = Math.max(60, Math.round(target / 10) * 10);\n\n    const rating = rateFps(this.#data.fps, this.#data.refreshRate);\n    const stroke =\n      rating === 'good'\n        ? '#22c55e'\n        : rating === 'needs-improvement'\n          ? '#eab308'\n          : rating === 'poor'\n            ? '#ef4444'\n            : '#6b7280';\n\n    // guide lines\n    ctx.save();\n    ctx.globalAlpha = 0.35;\n    ctx.strokeStyle = '#ffffff';\n    ctx.lineWidth = 1;\n    ctx.setLineDash([3, 3]);\n\n    const drawGuide = (fps: number) => {\n      const y = height - clamp(fps / scaleMax, 0, 1) * height;\n      ctx.beginPath();\n      ctx.moveTo(0, y);\n      ctx.lineTo(width, y);\n      ctx.stroke();\n    };\n\n    drawGuide(Math.min(60, scaleMax));\n    drawGuide(Math.min(30, scaleMax));\n\n    ctx.restore();\n\n    const toY = (fps: number) => height - clamp(fps / scaleMax, 0, 1) * height;\n\n    // area fill\n    ctx.beginPath();\n    for (let i = 0; i < samples.length; i += 1) {\n      const value = samples[i] ?? 0;\n      const x = (i / (samples.length - 1)) * width;\n      const y = toY(value);\n      if (i === 0) {\n        ctx.moveTo(x, y);\n      } else {\n        ctx.lineTo(x, y);\n      }\n    }\n    ctx.lineTo(width, height);\n    ctx.lineTo(0, height);\n    ctx.closePath();\n    ctx.globalAlpha = 0.12;\n    ctx.fillStyle = stroke;\n    ctx.fill();\n\n    // line\n    ctx.beginPath();\n    for (let i = 0; i < samples.length; i += 1) {\n      const value = samples[i] ?? 0;\n      const x = (i / (samples.length - 1)) * width;\n      const y = toY(value);\n      if (i === 0) {\n        ctx.moveTo(x, y);\n      } else {\n        ctx.lineTo(x, y);\n      }\n    }\n    ctx.globalAlpha = 1;\n    ctx.strokeStyle = stroke;\n    ctx.lineWidth = 1.75;\n    ctx.setLineDash([]);\n    ctx.lineJoin = 'round';\n    ctx.lineCap = 'round';\n    ctx.stroke();\n  }\n}\n","import type { MonitorFpsDetail } from './fps';\n\nimport { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Watch } from '~/decorators/Watch';\nimport { styleObject } from '~/utils/template-helpers';\nimport './fps';\n\ninterface LayoutShift extends PerformanceEntry {\n  value: number;\n  hadRecentInput: boolean;\n}\n\ninterface PerformanceEventTiming extends PerformanceEntry {\n  duration: number;\n  interactionId?: number;\n}\n\ninterface PerformanceLongTaskTiming extends PerformanceEntry {\n  duration: number;\n}\n\ntype CoreWebVitals = {\n  LCP: number | null;\n  INP: number | null;\n  CLS: number;\n  FCP: number | null;\n  TBT: number;\n};\n\ntype NavigationMetrics = {\n  ttfb: number | null;\n  domInteractive: number | null;\n  loadTime: number | null;\n};\n\ntype ResourceSummary = {\n  js: { count: number; size: number };\n  css: { count: number; size: number };\n  img: { count: number; size: number };\n  other: { count: number; size: number };\n  totalSize: number;\n};\n\ntype MemoryUsage = {\n  jsHeapSizeLimit: number;\n  totalJSHeapSize: number;\n  usedJSHeapSize: number;\n} | null;\n\ninterface PerformanceMetrics {\n  coreWebVitals: CoreWebVitals;\n  navigation: NavigationMetrics;\n  resources: ResourceSummary;\n  memory: MemoryUsage;\n  fps: number | null;\n  longTasks: { count: number; totalDuration: number };\n}\n\n// Network Information\ninterface ConnectionInfo {\n  effectiveType: string;\n  rtt: number;\n}\n\ntype MetricKey = keyof CoreWebVitals | keyof NavigationMetrics | 'fps' | 'TBT';\ntype MetricRating = 'good' | 'needs-improvement' | 'poor' | 'unknown';\n\ndeclare global {\n  interface Performance {\n    memory?: {\n      jsHeapSizeLimit: number;\n      totalJSHeapSize: number;\n      usedJSHeapSize: number;\n    };\n  }\n  interface Navigator {\n    connection?: {\n      effectiveType: string;\n      rtt: number;\n      addEventListener: (type: string, listener: EventListener) => void;\n      removeEventListener: (type: string, listener: EventListener) => void;\n    };\n  }\n}\n\nconst METRIC_THRESHOLDS = {\n  LCP: { good: 2500, poor: 4000 },\n  INP: { good: 200, poor: 500 },\n  CLS: { good: 0.1, poor: 0.25 },\n  FCP: { good: 1800, poor: 3000 },\n  ttfb: { good: 800, poor: 1800 },\n  loadTime: { good: 3000, poor: 6000 },\n  domInteractive: { good: 1500, poor: 3500 },\n  fps: { good: 55, poor: 30 },\n  TBT: { good: 200, poor: 600 }\n};\n\nconst GLOBAL_BENCHMARKS: Partial<Record<MetricKey, number>> = {\n  LCP: 2400,\n  INP: 250,\n  CLS: 0.05,\n  FCP: 1600,\n  TBT: 300\n};\n\nconst rateMetric = (metric: MetricKey, value: number | null): MetricRating => {\n  if (value === null) {\n    return 'unknown';\n  }\n  const thresholds = METRIC_THRESHOLDS[metric as keyof typeof METRIC_THRESHOLDS];\n  if (!thresholds) {\n    return 'unknown';\n  }\n\n  if (metric === 'fps') {\n    if (value >= thresholds.good) {\n      return 'good';\n    }\n    if (value >= thresholds.poor) {\n      return 'needs-improvement';\n    }\n    return 'poor';\n  }\n\n  if (value <= thresholds.good) {\n    return 'good';\n  }\n  if (value < thresholds.poor) {\n    return 'needs-improvement';\n  }\n  return 'poor';\n};\n\nconst formatMetric = (metric: MetricKey, value: number | null): string => {\n  if (value === null) {\n    return 'N/A';\n  }\n  if (metric === 'CLS') {\n    return value.toFixed(3);\n  }\n  if (metric === 'fps') {\n    return `${Math.round(value)}`;\n  }\n  if (value < 1000) {\n    return `${Math.round(value)}ms`;\n  }\n  return `${(value / 1000).toFixed(2)}s`;\n};\n\nconst formatBytes = (bytes: number | null | undefined, decimals = 1): string => {\n  if (bytes == null || !Number.isFinite(bytes) || bytes <= 0) {\n    return '0 B';\n  }\n\n  const k = 1024;\n  const dm = decimals < 0 ? 0 : decimals;\n  const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  return `${parseFloat((bytes / k ** i).toFixed(dm))} ${sizes[i]}`;\n};\n\nconst estimateCarbonFootprint = (totalBytes: number): string => {\n  if (totalBytes <= 0) {\n    return '0g CO2 eq.';\n  }\n  const emissions = (totalBytes / 1000000000) * 0.81;\n  return `${emissions.toFixed(3)}g CO2 eq.`;\n};\n\n@Component({\n  tag: 'ease-monitor',\n  styles: `\n    :host {\n      position: relative;\n      z-index: 100000;\n      user-select: none;\n      -webkit-user-select: none;\n      \n    }\n\n    [part=\"container\"] {\n      width: 320px;\n      overflow: hidden; \n    }\n\n    [part=\"header\"] {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n    }\n\n    [part=\"title\"] {\n        display: flex;\n        align-items: center;\n        gap: 0.5em;\n    }\n\n    [part=\"content\"] {\n      display: grid;\n      gap: 1em;\n      max-height: 80vh;\n      overflow-y: auto;\n    }\n\n    .metrics-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fit, minmax(90px, 1fr));\n        gap: 0.5em;\n    }\n\n    .metric-box {\n        text-align: center;\n        cursor: help;\n    }\n\n    .metric-value {\n        font-variant-numeric: tabular-nums; \n    }\n\n    .rating-good {\n      color: #22c55e;\n    }\n    .rating-needs-improvement {\n      color: #eab308;\n    }\n    .rating-poor {\n      color: #ef4444;\n    }\n    .rating-unknown {\n      color: #6b7280;\n    }\n\n    .status-indicator.rating-good {\n      background-color: #22c55e;\n    }\n    .status-indicator.rating-needs-improvement {\n      background-color: #eab308;\n    }\n    .status-indicator.rating-poor {\n      background-color: #ef4444;\n    }\n    .status-indicator.rating-unknown {\n      background-color: #6b7280;\n    }\n\n    .memory-used.rating-good {\n      background-color: #22c55e;\n    }\n    .memory-used.rating-needs-improvement {\n      background-color: #eab308;\n    }\n    .memory-used.rating-poor {\n      background-color: #ef4444;\n    }\n\n    .resource-list, .memory-usage, .network-info {\n        display: grid;\n        gap: 0.25em;\n    }\n\n    .resource-item, .network-item, .longtask-item {\n        display: flex;\n        justify-content: space-between;\n        font-variant-numeric: tabular-nums;\n    }\n\n    .memory-bar {\n        height: 10px;\n        overflow: hidden;\n        position: relative;\n    }\n\n    .memory-used {\n        height: 100%;\n        transition: width 0.5s ease-in-out;\n    }\n\n    .status-indicator {\n        width: 8px;\n        height: 8px;\n        border-radius: 50%;\n    }\n    \n    .carbon-estimate {\n        text-align: right;\n    }\n\n    .trend-indicator {\n        display: inline-block;\n        width: 1em;\n        text-align: center;\n    }\n  `\n})\nexport class Monitor extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Watch<PerformanceMetrics>({})\n  accessor metrics: PerformanceMetrics = {\n    navigation: { loadTime: null, domInteractive: null, ttfb: null },\n    coreWebVitals: { LCP: null, INP: null, CLS: 0, FCP: null, TBT: 0 },\n    resources: {\n      js: { count: 0, size: 0 },\n      css: { count: 0, size: 0 },\n      img: { count: 0, size: 0 },\n      other: { count: 0, size: 0 },\n      totalSize: 0\n    },\n    memory: null,\n    fps: null,\n    longTasks: { count: 0, totalDuration: 0 }\n  };\n\n  @Watch<ConnectionInfo>({})\n  accessor network: ConnectionInfo = {\n    effectiveType: 'N/A',\n    rtt: 0\n  };\n\n  private observers: PerformanceObserver[] = [];\n  private memoryInterval: number | null = null;\n\n  private clsEntries: LayoutShift[] = [];\n\n  private inpEntries: PerformanceEventTiming[] = [];\n  private maxINP = 0;\n\n  private longTaskEntries: PerformanceLongTaskTiming[] = [];\n\n  private trendHistory: Partial<Record<MetricKey, number[]>> = {};\n  private maxTrendLength = 5;\n\n  connectedCallback(): void {\n    this.initObservers();\n    this.collectInitialMetrics();\n    this.startMemoryMonitoring();\n    this.initNetworkMonitoring();\n\n    if (document.readyState !== 'complete') {\n      window.addEventListener('load', this.handlePageLoad);\n    } else {\n      this.handlePageLoad();\n    }\n  }\n\n  disconnectedCallback(): void {\n    this.observers.forEach((observer) => {\n      observer.disconnect();\n    });\n    this.observers = [];\n    this.stopMemoryMonitoring();\n    this.stopNetworkMonitoring();\n    window.removeEventListener('load', this.handlePageLoad);\n  }\n\n  @Listen<Monitor, CustomEvent<MonitorFpsDetail>>('monitor-fps')\n  handleFpsUpdate(event: CustomEvent<MonitorFpsDetail>): void {\n    const fps = event.detail?.fps ?? null;\n    this.metrics.fps = fps;\n    this.updateTrend('fps', fps);\n    this.requestRender();\n  }\n\n  private handlePageLoad = (): void => {\n    setTimeout(() => {\n      this.collectNavigationTiming();\n      this.requestRender();\n    }, 500);\n  };\n\n  private initObservers(): void {\n    if (!('PerformanceObserver' in window)) {\n      console.warn('PerformanceObserver API not supported.');\n      return;\n    }\n\n    try {\n      const observer = new PerformanceObserver((list) => {\n        for (const entry of list.getEntries()) {\n          this.processPerformanceEntry(entry);\n        }\n      });\n\n      observer.observe({ type: 'largest-contentful-paint', buffered: true });\n      observer.observe({ type: 'event', buffered: true });\n      observer.observe({ type: 'layout-shift', buffered: true });\n      observer.observe({ type: 'paint', buffered: true });\n      observer.observe({ type: 'resource', buffered: true });\n      observer.observe({ type: 'longtask', buffered: true });\n\n      this.observers.push(observer);\n    } catch (e) {\n      console.error('Error initializing PerformanceObserver:', e);\n    }\n  }\n\n  private collectInitialMetrics(): void {\n    this.collectNavigationTiming();\n    const resourceEntries = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n    this.processResourceEntries(resourceEntries);\n  }\n\n  private collectNavigationTiming(): void {\n    const navigationEntries = performance.getEntriesByType('navigation');\n    if (navigationEntries.length > 0) {\n      const navTiming = navigationEntries[0] as PerformanceNavigationTiming;\n\n      let ttfb = null;\n      if (navTiming.responseStart > 0 && navTiming.fetchStart > 0) {\n        ttfb = navTiming.responseStart - navTiming.fetchStart;\n      }\n\n      let loadTime = null;\n      if (navTiming.loadEventEnd > 0) {\n        loadTime = navTiming.loadEventEnd - navTiming.startTime;\n      }\n\n      let domInteractive = null;\n      if (navTiming.domInteractive > 0) {\n        domInteractive = navTiming.domInteractive - navTiming.startTime;\n      }\n\n      this.metrics.navigation = { ttfb, loadTime, domInteractive };\n      this.updateTrend('loadTime', loadTime);\n      this.updateTrend('ttfb', ttfb);\n    }\n  }\n\n  private processPerformanceEntry(entry: PerformanceEntry): void {\n    switch (entry.entryType) {\n      case 'largest-contentful-paint':\n        this.metrics.coreWebVitals.LCP = entry.startTime;\n        this.updateTrend('LCP', entry.startTime);\n        break;\n      case 'event': {\n        const eventEntry = entry as PerformanceEventTiming;\n        if (eventEntry.interactionId && eventEntry.duration > this.maxINP) {\n          this.maxINP = eventEntry.duration;\n          this.metrics.coreWebVitals.INP = this.maxINP;\n          this.updateTrend('INP', this.maxINP);\n        }\n        this.inpEntries.push(eventEntry);\n        break;\n      }\n      case 'layout-shift': {\n        const lsEntry = entry as LayoutShift;\n        if (!lsEntry.hadRecentInput) {\n          this.clsEntries.push(lsEntry);\n          this.calculateSessionWindowCLS();\n        }\n        break;\n      }\n      case 'paint':\n        if (entry.name === 'first-contentful-paint') {\n          this.metrics.coreWebVitals.FCP = entry.startTime;\n          this.updateTrend('FCP', entry.startTime);\n        }\n        break;\n      case 'resource':\n        this.processResourceEntries([entry as PerformanceResourceTiming]);\n        return;\n      case 'longtask': {\n        const ltEntry = entry as PerformanceLongTaskTiming;\n        this.longTaskEntries.push(ltEntry);\n        this.calculateLongTasksAndTBT();\n        break;\n      }\n    }\n    this.requestRender();\n  }\n\n  private calculateSessionWindowCLS(): void {\n    let maxCls = 0;\n    let currentSessionCls = 0;\n    let sessionStartTime = Infinity;\n    let lastTime = -Infinity;\n\n    this.clsEntries.sort((a, b) => a.startTime - b.startTime);\n\n    for (const entry of this.clsEntries) {\n      const timeDiff = entry.startTime - lastTime;\n\n      if (timeDiff > 1000 || entry.startTime - sessionStartTime > 5000) {\n        if (currentSessionCls > 0) {\n          maxCls = Math.max(maxCls, currentSessionCls);\n        }\n        currentSessionCls = 0;\n        sessionStartTime = entry.startTime;\n      }\n\n      currentSessionCls += entry.value;\n      lastTime = entry.startTime;\n    }\n\n    maxCls = Math.max(maxCls, currentSessionCls);\n    this.metrics.coreWebVitals.CLS = maxCls;\n    this.updateTrend('CLS', maxCls);\n  }\n\n  private processResourceEntries(entries: PerformanceResourceTiming[]): void {\n    const summary = this.metrics.resources;\n\n    entries.forEach((entry) => {\n      const size = entry.transferSize || 0;\n      const initiator = entry.initiatorType;\n      const name = entry.name.toLowerCase();\n\n      if (initiator === 'script' || name.endsWith('.js')) {\n        summary.js.count++;\n        summary.js.size += size;\n      } else if (initiator === 'css' || name.endsWith('.css') || initiator === 'link') {\n        summary.css.count++;\n        summary.css.size += size;\n      } else if (initiator === 'img' || initiator === 'image' || /\\.(jpg|jpeg|png|gif|svg|webp|avif)$/.test(name)) {\n        summary.img.count++;\n        summary.img.size += size;\n      } else {\n        summary.other.count++;\n        summary.other.size += size;\n      }\n      summary.totalSize += size;\n    });\n  }\n\n  private calculateLongTasksAndTBT(): void {\n    let tbt = 0;\n    let count = 0;\n    const referenceTime = this.metrics.coreWebVitals.FCP ?? 0;\n\n    this.longTaskEntries.forEach((task) => {\n      if (task.startTime >= referenceTime) {\n        count++;\n        if (task.duration > 50) {\n          tbt += task.duration - 50;\n        }\n      }\n    });\n    this.metrics.longTasks = { count, totalDuration: tbt };\n    this.metrics.coreWebVitals.TBT = tbt;\n    this.updateTrend('TBT', tbt);\n  }\n\n  private startMemoryMonitoring(): void {\n    if (!performance.memory) {\n      return;\n    }\n\n    const updateMemory = () => {\n      if (performance.memory) {\n        const mem = performance.memory;\n        this.metrics.memory = {\n          jsHeapSizeLimit: Number(mem.jsHeapSizeLimit) || 0,\n          totalJSHeapSize: Number(mem.totalJSHeapSize) || 0,\n          usedJSHeapSize: Number(mem.usedJSHeapSize) || 0\n        };\n        this.requestRender();\n      }\n    };\n\n    updateMemory();\n    this.memoryInterval = window.setInterval(updateMemory, 3000);\n  }\n\n  private stopMemoryMonitoring(): void {\n    if (this.memoryInterval) {\n      clearInterval(this.memoryInterval);\n      this.memoryInterval = null;\n    }\n  }\n\n  private initNetworkMonitoring(): void {\n    if (navigator.connection) {\n      this.updateNetworkInfo();\n      navigator.connection.addEventListener('change', this.updateNetworkInfo);\n    }\n  }\n\n  private stopNetworkMonitoring(): void {\n    if (navigator.connection) {\n      navigator.connection.removeEventListener('change', this.updateNetworkInfo);\n    }\n  }\n\n  private updateNetworkInfo = (): void => {\n    if (navigator.connection) {\n      this.network = {\n        effectiveType: navigator.connection.effectiveType ?? 'N/A',\n        rtt: navigator.connection.rtt ?? 0\n      };\n    }\n  };\n\n  private updateTrend(key: MetricKey, value: number | null): void {\n    if (value === null) {\n      return;\n    }\n    const history = this.trendHistory[key] || [];\n    history.push(value);\n    if (history.length > this.maxTrendLength) {\n      history.shift();\n    }\n    this.trendHistory[key] = history;\n  }\n\n  private getTrendDirection(key: MetricKey): string {\n    const history = this.trendHistory[key];\n    if (!history || history.length < 2) {\n      return '';\n    }\n\n    const currentValue = history[history.length - 1];\n    const previousAvg = history.slice(0, history.length - 1).reduce((a, b) => a + b, 0) / (history.length - 1);\n\n    const threshold = Math.abs(previousAvg * 0.05);\n    const delta = currentValue ?? 0 - previousAvg;\n\n    if (Math.abs(delta) < threshold) {\n      return '→';\n    }\n\n    if (key === 'fps') {\n      return delta > 0 ? '↑' : '↓';\n    } else {\n      return delta < 0 ? '↓' : '↑';\n    }\n  }\n\n  private getOverallStatus(): MetricRating {\n    const ratings: MetricRating[] = [\n      rateMetric('LCP', this.metrics.coreWebVitals.LCP),\n      rateMetric('CLS', this.metrics.coreWebVitals.CLS),\n      rateMetric('INP', this.metrics.coreWebVitals.INP),\n      rateMetric('fps', this.metrics.fps)\n    ];\n\n    if (ratings.includes('poor')) {\n      return 'poor';\n    }\n    if (ratings.includes('needs-improvement')) {\n      return 'needs-improvement';\n    }\n    if (ratings.every((r) => r === 'unknown')) {\n      return 'unknown';\n    }\n\n    if (ratings.some((r) => r === 'good')) {\n      return 'good';\n    }\n\n    return 'unknown';\n  }\n\n  render(): TemplateResult {\n    return html`\n      <div part=\"container\">\n        ${this.renderExpanded()}\n      </div>\n    `;\n  }\n\n  private renderExpanded(): TemplateResult {\n    return html`\n      <div part=\"header\">\n        <div part=\"title\">\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"></polyline><polyline points=\"17 6 23 6 23 12\"></polyline></svg>\n            Performance Monitor\n        </div>\n      </div>\n      <div part=\"content\">\n        ${this.renderVitalsAndTiming()}\n        ${this.renderRealtime()}\n        ${this.renderNetworkInfo()}\n        ${this.renderResources()}\n      </div>\n    `;\n  }\n\n  private renderMetricBox(label: string, key: MetricKey, value: number | null, description: string): TemplateResult {\n    const rating = rateMetric(key, value);\n    const formattedValue = formatMetric(key, value);\n    const trend = this.getTrendDirection(key);\n    const benchmark = GLOBAL_BENCHMARKS[key];\n    const vsBenchmark = benchmark ? ` (vs avg ${formatMetric(key, benchmark)})` : '';\n    return html`\n        <div class=\"metric-box\" title=\"${description}${vsBenchmark}\">\n            <div part=\"metric-label\" class=\"metric-label\">${label}</div>\n            <div part=\"metric-value\" class=\"metric-value rating-${rating}\" data-rating=${rating}>\n                ${formattedValue}\n                <span class=\"trend-indicator\">${trend}</span>\n            </div>\n        </div>\n    `;\n  }\n\n  private renderVitalsAndTiming(): TemplateResult {\n    const { LCP, INP, CLS, FCP, TBT } = this.metrics.coreWebVitals;\n    const { ttfb, loadTime } = this.metrics.navigation;\n    return html`\n        <section>\n            <div part=\"section-title\" class=\"section-title\">Vitals & Timing</div>\n            <div class=\"metrics-grid\">\n                ${this.renderMetricBox('LCP', 'LCP', LCP, 'Largest Contentful Paint: Measures loading performance.')}\n                ${this.renderMetricBox('INP', 'INP', INP, 'Interaction to Next Paint: Measures responsiveness.')}\n                ${this.renderMetricBox('CLS', 'CLS', CLS, 'Cumulative Layout Shift: Measures visual stability.')}\n                ${this.renderMetricBox('FCP', 'FCP', FCP, 'First Contentful Paint: When the browser renders the first bit of content.')}\n                ${this.renderMetricBox('TBT', 'TBT', TBT, 'Total Blocking Time: Sum of blocking portions of long tasks.')}\n                ${this.renderMetricBox('TTFB', 'ttfb', ttfb, 'Time to First Byte: Measures server responsiveness.')}\n                ${this.renderMetricBox('Load', 'loadTime', loadTime, 'Total Page Load Time.')}\n            </div>\n        </section>\n    `;\n  }\n\n  private renderRealtime(): TemplateResult {\n    const { memory, longTasks } = this.metrics;\n\n    return html`\n        <section>\n            <div part=\"section-title\" class=\"section-title\">Realtime Monitoring</div>\n            <ease-monitor-fps></ease-monitor-fps>\n            <div class=\"longtask-item\">\n                <span>Long Tasks (Count / Blocked ms)</span>\n                <span>${longTasks.count} / ${longTasks.totalDuration.toFixed(0)}ms</span>\n            </div>\n            ${this.renderMemory(memory)}\n        </section>\n    `;\n  }\n\n  private renderMemory(memory: MemoryUsage): TemplateResult {\n    if (!memory) {\n      return html`\n            <div class=\"memory-usage\">\n                (performance.memory API not supported)\n            </div>\n        `;\n    }\n\n    const usedPercent = memory.totalJSHeapSize > 0 ? (memory.usedJSHeapSize / memory.totalJSHeapSize) * 100 : 0;\n\n    let rating: MetricRating = 'good';\n    if (usedPercent > 85) {\n      rating = 'poor';\n    } else if (usedPercent > 60) {\n      rating = 'needs-improvement';\n    }\n\n    return html`\n        <div class=\"memory-usage\">\n            <div class=\"resource-item\">\n                <span>Used / Total Heap</span>\n                <span>${formatBytes(memory.usedJSHeapSize)} / ${formatBytes(memory.totalJSHeapSize)}</span>\n            </div>\n            <div class=\"memory-bar\" title=\"${usedPercent.toFixed(1)}% Used\">\n                <div class=\"memory-used rating-${rating}\" style=${styleObject({ width: `${Math.min(100, usedPercent)}%` })} data-rating=${rating}></div>\n            </div>\n            <div class=\"resource-item\">\n                <span>Heap Limit</span>\n                <span>${formatBytes(memory.jsHeapSizeLimit)}</span>\n            </div>\n        </div>\n    `;\n  }\n\n  private renderNetworkInfo(): TemplateResult {\n    const { effectiveType, rtt } = this.network;\n    return html`\n        <section>\n            <div part=\"section-title\" class=\"section-title\">Network Connection</div>\n            <div class=\"network-info\">\n                <div class=\"network-item\">\n                    <span>Effective Type</span>\n                    <span>${effectiveType.toUpperCase()}</span>\n                </div>\n                 <div class=\"network-item\">\n                    <span>Round Trip Time (RTT)</span>\n                    <span>${rtt > 0 ? `${rtt}ms` : 'N/A'}</span>\n                </div>\n            </div>\n        </section>\n    `;\n  }\n\n  private renderResources(): TemplateResult {\n    const { js, css, img, other, totalSize } = this.metrics.resources;\n    const totalCount = js.count + css.count + img.count + other.count;\n\n    const renderItem = (label: string, data: { count: number; size: number }) => html`\n        <div class=\"resource-item\">\n            <span>${label} (${data.count})</span>\n            <span>${formatBytes(data.size)}</span>\n        </div>\n    `;\n\n    return html`\n        <section>\n            <div part=\"section-title\" class=\"section-title\">Resources (Total: ${formatBytes(totalSize)} / ${totalCount} reqs)</div>\n            <div class=\"resource-list\">\n                ${renderItem('JS', js)}\n                ${renderItem('CSS/Links', css)}\n                ${renderItem('Images', img)}\n                ${renderItem('Other', other)}\n            </div>\n            <div part=\"carbon-estimate\" class=\"carbon-estimate\">\n                Est. Carbon: ${estimateCarbonFootprint(totalSize)}\n            </div>\n            <div>\n              Overall Status: ${this.getOverallStatus()}\n            </div>\n        </section>\n    `;\n  }\n}\n","import { html } from 'lit-html';\n\nimport { CONTROL_CHANGE_EVENT, coerceNumber, dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\nimport '../input';\nimport '../icons/interface/minus';\nimport '../icons/interface/plus';\n@Component({\n  tag: 'ease-number-input',\n  styles: `\n    :host {\n      display: inline-flex;\n      align-items: center;\n    }\n\n    [part=\"container\"] {\n      min-width: 0;\n    }\n\n    ease-input {\n      --ease-input-padding: 0;\n      text-align: center;\n      font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n      font-variant-numeric: tabular-nums;\n      font-feature-settings: \"tnum\";\n    }\n\n    [part=\"button\"] {\n      position: relative;\n      overflow: hidden;\n      \n      & > div {\n        animation: blink .75s forwards;\n        position: absolute;\n        pointer-events: none;\n        inset: 0;\n        background-color: var(--ease-number-blink-color, var(--color-white-8));\n      }\n    }\n\n    @keyframes blink {\n      0%,\n      90%,\n      100% {\n        opacity: 0;\n      }\n      30% {\n        opacity: 1;\n      }\n    }\n  `,\n  template(this: NumberInput) {\n    return html`\n      <div part=\"container\">\n        <ease-input\n          part=\"control\"\n          type=\"number\"\n          .value=${this.value}\n          ?disabled=${this.disabled}\n          ?min=${this.min}\n          ?max=${this.max}\n          ?step=${this.step}\n          @input=${this.handleInput}\n          @change=${this.handleChange}\n        >\n          <button\n            slot=\"prefix\"\n            @click=${this.handleDecrement.bind(this)}\n            type=\"button\"\n            part=\"button\"\n            ?disabled=${this.disabled || this.min === null || Number(this.control?.value) <= this.min}\n            ?aria-disabled=${this.disabled || this.min === null || Number(this.control?.value) <= this.min}\n          >\n            <ease-icon-minus />\n          </button>\n          <button\n            slot=\"suffix\"\n            @click=${this.handleIncrement.bind(this)}\n            type=\"button\"\n            part=\"button\"\n            ?disabled=${this.disabled || this.max === null || Number(this.control?.value) >= this.max}\n            ?aria-disabled=${this.disabled || this.max === null || Number(this.control?.value) >= this.max}\n          >\n            <ease-icon-plus />\n          </button>\n        </ease-input>\n      </div>\n    `;\n  }\n})\nexport class NumberInput extends HTMLElement {\n  declare requestRender: () => void;\n  @Prop<number | null>({ type: Number, reflect: true })\n  accessor value!: number | null;\n\n  @Prop<number | null>({ type: Number, reflect: true })\n  accessor min!: number | null;\n\n  @Prop<number | null>({ type: Number, reflect: true })\n  accessor max!: number | null;\n\n  @Prop<number | null>({ type: Number, reflect: true })\n  accessor step!: number | null;\n\n  @Prop<string | null>({ reflect: true })\n  accessor name!: string | null;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled!: boolean;\n\n  @Query<HTMLInputElement>('input')\n  accessor control!: HTMLInputElement | null;\n\n  afterRender(): void {\n    if (!this.control) {\n      return;\n    }\n\n    const control = this.control;\n    control.value = this.value === null || this.value === undefined ? '' : String(this.value);\n    control.min = this.min === null || this.min === undefined ? '' : String(this.min);\n    control.max = this.max === null || this.max === undefined ? '' : String(this.max);\n    control.step = this.step === null || this.step === undefined ? '' : String(this.step);\n    control.name = this.name ?? '';\n    control.disabled = Boolean(this.disabled);\n\n    setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n  }\n\n  @Listen<NumberInput, Event, HTMLInputElement>('input', { selector: 'input' })\n  handleInput(event: Event, target?: HTMLInputElement | null): void {\n    if (!target) {\n      return;\n    }\n\n    this.value = coerceNumber(target.value);\n\n    const name = this.name ?? this.getAttribute('name') ?? undefined;\n    const detail = { name, value: this.value, event };\n\n    dispatchControlEvent(this, 'input', detail);\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n\n  @Listen<NumberInput, Event, HTMLInputElement>('change', { selector: 'input' })\n  handleChange(event: Event, target?: HTMLInputElement | null): void {\n    if (!target) {\n      return;\n    }\n\n    this.value = coerceNumber(target.value);\n\n    const name = this.name ?? this.getAttribute('name') ?? undefined;\n    const detail = { name, value: this.value, event };\n\n    dispatchControlEvent(this, 'change', detail);\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n\n  addActiveLayer(button: HTMLButtonElement): void {\n    const layer = document.createElement('div');\n    layer.classList.add('active-layer');\n    button.appendChild(layer);\n\n    setTimeout(() => {\n      layer.remove();\n    }, 600);\n  }\n\n  handleDecrement(event: MouseEvent): void {\n    if (this.disabled || this.min === null || Number(this.control?.value) <= this.min) {\n      return;\n    }\n\n    const button = event.currentTarget as HTMLButtonElement;\n    this.addActiveLayer(button);\n\n    const current = typeof this.value === 'number' ? this.value : 0;\n    this.value = current - (this.step ?? 1);\n\n    if (this.value <= this.min) {\n      this.disabled = true;\n    }\n  }\n\n  handleIncrement(event: MouseEvent): void {\n    if (this.disabled || this.max === null || Number(this.control?.value) >= this.max) {\n      return;\n    }\n\n    const button = event.currentTarget as HTMLButtonElement;\n    this.addActiveLayer(button);\n\n    const current = typeof this.value === 'number' ? this.value : 0;\n    this.value = current + (this.step ?? 1);\n\n    if (this.value >= this.max) {\n      this.disabled = true;\n    }\n  }\n}\n","import '../dropdown';\n\nimport type { Dropdown } from '../dropdown';\n\nimport { html } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-origin',\n  styles: `\n    :host {\n      display: contents;\n    }\n\n    [part=\"container\"] {\n      flex: 1;\n      width: 100%;\n      display: grid;\n      grid-template-columns: 30px auto;\n      grid-gap: 8px;\n    }\n\n    [part=\"preview\"] {\n      width: 30px;\n      height: 30px;\n      border-radius: var(--radii-md);\n      background-color: var(--color-gray-875);\n      cursor: pointer;\n      box-shadow: inset 0 1px .25px 0 var(--color-white-4), 0 1px 2.5px 0 var(--color-black-8);\n      border-radius: var(--radii-md);\n      position: relative;\n\n      &::before,\n      &::after {\n        content: '';\n        display: block;\n        width: 3px;\n        height: 3px;\n        background-color: var(--color-blue-100);\n        border-radius: 50%;\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        margin-top: -1.5px;\n        margin-left: -1.5px;\n      }\n\n      &::before {\n        background-color: var(--color-gray-700);\n        box-shadow: -6.5px -6.5px 0 0 var(--color-gray-700), 0 -6.5px 0 0 var(--color-gray-700), 6.5px -6.5px 0 0 var(--color-gray-700), -6.5px 0 0 0 var(--color-gray-700), 6.5px 0 0 0 var(--color-gray-700), -6.5px 6.5px 0 0 var(--color-gray-700), 0 6.5px 0 0 var(--color-gray-700), 6.5px 6.5px 0 0 var(--color-gray-700);\n      }\n\n      &::after {\n        translate: var(--ease-origin-translate-x, 0) var(--ease-origin-translate-y, 0);\n        scale: 1.25;\n        transition: translate 0.3s cubic-bezier(0.25, 0, 0.5, 1);\n      }\n\n      &:hover {\n        background-color: var(--color-gray-850);\n      }\n\n      &:focus-within {\n        background-color: var(--color-gray-825);\n      }\n\n      &[data-value=\"top-left\"] {\n        --ease-origin-translate-x: -6.5px;\n        --ease-origin-translate-y: -6.5px;\n      }\n\n      &[data-value=\"top-center\"] {\n        --ease-origin-translate-x: 0;\n        --ease-origin-translate-y: -6.5px;  \n      }\n      \n      &[data-value=\"top-right\"] {\n        --ease-origin-translate-x: 6.5px;\n        --ease-origin-translate-y: -6.5px;\n      }\n\n      &[data-value=\"center-left\"] {\n        --ease-origin-translate-x: -6.5px;\n        --ease-origin-translate-y: 0\n      }\n\n      &[data-value=\"center-center\"] {\n        --ease-origin-translate-x: 0;\n        --ease-origin-translate-y: 0;\n      }\n\n      &[data-value=\"center-right\"] {\n        --ease-origin-translate-x: 6.5px;\n        --ease-origin-translate-y: 0;\n      }\n      \n      &[data-value=\"bottom-left\"] {\n        --ease-origin-translate-x: -6.5px;\n        --ease-origin-translate-y: 6.5px;\n      }\n      \n      &[data-value=\"bottom-center\"] {\n        --ease-origin-translate-x: 0;\n        --ease-origin-translate-y: 6.5px;\n      }\n      \n      &[data-value=\"bottom-right\"] {\n        --ease-origin-translate-x: 6.5px;\n        --ease-origin-translate-y: 6.5px;\n      }\n    }\n\n    ease-dropdown[part=\"dropdown\"] {\n      --ease-dropdown-max-height: 180px;\n\n      width: 100%;\n    }\n  `,\n  template(this: Origin) {\n    return html`\n      <div part=\"container\">\n        <div part=\"preview\" data-value=${this.value ?? 'center-center'}></div>\n        \n        <ease-dropdown part=\"dropdown\" placeholder=\"Select\" id=\"origin-dropdown\" .value=${this.value ?? 'center-center'} fullWidth name=${this.name} @value-change=${this.handleValueChange}>\n          <button slot=\"content\" value=\"top-left\">Top Left</button>\n          <button slot=\"content\" value=\"top-center\">Top Center</button>\n          <button slot=\"content\" value=\"top-right\">Top Right</button>\n          <hr slot=\"content\" />\n          <button slot=\"content\" value=\"center-left\">Center Left</button>\n          <button slot=\"content\" value=\"center-center\">Center Center</button>\n          <button slot=\"content\" value=\"center-right\">Center Right</button>\n          <hr slot=\"content\" />\n          <button slot=\"content\" value=\"bottom-left\">Bottom Left</button>\n          <button slot=\"content\" value=\"bottom-center\">Bottom Center</button>\n          <button slot=\"content\" value=\"bottom-right\">Bottom Right</button>\n        </ease-dropdown>\n      </div>\n    `;\n  }\n})\nexport class Origin extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<string>({ reflect: true, defaultValue: 'center-center' })\n  accessor value: string = 'center-center';\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled!: boolean;\n\n  @Query<Dropdown>('ease-dropdown')\n  accessor control!: Dropdown | null;\n\n  @Prop<string>({ reflect: true, defaultValue: '' })\n  accessor name: string = '';\n\n  afterRender(): void {\n    setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n  }\n\n  @Listen<Origin, Event, Dropdown>('change', { selector: 'ease-dropdown' })\n  handleChange(event: Event, target?: Dropdown | null): void {\n    if (!target) {\n      return;\n    }\n\n    this.value = String(target.value ?? 'center-center');\n\n    dispatchControlEvent(this, 'change', { value: this.value, event });\n  }\n\n  handleValueChange = (event: Event): void => {\n    this.value = String(this.control?.value ?? 'center-center');\n\n    dispatchControlEvent(this, 'change', { value: this.value, event });\n  };\n}\n","import { html, nothing, type TemplateResult } from 'lit-html';\n\nimport { setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n/**\n * Event detail for tab change events\n */\nexport interface TabChangeEventDetail {\n  /** The index of the active tab */\n  index: number;\n  /** The tab id */\n  id: string;\n  /** The original event */\n  event: Event;\n}\n\n/**\n * Panel component - visual container with optional tabs and header actions.\n *\n * Use this component when you want the panel UI without state management,\n * or wrap it around `<ease-state>` for full functionality.\n *\n * @tag ease-panel\n *\n * @slot headline - Panel title text (hidden when tabs are present)\n * @slot actions - Header action buttons, links, or dropdowns\n * @slot - Default slot for main content\n * @slot tab-{id} - Tab panel content (use `data-tab-label` for display name)\n * @slot footer - Footer content below all panels\n *\n * @csspart section - Outer container\n * @csspart header - Header row containing headline/tabs and actions\n * @csspart headline - Title element\n * @csspart tabs - Tab button container\n * @csspart tab - Individual tab button\n * @csspart actions - Actions container\n * @csspart content - Content wrapper (handles height animations)\n * @csspart body - Inner body container\n * @csspart items - Grid container for slotted content\n * @csspart tab-panel - Individual tab panel\n * @csspart footer - Footer container\n *\n * @fires tab-change - Fired when the active tab changes\n */\n@Component({\n  tag: 'ease-panel',\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: block;\n      box-sizing: border-box;\n    }\n\n    @property --ease-panel-top-fade {\n      syntax: \"<length>\";\n      inherits: false;\n      initial-value: 0px;\n    }\n\n    @property --ease-panel-bottom-fade {\n      syntax: \"<length>\";\n      inherits: false;\n      initial-value: 0px;\n    }\n\n    [part=\"section\"] {\n      display: flex;\n      flex-direction: column;\n      max-height: inherit;\n      width: 100%;\n      max-width: var(--ease-panel-max-width);\n      border-radius: var(--ease-panel-radius);\n      border: 1px solid var(--ease-panel-border-color);\n      background-clip: padding-box;\n      background-color: var(--ease-panel-background);\n      box-shadow: var(--ease-panel-shadow);\n      box-sizing: border-box;\n      padding: var(--ease-panel-padding);\n      margin: auto;\n    }\n\n    [part=\"header\"] {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      width: 100%;\n      margin-bottom: var(--ease-panel-header-spacing);\n    }\n\n    [part=\"header\"]:not(:has([part=\"headline\"] slot[name=\"headline\"]::slotted(*))):not(:has([part=\"tabs\"]:not(:empty))):not(:has([part=\"actions\"] slot[name=\"actions\"]::slotted(*))) {\n      display: none;\n      margin-bottom: 0;\n    }\n\n    [part=\"headline\"] {\n      font-size: var(--ease-panel-title-font-size);\n      font-weight: var(--ease-panel-title-font-weight);\n      line-height: 24px;\n      font-family: var(--ease-font-family);\n      color: var(--ease-panel-title-color);\n      margin: 0 0 0 4px;\n      flex-grow: 1;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      white-space: nowrap;\n    }\n\n    [part=\"headline\"]:has(+ [part=\"tabs\"]:not(:empty)) {\n      display: none;\n    }\n\n    [part=\"tabs\"] {\n      display: flex;\n      align-items: center;\n      gap: 2px;\n      flex-grow: 1;\n    }\n\n    [part=\"tabs\"]:empty {\n      display: none;\n    }\n\n    [part=\"tab\"] {\n      appearance: none;\n      border-radius: var(--ease-panel-tab-radius, var(--radii-md));\n      background-color: var(--ease-panel-tab-background, transparent);\n      box-sizing: border-box;\n      padding: var(--ease-panel-tab-padding, 4px 8px);\n      font-size: var(--ease-panel-tab-font-size);\n      font-weight: var(--ease-panel-tab-font-weight);\n      line-height: 24px;\n      font-family: var(--ease-font-family);\n      color: var(--ease-panel-tab-color);\n      border: none;\n      margin: 0;\n      cursor: pointer;\n      transition: color 200ms, background-color 200ms;\n      transition-timing-function: cubic-bezier(.25, 0, .5, 1);\n    }\n\n    [part=\"tab\"]:hover {\n      color: var(--ease-panel-tab-color-hover);\n    }\n\n    [part=\"tab\"][aria-selected=\"true\"] {\n      color: var(--ease-panel-tab-color-active);\n      background-color: var(--ease-panel-tab-background-active);\n    }\n\n    [part=\"actions\"] {\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      margin-left: auto;\n    }\n\n    slot[name=\"actions\"]::slotted(button),\n    slot[name=\"actions\"]::slotted(a) {\n      --ease-icon-size: var(--ease-panel-action-icon-size);\n\n      appearance: none;\n      flex: 0 0 24px;\n      border: none;\n      outline: none;\n      background-color: transparent;\n      padding: 4px;\n      margin: 0;\n      cursor: pointer;\n      color: var(--color-gray-600);\n      transition: color 200ms;\n      transition-timing-function: cubic-bezier(.25, 0, .5, 1);\n      text-decoration: none;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    slot[name=\"actions\"]::slotted(button:hover),\n    slot[name=\"actions\"]::slotted(button:focus-visible),\n    slot[name=\"actions\"]::slotted(a:hover),\n    slot[name=\"actions\"]::slotted(a:focus-visible) {\n      color: var(--color-blue-100);\n    }\n\n    slot[name=\"actions\"]::slotted(ease-dropdown) {\n      flex: 0 0 auto;\n      width: auto;\n\n      --ease-icon-size: var(--ease-panel-action-icon-size, 16px);\n      --ease-dropdown-trigger-padding: 4px;\n      --ease-dropdown-radius: 6px;\n      --ease-dropdown-background: transparent;\n      --ease-dropdown-background-hover: transparent;\n      --ease-dropdown-shadow: none;\n      --ease-dropdown-color: var(--color-gray-600);\n      --ease-popover-placement: bottom-end;\n    }\n\n    slot[name=\"actions\"]::slotted(ease-dropdown:hover),\n    slot[name=\"actions\"]::slotted(ease-dropdown:focus-within) {\n      --ease-dropdown-color: var(--color-blue-100);\n    }\n\n    [part=\"content\"] {\n      display: block;\n      flex: 1 1 auto;\n      min-height: 0;\n      width: 100%;\n      box-sizing: border-box;\n      overflow-y: auto;\n      overflow-x: hidden;\n      mask-image: linear-gradient(to bottom, #0000, #ffff var(--top-fade) calc(100% - var(--bottom-fade)), #0000);\n      animation-name: scroll-fade;\n      animation-timeline: scroll(self y);\n      scroll-snap-type: y proximity;\n      scrollbar-width: none;\n\n      &::-webkit-scrollbar {\n        display: none;\n      }\n    }\n\n    [part=\"content\"][data-animating=\"true\"] {\n      transition: height 200ms cubic-bezier(.25, 0, .5, 1);\n    }\n\n    [part=\"body\"] {\n      display: block;\n      height: 100%;\n      width: 100%;\n      position: relative;\n    }\n\n    @keyframes scroll-fade {\n      0% {\n        --top-fade: 0px;\n      }\n      10%, 100% {\n        --top-fade: var(--ease-panel-fade-size);\n      }\n      0%, 90% {\n        --bottom-fade: var(--ease-panel-fade-size);\n      }\n      100% {\n        --bottom-fade: 0px;\n      }\n    }\n\n    [part=\"tab-panel\"] {\n      width: 100%;\n      pointer-events: none;\n      display: none;\n    }\n\n    [part=\"tab-panel\"][data-state=\"active\"] {\n      display: block;\n      height: 100%;\n      pointer-events: auto;\n    }\n\n    [part=\"tab-panel\"][data-state=\"hidden\"] {\n      display: none;\n      pointer-events: none;\n    }\n\n    [part=\"footer\"] {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      width: 100%;\n      padding: var(--ease-panel-footer-padding);\n      box-sizing: border-box;\n      border-top: 1px solid var(--color-white-4);\n\n      &:not(:has([data-has-content=\"true\"])) {\n        display: none;\n      }\n    }\n\n    [part=\"items\"] {\n      display: grid;\n      grid-gap: var(--ease-panel-gap);\n      box-sizing: border-box;\n      width: 100%;\n      max-height: 100%;\n    }\n  `\n})\nexport class Panel extends HTMLElement {\n  declare requestRender: () => void;\n\n  #tabs: { id: string; label: string }[] = [];\n  #isAnimating = false;\n\n  @Prop<number>({\n    type: Number,\n    reflect: true,\n    attribute: 'active-tab',\n    defaultValue: 0,\n    onChange(next, previous) {\n      const self = this as Panel;\n      if (next !== previous && previous !== undefined) {\n        self.handleActiveTabChange(previous, next);\n      }\n    }\n  })\n  accessor activeTab: number = 0;\n\n  @Prop<string | null>({\n    reflect: true,\n    attribute: 'headline',\n    defaultValue: ''\n  })\n  accessor headline: string | null = null;\n\n  @Prop<string | null>({\n    reflect: true,\n    attribute: 'max-height',\n    defaultValue: null\n  })\n  accessor maxHeight: string | null = null;\n\n  /** @internal */\n  handleActiveTabChange(previous: number, next: number): void {\n    this.performTabAnimation(previous, next);\n  }\n\n  @Query<HTMLElement>('[part=\"content\"]')\n  accessor contentElement!: HTMLElement | null;\n\n  @Query<HTMLElement>('[part=\"body\"]')\n  accessor bodyElement!: HTMLElement | null;\n\n  /**\n   * Get the tab configuration\n   */\n  get tabs(): ReadonlyArray<{ id: string; label: string }> {\n    return this.#tabs;\n  }\n\n  /**\n   * Switch to a specific tab by index\n   * @param index - The tab index (0-based)\n   */\n  setTab(index: number): void {\n    if (index >= 0 && index < this.#tabs.length && index !== this.activeTab) {\n      this.activeTab = index;\n    }\n  }\n\n  connectedCallback(): void {\n    this.#syncTabs();\n  }\n\n  afterRender(): void {\n    this.#syncTabs();\n  }\n\n  render(): TemplateResult {\n    const hasTabs = this.#tabs.length > 0;\n\n    return html`\n      <section part=\"section\">\n        <div part=\"header\">\n          <h3 part=\"headline\">${this.headline}</h3>\n          ${this.#renderTabs()}\n          <div part=\"actions\">\n            <slot name=\"actions\"></slot>\n          </div>\n        </div>\n        <div part=\"content\">\n          <div part=\"body\">\n            ${hasTabs ? this.#renderTabPanels() : html`<div part=\"items\" style=${this.maxHeight ? `max-height: ${this.maxHeight}` : nothing}><slot></slot></div>`}\n          </div>\n        </div>\n        <div part=\"footer\">\n          <slot name=\"footer\"></slot>\n        </div>\n      </section>\n    `;\n  }\n\n  #renderTabs(): TemplateResult | typeof nothing {\n    if (this.#tabs.length === 0) {\n      return nothing;\n    }\n\n    return html`\n      <div part=\"tabs\" role=\"tablist\">\n        ${this.#tabs.map(\n          (tab, index) => html`\n            <button\n              part=\"tab\"\n              role=\"tab\"\n              aria-selected=${index === this.activeTab ? 'true' : 'false'}\n              aria-controls=${`panel-${tab.id}`}\n              tabindex=${index === this.activeTab ? 0 : -1}\n              @click=${(e: Event) => this.#handleTabClick(index, tab.id, e)}\n              @keydown=${(e: KeyboardEvent) => this.#handleTabKeydown(e, index)}\n            >\n              ${tab.label}\n            </button>\n          `\n        )}\n      </div>\n    `;\n  }\n\n  #renderTabPanels(): TemplateResult {\n    return html`\n      ${this.#tabs.map(\n        (tab, index) => html`\n          <div\n            part=\"tab-panel\"\n            role=\"tabpanel\"\n            id=${`panel-${tab.id}`}\n            aria-labelledby=${`tab-${tab.id}`}\n            data-state=${index === this.activeTab ? 'active' : 'hidden'}\n            data-index=${index}\n          >\n            <div part=\"items\" style=${this.maxHeight ? `max-height: ${this.maxHeight}` : nothing}>\n              <slot name=${`tab-${tab.id}`}></slot>\n            </div>\n          </div>\n        `\n      )}\n    `;\n  }\n\n  #handleTabClick(index: number, id: string, event: Event): void {\n    if (index === this.activeTab) {\n      return;\n    }\n\n    this.activeTab = index;\n\n    this.dispatchEvent(\n      new CustomEvent<TabChangeEventDetail>('tab-change', {\n        detail: { index, id, event },\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  #handleTabKeydown(event: KeyboardEvent, currentIndex: number): void {\n    let newIndex = currentIndex;\n\n    switch (event.key) {\n      case 'ArrowLeft':\n        event.preventDefault();\n        newIndex = currentIndex > 0 ? currentIndex - 1 : this.#tabs.length - 1;\n        break;\n      case 'ArrowRight':\n        event.preventDefault();\n        newIndex = currentIndex < this.#tabs.length - 1 ? currentIndex + 1 : 0;\n        break;\n      case 'Home':\n        event.preventDefault();\n        newIndex = 0;\n        break;\n      case 'End':\n        event.preventDefault();\n        newIndex = this.#tabs.length - 1;\n        break;\n      default:\n        return;\n    }\n\n    if (newIndex !== currentIndex) {\n      this.activeTab = newIndex;\n\n      // Focus the new tab button\n      queueMicrotask(() => {\n        const tabButtons = this.shadowRoot?.querySelectorAll('[part=\"tab\"]');\n        const newTabButton = tabButtons?.[newIndex] as HTMLButtonElement | undefined;\n        newTabButton?.focus();\n      });\n    }\n  }\n\n  async performTabAnimation(fromIndex: number, toIndex: number): Promise<void> {\n    if (this.#isAnimating) {\n      return;\n    }\n\n    this.#isAnimating = true;\n\n    const duration = 120;\n    const easing = 'cubic-bezier(.25, 0, .5, 1)';\n\n    const content = this.contentElement;\n\n    if (!content) {\n      this.#isAnimating = false;\n      this.requestRender();\n      return;\n    }\n\n    // Get the panels by data-index attribute for reliability\n    const fromPanel = this.shadowRoot?.querySelector(\n      `[part=\"tab-panel\"][data-index=\"${fromIndex}\"]`\n    ) as HTMLElement | null;\n    const toPanel = this.shadowRoot?.querySelector(`[part=\"tab-panel\"][data-index=\"${toIndex}\"]`) as HTMLElement | null;\n\n    if (!fromPanel || !toPanel) {\n      this.#isAnimating = false;\n      this.requestRender();\n      return;\n    }\n\n    // Lock the current height\n    const startHeight = content.getBoundingClientRect().height;\n    content.style.height = `${startHeight}px`;\n\n    // FIX: Ensure the new panel is hidden immediately.\n    toPanel.style.display = 'none';\n    toPanel.style.opacity = '0';\n\n    // Fade out old content via WAAPI\n    try {\n      const fadeOut = fromPanel.animate([{ opacity: 1 }, { opacity: 0 }], { duration, easing, fill: 'forwards' });\n      await fadeOut.finished;\n      fadeOut.cancel();\n    } catch {\n      // ignore\n    }\n\n    fromPanel.setAttribute('data-state', 'hidden');\n\n    // Temporarily unlock content height for accurate measurement\n    content.style.height = 'auto';\n\n    const previousToState = toPanel.getAttribute('data-state');\n\n    toPanel.style.display = 'block';\n    toPanel.style.visibility = 'hidden';\n    toPanel.style.opacity = '0';\n\n    void content.offsetHeight;\n    const endHeight = content.getBoundingClientRect().height;\n\n    // Re-lock at start height for animation\n    content.style.height = `${startHeight}px`;\n    void content.offsetHeight;\n\n    // Animate height\n    if (startHeight !== endHeight) {\n      content.setAttribute('data-animating', 'true');\n      void content.offsetHeight;\n      content.style.height = `${endHeight}px`;\n      await this.#wait(duration);\n    }\n\n    // Show panel but keep opacity at 0, then fade in\n    toPanel.style.visibility = 'visible';\n    toPanel.style.opacity = '0';\n\n    void toPanel.offsetHeight;\n\n    try {\n      const fadeIn = toPanel.animate([{ opacity: 0 }, { opacity: 1 }], { duration, easing, fill: 'forwards' });\n      await fadeIn.finished;\n      fadeIn.cancel();\n    } catch {\n      // ignore\n    }\n\n    // Finalize new tab state and cleanup\n    toPanel.style.display = '';\n    toPanel.style.visibility = '';\n    toPanel.style.opacity = '';\n\n    if (previousToState !== 'active') {\n      toPanel.setAttribute('data-state', 'active');\n    }\n\n    content.style.height = '';\n    content.removeAttribute('data-animating');\n    this.#isAnimating = false;\n  }\n\n  #wait(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n\n  #syncTabs(): void {\n    const tabs: { id: string; label: string }[] = [];\n\n    for (const child of Array.from(this.children)) {\n      const slot = child.getAttribute('slot');\n      if (slot?.startsWith('tab-')) {\n        const id = slot.replace('tab-', '');\n        const label = child.getAttribute('data-tab-label') || id;\n        tabs.push({ id, label });\n      }\n    }\n\n    this.#tabs = tabs.slice(0, 3);\n\n    if (this.activeTab >= this.#tabs.length && this.#tabs.length > 0) {\n      this.activeTab = 0;\n    }\n  }\n\n  @Listen('slotchange', { selector: 'slot[name=\"footer\"]' })\n  onFooterSlotChange(): void {\n    this.updateFooterAttribute();\n  }\n\n  @Listen('slotchange', { selector: 'slot:not([name])' })\n  onDefaultSlotChange(): void {\n    this.#syncTabs();\n    this.requestRender();\n  }\n\n  private updateFooterAttribute(): void {\n    const footer = this.shadowRoot?.querySelector('[part=\"footer\"]');\n\n    if (!footer) {\n      return;\n    }\n\n    const footerSlot = this.shadowRoot?.querySelector('slot[name=\"footer\"]') as HTMLSlotElement;\n    const hasFooter = Boolean(footerSlot?.assignedNodes({ flatten: true }).length > 0);\n    setBooleanAttribute(footer, 'data-has-content', hasFooter);\n  }\n}\n","export class RadioOption extends HTMLElement {\n  connectedCallback(): void {\n    this.hidden = true;\n    if (!this.hasAttribute('slot')) {\n      this.setAttribute('slot', 'option');\n    }\n  }\n}\n\nif (!customElements.get('radio-option')) {\n  customElements.define('radio-option', RadioOption);\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\nimport '../button';\n\nimport { dispatchControlEvent } from '../shared';\n\nexport * from './option';\n\ninterface RadioEntry {\n  element: HTMLElement;\n  value: string;\n  label: string;\n  id: string;\n  handlers: {\n    click: (event: Event) => void;\n    keydown: (event: KeyboardEvent) => void;\n  };\n}\nconst nextOptionId = (() => {\n  let counter = 0;\n  return () => {\n    counter += 1;\n    return `ease-radio-option-${counter}`;\n  };\n})();\n\nconst nextPanelId = (() => {\n  let counter = 0;\n  return () => {\n    counter += 1;\n    return `ease-radio-content-${counter}`;\n  };\n})();\n\n@Component({\n  tag: 'ease-radio-group',\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: flex;\n    }\n\n    [part=\"option\"] {\n      flex: 0 0 50%;\n      display: block;\n    }\n\n    [part=\"group\"] {\n      display: flex;\n      position: relative;\n      z-index: 0;\n      box-sizing: border-box;\n      width: 100%;\n      min-width: 0;\n      padding: var(--ease-radio-padding, 3px);\n      border-radius: var(--ease-radio-radius, var(--radii-md));\n      background-color: var(--ease-radio-background, var(--color-gray-875));\n      box-shadow: var(\n        --ease-radio-shadow,\n        inset 0 1px 0.25px 0 var(--color-white-4),\n        0 1px 2.5px 0 var(--color-black-8)\n      );\n\n      ::slotted(button) {\n        padding: var(--ease-radio-option-padding, 4px 0);\n        line-height: var(--ease-radio-option-line-height, 16px);\n        margin: 0;\n        border: none;\n        outline: none;\n        background: none;\n        cursor: pointer;\n        font-family: var(--ease-font-family, inherit);\n        font-optical-sizing: auto;\n        font-size: var(--ease-radio-option-font-size, var(--ease-font-size-sm, 12px));\n        font-weight: var(--ease-radio-option-font-weight, 500);\n        color: var(--ease-radio-option-color, var(--color-gray-600));\n        transition: color 0.2s;\n        flex-grow: 1;\n      }\n\n      ::slotted(button:hover),\n      ::slotted(button:focus-visible) {\n        color: var(--color-blue-100);\n      }\n\n      ::slotted(button[data-active=\"true\"]) {\n        color: var(--color-blue-100);\n      }\n    }\n  `,\n  template() {\n    return html`\n      <div part=\"group\">\n        <slot name=\"content\"></slot>\n      </div>\n    `;\n  }\n})\nexport class RadioGroup extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<string | null, RadioGroup>({\n    reflect: true,\n    defaultValue: null,\n    onChange(this: RadioGroup, next, previous) {\n      if (next === previous) {\n        return;\n      }\n      this.updateOptionSelectionState();\n    }\n  })\n  accessor value: string | null = null;\n\n  @Query<HTMLElement>('[part=\"group\"]')\n  accessor groupElement!: HTMLElement | null;\n\n  @Query<HTMLSlotElement>('slot[name=\"content\"]')\n  accessor contentSlot!: HTMLSlotElement | null;\n\n  #options: RadioEntry[] = [];\n  #currentSlot: HTMLSlotElement | null = null;\n  #optionsInitialized = false;\n  #handleSlotChange = (): void => {\n    this.#syncOptions();\n  };\n\n  connectedCallback(): void {\n    this.#ensureSlotListener();\n  }\n\n  disconnectedCallback(): void {\n    this.#removeSlotListener();\n    this.#teardownOptions();\n  }\n\n  afterRender(): void {\n    const panel = this.groupElement;\n\n    if (panel) {\n      if (!panel.id) {\n        panel.id = nextPanelId();\n      }\n      panel.tabIndex = -1;\n      panel.setAttribute('role', 'radiogroup');\n    }\n\n    this.#ensureSlotListener();\n\n    if (!this.#optionsInitialized) {\n      queueMicrotask(() => {\n        this.#syncOptions();\n      });\n    } else {\n      this.updateOptionSelectionState();\n    }\n  }\n\n  #ensureSlotListener(): void {\n    const slot = this.contentSlot;\n\n    if (slot === this.#currentSlot) {\n      return;\n    }\n\n    if (this.#currentSlot) {\n      this.#currentSlot.removeEventListener('slotchange', this.#handleSlotChange);\n    }\n\n    if (slot) {\n      slot.addEventListener('slotchange', this.#handleSlotChange);\n    }\n\n    this.#currentSlot = slot ?? null;\n  }\n\n  #removeSlotListener(): void {\n    if (!this.#currentSlot) {\n      return;\n    }\n\n    this.#currentSlot.removeEventListener('slotchange', this.#handleSlotChange);\n    this.#currentSlot = null;\n  }\n\n  #syncOptions(): void {\n    const assigned = this.contentSlot?.assignedElements({ flatten: true }) ?? [];\n    const elements = assigned.filter((node): node is HTMLElement => node instanceof HTMLElement);\n\n    this.#removeOptionListeners(this.#options);\n\n    const options: RadioEntry[] = [];\n\n    elements.forEach((element) => {\n      if (element.hasAttribute('data-select-ignore') || element.getAttribute('role') === 'separator') {\n        return;\n      }\n\n      const value = this.#resolveOptionValue(element);\n      const label = this.#resolveOptionLabel(element, value);\n      const id = element.id && element.id.trim().length > 0 ? element.id : nextOptionId();\n\n      if (!element.id) {\n        element.id = id;\n      }\n\n      element.setAttribute('role', 'option');\n      element.setAttribute('aria-selected', 'false');\n      element.setAttribute('variant', this.value === value ? 'default' : 'link');\n      element.dataset.active = 'false';\n      element.tabIndex = -1;\n\n      const handlers = {\n        click: (event: Event) => {\n          event.preventDefault();\n          event.stopPropagation();\n          this.#selectOption(value, label, event);\n        },\n        keydown: (event: KeyboardEvent) => {\n          if (event.key === 'Enter' || event.key === ' ') {\n            event.preventDefault();\n            this.#selectOption(value, label, event);\n          }\n        }\n      } as RadioEntry['handlers'];\n\n      element.addEventListener('click', handlers.click, { passive: false });\n      element.addEventListener('keydown', handlers.keydown);\n\n      options.push({ element, value, label, id, handlers });\n    });\n\n    this.#options = options;\n    this.#optionsInitialized = options.length > 0;\n\n    if (this.value === null && options.length > 0) {\n      const preselected = options.find(\n        (option) =>\n          option.element.hasAttribute('selected') ||\n          option.element.dataset.selected === 'true' ||\n          option.element.getAttribute('aria-selected') === 'true'\n      );\n\n      if (preselected) {\n        this.value = preselected.value;\n      }\n    }\n\n    this.updateOptionSelectionState();\n  }\n\n  #teardownOptions(): void {\n    this.#removeOptionListeners(this.#options);\n    this.#options = [];\n    this.#optionsInitialized = false;\n  }\n\n  #removeOptionListeners(options: RadioEntry[]): void {\n    options.forEach((option) => {\n      option.element.removeEventListener('click', option.handlers.click);\n      option.element.removeEventListener('keydown', option.handlers.keydown);\n      option.element.dataset.active = 'false';\n      option.element.setAttribute('aria-selected', 'false');\n      option.element.tabIndex = -1;\n    });\n  }\n\n  updateOptionSelectionState(): void {\n    if (!this.#optionsInitialized) {\n      return;\n    }\n\n    let selectedLabel: string | null = null;\n\n    const options = this.#options;\n\n    options.forEach((option) => {\n      const isSelected = this.value !== null && option.value === this.value;\n      option.element.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n      option.element.dataset.active = isSelected ? 'true' : 'false';\n      option.element.tabIndex = isSelected ? 0 : -1;\n      option.element.setAttribute('variant', isSelected ? 'default' : 'link');\n\n      if (isSelected) {\n        selectedLabel = option.label;\n      }\n    });\n\n    if (!selectedLabel) {\n      const fallback = options[0];\n      if (fallback) {\n        fallback.element.tabIndex = 0;\n      }\n    }\n    const hasValue = Boolean(this.value && selectedLabel);\n    this.toggleAttribute('data-has-value', hasValue);\n  }\n\n  #selectOption(value: string, label: string, originEvent: Event): void {\n    originEvent.preventDefault();\n    originEvent.stopPropagation();\n\n    const previousValue = this.value;\n    this.value = value;\n\n    if (previousValue !== value) {\n      this.#dispatchValueChange(value, label, originEvent);\n    }\n  }\n\n  #resolveOptionValue(element: HTMLElement): string {\n    const explicitValue = element.getAttribute('value') ?? element.getAttribute('data-value') ?? element.dataset.value;\n\n    if (explicitValue && explicitValue.trim().length > 0) {\n      return explicitValue.trim();\n    }\n\n    const text = element.textContent?.trim();\n\n    if (text && text.length > 0) {\n      return text;\n    }\n\n    const fallback = nextOptionId();\n    element.dataset.value = fallback;\n    return fallback;\n  }\n\n  #resolveOptionLabel(element: HTMLElement, fallback: string): string {\n    const explicitLabel = element.getAttribute('data-label') ?? element.getAttribute('aria-label');\n\n    if (explicitLabel && explicitLabel.trim().length > 0) {\n      return explicitLabel.trim();\n    }\n\n    const text = element.textContent?.trim();\n\n    if (text && text.length > 0) {\n      return text;\n    }\n\n    return fallback;\n  }\n\n  #dispatchValueChange(value: string, label: string, event: Event): void {\n    dispatchControlEvent(this, 'change', { value, event });\n\n    this.dispatchEvent(\n      new CustomEvent('value-change', {\n        detail: { value, label, event },\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n}\n","import { html } from 'lit-html';\n\nimport { CONTROL_CHANGE_EVENT, dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-radio-input',\n  shadowMode: 'open',\n  styles: `\n    .radio {\n      display: table;\n      border-radius: var(--ease-radio-input-radius, 12px);\n      position: relative;\n    }\n\n    [part=\"radio\"] {\n      display: table;\n      appearance: none;\n      outline: none;\n      border: none;\n      background: none;\n      margin: 0;\n      padding: 0;\n      border-radius: inherit;\n    }\n\n    [part=\"control\"] {\n      appearance: none;\n      outline: none;\n      border: none;\n      background: none;\n      display: block;\n      cursor: pointer;\n      margin: 0;\n      padding: 0;\n      border-radius: inherit;\n      width: var(--ease-radio-input-size, 24px);\n      height: var(--ease-radio-input-size, 24px);\n    }\n\n    .radio svg {\n      display: block;\n      position: absolute;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      top: 0;\n      pointer-events: none;\n      fill: var(--ease-radio-input-dot-color, var(--color-blue-100));\n      transform: scale(1.01) translateZ(0);\n    }\n\n    [part=\"control\"] {\n      box-shadow: inset 0 0 0 var(--ease-radio-input-border-width, 2px) var(--ease-radio-input-border-color, var(--color-gray-700));\n    }\n\n    .radio svg .top {\n      transform-origin: 12px -12px;\n      transform: translateY(0) scale(1.75, 1) translateZ(0);\n      opacity: 0;\n    }\n\n    .radio svg .dot {\n      transform: translateY(-17px) translateZ(0);\n      opacity: 0;\n    }\n\n    .radio svg .drop {\n      transform: translateY(-14px) translateZ(0);\n      opacity: 0;\n    }\n\n    [part=\"control\"]:checked {\n      box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-size, 6.75px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n    }\n\n    [part=\"control\"]:checked + svg .top {\n      transform: translateY(0px) scale(1.75, 1) translateZ(0);\n      opacity: 1;\n    }\n\n    [part=\"control\"]:checked + svg .dot {\n      transform: translateY(0px) translateZ(0);\n      opacity: 1;\n    }\n\n    [part=\"control\"]:checked + svg .drop {\n      transform: translateY(0px) translateZ(0);\n      opacity: 1;\n    }\n\n    [part=\"control\"].anim-checked {\n      animation: radio-border-expand 0.8s ease-out forwards;\n    }\n\n    [part=\"control\"].anim-checked + svg .top {\n      animation: radio-top 0.8s ease-out 0.2s forwards;\n    }\n\n    [part=\"control\"].anim-checked + svg .dot {\n      animation: radio-dot 0.6s ease-out 0.2s forwards;\n    }\n\n    [part=\"control\"].anim-checked + svg .drop {\n      animation: radio-drop 0.6s ease-out 0.4s forwards;\n    }\n\n    [part=\"control\"].anim-unchecked {\n      animation: radio-border-contract 0.8s ease-out forwards;\n    }\n\n    [part=\"control\"].anim-unchecked + svg .top {\n      animation: radio-top-reverse 0.8s ease-out forwards;\n    }\n\n    [part=\"control\"].anim-unchecked + svg .dot {\n      animation: radio-dot-reverse 0.6s ease-out forwards;\n    }\n\n    [part=\"control\"].anim-unchecked + svg .drop {\n      animation: radio-drop-reverse 0.6s ease-out forwards;\n    }\n\n    @keyframes radio-border-expand {\n      0% {\n        box-shadow: inset 0 0 0 var(--ease-radio-input-border-width, 2px) var(--ease-radio-input-border-color, var(--color-gray-700));\n      }\n      25% {\n        box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-max, 12px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n      }\n      100% {\n        box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-size, 6.75px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n      }\n    }\n\n    @keyframes radio-top {\n      0% {\n        transform: translateY(0) scale(1.75, 1) translateZ(0);\n      }\n      25% {\n        transform: translateY(6px) scale(1, 1.25) translateZ(0);\n      }\n      100% {\n        transform: translateY(0px) scale(1.75, 1) translateZ(0);\n      }\n    }\n\n    @keyframes radio-dot {\n      0% {\n        transform: translateY(-17px) translateZ(0);\n      }\n      50% {\n        transform: translateY(2px) translateZ(0);\n      }\n      100% {\n        transform: translateY(0px) translateZ(0);\n      }\n    }\n\n    @keyframes radio-drop {\n      0% {\n        transform: translateY(-14px) translateZ(0);\n      }\n      100% {\n        transform: translateY(0px) translateZ(0);\n      }\n    }\n\n    @keyframes radio-border-contract {\n      0% {\n        box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-size, 6.75px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n      }\n      75% {\n        box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-max, 12px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n      }\n      100% {\n        box-shadow: inset 0 0 0 var(--ease-radio-input-border-width, 2px) var(--ease-radio-input-border-color, var(--color-gray-700));\n      }\n    }\n\n    @keyframes radio-top-reverse {\n      0% {\n        transform: translateY(0px) scale(1.75, 1) translateZ(0);\n        opacity: 1;\n      }\n      75% {\n        transform: translateY(6px) scale(1, 1.25) translateZ(0);\n        opacity: 1;\n      }\n      100% {\n        transform: translateY(0) scale(1.75, 1) translateZ(0);\n        opacity: 0;\n      }\n    }\n\n    @keyframes radio-dot-reverse {\n      0% {\n        transform: translateY(0px) translateZ(0);\n        opacity: 1;\n      }\n      50% {\n        transform: translateY(2px) translateZ(0);\n        opacity: 1;\n      }\n      100% {\n        transform: translateY(-17px) translateZ(0);\n        opacity: 0;\n      }\n    }\n\n    @keyframes radio-drop-reverse {\n      0% {\n        transform: translateY(0px) translateZ(0);\n        opacity: 1;\n      }\n      100% {\n        transform: translateY(-14px) translateZ(0);\n        opacity: 0;\n      }\n    }\n  `,\n  template(this: RadioInput) {\n    return html`\n      <button part=\"radio\" type=\"button\" role=\"radio\" aria-checked=${this.checked} ?disabled=${this.disabled}>\n        <div class=\"radio\">\n          <input part=\"control\" name=${this.name} value=${this.value} ?checked=${this.checked} ?disabled=${this.disabled} type=\"radio\" />\n          <svg viewBox=\"0 0 24 24\" filter=\"url(#${this.filterId})\">\n              <circle class=\"top\" cx=\"12\" cy=\"-12\" r=\"8\" />\n              <circle class=\"dot\" cx=\"12\" cy=\"12\" r=\"5\" />\n              <circle class=\"drop\" cx=\"12\" cy=\"12\" r=\"2\" />\n          </svg>\n        </div>\n\n        <svg style=\"display: none;\">\n          <defs>\n            <filter id=\"${this.filterId}\">\n              <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"1.25\" result=\"blur\" />\n              <feColorMatrix in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 20 -9\" result=\"gooey\" />\n              <feBlend in=\"SourceGraphic\" in2=\"gooey\" />\n            </filter>\n          </defs>\n        </svg>\n      </button>\n    `;\n  }\n})\nexport class RadioInput extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<boolean, RadioInput>({\n    type: Boolean,\n    reflect: true,\n    onChange(this: RadioInput, next: boolean) {\n      if (next && this.name) {\n        const form = this.closest('form');\n        const root = form ?? (this.getRootNode() as Document | ShadowRoot);\n        const others = Array.from(root.querySelectorAll(`ease-radio-input[name=\"${this.name}\"]`)) as RadioInput[];\n\n        others.forEach((other) => {\n          if (other !== this && other.checked) {\n            other.checked = false;\n          }\n        });\n      }\n    }\n  })\n  accessor checked!: boolean;\n\n  @Prop<string | null>({ reflect: true })\n  accessor name!: string | null;\n\n  @Prop<string | null>({ reflect: true })\n  accessor value!: string | null;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled!: boolean;\n\n  @Query<HTMLButtonElement>('button')\n  accessor control!: HTMLButtonElement | null;\n\n  private _prevChecked?: boolean;\n  private _firstRender = true;\n\n  filterId: string = `goo-${crypto.randomUUID()}`;\n\n  connectedCallback(): void {\n    this._prevChecked = this.checked;\n  }\n\n  afterRender(): void {\n    if (!this.control) {\n      return;\n    }\n\n    if (this._firstRender) {\n      this._firstRender = false;\n      this._prevChecked = this.checked;\n    }\n\n    const changed = typeof this._prevChecked !== 'undefined' && this.checked !== this._prevChecked;\n    if (changed) {\n      this._triggerAnimation(this.checked);\n      this._prevChecked = this.checked;\n    }\n\n    const control = this.control;\n    control.setAttribute('aria-checked', this.checked ? 'true' : 'false');\n    control.disabled = Boolean(this.disabled);\n    setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n  }\n\n  private _triggerAnimation(checked: boolean): void {\n    const input = this.shadowRoot?.querySelector('[part=\"control\"]') as HTMLInputElement;\n    const svg = this.shadowRoot?.querySelector('svg[viewBox=\"0 0 24 24\"]');\n    if (!input || !svg) {\n      return;\n    }\n\n    input.classList.remove('anim-checked', 'anim-unchecked');\n    svg.classList.remove('anim-checked', 'anim-unchecked');\n\n    const animClass = checked ? 'anim-checked' : 'anim-unchecked';\n    input.classList.add(animClass);\n    svg.classList.add(animClass);\n\n    const duration = 800; // Longest animation duration in ms\n\n    setTimeout(() => {\n      input.classList.remove(animClass);\n      svg.classList.remove(animClass);\n    }, duration);\n  }\n\n  @Listen<RadioInput, MouseEvent, HTMLButtonElement>('click', { selector: 'button' })\n  handleClick(event: MouseEvent): void {\n    if (this.disabled || this.checked) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      return;\n    }\n\n    this.checked = true;\n\n    const groupName = this.closest('ease-radio-group')?.getAttribute('name') ?? undefined;\n    const name = this.getAttribute('name') ?? groupName ?? undefined;\n    const detail = { name, value: this.checked, event };\n\n    dispatchControlEvent(this, 'radio', detail);\n    dispatchControlEvent(this, 'change', detail);\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n}\n","import '../input';\n\nimport { html } from 'lit-html';\n\nimport {\n  CONTROL_CHANGE_EVENT,\n  type ControlEventDetail,\n  coerceNumber,\n  dispatchControlEvent,\n  setBooleanAttribute\n} from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-slider',\n  styles: `\n    :host {\n      display: contents;\n      --track-color: var(--ease-slider-track-color, var(--color-gray-825));\n      --active-track-color: var(--ease-slider-active-track-color, var(--color-blue-1100));\n      --thumb-color: var(--ease-slider-thumb-color, var(--color-blue-900));\n      --thumb-size: var(--ease-slider-thumb-size, 18px);\n      --track-height: var(--ease-slider-track-height, 4px);\n    }\n\n    [part=\"container\"] {\n      flex: 1;\n      display: grid;\n      grid-template-columns: auto var(--ease-slider-value-width, 36px);\n      grid-gap: var(--ease-slider-gap, 12px);\n    }\n\n    ease-input[part=\"value\"] {\n      --ease-input-padding: 8px 0;\n      min-width: 0;\n      text-align: center;\n      width: var(--ease-slider-value-width, 36px);\n      font-variant-numeric: tabular-nums;\n      font-feature-settings: \"tnum\";\n      font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n    }\n\n    input[part=\"control\"][type=\"range\"] {\n      height: var(--ease-slider-height, 30px);\n      margin: 0;\n      padding: 0;\n      appearance: none;\n      background-color: transparent;\n      width: 100%;\n      cursor: pointer;\n    }\n\n    input[part=\"control\"][type=\"range\"]::-webkit-slider-runnable-track {\n      width: 100%;\n      height: var(--track-height);\n      background: linear-gradient(to right, var(--active-track-color) var(--progress, 0%), var(--track-color) var(--progress, 0%));\n      border-radius: calc(var(--track-height) / 2);\n      border: none;\n    }\n\n    input[part=\"control\"][type=\"range\"]::-moz-range-track {\n      width: 100%;\n      height: var(--track-height);\n      background: var(--track-color);\n      border-radius: calc(var(--track-height) / 2);\n      border: none;\n    }\n\n    input[part=\"control\"][type=\"range\"]::-moz-range-progress {\n      background-color: var(--active-track-color);\n      height: var(--track-height);\n      border-radius: calc(var(--track-height) / 2);\n    }\n\n    input[part=\"control\"][type=\"range\"]::-webkit-slider-thumb {\n      appearance: none;\n      height: var(--thumb-size);\n      width: var(--thumb-size);\n      border-radius: 50%;\n      margin-top: calc((var(--track-height) - var(--thumb-size)) / 2);\n      box-shadow: inset 0 0 0 .75px var(--color-white-15), inset 0 0 5px var(--color-white-20);\n      transition: transform 0.2s;\n      position: relative;\n      background: radial-gradient(circle at center, var(--color-blue-100-50) 4.5px, var(--color-white-0) 4.5px),  var(--thumb-color) no-repeat center center;\n    }\n    \n    input[part=\"control\"][type=\"range\"]:hover::-webkit-slider-thumb {\n        transform: scale(1.075);\n    }\n    \n    input[part=\"control\"][type=\"range\"]:active::-webkit-slider-thumb {\n        transform: scale(.975);\n    }\n\n    input[part=\"control\"][type=\"range\"]::-moz-range-thumb {\n      height: var(--thumb-size);\n      width: var(--thumb-size);\n      border-radius: 50%;\n      background: radial-gradient(circle at center, var(--color-blue-100-50) 4.5px, var(--color-white-0) 4.5px),  var(--thumb-color) no-repeat center center;\n      border: none;\n      box-shadow: inset 0 0 0 .75px var(--color-white-15), inset 0 0 5px var(--color-white-20);\n      transition: transform 0.2s;\n      position: relative;\n    }\n\n    input[part=\"control\"][type=\"range\"]:hover::-moz-range-thumb {\n        transform: scale(1.075);\n    }\n\n    input[part=\"control\"][type=\"range\"]:active::-moz-range-thumb {\n        transform: scale(.975);\n    }\n  `,\n  template(this: Slider) {\n    return html`\n      <div part=\"container\">\n        <input\n          part=\"control\"\n          type=\"range\"\n          .min=${this.min ?? 0}\n          .max=${this.max ?? 100}\n          .step=${this.step ?? 1}\n          .value=${String(this.value ?? 0)}\n          ?disabled=${this.disabled}\n          @input=${this.handleRangeInput}\n          @change=${this.handleRangeChange}\n          ?aria-disabled=${this.disabled}\n        />\n        \n        <ease-input\n          part=\"value\"\n          @input=${this.handleValueInput}\n          @change=${this.handleValueChange}\n          type=\"number\"\n          placeholder=\"-\"\n          .disabled=${Boolean(this.disabled)}\n          .value=${this.value === null || this.value === undefined ? '' : String(this.value)}\n        />\n      </div>\n    `;\n  }\n})\nexport class Slider extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<number | null>({ type: Number, reflect: true })\n  accessor value!: number | null;\n\n  @Prop<number | null>({ type: Number, reflect: true })\n  accessor min!: number | null;\n\n  @Prop<number | null>({ type: Number, reflect: true })\n  accessor max!: number | null;\n\n  @Prop<number | null>({ type: Number, reflect: true })\n  accessor step!: number | null;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled!: boolean;\n\n  @Query<HTMLInputElement>('input')\n  accessor control!: HTMLInputElement | null;\n\n  @Query<HTMLElement>('ease-input')\n  accessor valueControl!: (HTMLElement & { value?: string | null }) | null;\n\n  afterRender(): void {\n    if (!this.control) {\n      return;\n    }\n\n    const control = this.control;\n    const value = this.value ?? 0;\n\n    control.value = String(value);\n    control.min = this.min === null || this.min === undefined ? '' : String(this.min);\n    control.max = this.max === null || this.max === undefined ? '' : String(this.max);\n    control.step = this.step === null || this.step === undefined ? '' : String(this.step);\n    control.type = 'range';\n    control.setAttribute('part', 'control');\n    control.disabled = Boolean(this.disabled);\n\n    setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n    this.updateProgress();\n  }\n\n  @Listen<Slider, Event, HTMLInputElement>('input', { selector: 'input[type=\"range\"]' })\n  handleRangeInput(event: Event, target?: HTMLInputElement | null): void {\n    if (!target) {\n      return;\n    }\n\n    const numericValue = coerceNumber(target.value);\n    this.value = numericValue;\n    this.updateProgress();\n\n    if (this.valueControl) {\n      this.valueControl.value = numericValue === null ? '' : String(numericValue);\n    }\n\n    const name = this.getAttribute('name') ?? undefined;\n    const detail = { name, value: this.value, event };\n\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n\n  @Listen<Slider, Event, HTMLInputElement>('change', { selector: 'input[type=\"range\"]' })\n  handleRangeChange(event: Event, target?: HTMLInputElement | null): void {\n    if (target) {\n      const numericValue = coerceNumber(target.value);\n      this.value = numericValue;\n      this.updateProgress();\n\n      if (this.valueControl) {\n        this.valueControl.value = numericValue === null ? '' : String(numericValue);\n      }\n    }\n\n    const name = this.getAttribute('name') ?? undefined;\n    const detail = { name, value: this.value, event };\n\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n\n  @Listen<Slider, CustomEvent<ControlEventDetail<string>>, HTMLElement>('input', {\n    selector: 'ease-input',\n    when: (event) => event instanceof CustomEvent && typeof (event as CustomEvent).detail?.value === 'string'\n  })\n  handleValueInput(event: CustomEvent<ControlEventDetail<string>>): void {\n    const rawValue = event.detail?.value ?? '';\n    const numericValue = coerceNumber(rawValue);\n    this.value = numericValue;\n    this.updateProgress();\n\n    if (this.control) {\n      this.control.value = String(numericValue ?? 0);\n    }\n\n    const name = this.getAttribute('name') ?? undefined;\n    const controlEvent = event.detail?.event ?? event;\n    const detail = { name, value: this.value, event: controlEvent };\n\n    dispatchControlEvent(this, 'input', detail);\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n\n  @Listen<Slider, CustomEvent<ControlEventDetail<string>>, HTMLElement>('change', {\n    selector: 'ease-input',\n    when: (event) => event instanceof CustomEvent && typeof (event as CustomEvent).detail?.value === 'string'\n  })\n  handleValueChange(event: CustomEvent<ControlEventDetail<string>>): void {\n    const rawValue = event.detail?.value ?? '';\n    const numericValue = coerceNumber(rawValue);\n    this.value = numericValue;\n    this.updateProgress();\n\n    if (this.control) {\n      this.control.value = String(numericValue ?? 0);\n    }\n\n    const name = this.getAttribute('name') ?? undefined;\n    const controlEvent = event.detail?.event ?? event;\n    const detail = { name, value: this.value, event: controlEvent };\n\n    dispatchControlEvent(this, 'change', detail);\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n\n  updateProgress(): void {\n    if (!this.control) {\n      return;\n    }\n\n    // Ensure numeric coercion for proper calculation\n    const value = Number(this.value) || 0;\n    const min = Number(this.min) || 0;\n    const max = Number(this.max) || 100;\n    const percent = max === min ? 0 : ((value - min) / (max - min)) * 100;\n    this.control.style.setProperty('--progress', `${Math.max(0, Math.min(100, percent))}%`);\n  }\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { CONTROL_CHANGE_EVENT, type ControlEventDetail, dispatchControlEvent } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\ntype ControlElement = Element & {\n  value?: unknown;\n  checked?: unknown;\n  name?: string;\n};\n\ntype StateChangeCallback<T = unknown> = (value: T, name: string) => void;\ntype StateSubscription = { unsubscribe: () => void };\n\n/**\n * Event detail for state change events\n */\nexport interface StateChangeEventDetail {\n  /** The name of the control that changed */\n  name: string;\n  /** The new value */\n  value: unknown;\n  /** The complete state object */\n  state: Record<string, unknown>;\n  /** The original event */\n  event: Event;\n}\n\nconst readControlValue = (element: ControlElement): unknown => {\n  if (typeof element.value === 'string' || typeof element.value === 'number') {\n    return element.value;\n  }\n\n  if (typeof element.checked === 'boolean') {\n    return element.checked;\n  }\n\n  if ('getAttribute' in element) {\n    const attr = (element as Element).getAttribute('value');\n    if (attr !== null) {\n      return attr;\n    }\n  }\n\n  return element.textContent?.trim() ?? null;\n};\n\nconst getControlName = (element: ControlElement): string | null => {\n  if (typeof element.name === 'string' && element.name) {\n    return element.name;\n  }\n  return element.getAttribute?.('name') ?? null;\n};\n\n/**\n * State aggregator component - collects and manages state from child controls.\n *\n * This component provides state management without any visual styling.\n * Use it standalone or wrap it with `<ease-panel>` for a styled container.\n *\n * @tag ease-state\n *\n * @slot - Default slot for controls\n *\n * @fires state-change - Fired when any control value changes\n *\n * @example\n * ```html\n * <!-- Standalone usage (no panel) -->\n * <ease-state>\n *   <ease-field label=\"Duration\">\n *     <ease-slider name=\"duration\" value=\"1\" min=\"0\" max=\"5\"></ease-slider>\n *   </ease-field>\n *   <ease-field label=\"Loop\">\n *     <ease-toggle name=\"loop\"></ease-toggle>\n *   </ease-field>\n * </ease-state>\n *\n * <!-- With panel wrapper -->\n * <ease-panel>\n *   <span slot=\"headline\">Animation Controls</span>\n *   <ease-state>\n *     <ease-field label=\"Duration\">\n *       <ease-slider name=\"duration\" value=\"1\" min=\"0\" max=\"5\"></ease-slider>\n *     </ease-field>\n *   </ease-state>\n * </ease-panel>\n * ```\n */\n@Component({\n  tag: 'ease-state',\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: contents;\n    }\n\n    [part=\"container\"] {\n      display: grid;\n      grid-gap: var(--ease-panel-gap);\n      box-sizing: border-box;\n      width: 100%;\n    }\n  `\n})\nexport class State extends HTMLElement {\n  declare requestRender: () => void;\n\n  #controls: Map<string, ControlElement> = new Map();\n  #state: Record<string, unknown> = {};\n  #initialState: Record<string, unknown> = {};\n  #subscribers: Map<string | '*', Set<StateChangeCallback>> = new Map();\n\n  @Prop<string | null>({ reflect: true })\n  accessor value!: string | null;\n\n  @Query<HTMLSlotElement>('slot')\n  accessor defaultSlot!: HTMLSlotElement | null;\n\n  /**\n   * Get the current state object with all control values\n   */\n  get state(): Readonly<Record<string, unknown>> {\n    return { ...this.#state };\n  }\n\n  /**\n   * Get a specific control value by name\n   * @param name - The control name\n   * @returns The control value or undefined\n   */\n  get(name: string): unknown {\n    return this.#state[name];\n  }\n\n  /**\n   * Set a control value programmatically\n   * @param name - The control name\n   * @param value - The new value\n   */\n  set(name: string, value: unknown): void {\n    const control = this.#controls.get(name);\n    if (control) {\n      // Update the control element\n      if ('value' in control) {\n        (control as { value: unknown }).value = value;\n      } else if (typeof value === 'boolean' && 'checked' in control) {\n        (control as { checked: boolean }).checked = value;\n      }\n    }\n\n    this.#updateState(name, value, new Event('programmatic'));\n  }\n\n  /**\n   * Subscribe to state changes\n   * @param nameOrCallback - Control name to watch, '*' for all, or callback for all changes\n   * @param callback - Callback when using name filter\n   * @returns Subscription with unsubscribe method\n   */\n  subscribe(callback: StateChangeCallback): StateSubscription;\n  subscribe(name: string, callback: StateChangeCallback): StateSubscription;\n  subscribe(nameOrCallback: string | StateChangeCallback, callback?: StateChangeCallback): StateSubscription {\n    let name: string;\n    let cb: StateChangeCallback;\n\n    if (typeof nameOrCallback === 'function') {\n      name = '*';\n      cb = nameOrCallback;\n    } else {\n      name = nameOrCallback;\n      if (!callback) {\n        throw new Error('[ease-state] subscribe(name, callback) requires a callback');\n      }\n      cb = callback;\n    }\n\n    if (!this.#subscribers.has(name)) {\n      this.#subscribers.set(name, new Set());\n    }\n    this.#subscribers.get(name)?.add(cb);\n\n    return {\n      unsubscribe: () => {\n        this.#subscribers.get(name)?.delete(cb);\n      }\n    };\n  }\n\n  /**\n   * Reset all controls to their initial values\n   */\n  reset(): void {\n    for (const [name, value] of Object.entries(this.#initialState)) {\n      this.set(name, value);\n    }\n  }\n\n  connectedCallback(): void {\n    this.#attach();\n    this.defaultSlot?.addEventListener('slotchange', this.#handleSlotChange);\n  }\n\n  disconnectedCallback(): void {\n    this.#detach();\n    this.defaultSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n  }\n\n  render(): TemplateResult {\n    return html`\n      <div part=\"container\">\n        <slot></slot>\n      </div>\n    `;\n  }\n\n  @Listen<State, CustomEvent<ControlEventDetail>>('input', { target: (host) => host })\n  handleInternalInput(event: CustomEvent<ControlEventDetail>): void {\n    this.#handleControlEvent(event);\n  }\n\n  @Listen<State, CustomEvent<ControlEventDetail>>('change', { target: (host) => host })\n  handleInternalChange(event: CustomEvent<ControlEventDetail>): void {\n    this.#handleControlEvent(event);\n  }\n\n  @Listen<State, CustomEvent<ControlEventDetail>>(CONTROL_CHANGE_EVENT, { target: (host) => host })\n  handleControlChange(event: CustomEvent<ControlEventDetail>): void {\n    this.#handleControlEvent(event);\n  }\n\n  #handleControlEvent(event: Event | CustomEvent<ControlEventDetail>): void {\n    if ('detail' in event && event.detail?.name) {\n      this.#updateState(event.detail.name, event.detail.value, event);\n      return;\n    }\n\n    if (!(event.target instanceof Element)) {\n      return;\n    }\n\n    const control = event.target as ControlElement;\n    const name = getControlName(control);\n\n    if (!name || !this.#controls.has(name)) {\n      return;\n    }\n\n    const value = readControlValue(control);\n    this.#updateState(name, value, event);\n  }\n\n  #handleSlotChange = (): void => {\n    this.#detach();\n    this.#attach();\n  };\n\n  #attach(): void {\n    const slot = this.defaultSlot;\n    if (!slot) {\n      return;\n    }\n\n    const findControls = (el: Element): ControlElement[] => {\n      const controls: ControlElement[] = [];\n      const name = getControlName(el as ControlElement);\n\n      if (name) {\n        controls.push(el as ControlElement);\n      }\n\n      if (el.shadowRoot) {\n        for (const child of el.shadowRoot.querySelectorAll('[name]')) {\n          const childName = getControlName(child as ControlElement);\n          if (childName) {\n            controls.push(child as ControlElement);\n          }\n        }\n      }\n\n      for (const child of el.querySelectorAll('[name]')) {\n        const childName = getControlName(child as ControlElement);\n        if (childName) {\n          controls.push(child as ControlElement);\n        }\n      }\n\n      return controls;\n    };\n\n    this.#controls.clear();\n    this.#state = {};\n\n    const elements = slot.assignedElements({ flatten: true });\n\n    for (const element of elements) {\n      const controls = findControls(element);\n      for (const control of controls) {\n        const name = getControlName(control);\n        if (name) {\n          this.#controls.set(name, control);\n          const value = readControlValue(control);\n          this.#state[name] = value;\n          this.#initialState[name] = value;\n        }\n      }\n    }\n\n    const first = this.#controls.values().next().value;\n    if (first) {\n      const name = getControlName(first);\n      this.value = name && this.#state[name] != null ? String(this.#state[name]) : null;\n    }\n  }\n\n  #detach(): void {\n    this.#controls.clear();\n  }\n\n  #updateState(name: string, value: unknown, event: Event): void {\n    const prevValue = this.#state[name];\n    if (prevValue === value) {\n      return;\n    }\n\n    this.#state[name] = value;\n\n    this.value = String(value);\n\n    for (const cb of this.#subscribers.get(name) ?? []) {\n      cb(value, name);\n    }\n    for (const cb of this.#subscribers.get('*') ?? []) {\n      cb(value, name);\n    }\n\n    dispatchControlEvent(this, 'state-change', {\n      name,\n      value,\n      state: this.state,\n      event\n    } as StateChangeEventDetail & { event: Event });\n  }\n}\n","import { html } from 'lit-html';\n\nimport { CONTROL_CHANGE_EVENT, dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-toggle',\n  styles: `\n    :host {\n      display: contents;\n    }\n\n    [part=\"control\"] {\n      display: block;\n      border-radius: var(--ease-toggle-radius, 10px);\n      padding: var(--ease-toggle-padding, 4px);\n      margin: 0;\n      border: none;\n      outline: none;\n      appearance: none;\n      cursor: pointer;\n      background-color: var(--ease-toggle-on-background, var(--color-blue-900));\n      transition: box-shadow 0.2s, background-color 0.2s;\n    }\n\n    [part=\"control\"] svg {\n      width: var(--ease-toggle-width, 26px);\n      height: var(--ease-toggle-height, 12px);\n      display: block;\n      fill: none;\n      overflow: visible;\n\n      path {\n        transition: scale 0.2s, translate 0.2s, opacity 0.2s;\n        stroke: var(--color-white);\n        fill: var(--color-white-80);\n        stroke-width: 1.5;\n      }\n\n      [part=\"default\"] {\n        transform-origin: 6px 6px;\n      }\n\n      [part=\"active\"] {\n        transform-origin: 23px 6px;\n      }\n\n    }\n\n    :host([disabled]) [part=\"control\"] {\n      cursor: default;\n      opacity: 0.75;\n    }\n\n    :host([checked]) [part=\"control\"] {\n      box-shadow: inset 0 0 0 1px var(--color-white-15), inset 0 1px 0 0 var(--color-white-20), inset 0 4px 6px 0 var(--ease-toggle-shadow, var(--color-white-12));\n\n      &:hover {\n        --ease-toggle-shadow: var(--color-white-30);\n      }\n\n      svg {\n        [part=\"default\"] {\n          scale: .25;\n          translate: 10px 0;\n          opacity: 0;\n        }\n\n        [part=\"active\"] {\n          scale: 1;\n          translate: 0 0;\n        }\n      }\n    }\n\n    :host(:not([checked])) [part=\"control\"] {\n      background-color: var(--ease-toggle-off-background, var(--color-gray-800));\n      box-shadow: inset 0 0 0 1px var(--color-white-10), inset 0 1px 0 0 var(--color-white-10), inset 0 4px 6px 0 var(--ease-toggle-shadow, var(--color-white-6));\n\n      &:hover {\n        --ease-toggle-shadow: var(--color-white-12);\n      }\n\n       svg {\n        [part=\"default\"] {\n          scale: 1;\n          translate: 0 0;\n        }\n\n        [part=\"active\"] {\n          scale: .25;\n          translate: -10px 0;\n          opacity: 0;\n        }\n      }\n    }\n  `,\n  template(this: Toggle) {\n    return html`\n      <button part=\"control\" type=\"button\" aria-pressed=\"false\">\n        <svg viewBox=\"0 0 26 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" filter=\"url(#${this.filterId})\">\n          <path part=\"default\" d=\"M0 6C0 2.68629 2.68629 0 6 0V0C9.31371 0 12 2.68629 12 6V6C12 9.31371 9.31371 12 6 12V12C2.68629 12 0 9.31371 0 6V6Z\" />\n          <path part=\"active\" d=\"M14 6C14 2.68629 16.6863 0 20 0V0C23.3137 0 26 2.68629 26 6V6C26 9.31371 23.3137 12 20 12V12C16.6863 12 14 9.31371 14 6V6Z\" />\n        </svg>\n\n        <svg style=\"display: none;\">\n          <defs>\n            <filter id=\"${this.filterId}\">\n              <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"8\" result=\"blur\" />\n              <feColorMatrix in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 20 -9\" result=\"gooey\" />\n              <feBlend in=\"SourceGraphic\" in2=\"gooey\" />\n            </filter>\n          </defs>\n        </svg>\n      </button>\n    `;\n  }\n})\nexport class Toggle extends HTMLElement {\n  declare requestRender: () => void;\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor checked!: boolean;\n\n  @Prop<boolean>({ type: Boolean, reflect: true })\n  accessor disabled!: boolean;\n\n  @Query<HTMLButtonElement>('button')\n  accessor control!: HTMLButtonElement | null;\n\n  filterId: string = `filter-${crypto.randomUUID()}`;\n\n  afterRender(): void {\n    if (!this.control) {\n      return;\n    }\n\n    const control = this.control;\n    control.setAttribute('aria-pressed', this.checked ? 'true' : 'false');\n    control.disabled = Boolean(this.disabled);\n    setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n  }\n\n  @Listen<Toggle, MouseEvent, HTMLButtonElement>('click', { selector: 'button' })\n  handleClick(event: MouseEvent): void {\n    if (this.disabled) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      return;\n    }\n\n    this.checked = !this.checked;\n\n    const name = this.getAttribute('name') ?? undefined;\n    const detail = { name, value: this.checked, event };\n\n    dispatchControlEvent(this, 'toggle', detail);\n    dispatchControlEvent(this, 'change', detail);\n    dispatchControlEvent(this, CONTROL_CHANGE_EVENT, detail);\n  }\n}\n","import type { Placement } from '~/elements/popover';\nimport '../popover';\n\nimport { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { OutsideClick, requestOutsideClickUpdate } from '~/decorators/OutsideClick';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n  tag: 'ease-tooltip',\n  shadowMode: 'open',\n  styles: `\n    :host {\n      display: inline-block;\n      position: relative;\n    }\n\n    ease-popover::part(content) {\n      inset: auto;\n    }\n\n    [data-tooltip-content] {\n      background-color: var(--ease-tooltip-background, var(--color-gray-400));\n      color: var(--ease-tooltip-color, var(--color-gray-900));\n      padding: var(--ease-tooltip-padding, 4px 8px);\n      border-radius: var(--ease-tooltip-radius, 4px);\n      font-family: var(--ease-font-family, inherit);\n      font-size: var(--ease-tooltip-font-size, 10px);\n      font-weight: var(--ease-tooltip-font-weight, 500);\n      max-width: var(--ease-tooltip-max-width, 220px);\n      box-shadow: var(--ease-tooltip-shadow, 0 2px 8px rgba(0, 0, 0, 0.2));\n      display: none;\n    }\n\n    :host([open]) [data-tooltip-content] {\n      display: block;\n    }\n  `\n})\nexport class Tooltip extends HTMLElement {\n  #hoverTimer: number | null = null;\n\n  #trigger: HTMLElement | null = null;\n  #content: HTMLElement | null = null;\n\n  declare requestRender: () => void;\n\n  @Prop<boolean>({\n    type: Boolean,\n    reflect: true,\n    onChange(next, previous) {\n      (this as Tooltip)._handleOpenChange(next, previous);\n    }\n  })\n  accessor open = false;\n\n  @Prop<number>({ type: Number, reflect: true, defaultValue: 300 })\n  accessor delay = 300;\n\n  @Prop<Placement>({ reflect: true, defaultValue: 'top-center' })\n  accessor placement: Placement = 'top-center';\n\n  @Query<HTMLElement>('[slot=\"trigger\"]')\n  accessor triggerElement!: HTMLElement | null;\n\n  @Query<HTMLElement>('[data-tooltip-content]')\n  accessor contentElement!: HTMLElement | null;\n\n  disconnectedCallback(): void {\n    this.#clearTimer();\n    if (this.#trigger) {\n      this.#trigger.removeEventListener('mouseenter', this.#handleEnter);\n      this.#trigger.removeEventListener('mouseleave', this.#handleLeave);\n      this.#trigger.removeEventListener('focusin', this.#handleFocusIn);\n      this.#trigger.removeEventListener('focusout', this.#handleFocusOut);\n      this.#trigger = null;\n    }\n\n    if (this.#content) {\n      this.#content.removeEventListener('mouseenter', this.#handleEnter);\n      this.#content.removeEventListener('mouseleave', this.#handleLeave);\n      this.#content = null;\n    }\n  }\n\n  afterRender(): void {\n    this.#updateListeners();\n    const content = this.contentElement;\n    const isVisible = this.open;\n\n    if (content) {\n      content.setAttribute('role', 'tooltip');\n      content.setAttribute('aria-hidden', isVisible ? 'false' : 'true');\n      content.dataset.open = isVisible ? 'true' : 'false';\n      content.hidden = !isVisible;\n    }\n  }\n\n  render(): TemplateResult {\n    return html`\n      <ease-popover .placement=${this.placement} ?open=${this.open}>\n        <slot name=\"trigger\" slot=\"trigger\"></slot>\n        <div\n          data-tooltip-content\n          role=\"tooltip\"\n          data-open=${this.open ? 'true' : 'false'}\n          ?hidden=${!this.open}\n        >\n          <slot></slot>\n        </div>\n      </ease-popover>\n    `;\n  }\n\n  _handleOpenChange(next: boolean, previous: boolean): void {\n    if (next === previous) {\n      return;\n    }\n\n    if (!next) {\n      this.#clearTimer();\n    }\n\n    requestOutsideClickUpdate(this);\n  }\n\n  @OutsideClick<Tooltip>({\n    content: (host) => host.contentElement,\n    triggers: (host) => [host.triggerElement],\n    disabled: (host) => !host.open\n  })\n  handleOutsideDismiss(): void {\n    if (!this.open) {\n      return;\n    }\n\n    this.#clearTimer();\n    this.open = false;\n  }\n\n  #clearTimer(): void {\n    if (this.#hoverTimer !== null) {\n      window.clearTimeout(this.#hoverTimer);\n      this.#hoverTimer = null;\n    }\n  }\n\n  #startTimer(callback: () => void): void {\n    this.#clearTimer();\n    const wait = this.delay ?? 0;\n\n    if (wait > 0) {\n      this.#hoverTimer = window.setTimeout(callback, wait);\n    } else {\n      callback();\n    }\n  }\n\n  #handleEnter = (): void => {\n    this.#startTimer(() => {\n      this.open = true;\n    });\n  };\n\n  #handleLeave = (): void => {\n    this.#clearTimer();\n    this.open = false;\n  };\n\n  #handleFocusIn = (): void => {\n    this.#clearTimer();\n    this.open = true;\n  };\n\n  #handleFocusOut = (): void => {\n    this.#clearTimer();\n    this.open = false;\n  };\n\n  #updateListeners(): void {\n    const trigger = this.triggerElement;\n    const content = this.contentElement ?? null;\n\n    if (trigger !== this.#trigger) {\n      if (this.#trigger) {\n        this.#trigger.removeEventListener('mouseenter', this.#handleEnter);\n        this.#trigger.removeEventListener('mouseleave', this.#handleLeave);\n        this.#trigger.removeEventListener('focusin', this.#handleFocusIn);\n        this.#trigger.removeEventListener('focusout', this.#handleFocusOut);\n      }\n      if (trigger) {\n        trigger.addEventListener('mouseenter', this.#handleEnter);\n        trigger.addEventListener('mouseleave', this.#handleLeave);\n        trigger.addEventListener('focusin', this.#handleFocusIn);\n        trigger.addEventListener('focusout', this.#handleFocusOut);\n      }\n      this.#trigger = trigger;\n    }\n\n    if (content !== this.#content) {\n      if (this.#content) {\n        this.#content.removeEventListener('mouseenter', this.#handleEnter);\n        this.#content.removeEventListener('mouseleave', this.#handleLeave);\n      }\n      if (content) {\n        content.addEventListener('mouseenter', this.#handleEnter);\n        content.addEventListener('mouseleave', this.#handleLeave);\n      }\n      this.#content = content ?? null;\n    }\n  }\n}\n","/**\n * Style injection utilities for runtime CSS application.\n */\n\nconst STYLE_ID_PREFIX = 'ease-webkit-';\n\n/**\n * Check if we're in a browser environment.\n */\nexport const isBrowser = (): boolean => typeof document !== 'undefined' && typeof window !== 'undefined';\n\n/**\n * Inject a style tag with the given CSS content.\n */\nexport function injectStyle(id: string, css: string, nonce?: string): HTMLStyleElement | null {\n  if (!isBrowser()) {\n    return null;\n  }\n\n  const fullId = STYLE_ID_PREFIX + id;\n\n  // Check if already injected\n  let style = document.getElementById(fullId) as HTMLStyleElement | null;\n  if (style) {\n    // Update content if different\n    if (style.textContent !== css) {\n      style.textContent = css;\n    }\n    return style;\n  }\n\n  // Create new style element\n  style = document.createElement('style');\n  style.id = fullId;\n  style.textContent = css;\n\n  if (nonce) {\n    style.nonce = nonce;\n  }\n\n  document.head.appendChild(style);\n  return style;\n}\n\n/**\n * Remove an injected style tag.\n */\nexport function removeStyle(id: string): void {\n  if (!isBrowser()) {\n    return;\n  }\n\n  const fullId = STYLE_ID_PREFIX + id;\n  const style = document.getElementById(fullId);\n  if (style) {\n    style.remove();\n  }\n}\n\n/**\n * Check if a style is already injected.\n */\nexport function hasStyle(id: string): boolean {\n  if (!isBrowser()) {\n    return false;\n  }\n\n  const fullId = STYLE_ID_PREFIX + id;\n  return document.getElementById(fullId) !== null;\n}\n\n// --------------------------\n// Preset styles\n// --------------------------\n\n/**\n * Minimal reset styles (box-sizing, etc.)\n */\nexport const RESET_CSS = `\n@layer ease-reset {\n  *,\n  *::after,\n  *::before {\n    box-sizing: border-box;\n    transition-timing-function: cubic-bezier(0.25, 0, 0.5, 1);\n  }\n\n  :where(html) {\n    color-scheme: light dark;\n    hanging-punctuation: first allow-end last;\n    interpolate-size: allow-keywords;\n    scroll-behavior: smooth;\n    scrollbar-gutter: stable;\n    text-size-adjust: none;\n    -webkit-text-size-adjust: none;\n    -webkit-tap-highlight-color: transparent;\n    -webkit-font-smoothing: antialiased;\n  }\n\n  :where(html.translated-rtl) {\n    direction: rtl;\n  }\n\n  @media (prefers-reduced-motion: reduce) {\n    :where(html) {\n      scroll-behavior: auto;\n    }\n  }\n\n  :where(body) {\n    min-block-size: 100svb;\n    min-inline-size: 300px;\n  }\n\n  :where(canvas, img, picture, svg, video) {\n    block-size: auto;\n    border: none;\n    display: block;\n    max-inline-size: 100%;\n  }\n\n  :where(button) {\n    cursor: pointer;\n    user-select: none;\n  }\n\n  :where(textarea) {\n    resize: vertical;\n  }\n\n  :where(textarea:not([rows])) {\n    field-sizing: content;\n  }\n\n  :where(fieldset, iframe) {\n    border: none;\n  }\n\n  :where(p, li, h1, h2, h3, h4, h5, h6) {\n    overflow-wrap: break-word;\n    text-wrap: pretty;\n    margin: 0;\n  }\n\n  :where(abbr[title]) {\n    border: none;\n    text-decoration: none;\n  }\n\n  :where(cite) {\n    font-style: inherit;\n  }\n\n  :where(small) {\n    font-size: inherit;\n  }\n\n  :where(li, ol, ul) {\n    list-style: none;\n  }\n\n  :where(nav:not([role='list'])):is(ul, li, ol, ul) {\n    margin: 0;\n    padding: 0;\n  }\n\n  :where(dialog, [popover]) {\n    background: transparent;\n    border: none;\n    color: inherit;\n    margin: auto;\n    max-block-size: none;\n    max-inline-size: none;\n    position: fixed;\n  }\n\n  :where([popover]) {\n    inset: auto;\n  }\n\n  :where(dialog:not([open], [popover]), [popover]:not(:popover-open)) {\n    display: none;\n  }\n\n  :where([hidden]:not([hidden='until-found'])) {\n    display: none;\n  }\n}\n`.trim();\n\n/**\n * Base body/html styles for dark theme.\n */\nexport const BASE_CSS = `\nease-panel {\n  font-family: var(--ease-font-family, 'Instrument Sans', sans-serif);\n  font-optical-sizing: auto;\n  font-weight: 400;\n  font-style: normal;\n  font-variation-settings: 'wdth' 100;\n  color: var(--color-gray-600);\n}\n`.trim();\n\n/**\n * Combined main styles (reset + base).\n */\nexport const MAIN_CSS = `${RESET_CSS}\\n\\n${BASE_CSS}`;\n\nexport type StylePreset = 'reset' | 'base' | 'main';\n\n/**\n * Get CSS content for a preset.\n */\nexport function getPresetCSS(preset: StylePreset): string {\n  switch (preset) {\n    case 'reset':\n      return RESET_CSS;\n    case 'base':\n      return BASE_CSS;\n    case 'main':\n      return MAIN_CSS;\n    default:\n      return '';\n  }\n}\n\n/**\n * Inject preset styles.\n */\nexport function injectPreset(preset: StylePreset, nonce?: string): HTMLStyleElement | null {\n  const css = getPresetCSS(preset);\n  return injectStyle(preset, css, nonce);\n}\n\n/**\n * Remove preset styles.\n */\nexport function removePreset(preset: StylePreset): void {\n  removeStyle(preset);\n}\n","/**\n * Font loading utilities.\n */\n\nimport { isBrowser } from './style-inject';\n\nconst FONT_LINK_ID_PREFIX = 'ease-webkit-font-';\nconst PRECONNECT_ID = 'ease-webkit-preconnect-google';\n\n/**\n * Font source configuration.\n */\nexport interface FontSource {\n  /** Source type */\n  source: 'google' | 'css';\n  /** For Google fonts: the family name */\n  family?: string;\n  /** For Google fonts: the css2 query params (e.g., 'wght@400..700') */\n  css2?: string;\n  /** For CSS source: the URL to the CSS file */\n  url?: string;\n}\n\n/**\n * Font configuration map.\n */\nexport type FontConfig = Record<string, FontSource>;\n\n/**\n * Default fonts used by the kit.\n */\nexport const DEFAULT_FONTS: FontConfig = {\n  'Instrument Sans': {\n    source: 'google',\n    family: 'Instrument Sans',\n    css2: 'opsz,wght@14..32,400..700'\n  },\n  'Geist Mono': {\n    source: 'google',\n    family: 'Geist Mono',\n    css2: 'wght@100..900'\n  }\n};\n\n/**\n * Generate a Google Fonts URL.\n */\nfunction buildGoogleFontUrl(family: string, css2?: string): string {\n  const encodedFamily = encodeURIComponent(family).replace(/%20/g, '+');\n  const params = css2 ? `:${css2}` : '';\n  return `https://fonts.googleapis.com/css2?family=${encodedFamily}${params}&display=swap`;\n}\n\n/**\n * Inject preconnect links for Google Fonts.\n */\nfunction injectPreconnect(): void {\n  if (!isBrowser()) {\n    return;\n  }\n\n  // Check if already added\n  if (document.getElementById(PRECONNECT_ID)) {\n    return;\n  }\n\n  const head = document.head;\n\n  // preconnect to fonts.googleapis.com\n  const preconnect1 = document.createElement('link');\n  preconnect1.id = PRECONNECT_ID;\n  preconnect1.rel = 'preconnect';\n  preconnect1.href = 'https://fonts.googleapis.com';\n  head.appendChild(preconnect1);\n\n  // preconnect to fonts.gstatic.com\n  const preconnect2 = document.createElement('link');\n  preconnect2.rel = 'preconnect';\n  preconnect2.href = 'https://fonts.gstatic.com';\n  preconnect2.crossOrigin = 'anonymous';\n  head.appendChild(preconnect2);\n}\n\n/**\n * Inject a font link.\n */\nfunction injectFontLink(id: string, url: string): HTMLLinkElement | null {\n  if (!isBrowser()) {\n    return null;\n  }\n\n  const fullId = FONT_LINK_ID_PREFIX + id;\n\n  // Check if already injected\n  let link = document.getElementById(fullId) as HTMLLinkElement | null;\n  if (link) {\n    return link;\n  }\n\n  link = document.createElement('link');\n  link.id = fullId;\n  link.rel = 'stylesheet';\n  link.href = url;\n\n  document.head.appendChild(link);\n  return link;\n}\n\n/**\n * Remove a font link.\n */\nfunction removeFontLink(id: string): void {\n  if (!isBrowser()) {\n    return;\n  }\n\n  const fullId = FONT_LINK_ID_PREFIX + id;\n  const link = document.getElementById(fullId);\n  if (link) {\n    link.remove();\n  }\n}\n\n/**\n * Inject fonts based on configuration.\n */\nexport function injectFonts(config: FontConfig | 'default' | false, preconnect = true): void {\n  if (config === false) {\n    return;\n  }\n\n  const fonts = config === 'default' ? DEFAULT_FONTS : config;\n\n  if (preconnect) {\n    // Check if any Google fonts are being loaded\n    const hasGoogleFonts = Object.values(fonts).some((f) => f.source === 'google');\n    if (hasGoogleFonts) {\n      injectPreconnect();\n    }\n  }\n\n  for (const [name, source] of Object.entries(fonts)) {\n    const id = name.toLowerCase().replace(/\\s+/g, '-');\n\n    if (source.source === 'google' && source.family) {\n      const url = buildGoogleFontUrl(source.family, source.css2);\n      injectFontLink(id, url);\n    } else if (source.source === 'css' && source.url) {\n      injectFontLink(id, source.url);\n    }\n  }\n}\n\n/**\n * Remove all injected fonts.\n */\nexport function removeFonts(config: FontConfig | 'default'): void {\n  const fonts = config === 'default' ? DEFAULT_FONTS : config;\n\n  for (const name of Object.keys(fonts)) {\n    const id = name.toLowerCase().replace(/\\s+/g, '-');\n    removeFontLink(id);\n  }\n}\n","/**\n * Component loader map for dynamic imports.\n * Maps tag names to their module paths for selective/lazy loading.\n */\n\n/**\n * All root-level web-kit element tags (excludes internal sub-components).\n */\nexport const WEB_KIT_ELEMENT_TAGS = [\n  // Controls\n  'ease-button',\n  'ease-checkbox',\n  'ease-color-input',\n  'ease-color-picker',\n  'ease-dropdown',\n  'ease-input',\n  'ease-number-input',\n  'ease-origin',\n  'ease-radio-group',\n  'ease-radio-input',\n  'ease-slider',\n  'ease-toggle',\n\n  // Layout\n  'ease-field',\n  'ease-panel',\n  'ease-popover',\n  'ease-state',\n  'ease-tooltip',\n\n  // Display\n  'ease-logo-loader',\n  'ease-monitor',\n  'ease-monitor-fps',\n\n  // Icons\n  'ease-icon-anchor-add',\n  'ease-icon-anchor-remove',\n  'ease-icon-arrow-up',\n  'ease-icon-arrows-vertical',\n  'ease-icon-bezier',\n  'ease-icon-bezier-angle',\n  'ease-icon-bezier-distribute',\n  'ease-icon-bezier-length',\n  'ease-icon-bezier-mirror',\n  'ease-icon-check',\n  'ease-icon-chevron',\n  'ease-icon-circle-arrow-left',\n  'ease-icon-circle-arrow-right',\n  'ease-icon-clear',\n  'ease-icon-code',\n  'ease-icon-dots',\n  'ease-icon-grid',\n  'ease-icon-loading',\n  'ease-icon-mention',\n  'ease-icon-minus',\n  'ease-icon-picker',\n  'ease-icon-plus',\n  'ease-icon-settings',\n  'ease-icon-snap'\n] as const;\n\n/**\n * Advanced component tags (curve, code editor, etc.)\n */\nexport const WEB_KIT_COMPONENT_TAGS = ['ease-curve', 'ease-code'] as const;\n\n/**\n * All public web-kit tags.\n */\nexport const WEB_KIT_ALL_TAGS = [...WEB_KIT_ELEMENT_TAGS, ...WEB_KIT_COMPONENT_TAGS] as const;\n\n/**\n * Union type of all element tag names.\n */\nexport type WebKitElementTag = (typeof WEB_KIT_ELEMENT_TAGS)[number];\n\n/**\n * Union type of all component tag names.\n */\nexport type WebKitComponentTag = (typeof WEB_KIT_COMPONENT_TAGS)[number];\n\n/**\n * Union type of all public tag names.\n */\nexport type WebKitTag = (typeof WEB_KIT_ALL_TAGS)[number];\n\n/**\n * Internal/sub-component tags that are auto-registered with their parents.\n */\nexport const WEB_KIT_INTERNAL_TAGS = [\n  'ease-curve-canvas',\n  'ease-curve-canvas-controls',\n  'ease-curve-controls',\n  'ease-curve-output',\n  'ease-curve-toolbar',\n  'radio-option'\n] as const;\n\n/**\n * Map of tag names to their loader functions.\n * These use dynamic imports so we only load what's needed.\n */\nexport const COMPONENT_LOADERS: Record<WebKitTag, () => Promise<unknown>> = {\n  // Controls\n  'ease-button': () => import('../elements/button'),\n  'ease-checkbox': () => import('../elements/checkbox'),\n  'ease-color-input': () => import('../elements/color'),\n  'ease-color-picker': () => import('../elements/color/picker'),\n  'ease-dropdown': () => import('../elements/dropdown'),\n  'ease-input': () => import('../elements/input'),\n  'ease-number-input': () => import('../elements/number'),\n  'ease-origin': () => import('../elements/origin'),\n  'ease-radio-group': () => import('../elements/radio'),\n  'ease-radio-input': () => import('../elements/radio/input'),\n  'ease-slider': () => import('../elements/slider'),\n  'ease-toggle': () => import('../elements/toggle'),\n\n  // Layout\n  'ease-field': () => import('../elements/field'),\n  'ease-panel': () => import('../elements/panel'),\n  'ease-popover': () => import('../elements/popover'),\n  'ease-state': () => import('../elements/state'),\n  'ease-tooltip': () => import('../elements/tooltip'),\n\n  // Display\n  'ease-logo-loader': () => import('../elements/logo'),\n  'ease-monitor': () => import('../elements/monitor'),\n  'ease-monitor-fps': () => import('../elements/monitor/fps'),\n\n  // Icons\n  'ease-icon-anchor-add': () => import('../elements/icons/interface/anchor-add'),\n  'ease-icon-anchor-remove': () => import('../elements/icons/interface/anchor-remove'),\n  'ease-icon-arrow-up': () => import('../elements/icons/interface/arrow-up'),\n  'ease-icon-arrows-vertical': () => import('../elements/icons/interface/arrows-vertical'),\n  'ease-icon-bezier': () => import('../elements/icons/interface/bezier'),\n  'ease-icon-bezier-angle': () => import('../elements/icons/interface/bezier-angle'),\n  'ease-icon-bezier-distribute': () => import('../elements/icons/interface/bezier-distribute'),\n  'ease-icon-bezier-length': () => import('../elements/icons/interface/bezier-length'),\n  'ease-icon-bezier-mirror': () => import('../elements/icons/interface/bezier-mirror'),\n  'ease-icon-check': () => import('../elements/icons/interface/check'),\n  'ease-icon-chevron': () => import('../elements/icons/animation/chevron'),\n  'ease-icon-circle-arrow-left': () => import('../elements/icons/interface/circle-arrow-left'),\n  'ease-icon-circle-arrow-right': () => import('../elements/icons/interface/circle-arrow-right'),\n  'ease-icon-clear': () => import('../elements/icons/animation/clear'),\n  'ease-icon-code': () => import('../elements/icons/interface/code'),\n  'ease-icon-dots': () => import('../elements/icons/interface/dots'),\n  'ease-icon-grid': () => import('../elements/icons/animation/grid'),\n  'ease-icon-loading': () => import('../elements/icons/animation/loading'),\n  'ease-icon-mention': () => import('../elements/icons/interface/mention'),\n  'ease-icon-minus': () => import('../elements/icons/interface/minus'),\n  'ease-icon-picker': () => import('../elements/icons/interface/picker'),\n  'ease-icon-plus': () => import('../elements/icons/interface/plus'),\n  'ease-icon-settings': () => import('../elements/icons/interface/settings'),\n  'ease-icon-snap': () => import('../elements/icons/animation/snap'),\n\n  // Advanced components\n  'ease-curve': () => import('../components/curve'),\n  'ease-code': () => import('../components/code')\n};\n\n/**\n * Load specific components by tag name.\n */\nexport async function loadComponents(tags: readonly WebKitTag[]): Promise<void> {\n  const promises = tags.map((tag) => {\n    const loader = COMPONENT_LOADERS[tag];\n    if (loader) {\n      return loader();\n    }\n    return Promise.resolve();\n  });\n  await Promise.all(promises);\n}\n\n/**\n * Load all components.\n * Uses the individual component loaders to ensure all components are registered.\n */\nexport async function loadAllComponents(): Promise<void> {\n  await loadComponents(WEB_KIT_ALL_TAGS);\n}\n\n/**\n * Resolve which tags to load based on include/exclude options.\n */\nexport function resolveTags(options: { include?: readonly string[]; exclude?: readonly string[] }): WebKitTag[] {\n  const { include, exclude } = options;\n\n  // If include is specified, use those (filtered to valid tags)\n  if (include && include.length > 0) {\n    return include.filter((tag): tag is WebKitTag => WEB_KIT_ALL_TAGS.includes(tag as WebKitTag));\n  }\n\n  // Otherwise, start with all tags and remove excluded ones\n  let tags: WebKitTag[] = [...WEB_KIT_ALL_TAGS];\n\n  if (exclude && exclude.length > 0) {\n    const excludeSet = new Set(exclude);\n    tags = tags.filter((tag) => !excludeSet.has(tag));\n  }\n\n  return tags;\n}\n","/**\n * Lazy loading utilities using MutationObserver.\n */\n\nimport { COMPONENT_LOADERS, WEB_KIT_ALL_TAGS, type WebKitTag } from './component-loaders';\nimport { isBrowser } from './style-inject';\n\n/**\n * Lazy load configuration.\n */\nexport interface LazyLoadConfig {\n  /** MutationObserver strategy */\n  strategy?: 'mutation';\n  /** Root element to observe (default: document) */\n  root?: Document | Element;\n  /** Tags to include in lazy loading */\n  include?: readonly string[];\n  /** Tags to exclude from lazy loading */\n  exclude?: readonly string[];\n  /** Tags to preload immediately */\n  preload?: readonly string[];\n}\n\n/**\n * Lazy loader instance.\n */\nexport interface LazyLoader {\n  /** Stop observing and cleanup */\n  dispose: () => void;\n  /** Manually load a component */\n  load: (tag: WebKitTag) => Promise<void>;\n}\n\n/**\n * Create a lazy loader that auto-registers components when they appear in DOM.\n */\nexport function createLazyLoader(config: LazyLoadConfig = {}): LazyLoader {\n  if (!isBrowser()) {\n    return {\n      dispose: () => {},\n      load: async () => {}\n    };\n  }\n\n  const { root = document, include, exclude, preload } = config;\n\n  // Determine which tags to watch\n  let watchTags = new Set<WebKitTag>([...WEB_KIT_ALL_TAGS]);\n\n  if (include && include.length > 0) {\n    watchTags = new Set(include.filter((tag): tag is WebKitTag => WEB_KIT_ALL_TAGS.includes(tag as WebKitTag)));\n  }\n\n  if (exclude && exclude.length > 0) {\n    for (const tag of exclude) {\n      watchTags.delete(tag as WebKitTag);\n    }\n  }\n\n  // Track loaded components\n  const loaded = new Set<string>();\n\n  // Load a component\n  const load = async (tag: WebKitTag): Promise<void> => {\n    if (loaded.has(tag)) {\n      return;\n    }\n\n    const loader = COMPONENT_LOADERS[tag];\n    if (loader) {\n      loaded.add(tag);\n      await loader();\n    }\n  };\n\n  // Check if an element or its descendants need loading\n  const checkElement = (element: Element): void => {\n    const tagName = element.tagName.toLowerCase();\n\n    if (watchTags.has(tagName as WebKitTag) && !loaded.has(tagName)) {\n      void load(tagName as WebKitTag);\n    }\n\n    // Check children\n    for (const child of element.querySelectorAll('*')) {\n      const childTag = child.tagName.toLowerCase();\n      if (watchTags.has(childTag as WebKitTag) && !loaded.has(childTag)) {\n        void load(childTag as WebKitTag);\n      }\n    }\n  };\n\n  // Create observer\n  const observer = new MutationObserver((mutations) => {\n    for (const mutation of mutations) {\n      for (const node of mutation.addedNodes) {\n        if (node instanceof Element) {\n          checkElement(node);\n        }\n      }\n    }\n  });\n\n  // Start observing\n  const target = root instanceof Document ? root.documentElement : root;\n  observer.observe(target, {\n    childList: true,\n    subtree: true\n  });\n\n  // Check existing elements\n  checkElement(target);\n\n  // Preload specified tags\n  if (preload && preload.length > 0) {\n    for (const tag of preload) {\n      if (WEB_KIT_ALL_TAGS.includes(tag as WebKitTag)) {\n        void load(tag as WebKitTag);\n      }\n    }\n  }\n\n  return {\n    dispose: () => {\n      observer.disconnect();\n    },\n    load\n  };\n}\n","// JSX type augmentation - export a non-empty type to force TS to include the module\n// This ensures JSX types are available when the package is imported (no consumer .d.ts needed)\nexport type { EaseElements as WebKitJSXElements } from './react/jsx';\n\n// Components\nexport * from './components';\n// Decorators\nexport * from './decorators';\n// Elements (components)\nexport * from './elements';\n// Init API\nexport {\n  type FontConfig,\n  type FontSource,\n  type InitWebKitOptions,\n  initWebKit,\n  type LazyLoadConfig,\n  type LazyLoader,\n  type ReplaceConfig,\n  type StylePreset,\n  type StylesConfig,\n  type ThemeModeConfig,\n  type WebKitComponentTag,\n  type WebKitController,\n  type WebKitElementTag,\n  type WebKitTag\n} from './init';\n// Theming\nexport * from './theme';\n// Utilities\nexport {\n  classMap,\n  ifDefined,\n  optionalAttribute,\n  renderIf,\n  renderList,\n  repeat,\n  styleMap,\n  styleObject,\n  unsafeHTML,\n  when\n} from './utils/template-helpers';\n","export * from './code';\nexport * from './curve';\n","import { html, render, type TemplateResult } from 'lit-html';\n\ntype Constructor<T extends HTMLElement> = new (...args: unknown[]) => T;\n\ninterface LifecycleElement {\n  connectedCallback?(): void;\n  disconnectedCallback?(): void;\n  attributeChangedCallback?(name: string, oldValue: string | null, newValue: string | null): void;\n}\n\ntype RenderableElement = HTMLElement & {\n  render?(): TemplateResult | null | undefined;\n  afterRender?(): void;\n  wrapRender?(commit: () => void, context: RenderContext): void;\n  onAttributeChange?(name: string, oldValue: string | null, newValue: string | null): void;\n  requestRender?(): void;\n  renderRoot?: ShadowRoot | HTMLElement;\n};\n\ntype TemplateValue<TElement extends RenderableElement> =\n  | TemplateResult\n  | null\n  | undefined\n  | ((this: TElement, host: TElement) => TemplateResult | null | undefined);\n\ninterface ComponentOptions<TElement extends RenderableElement = RenderableElement> {\n  tag: string;\n  template?: TemplateValue<TElement>;\n  styles?: string;\n  styleUrls?: string[];\n  observedAttributes?: string[];\n  shadowMode?: ShadowRootMode;\n  autoSlot?: boolean;\n}\n\n// Exporting RenderContext\nexport interface RenderContext {\n  fragment: DocumentFragment;\n  root: ShadowRoot | HTMLElement;\n}\n\nconst styleCache = new Map<string, Promise<string>>();\n\nconst normalizeTemplate = <TElement extends RenderableElement>(\n  template?: TemplateValue<TElement>\n): ((this: TElement, host: TElement) => TemplateResult | null | undefined) => {\n  if (typeof template === 'function') {\n    return template as (this: TElement, host: TElement) => TemplateResult | null | undefined;\n  }\n\n  if (template && typeof template === 'object' && '_$litTemplate$' in template) {\n    return function (this: TElement): TemplateResult | null | undefined {\n      return template as TemplateResult;\n    };\n  }\n\n  return function (this: TElement): TemplateResult | null | undefined {\n    return null;\n  };\n};\n\nconst fetchStyles = async (urls: readonly string[]): Promise<string[]> =>\n  Promise.all(\n    urls.map((url) => {\n      const cached = styleCache.get(url);\n      if (cached) {\n        return cached;\n      }\n\n      const request = fetch(url)\n        .then((response) => (response.ok ? response.text() : ''))\n        .catch(() => '');\n\n      styleCache.set(url, request);\n      return request;\n    })\n  );\n\nexport const Component =\n  <TElement extends RenderableElement = RenderableElement>(options: ComponentOptions<TElement>) =>\n  <TBase extends Constructor<TElement> & { observedAttributes?: string[] }>(\n    Base: TBase,\n    _context: ClassDecoratorContext\n  ): TBase => {\n    const {\n      tag,\n      template,\n      styles = '',\n      styleUrls = [],\n      observedAttributes = [],\n      shadowMode = 'open',\n      autoSlot = true\n    } = options;\n\n    if (!tag) {\n      throw new Error('@Component requires a \"tag\" option.');\n    }\n\n    const templateFn = normalizeTemplate<TElement>(template);\n\n    class Decorated extends (Base as unknown as Constructor<RenderableElement>) {\n      static get observedAttributes(): string[] {\n        const parent =\n          'observedAttributes' in Base && Array.isArray(Base.observedAttributes)\n            ? (Base.observedAttributes as string[])\n            : [];\n        const own = Array.isArray(observedAttributes) ? observedAttributes : [];\n        return Array.from(new Set([...parent, ...own]));\n      }\n\n      #shadow: ShadowRoot;\n      #styles = styles;\n      #styleUrls = [...styleUrls];\n      #renderScheduled = false;\n\n      constructor(...args: unknown[]) {\n        super(...args);\n        this.#shadow = this.attachShadow({ mode: shadowMode });\n        this.renderRoot = this.#shadow;\n      }\n\n      get shadow(): HTMLElement | ShadowRoot | undefined {\n        return this.renderRoot;\n      }\n\n      connectedCallback(): void {\n        (Base.prototype as LifecycleElement).connectedCallback?.call(this);\n\n        void this.#loadStyles().finally(() => {\n          this.requestRender();\n        });\n      }\n\n      disconnectedCallback(): void {\n        (Base.prototype as LifecycleElement).disconnectedCallback?.call(this);\n        this.#renderScheduled = false;\n      }\n\n      attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n        (Base.prototype as LifecycleElement).attributeChangedCallback?.call(this, name, oldValue, newValue);\n\n        if (oldValue !== newValue) {\n          this.onAttributeChange?.(name, oldValue, newValue);\n        }\n      }\n\n      requestRender(): void {\n        if (this.#renderScheduled) {\n          return;\n        }\n\n        this.#renderScheduled = true;\n\n        requestAnimationFrame(() => {\n          this.#renderScheduled = false;\n          this.#render();\n        });\n      }\n\n      async #loadStyles(): Promise<void> {\n        if (!this.#styleUrls.length) {\n          return;\n        }\n\n        const fetched = await fetchStyles(this.#styleUrls);\n        const inlineStyles = this.#styles ? [this.#styles] : [];\n        this.#styles = [...inlineStyles, ...fetched.filter(Boolean)].join('\\n');\n      }\n\n      #render(): void {\n        const root = this.#shadow;\n\n        let templateResult: TemplateResult | null | undefined;\n\n        if (typeof this.render === 'function') {\n          templateResult = this.render();\n        } else {\n          templateResult = templateFn.call(this as unknown as TElement, this as unknown as TElement);\n        }\n\n        const styleTemplate = this.#styles ? html`<style>${this.#styles}</style>` : null;\n        const slotTemplate = autoSlot ? html`<slot></slot>` : null;\n\n        const completeTemplate = html`\n          ${styleTemplate}\n          ${templateResult ?? null}\n          ${slotTemplate}\n        `;\n\n        const commit = (): void => {\n          render(completeTemplate, root);\n          this.afterRender?.();\n        };\n\n        if (typeof this.wrapRender === 'function') {\n          const fragment = document.createDocumentFragment();\n          const tempDiv = document.createElement('div');\n\n          render(completeTemplate, tempDiv);\n\n          fragment.append(...tempDiv.childNodes);\n\n          this.wrapRender(commit, { fragment, root });\n          return;\n        }\n\n        commit();\n      }\n    }\n\n    // SSR safety: only register in browser environments\n    if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n      customElements.define(tag, Decorated as unknown as CustomElementConstructor);\n    }\n\n    return Decorated as unknown as TBase;\n  };\n","type ListenHost = HTMLElement & {\n  renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype LifecycleHookName = 'connectedCallback' | 'disconnectedCallback';\n\ntype LifecycleCallback<THost extends ListenHost> = (this: THost) => void;\n\ntype ListenTargetResolver<THost extends ListenHost> =\n  | 'document'\n  | 'window'\n  | 'shadow'\n  | 'root'\n  | 'light'\n  | EventTarget\n  | ((host: THost) => EventTarget | null | undefined);\n\ntype Predicate<TEvent extends Event, TElement extends Element> = (event: TEvent, matched: TElement | null) => boolean;\n\ninterface ListenOptions<THost extends ListenHost, TElement extends Element, TEvent extends Event> {\n  selector?: string;\n  target?: ListenTargetResolver<THost>;\n  prevent?: boolean;\n  stop?: boolean;\n  stopImmediate?: boolean;\n  once?: boolean;\n  passive?: boolean;\n  capture?: boolean;\n  when?: Predicate<TEvent, TElement>;\n}\n\ntype Cleanup = () => void;\n\nconst lifecycleHooks: Record<LifecycleHookName, WeakMap<ListenHost, Set<LifecycleCallback<ListenHost>>>> = {\n  connectedCallback: new WeakMap(),\n  disconnectedCallback: new WeakMap()\n};\n\nconst cleanupRegistry = new WeakMap<ListenHost, Set<Cleanup>>();\n\nconst addLifecycleHook = <THost extends ListenHost>(\n  instance: THost,\n  hookName: LifecycleHookName,\n  handler: LifecycleCallback<THost>\n): void => {\n  const store = lifecycleHooks[hookName] as WeakMap<THost, Set<LifecycleCallback<THost>>>;\n  let callbacks = store.get(instance);\n\n  if (!callbacks) {\n    callbacks = new Set<LifecycleCallback<THost>>();\n    store.set(instance, callbacks);\n\n    const original = (instance as unknown as Record<LifecycleHookName, unknown>)[hookName];\n\n    (instance as unknown as Record<LifecycleHookName, unknown>)[hookName] = function (...args: unknown[]) {\n      callbacks?.forEach((callback) => {\n        callback.apply(this as THost);\n      });\n\n      if (typeof original === 'function') {\n        return (original as (...params: unknown[]) => unknown).apply(this, args);\n      }\n\n      return undefined;\n    };\n  }\n\n  callbacks.add(handler);\n};\n\nconst registerCleanup = <THost extends ListenHost>(instance: THost, cleanup: Cleanup): void => {\n  let callbacks = cleanupRegistry.get(instance);\n\n  if (!callbacks) {\n    callbacks = new Set();\n    cleanupRegistry.set(instance, callbacks);\n\n    addLifecycleHook(instance, 'disconnectedCallback', function (this: THost) {\n      const registered = cleanupRegistry.get(this);\n      registered?.forEach((fn) => {\n        try {\n          fn();\n        } catch (error) {\n          console.error('[Listen] cleanup failed', error);\n        }\n      });\n      cleanupRegistry.delete(this);\n    });\n  }\n\n  callbacks.add(cleanup);\n};\n\nconst resolveTarget = <THost extends ListenHost>(\n  host: THost,\n  target: ListenTargetResolver<THost> | undefined\n): EventTarget | null => {\n  if (typeof target === 'function') {\n    return target(host) ?? null;\n  }\n\n  if (target instanceof EventTarget) {\n    return target;\n  }\n\n  switch (target) {\n    case 'document':\n      return document;\n    case 'window':\n      return window;\n    case 'light':\n      return host;\n    default:\n      return host.renderRoot ?? host.shadowRoot ?? host;\n  }\n};\n\nconst normalizeOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n  selectorOrOptions: string | ListenOptions<THost, TElement, TEvent> | undefined\n): ListenOptions<THost, TElement, TEvent> => {\n  if (typeof selectorOrOptions === 'string') {\n    return { selector: selectorOrOptions };\n  }\n\n  return selectorOrOptions ?? {};\n};\n\nconst buildOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n  options: ListenOptions<THost, TElement, TEvent>\n) => {\n  return {\n    selector: options.selector ?? null,\n    target: options.target ?? 'shadow',\n    prevent: options.prevent ?? false,\n    stop: options.stop ?? false,\n    stopImmediate: options.stopImmediate ?? false,\n    once: options.once ?? false,\n    passive: options.passive,\n    capture: options.capture ?? false,\n    when: options.when ?? null\n  };\n};\n\nexport function Listen<THost extends ListenHost, TEvent extends Event = Event, TElement extends Element = Element>(\n  eventName: keyof HTMLElementEventMap | string,\n  selectorOrOptions?: string | ListenOptions<THost, TElement, TEvent>\n) {\n  if (!eventName) {\n    throw new Error('@Listen requires an event name.');\n  }\n\n  const listenConfig = buildOptions(normalizeOptions(selectorOrOptions));\n\n  return (\n    originalMethod: (this: THost, event: TEvent, matched?: TElement | null) => unknown,\n    context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n  ): void => {\n    context.addInitializer(function (this: THost) {\n      let attached = false;\n\n      const attach = () => {\n        if (attached) {\n          return;\n        }\n\n        const target = resolveTarget(this, listenConfig.target);\n\n        if (!target || typeof (target as EventTarget).addEventListener !== 'function') {\n          console.warn(`@Listen unable to resolve target for ${String(eventName)}`);\n          return;\n        }\n\n        const eventOptions: AddEventListenerOptions = {\n          capture: listenConfig.capture,\n          once: listenConfig.once,\n          passive: listenConfig.passive !== undefined ? listenConfig.passive : !listenConfig.prevent\n        };\n\n        const handler = (event: Event): void => {\n          const typedEvent = event as TEvent;\n\n          if (listenConfig.prevent) {\n            typedEvent.preventDefault();\n          }\n\n          if (listenConfig.stopImmediate) {\n            typedEvent.stopImmediatePropagation();\n          } else if (listenConfig.stop) {\n            typedEvent.stopPropagation();\n          }\n\n          let matched: TElement | null = null;\n\n          if (listenConfig.selector) {\n            const path = typedEvent.composedPath();\n            matched =\n              path.find(\n                (node): node is TElement => node instanceof Element && node.matches(listenConfig.selector as string)\n              ) ?? null;\n\n            if (!matched) {\n              return;\n            }\n          }\n\n          if (listenConfig.when && !listenConfig.when(typedEvent, matched)) {\n            return;\n          }\n\n          if (listenConfig.selector) {\n            void originalMethod.call(this, typedEvent, matched);\n          } else {\n            const targetNode = (\n              typedEvent.target instanceof Element ? (typedEvent.target as TElement) : null\n            ) as TElement | null;\n            void originalMethod.call(this, typedEvent, targetNode);\n          }\n        };\n\n        target.addEventListener(eventName as string, handler, eventOptions);\n        attached = true;\n\n        registerCleanup(this, () => {\n          target.removeEventListener(eventName as string, handler, eventOptions);\n          attached = false;\n        });\n      };\n\n      // IMPORTANT:\n      // Many components are created inside templates/shadow DOM. At construction time they are often not connected yet,\n      // and patching instance lifecycle callbacks is not reliably invoked by the platform.\n      // Attach the listener ASAP (microtask) so it works for nested components as well.\n      queueMicrotask(attach);\n\n      // Best-effort attach on connect too (idempotent).\n      addLifecycleHook(this, 'connectedCallback', attach);\n    });\n  };\n}\n","import type { OutsideClickResolution } from '~/utils/outside-click';\n\nimport {\n  createOutsideClickHandle,\n  disconnectOutsideClickHandles,\n  registerOutsideClickHandle,\n  updateOutsideClickHandles\n} from '~/utils/outside-click';\n\ntype OutsideClickHost = HTMLElement & {\n  connectedCallback?: (...args: unknown[]) => unknown;\n  disconnectedCallback?: (...args: unknown[]) => unknown;\n  afterRender?: (...args: unknown[]) => unknown;\n};\n\ntype HookName = 'connectedCallback' | 'disconnectedCallback' | 'afterRender';\n\ninterface OutsideClickOptions<THost extends OutsideClickHost> {\n  resolve?: (host: THost) => OutsideClickResolution | null | undefined;\n  owner?: (host: THost) => HTMLElement | null | undefined;\n  content?: (host: THost) => HTMLElement | null | undefined;\n  triggers?: (host: THost) => Array<HTMLElement | null | undefined>;\n  disabled?: (host: THost) => boolean;\n}\n\nconst lifecycleApplied = new WeakSet<OutsideClickHost>();\n\nconst wrapMethod = (\n  host: OutsideClickHost,\n  name: HookName,\n  hook: (this: OutsideClickHost) => void,\n  callHookFirst = false\n): void => {\n  const original = host[name];\n\n  (host as Required<OutsideClickHost>)[name] = function (...args: unknown[]) {\n    if (callHookFirst) {\n      hook.call(this);\n    }\n\n    let result: unknown;\n\n    if (typeof original === 'function') {\n      result = (original as (...params: unknown[]) => unknown).apply(this, args);\n    }\n\n    if (!callHookFirst) {\n      hook.call(this);\n    }\n\n    return result;\n  };\n};\n\nconst ensureLifecycle = (host: OutsideClickHost): void => {\n  if (lifecycleApplied.has(host)) {\n    return;\n  }\n\n  lifecycleApplied.add(host);\n\n  wrapMethod(host, 'connectedCallback', function (this: OutsideClickHost) {\n    updateOutsideClickHandles(this);\n  });\n\n  wrapMethod(host, 'afterRender', function (this: OutsideClickHost) {\n    updateOutsideClickHandles(this);\n  });\n\n  wrapMethod(\n    host,\n    'disconnectedCallback',\n    function (this: OutsideClickHost) {\n      disconnectOutsideClickHandles(this);\n    },\n    true\n  );\n};\n\nexport function OutsideClick<THost extends OutsideClickHost, TEvent extends Event = Event>(\n  options: OutsideClickOptions<THost> = {}\n) {\n  return (\n    originalMethod: (this: THost, event: TEvent) => unknown,\n    context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n  ): void => {\n    context.addInitializer(function (this: THost) {\n      ensureLifecycle(this);\n\n      const resolve =\n        options.resolve ??\n        ((host: THost): OutsideClickResolution => {\n          return {\n            owner: options.owner?.(host),\n            content: options.content?.(host),\n            triggers: options.triggers?.(host)\n          };\n        });\n\n      const handle = createOutsideClickHandle(\n        this,\n        (event) => {\n          originalMethod.call(this, event as TEvent);\n        },\n        {\n          resolve,\n          disabled: options.disabled\n        }\n      );\n\n      registerOutsideClickHandle(this, handle);\n\n      if (this.isConnected) {\n        updateOutsideClickHandles(this);\n      }\n    });\n  };\n}\n\nexport type { OutsideClickOptions };\n\nexport { requestOutsideClickUpdate } from '~/utils/outside-click';\n","type RenderHost = HTMLElement & {\n  requestRender?(): void;\n  render?(): void;\n  connectedCallback?(): void;\n  disconnectedCallback?(...args: unknown[]): void;\n};\n\ntype PropTypeDescriptor =\n  | BooleanConstructor\n  | NumberConstructor\n  | StringConstructor\n  | ObjectConstructor\n  | ArrayConstructor\n  | 'boolean'\n  | 'number'\n  | 'string'\n  | 'json';\n\ntype Formatter<TValue, THost extends RenderHost> = (this: THost, value: TValue) => string | null | undefined;\ntype Parser<TValue, THost extends RenderHost> = (this: THost, value: string | null) => TValue;\n\ninterface PropOptions<TValue, THost extends RenderHost> {\n  attribute?: string;\n  reflect?: boolean;\n  type?: PropTypeDescriptor;\n  parse?: Parser<TValue, THost>;\n  format?: Formatter<TValue, THost>;\n  defaultValue?: TValue | ((this: THost) => TValue);\n  compare?: (previous: TValue, next: TValue) => boolean;\n  onChange?: (this: THost, next: TValue, previous: TValue) => void;\n  onAttributeChange?: (this: THost, next: TValue, previous: TValue) => void;\n}\n\ninterface AttributeObserverEntry {\n  observer: MutationObserver;\n  callbacks: Map<string, Set<(value: string | null) => void>>;\n}\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\nconst cleanupRegistry = new WeakMap<RenderHost, Set<() => void>>();\nconst observerRegistry = new WeakMap<RenderHost, AttributeObserverEntry>();\nconst internalMutations = new WeakMap<RenderHost, Set<string>>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n  if (typeof instance.requestRender === 'function') {\n    instance.requestRender();\n    return;\n  }\n\n  if (typeof instance.render !== 'function') {\n    return;\n  }\n\n  if (renderQueue.get(instance)) {\n    return;\n  }\n\n  renderQueue.set(instance, true);\n\n  requestAnimationFrame(() => {\n    renderQueue.delete(instance);\n    instance.render?.();\n  });\n};\n\nconst toKebabCase = (value: PropertyKey): string =>\n  String(value)\n    .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n    .replace(/[_\\s]+/g, '-')\n    .toLowerCase();\n\nconst registerCleanup = (instance: RenderHost, cleanup: () => void): void => {\n  let callbacks = cleanupRegistry.get(instance);\n\n  if (!callbacks) {\n    callbacks = new Set();\n    cleanupRegistry.set(instance, callbacks);\n\n    const original = instance.disconnectedCallback;\n\n    instance.disconnectedCallback = function (this: RenderHost, ...args: unknown[]) {\n      const registered = cleanupRegistry.get(this);\n      registered?.forEach((callback) => {\n        try {\n          callback();\n        } catch (error) {\n          console.error('[Prop] cleanup failed', error);\n        }\n      });\n      cleanupRegistry.delete(this);\n\n      if (typeof original === 'function') {\n        return original.apply(this, args as []);\n      }\n\n      return undefined;\n    } as typeof instance.disconnectedCallback;\n  }\n\n  callbacks.add(cleanup);\n};\n\nconst markInternalMutation = (host: RenderHost, attribute: string): void => {\n  let attributes = internalMutations.get(host);\n\n  if (!attributes) {\n    attributes = new Set();\n    internalMutations.set(host, attributes);\n  }\n\n  attributes.add(attribute);\n};\n\nconst isInternalMutation = (host: RenderHost, attribute: string): boolean => {\n  const attributes = internalMutations.get(host);\n\n  if (!attributes) {\n    return false;\n  }\n\n  const hasAttribute = attributes.has(attribute);\n\n  if (hasAttribute) {\n    attributes.delete(attribute);\n    if (attributes.size === 0) {\n      internalMutations.delete(host);\n    }\n  }\n\n  return hasAttribute;\n};\n\nconst observeAttribute = (host: RenderHost, attribute: string, handler: (value: string | null) => void): void => {\n  let entry = observerRegistry.get(host);\n\n  if (!entry) {\n    const callbacks = new Map<string, Set<(value: string | null) => void>>();\n    const observer = new MutationObserver((records) => {\n      records.forEach((record) => {\n        const attributeName = record.attributeName;\n\n        if (!attributeName) {\n          return;\n        }\n\n        if (isInternalMutation(host, attributeName)) {\n          return;\n        }\n\n        const listeners = callbacks.get(attributeName);\n        if (!listeners) {\n          return;\n        }\n\n        const currentValue = (record.target as Element).getAttribute(attributeName);\n\n        for (const listener of listeners) {\n          listener(currentValue);\n        }\n      });\n    });\n\n    observer.observe(host, { attributes: true });\n\n    entry = { observer, callbacks };\n    observerRegistry.set(host, entry);\n\n    registerCleanup(host, () => {\n      observer.disconnect();\n      observerRegistry.delete(host);\n    });\n  }\n\n  let listeners = entry.callbacks.get(attribute);\n\n  if (!listeners) {\n    listeners = new Set();\n    entry.callbacks.set(attribute, listeners);\n  }\n\n  listeners.add(handler);\n};\n\nconst updateAttribute = (host: RenderHost, attribute: string, value: string | null | undefined | boolean): void => {\n  markInternalMutation(host, attribute);\n\n  if (value === undefined || value === null || value === false) {\n    host.removeAttribute(attribute);\n    return;\n  }\n\n  if (value === true) {\n    host.setAttribute(attribute, '');\n    return;\n  }\n\n  host.setAttribute(attribute, String(value));\n};\n\nconst resolveType = (type: PropTypeDescriptor | undefined): 'boolean' | 'number' | 'json' | 'string' | null => {\n  if (!type) {\n    return null;\n  }\n\n  if (type === Boolean || type === 'boolean') {\n    return 'boolean';\n  }\n\n  if (type === Number || type === 'number') {\n    return 'number';\n  }\n\n  if (type === Object || type === Array || type === 'json') {\n    return 'json';\n  }\n\n  return 'string';\n};\n\nconst typeParsers: Record<'boolean' | 'number' | 'json' | 'string', Parser<unknown, RenderHost>> = {\n  boolean(value: string | null): boolean {\n    return value !== null;\n  },\n  number(value: string | null): number | null {\n    if (value === null || value === '') {\n      return null;\n    }\n\n    const parsed = Number(value);\n    return Number.isNaN(parsed) ? null : parsed;\n  },\n  json(value: string | null): unknown {\n    if (!value) {\n      return null;\n    }\n\n    try {\n      return JSON.parse(value);\n    } catch (error) {\n      console.warn('[Prop] failed to parse JSON attribute', error);\n      return null;\n    }\n  },\n  string(value: string | null): string | null {\n    return value;\n  }\n};\n\nconst typeFormatters: Record<'boolean' | 'number' | 'json' | 'string', Formatter<unknown, RenderHost>> = {\n  boolean(value: unknown): string | null {\n    return value ? '' : null;\n  },\n  number(value: unknown): string | null {\n    if (value === null || value === undefined || value === '') {\n      return null;\n    }\n    return String(value);\n  },\n  json(value: unknown): string | null {\n    if (value === null || value === undefined) {\n      return null;\n    }\n    try {\n      return JSON.stringify(value);\n    } catch {\n      return null;\n    }\n  },\n  string(value: unknown): string | null {\n    if (value === null || value === undefined) {\n      return null;\n    }\n    return String(value);\n  }\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\nexport function Prop<TValue, THost extends RenderHost = RenderHost>(options: PropOptions<TValue, THost> = {}) {\n  const {\n    attribute,\n    reflect = true,\n    type,\n    parse,\n    format,\n    defaultValue,\n    compare = defaultCompare,\n    onChange,\n    onAttributeChange\n  } = options;\n\n  const resolvedType = resolveType(type);\n\n  const parseValue: Parser<TValue, THost> = parse\n    ? parse\n    : function (this: THost, value) {\n        if (!resolvedType) {\n          return value as unknown as TValue;\n        }\n        return typeParsers[resolvedType].call(this, value) as TValue;\n      };\n\n  const formatValue: Formatter<TValue, THost> = format\n    ? format\n    : function (this: THost, value) {\n        if (!resolvedType) {\n          return (value as unknown as string | null | undefined) ?? null;\n        }\n        return typeFormatters[resolvedType].call(this, value as unknown) as string | null;\n      };\n\n  return (\n    accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n    context: ClassAccessorDecoratorContext<THost, TValue>\n  ): ClassAccessorDecoratorResult<THost, TValue> => {\n    if (context.kind !== 'accessor') {\n      throw new Error('@Prop requires the \"accessor\" keyword on the property.');\n    }\n\n    const attributeName = attribute ?? toKebabCase(context.name);\n\n    context.addInitializer(function (this: THost) {\n      if (!reflect) {\n        return;\n      }\n\n      observeAttribute(this, attributeName, (rawValue) => {\n        if (isInternalMutation(this, attributeName)) {\n          return;\n        }\n\n        const parsed = parseValue.call(this, rawValue);\n        const previous = accessor.get.call(this);\n\n        if (compare(previous, parsed)) {\n          return;\n        }\n\n        accessor.set.call(this, parsed);\n\n        onAttributeChange?.call(this, parsed, previous);\n        scheduleRender(this);\n      });\n    });\n\n    return {\n      get(this: THost): TValue {\n        return accessor.get.call(this);\n      },\n      set(this: THost, value: TValue): void {\n        const previous = accessor.get.call(this);\n\n        if (compare(previous, value)) {\n          return;\n        }\n\n        accessor.set.call(this, value);\n\n        if (reflect) {\n          const formatted = formatValue.call(this, value);\n          updateAttribute(this, attributeName, formatted);\n        }\n\n        onChange?.call(this, value, previous);\n        scheduleRender(this);\n      },\n      init(this: THost, initialValue: TValue): TValue {\n        let value = initialValue;\n\n        if (this.hasAttribute(attributeName)) {\n          value = parseValue.call(this, this.getAttribute(attributeName));\n        } else if (value === undefined && defaultValue !== undefined) {\n          value =\n            typeof defaultValue === 'function' ? (defaultValue as (this: THost) => TValue).call(this) : defaultValue;\n        }\n\n        if (reflect) {\n          const formatted = formatValue.call(this, value);\n          updateAttribute(this, attributeName, formatted);\n        }\n\n        return value;\n      }\n    };\n  };\n}\n","type QueryRoot = 'shadow' | 'light' | 'document';\n\ntype QueryHost = HTMLElement & {\n  renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype QueryFallback<TResult, THost extends QueryHost> = TResult | ((host: THost) => TResult);\n\ninterface BaseQueryOptions<TResult, THost extends QueryHost> {\n  from?: QueryRoot;\n  fallback?: QueryFallback<TResult, THost>;\n}\n\ninterface QueryAllOptions<TElement extends Element, THost extends QueryHost>\n  extends BaseQueryOptions<TElement[], THost> {\n  all: true;\n  closest?: false;\n}\n\ninterface QueryClosestOptions<THost extends QueryHost> extends BaseQueryOptions<Element | null, THost> {\n  closest: true;\n  all?: false;\n}\n\ninterface QuerySingleOptions<TElement extends Element, THost extends QueryHost>\n  extends BaseQueryOptions<TElement | null, THost> {\n  all?: false;\n  closest?: false;\n}\n\ntype QueryOptions<TElement extends Element, THost extends QueryHost> =\n  | QueryAllOptions<TElement, THost>\n  | QueryClosestOptions<THost>\n  | QuerySingleOptions<TElement, THost>;\n\ntype QueryReturnType<\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n> =\n  TOptions extends QueryAllOptions<TElement, THost>\n    ? TElement[]\n    : TOptions extends QueryClosestOptions<THost>\n      ? Element | null\n      : TElement | null;\n\ntype QueryDecorator<\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n> = (\n  target: ClassAccessorDecoratorTarget<THost, QueryReturnType<TElement, THost, TOptions>> | undefined,\n  context:\n    | ClassFieldDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n    | ClassAccessorDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n) => ClassAccessorDecoratorResult<THost, QueryReturnType<TElement, THost, TOptions>> | undefined;\n\nconst defaultOptions = {\n  all: false,\n  closest: false,\n  from: 'shadow' as QueryRoot | undefined,\n  fallback: null\n} as const satisfies QuerySingleOptions<Element, QueryHost>;\n\nconst resolveFallback = <TResult, THost extends QueryHost>(\n  fallback: QueryFallback<TResult, THost> | undefined,\n  host: THost\n): TResult | undefined => {\n  if (typeof fallback === 'function') {\n    return (fallback as (instance: THost) => TResult)(host);\n  }\n\n  return fallback;\n};\n\nconst resolveRoot = (host: QueryHost, option: QueryRoot | undefined): ParentNode | null => {\n  switch (option) {\n    case 'document':\n      return document;\n    case 'light':\n      return host;\n    default:\n      return host.renderRoot ?? host.shadowRoot ?? host;\n  }\n};\n\nconst resolveQuery = <\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n>(\n  host: THost,\n  selector: string,\n  options: TOptions\n) => {\n  if (options.closest) {\n    const result = host.closest(selector);\n    return result ?? resolveFallback(options.fallback as QueryFallback<Element | null, THost>, host) ?? null;\n  }\n\n  const root = resolveRoot(host, options.from);\n\n  if (!root) {\n    return options.all\n      ? (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? [])\n      : (resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null);\n  }\n\n  if (options.all) {\n    const elements = Array.from(root.querySelectorAll<TElement>(selector));\n    return elements.length > 0\n      ? elements\n      : (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? []);\n  }\n\n  const match = root.querySelector<TElement>(selector);\n  return match ?? resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null;\n};\n\nconst createQueryDecorator = <\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n>(\n  selector: string,\n  options: TOptions\n): QueryDecorator<TElement, THost, TOptions> => {\n  type Result = QueryReturnType<TElement, THost, TOptions>;\n\n  return (\n    _target: ClassAccessorDecoratorTarget<THost, Result> | undefined,\n    context: ClassFieldDecoratorContext<THost, Result> | ClassAccessorDecoratorContext<THost, Result>\n  ): ClassAccessorDecoratorResult<THost, Result> | undefined => {\n    if (context.kind === 'accessor') {\n      const descriptor: ClassAccessorDecoratorResult<THost, Result> = {\n        get(this: THost) {\n          return resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result;\n        },\n        set(_value: Result) {\n          // Readonly accessor\n        }\n      };\n      return descriptor;\n    }\n\n    context.addInitializer(function (this: THost) {\n      Object.defineProperty(this, context.name, {\n        configurable: true,\n        enumerable: true,\n        get: () => resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result\n      });\n    });\n\n    return;\n  };\n};\n\nexport function Query<\n  TElement extends Element,\n  THost extends QueryHost,\n  TOptions extends QueryOptions<TElement, THost>\n>(selector: string, userOptions: TOptions): QueryDecorator<TElement, THost, TOptions>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n  selector: string\n): QueryDecorator<TElement, THost, QuerySingleOptions<TElement, THost>>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n  selector: string,\n  userOptions?: QueryOptions<TElement, THost>\n) {\n  if (!selector) {\n    throw new Error('@Query requires a selector.');\n  }\n\n  if (userOptions) {\n    const merged = { ...defaultOptions, ...userOptions } as QueryOptions<TElement, THost>;\n    return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n  }\n\n  const merged = defaultOptions as QuerySingleOptions<TElement, THost>;\n  return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n}\n","type RenderHost = HTMLElement & {\n  requestRender?(): void;\n  render?(): void;\n};\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n  if (typeof instance.requestRender === 'function') {\n    instance.requestRender();\n    return;\n  }\n\n  if (typeof instance.render !== 'function') {\n    return;\n  }\n\n  if (renderQueue.get(instance)) {\n    return;\n  }\n\n  renderQueue.set(instance, true);\n\n  requestAnimationFrame(() => {\n    renderQueue.set(instance, false);\n\n    instance.render?.();\n  });\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\ninterface WatchOptions<TValue, THost extends RenderHost> {\n  compare?: (previous: TValue, next: TValue) => boolean;\n  onChange?: (this: THost, next: TValue, previous: TValue) => void;\n  transform?: (this: THost, initial: TValue) => TValue;\n}\n\nexport function Watch<TValue, THost extends RenderHost = RenderHost>(options: WatchOptions<TValue, THost> = {}) {\n  const { compare = defaultCompare, onChange, transform } = options;\n\n  return (\n    accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n    context: ClassAccessorDecoratorContext<THost, TValue>\n  ): ClassAccessorDecoratorResult<THost, TValue> => {\n    if (context.kind !== 'accessor') {\n      throw new Error('@Watch requires the \"accessor\" keyword on the property.');\n    }\n\n    return {\n      get(this: THost): TValue {\n        return accessor.get.call(this);\n      },\n      set(this: THost, value: TValue): void {\n        const previous = accessor.get.call(this);\n\n        if (compare(previous, value)) {\n          return;\n        }\n\n        accessor.set.call(this, value);\n\n        if (onChange) {\n          onChange.call(this, value, previous);\n        }\n\n        scheduleRender(this);\n      },\n      init(this: THost, initialValue: TValue): TValue {\n        if (transform) {\n          return transform.call(this, initialValue);\n        }\n\n        return initialValue;\n      }\n    };\n  };\n}\n","export { Button } from './button';\nexport { Checkbox } from './checkbox';\nexport { ColorInput } from './color';\nexport { ColorPicker } from './color/picker';\nexport { Dropdown } from './dropdown';\nexport { Field } from './field';\nexport { Folder, type FolderToggleEventDetail } from './folder';\nexport * from './icons';\nexport { Input } from './input';\nexport * from './logo';\nexport { Monitor } from './monitor';\nexport { MonitorFps } from './monitor/fps';\nexport { NumberInput } from './number';\nexport { Origin } from './origin';\nexport { Panel, type TabChangeEventDetail } from './panel';\nexport { type Placement, Popover } from './popover';\nexport { RadioGroup } from './radio';\nexport { RadioInput } from './radio/input';\nexport { RadioOption } from './radio/option';\nexport {\n  CONTROL_CHANGE_EVENT,\n  type ControlEventDetail,\n  coerceNumber,\n  dispatchControlEvent,\n  readControlValue,\n  setBooleanAttribute\n} from './shared';\nexport { Slider } from './slider';\nexport { State, type StateChangeEventDetail } from './state';\nexport { Toggle } from './toggle';\nexport { Tooltip } from './tooltip';\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\n/**\n * Event detail for folder toggle events\n */\nexport interface FolderToggleEventDetail {\n  /** Whether the folder is open */\n  open: boolean;\n  /** The original event */\n  event: Event;\n}\n\n/**\n * Folder component - collapsible container for grouping controls.\n *\n * Click on the header to toggle open/closed state.\n * Supports optional max-height with scroll fade masks.\n *\n * @tag ease-folder\n *\n * @slot headline - Folder title text\n * @slot actions - Header action buttons (displayed on the right)\n * @slot - Default slot for folder content\n *\n * @csspart section - Outer container\n * @csspart header - Clickable header row\n * @csspart headline - Title element\n * @csspart icon - Folder icon\n * @csspart chevron - Chevron icon\n * @csspart actions - Actions container\n * @csspart content - Content wrapper (handles height animations)\n * @csspart body - Inner body container (scrollable when max-height is set)\n * @csspart items - Grid container for slotted content\n *\n * @fires folder-toggle - Fired when the folder is opened or closed\n */\n@Component({\n  tag: 'ease-folder',\n  styles: `\n    @property --top-fade {\n      syntax: \"<length>\";\n      inherits: false;\n      initial-value: 0px;\n    }\n\n    @property --bottom-fade {\n      syntax: \"<length>\";\n      inherits: false;\n      initial-value: 0px;\n    }\n\n    @keyframes scroll-fade {\n      0% {\n        --top-fade: 0px;\n      }\n      10%, 100% {\n        --top-fade: 8px;\n      }\n      0%, 90% {\n        --bottom-fade: 8px;\n      }\n      100% {\n        --bottom-fade: 0px;\n      }\n    }\n\n\n    :host {\n      display: block;\n      width: 100%;\n      interpolate-size: allow-keywords;\n    }\n\n    [part=\"section\"] {\n      display: block;\n      width: 100%;\n      border-radius: var(--ease-folder-radius);\n      border: 1px solid var(--ease-folder-border-color);\n      background-color: var(--ease-folder-background);\n      background-clip: padding-box;\n      box-sizing: border-box;\n      overflow: hidden;\n    }\n\n    [part=\"header\"] {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      width: 100%;\n      padding: var(--ease-folder-padding);\n      box-sizing: border-box;\n      cursor: pointer;\n      user-select: none;\n    }\n\n    [part=\"icon\"] {\n      flex: 0 0 auto;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      color: var(--ease-folder-icon-color);\n    }\n\n    [part=\"headline\"] {\n      flex: 1 1 auto;\n      font-size: var(--ease-folder-title-font-size);\n      font-weight: var(--ease-folder-title-font-weight);\n      line-height: 16px;\n      font-family: var(--ease-font-family);\n      color: var(--ease-folder-title-color);\n      margin: 0;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n\n    [part=\"chevron\"] {\n      flex: 0 0 auto;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      color: var(--ease-folder-chevron-color);\n      transition: color 200ms cubic-bezier(.25, 0, .5, 1);\n    }\n\n    [part=\"header\"]:hover [part=\"chevron\"] {\n      color: var(--ease-folder-chevron-color-hover);\n    }\n\n    [part=\"content\"] {\n      height: 0;\n      overflow: hidden;\n      transition: height 200ms cubic-bezier(.25, 0, .5, 1) !important;\n    }\n\n    :host([open]) [part=\"content\"] {\n      height: auto;\n    }\n\n    [part=\"body\"] {\n      display: grid;\n      grid-gap: var(--ease-folder-gap);\n      padding: var(--ease-folder-padding);\n      overflow-y: auto;\n      overscroll-behavior: none;\n      mask-image: linear-gradient(to bottom, #0000, #ffff var(--top-fade) calc(100% - var(--bottom-fade)), #0000);\n      animation-name: scroll-fade;\n      animation-timeline: scroll(self y);\n      scroll-snap-type: y mandatory;\n      scrollbar-width: none;\n\n       &::-webkit-scrollbar {\n        display: none;\n      }\n    }\n\n  `\n})\nexport class Folder extends HTMLElement {\n  @Prop<boolean>({\n    type: Boolean,\n    reflect: true,\n    attribute: 'open',\n    defaultValue: false\n  })\n  accessor open: boolean = false;\n\n  @Prop<string | null>({\n    reflect: true,\n    attribute: 'headline',\n    defaultValue: ''\n  })\n  accessor headline: string | null = null;\n\n  @Prop<string | null>({\n    reflect: true,\n    attribute: 'max-height',\n    defaultValue: null\n  })\n  accessor maxHeight: string | null = null;\n\n  render(): TemplateResult {\n    return html`\n      <section part=\"section\">\n        <div part=\"header\" @click=${this.#handleHeaderClick}>\n          <span part=\"icon\">\n            <ease-icon-folder state=${this.open ? 'open' : 'close'}></ease-icon-folder>\n          </span>\n          <span part=\"headline\">\n            ${this.headline}\n          </span>\n          <span part=\"chevron\">\n            <ease-icon-chevron state=${this.open ? 'up' : 'down'}></ease-icon-chevron>\n          </span>\n        </div>\n        <div part=\"content\">\n          <div part=\"body\" style=${this.maxHeight ? `max-height: ${this.maxHeight}` : ''}>\n            <slot></slot>\n          </div>\n        </div>\n      </section>\n    `;\n  }\n\n  toggle(): void {\n    this.open = !this.open;\n  }\n\n  #handleHeaderClick = (event: MouseEvent): void => {\n    this.toggle();\n\n    this.dispatchEvent(\n      new CustomEvent<FolderToggleEventDetail>('folder-toggle', {\n        detail: { open: this.open, event },\n        bubbles: true,\n        composed: true\n      })\n    );\n  };\n\n  #stopPropagation = (event: MouseEvent): void => {\n    event.stopPropagation();\n  };\n}\n","export * from './animation/chevron';\nexport * from './animation/clear';\nexport * from './animation/folder';\nexport * from './animation/grid';\nexport * from './animation/loading';\nexport * from './animation/snap';\nexport * from './interface/anchor-add';\nexport * from './interface/anchor-remove';\nexport * from './interface/arrow-up';\nexport * from './interface/arrows-vertical';\nexport * from './interface/bezier';\nexport * from './interface/bezier-angle';\nexport * from './interface/bezier-distribute';\nexport * from './interface/bezier-length';\nexport * from './interface/bezier-mirror';\nexport * from './interface/check';\nexport * from './interface/circle-arrow-left';\nexport * from './interface/circle-arrow-right';\nexport * from './interface/code';\nexport * from './interface/dots';\nexport * from './interface/mention';\nexport * from './interface/minus';\nexport * from './interface/picker';\nexport * from './interface/plus';\nexport * from './interface/settings';\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\ntype FolderState = 'open' | 'close';\n\n@Component({\n  tag: 'ease-icon-folder',\n  styles: `\n    :host {\n      display: contents;\n    }\n\n    [part=\"folder\"] {\n      display: block;\n      position: relative;\n      width: var(--ease-icon-size, 16px);\n      height: var(--ease-icon-size, 16px);\n    }\n\n    [part=\"folder\"]::before {\n      content: '';\n      position: absolute;\n      z-index: 1;\n      width: 12px;\n      height: 6px;\n      top: 6px;\n      left: 50%;\n      transform: translate(-50%, .5px);\n      background-color: currentColor;\n      border-radius: 3px 3px 1px 1px;\n      transform-origin: 50% 100%;\n      transition: transform 200ms cubic-bezier(.25, 0, .5, 1);\n    }\n\n    [part=\"folder\"][data-state=\"open\"]::before {\n      transform: translate(-50%, .5px) scaleY(0.85) skewX(-28deg);\n    }\n\n    svg {\n      display: block;\n      width: var(--ease-icon-size, 16px);\n      height: var(--ease-icon-size, 16px);\n      fill: none;\n      stroke: currentColor;\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n  `,\n  observedAttributes: ['state']\n})\nexport class IconFolder extends HTMLElement {\n  declare requestRender: () => void;\n\n  @Prop<FolderState>({\n    reflect: true,\n    attribute: 'state',\n    defaultValue: 'close'\n  })\n  accessor state!: FolderState;\n\n  render(): TemplateResult {\n    return html`\n      <div part=\"folder\" data-state=${this.state}>\n        <svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n          <path d=\"M2 11V5C2 3.89543 2.89543 3 4 3H5.5C6.12951 3 6.72229 3.29639 7.1 3.8L7.4 4.2C7.77771 4.70361 8.37049 5 9 5H12C13.1046 5 14 5.89543 14 7V11C14 12.1046 13.1046 13 12 13H4C2.89543 13 2 12.1046 2 11Z\" />\n        </svg>\n      </div>\n    `;\n  }\n}\n","/**\n * Color scale levels\n */\nexport type ColorScale = {\n  100?: string;\n  200?: string;\n  300?: string;\n  400?: string;\n  500?: string;\n  600?: string;\n  700?: string;\n  800?: string;\n  900?: string;\n  1000?: string;\n  1100?: string;\n};\n\n/**\n * Gray color scale with additional intermediate values\n */\nexport type GrayScale = ColorScale & {\n  0?: string;\n  825?: string;\n  850?: string;\n  875?: string;\n};\n\n/**\n * Alpha color variations\n */\nexport type AlphaColors = {\n  0?: string;\n  1?: string;\n  2?: string;\n  4?: string;\n  6?: string;\n  8?: string;\n  10?: string;\n  12?: string;\n  15?: string;\n  20?: string;\n  30?: string;\n  40?: string;\n  50?: string;\n  70?: string;\n  80?: string;\n  90?: string;\n};\n\n/**\n * Color palette configuration\n */\nexport interface ColorPalette {\n  /** Gray scale colors */\n  gray?: GrayScale;\n  /** Blue scale colors */\n  blue?: ColorScale;\n  /** Green scale colors */\n  green?: ColorScale;\n  /** Red scale colors */\n  red?: ColorScale;\n  /** Orange scale colors */\n  orange?: ColorScale;\n  /** Yellow scale colors */\n  yellow?: ColorScale;\n  /** Base white color */\n  white?: string;\n  /** Base black color */\n  black?: string;\n  /** White alpha variations */\n  whiteAlpha?: AlphaColors;\n  /** Black alpha variations */\n  blackAlpha?: AlphaColors;\n  /** Foreground color */\n  foreground?: string;\n}\n\n/**\n * Border radius configuration\n */\nexport interface RadiiConfig {\n  /** Small radius (4px default) */\n  sm?: string;\n  /** Medium radius (8px default) */\n  md?: string;\n  /** Large radius (12px default) */\n  lg?: string;\n  /** Extra large radius (16px default) */\n  xl?: string;\n  /** Full/pill radius */\n  full?: string;\n}\n\n/**\n * Spacing configuration\n */\nexport interface SpacingConfig {\n  /** Extra small spacing */\n  xs?: string;\n  /** Small spacing */\n  sm?: string;\n  /** Medium spacing */\n  md?: string;\n  /** Large spacing */\n  lg?: string;\n  /** Extra large spacing */\n  xl?: string;\n}\n\n/**\n * Typography configuration\n */\nexport interface TypographyConfig {\n  /** Font family for body text */\n  fontFamily?: string;\n  /** Font family for monospace/code */\n  fontMono?: string;\n  /** Base font size */\n  fontSize?: string;\n  /** Line height */\n  lineHeight?: string;\n}\n\n/**\n * Arbitrary CSS custom properties to apply alongside the theme tokens.\n *\n * Keys may be provided with or without the `--` prefix.\n *\n * @example\n * ```ts\n * vars: {\n *   '--ease-panel-padding': '16px',\n *   'ease-field-label-width': '40%'\n * }\n * ```\n */\nexport type ThemeVars = Record<string, string | number | null | undefined>;\n\n/**\n * Complete theme configuration\n */\nexport interface ThemeConfig {\n  /** Color palette */\n  colors?: ColorPalette;\n  /** Border radii */\n  radii?: RadiiConfig;\n  /** Spacing values */\n  spacing?: SpacingConfig;\n  /** Typography settings */\n  typography?: TypographyConfig;\n  /**\n   * Extra CSS variables (component tokens, app tokens, etc).\n   * This is the recommended place to set `--ease-*` variables.\n   */\n  vars?: ThemeVars;\n}\n\n/**\n * Default color values (oklab)\n */\nexport const defaultColors: Required<ColorPalette> = {\n  gray: {\n    0: 'oklab(98.81% 0 0)',\n    100: 'oklab(97.64% 0.0004 -0.0013)',\n    300: 'oklab(93.49% 0.0011 -0.0039)',\n    400: 'oklab(89.52% 0.0009 -0.0068)',\n    500: 'oklab(81.71% -0.0002 -0.0073)',\n    600: 'oklab(65.21% -0.0019 -0.0144)',\n    700: 'oklab(37.92% -0.0006 -0.0179)',\n    800: 'oklab(28.45% -0.0012 -0.0118)',\n    825: 'oklab(26.45% -0.0012 -0.0105)',\n    850: 'oklab(24.50% -0.0012 -0.0105)',\n    875: 'oklab(22.66% -0.0009 -0.0097)',\n    900: 'oklab(20.68% -0.0006 -0.0065)',\n    1000: 'oklab(18.81% -0.0012 -0.006)'\n  },\n  blue: {\n    100: 'oklab(98.65% 0.0019 -0.0063)',\n    200: 'oklab(97.45% 0.0057 -0.0121)',\n    300: 'oklab(95.88% 0.0086 -0.0183)',\n    400: 'oklab(91.21% 0.0179 -0.0399)',\n    500: 'oklab(84.61% 0.0327 -0.0725)',\n    600: 'oklab(76.85% 0.0462 -0.1115)',\n    700: 'oklab(68.28% 0.0582 -0.1575)',\n    800: 'oklab(59.36% 0.0641 -0.2083)',\n    900: 'oklab(50.69% 0.0492 -0.2575)',\n    1000: 'oklab(46.82% 0.0475 -0.2273)',\n    1100: 'oklch(0.4013 0.171 284.66)'\n  },\n  green: {\n    100: 'oklab(98.44% -0.009 0.0042)',\n    200: 'oklab(97.57% -0.0127 0.0058)',\n    300: 'oklab(96.32% -0.0176 0.0071)',\n    400: 'oklab(93.66% -0.0341 0.0149)',\n    500: 'oklab(89.96% -0.0529 0.0237)',\n    600: 'oklab(85.44% -0.0759 0.0346)',\n    700: 'oklab(80.59% -0.1005 0.0484)',\n    800: 'oklab(75.87% -0.1245 0.0639)',\n    900: 'oklab(71.18% -0.1439 0.0799)',\n    1000: 'oklab(64.89% -0.1265 0.0677)'\n  },\n  red: {\n    100: 'oklab(99.04% 0.0031 0.0009)',\n    200: 'oklab(97.85% 0.0072 0.0022)',\n    300: 'oklab(95.52% 0.0159 0.0036)',\n    400: 'oklab(89.9% 0.037 0.0091)',\n    500: 'oklab(82.78% 0.0664 0.0181)',\n    600: 'oklab(74.46% 0.105 0.031)',\n    700: 'oklab(65.73% 0.1467 0.0503)',\n    800: 'oklab(58.28% 0.1811 0.0773)',\n    900: 'oklab(53.11% 0.1914 0.1028)',\n    1000: 'oklab(48.4% 0.1727 0.0903)'\n  },\n  orange: {\n    100: 'oklab(99.47% 0.0009 0.0044)',\n    200: 'oklab(98.95% 0.0018 0.0088)',\n    300: 'oklab(97.58% 0.0073 0.0133)',\n    400: 'oklab(94.81% 0.0136 0.0305)',\n    500: 'oklab(90.97% 0.0248 0.0519)',\n    600: 'oklab(86.55% 0.0389 0.0778)',\n    700: 'oklab(81.73% 0.0568 0.1053)',\n    800: 'oklab(77.05% 0.0777 0.1296)',\n    900: 'oklab(72.25% 0.108 0.143)',\n    1000: 'oklab(65.81% 0.092 0.1281)'\n  },\n  yellow: {\n    100: 'oklab(99.14% 0.0004 0.0098)',\n    200: 'oklab(97.98% 0.0003 0.0248)',\n    300: 'oklab(96.81% -0.0002 0.0409)',\n    400: 'oklab(95.68% -0.0003 0.0555)',\n    500: 'oklab(91.97% 0.0002 0.102)',\n    600: 'oklab(88.75% 0.0018 0.1409)',\n    700: 'oklab(85.67% 0.0101 0.1648)',\n    800: 'oklab(76.85% 0.0212 0.1568)'\n  },\n  white: 'oklab(95.14% -0.0013 -0.0186)',\n  black: 'oklab(0% 0 0)',\n  whiteAlpha: {\n    0: 'oklab(95.14% -0.0013 -0.0186 / 0)',\n    1: 'oklab(95.14% -0.0013 -0.0186 / 0.0125)',\n    2: 'oklab(95.14% -0.0013 -0.0186 / 0.02)',\n    4: 'oklab(95.14% -0.0013 -0.0186 / 0.04)',\n    6: 'oklab(95.14% -0.0013 -0.0186 / 0.06)',\n    8: 'oklab(95.14% -0.0013 -0.0186 / 0.08)',\n    10: 'oklab(95.14% -0.0013 -0.0186 / 0.1)',\n    12: 'oklab(95.14% -0.0013 -0.0186 / 0.12)',\n    15: 'oklab(95.14% -0.0013 -0.0186 / 0.15)',\n    20: 'oklab(95.14% -0.0013 -0.0186 / 0.2)',\n    30: 'oklab(95.14% -0.0013 -0.0186 / 0.3)',\n    40: 'oklab(95.14% -0.0013 -0.0186 / 0.4)',\n    50: 'oklab(95.14% -0.0013 -0.0186 / 0.5)',\n    70: 'oklab(95.14% -0.0013 -0.0186 / 0.7)',\n    80: 'oklab(95.14% -0.0013 -0.0186 / 0.8)',\n    90: 'oklab(95.14% -0.0013 -0.0186 / 0.9)'\n  },\n  blackAlpha: {\n    0: 'oklab(0% 0 0 / 0)',\n    2: 'oklab(0% 0 0 / 0.02)',\n    4: 'oklab(0% 0 0 / 0.04)',\n    6: 'oklab(0% 0 0 / 0.06)',\n    8: 'oklab(0% 0 0 / 0.08)',\n    10: 'oklab(0% 0 0 / 0.1)',\n    12: 'oklab(0% 0 0 / 0.12)',\n    15: 'oklab(0% 0 0 / 0.15)',\n    20: 'oklab(0% 0 0 / 0.2)',\n    30: 'oklab(0% 0 0 / 0.3)',\n    40: 'oklab(0% 0 0 / 0.4)',\n    50: 'oklab(0% 0 0 / 0.5)',\n    70: 'oklab(0% 0 0 / 0.7)',\n    80: 'oklab(0% 0 0 / 0.8)',\n    90: 'oklab(0% 0 0 / 0.9)'\n  },\n  foreground: 'var(--color-gray-0)'\n};\n\n/**\n * Default border radius values\n */\nexport const defaultRadii: Required<RadiiConfig> = {\n  sm: '4px',\n  md: '8px',\n  lg: '12px',\n  xl: '16px',\n  full: '9999px'\n};\n\n/**\n * Default spacing values\n */\nexport const defaultSpacing: Required<SpacingConfig> = {\n  xs: '4px',\n  sm: '8px',\n  md: '12px',\n  lg: '16px',\n  xl: '24px'\n};\n\n/**\n * Default typography values\n */\nexport const defaultTypography: Required<TypographyConfig> = {\n  fontFamily: '\"Instrument Sans\", system-ui, sans-serif',\n  fontMono: '\"Geist Mono\", monospace',\n  fontSize: '13px',\n  lineHeight: '1.5'\n};\n","import type { ThemeConfig, ThemeVars } from './tokens';\n\nimport { defaultColors, defaultRadii, defaultSpacing, defaultTypography } from './tokens';\n\n/**\n * Default ease UI kit CSS variables (--ease-*).\n * These are component-level design tokens that components consume.\n */\nexport const defaultEaseVars: ThemeVars = {\n  // Typography aliases\n  '--ease-font-family': 'var(--font-family)',\n  '--ease-font-mono': 'var(--font-mono)',\n  '--ease-font-size': 'var(--font-size)',\n  '--ease-font-size-sm': '12px',\n  '--ease-line-height': 'var(--font-line-height)',\n\n  // Panel (ease-state)\n  '--ease-panel-max-width': '332px',\n  '--ease-panel-padding': 'var(--spacing-md)',\n  '--ease-panel-radius': 'var(--radii-lg)',\n  '--ease-panel-border-color': 'var(--color-white-6)',\n  '--ease-panel-background': 'var(--color-gray-1000)',\n  '--ease-panel-shadow': '0 0 40px 0 var(--color-white-2) inset',\n  '--ease-panel-title-font-size': '14px',\n  '--ease-panel-title-font-weight': '500',\n  '--ease-panel-title-line-height': '24px',\n  '--ease-panel-title-color': 'var(--color-blue-100)',\n\n  // Panel additional tokens\n  '--ease-panel-gap': 'var(--spacing-md)',\n  '--ease-panel-headline-font-size': 'var(--ease-font-size)',\n  '--ease-panel-headline-font-weight': '500',\n  '--ease-panel-headline-line-height': '24px',\n  '--ease-panel-headline-color': 'var(--color-blue-100)',\n  '--ease-panel-header-spacing': 'var(--spacing-sm)',\n  '--ease-panel-fade-size': '12px',\n\n  // Panel tab tokens\n  '--ease-panel-tab-font-size': 'var(--ease-font-size)',\n  '--ease-panel-tab-font-weight': '500',\n  '--ease-panel-tab-color': 'var(--color-gray-600)',\n  '--ease-panel-tab-color-hover': 'var(--color-blue-100)',\n  '--ease-panel-tab-color-active': 'var(--color-blue-100)',\n  '--ease-panel-tab-background-active': 'var(--color-white-4)',\n  '--ease-panel-tab-radius': 'var(--radii-sm)',\n\n  // Folder (ease-folder)\n  '--ease-folder-padding': 'var(--spacing-sm)',\n  '--ease-folder-radius': 'var(--radii-md)',\n  '--ease-folder-border-color': 'var(--color-white-4)',\n  '--ease-folder-background': 'var(--color-white-1)',\n  '--ease-folder-shadow': '0 0 24px 0 var(--color-white-2) inset',\n  '--ease-folder-icon-color': 'var(--color-gray-0)',\n  '--ease-folder-chevron-color': 'var(--color-gray-600)',\n  '--ease-folder-chevron-color-hover': 'var(--color-gray-400)',\n  '--ease-folder-title-font-size': 'var(--ease-font-size)',\n  '--ease-folder-title-font-weight': '500',\n  '--ease-folder-title-color': 'var(--color-gray-400)',\n  '--ease-folder-gap': 'var(--spacing-sm)',\n  '--ease-folder-fade-size': '16px',\n\n  // Field (ease-field)\n  '--ease-field-label-width': '36%',\n  '--ease-field-column-gap': 'var(--spacing-md)',\n  '--ease-field-row-gap': '6px',\n  '--ease-field-min-height': '30px',\n  '--ease-field-label-font-size': 'var(--ease-font-size-sm)',\n  '--ease-field-label-color': 'var(--color-gray-600)',\n  '--ease-field-label-padding-left': '4px'\n};\n\n/**\n * The complete default (dark) theme configuration.\n * Includes colors, radii, spacing, typography, and component-level --ease-* vars.\n */\nexport const defaultThemeConfig: ThemeConfig = {\n  colors: defaultColors,\n  radii: defaultRadii,\n  spacing: defaultSpacing,\n  typography: defaultTypography,\n  vars: defaultEaseVars\n};\n\n/**\n * Default built-in theme name.\n */\nexport const DEFAULT_THEME_NAME = 'default' as const;\n\n/**\n * Legacy alias for the built-in dark theme.\n */\nexport const DARK_THEME_ALIAS = 'dark' as const;\n","import type { ThemeConfig } from './tokens';\n\nimport { DARK_THEME_ALIAS, DEFAULT_THEME_NAME, defaultThemeConfig } from './presets';\n\n// --------------------------\n// Type definitions\n// --------------------------\n\n/**\n * Built-in theme names that ship with the library.\n */\nexport type BuiltInThemeName = 'default' | 'dark';\n\n/**\n * Theme name type - accepts built-in names plus any custom string.\n * The built-in names provide autocomplete while allowing any string.\n */\nexport type WebKitThemeName = BuiltInThemeName | (string & {});\n\n/**\n * A strongly-typed theme reference.\n * Returned by `registerTheme()` for type-safe theme references.\n *\n * @example\n * ```ts\n * const myTheme = registerTheme('custom', { config: {...} });\n * initWebKit({ theme: myTheme }); // Type-safe reference\n * ```\n */\nexport interface WebKitThemeRef<Name extends string = string> {\n  readonly __brand: 'WebKitThemeRef';\n  readonly name: Name;\n}\n\n/**\n * Valid theme input for APIs: a theme name string, a theme ref, or an inline config.\n *\n * @example\n * ```ts\n * // All valid:\n * initWebKit({ theme: 'default' });           // Built-in name\n * initWebKit({ theme: 'my-custom-theme' });   // Custom string\n * initWebKit({ theme: myThemeRef });          // Theme ref from registerTheme()\n * initWebKit({ theme: { colors: {...} } });   // Inline config\n * ```\n */\nexport type ThemeInput = WebKitThemeName | WebKitThemeRef | ThemeConfig;\n\n/**\n * Options for registering a theme.\n */\nexport interface RegisterThemeOptions {\n  /**\n   * Base theme to extend from.\n   * - `'default'` (or any registered name) - extends that theme\n   * - `null` - no base, starts from scratch\n   * - `undefined` - defaults to `'default'`\n   */\n  base?: string | WebKitThemeRef | null;\n  /**\n   * Theme configuration (overrides on top of base).\n   */\n  config?: ThemeConfig;\n}\n\n/**\n * Resolved theme entry in the registry.\n */\ninterface ThemeEntry {\n  name: string;\n  base: string | null;\n  config: ThemeConfig;\n  resolved: ThemeConfig | null; // lazily computed\n}\n\n// --------------------------\n// Registry implementation\n// --------------------------\n\nconst registry = new Map<string, ThemeEntry>();\n\n/**\n * Deep merge two theme configs.\n */\nconst mergeConfigs = (base: ThemeConfig, overrides: ThemeConfig): ThemeConfig => {\n  return {\n    colors: {\n      ...base.colors,\n      ...overrides.colors,\n      gray: { ...base.colors?.gray, ...overrides.colors?.gray },\n      blue: { ...base.colors?.blue, ...overrides.colors?.blue },\n      green: { ...base.colors?.green, ...overrides.colors?.green },\n      red: { ...base.colors?.red, ...overrides.colors?.red },\n      orange: { ...base.colors?.orange, ...overrides.colors?.orange },\n      yellow: { ...base.colors?.yellow, ...overrides.colors?.yellow },\n      whiteAlpha: { ...base.colors?.whiteAlpha, ...overrides.colors?.whiteAlpha },\n      blackAlpha: { ...base.colors?.blackAlpha, ...overrides.colors?.blackAlpha }\n    },\n    radii: { ...base.radii, ...overrides.radii },\n    spacing: { ...base.spacing, ...overrides.spacing },\n    typography: { ...base.typography, ...overrides.typography },\n    vars: { ...base.vars, ...overrides.vars }\n  };\n};\n\n/**\n * Resolve a theme by name, following base chain.\n */\nconst resolveThemeConfig = (name: string, visited = new Set<string>()): ThemeConfig => {\n  if (visited.has(name)) {\n    throw new Error(`[web-kit] Circular theme dependency detected: ${Array.from(visited).join(' -> ')} -> ${name}`);\n  }\n\n  const entry = registry.get(name);\n  if (!entry) {\n    throw new Error(`[web-kit] Theme \"${name}\" is not registered.`);\n  }\n\n  // Return cached resolution\n  if (entry.resolved) {\n    return entry.resolved;\n  }\n\n  visited.add(name);\n\n  let resolved: ThemeConfig;\n  if (entry.base === null) {\n    // No base - use config as-is\n    resolved = entry.config;\n  } else {\n    // Resolve base first\n    const baseConfig = resolveThemeConfig(entry.base, visited);\n    resolved = mergeConfigs(baseConfig, entry.config);\n  }\n\n  // Cache the resolution\n  entry.resolved = resolved;\n  return resolved;\n};\n\n/**\n * Initialize built-in themes.\n */\nconst initBuiltInThemes = (): void => {\n  if (registry.has(DEFAULT_THEME_NAME)) {\n    return;\n  }\n\n  // Register 'default' theme\n  registry.set(DEFAULT_THEME_NAME, {\n    name: DEFAULT_THEME_NAME,\n    base: null,\n    config: defaultThemeConfig,\n    resolved: defaultThemeConfig\n  });\n\n  // Register 'dark' as alias to 'default'\n  registry.set(DARK_THEME_ALIAS, {\n    name: DARK_THEME_ALIAS,\n    base: DEFAULT_THEME_NAME,\n    config: {},\n    resolved: null\n  });\n};\n\n// Initialize on module load\ninitBuiltInThemes();\n\n// --------------------------\n// Public API\n// --------------------------\n\n/**\n * Check if a value is a theme ref.\n */\nexport const isThemeRef = (value: unknown): value is WebKitThemeRef =>\n  typeof value === 'object' && value !== null && '__brand' in value && value.__brand === 'WebKitThemeRef';\n\n/**\n * Check if a value is a theme config object.\n */\nexport const isThemeConfig = (value: unknown): value is ThemeConfig => {\n  if (typeof value !== 'object' || value === null) {\n    return false;\n  }\n  if (isThemeRef(value)) {\n    return false;\n  }\n  // Check if it looks like a ThemeConfig\n  const obj = value as Record<string, unknown>;\n  return (\n    obj.colors !== undefined ||\n    obj.radii !== undefined ||\n    obj.spacing !== undefined ||\n    obj.typography !== undefined ||\n    obj.vars !== undefined\n  );\n};\n\n/**\n * Register a custom theme.\n *\n * @param name - Theme name (must be unique)\n * @param options - Theme options (base + config)\n * @returns A typed theme reference\n *\n * @example\n * ```ts\n * const custom = registerTheme('custom', {\n *   base: 'default',\n *   config: {\n *     vars: { '--ease-panel-radius': '14px' }\n *   }\n * });\n *\n * initWebKit({ theme: custom });\n * ```\n */\nexport function registerTheme<Name extends string>(\n  name: Name,\n  options: RegisterThemeOptions = {}\n): WebKitThemeRef<Name> {\n  const { base = DEFAULT_THEME_NAME, config = {} } = options;\n\n  // Resolve base name\n  let baseName: string | null = null;\n  if (base !== null) {\n    baseName = isThemeRef(base) ? base.name : base;\n    // Validate base exists\n    if (!registry.has(baseName)) {\n      throw new Error(`[web-kit] Base theme \"${baseName}\" is not registered.`);\n    }\n  }\n\n  // Invalidate cache for themes that depend on this one (if re-registering)\n  if (registry.has(name)) {\n    for (const entry of registry.values()) {\n      if (entry.base === name) {\n        entry.resolved = null;\n      }\n    }\n  }\n\n  registry.set(name, {\n    name,\n    base: baseName,\n    config,\n    resolved: null\n  });\n\n  return {\n    __brand: 'WebKitThemeRef',\n    name\n  } as WebKitThemeRef<Name>;\n}\n\n/**\n * Get a theme's resolved configuration.\n *\n * @param theme - Theme name, ref, or inline config\n * @returns Resolved theme configuration\n */\nexport function getTheme(theme: ThemeInput): ThemeConfig {\n  if (isThemeConfig(theme)) {\n    return theme;\n  }\n\n  const name = isThemeRef(theme) ? theme.name : theme;\n  return resolveThemeConfig(name);\n}\n\n/**\n * Check if a theme is registered.\n */\nexport function hasTheme(name: string): boolean {\n  return registry.has(name);\n}\n\n/**\n * Get all registered theme names.\n */\nexport function getThemeNames(): string[] {\n  return Array.from(registry.keys());\n}\n\n/**\n * Create a theme ref for a registered theme name.\n * Throws if the theme is not registered.\n *\n * @example\n * ```ts\n * const ref = themeRef('default'); // Get ref for built-in theme\n * const customRef = themeRef('my-theme'); // Get ref for registered theme\n * ```\n */\nexport function themeRef<Name extends string>(name: Name): WebKitThemeRef<Name> {\n  if (!registry.has(name)) {\n    throw new Error(`[web-kit] Theme \"${name}\" is not registered.`);\n  }\n  return {\n    __brand: 'WebKitThemeRef',\n    name\n  } as WebKitThemeRef<Name>;\n}\n","import {\n  type ColorPalette,\n  defaultColors,\n  defaultRadii,\n  defaultSpacing,\n  defaultTypography,\n  type RadiiConfig,\n  type SpacingConfig,\n  type ThemeConfig,\n  type ThemeVars,\n  type TypographyConfig\n} from './tokens';\n\nexport * from './presets';\nexport * from './registry';\nexport * from './tokens';\n\n/**\n * CSS variable prefix\n */\nconst CSS_PREFIX = '--color';\nconst RADII_PREFIX = '--radii';\nconst SPACING_PREFIX = '--spacing';\nconst TYPOGRAPHY_PREFIX = '--font';\n\n/**\n * Convert a nested object path to CSS variable name\n * e.g., ['gray', '100'] -> '--color-gray-100'\n */\nconst toVarName = (prefix: string, ...parts: (string | number)[]): string => `${prefix}-${parts.join('-')}`;\n\n/**\n * Generate CSS variables from a color scale\n */\nconst generateColorScaleVars = (\n  name: string,\n  scale: Record<string | number, string | undefined>\n): Record<string, string> => {\n  const vars: Record<string, string> = {};\n\n  for (const [level, value] of Object.entries(scale)) {\n    if (value !== undefined) {\n      vars[toVarName(CSS_PREFIX, name, level)] = value;\n    }\n  }\n\n  return vars;\n};\n\n/**\n * Add alpha to an OKLab/OKLCH color string.\n * Falls back to `color-mix()` for non-oklab/oklch formats.\n */\nconst withAlpha = (color: string, alpha: number): string => {\n  const trimmed = color.trim();\n  const match = /^(oklab|oklch)\\((.+)\\)$/.exec(trimmed);\n  if (match) {\n    const fn = match[1];\n    const innerRaw = match[2];\n\n    if (fn && innerRaw) {\n      const inner = innerRaw.trim();\n\n      // If the color already has an alpha, keep it as-is.\n      if (inner.includes('/')) {\n        return `${fn}(${inner})`;\n      }\n\n      return `${fn}(${inner} / ${alpha})`;\n    }\n  }\n\n  // Fallback: approximate alpha using color-mix\n  const pct = Math.round(alpha * 1000) / 10;\n  return `color-mix(in oklab, ${trimmed} ${pct}%, transparent)`;\n};\n\n/**\n * Generate CSS variables from a color palette\n */\nconst generateColorVars = (colors: ColorPalette): Record<string, string> => {\n  const vars: Record<string, string> = {};\n\n  if (colors.gray) {\n    Object.assign(vars, generateColorScaleVars('gray', colors.gray));\n  }\n\n  if (colors.blue) {\n    Object.assign(vars, generateColorScaleVars('blue', colors.blue));\n  }\n\n  // Derived convenience tokens used by some components\n  const blue = colors.blue as Record<string, string | undefined> | undefined;\n  if (blue?.['200']) {\n    vars[toVarName(CSS_PREFIX, 'blue', '100-50')] = withAlpha(blue['200'], 0.5);\n  }\n  if (blue?.['300']) {\n    vars[toVarName(CSS_PREFIX, 'blue', '300-40')] = withAlpha(blue['300'], 0.4);\n  }\n\n  if (colors.green) {\n    Object.assign(vars, generateColorScaleVars('green', colors.green));\n  }\n\n  if (colors.red) {\n    Object.assign(vars, generateColorScaleVars('red', colors.red));\n  }\n\n  if (colors.orange) {\n    Object.assign(vars, generateColorScaleVars('orange', colors.orange));\n  }\n\n  if (colors.yellow) {\n    Object.assign(vars, generateColorScaleVars('yellow', colors.yellow));\n  }\n\n  if (colors.white) {\n    vars[toVarName(CSS_PREFIX, 'white')] = colors.white;\n  }\n\n  if (colors.black) {\n    vars[toVarName(CSS_PREFIX, 'black')] = colors.black;\n  }\n\n  if (colors.whiteAlpha) {\n    for (const [level, value] of Object.entries(colors.whiteAlpha)) {\n      if (value !== undefined) {\n        vars[toVarName(CSS_PREFIX, 'white', level)] = value;\n      }\n    }\n  }\n\n  // Ensure `--color-white-0` exists (used by slider thumb gradients)\n  if (!vars[toVarName(CSS_PREFIX, 'white', 0)] && colors.white) {\n    vars[toVarName(CSS_PREFIX, 'white', 0)] = withAlpha(colors.white, 0);\n  }\n\n  if (colors.blackAlpha) {\n    for (const [level, value] of Object.entries(colors.blackAlpha)) {\n      if (value !== undefined) {\n        vars[toVarName(CSS_PREFIX, 'black', level)] = value;\n      }\n    }\n  }\n\n  if (colors.foreground) {\n    vars[toVarName(CSS_PREFIX, 'foreground')] = colors.foreground;\n  }\n\n  return vars;\n};\n\n/**\n * Resolve the theme target element.\n * This keeps the theme API SSR-safe (no-ops when `document` is not available).\n */\nconst resolveThemeTarget = (element?: HTMLElement | null): HTMLElement | null => {\n  if (element) {\n    return element;\n  }\n  if (typeof document === 'undefined') {\n    return null;\n  }\n  return document.documentElement;\n};\n\n/**\n * Generate CSS variables from radii config\n */\nconst generateRadiiVars = (radii: RadiiConfig): Record<string, string> => {\n  const vars: Record<string, string> = {};\n\n  for (const [name, value] of Object.entries(radii)) {\n    if (value !== undefined) {\n      vars[toVarName(RADII_PREFIX, name)] = value;\n    }\n  }\n\n  return vars;\n};\n\n/**\n * Generate CSS variables from spacing config\n */\nconst generateSpacingVars = (spacing: SpacingConfig): Record<string, string> => {\n  const vars: Record<string, string> = {};\n\n  for (const [name, value] of Object.entries(spacing)) {\n    if (value !== undefined) {\n      vars[toVarName(SPACING_PREFIX, name)] = value;\n    }\n  }\n\n  return vars;\n};\n\n/**\n * Generate CSS variables from typography config\n */\nconst generateTypographyVars = (typography: TypographyConfig): Record<string, string> => {\n  const vars: Record<string, string> = {};\n\n  if (typography.fontFamily) {\n    vars[toVarName(TYPOGRAPHY_PREFIX, 'family')] = typography.fontFamily;\n  }\n\n  if (typography.fontMono) {\n    vars[toVarName(TYPOGRAPHY_PREFIX, 'mono')] = typography.fontMono;\n  }\n\n  if (typography.fontSize) {\n    vars[toVarName(TYPOGRAPHY_PREFIX, 'size')] = typography.fontSize;\n  }\n\n  if (typography.lineHeight) {\n    vars[toVarName(TYPOGRAPHY_PREFIX, 'line-height')] = typography.lineHeight;\n  }\n\n  return vars;\n};\n\nconst normalizeCustomVarName = (name: string): string | null => {\n  const trimmed = name.trim();\n  if (!trimmed) {\n    return null;\n  }\n  return trimmed.startsWith('--') ? trimmed : `--${trimmed}`;\n};\n\nconst generateCustomVars = (vars: ThemeVars): Record<string, string> => {\n  const out: Record<string, string> = {};\n\n  for (const [key, value] of Object.entries(vars)) {\n    if (value === null || value === undefined) {\n      continue;\n    }\n\n    const name = normalizeCustomVarName(key);\n    if (!name) {\n      continue;\n    }\n\n    out[name] = String(value);\n  }\n\n  return out;\n};\n\n/**\n * Generate all CSS variables from a theme config\n */\nconst generateThemeVars = (config: ThemeConfig): Record<string, string> => {\n  const vars: Record<string, string> = {};\n\n  if (config.colors) {\n    Object.assign(vars, generateColorVars(config.colors));\n  }\n\n  if (config.radii) {\n    Object.assign(vars, generateRadiiVars(config.radii));\n  }\n\n  if (config.spacing) {\n    Object.assign(vars, generateSpacingVars(config.spacing));\n  }\n\n  if (config.typography) {\n    Object.assign(vars, generateTypographyVars(config.typography));\n  }\n\n  if (config.vars) {\n    Object.assign(vars, generateCustomVars(config.vars));\n  }\n\n  return vars;\n};\n\n/**\n * Create a CSS string from theme configuration\n *\n * @param config - Theme configuration object\n * @param selector - CSS selector to apply variables to (default: ':root')\n * @returns CSS string with variables\n *\n * @example\n * ```typescript\n * const css = createTheme({\n *   colors: {\n *     blue: { 500: '#3b82f6' }\n *   }\n * });\n * // Returns: ':root { --color-blue-500: #3b82f6; }'\n * ```\n */\nexport const createTheme = (config: ThemeConfig, selector = ':root'): string => {\n  const vars = generateThemeVars(config);\n  const declarations = Object.entries(vars)\n    .map(([name, value]) => `  ${name}: ${value};`)\n    .join('\\n');\n\n  return `${selector} {\\n${declarations}\\n}`;\n};\n\n/**\n * Apply theme configuration to an element (default: document root)\n *\n * @param config - Theme configuration object\n * @param element - Target element (default: document.documentElement)\n *\n * @example\n * ```typescript\n * // Apply to document root\n * defineTheme({\n *   colors: {\n *     blue: { 500: '#3b82f6' }\n *   }\n * });\n *\n * // Apply to specific element\n * defineTheme({ colors: { gray: { 900: '#111' } } }, myElement);\n * ```\n */\nexport const defineTheme = (config: ThemeConfig, element?: HTMLElement | null): void => {\n  const target = resolveThemeTarget(element);\n  if (!target) {\n    return;\n  }\n\n  const vars = generateThemeVars(config);\n\n  for (const [name, value] of Object.entries(vars)) {\n    target.style.setProperty(name, value);\n  }\n};\n\n/**\n * Remove theme configuration from an element\n *\n * @param config - Theme configuration object (to know which variables to remove)\n * @param element - Target element (default: document.documentElement)\n */\nexport const removeTheme = (config: ThemeConfig, element?: HTMLElement | null): void => {\n  const target = resolveThemeTarget(element);\n  if (!target) {\n    return;\n  }\n\n  const vars = generateThemeVars(config);\n\n  for (const name of Object.keys(vars)) {\n    target.style.removeProperty(name);\n  }\n};\n\n/**\n * Get the current value of a CSS theme variable\n *\n * @param token - Variable name (with or without '--' prefix)\n * @param element - Element to read from (default: document.documentElement)\n * @returns The computed value or empty string if not found\n *\n * @example\n * ```typescript\n * const blue500 = getThemeValue('color-blue-500');\n * const radius = getThemeValue('--radii-md');\n * ```\n */\nexport const getThemeValue = (token: string, element?: HTMLElement | null): string => {\n  const target = resolveThemeTarget(element);\n  if (!target || typeof getComputedStyle === 'undefined') {\n    return '';\n  }\n\n  const varName = token.startsWith('--') ? token : `--${token}`;\n  return getComputedStyle(target).getPropertyValue(varName).trim();\n};\n\n/**\n * Set a single theme variable\n *\n * @param token - Variable name (with or without '--' prefix)\n * @param value - Value to set\n * @param element - Target element (default: document.documentElement)\n *\n * @example\n * ```typescript\n * setThemeValue('color-blue-500', '#3b82f6');\n * ```\n */\nexport const setThemeValue = (token: string, value: string, element?: HTMLElement | null): void => {\n  const target = resolveThemeTarget(element);\n  if (!target) {\n    return;\n  }\n\n  const varName = token.startsWith('--') ? token : `--${token}`;\n  target.style.setProperty(varName, value);\n};\n\nexport type SystemThemeMode = 'dark' | 'light';\n\n/** Attribute used for CSS-based theme switching */\nexport const EASE_THEME_ATTRIBUTE = 'data-ease-theme';\n\n/**\n * Merge a theme with the library defaults (dark baseline).\n * Use this when you want to start from the built-in design tokens and override a few values.\n */\nexport const mergeTheme = (overrides: ThemeConfig = {}): ThemeConfig => {\n  return {\n    colors: {\n      ...defaultColors,\n      ...overrides.colors,\n      gray: { ...defaultColors.gray, ...overrides.colors?.gray },\n      blue: { ...defaultColors.blue, ...overrides.colors?.blue },\n      green: { ...defaultColors.green, ...overrides.colors?.green },\n      red: { ...defaultColors.red, ...overrides.colors?.red },\n      orange: { ...defaultColors.orange, ...overrides.colors?.orange },\n      yellow: { ...defaultColors.yellow, ...overrides.colors?.yellow },\n      whiteAlpha: { ...defaultColors.whiteAlpha, ...overrides.colors?.whiteAlpha },\n      blackAlpha: { ...defaultColors.blackAlpha, ...overrides.colors?.blackAlpha }\n    },\n    radii: { ...defaultRadii, ...overrides.radii },\n    spacing: { ...defaultSpacing, ...overrides.spacing },\n    typography: { ...defaultTypography, ...overrides.typography },\n    vars: overrides.vars ? { ...overrides.vars } : undefined\n  };\n};\n\n/**\n * Alias for `mergeTheme()`.\n * This package ships a dark baseline theme; light/custom themes should be provided by the consumer.\n */\nexport const createDarkTheme = (overrides: ThemeConfig = {}): ThemeConfig => mergeTheme(overrides);\n\nexport interface SetThemeNameOptions {\n  /** Target element (defaults to `document.documentElement` in the browser). */\n  element?: HTMLElement | null;\n  /** Attribute name to set (defaults to `data-ease-theme`). */\n  attribute?: string;\n  /** Optional `color-scheme` value to set on the target element. */\n  colorScheme?: SystemThemeMode;\n  /** Set `element.style.colorScheme` (default: true when `colorScheme` is provided). */\n  setColorScheme?: boolean;\n}\n\n/**\n * Set the active theme name on an element via `[data-ease-theme=\"<name>\"]`.\n * Useful for CSS-scoped themes.\n */\nexport const setThemeName = (name: string, options: SetThemeNameOptions = {}): void => {\n  const target = resolveThemeTarget(options.element);\n  if (!target) {\n    return;\n  }\n\n  const attribute = options.attribute ?? EASE_THEME_ATTRIBUTE;\n  target.setAttribute(attribute, name);\n\n  if (options.colorScheme && options.setColorScheme !== false) {\n    target.style.colorScheme = options.colorScheme;\n  }\n};\n\nexport const getThemeName = (element?: HTMLElement | null, attribute = EASE_THEME_ATTRIBUTE): string | null => {\n  const target = resolveThemeTarget(element);\n  if (!target) {\n    return null;\n  }\n\n  return target.getAttribute(attribute);\n};\n\nexport interface ApplyThemeOptions {\n  /** Target element (defaults to `document.documentElement` in the browser). */\n  element?: HTMLElement | null;\n  /** Optional theme name to set as `[data-ease-theme=\"<name>\"]`. */\n  name?: string;\n  /** Attribute name to use when `name` is provided. Defaults to `data-ease-theme`. */\n  attribute?: string;\n  /** Optional `color-scheme` value to set on the target element. */\n  colorScheme?: SystemThemeMode;\n  /** Set `[data-ease-theme]` when `name` is provided (default: true). */\n  setAttribute?: boolean;\n  /** Set `element.style.colorScheme` when `colorScheme` is provided (default: true). */\n  setColorScheme?: boolean;\n  /**\n   * If true, the provided theme is first merged with the library defaults via `mergeTheme()`.\n   * Use this when you only pass partial overrides.\n   */\n  mergeWithDefaults?: boolean;\n}\n\n/**\n * Apply a theme config (and optional theme name + color-scheme) to an element.\n * This is SSR-safe: it becomes a no-op when `document` is not available.\n */\nexport const applyTheme = (theme: ThemeConfig, options: ApplyThemeOptions = {}): ThemeConfig => {\n  const target = resolveThemeTarget(options.element);\n  const attribute = options.attribute ?? EASE_THEME_ATTRIBUTE;\n\n  const config = options.mergeWithDefaults ? mergeTheme(theme) : theme;\n\n  defineTheme(config, target);\n\n  if (!target) {\n    return config;\n  }\n\n  if (options.name && options.setAttribute !== false) {\n    target.setAttribute(attribute, options.name);\n  }\n\n  if (options.colorScheme && options.setColorScheme !== false) {\n    target.style.colorScheme = options.colorScheme;\n  }\n\n  return config;\n};\n\nexport const getSystemThemeMode = (): SystemThemeMode => {\n  if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n    return 'dark';\n  }\n  return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n};\n\nexport interface FollowSystemThemeOptions extends Omit<ApplyThemeOptions, 'name' | 'colorScheme'> {\n  /** Theme name for dark mode (default: 'dark'). */\n  darkName?: string;\n  /** Theme name for light mode (default: 'light'). */\n  lightName?: string;\n}\n\n/**\n * Follow `prefers-color-scheme` and apply the provided themes.\n *\n * This package does NOT ship a light theme preset; you supply both themes.\n * Returns a cleanup function to remove the media query listener.\n */\nexport const followSystemTheme = (\n  themes: { dark: ThemeConfig; light: ThemeConfig },\n  options: FollowSystemThemeOptions = {}\n): (() => void) => {\n  if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n    return () => {};\n  }\n\n  const media = window.matchMedia('(prefers-color-scheme: light)');\n  const apply = (): void => {\n    const mode: SystemThemeMode = media.matches ? 'light' : 'dark';\n    const theme = mode === 'light' ? themes.light : themes.dark;\n\n    applyTheme(theme, {\n      ...options,\n      name: mode === 'light' ? (options.lightName ?? 'light') : (options.darkName ?? 'dark'),\n      colorScheme: mode\n    });\n  };\n\n  apply();\n\n  media.addEventListener('change', apply);\n  return () => media.removeEventListener('change', apply);\n};\n","/**\n * Main initialization API for @easemate/web-kit\n */\n\nimport type { FontConfig } from './internal/fonts';\nimport type { LazyLoadConfig } from './internal/lazy-load';\nimport type { StylePreset } from './internal/style-inject';\n\nimport { applyTheme, followSystemTheme, type SystemThemeMode } from './theme';\nimport { getTheme, isThemeRef, type ThemeInput } from './theme/registry';\n\n// --------------------------\n// Types\n// --------------------------\n\n/**\n * Theme mode configuration for light/dark switching.\n */\nexport interface ThemeModeConfig {\n  /** Mode selection: 'light', 'dark', or 'system' for auto-switching */\n  mode: 'light' | 'dark' | 'system';\n  /** Theme to use in light mode */\n  light: ThemeInput;\n  /** Theme to use in dark mode */\n  dark: ThemeInput;\n  /** Persist user preference to localStorage */\n  persist?: { key: string };\n}\n\n/**\n * Style injection configuration.\n */\nexport type StylesConfig = false | StylePreset | { reset?: boolean; base?: boolean };\n\n/**\n * Component replacement configuration.\n * Keys are tag names, values are either:\n * - A custom element constructor\n * - A string tag name to alias to\n */\nexport type ReplaceConfig = Record<string, CustomElementConstructor | string>;\n\n/**\n * initWebKit options.\n */\nexport interface InitWebKitOptions {\n  /**\n   * Tags to include (register only these).\n   * If not provided, all components are registered.\n   */\n  include?: readonly string[];\n\n  /**\n   * Tags to exclude (register all except these).\n   * Ignored if `include` is provided.\n   */\n  exclude?: readonly string[];\n\n  /**\n   * Replace components with custom implementations.\n   * - Constructor: registers your class under the tag name\n   * - String: creates a bridge element that renders the aliased tag\n   */\n  replace?: ReplaceConfig;\n\n  /**\n   * Theme to apply.\n   * - String: registered theme name (e.g., 'default', 'dark')\n   * - WebKitThemeRef: theme reference from registerTheme()\n   * - ThemeConfig: inline theme configuration\n   * - ThemeModeConfig: light/dark mode configuration\n   */\n  theme?: ThemeInput | ThemeModeConfig;\n\n  /**\n   * Element to scope theme variables to (default: document.documentElement).\n   */\n  target?: HTMLElement;\n\n  /**\n   * Inject global styles.\n   * - false: no styles (default)\n   * - 'reset': minimal CSS reset\n   * - 'base': body/html dark theme styles\n   * - 'main': reset + base\n   * - { reset?: boolean; base?: boolean }: fine-grained control\n   */\n  styles?: StylesConfig;\n\n  /**\n   * Font loading configuration.\n   * - false: no font loading (default)\n   * - 'default': load default fonts (Instrument Sans, Geist Mono)\n   * - FontConfig: custom font configuration\n   */\n  fonts?: FontConfig | 'default' | false;\n\n  /**\n   * Enable lazy loading of components.\n   * - false: eager loading (default)\n   * - true: lazy load with default config\n   * - LazyLoadConfig: custom lazy load config\n   */\n  lazyLoad?: boolean | LazyLoadConfig;\n\n  /**\n   * CSP nonce for injected style/link elements.\n   */\n  cspNonce?: string;\n\n  /**\n   * Development mode options.\n   */\n  dev?: {\n    /** Warn about unknown tag names in include/exclude */\n    warnUnknownTags?: boolean;\n    /** Log component loads */\n    logLoads?: boolean;\n  };\n}\n\n/**\n * Controller returned by initWebKit.\n */\nexport interface WebKitController {\n  /** Cleanup all injected styles, fonts, and listeners */\n  dispose: () => void;\n\n  /** Theme controller (if theme was configured) */\n  theme?: {\n    /** Set theme by name or config */\n    set: (theme: ThemeInput) => void;\n    /** Set theme mode (only for ThemeModeConfig) */\n    mode?: (mode: 'light' | 'dark' | 'system') => void;\n  };\n\n  /** Promise that resolves when all components are loaded */\n  ready: Promise<void>;\n}\n\n// --------------------------\n// Helpers\n// --------------------------\n\nconst isBrowser = (): boolean => typeof document !== 'undefined' && typeof window !== 'undefined';\n\nconst isThemeModeConfig = (value: unknown): value is ThemeModeConfig => {\n  if (typeof value !== 'object' || value === null) {\n    return false;\n  }\n  const obj = value as Record<string, unknown>;\n  return obj.mode !== undefined && (obj.light !== undefined || obj.dark !== undefined);\n};\n\n/**\n * Register replacement components before loading built-in ones.\n */\nfunction registerReplacements(replace: ReplaceConfig): void {\n  if (!isBrowser()) {\n    return;\n  }\n\n  for (const [tag, replacement] of Object.entries(replace)) {\n    // Skip if already defined\n    if (customElements.get(tag)) {\n      continue;\n    }\n\n    if (typeof replacement === 'function') {\n      // Register custom constructor\n      customElements.define(tag, replacement);\n    } else if (typeof replacement === 'string') {\n      // Create a bridge element that renders the aliased tag\n      const aliasTag = replacement;\n      class BridgeElement extends HTMLElement {\n        private _inner: HTMLElement | null = null;\n\n        connectedCallback(): void {\n          // Create the aliased element\n          this._inner = document.createElement(aliasTag);\n\n          // Copy attributes\n          for (const attr of this.attributes) {\n            this._inner.setAttribute(attr.name, attr.value);\n          }\n\n          // Move children\n          while (this.firstChild) {\n            this._inner.appendChild(this.firstChild);\n          }\n\n          // Use shadow DOM to contain the aliased element\n          const shadow = this.attachShadow({ mode: 'open' });\n          shadow.appendChild(this._inner);\n        }\n\n        disconnectedCallback(): void {\n          this._inner = null;\n        }\n      }\n      customElements.define(tag, BridgeElement);\n    }\n  }\n}\n\n/**\n * Resolve and apply styles configuration.\n */\nasync function applyStyles(styles: StylesConfig, nonce?: string): Promise<{ dispose: () => void }> {\n  if (styles === false) {\n    return { dispose: () => {} };\n  }\n\n  const { injectPreset, removePreset } = await import('./internal/style-inject');\n\n  const injected: StylePreset[] = [];\n\n  if (typeof styles === 'string') {\n    injectPreset(styles, nonce);\n    injected.push(styles);\n  } else if (typeof styles === 'object') {\n    if (styles.reset) {\n      injectPreset('reset', nonce);\n      injected.push('reset');\n    }\n    if (styles.base) {\n      injectPreset('base', nonce);\n      injected.push('base');\n    }\n  }\n\n  return {\n    dispose: () => {\n      for (const preset of injected) {\n        removePreset(preset);\n      }\n    }\n  };\n}\n\n/**\n * Resolve and apply theme configuration.\n */\nfunction applyThemeConfig(\n  theme: ThemeInput | ThemeModeConfig,\n  target?: HTMLElement\n): { dispose: () => void; controller?: WebKitController['theme'] } {\n  if (isThemeModeConfig(theme)) {\n    // Light/dark mode configuration\n    const lightConfig = getTheme(theme.light);\n    const darkConfig = getTheme(theme.dark);\n\n    if (theme.mode === 'system') {\n      const cleanup = followSystemTheme({ light: lightConfig, dark: darkConfig }, { element: target });\n\n      return {\n        dispose: cleanup,\n        controller: {\n          set: (t: ThemeInput) => {\n            const config = getTheme(t);\n            applyTheme(config, { element: target });\n          },\n          mode: (m: 'light' | 'dark' | 'system') => {\n            if (m === 'system') {\n              // Re-apply system theme\n              const systemMode: SystemThemeMode = window.matchMedia('(prefers-color-scheme: light)').matches\n                ? 'light'\n                : 'dark';\n              const config = systemMode === 'light' ? lightConfig : darkConfig;\n              applyTheme(config, {\n                element: target,\n                name: systemMode,\n                colorScheme: systemMode\n              });\n            } else {\n              const config = m === 'light' ? lightConfig : darkConfig;\n              applyTheme(config, {\n                element: target,\n                name: m,\n                colorScheme: m\n              });\n            }\n          }\n        }\n      };\n    }\n\n    // Fixed mode\n    const config = theme.mode === 'light' ? lightConfig : darkConfig;\n    applyTheme(config, {\n      element: target,\n      name: theme.mode,\n      colorScheme: theme.mode\n    });\n\n    return {\n      dispose: () => {},\n      controller: {\n        set: (t: ThemeInput) => {\n          const resolvedConfig = getTheme(t);\n          applyTheme(resolvedConfig, { element: target });\n        }\n      }\n    };\n  }\n\n  // Simple theme (name, ref, or config)\n  const config = getTheme(theme);\n  const name = isThemeRef(theme) ? theme.name : typeof theme === 'string' ? theme : undefined;\n\n  applyTheme(config, {\n    element: target,\n    name,\n    colorScheme: 'dark'\n  });\n\n  return {\n    dispose: () => {},\n    controller: {\n      set: (t: ThemeInput) => {\n        const resolvedConfig = getTheme(t);\n        const themeName = isThemeRef(t) ? t.name : typeof t === 'string' ? t : undefined;\n        applyTheme(resolvedConfig, { element: target, name: themeName });\n      }\n    }\n  };\n}\n\n// --------------------------\n// Main API\n// --------------------------\n\n/**\n * Initialize the web-kit.\n *\n * @example\n * ```ts\n * // Basic usage - register all components with default theme\n * initWebKit({ theme: 'default' });\n *\n * // Selective loading\n * initWebKit({\n *   include: ['ease-button', 'ease-slider'],\n *   theme: 'default'\n * });\n *\n * // With styles\n * initWebKit({\n *   theme: 'default',\n *   styles: 'main',\n *   fonts: 'default'\n * });\n *\n * // Light/dark mode\n * initWebKit({\n *   theme: {\n *     mode: 'system',\n *     light: myLightTheme,\n *     dark: 'default'\n *   }\n * });\n * ```\n */\nexport function initWebKit(options: InitWebKitOptions = {}): WebKitController {\n  // SSR safety - no-op on server\n  if (!isBrowser()) {\n    return {\n      dispose: () => {},\n      ready: Promise.resolve()\n    };\n  }\n\n  const {\n    include,\n    exclude,\n    replace,\n    theme,\n    target,\n    styles = false,\n    fonts = false,\n    lazyLoad = false,\n    cspNonce,\n    dev\n  } = options;\n\n  const disposers: Array<() => void> = [];\n\n  // Controller object that will be populated\n  const controller: WebKitController = {\n    dispose: () => {\n      for (const dispose of disposers) {\n        dispose();\n      }\n    },\n    theme: undefined,\n    ready: Promise.resolve()\n  };\n\n  // Build the ready promise\n  const readyPromise = (async () => {\n    // 1. Register replacements first (before loading any components)\n    if (replace) {\n      registerReplacements(replace);\n    }\n\n    // 2. Apply styles\n    const stylesResult = await applyStyles(styles, cspNonce);\n    disposers.push(stylesResult.dispose);\n\n    // 3. Apply theme\n    if (theme) {\n      const themeResult = applyThemeConfig(theme, target);\n      disposers.push(themeResult.dispose);\n      controller.theme = themeResult.controller;\n    }\n\n    // 4. Load fonts\n    if (fonts !== false) {\n      const { injectFonts, removeFonts } = await import('./internal/fonts');\n      injectFonts(fonts);\n      const fontsToRemove = fonts;\n      disposers.push(() => removeFonts(fontsToRemove));\n    }\n\n    // 5. Load components\n    if (lazyLoad) {\n      // Lazy loading mode\n      const { createLazyLoader } = await import('./internal/lazy-load');\n      const lazyConfig: LazyLoadConfig = typeof lazyLoad === 'object' ? lazyLoad : {};\n\n      // Apply include/exclude to lazy loader\n      if (include) {\n        lazyConfig.include = include;\n      } else if (exclude) {\n        lazyConfig.exclude = exclude;\n      }\n\n      const loader = createLazyLoader(lazyConfig);\n      disposers.push(loader.dispose);\n    } else {\n      // Eager loading mode\n      const { loadAllComponents, loadComponents, resolveTags } = await import('./internal/component-loaders');\n\n      if (include || exclude) {\n        const tags = resolveTags({ include, exclude });\n\n        if (dev?.warnUnknownTags) {\n          const { WEB_KIT_ALL_TAGS } = await import('./internal/component-loaders');\n          const allTags = new Set(WEB_KIT_ALL_TAGS);\n          const unknown = (include ?? exclude ?? []).filter((t) => !allTags.has(t as never));\n          if (unknown.length > 0) {\n            console.warn('[web-kit] Unknown tags:', unknown);\n          }\n        }\n\n        if (dev?.logLoads) {\n          console.log('[web-kit] Loading components:', tags);\n        }\n\n        await loadComponents(tags);\n      } else {\n        if (dev?.logLoads) {\n          console.log('[web-kit] Loading all components');\n        }\n        await loadAllComponents();\n      }\n    }\n  })();\n\n  controller.ready = readyPromise;\n  return controller;\n}\n\nexport type { WebKitComponentTag, WebKitElementTag, WebKitTag } from './internal/component-loaders';\n// Re-export useful types\nexport type { FontConfig, FontSource } from './internal/fonts';\nexport type { LazyLoadConfig, LazyLoader } from './internal/lazy-load';\nexport type { StylePreset } from './internal/style-inject';\n","import type { TemplateResult } from 'lit-html';\n\nimport { nothing } from 'lit-html';\nimport { classMap } from 'lit-html/directives/class-map.js';\nimport { ifDefined } from 'lit-html/directives/if-defined.js';\nimport { repeat } from 'lit-html/directives/repeat.js';\nimport { styleMap } from 'lit-html/directives/style-map.js';\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js';\nimport { when } from 'lit-html/directives/when.js';\n\nexport { classMap, ifDefined, repeat, styleMap, unsafeHTML, when };\n\nexport function renderIf<T>(\n  condition: T | undefined | null,\n  template: TemplateResult | (() => TemplateResult)\n): TemplateResult | typeof nothing {\n  if (!condition) {\n    return nothing;\n  }\n\n  return typeof template === 'function' ? template() : template;\n}\n\nexport function renderList<T>(\n  items: readonly T[],\n  template: (item: T, index: number) => TemplateResult,\n  key: (item: T, index: number) => unknown = (item) => item\n): ReturnType<typeof repeat> {\n  return repeat(items, key, template);\n}\n\nexport function styleObject(input: Record<string, string | number | null | undefined>): ReturnType<typeof styleMap> {\n  const definedEntries = Object.entries(input).reduce<Record<string, string>>((acc, [property, value]) => {\n    if (value === null || value === undefined || value === '') {\n      return acc;\n    }\n\n    acc[property] = typeof value === 'number' ? `${value}` : value;\n    return acc;\n  }, {});\n\n  return styleMap(definedEntries);\n}\n\nexport const optionalAttribute = ifDefined;\n"],"mappings":"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AAAA;;;;QAAAA;;;;OARqBD,cAAAA;;EAQrBC;MAAAA,QAAAA;gBAAAA;;MAAAA,MAAAA,IAAAA;SAAAA,sBAAK;;EAEdW,SAAyB;AACvB,WAAOC;sCAC2B,KAAKZ,KAAK;;;;;;EAM9C;;;;;AAlBK,UAAA,GAAA,IAAA,GAAA,KAQIA,uBAAKa,aAAA,IAAA,GAALb,aAAAA,IAAAA;;AAWX;;;ADrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAc;AACA;AACA;AACAC;AACA;AACAC;AACA;;;AFhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAC;AACA;AACAC;AAQA;AACA;AACA;AACAC;;;AIkIO,IAAMC,gBAAwC;EACnDC,MAAM;IACJ,GAAG;IACH,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAM;EACR;EACAC,MAAM;IACJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAM;IACN,MAAM;EACR;EACAC,OAAO;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAM;EACR;EACAC,KAAK;IACH,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAM;EACR;EACAC,QAAQ;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAM;EACR;EACAC,QAAQ;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;EACP;EACAC,OAAO;EACPC,OAAO;EACPC,YAAY;IACV,GAA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","names":["SUPPORTS_HIGHLIGHT_API","getHighlightAPI","window","CSS","highlights","Highlight","w","DEFAULT_THEME","generateHighlightStyles","keyword","string","comment","number","operator","tag","attribute","property","type","variable","selector","function","instanceId","theme","styles","color","Object","entries","highlightName","italic","JS_BASE","TS_ADDITIONS","HTML_BASE","CSS_BASE","JSON_BASE","baseGrammars","TSX_GRAMMAR","GRAMMARS","javascript","js","typescript","ts","html","css","json","filter","type","tsx","jsx","tokenize","normalizeIndent","code","language","grammar","GRAMMARS","toLowerCase","regexParts","groupMap","Map","groupIndex","forEach","type","pattern","groupName","set","push","source","masterRegex","RegExp","join","tokens","match","exec","index","lastIndex","groups","undefined","get","start","end","length","tagNameMatch","tagNameStart","tagNameEnd","lines","split","filter","line","trim","minIndent","Math","min","map","substring","styleCache","normalizeTemplate","fetchStyles","Component","Map","template","urls","Promise","all","map","url","cached","get","request","fetch","then","response","ok","text","catch","set","options","Base","_context","tag","styles","styleUrls","observedAttributes","shadowMode","autoSlot","Error","templateFn","Decorated","parent","Array","isArray","own","from","Set","args","attachShadow","mode","renderRoot","shadow","connectedCallback","prototype","call","finally","requestRender","disconnectedCallback","attributeChangedCallback","name","oldValue","newValue","onAttributeChange","requestAnimationFrame","length","fetched","inlineStyles","filter","Boolean","join","root","templateResult","render","styleTemplate","html","slotTemplate","completeTemplate","commit","afterRender","wrapRender","fragment","document","createDocumentFragment","tempDiv","createElement","append","childNodes","customElements","define","Prop","options","attribute","reflect","type","parse","format","defaultValue","compare","defaultCompare","onChange","onAttributeChange","resolvedType","resolveType","parseValue","value","typeParsers","call","formatValue","typeFormatters","accessor","context","kind","Error","attributeName","toKebabCase","name","addInitializer","observeAttribute","rawValue","isInternalMutation","parsed","previous","get","set","scheduleRender","formatted","updateAttribute","init","initialValue","hasAttribute","getAttribute","undefined","renderQueue","cleanupRegistry","observerRegistry","internalMutations","registerCleanup","markInternalMutation","WeakMap","instance","requestRender","render","requestAnimationFrame","delete","String","replace","toLowerCase","cleanup","callbacks","Set","original","disconnectedCallback","args","registered","forEach","callback","error","console","apply","add","host","attributes","has","size","handler","entry","Map","observer","MutationObserver","records","record","listeners","currentValue","target","listener","observe","disconnect","removeAttribute","setAttribute","Boolean","Number","Object","Array","boolean","number","isNaN","json","JSON","warn","string","stringify","next","Query","selector","userOptions","Error","merged","defaultOptions","createQueryDecorator","resolveFallback","resolveRoot","resolveQuery","all","closest","from","fallback","host","option","document","renderRoot","shadowRoot","options","result","root","elements","Array","querySelectorAll","length","match","querySelector","_target","context","kind","descriptor","get","set","_value","addInitializer","Object","defineProperty","name","configurable","enumerable","import_lit_html","HTMLElement","language","codeElement","Code","Component","tag","shadowMode","autoSlot","styles","template","html","Prop","reflect","Query","connectedCallback","MutationObserver","observe","childList","subtree","characterData","disconnectedCallback","disconnect","attributeChangedCallback","name","currentLanguage","toLowerCase","afterRender","shadowRoot","querySelectorAll","style","remove","type","rawCode","textContent","normalizeIndent","trim","SUPPORTS_HIGHLIGHT_API","textNode","firstChild","code","api","getHighlightAPI","tokens","tokenize","highlightMap","Map","token","start","end","range","document","createRange","setStart","setEnd","has","set","get","push","ranges","entries","length","highlightName","highlight","Highlight","highlights","add","delete","clear","crypto","randomUUID","Set","createElement","setAttribute","highlightStyles","generateHighlightStyles","appendChild","cubicBezierToLinearPoints","points","start","x","y","cpOutX","p1","cpOutY","isLinked","mirrorLength","end","cpInX","p2","cpInY","canvasStyles","controlsStyles","outputStyles","containerStyles","canvasControlsStyles","toolbarStyles","EasingType","MIN_LINEAR_POINTS","MAX_LINEAR_POINTS","clampPoint","MIN_LINEAR_DELTA","linearPointIdCounter","nextLinearPointId","ensureLinearPointId","cloneLinearPoint","cubicBezierPath","linearDisplayPath","perpendicularDistance","simplifyPoints","generateCubicBezierCSS","getLinearApproximation","generateLinearCSS","cubicBezier","normalizeLinearPoints","clamp01","parseCubicBezierValue","ensureStopPositions","parseLinearTimingFunction","vectorLength","normalizeVector","smoothLinearPoints","point","bounds","minX","maxX","minY","maxY","x","Math","max","min","y","id","sourceId","points","p1","p2","startX","startY","endX","endY","cp1x","cp1y","cp2x","cp2y","length","toSvg","p","startPoint","start","d","index","cp1","cpOutX","cpOutY","cp2","cpInX","cpInY","end","svgCp1","svgCp2","lineStart","lineEnd","dx","dy","sqrt","numerator","abs","denominator","epsilon","dmax","endPoint","i","recResults1","slice","recResults2","name","variant","timingFunction","toFixed","code","options","simplify","round","samples","numSamplesPerSegment","sortedPoints","sort","a","b","push","step","t","normalizedSamples","lastX","sample","clampedX","clampedY","firstPoint","firstSample","lastPoint","lastSample","finalSamples","map","Number","Array","isArray","parts","join","p0","p3","u","tt","uu","uuu","ttt","normalized","first","last","handleThreshold","undefined","isLinked","mirrorLength","value","isNaN","input","match","trim","body","split","part","parseFloat","filter","isFinite","x1","y1","x2","y2","some","stops","lastIndex","assignBetween","startIndex","endIndex","startStop","endStop","span","segments","offset","ratio","target","lastDefined","segment","valueToken","position","token","percentMatch","percentValue","parsed","rawPoints","stop","tension","prev","next","smoothedPoint","handleLength","tangentX","tangentY","tangentLength","normalizedTx","normalizedTy","distToPrev","distToNext","inHandleLength","outHandleLength","Listen","eventName","selectorOrOptions","Error","listenConfig","buildOptions","normalizeOptions","originalMethod","context","addInitializer","attached","attach","target","resolveTarget","addEventListener","console","warn","String","eventOptions","capture","once","passive","undefined","prevent","handler","event","typedEvent","preventDefault","stopImmediate","stopImmediatePropagation","stop","stopPropagation","matched","selector","path","composedPath","find","node","Element","matches","when","call","targetNode","registerCleanup","removeEventListener","queueMicrotask","addLifecycleHook","lifecycleHooks","cleanupRegistry","connectedCallback","WeakMap","disconnectedCallback","instance","hookName","store","callbacks","get","Set","set","original","args","forEach","callback","apply","add","cleanup","registered","fn","error","delete","host","EventTarget","document","window","renderRoot","shadowRoot","options","dispatchControlEvent","host","type","detail","dispatchEvent","CustomEvent","bubbles","composed","HIT_AREA_RADIUS","LINEAR_HIT_THRESHOLD","LINEAR_PATH_SAMPLES","DRAG_ACTIVATION_DISTANCE_PX","DRAG_ACTIVATION_DISTANCE_PX_SQUARED","DEFAULT_HANDLE_LENGTH","SVG_WIDTH","SVG_HEIGHT","BEZIER_CONTROL_MIN_Y","BEZIER_CONTROL_MAX_Y","EASING_PRESETS","label","options","value","import_lit_html","generateGridLines","gridStep","lines","xSteps","Math","ceil","SVG_WIDTH","ySteps","SVG_HEIGHT","i","x","push","svg","y","import_lit_html","HTMLElement","easingType","points","showGrid","snapToGrid","gridSize","focusedLinearIndex","simplify","round","svgElement","CurveCanvas","lerp","lerpPoint","findTForX","splitCurveSegment","evaluateCubicPointNormalized","Component","tag","styles","canvasStyles","template","hoverPreviewPath","getHoverCurvePath","controlElements","getControlElements","hoverInsertElements","getHoverInsertElements","curvePath","getCurvePath","html","SVG_WIDTH","SVG_HEIGHT","handlePointerDown","handlePointerMove","handlePointerUp","handlePointerLeave","svg","getGridLines","_dec1","Prop","reflect","_dec2","type","Object","_dec3","Boolean","defaultValue","Number","Query","elements","point","anchorSvg","index","direction","dx","cpInX","cpOutX","dy","cpInY","cpOutY","handlePos","x","y","handleSvg","role","dragMode","isHandleActive","handlePath","push","HIT_AREA_RADIUS","Math","EasingType","LINEAR","preview","insertedPoint","anchor","undefined","handlePoint","vecX","vecY","length","sqrt","circleRadius","barHalfHeight","dirX","dirY","perpX","perpY","cx","cy","transitionZone","min","barEndDist","barTopStartX","barTopStartY","barBottomStartX","barBottomStartY","barTopEndX","barTopEndY","barBottomEndX","barBottomEndY","circleTopX","circleTopY","circleBottomX","circleBottomY","ctrl1Dist","ctrl2Dist","ctrl1TopX","ctrl1TopY","ctrl2TopX","ctrl2TopY","ctrl1BottomX","ctrl1BottomY","ctrl2BottomX","ctrl2BottomY","POSITIVE_INFINITY","minDistanceSquared","start","end","cp1","cp2","sample","LINEAR_PATH_SAMPLES","t","samplePoint","distanceSquared","distance","LINEAR_HIT_THRESHOLD","position","mouseSvg","thresholdSquared","pointSvg","handleIn","handleInSvg","hdx","hdy","handleOut","handleOutSvg","prev","next","refDx","refDy","normalizeVector","DEFAULT_HANDLE_LENGTH","normalized","referenceLength","vectorLength","inLength","outLength","mirrorLength","isLinked","targetLength","max","outDirection","inDirection","generateGridLines","CUBIC_BEZIER","event","workingPosition","currentPoint","activePointId","ensureLinearPointId","shiftKey","startPoint","get","deltaX","abs","deltaY","constrainedPoint","updatedPoints","map","i","normalizedPoints","normalizeLinearPoints","newIndex","findIndex","id","requestRender","updatedPoint","mirrorAngle","draggedLength","MIN_LINEAR_DELTA","existingLength","candidate","insertedIndex","insertedPointId","pointId","MAX_LINEAR_POINTS","clamped","clampPoint","minY","maxY","insertIndex","splitResult","newPrev","newPoint","newNext","slice","normalizedIndex","path","linearDisplayPath","_initProto","root","getRootNode","ShadowRoot","host","console","warn","anchorStart","anchorEnd","controlOne","p1","controlTwo","p2","handlePathOne","handlePathTwo","error","p","focusedIndex","forEach","isPointFocused","isDraggingPoint","isPointActive","cubicBezierPath","approxPoints","getLinearApproximation","hoverPoint","Array","isArray","Map","set","cloneLinearPoint","options","rect","getBoundingClientRect","svgX","clientX","left","svgY","clientY","top","width","height","skipSnap","shouldSnap","ratioX","ratioY","bezierBounds","BEZIER_CONTROL_MIN_Y","BEZIER_CONTROL_MAX_Y","sourcePoint","value","target","detail","name","dispatchControlEvent","newLinkingState","preventDefault","linearPoints","SVGElement","getAttribute","indexAttribute","parseInt","isNaN","setPointerCapture","pointerId","mode","startX","startY","insertResult","skipSnapForPending","DRAG_ACTIVATION_DISTANCE_PX_SQUARED","adjustedPosition","reference","clampedPosition","previousIndex","hasPointerCapture","releasePointerCapture","a","b","p0","p3","minT","maxT","tolerance","maxIterations","px","wasCurved","P01","P12","P23","P012","P123","P_new","import_lit_html","HTMLElement","easingType","points","focusedLinearIndex","CanvasControls","Component","tag","styles","canvasControlsStyles","template","EasingType","LINEAR","Array","isArray","focusedIndex","selectedPoint","isInnerPoint","length","hasInHandle","cpInX","undefined","cpInY","hasOutHandle","cpOutX","cpOutY","hasAnyHandle","html","isLinked","handleToggleMirrorAngle","mirrorLength","handleToggleMirrorLength","handleRemoveSmoothing","handleAddSmoothing","_dec1","Prop","reflect","_dec2","type","Object","_dec3","Number","defaultValue","point","index","prev","next","refDx","refDy","dirX","dirY","x","y","direction","normalizeVector","DEFAULT_HANDLE_LENGTH","dx","dy","normalized","referenceLength","vectorLength","inLength","outLength","targetLength","Math","max","outDirection","inDirection","_initProto","root","getRootNode","ShadowRoot","host","value","event","target","detail","name","dispatchControlEvent","preventDefault","updatedPoints","updatedPoint","nextState","normalizedPoints","normalizeLinearPoints","existingPoint","import_lit_html","HTMLElement","IconMinus","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconPlus","Component","tag","styles","template","html","import_lit_html","HTMLElement","disabled","pill","fullWidth","type","block","variant","Button","Component","tag","autoSlot","shadowMode","styles","_dec1","Prop","Boolean","reflect","_dec2","_dec3","_dec4","String","defaultValue","_dec5","onAttributeChange","requestRender","_dec6","render","html","_initProto","import_lit_html","HTMLElement","easingType","points","showGrid","snapToGrid","gridSize","focusedLinearIndex","CurveControls","Component","tag","styles","controlsStyles","template","html","_activePresetValue","handlePresetSelection","EASING_PRESETS","map","label","options","index","value","handleTypeChange","EasingType","CUBIC_BEZIER","LINEAR","_dec1","Prop","reflect","_dec2","type","Object","onChange","handlePointsPropChange","_dec3","Boolean","defaultValue","_dec4","_dec5","Number","_dec6","handleFocusedLinearIndexPropChange","requestRender","_value","isApplyingPreset","maxPointsReached","length","MAX_LINEAR_POINTS","minPointsReached","MIN_LINEAR_POINTS","renderLinearDetailsControls","focusedIndex","selectedPoint","previousIndex","nextIndex","isInnerPoint","pointMeta","x","toFixed","y","pointType","isLinked","hasInHandle","cpInX","undefined","cpInY","hasOutHandle","cpOutX","cpOutY","hasAnyHandle","event","mirrorLength","point","prev","next","refDx","refDy","dirX","dirY","direction","normalizeVector","DEFAULT_HANDLE_LENGTH","dx","dy","normalized","referenceLength","vectorLength","inLength","outLength","targetLength","Math","max","outDirection","inDirection","isStart","handleKey","handleLabel","hasHandle","neighbor","handle","fallbackDirection","finalDirection","gap","abs","baseLength","MIN_LINEAR_DELTA","min","updatedPoints","filter","_","pointIndex","normalizedPoints","normalizeLinearPoints","_initProto","root","getRootNode","ShadowRoot","host","Array","isArray","target","HTMLInputElement","axis","dataset","parsed","parseFloat","isNaN","updated","previous","minX","maxX","refreshedPoint","preventDefault","currentTarget","HTMLButtonElement","updatedPoint","nextState","mode","existingPoint","removeIncoming","removeOutgoing","neighborIndex","resetCurve","defaults","p1","p2","distributeLinearPoints","lastIndex","step","distributed","presetValue","detail","originEvent","rawValue","cssValue","trim","startsWith","parseCubicBezierValue","parsedLinear","parseLinearTimingFunction","smoothedLinear","smoothLinearPoints","handleSelectCubic","handleSelectLinear","addLinearPoint","insertIndex","largestGap","start","end","startPoint","endPoint","newPointPosition","clampPoint","newPoint","slice","insertedIndex","removeLinearPoint","removeIndex","smallestSpan","POSITIVE_INFINITY","span","toggleGrid","nextValue","toggleSnapToGrid","incrementGridSize","decrementGridSize","handleGridSliderInput","handleGridSizeChange","String","round","name","dispatchControlEvent","import_lit_html","HTMLElement","language","codeElement","Code","Component","tag","shadowMode","autoSlot","styles","template","html","_dec1","Prop","reflect","_dec2","Query","connectedCallback","MutationObserver","observe","childList","subtree","characterData","disconnectedCallback","disconnect","attributeChangedCallback","name","currentLanguage","toLowerCase","afterRender","shadowRoot","querySelectorAll","style","remove","type","rawCode","textContent","normalizeIndent","trim","SUPPORTS_HIGHLIGHT_API","textNode","firstChild","code","api","getHighlightAPI","tokens","tokenize","highlightMap","Map","token","start","end","range","document","createRange","setStart","setEnd","has","set","get","push","ranges","entries","length","highlightName","highlight","Highlight","highlights","add","delete","clear","_initProto","crypto","randomUUID","Set","createElement","setAttribute","highlightStyles","generateHighlightStyles","appendChild","import_lit_html","HTMLElement","easingType","points","name","variant","simplify","round","CurveOutput","init_code","Component","tag","styles","outputStyles","template","html","generatedCSS","code","handleCopyClick","copyStatus","_dec1","Prop","type","String","reflect","_dec2","Object","_dec3","defaultValue","_dec4","_dec5","Number","_dec6","timingFunction","EasingType","CUBIC_BEZIER","Array","isArray","generateCubicBezierCSS","LINEAR","generateLinearCSS","isAnimating","handlePreviewClick","event","disconnectedCallback","clearTimeout","_initProto","preventDefault","navigator","clipboard","writeText","window","setTimeout","requestRender","error","console","offsetHeight","import_lit_html","HTMLElement","contentElement","placement","offset","open","nextAnchorName","Popover","crypto","randomUUID","slice","Component","tag","autoSlot","shadowMode","styles","_dec1","Query","_dec2","Prop","reflect","defaultValue","_dec3","type","Number","onChange","handleOffsetChange","_dec4","Boolean","handleOpenChange","isFinite","style","setProperty","content","showPopover","hidePopover","connectedCallback","afterRender","_e","render","html","_initProto","DismissController","options","event","owner","content","triggers","path","composedPath","some","node","Element","hasAttribute","includes","trigger","key","preventDefault","active","document","activeElement","contains","onDismiss","connect","context","filter","el","HTMLElement","addEventListener","disconnect","removeEventListener","registry","toDismissContext","createOutsideClickHandle","registerOutsideClickHandle","updateOutsideClickHandles","disconnectOutsideClickHandles","requestOutsideClickUpdate","WeakMap","host","options","disabled","resolved","resolve","owner","HTMLElement","content","triggers","filter","element","onDismiss","controller","DismissController","event","call","update","context","disconnect","connect","handle","handles","get","Set","set","add","forEach","OutsideClick","options","originalMethod","context","addInitializer","ensureLifecycle","resolve","host","owner","content","triggers","handle","createOutsideClickHandle","event","call","disabled","registerOutsideClickHandle","isConnected","updateOutsideClickHandles","lifecycleApplied","wrapMethod","WeakSet","name","hook","callHookFirst","original","args","result","apply","has","add","disconnectOutsideClickHandles","import_lit_html","HTMLElement","open","delay","placement","triggerElement","contentElement","Tooltip","Component","tag","shadowMode","styles","_dec1","Prop","type","Boolean","reflect","onChange","next","previous","_handleOpenChange","_dec2","Number","defaultValue","_dec3","_dec4","Query","_dec5","_dec6","OutsideClick","content","host","triggers","disabled","handleOutsideDismiss","disconnectedCallback","removeEventListener","afterRender","isVisible","setAttribute","dataset","hidden","render","html","requestOutsideClickUpdate","window","clearTimeout","callback","wait","setTimeout","trigger","addEventListener","_initProto","import_lit_html","HTMLElement","easingType","points","showGrid","snapToGrid","gridSize","simplify","round","CurveToolbar","Component","tag","styles","toolbarStyles","template","isGridAtMinimum","isGridAtMaximum","isLinear","EasingType","LINEAR","Array","isArray","html","toggleGrid","toggleSnapToGrid","resetCurve","addLinearPoint","length","MAX_LINEAR_POINTS","removeLinearPoint","MIN_LINEAR_POINTS","distributeLinearPoints","decrementGridSize","incrementGridSize","handleSimplifyInput","handleRoundInput","_dec1","Prop","reflect","_dec2","type","Object","_dec3","Boolean","defaultValue","_dec4","_dec5","Number","_dec6","_dec7","_initProto","root","getRootNode","ShadowRoot","host","value","event","target","detail","name","dispatchControlEvent","preventDefault","nextValue","CUBIC_BEZIER","defaults","p1","x","y","p2","lastIndex","step","distributed","map","point","index","updated","parseFloat","toFixed","cpInX","cpInY","cpOutX","cpOutY","isLinked","normalizedPoints","normalizeLinearPoints","insertIndex","largestGap","start","end","gap","startPoint","endPoint","newPointPosition","clampPoint","minY","maxY","newPoint","mirrorLength","updatedPoints","slice","insertedIndex","removeIndex","smallestSpan","POSITIVE_INFINITY","previous","next","span","filter","_","pointIndex","nextIndex","customEvent","Math","max","min","requestRender","import_lit_html","HTMLElement","name","easingType","points","showGrid","snapToGrid","gridSize","simplify","round","focusedLinearIndex","Curve","Component","tag","styles","containerStyles","template","html","_dec1","Prop","reflect","defaultValue","_dec2","EasingType","CUBIC_BEZIER","onChange","next","previous","getDefaultPointsForType","_dec3","type","Object","p1","x","y","p2","_dec4","Boolean","_dec5","_dec6","Number","_dec7","_dec8","_dec9","_dec10","Listen","target","_dec11","_dec12","_dec13","_dec14","_dec15","_dec16","_dec17","passive","_dec18","handleEasingTypeChange","handleGridToggle","handleSnapToggle","handleGridSizeChange","handleSimplifyChange","handleRoundChange","handlePointsChange","handleKeyboardShortcuts","handleLinearPointFocus","event","value","detail","previousType","previousPoints","LINEAR","Array","isArray","bezierPoints","linearPoints","cubicBezierToLinearPoints","emitPointsChange","Math","max","min","requestRender","length","defaultPrevented","activeElement","HTMLInputElement","HTMLTextAreaElement","isContentEditable","index","lastIndex","clonedPoints","map","point","step","shiftKey","handled","key","minX","MIN_LINEAR_DELTA","maxX","MIN_LINEAR_POINTS","splice","normalized","normalizeLinearPoints","nextFocus","preventDefault","sourceEvent","Event","dispatchControlEvent","_initProto","import_lit_html","HTMLElement","disabled","pill","fullWidth","type","block","variant","Button","Component","tag","autoSlot","shadowMode","styles","_dec1","Prop","Boolean","reflect","_dec2","_dec3","_dec4","String","defaultValue","_dec5","onAttributeChange","requestRender","_dec6","render","html","_initProto","CONTROL_CHANGE_EVENT","dispatchControlEvent","setBooleanAttribute","coerceNumber","readControlValue","init_shared","host","type","detail","dispatchEvent","CustomEvent","bubbles","composed","element","name","value","setAttribute","removeAttribute","parsed","Number","isNaN","String","checked","attr","getAttribute","textContent","trim","import_lit_html","HTMLElement","checked","name","value","disabled","control","Checkbox","init_shared","Component","tag","styles","template","html","filterId","_dec1","Prop","type","Boolean","reflect","_dec2","_dec3","_dec4","_dec5","Query","_dec6","Listen","selector","handleClick","connectedCallback","_prevChecked","afterRender","changed","_triggerAnimation","setAttribute","setBooleanAttribute","shadowRoot","querySelector","svg","classList","remove","animClass","duration","add","setTimeout","event","preventDefault","stopPropagation","getAttribute","undefined","detail","dispatchControlEvent","CONTROL_CHANGE_EVENT","_initProto","crypto","randomUUID","import_lit_html","HTMLElement","state","IconChevron","Component","tag","styles","observedAttributes","_dec1","Prop","reflect","attribute","defaultValue","onAttributeChange","next","previous","shadowRoot","querySelector","animate","d","paths","duration","easing","render","html","_initProto","down","up","import_lit_html","HTMLElement","open","disabled","pill","headless","searchable","block","maxHeight","name","value","placeholder","placement","trigger","searchInput","panelContent","contentSlot","nextOptionId","nextPanelId","Dropdown","init_shared","counter","Component","tag","styles","_dec1","Prop","type","Boolean","reflect","onChange","next","previous","handleOpenChange","_dec2","_dec3","_dec4","_dec5","_dec6","String","defaultValue","onAttributeChange","requestRender","_dec7","style","setProperty","_dec8","_dec9","_dec10","attribute","_dec11","_dec12","Query","_dec13","_dec14","_dec15","_dec16","OutsideClick","content","host","triggers","handleOutsideDismiss","connectedCallback","disconnectedCallback","afterRender","ariaLabel","getAttribute","HTMLButtonElement","setAttribute","trim","length","removeAttribute","panel","isInteractive","id","tabIndex","setBooleanAttribute","queueMicrotask","render","placeholderActive","html","query","lowerQuery","toLowerCase","forEach","option","match","label","includes","element","display","toggle","force","originEvent","current","blur","origin","Event","focus","dispatchControlEvent","undefined","event","requestOutsideClickUpdate","slot","removeEventListener","addEventListener","assigned","assignedElements","flatten","elements","filter","node","options","hasAttribute","dataset","active","handlers","click","preventDefault","stopPropagation","keydown","key","passive","push","preselected","find","selected","toggleAttribute","selectedLabel","previousLabel","isSelected","fallback","hasValue","o","target","entry","preventScroll","index","normalized","Math","max","min","step","activeElement","document","currentIndex","findIndex","nextIndex","previousValue","explicitValue","text","textContent","explicitLabel","dispatchEvent","CustomEvent","detail","bubbles","composed","_initProto","input","import_lit_html","HTMLElement","value","placeholder","type","name","disabled","headless","control","Input","init_shared","Component","tag","shadowMode","autoSlot","styles","template","html","Boolean","_dec1","Prop","reflect","_dec2","_dec3","defaultValue","_dec4","_dec5","_dec6","_dec7","Query","_dec8","Listen","selector","_dec9","_dec10","_dec11","onPrefixSlotChange","onSuffixSlotChange","handleInput","handleChange","updatePrefixAttribute","container","shadowRoot","querySelector","prefixSlot","hasPrefix","assignedNodes","flatten","length","setBooleanAttribute","updateSuffixAttribute","suffixSlot","hasSuffix","afterRender","event","target","getAttribute","undefined","detail","dispatchControlEvent","CONTROL_CHANGE_EVENT","_initProto","hsvToRgb","h","s","v","hue","saturation","clamp01","value","c","x","Math","abs","m","r","g","b","round","rgbToHsv","rn","gn","bn","max","min","delta","rgbToHex","toHex","component","toString","padStart","toUpperCase","hexToRgb","hex","normalized","trim","test","match","exec","parseInt","hexToHsv","rgb","hsvToHex","isValidHex","getLuminance","isLightColor","hsvToHsl","l","sl","hslToHsv","sv","getColorComponents","hsv","format","labels","values","suffix","hsl","updateHsvFromComponents","index","newHsv","parsed","vals","Number","COLOR_FORMATS","init_utils","styleObject","input","definedEntries","Object","entries","reduce","acc","property","value","undefined","styleMap","import_lit_html","import_lit_html","HTMLElement","IconArrowsVertical","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconPicker","Component","tag","styles","template","html","import_lit_html","HTMLElement","saturationArea","hueArea","hexInput","value","ColorPicker","init_shared","init_utils","Component","tag","autoSlot","styles","template","h","s","v","hsv","pureHue","hsvToRgb","currentRgb","saturationBg","r","g","b","huePercent","vInverted","saturationHandleStyles","left","top","hueHandleStyles","isLight","isLightColor","hasEyeDropper","window","previewStyles","backgroundColor","components","getColorComponents","format","html","styleMap","handleSaturationPointerDown","handleSaturationPointerMove","handleSaturationPointerUp","handleHuePointerDown","handleHuePointerMove","handleHuePointerUp","handleEyeDropperClick","handleFormatCycle","formatAnimating","toUpperCase","values","e","handleComponentChange","target","labels","map","_","i","max","String","Number","handleCancelButtonClick","handleApplyButtonClick","_dec1","Query","_dec2","_dec3","_dec4","Prop","reflect","defaultValue","onChange","isInternalUpdate","updateFromHex","connectedCallback","originalValue","hex","isValidHex","hexToHsv","event","newValue","hsvToHex","document","activeElement","dispatchControlEvent","updateSaturationValue","rect","getBoundingClientRect","x","Math","min","width","clientX","y","height","clientY","requestRender","updateHue","button","undefined","preventDefault","stopPropagation","pointerId","setPointerCapture","hasPointerCapture","releasePointerCapture","handleHexInputChange","input","index","updateHsvFromComponents","handleFormatChange","setTimeout","currentIndex","COLOR_FORMATS","indexOf","nextIndex","length","eyeDropper","EyeDropper","result","open","sRGBHex","import_lit_html","HTMLElement","dropdown","value","disabled","name","placement","ColorInput","init_shared","init_picker","init_utils","Component","tag","styles","_dec1","Query","_dec2","Prop","reflect","defaultValue","onChange","next","isValidHex","normalized","toUpperCase","_dec3","type","Boolean","_dec4","_dec5","connectedCallback","querySelector","setBooleanAttribute","afterRender","swatchStyle","backgroundColor","html","styleMap","render","_initProto","event","target","dispatchControlEvent","undefined","detail","requestRender","open","import_lit_html","HTMLElement","label","fullWidth","Field","Component","tag","autoSlot","shadowMode","styles","template","html","_dec1","Prop","reflect","_dec2","type","Boolean","_initProto","import_lit_html","HTMLElement","IconClear","Component","tag","styles","template","html","import_lit_html","HTMLElement","state","IconGrid","Component","tag","styles","observedAttributes","_dec1","Prop","reflect","attribute","defaultValue","render","html","_initProto","import_lit_html","HTMLElement","Loading","Component","tag","styles","template","html","import_lit_html","HTMLElement","state","Snap","Component","tag","styles","observedAttributes","_dec1","Prop","reflect","attribute","defaultValue","render","defaultPath","defaultPath2","activePath","activePath2","path1","path2","html","_initProto","import_lit_html","HTMLElement","IconAnchorAdd","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconAnchorRemove","Component","tag","styles","template","html","import_lit_html","HTMLElement","ArrowUp","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconBezier","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconBezierAngle","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconBezierDistribute","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconBezierLength","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconBezierMirror","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconCheck","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconCircleArrowLeft","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconCircleArrowRight","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconCode","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconDots","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconMention","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconMinus","Component","tag","styles","template","html","import_lit_html","HTMLElement","IconPlus","Component","tag","styles","template","html","import_lit_html","HTMLElement","Settings","Component","tag","styles","template","html","import_lit_html","HTMLElement","loading","intro","size","ariaLabel","CENTER","DOTS_DATA","INNER_DOT_IDS","OUTER_DOT_IDS","forceReflow","getAngle","sortByAngle","LOOP_DURATION","ROTATION_DURATION","LogoLoader","x","y","id","cx","cy","map","d","filter","includes","el","window","getComputedStyle","opacity","dot","Math","atan2","ids","find","sort","a","b","Component","tag","styles","template","host","state","ariaLabelTrimmed","trim","html","_dec1","Prop","type","Boolean","attribute","defaultValue","onChange","next","handleLoadingChange","_dec2","_dec3","Number","_dec4","value","requestRender","connectedCallback","requestAnimationFrame","disconnectedCallback","clearTimeout","fn","delay","setTimeout","push","svg","shadowRoot","querySelector","instant","keepOpacity","container","innerHTML","style","transition","classList","remove","removeProperty","transform","onComplete","innerDotIds","Set","innerDots","has","outerDots","orderedInner","forEach","index","fill","orderedOuter","particles","finalAngle","startDistance","random","angleVariation","PI","startAngle","startX","cos","startY","sin","curvature","controlAngle","controlDistance","controlX","controlY","group","floor","groupDelay","withinGroupDelay","duration","impactTime","rotationSpeed","isInner","shockwaveParticles","p","slice","shockwaveSet","particle","steps","step","animateStep","progress","t","mt","easeOut","scale","rotation","bounceDuration","add","earlyRevealTime","max","maxTime","ring","document","createElementNS","setAttribute","String","appendChild","performance","now","orderedInnerDots","seedDelay","targetScale","setProperty","angle","normalizedAngle","animationDelayMs","orderedOuterDots","baseScale","elapsed","timeInCycle","timeLeft","orderedAllDots","i","length","playIntro","variant","originalIntro","_initProto","Watch","options","compare","defaultCompare","onChange","transform","accessor","context","kind","Error","get","call","set","value","previous","scheduleRender","init","initialValue","renderQueue","WeakMap","instance","requestRender","render","requestAnimationFrame","next","import_lit_html","HTMLElement","paused","canvasEl","clamp","mean","quantile","computePercentile","computeMedian","formatNumber","formatMs","rateFps","MonitorFps","value","min","max","Math","values","length","sum","sorted","q","clamped","index","floor","sort","a","b","decimals","Number","isFinite","toFixed","fps","targetFps","target","ratio","Component","tag","autoSlot","shadowMode","styles","_dec1","Prop","type","Boolean","reflect","defaultValue","_dec2","Query","connectedCallback","document","hidden","disconnectedCallback","removeEventListener","afterRender","render","hz","refreshRate","rating","subtitleParts","frameTimeAvg","frameTimeP95","filter","html","join","droppedFrames","jankFrames","longFrames","frameTimeMax","addEventListener","passive","now","performance","requestAnimationFrame","cancelAnimationFrame","frameWindow","slice","fpsWindow","frameAvg","frameP95","frameMax","median","ideal","ft","missed","round","dispatchEvent","CustomEvent","detail","bubbles","composed","canvas","rect","getBoundingClientRect","dpr","window","devicePixelRatio","width","height","ctx","getContext","setTransform","clearRect","samples","scaleMax","stroke","save","globalAlpha","strokeStyle","lineWidth","setLineDash","drawGuide","y","beginPath","moveTo","lineTo","restore","toY","i","x","closePath","fillStyle","fill","lineJoin","lineCap","_initProto","delta","push","shift","elapsed","fpsSample","requestRender","import_lit_html","HTMLElement","metrics","network","METRIC_THRESHOLDS","GLOBAL_BENCHMARKS","rateMetric","formatMetric","formatBytes","estimateCarbonFootprint","Monitor","LCP","good","poor","INP","CLS","FCP","ttfb","loadTime","domInteractive","fps","TBT","metric","value","thresholds","toFixed","Math","round","bytes","decimals","Number","isFinite","k","dm","sizes","i","floor","log","parseFloat","totalBytes","emissions","Component","tag","styles","_dec1","Watch","_dec2","_dec3","Listen","handleFpsUpdate","connectedCallback","initObservers","collectInitialMetrics","startMemoryMonitoring","initNetworkMonitoring","document","readyState","window","addEventListener","handlePageLoad","disconnectedCallback","observers","forEach","observer","disconnect","stopMemoryMonitoring","stopNetworkMonitoring","removeEventListener","event","detail","updateTrend","requestRender","console","warn","PerformanceObserver","list","entry","getEntries","processPerformanceEntry","observe","type","buffered","push","e","error","collectNavigationTiming","resourceEntries","performance","getEntriesByType","processResourceEntries","navigationEntries","length","navTiming","responseStart","fetchStart","loadEventEnd","startTime","navigation","entryType","coreWebVitals","eventEntry","interactionId","duration","maxINP","inpEntries","lsEntry","hadRecentInput","clsEntries","calculateSessionWindowCLS","name","ltEntry","longTaskEntries","calculateLongTasksAndTBT","maxCls","currentSessionCls","sessionStartTime","Infinity","lastTime","sort","a","b","timeDiff","max","entries","summary","resources","size","transferSize","initiator","initiatorType","toLowerCase","endsWith","js","count","css","test","img","other","totalSize","tbt","referenceTime","task","longTasks","totalDuration","memory","updateMemory","mem","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","memoryInterval","setInterval","clearInterval","navigator","connection","updateNetworkInfo","key","history","trendHistory","maxTrendLength","shift","getTrendDirection","currentValue","previousAvg","slice","reduce","threshold","abs","delta","getOverallStatus","ratings","includes","every","r","some","render","html","renderExpanded","renderVitalsAndTiming","renderRealtime","renderNetworkInfo","renderResources","renderMetricBox","label","description","rating","formattedValue","trend","benchmark","vsBenchmark","renderMemory","usedPercent","styleObject","width","min","effectiveType","rtt","toUpperCase","totalCount","renderItem","data","_initProto","setTimeout","import_lit_html","HTMLElement","value","min","max","step","name","disabled","control","NumberInput","init_shared","init_minus","init_plus","Component","tag","styles","template","html","handleInput","handleChange","handleDecrement","bind","Number","handleIncrement","_dec1","Prop","type","reflect","_dec2","_dec3","_dec4","_dec5","_dec6","Boolean","_dec7","Query","_dec8","Listen","selector","_dec9","afterRender","undefined","String","setBooleanAttribute","event","target","coerceNumber","getAttribute","detail","dispatchControlEvent","CONTROL_CHANGE_EVENT","addActiveLayer","button","layer","document","createElement","classList","add","appendChild","setTimeout","remove","currentTarget","current","_initProto","import_lit_html","HTMLElement","value","disabled","control","name","Origin","init_shared","Component","tag","styles","template","html","handleValueChange","_dec1","Prop","reflect","defaultValue","_dec2","type","Boolean","_dec3","Query","_dec4","_dec5","Listen","selector","handleChange","afterRender","setBooleanAttribute","event","target","String","dispatchControlEvent","_initProto","import_lit_html","HTMLElement","activeTab","headline","maxHeight","contentElement","bodyElement","Panel","init_shared","Component","tag","shadowMode","styles","_dec1","Prop","type","Number","reflect","attribute","defaultValue","onChange","next","previous","self","undefined","handleActiveTabChange","_dec2","_dec3","_dec4","Query","_dec5","_dec6","Listen","selector","_dec7","onFooterSlotChange","onDefaultSlotChange","performTabAnimation","tabs","setTab","index","length","connectedCallback","afterRender","render","hasTabs","html","nothing","map","tab","id","e","label","event","dispatchEvent","CustomEvent","detail","bubbles","composed","currentIndex","newIndex","key","preventDefault","queueMicrotask","tabButtons","shadowRoot","querySelectorAll","newTabButton","focus","fromIndex","toIndex","duration","easing","content","requestRender","fromPanel","querySelector","toPanel","startHeight","getBoundingClientRect","height","style","display","opacity","fadeOut","animate","fill","finished","cancel","setAttribute","previousToState","getAttribute","visibility","offsetHeight","endHeight","fadeIn","removeAttribute","ms","Promise","resolve","setTimeout","child","Array","from","children","slot","startsWith","replace","push","slice","updateFooterAttribute","footer","footerSlot","hasFooter","Boolean","assignedNodes","flatten","setBooleanAttribute","_initProto","RadioOption","HTMLElement","connectedCallback","hidden","hasAttribute","setAttribute","customElements","get","define","import_lit_html","HTMLElement","value","groupElement","contentSlot","nextOptionId","nextPanelId","RadioGroup","init_button","init_shared","counter","Component","tag","shadowMode","styles","template","html","_dec1","Prop","reflect","defaultValue","onChange","next","previous","updateOptionSelectionState","_dec2","Query","_dec3","connectedCallback","disconnectedCallback","afterRender","panel","id","tabIndex","setAttribute","queueMicrotask","slot","removeEventListener","addEventListener","assigned","assignedElements","flatten","elements","filter","node","options","forEach","element","hasAttribute","getAttribute","label","trim","length","dataset","active","handlers","click","event","preventDefault","stopPropagation","keydown","key","passive","push","preselected","find","option","selected","selectedLabel","isSelected","fallback","hasValue","Boolean","toggleAttribute","originEvent","previousValue","explicitValue","text","textContent","explicitLabel","dispatchControlEvent","dispatchEvent","CustomEvent","detail","bubbles","composed","_initProto","import_lit_html","HTMLElement","checked","name","value","disabled","control","RadioInput","init_shared","Component","tag","shadowMode","styles","template","html","filterId","_dec1","Prop","type","Boolean","reflect","onChange","next","form","closest","root","getRootNode","others","Array","from","querySelectorAll","forEach","other","_dec2","_dec3","_dec4","_dec5","Query","_dec6","Listen","selector","handleClick","connectedCallback","_prevChecked","afterRender","_firstRender","changed","_triggerAnimation","setAttribute","setBooleanAttribute","input","shadowRoot","querySelector","svg","classList","remove","animClass","add","duration","setTimeout","event","preventDefault","stopPropagation","groupName","getAttribute","undefined","detail","dispatchControlEvent","CONTROL_CHANGE_EVENT","_initProto","crypto","randomUUID","import_lit_html","HTMLElement","value","min","max","step","disabled","control","valueControl","Slider","init_shared","Component","tag","styles","template","html","String","handleRangeInput","handleRangeChange","handleValueInput","handleValueChange","Boolean","undefined","_dec1","Prop","type","Number","reflect","_dec2","_dec3","_dec4","_dec5","_dec6","Query","_dec7","_dec8","Listen","selector","_dec9","_dec10","when","event","CustomEvent","detail","_dec11","afterRender","setAttribute","setBooleanAttribute","updateProgress","target","numericValue","coerceNumber","name","getAttribute","dispatchControlEvent","CONTROL_CHANGE_EVENT","rawValue","controlEvent","percent","style","setProperty","Math","_initProto","import_lit_html","HTMLElement","value","defaultSlot","readControlValue","getControlName","State","init_shared","element","checked","attr","getAttribute","textContent","trim","name","Component","tag","shadowMode","styles","_dec1","Prop","reflect","_dec2","Query","_dec3","Listen","target","host","_dec4","_dec5","CONTROL_CHANGE_EVENT","handleInternalInput","handleInternalChange","handleControlChange","state","get","set","control","Event","subscribe","nameOrCallback","callback","cb","Error","has","Set","add","unsubscribe","delete","reset","Object","entries","connectedCallback","addEventListener","disconnectedCallback","removeEventListener","render","html","event","detail","Element","slot","findControls","el","controls","push","shadowRoot","child","querySelectorAll","childName","clear","elements","assignedElements","flatten","first","values","next","String","prevValue","dispatchControlEvent","_initProto","Map","import_lit_html","HTMLElement","checked","disabled","control","Toggle","init_shared","Component","tag","styles","template","html","filterId","_dec1","Prop","type","Boolean","reflect","_dec2","_dec3","Query","_dec4","Listen","selector","handleClick","afterRender","setAttribute","setBooleanAttribute","event","preventDefault","stopPropagation","name","getAttribute","undefined","detail","value","dispatchControlEvent","CONTROL_CHANGE_EVENT","_initProto","crypto","randomUUID","import_lit_html","HTMLElement","open","delay","placement","triggerElement","contentElement","Tooltip","Component","tag","shadowMode","styles","_dec1","Prop","type","Boolean","reflect","onChange","next","previous","_handleOpenChange","_dec2","Number","defaultValue","_dec3","_dec4","Query","_dec5","_dec6","OutsideClick","content","host","triggers","disabled","handleOutsideDismiss","disconnectedCallback","removeEventListener","afterRender","isVisible","setAttribute","dataset","hidden","render","html","requestOutsideClickUpdate","window","clearTimeout","callback","wait","setTimeout","trigger","addEventListener","_initProto","injectStyle","id","css","nonce","isBrowser","fullId","STYLE_ID_PREFIX","style","document","getElementById","textContent","createElement","head","appendChild","removeStyle","remove","hasStyle","getPresetCSS","preset","RESET_CSS","BASE_CSS","MAIN_CSS","injectPreset","removePreset","window","trim","buildGoogleFontUrl","family","css2","encodedFamily","encodeURIComponent","replace","params","injectPreconnect","isBrowser","document","getElementById","PRECONNECT_ID","head","preconnect1","createElement","id","rel","href","appendChild","preconnect2","crossOrigin","injectFontLink","url","fullId","FONT_LINK_ID_PREFIX","link","removeFontLink","remove","injectFonts","config","preconnect","fonts","DEFAULT_FONTS","hasGoogleFonts","Object","values","some","f","source","name","entries","toLowerCase","removeFonts","keys","loadComponents","tags","promises","map","tag","loader","COMPONENT_LOADERS","Promise","resolve","all","loadAllComponents","WEB_KIT_ALL_TAGS","resolveTags","options","include","exclude","length","filter","includes","excludeSet","Set","has","WEB_KIT_ELEMENT_TAGS","WEB_KIT_COMPONENT_TAGS","WEB_KIT_INTERNAL_TAGS","createLazyLoader","config","isBrowser","dispose","load","root","document","include","exclude","preload","watchTags","Set","WEB_KIT_ALL_TAGS","length","filter","tag","includes","delete","loaded","has","loader","COMPONENT_LOADERS","add","checkElement","element","tagName","toLowerCase","child","querySelectorAll","childTag","observer","MutationObserver","mutations","mutation","node","addedNodes","Element","target","Document","documentElement","observe","childList","subtree","disconnect","_Button","Component","_IconMinus","_IconPlus","Listen","OutsideClick","Prop","Query","_Tooltip","dispatchControlEvent","styleObject","import_lit_html","styleCache","Map","normalizeTemplate","template","fetchStyles","urls","Promise","all","map","url","cached","get","request","fetch","then","response","ok","text","catch","set","Component","options","Base","_context","tag","styles","styleUrls","observedAttributes","shadowMode","autoSlot","Error","templateFn","Decorated","parent","Array","isArray","own","from","Set","args","attachShadow","mode","renderRoot","shadow","connectedCallback","prototype","call","finally","requestRender","disconnectedCallback","attributeChangedCallback","name","oldValue","newValue","onAttributeChange","requestAnimationFrame","length","fetched","inlineStyles","filter","Boolean","join","root","templateResult","render","styleTemplate","html","slotTemplate","completeTemplate","commit","afterRender","wrapRender","fragment","document","createDocumentFragment","tempDiv","createElement","append","childNodes","customElements","define","lifecycleHooks","connectedCallback","WeakMap","disconnectedCallback","cleanupRegistry","addLifecycleHook","instance","hookName","handler","store","callbacks","get","Set","set","original","args","forEach","callback","apply","undefined","add","registerCleanup","cleanup","registered","fn","error","console","delete","resolveTarget","host","target","EventTarget","document","window","renderRoot","shadowRoot","normalizeOptions","selectorOrOptions","selector","buildOptions","options","prevent","stop","stopImmediate","once","passive","capture","when","Listen","eventName","Error","listenConfig","originalMethod","context","addInitializer","attached","attach","addEventListener","warn","String","eventOptions","event","typedEvent","preventDefault","stopImmediatePropagation","stopPropagation","matched","path","composedPath","find","node","Element","matches","call","targetNode","removeEventListener","queueMicrotask","lifecycleApplied","WeakSet","wrapMethod","host","name","hook","callHookFirst","original","args","call","result","apply","ensureLifecycle","has","add","updateOutsideClickHandles","disconnectOutsideClickHandles","OutsideClick","options","originalMethod","context","addInitializer","resolve","owner","content","triggers","handle","createOutsideClickHandle","event","disabled","registerOutsideClickHandle","isConnected","renderQueue","WeakMap","cleanupRegistry","observerRegistry","internalMutations","scheduleRender","instance","requestRender","render","get","set","requestAnimationFrame","delete","toKebabCase","value","String","replace","toLowerCase","registerCleanup","cleanup","callbacks","Set","original","disconnectedCallback","args","registered","forEach","callback","error","console","apply","undefined","add","markInternalMutation","host","attribute","attributes","isInternalMutation","hasAttribute","has","size","observeAttribute","handler","entry","Map","observer","MutationObserver","records","record","attributeName","listeners","currentValue","target","getAttribute","listener","observe","disconnect","updateAttribute","removeAttribute","setAttribute","resolveType","type","Boolean","Number","Object","Array","typeParsers","boolean","number","parsed","isNaN","json","JSON","parse","warn","string","typeFormatters","stringify","defaultCompare","previous","next","Prop","options","reflect","format","defaultValue","compare","onChange","onAttributeChange","resolvedType","parseValue","call","formatValue","accessor","context","kind","Error","name","addInitializer","rawValue","formatted","init","initialValue","defaultOptions","all","closest","from","fallback","resolveFallback","host","resolveRoot","option","document","renderRoot","shadowRoot","resolveQuery","selector","options","result","root","elements","Array","querySelectorAll","length","match","querySelector","createQueryDecorator","_target","context","kind","descriptor","get","set","_value","addInitializer","Object","defineProperty","name","configurable","enumerable","Query","userOptions","Error","merged","renderQueue","WeakMap","scheduleRender","instance","requestRender","render","get","set","requestAnimationFrame","defaultCompare","previous","next","Watch","options","compare","onChange","transform","accessor","context","kind","Error","call","value","init","initialValue","init_button","init_picker","import_lit_html","HTMLElement","open","headline","maxHeight","Component","tag","styles","_dec1","Prop","type","Boolean","reflect","attribute","defaultValue","_dec2","_dec3","Folder","render","html","toggle","_initProto","event","dispatchEvent","CustomEvent","detail","bubbles","composed","stopPropagation","import_lit_html","HTMLElement","state","Component","tag","styles","observedAttributes","_dec1","Prop","reflect","attribute","defaultValue","IconFolder","render","html","_initProto","init_code","init_minus","init_plus","init_input","init_shared","init_tooltip","defaultColors","gray","blue","green","red","orange","yellow","white","black","whiteAlpha","blackAlpha","foreground","defaultRadii","sm","md","lg","xl","full","defaultSpacing","xs","defaultTypography","fontFamily","fontMono","fontSize","lineHeight","defaultEaseVars","defaultThemeConfig","colors","defaultColors","radii","defaultRadii","spacing","defaultSpacing","typography","defaultTypography","vars","DEFAULT_THEME_NAME","DARK_THEME_ALIAS","registry","Map","mergeConfigs","base","overrides","colors","gray","blue","green","red","orange","yellow","whiteAlpha","blackAlpha","radii","spacing","typography","vars","resolveThemeConfig","name","visited","Set","has","Error","Array","from","join","entry","get","resolved","add","config","baseConfig","initBuiltInThemes","DEFAULT_THEME_NAME","set","defaultThemeConfig","DARK_THEME_ALIAS","isThemeRef","value","__brand","isThemeConfig","obj","undefined","registerTheme","options","baseName","values","getTheme","theme","hasTheme","getThemeNames","keys","themeRef","CSS_PREFIX","RADII_PREFIX","SPACING_PREFIX","TYPOGRAPHY_PREFIX","toVarName","prefix","parts","join","generateColorScaleVars","name","scale","vars","level","value","Object","entries","undefined","withAlpha","color","alpha","trimmed","trim","match","exec","fn","innerRaw","inner","includes","pct","Math","round","generateColorVars","colors","gray","assign","blue","green","red","orange","yellow","white","black","whiteAlpha","blackAlpha","foreground","resolveThemeTarget","element","document","documentElement","generateRadiiVars","radii","generateSpacingVars","spacing","generateTypographyVars","typography","fontFamily","fontMono","fontSize","lineHeight","normalizeCustomVarName","startsWith","generateCustomVars","out","key","String","generateThemeVars","config","createTheme","selector","declarations","map","defineTheme","target","style","setProperty","removeTheme","keys","removeProperty","getThemeValue","token","getComputedStyle","varName","getPropertyValue","setThemeValue","EASE_THEME_ATTRIBUTE","mergeTheme","overrides","defaultColors","defaultRadii","defaultSpacing","defaultTypography","createDarkTheme","setThemeName","options","attribute","setAttribute","colorScheme","setColorScheme","getThemeName","getAttribute","applyTheme","theme","mergeWithDefaults","getSystemThemeMode","window","matchMedia","matches","followSystemTheme","themes","media","apply","mode","light","dark","lightName","darkName","addEventListener","removeEventListener","isBrowser","document","window","isThemeModeConfig","value","obj","mode","undefined","light","dark","registerReplacements","replace","tag","replacement","Object","entries","customElements","get","define","aliasTag","BridgeElement","HTMLElement","connectedCallback","_inner","createElement","attr","attributes","setAttribute","name","firstChild","appendChild","shadow","attachShadow","disconnectedCallback","applyStyles","styles","nonce","dispose","injectPreset","removePreset","injected","push","reset","base","preset","applyThemeConfig","theme","target","lightConfig","getTheme","darkConfig","cleanup","followSystemTheme","element","controller","set","t","config","applyTheme","m","systemMode","matchMedia","matches","colorScheme","resolvedConfig","isThemeRef","themeName","initWebKit","options","ready","Promise","resolve","include","exclude","fonts","lazyLoad","cspNonce","dev","disposers","readyPromise","stylesResult","themeResult","injectFonts","removeFonts","fontsToRemove","createLazyLoader","lazyConfig","loader","loadAllComponents","loadComponents","resolveTags","tags","warnUnknownTags","WEB_KIT_ALL_TAGS","allTags","Set","unknown","filter","has","length","console","warn","logLoads","log","import_lit_html","import_class_map","import_if_defined","import_repeat","import_style_map","import_unsafe_html","import_when","renderIf","condition","template","nothing","renderList","items","key","item","repeat","styleObject","input","definedEntries","Object","entries","reduce","acc","property","value","undefined","styleMap","optionalAttribute","ifDefined"]}