@desktalk/ui 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/desktalk-ui.js +25 -22
- package/dist/desktalk-ui.js.map +4 -4
- package/dist/dt-select.d.ts +1 -0
- package/dist/dt-select.d.ts.map +1 -1
- package/dist/dt-tooltip.d.ts +5 -0
- package/dist/dt-tooltip.d.ts.map +1 -1
- package/dist/index.js +22 -19
- package/dist/index.js.map +4 -4
- package/dist/milkdown.umd.js.map +1 -1
- package/package.json +1 -1
- package/types.d.ts +1 -0
package/dist/desktalk-ui.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "raw-css:/
|
|
4
|
-
"sourcesContent": ["/**\n * @desktalk/ui \u2014 Framework-agnostic web components for the DeskTalk design system.\n *\n * Importing this module registers all custom elements. The shell loads it once;\n * every miniapp gets the elements for free because they share the same document.\n */\n\nimport { DtTooltip } from './dt-tooltip';\nimport { DtCard } from './dt-card';\nimport { DtSelect } from './dt-select';\nimport { DtGrid } from './dt-grid';\nimport { DtStack } from './dt-stack';\nimport { DtStat } from './dt-stat';\nimport { DtBadge } from './dt-badge';\nimport { DtButton } from './dt-button';\nimport { DtDivider } from './dt-divider';\nimport { DtColumn, DtTableView } from './dt-table-view';\nimport { DtListView } from './dt-list-view';\nimport { DtChart } from './dt-chart';\nimport { DtMarkdown } from './dt-markdown';\nimport { DtMarkdownEditor } from './dt-markdown-editor';\nimport './ui-elements';\n\nexport {\n DtTooltip,\n DtCard,\n DtSelect,\n DtGrid,\n DtStack,\n DtStat,\n DtBadge,\n DtButton,\n DtDivider,\n DtListView,\n DtTableView,\n DtColumn,\n DtChart,\n DtMarkdown,\n DtMarkdownEditor,\n};\n\n// \u2500\u2500 Auto-register \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nif (!customElements.get('dt-tooltip')) {\n customElements.define('dt-tooltip', DtTooltip);\n}\n\nif (!customElements.get('dt-card')) {\n customElements.define('dt-card', DtCard);\n}\n\nif (!customElements.get('dt-select')) {\n customElements.define('dt-select', DtSelect);\n}\n\nif (!customElements.get('dt-grid')) {\n customElements.define('dt-grid', DtGrid);\n}\n\nif (!customElements.get('dt-stack')) {\n customElements.define('dt-stack', DtStack);\n}\n\nif (!customElements.get('dt-stat')) {\n customElements.define('dt-stat', DtStat);\n}\n\nif (!customElements.get('dt-badge')) {\n customElements.define('dt-badge', DtBadge);\n}\n\nif (!customElements.get('dt-button')) {\n customElements.define('dt-button', DtButton);\n}\n\nif (!customElements.get('dt-divider')) {\n customElements.define('dt-divider', DtDivider);\n}\n\nif (!customElements.get('dt-list-view')) {\n customElements.define('dt-list-view', DtListView);\n}\n\nif (!customElements.get('dt-table-view')) {\n customElements.define('dt-table-view', DtTableView);\n}\n\nif (!customElements.get('dt-column')) {\n customElements.define('dt-column', DtColumn);\n}\n\nif (!customElements.get('dt-chart')) {\n customElements.define('dt-chart', DtChart);\n}\n\nif (!customElements.get('dt-markdown')) {\n customElements.define('dt-markdown', DtMarkdown);\n}\n\nif (!customElements.get('dt-markdown-editor')) {\n customElements.define('dt-markdown-editor', DtMarkdownEditor);\n}\n", "export default \".dt-tooltip-popup {\\n position: fixed;\\n z-index: 2147483647;\\n padding: 6px 10px;\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n color: var(--dt-text-secondary);\\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\\n font-size: 12px;\\n font-weight: 500;\\n line-height: 1.4;\\n white-space: nowrap;\\n pointer-events: none;\\n user-select: none;\\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);\\n}\\n\\n/* Tech corner accents */\\n.dt-tooltip-popup::before {\\n content: '';\\n position: absolute;\\n top: -1px;\\n left: -1px;\\n width: 4px;\\n height: 4px;\\n border-top: 1px solid var(--dt-accent);\\n border-left: 1px solid var(--dt-accent);\\n}\\n\\n.dt-tooltip-popup::after {\\n content: '';\\n position: absolute;\\n bottom: -1px;\\n right: -1px;\\n width: 4px;\\n height: 4px;\\n border-bottom: 1px solid var(--dt-accent);\\n border-right: 1px solid var(--dt-accent);\\n}\\n\\n/* Arrow styling - tech/minimal */\\n.dt-tooltip-popup[data-actual-placement='top'] {\\n transform: translateX(-50%);\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='top']::before {\\n top: auto;\\n bottom: -4px;\\n left: 50%;\\n transform: translateX(-50%);\\n width: 0;\\n height: 0;\\n border: 4px solid transparent;\\n border-top-color: var(--dt-accent);\\n border-left: none;\\n border-right: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='bottom'] {\\n transform: translateX(-50%);\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='bottom']::before {\\n bottom: auto;\\n top: -4px;\\n left: 50%;\\n transform: translateX(-50%);\\n width: 0;\\n height: 0;\\n border: 4px solid transparent;\\n border-bottom-color: var(--dt-accent);\\n border-left: none;\\n border-right: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='left'] {\\n transform: translateY(-50%);\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='left']::before {\\n left: auto;\\n top: 50%;\\n right: -4px;\\n transform: translateY(-50%);\\n width: 0;\\n height: 0;\\n border: 4px solid transparent;\\n border-left-color: var(--dt-accent);\\n border-top: none;\\n border-bottom: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='right'] {\\n transform: translateY(-50%);\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='right']::before {\\n right: auto;\\n top: 50%;\\n left: -4px;\\n transform: translateY(-50%);\\n width: 0;\\n height: 0;\\n border: 4px solid transparent;\\n border-right-color: var(--dt-accent);\\n border-top: none;\\n border-bottom: none;\\n}\\n\";", "import tooltipCss from './styles/tooltip.css?raw';\n\nconst CLS = 'dt-tooltip-popup';\n\ntype Placement = 'top' | 'bottom' | 'left' | 'right';\n\nconst ARROW_GAP = 8; // px gap between trigger and tooltip\n\n/** Ensure the shared popup stylesheet is injected exactly once. */\nlet styleInjected = false;\nfunction ensureStyles(): void {\n if (styleInjected) return;\n const style = document.createElement('style');\n style.setAttribute('data-dt-tooltip', '');\n style.textContent = tooltipCss;\n document.head.appendChild(style);\n styleInjected = true;\n}\n\n/**\n * `<dt-tooltip>` \u2014 framework-agnostic tooltip web component.\n *\n * Uses Shadow DOM with a `<slot>` for the trigger element. The tooltip popup\n * is appended to `document.body` so it can escape overflow/clip ancestors.\n *\n * ## Attributes\n * - `content` \u2014 tooltip text (required)\n * - `placement` \u2014 preferred side: top | bottom | left | right (default \"top\")\n * - `delay` \u2014 show delay in milliseconds (default 0)\n * - `disabled` \u2014 when present, tooltip is suppressed\n *\n * ## Usage\n * ```html\n * <dt-tooltip content=\"Save file\" placement=\"top\">\n * <button>Save</button>\n * </dt-tooltip>\n * ```\n */\nexport class DtTooltip extends HTMLElement {\n // \u2500\u2500 Private state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _popup: HTMLDivElement | null = null;\n private _showTimeout: ReturnType<typeof setTimeout> | null = null;\n private _tooltipId = '';\n private _visible = false;\n\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['content', 'placement', 'delay', 'disabled'];\n }\n\n // \u2500\u2500 Attribute helpers (getters + setters so frameworks can set props) \u2500\u2500\u2500\n get content(): string {\n return this.getAttribute('content') ?? '';\n }\n set content(val: string) {\n this.setAttribute('content', val);\n }\n\n get placement(): Placement {\n const val = this.getAttribute('placement');\n if (val === 'bottom' || val === 'left' || val === 'right') return val;\n return 'top';\n }\n set placement(val: Placement) {\n this.setAttribute('placement', val);\n }\n\n get delay(): number {\n const val = Number(this.getAttribute('delay'));\n return Number.isFinite(val) && val > 0 ? val : 0;\n }\n set delay(val: number | string) {\n this.setAttribute('delay', String(val));\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n shadow.innerHTML = '<slot></slot>';\n\n this._tooltipId = `dt-tip-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n connectedCallback(): void {\n ensureStyles();\n\n this.addEventListener('mouseenter', this._onEnter);\n this.addEventListener('mouseleave', this._onLeave);\n this.addEventListener('focusin', this._onEnter);\n this.addEventListener('focusout', this._onLeave);\n }\n\n disconnectedCallback(): void {\n this.removeEventListener('mouseenter', this._onEnter);\n this.removeEventListener('mouseleave', this._onLeave);\n this.removeEventListener('focusin', this._onEnter);\n this.removeEventListener('focusout', this._onLeave);\n this._hide();\n }\n\n attributeChangedCallback(name: string, _old: string | null, _next: string | null): void {\n if (name === 'disabled' && this.disabled) {\n this._hide();\n }\n if (name === 'content' && this._popup) {\n this._popup.textContent = this.content;\n }\n }\n\n // \u2500\u2500 Event handlers (arrow functions for stable `this`) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _onEnter = (): void => {\n if (this.disabled || !this.content) return;\n\n if (this._showTimeout !== null) clearTimeout(this._showTimeout);\n\n const show = (): void => {\n this._createPopup();\n this._position();\n this._visible = true;\n };\n\n if (this.delay > 0) {\n this._showTimeout = setTimeout(show, this.delay);\n } else {\n show();\n }\n };\n\n private _onLeave = (): void => {\n this._hide();\n };\n\n // \u2500\u2500 Popup management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _createPopup(): void {\n if (this._popup) return;\n\n const popup = document.createElement('div');\n popup.className = CLS;\n popup.id = this._tooltipId;\n popup.setAttribute('role', 'tooltip');\n popup.textContent = this.content;\n document.body.appendChild(popup);\n this._popup = popup;\n\n // Wire ARIA on the first slotted child (the logical trigger)\n const trigger = this._getTrigger();\n if (trigger) {\n trigger.setAttribute('aria-describedby', this._tooltipId);\n }\n }\n\n private _hide(): void {\n if (this._showTimeout !== null) {\n clearTimeout(this._showTimeout);\n this._showTimeout = null;\n }\n if (this._popup) {\n // Remove ARIA from trigger\n const trigger = this._getTrigger();\n if (trigger) {\n trigger.removeAttribute('aria-describedby');\n }\n\n this._popup.remove();\n this._popup = null;\n this._visible = false;\n }\n }\n\n private _getTrigger(): Element | null {\n // First slotted child, or fall back to the host element itself\n const slot = this.shadowRoot?.querySelector('slot');\n const assigned = slot?.assignedElements();\n return assigned && assigned.length > 0 ? assigned[0] : null;\n }\n\n // \u2500\u2500 Positioning with flip logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _position(): void {\n const popup = this._popup;\n if (!popup) return;\n\n const triggerRect = this.getBoundingClientRect();\n const popupRect = popup.getBoundingClientRect();\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n let actual = this.placement;\n\n // Flip if not enough space on the preferred side\n if (actual === 'top' && triggerRect.top - popupRect.height - ARROW_GAP < 0) {\n actual = 'bottom';\n } else if (actual === 'bottom' && triggerRect.bottom + popupRect.height + ARROW_GAP > vh) {\n actual = 'top';\n } else if (actual === 'left' && triggerRect.left - popupRect.width - ARROW_GAP < 0) {\n actual = 'right';\n } else if (actual === 'right' && triggerRect.right + popupRect.width + ARROW_GAP > vw) {\n actual = 'left';\n }\n\n popup.setAttribute('data-actual-placement', actual);\n\n let top: number;\n let left: number;\n\n switch (actual) {\n case 'top':\n left = triggerRect.left + triggerRect.width / 2;\n top = triggerRect.top - popupRect.height - ARROW_GAP;\n break;\n case 'bottom':\n left = triggerRect.left + triggerRect.width / 2;\n top = triggerRect.bottom + ARROW_GAP;\n break;\n case 'left':\n left = triggerRect.left - popupRect.width - ARROW_GAP;\n top = triggerRect.top + triggerRect.height / 2;\n break;\n case 'right':\n left = triggerRect.right + ARROW_GAP;\n top = triggerRect.top + triggerRect.height / 2;\n break;\n }\n\n popup.style.left = `${left}px`;\n popup.style.top = `${top}px`;\n }\n}\n", "export default \":host {\\n display: block;\\n margin-bottom: 12px;\\n}\\n\\n.dt-card-inner {\\n background: var(--dt-surface);\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n padding: 12px;\\n color: var(--dt-text);\\n font-family: var(--font-ui, 'Work Sans', system-ui, sans-serif);\\n position: relative;\\n height: 100%;\\n}\\n\\n/* Corner accents for sci-fi feel */\\n.dt-card-inner::before {\\n content: '';\\n position: absolute;\\n top: -1px;\\n left: -1px;\\n width: 8px;\\n height: 8px;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-card-inner::after {\\n content: '';\\n position: absolute;\\n bottom: -1px;\\n right: -1px;\\n width: 8px;\\n height: 8px;\\n border-bottom: 2px solid var(--dt-accent);\\n border-right: 2px solid var(--dt-accent);\\n}\\n\\n:host([variant='outlined']) .dt-card-inner {\\n background: transparent;\\n border-style: dashed;\\n}\\n\\n:host([variant='filled']) .dt-card-inner {\\n background: var(--dt-accent-subtle);\\n border-style: solid;\\n}\\n\\n::slotted(h1),\\n::slotted(h2),\\n::slotted(h3),\\n::slotted(h4),\\n::slotted(h5),\\n::slotted(h6) {\\n color: var(--dt-accent);\\n margin: 0 0 6px;\\n line-height: 1.2;\\n font-family: var(--font-display, 'Sora', system-ui, sans-serif);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.1em;\\n font-size: 0.85rem;\\n}\\n\\n::slotted(p) {\\n color: var(--dt-text-secondary);\\n margin: 0 0 6px;\\n line-height: 1.4;\\n font-family: var(--font-ui, 'Work Sans', system-ui, sans-serif);\\n font-size: 0.8125rem;\\n}\\n\\n::slotted(p:last-child) {\\n margin-bottom: 0;\\n}\\n\";", "import cardCss from './styles/card.css?raw';\n\nconst CARD_CLS = 'dt-card-inner';\n\ntype CardVariant = 'default' | 'outlined' | 'filled';\n\n/**\n * `<dt-card>` \u2014 framework-agnostic card web component.\n *\n * Renders a card container with a solid border using the theme accent color\n * and no border-radius.\n *\n * ## Attributes\n * - `variant` \u2014 visual style: default | outlined | filled (default \"default\")\n *\n * ## Usage\n * ```html\n * <dt-card>\n * <h3>Title</h3>\n * <p>Card content goes here.</p>\n * </dt-card>\n *\n * <dt-card variant=\"outlined\">\n * <p>Outlined card with transparent background.</p>\n * </dt-card>\n * ```\n */\nexport class DtCard extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['variant'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get variant(): CardVariant {\n const val = this.getAttribute('variant');\n if (val === 'outlined' || val === 'filled') return val;\n return 'default';\n }\n\n set variant(val: CardVariant) {\n this.setAttribute('variant', val);\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = cardCss;\n shadow.appendChild(style);\n\n const wrapper = document.createElement('div');\n wrapper.className = CARD_CLS;\n wrapper.innerHTML = '<slot></slot>';\n shadow.appendChild(wrapper);\n }\n}\n", "export default \".dt-select-menu {\\n position: fixed;\\n z-index: 2147483646;\\n display: flex;\\n min-width: 200px;\\n max-width: min(300px, 72vw);\\n max-height: 240px;\\n flex-direction: column;\\n overflow-y: auto;\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);\\n opacity: 0;\\n pointer-events: none;\\n transition: opacity 100ms ease;\\n}\\n\\n.dt-select-menu[data-open] {\\n opacity: 1;\\n pointer-events: auto;\\n}\\n\\n.dt-select-option {\\n display: flex;\\n width: 100%;\\n align-items: center;\\n justify-content: space-between;\\n padding: 8px 10px;\\n border: 0;\\n border-bottom: 1px solid var(--dt-border-subtle);\\n background: transparent;\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n font-size: 0.8125rem;\\n font-weight: 600;\\n letter-spacing: 0.04em;\\n text-align: left;\\n cursor: pointer;\\n transition: all 0.1s ease;\\n user-select: none;\\n}\\n\\n.dt-select-option:last-child {\\n border-bottom: none;\\n}\\n\\n.dt-select-option:hover {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-option.dt-select-option--active {\\n background: var(--dt-accent-subtle);\\n color: var(--dt-accent);\\n}\\n\\n.dt-select-option span {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\";", "export default \":host {\\n display: block;\\n width: 100%;\\n min-width: 0;\\n position: relative;\\n}\\n\\n:host([disabled]) .dt-select-trigger {\\n cursor: not-allowed;\\n opacity: 0.4;\\n}\\n\\n.dt-select-trigger {\\n display: flex;\\n width: 100%;\\n min-width: 0;\\n max-width: 100%;\\n box-sizing: border-box;\\n align-items: center;\\n gap: 6px;\\n padding: 6px 10px;\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n font-size: 0.8125rem;\\n font-weight: 600;\\n letter-spacing: 0.04em;\\n line-height: 1;\\n cursor: pointer;\\n transition: all 0.1s ease;\\n user-select: none;\\n position: relative;\\n}\\n\\n/* Corner accents */\\n.dt-select-trigger::before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 4px;\\n height: 4px;\\n border-top: 1px solid var(--dt-accent);\\n border-left: 1px solid var(--dt-accent);\\n}\\n\\n.dt-select-trigger::after {\\n content: '';\\n position: absolute;\\n bottom: 0;\\n right: 0;\\n width: 4px;\\n height: 4px;\\n border-bottom: 1px solid var(--dt-accent);\\n border-right: 1px solid var(--dt-accent);\\n}\\n\\n.dt-select-trigger:hover:not([disabled]) {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-trigger:hover:not([disabled])::before,\\n.dt-select-trigger:hover:not([disabled])::after {\\n border-color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-trigger[aria-expanded='true'] {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-trigger[aria-expanded='true']::before,\\n.dt-select-trigger[aria-expanded='true']::after {\\n border-color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-label {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\\n.dt-select-chevron {\\n color: currentColor;\\n font-size: 10px;\\n transition: transform 140ms ease;\\n opacity: 0.7;\\n}\\n\\n.dt-select-trigger[aria-expanded='true'] .dt-select-chevron {\\n transform: rotate(180deg);\\n}\\n\";", "import selectMenuCss from './styles/select-menu.css?raw';\nimport selectTriggerCss from './styles/select-trigger.css?raw';\n\nconst TRIGGER_CLS = 'dt-select-trigger';\nconst LABEL_CLS = 'dt-select-label';\nconst CHEVRON_CLS = 'dt-select-chevron';\nconst MENU_CLS = 'dt-select-menu';\nconst OPTION_CLS = 'dt-select-option';\nconst OPTION_ACTIVE_CLS = 'dt-select-option--active';\n\n/** Shape of an option passed via the `options` property. */\nexport interface DtSelectOption {\n value: string;\n label: string;\n}\n\n/** Ensure the shared global menu stylesheet is injected exactly once. */\nlet menuStyleInjected = false;\nfunction ensureMenuStyles(): void {\n if (menuStyleInjected) return;\n const style = document.createElement('style');\n style.setAttribute('data-dt-select', '');\n style.textContent = selectMenuCss;\n document.head.appendChild(style);\n menuStyleInjected = true;\n}\n\nexport type DtSelectAlign = 'left' | 'right';\n\n/**\n * `<dt-select>` \u2014 framework-agnostic select/dropdown web component.\n *\n * Uses Shadow DOM for the trigger button and appends the dropdown menu to\n * `document.body` so it can escape overflow/clip ancestors.\n *\n * ## Attributes\n * - `value` \u2014 the currently selected option value\n * - `placeholder` \u2014 text shown when no value is selected (default \"Select...\")\n * - `disabled` \u2014 when present, interaction is suppressed\n * - `align` \u2014 horizontal alignment of the popup relative to the trigger:\n * \"left\" (default) or \"right\"\n *\n * ## Properties\n * - `options` \u2014 `Array<{ value: string; label: string }>` set via JS\n *\n * ## Events\n * - `dt-change` \u2014 fired when the user selects an option; `detail.value` is\n * the selected value\n *\n * ## Usage\n * ```html\n * <dt-select placeholder=\"Choose session\" value=\"s1\" align=\"right\"></dt-select>\n * <script>\n * const sel = document.querySelector('dt-select');\n * sel.options = [\n * { value: 's1', label: 'Session 1' },\n * { value: 's2', label: 'Session 2' },\n * ];\n * sel.addEventListener('dt-change', (e) => console.log(e.detail.value));\n * </script>\n * ```\n */\nexport class DtSelect extends HTMLElement {\n // \u2500\u2500 Private state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _menu: HTMLDivElement | null = null;\n private _trigger: HTMLButtonElement | null = null;\n private _options: DtSelectOption[] = [];\n private _open = false;\n private _menuId = '';\n\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['value', 'placeholder', 'disabled', 'align'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n get value(): string {\n return this.getAttribute('value') ?? '';\n }\n set value(val: string) {\n this.setAttribute('value', val);\n }\n\n get placeholder(): string {\n return this.getAttribute('placeholder') ?? 'Select\\u2026';\n }\n set placeholder(val: string) {\n this.setAttribute('placeholder', val);\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n get align(): DtSelectAlign {\n const val = this.getAttribute('align');\n if (val === 'right') return 'right';\n return 'left';\n }\n set align(val: DtSelectAlign) {\n this.setAttribute('align', val);\n }\n\n // \u2500\u2500 Options property (JS-only, not reflected as attribute) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n get options(): DtSelectOption[] {\n return this._options;\n }\n set options(val: DtSelectOption[]) {\n this._options = val;\n this._updateLabel();\n if (this._open) {\n this._renderMenuItems();\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = selectTriggerCss;\n shadow.appendChild(style);\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = TRIGGER_CLS;\n btn.setAttribute('aria-haspopup', 'listbox');\n btn.setAttribute('aria-expanded', 'false');\n\n const label = document.createElement('span');\n label.className = LABEL_CLS;\n btn.appendChild(label);\n\n const chevron = document.createElement('span');\n chevron.className = CHEVRON_CLS;\n chevron.setAttribute('aria-hidden', 'true');\n chevron.textContent = '\\u25BE'; // \u25BE small down-pointing triangle\n btn.appendChild(chevron);\n\n shadow.appendChild(btn);\n\n this._trigger = btn;\n this._menuId = `dt-sel-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n connectedCallback(): void {\n ensureMenuStyles();\n this._trigger!.addEventListener('click', this._onTriggerClick);\n this._updateLabel();\n }\n\n disconnectedCallback(): void {\n this._trigger!.removeEventListener('click', this._onTriggerClick);\n this._close();\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'value') {\n this._updateLabel();\n if (this._open) {\n this._renderMenuItems();\n }\n }\n if (name === 'placeholder' && !this.value) {\n this._updateLabel();\n }\n if (name === 'disabled' && this.disabled) {\n this._close();\n }\n }\n\n // \u2500\u2500 Private helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _updateLabel(): void {\n const labelEl = this._trigger!.querySelector(`.${LABEL_CLS}`) as HTMLSpanElement;\n const selected = this._options.find((o) => o.value === this.value);\n labelEl.textContent = selected?.label ?? this.placeholder;\n }\n\n // \u2500\u2500 Toggle / open / close \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _onTriggerClick = (): void => {\n if (this.disabled) return;\n if (this._open) {\n this._close();\n } else {\n this._openMenu();\n }\n };\n\n private _openMenu(): void {\n if (this._open) return;\n\n const menu = document.createElement('div');\n menu.className = MENU_CLS;\n menu.id = this._menuId;\n menu.setAttribute('role', 'listbox');\n document.body.appendChild(menu);\n this._menu = menu;\n\n this._renderMenuItems();\n this._position();\n\n // Show after a microtask so the transition plays\n requestAnimationFrame(() => {\n menu.setAttribute('data-open', '');\n });\n\n this._open = true;\n this._trigger!.setAttribute('aria-expanded', 'true');\n\n // Close on outside click (next tick to avoid the current click)\n requestAnimationFrame(() => {\n document.addEventListener('mousedown', this._onOutsideClick);\n document.addEventListener('keydown', this._onKeyDown);\n });\n }\n\n private _close(): void {\n if (!this._open) return;\n\n document.removeEventListener('mousedown', this._onOutsideClick);\n document.removeEventListener('keydown', this._onKeyDown);\n\n if (this._menu) {\n this._menu.removeAttribute('data-open');\n // Remove after the fade-out transition\n const menu = this._menu;\n setTimeout(() => menu.remove(), 140);\n this._menu = null;\n }\n\n this._open = false;\n this._trigger!.setAttribute('aria-expanded', 'false');\n }\n\n private _onOutsideClick = (e: MouseEvent): void => {\n const target = e.target as Node;\n // Click inside the menu or on the trigger \u2014 ignore\n if (this._menu?.contains(target) || this.contains(target)) return;\n this._close();\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n this._close();\n this._trigger!.focus();\n }\n };\n\n // \u2500\u2500 Menu rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _renderMenuItems(): void {\n const menu = this._menu;\n if (!menu) return;\n\n menu.innerHTML = '';\n\n for (const opt of this._options) {\n const item = document.createElement('button');\n item.type = 'button';\n item.className = OPTION_CLS;\n item.setAttribute('role', 'option');\n item.setAttribute('aria-selected', String(opt.value === this.value));\n\n if (opt.value === this.value) {\n item.classList.add(OPTION_ACTIVE_CLS);\n }\n\n const label = document.createElement('span');\n label.textContent = opt.label;\n item.appendChild(label);\n\n item.addEventListener('click', () => {\n this._selectValue(opt.value);\n });\n\n menu.appendChild(item);\n }\n }\n\n private _selectValue(val: string): void {\n const prev = this.value;\n this.value = val;\n this._updateLabel();\n this._close();\n\n if (val !== prev) {\n this.dispatchEvent(\n new CustomEvent('dt-change', {\n detail: { value: val },\n bubbles: true,\n composed: true,\n }),\n );\n }\n }\n\n // \u2500\u2500 Positioning \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _position(): void {\n const menu = this._menu;\n if (!menu) return;\n\n const triggerRect = this.getBoundingClientRect();\n const gap = 10;\n const minW = Math.max(triggerRect.width, 240);\n\n // Place below the trigger by default\n let top = triggerRect.bottom + gap;\n\n // If the menu would overflow the viewport bottom, flip above\n const menuHeight = menu.scrollHeight || 260;\n const vh = window.innerHeight;\n if (top + menuHeight > vh && triggerRect.top - menuHeight - gap > 0) {\n top = triggerRect.top - menuHeight - gap;\n }\n\n menu.style.minWidth = `${minW}px`;\n\n // Horizontal alignment\n if (this.align === 'right') {\n // Anchor the menu's right edge to the trigger's right edge\n const vw = window.innerWidth;\n menu.style.right = `${vw - triggerRect.right}px`;\n menu.style.left = 'auto';\n } else {\n menu.style.left = `${triggerRect.left}px`;\n menu.style.right = 'auto';\n }\n\n menu.style.top = `${top}px`;\n }\n}\n", "export default \":host {\\n display: block;\\n margin-bottom: 12px;\\n}\\n\\n.dt-grid-inner {\\n display: grid;\\n gap: var(--grid-gap, 12px);\\n grid-template-columns: repeat(auto-fit, minmax(var(--min-width, 220px), 1fr));\\n}\\n\\n:host([cols='1']) .dt-grid-inner {\\n grid-template-columns: repeat(1, 1fr);\\n}\\n\\n:host([cols='2']) .dt-grid-inner {\\n grid-template-columns: repeat(2, 1fr);\\n}\\n\\n:host([cols='3']) .dt-grid-inner {\\n grid-template-columns: repeat(3, 1fr);\\n}\\n\\n:host([cols='4']) .dt-grid-inner {\\n grid-template-columns: repeat(4, 1fr);\\n}\\n\\n:host([cols='5']) .dt-grid-inner {\\n grid-template-columns: repeat(5, 1fr);\\n}\\n\\n:host([cols='6']) .dt-grid-inner {\\n grid-template-columns: repeat(6, 1fr);\\n}\\n\\n@media (max-width: 480px) {\\n :host([cols='2']) .dt-grid-inner,\\n :host([cols='3']) .dt-grid-inner,\\n :host([cols='4']) .dt-grid-inner,\\n :host([cols='5']) .dt-grid-inner,\\n :host([cols='6']) .dt-grid-inner {\\n grid-template-columns: 1fr;\\n }\\n}\\n\\n:host([gap='0']) .dt-grid-inner {\\n --grid-gap: 0;\\n}\\n:host([gap='4']) .dt-grid-inner {\\n --grid-gap: 4px;\\n}\\n:host([gap='8']) .dt-grid-inner {\\n --grid-gap: 8px;\\n}\\n:host([gap='12']) .dt-grid-inner {\\n --grid-gap: 12px;\\n}\\n:host([gap='16']) .dt-grid-inner {\\n --grid-gap: 16px;\\n}\\n:host([gap='20']) .dt-grid-inner {\\n --grid-gap: 20px;\\n}\\n:host([gap='24']) .dt-grid-inner {\\n --grid-gap: 24px;\\n}\\n:host([gap='32']) .dt-grid-inner {\\n --grid-gap: 32px;\\n}\\n\\n:host([min-width='150']) .dt-grid-inner {\\n --min-width: 150px;\\n}\\n:host([min-width='180']) .dt-grid-inner {\\n --min-width: 180px;\\n}\\n:host([min-width='200']) .dt-grid-inner {\\n --min-width: 200px;\\n}\\n:host([min-width='220']) .dt-grid-inner {\\n --min-width: 220px;\\n}\\n:host([min-width='260']) .dt-grid-inner {\\n --min-width: 260px;\\n}\\n:host([min-width='300']) .dt-grid-inner {\\n --min-width: 300px;\\n}\\n\\n::slotted(*) {\\n min-width: 0;\\n}\\n\";", "import gridCss from './styles/grid.css?raw';\n\nconst GRID_CLS = 'dt-grid-inner';\n\ntype GridCols = '1' | '2' | '3' | '4' | '5' | '6';\ntype GridGap = '0' | '4' | '8' | '12' | '16' | '20' | '24' | '32';\ntype GridMinWidth = '150' | '180' | '200' | '220' | '260' | '300';\n\n/**\n * `<dt-grid>` \u2014 framework-agnostic responsive grid web component.\n *\n * Provides a grid layout that auto-collapses to single column in narrow views.\n * Uses CSS Grid's repeat(auto-fit) pattern with minmax for responsive behavior.\n *\n * ## Attributes\n * - `cols` \u2014 fixed number of columns (1-6). Auto-fit responsive when omitted.\n * - `gap` \u2014 spacing between items: 0, 4, 8, 12, 16, 20, 24, 32 (default: 16)\n * - `min-width` \u2014 minimum width for auto-fit columns: 150, 180, 200, 220, 260, 300 (default: 220)\n *\n * ## Usage\n * ```html\n * <!-- Auto-responsive: columns collapse based on available space -->\n * <dt-grid>\n * <dt-card>Item 1</dt-card>\n * <dt-card>Item 2</dt-card>\n * <dt-card>Item 3</dt-card>\n * </dt-grid>\n *\n * <!-- Fixed 3 columns, collapses to 1 on mobile -->\n * <dt-grid cols=\"3\" gap=\"24\">\n * <dt-card>Item 1</dt-card>\n * <dt-card>Item 2</dt-card>\n * <dt-card>Item 3</dt-card>\n * </dt-grid>\n *\n * <!-- Narrow items: more columns fit side-by-side -->\n * <dt-grid min-width=\"150\">\n * <dt-stat label=\"CPU\" value=\"42%\"></dt-stat>\n * <dt-stat label=\"RAM\" value=\"8GB\"></dt-stat>\n * <dt-stat label=\"Disk\" value=\"256GB\"></dt-stat>\n * </dt-grid>\n * ```\n */\nexport class DtGrid extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['cols', 'gap', 'min-width'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get cols(): GridCols | null {\n const val = this.getAttribute('cols');\n if (val === '1' || val === '2' || val === '3' || val === '4' || val === '5' || val === '6') {\n return val;\n }\n return null;\n }\n\n set cols(val: GridCols | null) {\n if (val === null) {\n this.removeAttribute('cols');\n } else {\n this.setAttribute('cols', val);\n }\n }\n\n get gap(): GridGap {\n const val = this.getAttribute('gap');\n if (\n val === '0' ||\n val === '4' ||\n val === '8' ||\n val === '12' ||\n val === '20' ||\n val === '24' ||\n val === '32'\n ) {\n return val;\n }\n return '16';\n }\n\n set gap(val: GridGap) {\n this.setAttribute('gap', val);\n }\n\n get minWidth(): GridMinWidth {\n const val = this.getAttribute('min-width');\n if (val === '150' || val === '180' || val === '200' || val === '260' || val === '300') {\n return val;\n }\n return '220';\n }\n\n set minWidth(val: GridMinWidth) {\n this.setAttribute('min-width', val);\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = gridCss;\n shadow.appendChild(style);\n\n const wrapper = document.createElement('div');\n wrapper.className = GRID_CLS;\n wrapper.innerHTML = '<slot></slot>';\n shadow.appendChild(wrapper);\n }\n}\n", "export default \":host {\\n display: block;\\n margin-bottom: 12px;\\n}\\n\\n.dt-stack-inner {\\n display: flex;\\n flex-direction: var(--flex-direction, column);\\n gap: var(--stack-gap, 12px);\\n align-items: var(--align-items, stretch);\\n}\\n\\n:host([direction='column']) .dt-stack-inner {\\n --flex-direction: column;\\n}\\n:host([direction='row']) .dt-stack-inner {\\n --flex-direction: row;\\n}\\n\\n:host([gap='0']) .dt-stack-inner {\\n --stack-gap: 0;\\n}\\n:host([gap='4']) .dt-stack-inner {\\n --stack-gap: 4px;\\n}\\n:host([gap='8']) .dt-stack-inner {\\n --stack-gap: 8px;\\n}\\n:host([gap='12']) .dt-stack-inner {\\n --stack-gap: 12px;\\n}\\n:host([gap='16']) .dt-stack-inner {\\n --stack-gap: 16px;\\n}\\n:host([gap='20']) .dt-stack-inner {\\n --stack-gap: 20px;\\n}\\n:host([gap='24']) .dt-stack-inner {\\n --stack-gap: 24px;\\n}\\n:host([gap='32']) .dt-stack-inner {\\n --stack-gap: 32px;\\n}\\n\\n:host([align='start']) .dt-stack-inner {\\n --align-items: flex-start;\\n}\\n:host([align='center']) .dt-stack-inner {\\n --align-items: center;\\n}\\n:host([align='end']) .dt-stack-inner {\\n --align-items: flex-end;\\n}\\n:host([align='stretch']) .dt-stack-inner {\\n --align-items: stretch;\\n}\\n\\n@media (max-width: 480px) {\\n :host([direction='row']) .dt-stack-inner {\\n --flex-direction: column;\\n }\\n}\\n\\n::slotted(*) {\\n min-width: 0;\\n}\\n\";", "import stackCss from './styles/stack.css?raw';\n\nconst STACK_CLS = 'dt-stack-inner';\n\ntype StackDirection = 'column' | 'row';\ntype StackGap = '0' | '4' | '8' | '12' | '16' | '20' | '24' | '32';\ntype StackAlign = 'start' | 'center' | 'end' | 'stretch';\n\nfunction normalizeDirection(value: string | null): StackDirection {\n if (value === 'row' || value === 'horizontal') {\n return 'row';\n }\n\n return 'column';\n}\n\n/**\n * `<dt-stack>` \u2014 framework-agnostic flexbox stack web component.\n *\n * Provides vertical or horizontal flexbox layout with responsive behavior.\n * Row stacks automatically wrap to column on narrow views.\n *\n * ## Attributes\n * - `direction` \u2014 stack direction: `column` (default) or `row`\n * - `gap` \u2014 spacing between items: 0, 4, 8, 12, 16, 20, 24, 32 (default: 16)\n * - `align` \u2014 cross-axis alignment: `start`, `center`, `end`, `stretch` (default: stretch)\n *\n * ## Usage\n * ```html\n * <!-- Vertical stack (default) -->\n * <dt-stack>\n * <dt-card>Item 1</dt-card>\n * <dt-card>Item 2</dt-card>\n * <dt-card>Item 3</dt-card>\n * </dt-stack>\n *\n * <!-- Horizontal row (wraps to column on narrow views) -->\n * <dt-stack direction=\"row\" gap=\"24\">\n * <dt-button>Save</dt-button>\n * <dt-button variant=\"secondary\">Cancel</dt-button>\n * </dt-stack>\n *\n * <!-- Centered horizontal row -->\n * <dt-stack direction=\"row\" align=\"center\" gap=\"8\">\n * <dt-badge variant=\"success\">Active</dt-badge>\n * <span>System running</span>\n * </dt-stack>\n * ```\n */\nexport class DtStack extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['direction', 'gap', 'align'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get direction(): StackDirection {\n return normalizeDirection(this.getAttribute('direction'));\n }\n\n set direction(val: StackDirection) {\n this.setAttribute('direction', normalizeDirection(val));\n }\n\n get gap(): StackGap {\n const val = this.getAttribute('gap');\n if (\n val === '0' ||\n val === '4' ||\n val === '8' ||\n val === '12' ||\n val === '20' ||\n val === '24' ||\n val === '32'\n ) {\n return val;\n }\n return '16';\n }\n\n set gap(val: StackGap) {\n this.setAttribute('gap', val);\n }\n\n get align(): StackAlign {\n const val = this.getAttribute('align');\n if (val === 'start' || val === 'center' || val === 'end') {\n return val;\n }\n return 'stretch';\n }\n\n set align(val: StackAlign) {\n this.setAttribute('align', val);\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n connectedCallback() {\n this.#normalizeAttributes();\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'direction') {\n this.#normalizeAttributes();\n }\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = stackCss;\n shadow.appendChild(style);\n\n const wrapper = document.createElement('div');\n wrapper.className = STACK_CLS;\n wrapper.innerHTML = '<slot></slot>';\n shadow.appendChild(wrapper);\n }\n\n #normalizeAttributes(): void {\n const rawDirection = this.getAttribute('direction');\n const normalizedDirection = normalizeDirection(rawDirection);\n if (rawDirection !== null && rawDirection !== normalizedDirection) {\n this.setAttribute('direction', normalizedDirection);\n }\n }\n}\n", "export default \":host {\\n display: block;\\n}\\n\\n.dt-stat-inner {\\n background: var(--dt-surface);\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n padding: 12px;\\n font-family: var(--font-ui, 'Work Sans', system-ui, sans-serif);\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n position: relative;\\n}\\n\\n/* Corner accents */\\n.dt-stat-inner::before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 6px;\\n height: 6px;\\n border-top: 1px solid var(--dt-accent);\\n border-left: 1px solid var(--dt-accent);\\n}\\n\\n.dt-stat-inner .label {\\n font-size: 0.625rem;\\n font-weight: 600;\\n color: var(--dt-text-muted);\\n text-transform: uppercase;\\n letter-spacing: 0.12em;\\n}\\n\\n.dt-stat-inner .value {\\n font-size: 1.5rem;\\n font-weight: 600;\\n color: var(--dt-accent);\\n line-height: 1.1;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n font-family: var(--font-display, 'Sora', system-ui, sans-serif);\\n}\\n\\n.dt-stat-inner .description {\\n font-size: 0.75rem;\\n color: var(--dt-text-secondary);\\n line-height: 1.3;\\n}\\n\\n/* Size variants */\\n:host([size='sm']) .dt-stat-inner .value {\\n font-size: 1.125rem;\\n}\\n\\n:host([size='sm']) .dt-stat-inner {\\n padding: 8px;\\n}\\n\\n:host([size='lg']) .dt-stat-inner .value {\\n font-size: 2rem;\\n}\\n\\n:host([size='lg']) .dt-stat-inner {\\n padding: 16px;\\n}\\n\\n/* Variant: outlined */\\n:host([variant='outlined']) .dt-stat-inner {\\n background: transparent;\\n border-style: dashed;\\n}\\n\\n/* Variant: filled */\\n:host([variant='filled']) .dt-stat-inner {\\n background: var(--dt-accent-subtle);\\n border-style: solid;\\n}\\n\\n/* Trend indicators */\\n.dt-stat-inner .trend {\\n display: inline-flex;\\n align-items: center;\\n gap: 3px;\\n font-size: 0.6875rem;\\n font-weight: 600;\\n margin-top: 2px;\\n text-transform: uppercase;\\n letter-spacing: 0.05em;\\n}\\n\\n.dt-stat-inner .trend.positive {\\n color: var(--dt-success);\\n}\\n\\n.dt-stat-inner .trend.negative {\\n color: var(--dt-danger);\\n}\\n\\n.dt-stat-inner .trend.neutral {\\n color: var(--dt-text-muted);\\n}\\n\";", "import statCss from './styles/stat.css?raw';\n\nconst STAT_CLS = 'dt-stat-inner';\n\ntype StatSize = 'sm' | 'md' | 'lg';\ntype StatVariant = 'default' | 'outlined' | 'filled';\n\n/**\n * `<dt-stat>` \u2014 framework-agnostic statistic/metric display web component.\n *\n * Displays a metric/KPI with label, value, and optional description.\n * Designed for dashboards and system monitors.\n *\n * ## Attributes\n * - `label` \u2014 the metric label (e.g., \"CPU Usage\", \"Memory\")\n * - `value` \u2014 the metric value (e.g., \"42%\", \"8.2 GB\")\n * - `description` \u2014 optional descriptive text\n * - `size` \u2014 size variant: `sm`, `md` (default), `lg`\n * - `variant` \u2014 visual style: `default`, `outlined`, `filled`\n * - `trend` \u2014 optional trend indicator: `up`, `down`, `neutral` (shows +/\u2212 symbol)\n * - `trend-value` \u2014 value to display with trend (e.g., \"+5%\")\n *\n * ## Usage\n * ```html\n * <dt-stat label=\"CPU Usage\" value=\"42%\"></dt-stat>\n *\n * <dt-stat label=\"Memory\" value=\"8.2 GB\" description=\"of 16 GB used\"></dt-stat>\n *\n * <dt-stat label=\"Uptime\" value=\"99.9%\" size=\"lg\" variant=\"filled\"></dt-stat>\n *\n * <dt-stat\n * label=\"Traffic\"\n * value=\"12.5k\"\n * description=\"visitors today\"\n * trend=\"up\"\n * trend-value=\"+18%\"\n * ></dt-stat>\n * ```\n */\nexport class DtStat extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['label', 'value', 'description', 'size', 'variant', 'trend', 'trend-value'];\n }\n\n // \u2500\u2500 Internal refs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _container!: HTMLDivElement;\n private _labelEl!: HTMLDivElement;\n private _valueEl!: HTMLDivElement;\n private _descEl!: HTMLDivElement;\n private _trendEl!: HTMLDivElement;\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get label(): string | null {\n return this.getAttribute('label');\n }\n\n set label(val: string | null) {\n if (val === null) {\n this.removeAttribute('label');\n } else {\n this.setAttribute('label', val);\n }\n }\n\n get value(): string | null {\n return this.getAttribute('value');\n }\n\n set value(val: string | null) {\n if (val === null) {\n this.removeAttribute('value');\n } else {\n this.setAttribute('value', val);\n }\n }\n\n get description(): string | null {\n return this.getAttribute('description');\n }\n\n set description(val: string | null) {\n if (val === null) {\n this.removeAttribute('description');\n } else {\n this.setAttribute('description', val);\n }\n }\n\n get size(): StatSize {\n const val = this.getAttribute('size');\n if (val === 'sm' || val === 'lg') return val;\n return 'md';\n }\n\n set size(val: StatSize) {\n this.setAttribute('size', val);\n }\n\n get variant(): StatVariant {\n const val = this.getAttribute('variant');\n if (val === 'outlined' || val === 'filled') return val;\n return 'default';\n }\n\n set variant(val: StatVariant) {\n this.setAttribute('variant', val);\n }\n\n get trend(): 'up' | 'down' | 'neutral' | null {\n const val = this.getAttribute('trend');\n if (val === 'up' || val === 'down' || val === 'neutral') return val;\n return null;\n }\n\n set trend(val: 'up' | 'down' | 'neutral' | null) {\n if (val === null) {\n this.removeAttribute('trend');\n } else {\n this.setAttribute('trend', val);\n }\n }\n\n get trendValue(): string | null {\n return this.getAttribute('trend-value');\n }\n\n set trendValue(val: string | null) {\n if (val === null) {\n this.removeAttribute('trend-value');\n } else {\n this.setAttribute('trend-value', val);\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = statCss;\n shadow.appendChild(style);\n\n this._container = document.createElement('div');\n this._container.className = STAT_CLS;\n\n this._labelEl = document.createElement('div');\n this._labelEl.className = 'label';\n this._container.appendChild(this._labelEl);\n\n this._valueEl = document.createElement('div');\n this._valueEl.className = 'value';\n this._container.appendChild(this._valueEl);\n\n this._descEl = document.createElement('div');\n this._descEl.className = 'description';\n this._container.appendChild(this._descEl);\n\n this._trendEl = document.createElement('div');\n this._trendEl.className = 'trend';\n this._container.appendChild(this._trendEl);\n\n shadow.appendChild(this._container);\n\n this._render();\n }\n\n // \u2500\u2500 Updates \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n attributeChangedCallback(name: string, _oldVal: string | null, _newVal: string | null): void {\n if (\n name === 'label' ||\n name === 'value' ||\n name === 'description' ||\n name === 'size' ||\n name === 'variant' ||\n name === 'trend' ||\n name === 'trend-value'\n ) {\n this._render();\n }\n }\n\n private _render(): void {\n this._labelEl.textContent = this.label ?? '';\n this._labelEl.style.display = this.label ? 'block' : 'none';\n\n this._valueEl.textContent = this.value ?? '';\n this._valueEl.style.display = this.value ? 'block' : 'none';\n\n this._descEl.textContent = this.description ?? '';\n this._descEl.style.display = this.description ? 'block' : 'none';\n\n const trend = this.trend;\n const trendValue = this.trendValue;\n\n if (trend && trendValue) {\n this._trendEl.style.display = 'inline-flex';\n this._trendEl.className = `trend ${trend === 'up' ? 'positive' : trend === 'down' ? 'negative' : 'neutral'}`;\n\n let symbol = '';\n if (trend === 'up') symbol = '\u2191';\n else if (trend === 'down') symbol = '\u2193';\n else symbol = '\u2192';\n\n this._trendEl.textContent = `${symbol} ${trendValue}`;\n } else {\n this._trendEl.style.display = 'none';\n }\n }\n}\n", "export default \":host {\\n display: inline-flex;\\n vertical-align: middle;\\n}\\n\\n.dt-badge-inner {\\n display: inline-flex;\\n align-items: center;\\n padding: 2px 6px;\\n border: 1px solid;\\n border-radius: 2px;\\n font-size: 0.6875rem;\\n font-weight: 600;\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n line-height: 1.2;\\n white-space: nowrap;\\n text-transform: uppercase;\\n letter-spacing: 0.1em;\\n}\\n\\n/* Variant: accent (default) */\\n:host([variant='accent']) .dt-badge-inner,\\n.dt-badge-inner {\\n background: var(--dt-accent-subtle);\\n border-color: var(--dt-accent);\\n color: var(--dt-accent);\\n}\\n\\n/* Variant: success */\\n:host([variant='success']) .dt-badge-inner {\\n background: var(--dt-success-subtle);\\n border-color: var(--dt-success);\\n color: var(--dt-success);\\n}\\n\\n/* Variant: danger */\\n:host([variant='danger']) .dt-badge-inner {\\n background: var(--dt-danger-subtle);\\n border-color: var(--dt-danger);\\n color: var(--dt-danger);\\n}\\n\\n/* Variant: warning */\\n:host([variant='warning']) .dt-badge-inner {\\n background: var(--dt-warning-subtle);\\n border-color: var(--dt-warning);\\n color: var(--dt-warning);\\n}\\n\\n/* Variant: info */\\n:host([variant='info']) .dt-badge-inner {\\n background: var(--dt-info-subtle);\\n border-color: var(--dt-info);\\n color: var(--dt-info);\\n}\\n\\n/* Variant: default/neutral */\\n:host([variant='default']) .dt-badge-inner,\\n:host([variant='neutral']) .dt-badge-inner {\\n background: transparent;\\n border-color: var(--dt-border);\\n color: var(--dt-text-secondary);\\n}\\n\\n/* Size variants */\\n:host([size='sm']) .dt-badge-inner {\\n padding: 1px 4px;\\n font-size: 0.625rem;\\n}\\n\\n:host([size='lg']) .dt-badge-inner {\\n padding: 3px 8px;\\n font-size: 0.75rem;\\n}\\n\";", "import badgeCss from './styles/badge.css?raw';\n\nconst BADGE_CLS = 'dt-badge-inner';\n\ntype BadgeVariant = 'accent' | 'success' | 'danger' | 'warning' | 'info' | 'default' | 'neutral';\ntype BadgeSize = 'sm' | 'md' | 'lg';\n\n/**\n * `<dt-badge>` \u2014 framework-agnostic status badge web component.\n *\n * Inline status pill/badge for labels and indicators.\n *\n * ## Attributes\n * - `variant` \u2014 status color: `accent` (default), `success`, `danger`, `warning`, `info`, `neutral`\n * - `size` \u2014 size: `sm`, `md` (default), `lg`\n * - `text` \u2014 the badge text (alternative to slot)\n *\n * ## Usage\n * ```html\n * <dt-badge>New</dt-badge>\n *\n * <dt-badge variant=\"success\">Active</dt-badge>\n *\n * <dt-badge variant=\"danger\" size=\"lg\">Error</dt-badge>\n *\n * <dt-badge variant=\"info\" size=\"sm\">Beta</dt-badge>\n * ```\n */\nexport class DtBadge extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['variant', 'size', 'text'];\n }\n\n // \u2500\u2500 Internal refs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _container!: HTMLSpanElement;\n private _slot!: HTMLSlotElement;\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get variant(): BadgeVariant {\n const val = this.getAttribute('variant');\n if (\n val === 'success' ||\n val === 'danger' ||\n val === 'warning' ||\n val === 'info' ||\n val === 'default' ||\n val === 'neutral'\n ) {\n return val;\n }\n return 'accent';\n }\n\n set variant(val: BadgeVariant) {\n this.setAttribute('variant', val);\n }\n\n get size(): BadgeSize {\n const val = this.getAttribute('size');\n if (val === 'sm' || val === 'lg') return val;\n return 'md';\n }\n\n set size(val: BadgeSize) {\n this.setAttribute('size', val);\n }\n\n get text(): string | null {\n return this.getAttribute('text');\n }\n\n set text(val: string | null) {\n if (val === null) {\n this.removeAttribute('text');\n } else {\n this.setAttribute('text', val);\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = badgeCss;\n shadow.appendChild(style);\n\n this._container = document.createElement('span');\n this._container.className = BADGE_CLS;\n\n // If text attribute is set, use it; otherwise use a slot\n const textAttr = this.text;\n if (textAttr !== null) {\n this._container.textContent = textAttr;\n } else {\n this._slot = document.createElement('slot');\n this._container.appendChild(this._slot);\n }\n\n shadow.appendChild(this._container);\n }\n\n // \u2500\u2500 Updates \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n attributeChangedCallback(name: string, _oldVal: string | null, _newVal: string | null): void {\n if (name === 'text') {\n this._render();\n }\n }\n\n private _render(): void {\n const textAttr = this.text;\n if (textAttr !== null) {\n this._container.textContent = textAttr;\n }\n }\n}\n", "export default \":host {\\n display: inline-flex;\\n vertical-align: middle;\\n}\\n\\n.dt-button-inner {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: 4px;\\n padding: 6px 12px;\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n font-size: 0.8125rem;\\n font-weight: 600;\\n font-family: var(--font-ui, 'Work Sans', system-ui, sans-serif);\\n line-height: 1.2;\\n cursor: pointer;\\n transition: all 0.1s ease;\\n background: var(--dt-surface);\\n color: var(--dt-accent);\\n text-transform: uppercase;\\n letter-spacing: 0.08em;\\n position: relative;\\n}\\n\\n/* Corner accents */\\n.dt-button-inner::before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 4px;\\n height: 4px;\\n border-top: 1px solid var(--dt-accent);\\n border-left: 1px solid var(--dt-accent);\\n}\\n\\n.dt-button-inner::after {\\n content: '';\\n position: absolute;\\n bottom: 0;\\n right: 0;\\n width: 4px;\\n height: 4px;\\n border-bottom: 1px solid var(--dt-accent);\\n border-right: 1px solid var(--dt-accent);\\n}\\n\\n.dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n.dt-button-inner:hover:not(:disabled)::before,\\n.dt-button-inner:hover:not(:disabled)::after {\\n border-color: var(--dt-text-on-accent);\\n}\\n\\n.dt-button-inner:active:not(:disabled) {\\n background: var(--dt-accent-active);\\n}\\n\\n.dt-button-inner:disabled {\\n opacity: 0.4;\\n cursor: not-allowed;\\n border-color: var(--dt-border);\\n color: var(--dt-text-muted);\\n}\\n\\n.dt-button-inner:disabled::before,\\n.dt-button-inner:disabled::after {\\n border-color: var(--dt-border);\\n}\\n\\n/* Variant: primary - filled accent */\\n:host([variant='primary']) .dt-button-inner {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n:host([variant='primary']) .dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-accent-hover);\\n}\\n\\n/* Variant: secondary - outlined */\\n:host([variant='secondary']) .dt-button-inner {\\n background: transparent;\\n border-color: var(--dt-border);\\n color: var(--dt-text);\\n}\\n\\n:host([variant='secondary']) .dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-surface-hover);\\n border-color: var(--dt-accent);\\n color: var(--dt-accent);\\n}\\n\\n/* Variant: ghost - minimal */\\n:host([variant='ghost']) .dt-button-inner {\\n background: transparent;\\n border-color: transparent;\\n color: var(--dt-text-secondary);\\n}\\n\\n:host([variant='ghost']) .dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-surface);\\n border-color: var(--dt-border);\\n color: var(--dt-text);\\n}\\n\\n:host([variant='ghost']) .dt-button-inner::before,\\n:host([variant='ghost']) .dt-button-inner::after {\\n display: none;\\n}\\n\\n/* Variant: danger */\\n:host([variant='danger']) .dt-button-inner {\\n background: transparent;\\n border-color: var(--dt-danger);\\n color: var(--dt-danger);\\n}\\n\\n:host([variant='danger']) .dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-danger);\\n color: var(--dt-text-on-accent);\\n}\\n\\n:host([variant='danger']) .dt-button-inner::before,\\n:host([variant='danger']) .dt-button-inner::after {\\n border-color: var(--dt-danger);\\n}\\n\\n:host([variant='danger']) .dt-button-inner:hover:not(:disabled)::before,\\n:host([variant='danger']) .dt-button-inner:hover:not(:disabled)::after {\\n border-color: var(--dt-text-on-accent);\\n}\\n\\n/* Size: sm */\\n:host([size='sm']) .dt-button-inner {\\n padding: 4px 8px;\\n font-size: 0.75rem;\\n}\\n\\n/* Size: lg */\\n:host([size='lg']) .dt-button-inner {\\n padding: 8px 16px;\\n font-size: 0.875rem;\\n}\\n\\n:host([fullwidth]) .dt-button-inner {\\n width: 100%;\\n}\\n\\n::slotted([slot='icon']) {\\n display: inline-flex;\\n width: 1em;\\n height: 1em;\\n}\\n\";", "import buttonCss from './styles/button.css?raw';\n\nconst BUTTON_CLS = 'dt-button-inner';\n\ntype ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';\ntype ButtonSize = 'sm' | 'md' | 'lg';\n\n/**\n * `<dt-button>` \u2014 framework-agnostic button web component.\n *\n * Themed button with multiple variants and sizes. Automatically styles to match\n * the DeskTalk design system using CSS custom properties.\n *\n * ## Attributes\n * - `variant` \u2014 button style: `primary` (default), `secondary`, `ghost`, `danger`\n * - `size` \u2014 button size: `sm`, `md` (default), `lg`\n * - `disabled` \u2014 disables the button\n * - `fullwidth` \u2014 makes the button fill its container width\n * - `type` \u2014 HTML button type: `button` (default), `submit`, `reset`\n *\n * ## Slots\n * - default \u2014 button content (text, icons, etc.)\n * - `icon` \u2014 icon element positioned before the content\n *\n * ## Usage\n * ```html\n * <dt-button>Save</dt-button>\n *\n * <dt-button variant=\"secondary\">Cancel</dt-button>\n *\n * <dt-button variant=\"danger\" size=\"sm\">Delete</dt-button>\n *\n * <dt-button variant=\"ghost\" disabled>Disabled</dt-button>\n *\n * <dt-button fullwidth>Full Width Button</dt-button>\n * ```\n */\nexport class DtButton extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['variant', 'size', 'disabled', 'fullwidth', 'type'];\n }\n\n // \u2500\u2500 Internal refs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _button!: HTMLButtonElement;\n private _slot!: HTMLSlotElement;\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get variant(): ButtonVariant {\n const val = this.getAttribute('variant');\n if (val === 'secondary' || val === 'ghost' || val === 'danger') return val;\n return 'primary';\n }\n\n set variant(val: ButtonVariant) {\n this.setAttribute('variant', val);\n }\n\n get size(): ButtonSize {\n const val = this.getAttribute('size');\n if (val === 'sm' || val === 'lg') return val;\n return 'md';\n }\n\n set size(val: ButtonSize) {\n this.setAttribute('size', val);\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n get fullwidth(): boolean {\n return this.hasAttribute('fullwidth');\n }\n\n set fullwidth(val: boolean) {\n if (val) {\n this.setAttribute('fullwidth', '');\n } else {\n this.removeAttribute('fullwidth');\n }\n }\n\n get type(): 'button' | 'submit' | 'reset' {\n const val = this.getAttribute('type');\n if (val === 'submit' || val === 'reset') return val;\n return 'button';\n }\n\n set type(val: 'button' | 'submit' | 'reset') {\n this.setAttribute('type', val);\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = buttonCss;\n shadow.appendChild(style);\n\n this._button = document.createElement('button');\n this._button.className = BUTTON_CLS;\n this._button.type = this.type;\n this._button.disabled = this.disabled;\n\n this._slot = document.createElement('slot');\n this._button.appendChild(this._slot);\n\n // Handle form submission for submit buttons\n this._button.addEventListener('click', () => {\n if (this.type === 'submit' && !this.disabled) {\n const form = this.closest('form');\n if (form) {\n form.requestSubmit();\n }\n }\n });\n\n shadow.appendChild(this._button);\n }\n\n // \u2500\u2500 Updates \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n attributeChangedCallback(name: string, _oldVal: string | null, _newVal: string | null): void {\n switch (name) {\n case 'disabled':\n this._button.disabled = this.disabled;\n break;\n case 'type':\n this._button.type = this.type;\n break;\n }\n }\n}\n", "export default \":host {\\n display: block;\\n}\\n\\n.dt-divider-inner {\\n border: none;\\n margin: 0;\\n flex-shrink: 0;\\n}\\n\\n/* Horizontal (default) */\\n:host([direction='horizontal']) .dt-divider-inner,\\n.dt-divider-inner {\\n width: 100%;\\n height: 1px;\\n background: var(--dt-accent);\\n opacity: 0.5;\\n}\\n\\n/* Vertical */\\n:host([direction='vertical']) .dt-divider-inner {\\n width: 1px;\\n height: 100%;\\n min-height: 1em;\\n background: var(--dt-accent);\\n opacity: 0.5;\\n}\\n\\n/* Style variants */\\n:host([style-variant='subtle']) .dt-divider-inner {\\n background: var(--dt-border);\\n opacity: 1;\\n}\\n\\n:host([style-variant='strong']) .dt-divider-inner {\\n background: var(--dt-accent);\\n opacity: 1;\\n height: 2px;\\n}\\n\\n:host([direction='vertical'][style-variant='strong']) .dt-divider-inner {\\n width: 2px;\\n height: 100%;\\n}\\n\\n/* Spacing */\\n:host([spacing='sm']) .dt-divider-inner {\\n margin: 6px 0;\\n}\\n:host([spacing='md']) .dt-divider-inner {\\n margin: 12px 0;\\n}\\n:host([spacing='lg']) .dt-divider-inner {\\n margin: 18px 0;\\n}\\n\\n:host([direction='vertical'][spacing='sm']) .dt-divider-inner {\\n margin: 0 6px;\\n}\\n:host([direction='vertical'][spacing='md']) .dt-divider-inner {\\n margin: 0 12px;\\n}\\n:host([direction='vertical'][spacing='lg']) .dt-divider-inner {\\n margin: 0 18px;\\n}\\n\";", "import dividerCss from './styles/divider.css?raw';\n\nconst DIVIDER_CLS = 'dt-divider-inner';\n\ntype DividerDirection = 'horizontal' | 'vertical';\ntype DividerStyle = 'default' | 'subtle' | 'strong';\ntype DividerSpacing = 'sm' | 'md' | 'lg';\n\n/**\n * `<dt-divider>` \u2014 framework-agnostic divider/separator web component.\n *\n * Horizontal or vertical separator line for organizing content.\n *\n * ## Attributes\n * - `direction` \u2014 divider orientation: `horizontal` (default) or `vertical`\n * - `style-variant` \u2014 border style: `default`, `subtle`, `strong`\n * - `spacing` \u2014 margin around divider: `sm`, `md`, `lg`\n *\n * ## Usage\n * ```html\n * <!-- Horizontal divider (default) -->\n * <dt-divider></dt-divider>\n *\n * <!-- Subtle horizontal divider with spacing -->\n * <dt-divider style-variant=\"subtle\" spacing=\"md\"></dt-divider>\n *\n * <!-- Vertical divider in a row layout -->\n * <dt-stack direction=\"row\">\n * <span>Left</span>\n * <dt-divider direction=\"vertical\"></dt-divider>\n * <span>Right</span>\n * </dt-stack>\n * ```\n */\nexport class DtDivider extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['direction', 'style-variant', 'spacing'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get direction(): DividerDirection {\n const val = this.getAttribute('direction');\n if (val === 'vertical') return 'vertical';\n return 'horizontal';\n }\n\n set direction(val: DividerDirection) {\n this.setAttribute('direction', val);\n }\n\n get styleVariant(): DividerStyle {\n const val = this.getAttribute('style-variant');\n if (val === 'subtle' || val === 'strong') return val;\n return 'default';\n }\n\n set styleVariant(val: DividerStyle) {\n this.setAttribute('style-variant', val);\n }\n\n get spacing(): DividerSpacing | null {\n const val = this.getAttribute('spacing');\n if (val === 'sm' || val === 'md' || val === 'lg') return val;\n return null;\n }\n\n set spacing(val: DividerSpacing | null) {\n if (val === null) {\n this.removeAttribute('spacing');\n } else {\n this.setAttribute('spacing', val);\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = dividerCss;\n shadow.appendChild(style);\n\n const hr = document.createElement('hr');\n hr.className = DIVIDER_CLS;\n shadow.appendChild(hr);\n }\n}\n", "export default \":host {\\n display: block;\\n min-height: 180px;\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n}\\n\\n.dt-table-view {\\n display: flex;\\n flex-direction: column;\\n min-height: inherit;\\n height: 100%;\\n overflow: hidden;\\n background: var(--dt-surface);\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n position: relative;\\n}\\n\\n.dt-table-view::before,\\n.dt-table-view::after {\\n content: '';\\n position: absolute;\\n width: 8px;\\n height: 8px;\\n pointer-events: none;\\n z-index: 3;\\n}\\n\\n.dt-table-view::before {\\n top: -1px;\\n left: -1px;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-table-view::after {\\n right: -1px;\\n bottom: -1px;\\n border-right: 2px solid var(--dt-accent);\\n border-bottom: 2px solid var(--dt-accent);\\n}\\n\\n.dt-table-scroll {\\n min-height: inherit;\\n height: 100%;\\n overflow: auto;\\n}\\n\\n.dt-table-header,\\n.dt-table-row {\\n display: grid;\\n grid-template-columns: var(--dt-table-columns, minmax(0, 1fr));\\n min-width: fit-content;\\n}\\n\\n.dt-table-header {\\n position: sticky;\\n top: 0;\\n z-index: 2;\\n background: color-mix(in srgb, var(--dt-surface) 88%, var(--dt-accent) 12%);\\n border-bottom: 1px solid var(--dt-border);\\n}\\n\\n.dt-table-header-cell,\\n.dt-table-cell {\\n min-width: 0;\\n padding: 10px 12px;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n font-size: 0.8125rem;\\n}\\n\\n.dt-table-header-cell {\\n color: var(--dt-accent);\\n font-size: 0.75rem;\\n font-weight: 600;\\n letter-spacing: 0.1em;\\n text-transform: uppercase;\\n}\\n\\n.dt-table-header-cell--sortable {\\n cursor: pointer;\\n user-select: none;\\n}\\n\\n.dt-table-header-cell--sortable:hover {\\n background: var(--dt-surface-hover);\\n}\\n\\n.dt-table-header-label {\\n display: inline-flex;\\n align-items: center;\\n gap: 6px;\\n}\\n\\n.dt-table-sort-indicator {\\n color: var(--dt-text-secondary);\\n font-size: 0.7rem;\\n}\\n\\n.dt-table-body {\\n position: relative;\\n}\\n\\n.dt-table-canvas {\\n position: relative;\\n}\\n\\n.dt-table-row {\\n position: absolute;\\n left: 0;\\n right: 0;\\n border-bottom: 1px solid var(--dt-border-subtle);\\n}\\n\\n.dt-table-row--clickable {\\n cursor: pointer;\\n}\\n\\n.dt-table-row--clickable:hover {\\n background: var(--dt-surface-hover);\\n}\\n\\n:host([striped]) .dt-table-row:nth-child(even) {\\n background: color-mix(in srgb, var(--dt-surface) 92%, var(--dt-accent) 8%);\\n}\\n\\n:host([bordered]) .dt-table-header-cell,\\n:host([bordered]) .dt-table-cell {\\n border-right: 1px solid var(--dt-border-subtle);\\n}\\n\\n:host([bordered]) .dt-table-header-cell:last-child,\\n:host([bordered]) .dt-table-cell:last-child {\\n border-right: 0;\\n}\\n\\n.dt-table-cell[data-align='center'],\\n.dt-table-header-cell[data-align='center'] {\\n text-align: center;\\n}\\n\\n.dt-table-cell[data-align='right'],\\n.dt-table-header-cell[data-align='right'] {\\n text-align: right;\\n}\\n\\n.dt-table-empty {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n min-height: 140px;\\n padding: 20px;\\n color: var(--dt-text-muted);\\n text-transform: uppercase;\\n letter-spacing: 0.08em;\\n font-size: 0.75rem;\\n}\\n\";", "function normalizeBoundValue(value: unknown): string | null {\n if (value === null || value === undefined || value === false) {\n return null;\n }\n\n if (value === true) {\n return '';\n }\n\n return String(value);\n}\n\nexport function bindTemplateFragment(\n fragment: DocumentFragment,\n data: Record<string, unknown>,\n): void {\n const elements = fragment.querySelectorAll<HTMLElement>('*');\n\n for (const element of elements) {\n const textField = element.getAttribute('data-field');\n if (textField) {\n const value = data[textField];\n element.textContent = value === null || value === undefined ? '' : String(value);\n }\n\n for (const attrName of element.getAttributeNames()) {\n if (attrName === 'data-field' || !attrName.startsWith('data-field-')) {\n continue;\n }\n\n const targetAttr = attrName.slice('data-field-'.length);\n if (!targetAttr) {\n continue;\n }\n\n const fieldName = element.getAttribute(attrName);\n if (!fieldName) {\n continue;\n }\n\n const boundValue = normalizeBoundValue(data[fieldName]);\n if (boundValue === null) {\n element.removeAttribute(targetAttr);\n } else {\n element.setAttribute(targetAttr, boundValue);\n }\n }\n }\n}\n\nexport function createBoundTemplate(\n template: HTMLTemplateElement,\n data: Record<string, unknown>,\n): DocumentFragment {\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n bindTemplateFragment(fragment, data);\n return fragment;\n}\n", "export interface VirtualRange {\n start: number;\n end: number;\n paddingTop: number;\n paddingBottom: number;\n totalHeight: number;\n}\n\ninterface VirtualizerOptions {\n count?: number;\n estimateSize?: number;\n overscan?: number;\n fixedSize?: number | null;\n}\n\nexport class DtVirtualizer {\n private _count = 0;\n private _estimateSize = 56;\n private _overscan = 5;\n private _fixedSize: number | null = null;\n private _viewportHeight = 0;\n private _scrollTop = 0;\n private _sizes = new Map<number, number>();\n\n constructor(options: VirtualizerOptions = {}) {\n this._count = options.count ?? 0;\n this._estimateSize = options.estimateSize ?? 56;\n this._overscan = options.overscan ?? 5;\n this._fixedSize = options.fixedSize ?? null;\n }\n\n setCount(count: number): void {\n this._count = Math.max(0, count);\n for (const index of this._sizes.keys()) {\n if (index >= this._count) {\n this._sizes.delete(index);\n }\n }\n }\n\n setViewportHeight(height: number): void {\n this._viewportHeight = Math.max(0, height);\n }\n\n setScrollTop(scrollTop: number): void {\n this._scrollTop = Math.max(0, scrollTop);\n }\n\n setEstimateSize(size: number): void {\n this._estimateSize = Math.max(1, size);\n }\n\n setFixedSize(size: number | null): void {\n this._fixedSize = size && size > 0 ? size : null;\n }\n\n resetMeasurements(): void {\n this._sizes.clear();\n }\n\n measure(index: number, size: number): number {\n if (this._fixedSize !== null || index < 0 || index >= this._count) {\n return 0;\n }\n\n const normalized = Math.max(1, Math.round(size));\n const previous = this._sizes.get(index);\n if (previous === normalized) {\n return 0;\n }\n\n this._sizes.set(index, normalized);\n\n if (this.getOffset(index + 1) <= this._scrollTop) {\n return normalized - (previous ?? this._estimateSize);\n }\n\n return 0;\n }\n\n getOffset(index: number): number {\n if (index <= 0) {\n return 0;\n }\n\n const boundedIndex = Math.min(index, this._count);\n\n if (this._fixedSize !== null) {\n return boundedIndex * this._fixedSize;\n }\n\n let offset = 0;\n for (let i = 0; i < boundedIndex; i += 1) {\n offset += this._sizes.get(i) ?? this._estimateSize;\n }\n return offset;\n }\n\n getTotalHeight(): number {\n return this.getOffset(this._count);\n }\n\n getRange(): VirtualRange {\n if (this._count === 0) {\n return { start: 0, end: 0, paddingTop: 0, paddingBottom: 0, totalHeight: 0 };\n }\n\n if (this._fixedSize !== null) {\n const visibleCount = Math.max(1, Math.ceil(this._viewportHeight / this._fixedSize));\n const start = Math.max(0, Math.floor(this._scrollTop / this._fixedSize) - this._overscan);\n const end = Math.min(this._count, start + visibleCount + this._overscan * 2);\n const paddingTop = start * this._fixedSize;\n const totalHeight = this._count * this._fixedSize;\n const paddingBottom = Math.max(0, totalHeight - paddingTop - (end - start) * this._fixedSize);\n return { start, end, paddingTop, paddingBottom, totalHeight };\n }\n\n let start = 0;\n let offset = 0;\n while (start < this._count) {\n const size = this._sizes.get(start) ?? this._estimateSize;\n if (offset + size > this._scrollTop) {\n break;\n }\n offset += size;\n start += 1;\n }\n\n start = Math.max(0, start - this._overscan);\n const paddingTop = this.getOffset(start);\n\n let end = start;\n let renderedHeight = 0;\n while (end < this._count && renderedHeight < this._viewportHeight) {\n renderedHeight += this._sizes.get(end) ?? this._estimateSize;\n end += 1;\n }\n end = Math.min(this._count, end + this._overscan);\n\n const totalHeight = this.getTotalHeight();\n const paddingBottom = Math.max(0, totalHeight - this.getOffset(end));\n\n return { start, end, paddingTop, paddingBottom, totalHeight };\n }\n}\n", "import tableViewCss from './styles/table-view.css?raw';\nimport { createBoundTemplate } from './lib/template-bind';\nimport { DtVirtualizer } from './lib/virtualizer';\n\nexport type DtTableViewAlign = 'left' | 'center' | 'right';\nexport type DtTableViewSortDirection = 'asc' | 'desc';\n\nexport interface DtTableViewSortDetail {\n field: string;\n direction: DtTableViewSortDirection;\n}\n\nexport interface DtTableViewRowClickDetail<T = unknown> {\n row: T;\n index: number;\n}\n\ninterface DtTableColumnConfig {\n field: string;\n header: string;\n width: string;\n minWidth: string;\n align: DtTableViewAlign;\n template: HTMLTemplateElement | null;\n}\n\nfunction ensureRecord(row: unknown): Record<string, unknown> {\n if (row && typeof row === 'object') {\n return row as Record<string, unknown>;\n }\n return { value: row };\n}\n\nfunction normalizeAlign(value: string | null): DtTableViewAlign {\n if (value === 'center' || value === 'right') {\n return value;\n }\n return 'left';\n}\n\nexport class DtColumn extends HTMLElement {\n static get observedAttributes(): string[] {\n return ['field', 'header', 'width', 'min-width', 'align'];\n }\n\n get field(): string {\n return this.getAttribute('field') ?? '';\n }\n\n get header(): string {\n return this.getAttribute('header') ?? this.field;\n }\n\n get width(): string {\n return this.getAttribute('width') ?? 'auto';\n }\n\n get minWidth(): string {\n return this.getAttribute('min-width') ?? '0';\n }\n\n get align(): DtTableViewAlign {\n return normalizeAlign(this.getAttribute('align'));\n }\n\n connectedCallback(): void {\n this.hidden = true;\n }\n\n attributeChangedCallback(): void {\n this.dispatchEvent(new CustomEvent('dt-column-change', { bubbles: true, composed: true }));\n }\n}\n\n/**\n * `<dt-table-view>` \u2014 virtualized data table for structured row/column data.\n *\n * Columns are declared with child `<dt-column>` elements. Rows are provided via\n * the JS-only `rows` property. Sorting is event-driven: the component updates\n * header state and emits `dt-sort`, while the consumer is responsible for\n * reordering and reassigning `rows`.\n *\n * ## Attributes\n * - `row-height` \u2014 fixed row height in px\n * - `sortable` \u2014 when present, enables sortable header cells\n * - `striped` \u2014 when present, alternates row backgrounds\n * - `bordered` \u2014 when present, shows cell borders\n * - `empty-text` \u2014 text shown when there are no rows or no columns\n *\n * ## Properties\n * - `rows` \u2014 array of row objects to render\n *\n * ## `<dt-column>` attributes\n * - `field` \u2014 row field key\n * - `header` \u2014 header label; defaults to `field`\n * - `width` \u2014 column width in px or `auto`\n * - `min-width` \u2014 minimum column width\n * - `align` \u2014 `left`, `center`, or `right`\n *\n * If a `<dt-column>` contains a child `<template>`, that template is cloned for\n * each cell in the column. Template bindings work the same way as in\n * `<dt-list-view>`:\n * - `data-field=\"status\"` sets text content from `row.status`\n * - `data-field-variant=\"statusVariant\"` sets the `variant` attribute from `row.statusVariant`\n *\n * ## Events\n * - `dt-sort` \u2014 fired with `{ field, direction }` when a header is activated\n * - `dt-row-click` \u2014 fired with `{ row, index }` when a body row is clicked\n *\n * ## Usage\n * ```html\n * <dt-table-view id=\"processes\" row-height=\"40\" sortable striped>\n * <dt-column field=\"name\" header=\"Process\" width=\"220\"></dt-column>\n * <dt-column field=\"cpu\" header=\"CPU %\" width=\"100\" align=\"right\"></dt-column>\n * <dt-column field=\"status\" header=\"Status\" width=\"140\">\n * <template>\n * <dt-badge data-field=\"status\" data-field-variant=\"statusVariant\"></dt-badge>\n * </template>\n * </dt-column>\n * </dt-table-view>\n * <script>\n * const table = document.getElementById('processes');\n * const rows = [\n * { name: 'node', cpu: '12.4', status: 'running', statusVariant: 'success' },\n * { name: 'cron', cpu: '1.2', status: 'idle', statusVariant: 'neutral' },\n * ];\n * table.rows = rows;\n * table.addEventListener('dt-sort', (event) => {\n * const { field, direction } = event.detail;\n * table.rows = [...rows].sort((a, b) =>\n * direction === 'asc'\n * ? String(a[field]).localeCompare(String(b[field]), undefined, { numeric: true })\n * : String(b[field]).localeCompare(String(a[field]), undefined, { numeric: true }),\n * );\n * });\n * </script>\n * ```\n */\nexport class DtTableView extends HTMLElement {\n private _rows: unknown[] = [];\n private _columns: DtTableColumnConfig[] = [];\n private readonly _virtualizer = new DtVirtualizer({\n estimateSize: 40,\n overscan: 5,\n fixedSize: 40,\n });\n private readonly _root: HTMLDivElement;\n private readonly _scroll: HTMLDivElement;\n private readonly _header: HTMLDivElement;\n private readonly _body: HTMLDivElement;\n private readonly _canvas: HTMLDivElement;\n private readonly _emptyState: HTMLDivElement;\n private _resizeObserver: ResizeObserver | null = null;\n private _mutationObserver: MutationObserver | null = null;\n private _sortField: string | null = null;\n private _sortDirection: DtTableViewSortDirection = 'asc';\n\n static get observedAttributes(): string[] {\n return ['row-height', 'sortable', 'striped', 'bordered', 'empty-text'];\n }\n\n get rows(): unknown[] {\n return this._rows;\n }\n\n set rows(value: unknown[]) {\n this._rows = Array.isArray(value) ? value : [];\n this._virtualizer.setCount(this._rows.length);\n this._render();\n }\n\n get rowHeight(): number {\n const raw = Number(this.getAttribute('row-height') ?? '40');\n return Number.isFinite(raw) && raw > 0 ? raw : 40;\n }\n\n set rowHeight(value: number) {\n this.setAttribute('row-height', String(value));\n }\n\n get sortable(): boolean {\n return this.hasAttribute('sortable');\n }\n\n get emptyText(): string {\n return this.getAttribute('empty-text') ?? 'No data';\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = tableViewCss;\n shadow.appendChild(style);\n\n this._root = document.createElement('div');\n this._root.className = 'dt-table-view';\n\n this._scroll = document.createElement('div');\n this._scroll.className = 'dt-table-scroll';\n this._scroll.addEventListener('scroll', this._onScroll, { passive: true });\n\n this._header = document.createElement('div');\n this._header.className = 'dt-table-header';\n\n this._body = document.createElement('div');\n this._body.className = 'dt-table-body';\n\n this._canvas = document.createElement('div');\n this._canvas.className = 'dt-table-canvas';\n\n this._emptyState = document.createElement('div');\n this._emptyState.className = 'dt-table-empty';\n\n this._body.append(this._canvas, this._emptyState);\n this._scroll.append(this._header, this._body);\n this._root.appendChild(this._scroll);\n shadow.appendChild(this._root);\n }\n\n connectedCallback(): void {\n this._virtualizer.setFixedSize(this.rowHeight);\n this._virtualizer.setEstimateSize(this.rowHeight);\n this._syncColumns();\n\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.target === this._scroll) {\n const headerHeight = this._header.offsetHeight;\n this._virtualizer.setViewportHeight(Math.max(0, entry.contentRect.height - headerHeight));\n this._render();\n }\n }\n });\n this._resizeObserver.observe(this._scroll);\n\n this._mutationObserver = new MutationObserver(() => {\n this._syncColumns();\n this._render();\n });\n this._mutationObserver.observe(this, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['field', 'header', 'width', 'min-width', 'align'],\n });\n\n this._virtualizer.setCount(this._rows.length);\n this._virtualizer.setViewportHeight(\n Math.max(0, this._scroll.clientHeight - this._header.offsetHeight),\n );\n this._render();\n }\n\n disconnectedCallback(): void {\n this._scroll.removeEventListener('scroll', this._onScroll);\n this._resizeObserver?.disconnect();\n this._mutationObserver?.disconnect();\n this._resizeObserver = null;\n this._mutationObserver = null;\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'row-height') {\n this._virtualizer.setFixedSize(this.rowHeight);\n this._virtualizer.setEstimateSize(this.rowHeight);\n }\n this._render();\n }\n\n private _onScroll = (): void => {\n this._virtualizer.setScrollTop(Math.max(0, this._scroll.scrollTop - this._header.offsetHeight));\n this._renderBody();\n };\n\n private _syncColumns(): void {\n this._columns = Array.from(this.children)\n .filter((child): child is DtColumn => child instanceof DtColumn)\n .map((column) => ({\n field: column.field,\n header: column.header,\n width: column.width,\n minWidth: column.minWidth,\n align: column.align,\n template:\n Array.from(column.children).find(\n (child): child is HTMLTemplateElement => child instanceof HTMLTemplateElement,\n ) ?? null,\n }))\n .filter((column) => column.field);\n }\n\n private _render(): void {\n if (!this.isConnected) {\n return;\n }\n\n this._emptyState.textContent = this.emptyText;\n const columnsTemplate =\n this._columns.length > 0\n ? this._columns.map((column) => this._toGridColumn(column)).join(' ')\n : 'minmax(0, 1fr)';\n this._header.style.setProperty('--dt-table-columns', columnsTemplate);\n this._canvas.style.setProperty('--dt-table-columns', columnsTemplate);\n\n this._renderHeader();\n this._renderBody();\n }\n\n private _renderHeader(): void {\n const fragment = document.createDocumentFragment();\n\n for (const column of this._columns) {\n const cell = document.createElement('div');\n cell.className = 'dt-table-header-cell';\n cell.dataset.align = column.align;\n\n if (this.sortable) {\n cell.classList.add('dt-table-header-cell--sortable');\n cell.tabIndex = 0;\n cell.setAttribute('role', 'button');\n cell.setAttribute('aria-label', `Sort by ${column.header}`);\n cell.addEventListener('click', () => this._requestSort(column.field));\n cell.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this._requestSort(column.field);\n }\n });\n }\n\n const label = document.createElement('span');\n label.className = 'dt-table-header-label';\n label.textContent = column.header;\n\n if (this.sortable) {\n const indicator = document.createElement('span');\n indicator.className = 'dt-table-sort-indicator';\n if (this._sortField === column.field) {\n indicator.textContent = this._sortDirection === 'asc' ? '\u25B2' : '\u25BC';\n } else {\n indicator.textContent = '\u2195';\n }\n label.appendChild(indicator);\n }\n\n cell.appendChild(label);\n fragment.appendChild(cell);\n }\n\n this._header.replaceChildren(fragment);\n }\n\n private _renderBody(): void {\n if (this._rows.length === 0 || this._columns.length === 0) {\n this._emptyState.hidden = false;\n this._canvas.replaceChildren();\n this._body.style.height = '140px';\n this._canvas.style.height = '0px';\n return;\n }\n\n this._emptyState.hidden = true;\n this._virtualizer.setCount(this._rows.length);\n this._virtualizer.setScrollTop(Math.max(0, this._scroll.scrollTop - this._header.offsetHeight));\n this._virtualizer.setViewportHeight(\n Math.max(0, this._scroll.clientHeight - this._header.offsetHeight),\n );\n\n const range = this._virtualizer.getRange();\n this._body.style.height = `${Math.max(range.totalHeight, this._scroll.clientHeight - this._header.offsetHeight)}px`;\n this._canvas.style.height = `${range.totalHeight}px`;\n\n const fragment = document.createDocumentFragment();\n for (let index = range.start; index < range.end; index += 1) {\n fragment.appendChild(this._renderRow(index));\n }\n\n this._canvas.replaceChildren(fragment);\n }\n\n private _renderRow(index: number): HTMLElement {\n const row = this._rows[index];\n const rowElement = document.createElement('div');\n rowElement.className = 'dt-table-row dt-table-row--clickable';\n rowElement.style.top = `${this._virtualizer.getOffset(index)}px`;\n rowElement.style.height = `${this.rowHeight}px`;\n rowElement.style.setProperty(\n '--dt-table-columns',\n this._header.style.getPropertyValue('--dt-table-columns'),\n );\n rowElement.addEventListener('click', () => {\n this.dispatchEvent(\n new CustomEvent<DtTableViewRowClickDetail>('dt-row-click', {\n detail: { row, index },\n bubbles: true,\n composed: true,\n }),\n );\n });\n\n const record = ensureRecord(row);\n\n for (const column of this._columns) {\n const cell = document.createElement('div');\n cell.className = 'dt-table-cell';\n cell.dataset.align = column.align;\n\n if (column.template) {\n cell.appendChild(createBoundTemplate(column.template, record));\n } else {\n const value = record[column.field];\n cell.textContent = value === null || value === undefined ? '' : String(value);\n }\n\n rowElement.appendChild(cell);\n }\n\n return rowElement;\n }\n\n private _requestSort(field: string): void {\n if (this._sortField === field) {\n this._sortDirection = this._sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this._sortField = field;\n this._sortDirection = 'asc';\n }\n\n this._renderHeader();\n this.dispatchEvent(\n new CustomEvent<DtTableViewSortDetail>('dt-sort', {\n detail: { field, direction: this._sortDirection },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _toGridColumn(column: DtTableColumnConfig): string {\n const minWidth = /^\\d+$/.test(column.minWidth) ? `${column.minWidth}px` : column.minWidth;\n if (column.width === 'auto') {\n return `minmax(${minWidth}, 1fr)`;\n }\n\n const width = /^\\d+$/.test(column.width) ? `${column.width}px` : column.width;\n return `minmax(${minWidth}, ${width})`;\n }\n}\n", "export default \":host {\\n display: block;\\n min-height: 120px;\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n}\\n\\n.dt-list-view {\\n position: relative;\\n display: block;\\n min-height: inherit;\\n height: 100%;\\n overflow: auto;\\n background: var(--dt-surface);\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n}\\n\\n.dt-list-view::before,\\n.dt-list-view::after {\\n content: '';\\n position: sticky;\\n z-index: 2;\\n width: 8px;\\n height: 8px;\\n pointer-events: none;\\n}\\n\\n.dt-list-view::before {\\n top: 0;\\n left: 0;\\n display: block;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-list-view::after {\\n right: 0;\\n bottom: 0;\\n float: right;\\n border-right: 2px solid var(--dt-accent);\\n border-bottom: 2px solid var(--dt-accent);\\n}\\n\\n.dt-list-spacer {\\n position: relative;\\n min-height: 100%;\\n}\\n\\n.dt-list-items {\\n position: relative;\\n}\\n\\n.dt-list-item {\\n box-sizing: border-box;\\n width: 100%;\\n padding: 12px;\\n color: inherit;\\n}\\n\\n.dt-list-item--interactive {\\n cursor: pointer;\\n}\\n\\n.dt-list-item--interactive:hover {\\n background: var(--dt-surface-hover);\\n}\\n\\n.dt-list-item--selected {\\n background: var(--dt-accent-subtle);\\n}\\n\\n:host([dividers]) .dt-list-item {\\n border-bottom: 1px solid var(--dt-border-subtle);\\n}\\n\\n:host([dividers]) .dt-list-item:last-child {\\n border-bottom: 0;\\n}\\n\\n.dt-list-empty {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n min-height: 120px;\\n padding: 20px;\\n color: var(--dt-text-muted);\\n text-transform: uppercase;\\n letter-spacing: 0.08em;\\n font-size: 0.75rem;\\n}\\n\";", "import listViewCss from './styles/list-view.css?raw';\nimport { createBoundTemplate } from './lib/template-bind';\nimport { DtVirtualizer } from './lib/virtualizer';\n\nexport type DtListViewSelectable = 'none' | 'single' | 'multi';\n\nexport interface DtListViewItemClickDetail<T = unknown> {\n item: T;\n index: number;\n}\n\nexport interface DtListViewSelectionChangeDetail<T = unknown> {\n selected: T[];\n}\n\nexport type DtListViewRenderItem<T = unknown> = (\n item: T,\n container: HTMLElement,\n index: number,\n) => void;\n\nconst DEFAULT_ESTIMATE = 56;\n\nfunction ensureRecord(item: unknown): Record<string, unknown> {\n if (item && typeof item === 'object') {\n return item as Record<string, unknown>;\n }\n return { value: item };\n}\n\n/**\n * `<dt-list-view>` \u2014 virtualized list web component for long collections.\n *\n * Supports two sizing modes:\n * - fixed-height mode via `item-height`\n * - variable-height mode when `item-height` is omitted\n *\n * ## Attributes\n * - `item-height` \u2014 fixed row height in px; omit for measured variable-height rows\n * - `dividers` \u2014 when present, shows dividers between items\n * - `selectable` \u2014 selection mode: `none`, `single`, or `multi`\n * - `empty-text` \u2014 text shown when the list has no items\n *\n * ## Properties\n * - `items` \u2014 array of item objects to render\n * - `renderItem` \u2014 optional custom renderer `(item, container, index) => void`\n * - `selectedItems` \u2014 readonly array of currently selected item objects\n *\n * ## Template binding\n * When using a child `<template>`, bindings are applied as follows:\n * - `data-field=\"title\"` sets `textContent` from `item.title`\n * - `data-field-variant=\"statusVariant\"` sets the `variant` attribute from `item.statusVariant`\n *\n * ## Events\n * - `dt-item-click` \u2014 fired when an item is clicked; `detail` contains `{ item, index }`\n * - `dt-selection-change` \u2014 fired when selection changes; `detail.selected` is the selected items array\n *\n * ## Usage\n * ```html\n * <dt-list-view id=\"tasks\" item-height=\"72\" dividers selectable=\"single\">\n * <template>\n * <dt-stack gap=\"8\">\n * <dt-stack direction=\"row\" align=\"center\" gap=\"8\">\n * <strong data-field=\"title\"></strong>\n * <dt-badge data-field=\"status\" data-field-variant=\"statusVariant\"></dt-badge>\n * </dt-stack>\n * <span class=\"text-muted\" data-field=\"summary\"></span>\n * </dt-stack>\n * </template>\n * </dt-list-view>\n * <script>\n * const list = document.getElementById('tasks');\n * list.items = [\n * { title: 'Review report', status: 'Queued', statusVariant: 'warning', summary: 'Waiting on CPU budget' },\n * { title: 'Ship release', status: 'Done', statusVariant: 'success', summary: 'Published 4 minutes ago' },\n * ];\n * </script>\n * ```\n */\nexport class DtListView extends HTMLElement {\n private _items: unknown[] = [];\n private _selectedIndices = new Set<number>();\n private _renderItem: DtListViewRenderItem | null = null;\n private readonly _virtualizer = new DtVirtualizer({\n estimateSize: DEFAULT_ESTIMATE,\n overscan: 5,\n });\n private readonly _viewport: HTMLDivElement;\n private readonly _spacer: HTMLDivElement;\n private readonly _itemsLayer: HTMLDivElement;\n private readonly _emptyState: HTMLDivElement;\n private _resizeObserver: ResizeObserver | null = null;\n private _itemResizeObserver: ResizeObserver | null = null;\n\n static get observedAttributes(): string[] {\n return ['item-height', 'dividers', 'selectable', 'empty-text'];\n }\n\n get items(): unknown[] {\n return this._items;\n }\n\n set items(value: unknown[]) {\n this._items = Array.isArray(value) ? value : [];\n this._selectedIndices = new Set(\n [...this._selectedIndices].filter((index) => index < this._items.length),\n );\n this._virtualizer.setCount(this._items.length);\n this._syncSizingMode(true);\n this._render();\n }\n\n get selectedItems(): unknown[] {\n return [...this._selectedIndices].sort((a, b) => a - b).map((index) => this._items[index]);\n }\n\n get renderItem(): DtListViewRenderItem | null {\n return this._renderItem;\n }\n\n set renderItem(value: DtListViewRenderItem | null) {\n this._renderItem = typeof value === 'function' ? value : null;\n this._render();\n }\n\n get itemHeight(): number | null {\n const raw = this.getAttribute('item-height');\n if (!raw) {\n return null;\n }\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n }\n\n set itemHeight(value: number | null) {\n if (value === null || value <= 0) {\n this.removeAttribute('item-height');\n return;\n }\n this.setAttribute('item-height', String(value));\n }\n\n get selectable(): DtListViewSelectable {\n const value = this.getAttribute('selectable');\n if (value === 'single' || value === 'multi') {\n return value;\n }\n return 'none';\n }\n\n set selectable(value: DtListViewSelectable) {\n this.setAttribute('selectable', value);\n }\n\n get emptyText(): string {\n return this.getAttribute('empty-text') ?? 'No items';\n }\n\n set emptyText(value: string) {\n this.setAttribute('empty-text', value);\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = listViewCss;\n shadow.appendChild(style);\n\n this._viewport = document.createElement('div');\n this._viewport.className = 'dt-list-view';\n this._viewport.addEventListener('scroll', this._onScroll, { passive: true });\n\n this._spacer = document.createElement('div');\n this._spacer.className = 'dt-list-spacer';\n\n this._itemsLayer = document.createElement('div');\n this._itemsLayer.className = 'dt-list-items';\n\n this._emptyState = document.createElement('div');\n this._emptyState.className = 'dt-list-empty';\n\n this._spacer.append(this._itemsLayer, this._emptyState);\n this._viewport.appendChild(this._spacer);\n shadow.appendChild(this._viewport);\n }\n\n connectedCallback(): void {\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.target === this._viewport) {\n this._virtualizer.setViewportHeight(entry.contentRect.height);\n this._render();\n }\n }\n });\n this._resizeObserver.observe(this._viewport);\n\n this._itemResizeObserver = new ResizeObserver((entries) => {\n let adjustment = 0;\n for (const entry of entries) {\n const target = entry.target as HTMLElement;\n const index = Number(target.dataset.index);\n if (!Number.isFinite(index)) {\n continue;\n }\n adjustment += this._virtualizer.measure(index, entry.contentRect.height);\n }\n\n if (adjustment !== 0) {\n this._viewport.scrollTop += adjustment;\n }\n\n if (entries.length > 0) {\n this._render();\n }\n });\n\n this._virtualizer.setCount(this._items.length);\n this._virtualizer.setViewportHeight(this._viewport.clientHeight);\n this._syncSizingMode(false);\n this._render();\n }\n\n disconnectedCallback(): void {\n this._viewport.removeEventListener('scroll', this._onScroll);\n this._resizeObserver?.disconnect();\n this._itemResizeObserver?.disconnect();\n this._resizeObserver = null;\n this._itemResizeObserver = null;\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'item-height') {\n this._syncSizingMode(true);\n }\n\n if (name === 'selectable' && this.selectable === 'none' && this._selectedIndices.size > 0) {\n this._selectedIndices.clear();\n this._emitSelectionChange();\n }\n\n this._render();\n }\n\n private _onScroll = (): void => {\n this._virtualizer.setScrollTop(this._viewport.scrollTop);\n this._render();\n };\n\n private _syncSizingMode(resetMeasurements: boolean): void {\n const fixedHeight = this.itemHeight;\n this._virtualizer.setFixedSize(fixedHeight);\n this._virtualizer.setEstimateSize(fixedHeight ?? DEFAULT_ESTIMATE);\n if (resetMeasurements) {\n this._virtualizer.resetMeasurements();\n }\n }\n\n private _render(): void {\n if (!this.isConnected) {\n return;\n }\n\n this._emptyState.textContent = this.emptyText;\n this._emptyState.hidden = this._items.length > 0;\n\n if (this._items.length === 0) {\n this._itemsLayer.replaceChildren();\n this._spacer.style.height = '100%';\n return;\n }\n\n this._virtualizer.setScrollTop(this._viewport.scrollTop);\n this._virtualizer.setViewportHeight(this._viewport.clientHeight);\n this._virtualizer.setCount(this._items.length);\n\n const range = this._virtualizer.getRange();\n this._spacer.style.height = `${Math.max(range.totalHeight, this._viewport.clientHeight)}px`;\n this._itemsLayer.style.transform = `translateY(${range.paddingTop}px)`;\n\n const fragment = document.createDocumentFragment();\n for (let index = range.start; index < range.end; index += 1) {\n fragment.appendChild(this._renderVisibleItem(index));\n }\n\n this._itemsLayer.replaceChildren(fragment);\n }\n\n private _renderVisibleItem(index: number): HTMLElement {\n const item = this._items[index];\n const itemElement = document.createElement('div');\n itemElement.className = 'dt-list-item';\n itemElement.dataset.index = String(index);\n\n if (this.selectable !== 'none') {\n itemElement.classList.add('dt-list-item--interactive');\n itemElement.setAttribute('role', 'option');\n itemElement.setAttribute('aria-selected', String(this._selectedIndices.has(index)));\n itemElement.tabIndex = 0;\n }\n\n if (this._selectedIndices.has(index)) {\n itemElement.classList.add('dt-list-item--selected');\n }\n\n if (this.itemHeight !== null) {\n itemElement.style.minHeight = `${this.itemHeight}px`;\n }\n\n if (this._renderItem) {\n this._renderItem(item, itemElement, index);\n } else {\n const template = this._getTemplate();\n if (template) {\n itemElement.appendChild(createBoundTemplate(template, ensureRecord(item)));\n } else {\n itemElement.textContent = String(item ?? '');\n }\n }\n\n itemElement.addEventListener('click', () => this._handleItemClick(index));\n itemElement.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this._handleItemClick(index);\n }\n });\n\n if (this.itemHeight === null) {\n this._itemResizeObserver?.observe(itemElement);\n }\n\n return itemElement;\n }\n\n private _handleItemClick(index: number): void {\n const item = this._items[index];\n const selectable = this.selectable;\n\n if (selectable === 'single') {\n this._selectedIndices = new Set([index]);\n this._emitSelectionChange();\n this._render();\n } else if (selectable === 'multi') {\n if (this._selectedIndices.has(index)) {\n this._selectedIndices.delete(index);\n } else {\n this._selectedIndices.add(index);\n }\n this._emitSelectionChange();\n this._render();\n }\n\n this.dispatchEvent(\n new CustomEvent<DtListViewItemClickDetail>('dt-item-click', {\n detail: { item, index },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _emitSelectionChange(): void {\n this.dispatchEvent(\n new CustomEvent<DtListViewSelectionChangeDetail>('dt-selection-change', {\n detail: { selected: this.selectedItems },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _getTemplate(): HTMLTemplateElement | null {\n for (const child of Array.from(this.children)) {\n if (child instanceof HTMLTemplateElement) {\n return child;\n }\n }\n return null;\n }\n}\n", "export default \":host {\\n display: block;\\n min-height: 220px;\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n}\\n\\n.dt-chart {\\n position: relative;\\n display: block;\\n min-height: inherit;\\n height: 100%;\\n overflow: hidden;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n background:\\n radial-gradient(\\n circle at top left,\\n color-mix(in srgb, var(--dt-accent) 16%, transparent),\\n transparent 42%\\n ),\\n linear-gradient(\\n 180deg,\\n color-mix(in srgb, var(--dt-surface) 90%, var(--dt-accent) 10%),\\n var(--dt-surface)\\n );\\n}\\n\\n.dt-chart::before,\\n.dt-chart::after {\\n content: '';\\n position: absolute;\\n z-index: 3;\\n width: 8px;\\n height: 8px;\\n pointer-events: none;\\n}\\n\\n.dt-chart::before {\\n top: -1px;\\n left: -1px;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-chart::after {\\n right: -1px;\\n bottom: -1px;\\n border-right: 2px solid var(--dt-accent);\\n border-bottom: 2px solid var(--dt-accent);\\n}\\n\\n.dt-chart__canvas {\\n position: relative;\\n z-index: 1;\\n display: block;\\n width: 100%;\\n height: 100%;\\n}\\n\\n.dt-chart__status {\\n position: absolute;\\n inset: 0;\\n z-index: 2;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 20px;\\n color: var(--dt-text-muted);\\n font-size: 0.75rem;\\n letter-spacing: 0.08em;\\n text-align: center;\\n text-transform: uppercase;\\n background: color-mix(in srgb, var(--dt-surface) 72%, transparent);\\n}\\n\\n.dt-chart__status[hidden] {\\n display: none;\\n}\\n\";", "export interface DtChartRuntime {\n Chart: typeof import('chart.js').Chart;\n}\n\ndeclare global {\n interface Window {\n __DtChart?: DtChartRuntime;\n }\n}\n\nlet loadPromise: Promise<DtChartRuntime> | null = null;\n\nexport function loadChartJs(): Promise<DtChartRuntime> {\n if (window.__DtChart) {\n return Promise.resolve(window.__DtChart);\n }\n\n if (loadPromise) {\n return loadPromise;\n }\n\n loadPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = '/api/ui/chart.umd.js';\n script.async = true;\n script.dataset.dtChart = 'true';\n script.onload = () => {\n if (window.__DtChart) {\n resolve(window.__DtChart);\n return;\n }\n\n reject(new Error('Chart runtime loaded without a __DtChart export.'));\n };\n script.onerror = () => reject(new Error('Failed to load the Chart.js runtime bundle.'));\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n", "import chartCss from './styles/chart.css?raw';\nimport { loadChartJs } from './lib/chart-loader';\nimport type { DtChartRuntime } from './lib/chart-loader';\n\ntype DtChartLegend = 'top' | 'bottom' | 'left' | 'right' | 'none';\ntype DtChartType = 'bar' | 'line' | 'area' | 'pie' | 'doughnut' | 'radar' | 'scatter' | 'bubble';\ntype DtChartCoreType = Exclude<DtChartType, 'area'>;\n\nexport interface DtChartDatasetInput {\n label?: string;\n data: Array<number | { x: number; y: number } | { x: number; y: number; r: number }>;\n color?: string;\n}\n\nexport interface DtChartDataInput {\n labels?: string[];\n datasets: DtChartDatasetInput[];\n}\n\nexport interface DtChartClickDetail {\n label: string | null;\n datasetIndex: number;\n index: number;\n value: unknown;\n}\n\ninterface HslColor {\n h: number;\n s: number;\n l: number;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction parseCsv(value: string | null): string[] {\n if (!value) {\n return [];\n }\n\n return value\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction parseColorToHsl(value: string): HslColor | null {\n const hex = value.trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (hex) {\n const raw = hex[1];\n const normalized =\n raw.length === 3\n ? raw\n .split('')\n .map((char) => `${char}${char}`)\n .join('')\n : raw;\n const r = parseInt(normalized.slice(0, 2), 16) / 255;\n const g = parseInt(normalized.slice(2, 4), 16) / 255;\n const b = parseInt(normalized.slice(4, 6), 16) / 255;\n return rgbToHsl(r, g, b);\n }\n\n const rgb = value\n .trim()\n .match(\n /^rgba?\\((\\d+(?:\\.\\d+)?)[,\\s]+(\\d+(?:\\.\\d+)?)[,\\s]+(\\d+(?:\\.\\d+)?)(?:[,/\\s]+[\\d.]+)?\\)$/i,\n );\n if (rgb) {\n return rgbToHsl(Number(rgb[1]) / 255, Number(rgb[2]) / 255, Number(rgb[3]) / 255);\n }\n\n const hsl = value\n .trim()\n .match(/^hsla?\\(([-\\d.]+)(?:deg)?[,\\s]+([\\d.]+)%[,\\s]+([\\d.]+)%(?:[,/\\s]+[\\d.]+)?\\)$/i);\n if (hsl) {\n return {\n h: ((Number(hsl[1]) % 360) + 360) % 360,\n s: clamp(Number(hsl[2]), 0, 100),\n l: clamp(Number(hsl[3]), 0, 100),\n };\n }\n\n return null;\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): HslColor {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n let h = 0;\n const l = (max + min) / 2;\n const s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));\n\n if (delta !== 0) {\n switch (max) {\n case r:\n h = 60 * (((g - b) / delta) % 6);\n break;\n case g:\n h = 60 * ((b - r) / delta + 2);\n break;\n default:\n h = 60 * ((r - g) / delta + 4);\n break;\n }\n }\n\n return {\n h: (h + 360) % 360,\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\nfunction hslString(color: HslColor, alpha = 1): string {\n return `hsla(${Math.round(color.h)} ${Math.round(color.s)}% ${Math.round(color.l)}% / ${alpha})`;\n}\n\nfunction getPalette(accent: string): HslColor[] {\n const base = parseColorToHsl(accent) ?? { h: 185, s: 88, l: 56 };\n const offsets = [0, 32, 68, 118, 164, 212, 258, 304];\n return offsets.map((offset, index) => ({\n h: (base.h + offset) % 360,\n s: clamp(base.s - index * 2, 55, 90),\n l: clamp(base.l + (index % 2 === 0 ? 0 : 6) - index, 38, 66),\n }));\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction deepMerge<T>(base: T, override: unknown): T {\n if (!isPlainObject(base) || !isPlainObject(override)) {\n return (override as T) ?? base;\n }\n\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const current = result[key];\n result[key] =\n isPlainObject(current) && isPlainObject(value) ? deepMerge(current, value) : value;\n }\n return result as T;\n}\n\nfunction normalizeLegend(value: string | null): DtChartLegend {\n if (value === 'top' || value === 'bottom' || value === 'left' || value === 'right') {\n return value;\n }\n return 'none';\n}\n\nfunction normalizeType(value: string | null): DtChartType {\n if (\n value === 'bar' ||\n value === 'line' ||\n value === 'area' ||\n value === 'pie' ||\n value === 'doughnut' ||\n value === 'radar' ||\n value === 'scatter' ||\n value === 'bubble'\n ) {\n return value;\n }\n return 'bar';\n}\n\nfunction isCartesianType(type: DtChartType): boolean {\n return (\n type === 'bar' || type === 'line' || type === 'area' || type === 'scatter' || type === 'bubble'\n );\n}\n\nfunction formatLabels(value: string[]): string[] {\n return value.map((item) => item.trim()).filter(Boolean);\n}\n\n/**\n * `<dt-chart>` \u2014 lazy-loaded Chart.js wrapper.\n *\n * Set the `.data` JS property to provide chart data. This is the only supported\n * method for filling data into the chart.\n */\nexport class DtChart extends HTMLElement {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _status: HTMLDivElement;\n private _runtime: DtChartRuntime | null = null;\n private _loadPromise: Promise<DtChartRuntime> | null = null;\n private _chart: import('chart.js').Chart | null = null;\n private _renderedType: DtChartCoreType | null = null;\n private _dataInput: DtChartDataInput | null = null;\n private _optionsOverride: Record<string, unknown> | null = null;\n private _syncFrame = 0;\n\n static get observedAttributes(): string[] {\n return ['type', 'legend', 'stacked', 'labels'];\n }\n\n get type(): DtChartType {\n return normalizeType(this.getAttribute('type'));\n }\n\n set type(value: DtChartType) {\n this.setAttribute('type', value);\n }\n\n get legend(): DtChartLegend {\n return normalizeLegend(this.getAttribute('legend'));\n }\n\n set legend(value: DtChartLegend) {\n this.setAttribute('legend', value);\n }\n\n get stacked(): boolean {\n return this.hasAttribute('stacked');\n }\n\n set stacked(value: boolean) {\n this.toggleAttribute('stacked', value);\n }\n\n get labels(): string[] {\n return formatLabels(parseCsv(this.getAttribute('labels')));\n }\n\n set labels(value: string[]) {\n this.setAttribute('labels', value.join(','));\n }\n\n get data(): DtChartDataInput | null {\n return this._dataInput;\n }\n\n set data(value: DtChartDataInput | null) {\n this._dataInput = value ? structuredClone(value) : null;\n this._scheduleSync();\n }\n\n get options(): Record<string, unknown> | null {\n return this._optionsOverride;\n }\n\n set options(value: Record<string, unknown> | null) {\n this._optionsOverride = value ? structuredClone(value) : null;\n void this._renderChart();\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = chartCss;\n shadow.appendChild(style);\n\n const root = document.createElement('div');\n root.className = 'dt-chart';\n\n this._canvas = document.createElement('canvas');\n this._canvas.className = 'dt-chart__canvas';\n\n this._status = document.createElement('div');\n this._status.className = 'dt-chart__status';\n this._status.textContent = 'Loading chart';\n\n root.append(this._canvas, this._status);\n shadow.appendChild(root);\n }\n\n connectedCallback(): void {\n this._canvas.addEventListener('click', this._handleCanvasClick);\n void this._ensureRuntime().then(() => this._renderChart());\n this._scheduleSync();\n }\n\n disconnectedCallback(): void {\n this._canvas.removeEventListener('click', this._handleCanvasClick);\n if (this._syncFrame !== 0) {\n cancelAnimationFrame(this._syncFrame);\n this._syncFrame = 0;\n }\n this._chart?.destroy();\n this._chart = null;\n this._renderedType = null;\n }\n\n attributeChangedCallback(): void {\n this._scheduleSync();\n }\n\n private _handleCanvasClick = (event: Event): void => {\n if (!this._chart) {\n return;\n }\n\n const points = this._chart.getElementsAtEventForMode(\n event as unknown as MouseEvent,\n 'nearest',\n { intersect: true },\n true,\n );\n const point = points[0];\n if (!point) {\n return;\n }\n\n const label = Array.isArray(this._chart.data.labels)\n ? ((this._chart.data.labels[point.index] as string | undefined) ?? null)\n : null;\n const dataset = this._chart.data.datasets[point.datasetIndex];\n const value = Array.isArray(dataset?.data) ? dataset.data[point.index] : undefined;\n\n this.dispatchEvent(\n new CustomEvent<DtChartClickDetail>('dt-chart-click', {\n bubbles: true,\n composed: true,\n detail: {\n label,\n datasetIndex: point.datasetIndex,\n index: point.index,\n value,\n },\n }),\n );\n };\n\n private _scheduleSync(): void {\n if (this._syncFrame !== 0) {\n return;\n }\n\n this._syncFrame = requestAnimationFrame(() => {\n this._syncFrame = 0;\n this._syncFromCurrentSource();\n });\n }\n\n private _syncFromCurrentSource(): void {\n void this._renderChart();\n }\n\n private async _ensureRuntime(): Promise<DtChartRuntime> {\n if (this._runtime) {\n return this._runtime;\n }\n\n if (!this._loadPromise) {\n this._loadPromise = loadChartJs().then((runtime) => {\n this._runtime = runtime;\n return runtime;\n });\n }\n\n return this._loadPromise;\n }\n\n private async _renderChart(): Promise<void> {\n const data = this._dataInput;\n if (!data) {\n this._setStatus('Waiting for data');\n return;\n }\n\n const runtime = await this._ensureRuntime();\n const config = this._buildConfig(runtime, data);\n const nextType = config.type as DtChartCoreType;\n\n if (!this._chart || this._renderedType !== nextType) {\n this._chart?.destroy();\n this._chart = new runtime.Chart(this._canvas, config as never);\n this._renderedType = nextType;\n } else {\n this._chart.data = config.data as never;\n this._chart.options = config.options as never;\n this._chart.update();\n }\n\n this._setStatus(data.datasets.length > 0 ? null : 'Waiting for data');\n }\n\n private _buildConfig(_runtime: DtChartRuntime, data: DtChartDataInput) {\n const computed = getComputedStyle(this);\n const accent = computed.getPropertyValue('--dt-accent').trim() || '#42d4ff';\n const text = computed.getPropertyValue('--dt-text').trim() || '#d6ebff';\n const muted = computed.getPropertyValue('--dt-text-muted').trim() || '#7b93a6';\n const border = computed.getPropertyValue('--dt-border').trim() || 'rgba(123, 147, 166, 0.3)';\n const font =\n computed.getPropertyValue('--font-mono').trim() ||\n \"'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, monospace\";\n const palette = getPalette(accent);\n const normalizedType = this.type === 'area' ? 'line' : this.type;\n const chartData = {\n labels: data.labels ?? this.labels,\n datasets: data.datasets.map((dataset, index) => {\n const tone = palette[index % palette.length];\n const color = dataset.color ?? hslString(tone, 1);\n const baseDataset = {\n label: dataset.label ?? '',\n data: dataset.data,\n backgroundColor:\n normalizedType === 'line' || normalizedType === 'radar' || normalizedType === 'scatter'\n ? hslString(tone, normalizedType === 'scatter' ? 0.95 : 0.24)\n : color,\n borderColor: color,\n pointBackgroundColor: color,\n pointBorderColor: color,\n pointHoverBackgroundColor: color,\n pointRadius: this.type === 'line' || this.type === 'area' ? 3 : 4,\n pointHoverRadius: this.type === 'line' || this.type === 'area' ? 5 : 6,\n borderWidth: normalizedType === 'radar' ? 2 : 2,\n tension: normalizedType === 'line' || this.type === 'area' ? 0.32 : undefined,\n fill: this.type === 'area',\n };\n\n if (normalizedType === 'pie' || normalizedType === 'doughnut') {\n return {\n ...baseDataset,\n backgroundColor: Array.isArray(dataset.data)\n ? dataset.data.map((_, itemIndex) =>\n hslString(palette[itemIndex % palette.length], 0.86),\n )\n : color,\n borderColor: Array.isArray(dataset.data)\n ? dataset.data.map((_, itemIndex) =>\n hslString(palette[itemIndex % palette.length], 1),\n )\n : color,\n borderWidth: 1,\n };\n }\n\n if (normalizedType === 'scatter' || normalizedType === 'bubble') {\n return {\n ...baseDataset,\n showLine: false,\n backgroundColor: hslString(tone, 0.78),\n };\n }\n\n return baseDataset;\n }),\n };\n\n const baseOptions = {\n responsive: true,\n maintainAspectRatio: false,\n animation: {\n duration: 320,\n },\n interaction: {\n mode: 'nearest',\n intersect: true,\n },\n plugins: {\n legend: {\n display: this.legend !== 'none',\n position: this.legend === 'none' ? 'top' : this.legend,\n labels: {\n color: text,\n boxWidth: 12,\n boxHeight: 12,\n padding: 14,\n font: {\n family: font,\n size: 11,\n },\n },\n },\n tooltip: {\n backgroundColor: 'rgba(10, 18, 24, 0.92)',\n borderColor: colorMix(border, accent, 0.35),\n borderWidth: 1,\n titleColor: text,\n bodyColor: text,\n footerColor: muted,\n titleFont: { family: font, size: 11 },\n bodyFont: { family: font, size: 11 },\n padding: 10,\n },\n },\n scales: isCartesianType(this.type)\n ? {\n x: {\n stacked: this.stacked,\n grid: { display: false, color: border },\n border: { color: border },\n ticks: {\n color: muted,\n font: { family: font, size: 11 },\n },\n },\n y: {\n stacked: this.stacked,\n beginAtZero: true,\n grid: { display: false, color: border },\n border: { color: border },\n ticks: {\n color: muted,\n font: { family: font, size: 11 },\n },\n },\n }\n : normalizedType === 'radar'\n ? {\n r: {\n angleLines: { color: border },\n grid: { color: border },\n pointLabels: {\n color: muted,\n font: { family: font, size: 11 },\n },\n ticks: {\n color: muted,\n backdropColor: 'transparent',\n font: { family: font, size: 10 },\n },\n },\n }\n : undefined,\n };\n\n return {\n type: normalizedType,\n data: chartData,\n options: deepMerge(baseOptions, this._optionsOverride ?? {}),\n };\n }\n\n private _setStatus(message: string | null): void {\n if (!message) {\n this._status.hidden = true;\n return;\n }\n\n this._status.hidden = false;\n this._status.textContent = message;\n }\n}\n\nfunction colorMix(primary: string, secondary: string, weight: number): string {\n const first = parseColorToHsl(primary);\n const second = parseColorToHsl(secondary);\n if (!first || !second) {\n return primary;\n }\n\n const ratio = clamp(weight, 0, 1);\n const hueDelta = ((((second.h - first.h) % 360) + 540) % 360) - 180;\n return hslString({\n h: (first.h + hueDelta * ratio + 360) % 360,\n s: first.s + (second.s - first.s) * ratio,\n l: first.l + (second.l - first.l) * ratio,\n });\n}\n", "export default \":host {\\n display: block;\\n color: var(--dt-text);\\n font-family: var(--font-sans, 'Inter', sans-serif);\\n}\\n\\n.dt-markdown {\\n color: inherit;\\n line-height: 1.7;\\n word-break: break-word;\\n}\\n\\n.dt-markdown > :first-child {\\n margin-top: 0;\\n}\\n\\n.dt-markdown > :last-child {\\n margin-bottom: 0;\\n}\\n\\n.dt-markdown :is(h1, h2, h3, h4, h5, h6) {\\n margin: 1.2em 0 0.55em;\\n color: var(--dt-text);\\n font-family: var(--font-sans, 'Inter', sans-serif);\\n line-height: 1.2;\\n}\\n\\n.dt-markdown h1 {\\n color: var(--dt-accent);\\n font-size: 1.6rem;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n}\\n\\n.dt-markdown h2 {\\n font-size: 1.3rem;\\n}\\n\\n.dt-markdown h3 {\\n font-size: 1.1rem;\\n}\\n\\n.dt-markdown p,\\n.dt-markdown ul,\\n.dt-markdown ol,\\n.dt-markdown blockquote,\\n.dt-markdown pre,\\n.dt-markdown table {\\n margin: 0.8em 0;\\n}\\n\\n.dt-markdown ul,\\n.dt-markdown ol {\\n padding-left: 1.4rem;\\n}\\n\\n.dt-markdown li + li {\\n margin-top: 0.28em;\\n}\\n\\n.dt-markdown strong {\\n color: var(--dt-text);\\n}\\n\\n.dt-markdown a,\\n.dt-markdown .dt-md-link {\\n color: var(--dt-accent);\\n text-decoration: none;\\n}\\n\\n.dt-markdown a:hover,\\n.dt-markdown .dt-md-link:hover {\\n text-decoration: underline;\\n}\\n\\n.dt-markdown code {\\n padding: 0.12rem 0.35rem;\\n border-radius: 2px;\\n background: color-mix(in srgb, var(--dt-surface) 88%, var(--dt-accent) 12%);\\n color: var(--dt-accent);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n font-size: 0.92em;\\n}\\n\\n.dt-md-pre {\\n overflow-x: auto;\\n padding: 14px 16px;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--dt-surface) 85%, var(--dt-accent) 15%);\\n}\\n\\n.dt-md-pre code {\\n display: block;\\n padding: 0;\\n background: transparent;\\n color: var(--dt-text);\\n}\\n\\n.dt-md-blockquote {\\n margin: 0.9em 0;\\n padding: 0.15rem 0 0.15rem 1rem;\\n border-left: 3px solid var(--dt-accent);\\n color: var(--dt-text-muted);\\n}\\n\\n.dt-md-table {\\n width: 100%;\\n border-collapse: collapse;\\n border: 1px solid var(--dt-border);\\n background: var(--dt-surface);\\n}\\n\\n.dt-md-table th,\\n.dt-md-table td {\\n padding: 0.6rem 0.8rem;\\n border: 1px solid var(--dt-border-subtle, var(--dt-border));\\n text-align: left;\\n vertical-align: top;\\n}\\n\\n.dt-md-table th {\\n color: var(--dt-accent);\\n background: color-mix(in srgb, var(--dt-surface) 88%, var(--dt-accent) 12%);\\n font-size: 0.75rem;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n}\\n\\n.dt-markdown hr {\\n border: 0;\\n border-top: 1px solid var(--dt-border);\\n}\\n\\n.dt-md-image {\\n display: block;\\n max-width: 100%;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n}\\n\\n.dt-markdown__caret {\\n display: inline-block;\\n margin-left: 0.15rem;\\n color: var(--dt-accent);\\n animation: dt-markdown-caret 0.9s steps(1) infinite;\\n}\\n\\n.dt-markdown__caret[hidden] {\\n display: none;\\n}\\n\\n@keyframes dt-markdown-caret {\\n 0%,\\n 49% {\\n opacity: 1;\\n }\\n\\n 50%,\\n 100% {\\n opacity: 0;\\n }\\n}\\n\";", "export interface DtMarkedRenderOptions {\n unsafeHtml?: boolean;\n}\n\nexport interface DtMarkedRuntime {\n render(markdown: string, options?: DtMarkedRenderOptions): string;\n}\n\ndeclare global {\n interface Window {\n __DtMarked?: DtMarkedRuntime;\n }\n}\n\nlet loadPromise: Promise<DtMarkedRuntime> | null = null;\n\nexport function loadMarked(): Promise<DtMarkedRuntime> {\n if (window.__DtMarked) {\n return Promise.resolve(window.__DtMarked);\n }\n\n if (loadPromise) {\n return loadPromise;\n }\n\n loadPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = '/api/ui/marked.js';\n script.async = true;\n script.dataset.dtMarked = 'true';\n script.onload = () => {\n if (window.__DtMarked) {\n resolve(window.__DtMarked);\n return;\n }\n\n reject(new Error('Marked runtime loaded without a __DtMarked export.'));\n };\n script.onerror = () => reject(new Error('Failed to load the marked runtime bundle.'));\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n", "import markdownCss from './styles/markdown.css?raw';\nimport { loadMarked } from './lib/marked-loader';\nimport type { DtMarkedRuntime } from './lib/marked-loader';\n\nexport interface DtMarkdownLinkClickDetail {\n href: string;\n}\n\nfunction normalizeLineEndings(value: string): string {\n return value.replaceAll('\\r\\n', '\\n');\n}\n\nfunction dedentBlock(value: string): string {\n const lines = normalizeLineEndings(value).split('\\n');\n\n while (lines.length > 0 && lines[0].trim() === '') {\n lines.shift();\n }\n\n while (lines.length > 0 && lines[lines.length - 1].trim() === '') {\n lines.pop();\n }\n\n const indents = lines\n .filter((line) => line.trim() !== '')\n .map((line) => line.match(/^\\s*/)?.[0].length ?? 0);\n const minIndent = indents.length > 0 ? Math.min(...indents) : 0;\n\n if (minIndent === 0) {\n return lines.join('\\n');\n }\n\n return lines.map((line) => line.slice(minIndent)).join('\\n');\n}\n\nfunction closeStreamingBlocks(value: string): string {\n const normalized = normalizeLineEndings(value);\n const fenceCount = (normalized.match(/(^|\\n)(```|~~~)/g) ?? []).length;\n if (fenceCount % 2 === 0) {\n return normalized;\n }\n\n const closingFence = normalized.includes('~~~') && !normalized.includes('```') ? '~~~' : '```';\n return `${normalized}\\n${closingFence}`;\n}\n\n/**\n * `<dt-markdown>` \u2014 themed markdown renderer for LiveApps.\n *\n * Markdown can be provided either inline between the tags or through the JS-only\n * `content` property. When `streaming` is present the component appends a live\n * caret and performs lightweight fence balancing for incomplete code blocks.\n *\n * ## Attributes\n * - `streaming` \u2014 when present, shows a blinking caret for in-progress content\n * - `unsafe-html` \u2014 when present, allows raw HTML in the markdown source\n *\n * ## Properties\n * - `content` \u2014 JS-only markdown source; overrides inline light-DOM text\n * - `streaming` \u2014 boolean reflection of the `streaming` attribute\n *\n * ## Events\n * - `dt-link-click` \u2014 fired with `{ href }` when a rendered link is activated\n */\nexport class DtMarkdown extends HTMLElement {\n private readonly _body: HTMLDivElement;\n private readonly _caret: HTMLSpanElement;\n private _contentOverride: string | null = null;\n private _runtime: DtMarkedRuntime | null = null;\n private _loadPromise: Promise<DtMarkedRuntime> | null = null;\n private _observer: MutationObserver | null = null;\n private _renderFrame = 0;\n\n static get observedAttributes(): string[] {\n return ['streaming', 'unsafe-html'];\n }\n\n get content(): string {\n return this._contentOverride ?? this._readInlineMarkdown();\n }\n\n set content(value: string) {\n this._contentOverride = String(value ?? '');\n this._scheduleRender();\n }\n\n get streaming(): boolean {\n return this.hasAttribute('streaming');\n }\n\n set streaming(value: boolean) {\n this.toggleAttribute('streaming', value);\n }\n\n get unsafeHtml(): boolean {\n return this.hasAttribute('unsafe-html');\n }\n\n set unsafeHtml(value: boolean) {\n this.toggleAttribute('unsafe-html', value);\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = markdownCss;\n shadow.appendChild(style);\n\n this._body = document.createElement('div');\n this._body.className = 'dt-markdown';\n this._body.addEventListener('click', this._onLinkClick);\n\n this._caret = document.createElement('span');\n this._caret.className = 'dt-markdown__caret';\n this._caret.textContent = '\u258C';\n this._caret.hidden = true;\n\n shadow.append(this._body, this._caret);\n }\n\n connectedCallback(): void {\n if (!this._observer) {\n this._observer = new MutationObserver(() => {\n if (this._contentOverride === null) {\n this._scheduleRender();\n }\n });\n\n this._observer.observe(this, {\n childList: true,\n characterData: true,\n subtree: true,\n });\n }\n\n void this._ensureRuntime();\n this._scheduleRender();\n }\n\n disconnectedCallback(): void {\n this._observer?.disconnect();\n this._observer = null;\n if (this._renderFrame !== 0) {\n cancelAnimationFrame(this._renderFrame);\n this._renderFrame = 0;\n }\n }\n\n attributeChangedCallback(): void {\n this._scheduleRender();\n }\n\n private _onLinkClick = (event: Event): void => {\n const path = event.composedPath();\n const anchor = path.find((entry) => entry instanceof HTMLAnchorElement) as\n | HTMLAnchorElement\n | undefined;\n if (!anchor) {\n return;\n }\n\n event.preventDefault();\n this.dispatchEvent(\n new CustomEvent<DtMarkdownLinkClickDetail>('dt-link-click', {\n bubbles: true,\n composed: true,\n detail: { href: anchor.getAttribute('href') ?? '#' },\n }),\n );\n };\n\n private _readInlineMarkdown(): string {\n return dedentBlock(this.textContent ?? '');\n }\n\n private _scheduleRender(): void {\n if (this._renderFrame !== 0) {\n return;\n }\n\n this._renderFrame = requestAnimationFrame(() => {\n this._renderFrame = 0;\n void this._render();\n });\n }\n\n private async _ensureRuntime(): Promise<DtMarkedRuntime> {\n if (this._runtime) {\n return this._runtime;\n }\n\n if (!this._loadPromise) {\n this._loadPromise = loadMarked().then((runtime) => {\n this._runtime = runtime;\n return runtime;\n });\n }\n\n return this._loadPromise;\n }\n\n private async _render(): Promise<void> {\n const runtime = await this._ensureRuntime();\n let markdown = this.content;\n\n if (this.streaming) {\n markdown = closeStreamingBlocks(markdown);\n }\n\n this._body.innerHTML = runtime.render(markdown, {\n unsafeHtml: this.unsafeHtml,\n });\n this._caret.hidden = !this.streaming;\n }\n}\n", "export default \":host {\\n display: block;\\n min-height: 240px;\\n color: var(--dt-text);\\n font-family: var(--font-sans, 'Inter', sans-serif);\\n}\\n\\n.dt-markdown-editor {\\n position: relative;\\n height: 100%;\\n min-height: inherit;\\n overflow: hidden;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n}\\n\\n.dt-markdown-editor::before,\\n.dt-markdown-editor::after {\\n content: '';\\n position: absolute;\\n z-index: 3;\\n width: 8px;\\n height: 8px;\\n pointer-events: none;\\n}\\n\\n.dt-markdown-editor::before {\\n top: -1px;\\n left: -1px;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-markdown-editor::after {\\n right: -1px;\\n bottom: -1px;\\n border-right: 2px solid var(--dt-accent);\\n border-bottom: 2px solid var(--dt-accent);\\n}\\n\\n.dt-markdown-editor__surface {\\n height: 100%;\\n min-height: inherit;\\n}\\n\\n.dt-markdown-editor__content {\\n height: 100%;\\n min-height: inherit;\\n}\\n\\n.dt-markdown-editor__status {\\n position: absolute;\\n inset: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 20px;\\n background: color-mix(in srgb, var(--dt-surface) 84%, transparent);\\n color: var(--dt-text-muted);\\n font-size: 0.75rem;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n}\\n\\n.dt-markdown-editor__status[hidden] {\\n display: none;\\n}\\n\\n.milkdown {\\n --crepe-color-background: transparent;\\n --crepe-color-on-background: var(--dt-text);\\n --crepe-color-surface: var(--dt-surface);\\n --crepe-color-surface-low: color-mix(in srgb, var(--dt-surface) 94%, var(--dt-accent) 6%);\\n --crepe-color-on-surface: var(--dt-text);\\n --crepe-color-on-surface-variant: var(--dt-text-muted);\\n --crepe-color-outline: var(--dt-border);\\n --crepe-color-primary: var(--dt-accent);\\n --crepe-color-secondary: color-mix(in srgb, var(--dt-surface) 84%, var(--dt-accent) 16%);\\n --crepe-color-on-secondary: var(--dt-text);\\n --crepe-color-inverse: var(--dt-text);\\n --crepe-color-on-inverse: var(--dt-surface);\\n --crepe-color-inline-code: var(--dt-accent);\\n --crepe-color-error: var(--dt-danger, #ff6a6a);\\n --crepe-color-hover: var(--dt-surface-hover);\\n --crepe-color-selected: color-mix(in srgb, var(--dt-surface) 82%, var(--dt-accent) 18%);\\n --crepe-color-inline-area: color-mix(in srgb, var(--dt-surface) 90%, var(--dt-accent) 10%);\\n --crepe-font-title: var(--font-sans, 'Inter', sans-serif);\\n --crepe-font-default: var(--font-sans, 'Inter', sans-serif);\\n --crepe-font-code: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n --crepe-shadow-1: 0 0 0 1px color-mix(in srgb, var(--dt-surface) 82%, var(--dt-accent) 18%);\\n --crepe-shadow-2:\\n 0 0 0 1px color-mix(in srgb, var(--dt-surface) 78%, var(--dt-accent) 22%),\\n 0 8px 24px color-mix(in srgb, var(--dt-accent) 12%, transparent);\\n\\n height: 100%;\\n background: transparent;\\n color: var(--dt-text);\\n}\\n\\n.milkdown .ProseMirror.editor {\\n padding: 0px 54px;\\n}\\n\\n.milkdown .ProseMirror.editor h1 {\\n font-size: 36px;\\n}\\n\\n.milkdown .ProseMirror.editor h2 {\\n font-size: 30px;\\n}\\n\\n.milkdown .ProseMirror.editor h3 {\\n font-size: 24px;\\n}\\n\\n.milkdown .ProseMirror.editor h4 {\\n font-size: 20px;\\n}\\n\\n.milkdown .ProseMirror.editor h5 {\\n font-size: 16px;\\n}\\n\\n.milkdown .ProseMirror.editor h6 {\\n font-size: 16px;\\n}\\n\\n.milkdown .editor {\\n min-height: 100%;\\n padding: 16px 18px 20px;\\n outline: none;\\n color: var(--dt-text);\\n font-family: var(--font-sans, 'Inter', sans-serif);\\n font-size: 14px;\\n line-height: 1.7;\\n}\\n\\n.milkdown .editor h1,\\n.milkdown .editor h2,\\n.milkdown .editor h3,\\n.milkdown .editor h4,\\n.milkdown .editor h5,\\n.milkdown .editor h6 {\\n margin: 0.95em 0 0.45em;\\n line-height: 1.2;\\n}\\n\\n.milkdown .editor h1 {\\n color: var(--dt-accent);\\n font-size: 1.6rem;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n}\\n\\n.milkdown .editor h2 {\\n font-size: 1.28rem;\\n}\\n\\n.milkdown .editor h3 {\\n font-size: 1.08rem;\\n}\\n\\n.milkdown .editor code {\\n padding: 2px 5px;\\n border-radius: 2px;\\n background: color-mix(in srgb, var(--dt-surface) 88%, var(--dt-accent) 12%);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n font-size: 0.9em;\\n}\\n\\n.milkdown .editor pre {\\n overflow-x: auto;\\n margin: 0.9em 0;\\n padding: 12px 14px;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n}\\n\\n.milkdown .editor pre code {\\n padding: 0;\\n background: transparent;\\n}\\n\\n.milkdown .editor blockquote {\\n margin: 0.9em 0;\\n padding-left: 12px;\\n border-left: 3px solid var(--dt-accent);\\n color: var(--dt-text-muted);\\n}\\n\\n.milkdown .editor a {\\n color: var(--dt-accent);\\n text-decoration: none;\\n}\\n\\n.milkdown .editor a:hover {\\n text-decoration: underline;\\n}\\n\\n.milkdown .editor hr {\\n border: 0;\\n border-top: 1px solid var(--dt-border);\\n}\\n\\n.milkdown .editor ul,\\n.milkdown .editor ol {\\n padding-left: 1.5rem;\\n}\\n\\n/* Runtime Milkdown styles are injected after this file, so use scoped CSS\\n variables instead of direct property overrides. */\\n.milkdown .milkdown-list-item-block {\\n --crepe-color-outline: var(--dt-text-secondary);\\n}\\n\\n.milkdown .milkdown-block-handle {\\n --crepe-color-outline: var(--dt-text-muted);\\n}\\n\\n.milkdown .milkdown-block-handle .operation-item:hover {\\n --crepe-color-outline: var(--dt-text-secondary);\\n}\\n\\n.milkdown .milkdown-toolbar {\\n --crepe-color-outline: var(--dt-text-muted);\\n --crepe-color-hover: color-mix(\\n in srgb,\\n var(--dt-surface-hover) 88%,\\n var(--dt-text-secondary) 12%\\n );\\n --crepe-color-selected: color-mix(in srgb, var(--dt-surface-active) 74%, var(--dt-accent) 26%);\\n}\\n\\n.milkdown .milkdown-toolbar .toolbar-item:hover {\\n --crepe-color-outline: var(--dt-text-secondary);\\n}\\n\\n.milkdown .milkdown-toolbar .toolbar-item.active {\\n --crepe-color-primary: var(--dt-accent);\\n}\\n\\n.milkdown .editor img {\\n max-width: 100%;\\n border-radius: 2px;\\n}\\n\\n.milkdown .editor table {\\n width: 100%;\\n border-collapse: collapse;\\n}\\n\\n.milkdown .editor th,\\n.milkdown .editor td {\\n border: 1px solid var(--dt-border);\\n}\\n\";", "export interface DtMilkdownCssEntry {\n name: string;\n css: string;\n}\n\nexport interface DtMilkdownRuntime {\n Crepe: typeof import('@milkdown/crepe').Crepe;\n replaceAll: typeof import('@milkdown/kit/utils').replaceAll;\n cssText: string;\n cssEntries: DtMilkdownCssEntry[];\n}\n\ndeclare global {\n interface Window {\n __DtMilkdown?: DtMilkdownRuntime;\n }\n}\n\nlet loadPromise: Promise<DtMilkdownRuntime> | null = null;\n\nexport function loadMilkdown(): Promise<DtMilkdownRuntime> {\n if (window.__DtMilkdown) {\n return Promise.resolve(window.__DtMilkdown);\n }\n\n if (loadPromise) {\n return loadPromise;\n }\n\n loadPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = '/api/ui/milkdown.umd.js';\n script.async = true;\n script.dataset.dtMilkdown = 'true';\n script.onload = () => {\n if (window.__DtMilkdown) {\n resolve(window.__DtMilkdown);\n return;\n }\n\n reject(new Error('Milkdown runtime loaded without a __DtMilkdown export.'));\n };\n script.onerror = () => reject(new Error('Failed to load the Milkdown runtime bundle.'));\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n", "import markdownEditorCss from './styles/markdown-editor.css?raw';\nimport { loadMilkdown } from './lib/milkdown-loader';\nimport type { DtMilkdownRuntime } from './lib/milkdown-loader';\n\nexport interface DtMarkdownEditorChangeDetail {\n value: string;\n}\n\n/**\n * `<dt-markdown-editor>` \u2014 full WYSIWYG markdown editor powered by Milkdown.\n *\n * The component lazy-loads Milkdown on first use, injects the required editor\n * styles into its shadow root, and exposes a simple `value` property that reads\n * and writes markdown.\n *\n * ## Attributes\n * - `placeholder` \u2014 empty-state hint text\n * - `readonly` \u2014 when present, disables editing\n *\n * ## Properties\n * - `value` \u2014 JS-only markdown value for get/set access\n * - `readonly` \u2014 boolean reflection of the `readonly` attribute\n *\n * ## Events\n * - `dt-change` \u2014 debounced content updates with `{ value }`\n * - `dt-focus` \u2014 fired when the editor gains focus\n * - `dt-blur` \u2014 fired when the editor loses focus\n */\nexport class DtMarkdownEditor extends HTMLElement {\n private readonly _shadow: ShadowRoot;\n private readonly _runtimeStyleAnchor: Comment;\n private readonly _surface: HTMLDivElement;\n private readonly _content: HTMLDivElement;\n private readonly _status: HTMLDivElement;\n private _runtime: DtMilkdownRuntime | null = null;\n private _loadPromise: Promise<DtMilkdownRuntime> | null = null;\n private _editor: import('@milkdown/crepe').Crepe | null = null;\n private _pendingValue = '';\n private _changeTimer: ReturnType<typeof setTimeout> | null = null;\n private _setupToken = 0;\n private _suppressNextChange = false;\n\n static get observedAttributes(): string[] {\n return ['placeholder', 'readonly'];\n }\n\n get placeholder(): string {\n return this.getAttribute('placeholder') ?? '';\n }\n\n set placeholder(value: string) {\n this.setAttribute('placeholder', value);\n }\n\n get readonly(): boolean {\n return this.hasAttribute('readonly');\n }\n\n set readonly(value: boolean) {\n this.toggleAttribute('readonly', value);\n }\n\n get value(): string {\n if (this._editor) {\n this._pendingValue = this._editor.getMarkdown();\n }\n\n return this._pendingValue;\n }\n\n set value(value: string) {\n const nextValue = String(value ?? '');\n this._pendingValue = nextValue;\n\n if (this._editor && this._runtime && this._editor.getMarkdown() !== nextValue) {\n this._suppressNextChange = true;\n this._editor.editor.action(this._runtime.replaceAll(nextValue));\n }\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n this._shadow = shadow;\n\n const style = document.createElement('style');\n style.textContent = markdownEditorCss;\n shadow.appendChild(style);\n\n this._runtimeStyleAnchor = document.createComment('runtime-styles');\n shadow.appendChild(this._runtimeStyleAnchor);\n\n this._surface = document.createElement('div');\n this._surface.className = 'dt-markdown-editor';\n\n this._content = document.createElement('div');\n this._content.className = 'dt-markdown-editor__surface';\n\n const mount = document.createElement('div');\n mount.className = 'dt-markdown-editor__content';\n this._content.appendChild(mount);\n\n this._status = document.createElement('div');\n this._status.className = 'dt-markdown-editor__status';\n this._status.textContent = 'Loading editor';\n\n this._surface.append(this._content, this._status);\n shadow.appendChild(this._surface);\n }\n\n connectedCallback(): void {\n void this._initializeEditor();\n }\n\n disconnectedCallback(): void {\n this._setupToken += 1;\n this._clearChangeTimer();\n void this._destroyEditor();\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'readonly') {\n this._editor?.setReadonly(this.readonly);\n return;\n }\n\n if (name === 'placeholder' && this.isConnected) {\n void this._initializeEditor(true);\n }\n }\n\n private async _ensureRuntime(): Promise<DtMilkdownRuntime> {\n if (this._runtime) {\n return this._runtime;\n }\n\n if (!this._loadPromise) {\n this._loadPromise = loadMilkdown().then((runtime) => {\n this._runtime = runtime;\n const anchor = this._runtimeStyleAnchor;\n for (const entry of runtime.cssEntries) {\n const el = document.createElement('style');\n el.dataset.css = entry.name;\n el.textContent = entry.css;\n anchor.parentNode!.insertBefore(el, anchor.nextSibling);\n }\n return runtime;\n });\n }\n\n return this._loadPromise;\n }\n\n private async _initializeEditor(force = false): Promise<void> {\n const setupToken = ++this._setupToken;\n this._setStatus('Loading editor');\n\n if (force) {\n await this._destroyEditor();\n } else if (this._editor) {\n this._setStatus(null);\n return;\n }\n\n try {\n const runtime = await this._ensureRuntime();\n if (!this.isConnected || setupToken !== this._setupToken) {\n return;\n }\n\n this._content.replaceChildren();\n const mount = document.createElement('div');\n mount.className = 'dt-markdown-editor__content';\n this._content.appendChild(mount);\n\n const editor = new runtime.Crepe({\n root: mount,\n defaultValue: this._pendingValue,\n features: {\n [runtime.Crepe.Feature.CodeMirror]: false,\n [runtime.Crepe.Feature.ImageBlock]: false,\n [runtime.Crepe.Feature.Latex]: false,\n },\n featureConfigs: {\n [runtime.Crepe.Feature.Placeholder]: {\n text: this.placeholder,\n mode: 'doc',\n },\n },\n });\n\n editor.on((listener) => {\n listener.markdownUpdated((_ctx, markdown) => {\n this._pendingValue = markdown;\n if (this._suppressNextChange) {\n this._suppressNextChange = false;\n return;\n }\n this._queueChange(markdown);\n });\n listener.focus(() => {\n this.dispatchEvent(new CustomEvent('dt-focus', { bubbles: true, composed: true }));\n });\n listener.blur(() => {\n this.dispatchEvent(new CustomEvent('dt-blur', { bubbles: true, composed: true }));\n });\n });\n\n await editor.create();\n\n if (!this.isConnected || setupToken !== this._setupToken) {\n await editor.destroy();\n return;\n }\n\n this._editor = editor;\n this._editor.setReadonly(this.readonly);\n this._pendingValue = this._editor.getMarkdown();\n this._setStatus(null);\n } catch {\n if (setupToken === this._setupToken) {\n this._setStatus('Failed to load editor');\n }\n }\n }\n\n private async _destroyEditor(): Promise<void> {\n const editor = this._editor;\n this._editor = null;\n if (!editor) {\n return;\n }\n\n try {\n await editor.destroy();\n } catch {\n // Ignore teardown errors while the host is disconnecting.\n }\n }\n\n private _queueChange(markdown: string): void {\n this._clearChangeTimer();\n this._changeTimer = setTimeout(() => {\n this._changeTimer = null;\n this.dispatchEvent(\n new CustomEvent<DtMarkdownEditorChangeDetail>('dt-change', {\n bubbles: true,\n composed: true,\n detail: { value: markdown },\n }),\n );\n }, 300);\n }\n\n private _clearChangeTimer(): void {\n if (this._changeTimer) {\n clearTimeout(this._changeTimer);\n this._changeTimer = null;\n }\n }\n\n private _setStatus(message: string | null): void {\n if (message) {\n this._status.hidden = false;\n this._status.textContent = message;\n return;\n }\n\n this._status.hidden = true;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["index_exports", "__export", "DtBadge", "DtButton", "DtCard", "DtChart", "DtColumn", "DtDivider", "DtGrid", "DtListView", "DtMarkdown", "DtMarkdownEditor", "DtSelect", "DtStack", "DtStat", "DtTableView", "DtTooltip", "tooltip_default", "CLS", "ARROW_GAP", "styleInjected", "ensureStyles", "style", "tooltip_default", "DtTooltip", "val", "shadow", "name", "_old", "_next", "show", "popup", "trigger", "assigned", "triggerRect", "popupRect", "vw", "vh", "actual", "top", "left", "card_default", "CARD_CLS", "DtCard", "val", "shadow", "style", "card_default", "wrapper", "select_menu_default", "select_trigger_default", "TRIGGER_CLS", "LABEL_CLS", "CHEVRON_CLS", "MENU_CLS", "OPTION_CLS", "OPTION_ACTIVE_CLS", "menuStyleInjected", "ensureMenuStyles", "style", "select_menu_default", "DtSelect", "val", "shadow", "select_trigger_default", "btn", "label", "chevron", "name", "labelEl", "selected", "o", "menu", "e", "target", "opt", "item", "prev", "triggerRect", "gap", "minW", "top", "menuHeight", "vh", "vw", "grid_default", "GRID_CLS", "DtGrid", "val", "shadow", "style", "grid_default", "wrapper", "stack_default", "STACK_CLS", "normalizeDirection", "value", "DtStack", "val", "#normalizeAttributes", "name", "shadow", "style", "stack_default", "wrapper", "rawDirection", "normalizedDirection", "stat_default", "STAT_CLS", "DtStat", "val", "shadow", "style", "stat_default", "name", "_oldVal", "_newVal", "trend", "trendValue", "symbol", "badge_default", "BADGE_CLS", "DtBadge", "val", "shadow", "style", "badge_default", "textAttr", "name", "_oldVal", "_newVal", "button_default", "BUTTON_CLS", "DtButton", "val", "shadow", "style", "button_default", "form", "name", "_oldVal", "_newVal", "divider_default", "DIVIDER_CLS", "DtDivider", "val", "shadow", "style", "divider_default", "hr", "table_view_default", "normalizeBoundValue", "value", "bindTemplateFragment", "fragment", "data", "elements", "element", "textField", "attrName", "targetAttr", "fieldName", "boundValue", "createBoundTemplate", "template", "DtVirtualizer", "options", "count", "index", "height", "scrollTop", "size", "normalized", "previous", "boundedIndex", "offset", "visibleCount", "start", "end", "paddingTop", "totalHeight", "paddingBottom", "renderedHeight", "ensureRecord", "row", "normalizeAlign", "value", "DtColumn", "DtTableView", "DtVirtualizer", "raw", "shadow", "style", "table_view_default", "entries", "entry", "headerHeight", "name", "child", "column", "columnsTemplate", "fragment", "cell", "event", "label", "indicator", "range", "index", "rowElement", "record", "createBoundTemplate", "field", "minWidth", "width", "list_view_default", "DEFAULT_ESTIMATE", "ensureRecord", "item", "DtListView", "DtVirtualizer", "value", "index", "a", "b", "raw", "parsed", "shadow", "style", "list_view_default", "entries", "entry", "adjustment", "target", "name", "resetMeasurements", "fixedHeight", "range", "fragment", "itemElement", "template", "createBoundTemplate", "event", "selectable", "child", "chart_default", "loadPromise", "loadChartJs", "resolve", "reject", "script", "clamp", "value", "min", "max", "parseCsv", "part", "parseColorToHsl", "hex", "raw", "normalized", "char", "r", "g", "b", "rgbToHsl", "rgb", "hsl", "delta", "h", "l", "s", "hslString", "color", "alpha", "getPalette", "accent", "base", "offset", "index", "isPlainObject", "deepMerge", "override", "result", "key", "current", "normalizeLegend", "normalizeType", "isCartesianType", "type", "formatLabels", "item", "DtChart", "shadow", "style", "chart_default", "root", "event", "point", "label", "dataset", "loadChartJs", "runtime", "data", "config", "nextType", "_runtime", "computed", "text", "muted", "border", "font", "palette", "normalizedType", "chartData", "tone", "baseDataset", "_", "itemIndex", "baseOptions", "colorMix", "message", "primary", "secondary", "weight", "first", "second", "ratio", "hueDelta", "markdown_default", "loadPromise", "loadMarked", "resolve", "reject", "script", "normalizeLineEndings", "value", "dedentBlock", "lines", "indents", "line", "minIndent", "closeStreamingBlocks", "normalized", "closingFence", "DtMarkdown", "shadow", "style", "markdown_default", "event", "anchor", "entry", "loadMarked", "runtime", "markdown", "markdown_editor_default", "loadPromise", "loadMilkdown", "resolve", "reject", "script", "DtMarkdownEditor", "value", "nextValue", "shadow", "style", "markdown_editor_default", "mount", "name", "loadMilkdown", "runtime", "anchor", "entry", "el", "force", "setupToken", "editor", "listener", "_ctx", "markdown", "message", "DtTooltip", "DtCard", "DtSelect", "DtGrid", "DtStack", "DtStat", "DtBadge", "DtButton", "DtDivider", "DtListView", "DtTableView", "DtColumn", "DtChart", "DtMarkdown", "DtMarkdownEditor"]
|
|
3
|
+
"sources": ["../src/index.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/tooltip.css", "../src/dt-tooltip.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/card.css", "../src/dt-card.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/select-menu.css", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/select-trigger.css", "../src/dt-select.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/grid.css", "../src/dt-grid.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/stack.css", "../src/dt-stack.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/stat.css", "../src/dt-stat.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/badge.css", "../src/dt-badge.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/button.css", "../src/dt-button.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/divider.css", "../src/dt-divider.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/table-view.css", "../src/lib/template-bind.ts", "../src/lib/virtualizer.ts", "../src/dt-table-view.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/list-view.css", "../src/dt-list-view.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/chart.css", "../src/lib/chart-loader.ts", "../src/dt-chart.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/markdown.css", "../src/lib/marked-loader.ts", "../src/dt-markdown.ts", "raw-css:/workspaces/DeskTalk/packages/ui/src/styles/markdown-editor.css", "../src/lib/milkdown-loader.ts", "../src/dt-markdown-editor.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * @desktalk/ui \u2014 Framework-agnostic web components for the DeskTalk design system.\n *\n * Importing this module registers all custom elements. The shell loads it once;\n * every miniapp gets the elements for free because they share the same document.\n */\n\nimport { DtTooltip } from './dt-tooltip';\nimport { DtCard } from './dt-card';\nimport { DtSelect } from './dt-select';\nimport { DtGrid } from './dt-grid';\nimport { DtStack } from './dt-stack';\nimport { DtStat } from './dt-stat';\nimport { DtBadge } from './dt-badge';\nimport { DtButton } from './dt-button';\nimport { DtDivider } from './dt-divider';\nimport { DtColumn, DtTableView } from './dt-table-view';\nimport { DtListView } from './dt-list-view';\nimport { DtChart } from './dt-chart';\nimport { DtMarkdown } from './dt-markdown';\nimport { DtMarkdownEditor } from './dt-markdown-editor';\nimport './ui-elements';\n\nexport {\n DtTooltip,\n DtCard,\n DtSelect,\n DtGrid,\n DtStack,\n DtStat,\n DtBadge,\n DtButton,\n DtDivider,\n DtListView,\n DtTableView,\n DtColumn,\n DtChart,\n DtMarkdown,\n DtMarkdownEditor,\n};\n\n// \u2500\u2500 Auto-register \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nif (!customElements.get('dt-tooltip')) {\n customElements.define('dt-tooltip', DtTooltip);\n}\n\nif (!customElements.get('dt-card')) {\n customElements.define('dt-card', DtCard);\n}\n\nif (!customElements.get('dt-select')) {\n customElements.define('dt-select', DtSelect);\n}\n\nif (!customElements.get('dt-grid')) {\n customElements.define('dt-grid', DtGrid);\n}\n\nif (!customElements.get('dt-stack')) {\n customElements.define('dt-stack', DtStack);\n}\n\nif (!customElements.get('dt-stat')) {\n customElements.define('dt-stat', DtStat);\n}\n\nif (!customElements.get('dt-badge')) {\n customElements.define('dt-badge', DtBadge);\n}\n\nif (!customElements.get('dt-button')) {\n customElements.define('dt-button', DtButton);\n}\n\nif (!customElements.get('dt-divider')) {\n customElements.define('dt-divider', DtDivider);\n}\n\nif (!customElements.get('dt-list-view')) {\n customElements.define('dt-list-view', DtListView);\n}\n\nif (!customElements.get('dt-table-view')) {\n customElements.define('dt-table-view', DtTableView);\n}\n\nif (!customElements.get('dt-column')) {\n customElements.define('dt-column', DtColumn);\n}\n\nif (!customElements.get('dt-chart')) {\n customElements.define('dt-chart', DtChart);\n}\n\nif (!customElements.get('dt-markdown')) {\n customElements.define('dt-markdown', DtMarkdown);\n}\n\nif (!customElements.get('dt-markdown-editor')) {\n customElements.define('dt-markdown-editor', DtMarkdownEditor);\n}\n", "export default \".dt-tooltip-popup {\\n position: fixed;\\n z-index: 2147483647;\\n padding: 6px 10px;\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n color: var(--dt-text-secondary);\\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\\n font-size: 12px;\\n font-weight: 500;\\n line-height: 1.4;\\n white-space: nowrap;\\n pointer-events: none;\\n user-select: none;\\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);\\n}\\n\\n/* Tech corner accents */\\n.dt-tooltip-popup::before {\\n content: '';\\n position: absolute;\\n top: -1px;\\n left: -1px;\\n width: 4px;\\n height: 4px;\\n border-top: 1px solid var(--dt-accent);\\n border-left: 1px solid var(--dt-accent);\\n}\\n\\n.dt-tooltip-popup::after {\\n content: '';\\n position: absolute;\\n bottom: -1px;\\n right: -1px;\\n width: 4px;\\n height: 4px;\\n border-bottom: 1px solid var(--dt-accent);\\n border-right: 1px solid var(--dt-accent);\\n}\\n\\n/* Arrow styling - tech/minimal */\\n.dt-tooltip-popup[data-actual-placement='top'] {\\n transform: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='top']::before {\\n top: auto;\\n bottom: -4px;\\n left: var(--dt-tooltip-arrow-left, 50%);\\n transform: translateX(-50%);\\n width: 0;\\n height: 0;\\n border: 4px solid transparent;\\n border-top-color: var(--dt-accent);\\n border-left: none;\\n border-right: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='bottom'] {\\n transform: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='bottom']::before {\\n bottom: auto;\\n top: -4px;\\n left: var(--dt-tooltip-arrow-left, 50%);\\n transform: translateX(-50%);\\n width: 0;\\n height: 0;\\n border: 4px solid transparent;\\n border-bottom-color: var(--dt-accent);\\n border-left: none;\\n border-right: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='left'] {\\n transform: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='left']::before {\\n left: auto;\\n top: var(--dt-tooltip-arrow-top, 50%);\\n right: -4px;\\n transform: translateY(-50%);\\n width: 0;\\n height: 0;\\n border: 4px solid transparent;\\n border-left-color: var(--dt-accent);\\n border-top: none;\\n border-bottom: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='right'] {\\n transform: none;\\n}\\n\\n.dt-tooltip-popup[data-actual-placement='right']::before {\\n right: auto;\\n top: var(--dt-tooltip-arrow-top, 50%);\\n left: -4px;\\n transform: translateY(-50%);\\n width: 0;\\n height: 0;\\n border: 4px solid transparent;\\n border-right-color: var(--dt-accent);\\n border-top: none;\\n border-bottom: none;\\n}\\n\";", "import tooltipCss from './styles/tooltip.css?raw';\n\nconst CLS = 'dt-tooltip-popup';\n\ntype Placement = 'top' | 'bottom' | 'left' | 'right';\ntype Align = 'left' | 'center' | 'right';\n\nconst ARROW_GAP = 8; // px gap between trigger and tooltip\n\n/** Ensure the shared popup stylesheet is injected exactly once. */\nlet styleInjected = false;\nfunction ensureStyles(): void {\n if (styleInjected) return;\n const style = document.createElement('style');\n style.setAttribute('data-dt-tooltip', '');\n style.textContent = tooltipCss;\n document.head.appendChild(style);\n styleInjected = true;\n}\n\n/**\n * `<dt-tooltip>` \u2014 framework-agnostic tooltip web component.\n *\n * Uses Shadow DOM with a `<slot>` for the trigger element. The tooltip popup\n * is appended to `document.body` so it can escape overflow/clip ancestors.\n *\n * ## Attributes\n * - `content` \u2014 tooltip text (required)\n * - `placement` \u2014 preferred side: top | bottom | left | right (default \"top\")\n * - `align` \u2014 cross-axis alignment for top/bottom placements: left | center | right\n * (default \"center\")\n * - `delay` \u2014 show delay in milliseconds (default 0)\n * - `disabled` \u2014 when present, tooltip is suppressed\n *\n * ## Usage\n * ```html\n * <dt-tooltip content=\"Save file\" placement=\"top\">\n * <button>Save</button>\n * </dt-tooltip>\n * ```\n */\nexport class DtTooltip extends HTMLElement {\n // \u2500\u2500 Private state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _popup: HTMLDivElement | null = null;\n private _showTimeout: ReturnType<typeof setTimeout> | null = null;\n private _tooltipId = '';\n private _visible = false;\n\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['content', 'placement', 'align', 'delay', 'disabled'];\n }\n\n // \u2500\u2500 Attribute helpers (getters + setters so frameworks can set props) \u2500\u2500\u2500\n get content(): string {\n return this.getAttribute('content') ?? '';\n }\n set content(val: string) {\n this.setAttribute('content', val);\n }\n\n get placement(): Placement {\n const val = this.getAttribute('placement');\n if (val === 'bottom' || val === 'left' || val === 'right') return val;\n return 'top';\n }\n set placement(val: Placement) {\n this.setAttribute('placement', val);\n }\n\n get align(): Align {\n const val = this.getAttribute('align');\n if (val === 'left' || val === 'right') return val;\n return 'center';\n }\n set align(val: Align) {\n this.setAttribute('align', val);\n }\n\n get delay(): number {\n const val = Number(this.getAttribute('delay'));\n return Number.isFinite(val) && val > 0 ? val : 0;\n }\n set delay(val: number | string) {\n this.setAttribute('delay', String(val));\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n shadow.innerHTML = '<slot></slot>';\n\n this._tooltipId = `dt-tip-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n connectedCallback(): void {\n ensureStyles();\n\n this.addEventListener('mouseenter', this._onEnter);\n this.addEventListener('mouseleave', this._onLeave);\n this.addEventListener('focusin', this._onEnter);\n this.addEventListener('focusout', this._onLeave);\n }\n\n disconnectedCallback(): void {\n this.removeEventListener('mouseenter', this._onEnter);\n this.removeEventListener('mouseleave', this._onLeave);\n this.removeEventListener('focusin', this._onEnter);\n this.removeEventListener('focusout', this._onLeave);\n this._hide();\n }\n\n attributeChangedCallback(name: string, _old: string | null, _next: string | null): void {\n if (name === 'disabled' && this.disabled) {\n this._hide();\n }\n if (name === 'content' && this._popup) {\n this._popup.textContent = this.content;\n }\n }\n\n // \u2500\u2500 Event handlers (arrow functions for stable `this`) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _onEnter = (): void => {\n if (this.disabled || !this.content) return;\n\n if (this._showTimeout !== null) clearTimeout(this._showTimeout);\n\n const show = (): void => {\n this._createPopup();\n this._position();\n this._visible = true;\n };\n\n if (this.delay > 0) {\n this._showTimeout = setTimeout(show, this.delay);\n } else {\n show();\n }\n };\n\n private _onLeave = (): void => {\n this._hide();\n };\n\n // \u2500\u2500 Popup management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _createPopup(): void {\n if (this._popup) return;\n\n const popup = document.createElement('div');\n popup.className = CLS;\n popup.id = this._tooltipId;\n popup.setAttribute('role', 'tooltip');\n popup.textContent = this.content;\n document.body.appendChild(popup);\n this._popup = popup;\n\n // Wire ARIA on the first slotted child (the logical trigger)\n const trigger = this._getTrigger();\n if (trigger) {\n trigger.setAttribute('aria-describedby', this._tooltipId);\n }\n }\n\n private _hide(): void {\n if (this._showTimeout !== null) {\n clearTimeout(this._showTimeout);\n this._showTimeout = null;\n }\n if (this._popup) {\n // Remove ARIA from trigger\n const trigger = this._getTrigger();\n if (trigger) {\n trigger.removeAttribute('aria-describedby');\n }\n\n this._popup.remove();\n this._popup = null;\n this._visible = false;\n }\n }\n\n private _getTrigger(): Element | null {\n // First slotted child, or fall back to the host element itself\n const slot = this.shadowRoot?.querySelector('slot');\n const assigned = slot?.assignedElements();\n return assigned && assigned.length > 0 ? assigned[0] : null;\n }\n\n // \u2500\u2500 Positioning with flip logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _position(): void {\n const popup = this._popup;\n if (!popup) return;\n\n const triggerRect = this.getBoundingClientRect();\n const popupRect = popup.getBoundingClientRect();\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const viewportPadding = 8;\n\n let actual = this.placement;\n\n // Flip if not enough space on the preferred side\n if (actual === 'top' && triggerRect.top - popupRect.height - ARROW_GAP < 0) {\n actual = 'bottom';\n } else if (actual === 'bottom' && triggerRect.bottom + popupRect.height + ARROW_GAP > vh) {\n actual = 'top';\n } else if (actual === 'left' && triggerRect.left - popupRect.width - ARROW_GAP < 0) {\n actual = 'right';\n } else if (actual === 'right' && triggerRect.right + popupRect.width + ARROW_GAP > vw) {\n actual = 'left';\n }\n\n popup.setAttribute('data-actual-placement', actual);\n\n let top: number;\n let left: number;\n let anchorX = triggerRect.left + triggerRect.width / 2;\n let anchorY = triggerRect.top + triggerRect.height / 2;\n\n switch (actual) {\n case 'top':\n anchorX =\n this.align === 'left'\n ? triggerRect.left\n : this.align === 'right'\n ? triggerRect.right\n : triggerRect.left + triggerRect.width / 2;\n left =\n this.align === 'left'\n ? triggerRect.left\n : this.align === 'right'\n ? triggerRect.right - popupRect.width\n : triggerRect.left + triggerRect.width / 2 - popupRect.width / 2;\n top = triggerRect.top - popupRect.height - ARROW_GAP;\n break;\n case 'bottom':\n anchorX =\n this.align === 'left'\n ? triggerRect.left\n : this.align === 'right'\n ? triggerRect.right\n : triggerRect.left + triggerRect.width / 2;\n left =\n this.align === 'left'\n ? triggerRect.left\n : this.align === 'right'\n ? triggerRect.right - popupRect.width\n : triggerRect.left + triggerRect.width / 2 - popupRect.width / 2;\n top = triggerRect.bottom + ARROW_GAP;\n break;\n case 'left':\n left = triggerRect.left - popupRect.width - ARROW_GAP;\n top = triggerRect.top + triggerRect.height / 2 - popupRect.height / 2;\n anchorY = triggerRect.top + triggerRect.height / 2;\n break;\n case 'right':\n left = triggerRect.right + ARROW_GAP;\n top = triggerRect.top + triggerRect.height / 2 - popupRect.height / 2;\n anchorY = triggerRect.top + triggerRect.height / 2;\n break;\n }\n\n if (actual === 'top' || actual === 'bottom') {\n left = Math.max(viewportPadding, Math.min(left, vw - popupRect.width - viewportPadding));\n popup.style.setProperty(\n '--dt-tooltip-arrow-left',\n `${Math.max(8, Math.min(anchorX - left, popupRect.width - 8))}px`,\n );\n popup.style.removeProperty('--dt-tooltip-arrow-top');\n } else {\n top = Math.max(viewportPadding, Math.min(top, vh - popupRect.height - viewportPadding));\n popup.style.setProperty(\n '--dt-tooltip-arrow-top',\n `${Math.max(8, Math.min(anchorY - top, popupRect.height - 8))}px`,\n );\n popup.style.removeProperty('--dt-tooltip-arrow-left');\n }\n\n popup.style.left = `${left}px`;\n popup.style.top = `${top}px`;\n }\n}\n", "export default \":host {\\n display: block;\\n margin-bottom: 12px;\\n}\\n\\n.dt-card-inner {\\n background: var(--dt-surface);\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n padding: 12px;\\n color: var(--dt-text);\\n font-family: var(--font-ui, 'Work Sans', system-ui, sans-serif);\\n position: relative;\\n height: 100%;\\n}\\n\\n/* Corner accents for sci-fi feel */\\n.dt-card-inner::before {\\n content: '';\\n position: absolute;\\n top: -1px;\\n left: -1px;\\n width: 8px;\\n height: 8px;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-card-inner::after {\\n content: '';\\n position: absolute;\\n bottom: -1px;\\n right: -1px;\\n width: 8px;\\n height: 8px;\\n border-bottom: 2px solid var(--dt-accent);\\n border-right: 2px solid var(--dt-accent);\\n}\\n\\n:host([variant='outlined']) .dt-card-inner {\\n background: transparent;\\n border-style: dashed;\\n}\\n\\n:host([variant='filled']) .dt-card-inner {\\n background: var(--dt-accent-subtle);\\n border-style: solid;\\n}\\n\\n::slotted(h1),\\n::slotted(h2),\\n::slotted(h3),\\n::slotted(h4),\\n::slotted(h5),\\n::slotted(h6) {\\n color: var(--dt-accent);\\n margin: 0 0 6px;\\n line-height: 1.2;\\n font-family: var(--font-display, 'Sora', system-ui, sans-serif);\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.1em;\\n font-size: 0.85rem;\\n}\\n\\n::slotted(p) {\\n color: var(--dt-text-secondary);\\n margin: 0 0 6px;\\n line-height: 1.4;\\n font-family: var(--font-ui, 'Work Sans', system-ui, sans-serif);\\n font-size: 0.8125rem;\\n}\\n\\n::slotted(p:last-child) {\\n margin-bottom: 0;\\n}\\n\";", "import cardCss from './styles/card.css?raw';\n\nconst CARD_CLS = 'dt-card-inner';\n\ntype CardVariant = 'default' | 'outlined' | 'filled';\n\n/**\n * `<dt-card>` \u2014 framework-agnostic card web component.\n *\n * Renders a card container with a solid border using the theme accent color\n * and no border-radius.\n *\n * ## Attributes\n * - `variant` \u2014 visual style: default | outlined | filled (default \"default\")\n *\n * ## Usage\n * ```html\n * <dt-card>\n * <h3>Title</h3>\n * <p>Card content goes here.</p>\n * </dt-card>\n *\n * <dt-card variant=\"outlined\">\n * <p>Outlined card with transparent background.</p>\n * </dt-card>\n * ```\n */\nexport class DtCard extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['variant'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get variant(): CardVariant {\n const val = this.getAttribute('variant');\n if (val === 'outlined' || val === 'filled') return val;\n return 'default';\n }\n\n set variant(val: CardVariant) {\n this.setAttribute('variant', val);\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = cardCss;\n shadow.appendChild(style);\n\n const wrapper = document.createElement('div');\n wrapper.className = CARD_CLS;\n wrapper.innerHTML = '<slot></slot>';\n shadow.appendChild(wrapper);\n }\n}\n", "export default \".dt-select-menu {\\n position: fixed;\\n z-index: 2147483646;\\n display: flex;\\n min-width: 200px;\\n max-width: min(300px, 72vw);\\n max-height: 240px;\\n flex-direction: column;\\n overflow-y: auto;\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);\\n opacity: 0;\\n pointer-events: none;\\n transition: opacity 100ms ease;\\n}\\n\\n.dt-select-menu[data-open] {\\n opacity: 1;\\n pointer-events: auto;\\n}\\n\\n.dt-select-option {\\n display: flex;\\n width: 100%;\\n align-items: center;\\n justify-content: space-between;\\n padding: 8px 10px;\\n border: 0;\\n border-bottom: 1px solid var(--dt-border-subtle);\\n background: transparent;\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n font-size: 0.8125rem;\\n font-weight: 600;\\n letter-spacing: 0.04em;\\n text-align: left;\\n cursor: pointer;\\n transition: all 0.1s ease;\\n user-select: none;\\n}\\n\\n.dt-select-option:last-child {\\n border-bottom: none;\\n}\\n\\n.dt-select-option:hover {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-option.dt-select-option--active {\\n background: var(--dt-accent-subtle);\\n color: var(--dt-accent);\\n}\\n\\n.dt-select-option span {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\";", "export default \":host {\\n display: block;\\n width: 100%;\\n min-width: 0;\\n position: relative;\\n}\\n\\n:host([disabled]) .dt-select-trigger {\\n cursor: not-allowed;\\n opacity: 0.4;\\n}\\n\\n.dt-select-trigger {\\n display: flex;\\n width: 100%;\\n min-width: 0;\\n max-width: 100%;\\n box-sizing: border-box;\\n align-items: center;\\n gap: 6px;\\n padding: 6px 10px;\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n font-size: 0.8125rem;\\n font-weight: 600;\\n letter-spacing: 0.04em;\\n line-height: 1;\\n cursor: pointer;\\n transition: all 0.1s ease;\\n user-select: none;\\n position: relative;\\n}\\n\\n/* Corner accents */\\n.dt-select-trigger::before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 4px;\\n height: 4px;\\n border-top: 1px solid var(--dt-accent);\\n border-left: 1px solid var(--dt-accent);\\n}\\n\\n.dt-select-trigger::after {\\n content: '';\\n position: absolute;\\n bottom: 0;\\n right: 0;\\n width: 4px;\\n height: 4px;\\n border-bottom: 1px solid var(--dt-accent);\\n border-right: 1px solid var(--dt-accent);\\n}\\n\\n.dt-select-trigger:hover:not([disabled]) {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-trigger:hover:not([disabled])::before,\\n.dt-select-trigger:hover:not([disabled])::after {\\n border-color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-trigger[aria-expanded='true'] {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-trigger[aria-expanded='true']::before,\\n.dt-select-trigger[aria-expanded='true']::after {\\n border-color: var(--dt-text-on-accent);\\n}\\n\\n.dt-select-label {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\\n.dt-select-chevron {\\n color: currentColor;\\n font-size: 10px;\\n transition: transform 140ms ease;\\n opacity: 0.7;\\n}\\n\\n.dt-select-trigger[aria-expanded='true'] .dt-select-chevron {\\n transform: rotate(180deg);\\n}\\n\";", "import selectMenuCss from './styles/select-menu.css?raw';\nimport selectTriggerCss from './styles/select-trigger.css?raw';\n\nconst TRIGGER_CLS = 'dt-select-trigger';\nconst LABEL_CLS = 'dt-select-label';\nconst CHEVRON_CLS = 'dt-select-chevron';\nconst MENU_CLS = 'dt-select-menu';\nconst OPTION_CLS = 'dt-select-option';\nconst OPTION_ACTIVE_CLS = 'dt-select-option--active';\n\n/** Shape of an option passed via the `options` property. */\nexport interface DtSelectOption {\n value: string;\n label: string;\n}\n\n/** Ensure the shared global menu stylesheet is injected exactly once. */\nlet menuStyleInjected = false;\nfunction ensureMenuStyles(): void {\n if (menuStyleInjected) return;\n const style = document.createElement('style');\n style.setAttribute('data-dt-select', '');\n style.textContent = selectMenuCss;\n document.head.appendChild(style);\n menuStyleInjected = true;\n}\n\nexport type DtSelectAlign = 'left' | 'right';\n\n/**\n * `<dt-select>` \u2014 framework-agnostic select/dropdown web component.\n *\n * Uses Shadow DOM for the trigger button and appends the dropdown menu to\n * `document.body` so it can escape overflow/clip ancestors.\n *\n * ## Attributes\n * - `value` \u2014 the currently selected option value\n * - `placeholder` \u2014 text shown when no value is selected (default \"Select...\")\n * - `disabled` \u2014 when present, interaction is suppressed\n * - `align` \u2014 horizontal alignment of the popup relative to the trigger:\n * \"left\" (default) or \"right\"\n *\n * ## Properties\n * - `options` \u2014 `Array<{ value: string; label: string }>` set via JS\n *\n * ## Events\n * - `dt-change` \u2014 fired when the user selects an option; `detail.value` is\n * the selected value\n *\n * ## Usage\n * ```html\n * <dt-select placeholder=\"Choose session\" value=\"s1\" align=\"right\"></dt-select>\n * <script>\n * const sel = document.querySelector('dt-select');\n * sel.options = [\n * { value: 's1', label: 'Session 1' },\n * { value: 's2', label: 'Session 2' },\n * ];\n * sel.addEventListener('dt-change', (e) => console.log(e.detail.value));\n * </script>\n * ```\n */\nexport class DtSelect extends HTMLElement {\n // \u2500\u2500 Private state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _menu: HTMLDivElement | null = null;\n private _trigger: HTMLButtonElement | null = null;\n private _options: DtSelectOption[] = [];\n private _open = false;\n private _menuId = '';\n\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['value', 'placeholder', 'disabled', 'align'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n get value(): string {\n return this.getAttribute('value') ?? '';\n }\n set value(val: string) {\n this.setAttribute('value', val);\n }\n\n get placeholder(): string {\n return this.getAttribute('placeholder') ?? 'Select\\u2026';\n }\n set placeholder(val: string) {\n this.setAttribute('placeholder', val);\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n get align(): DtSelectAlign {\n const val = this.getAttribute('align');\n if (val === 'right') return 'right';\n return 'left';\n }\n set align(val: DtSelectAlign) {\n this.setAttribute('align', val);\n }\n\n // \u2500\u2500 Options property (JS-only, not reflected as attribute) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n get options(): DtSelectOption[] {\n return this._options;\n }\n set options(val: DtSelectOption[]) {\n this._options = val;\n this._updateLabel();\n if (this._open) {\n this._renderMenuItems();\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = selectTriggerCss;\n shadow.appendChild(style);\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = TRIGGER_CLS;\n btn.setAttribute('aria-haspopup', 'listbox');\n btn.setAttribute('aria-expanded', 'false');\n\n const label = document.createElement('span');\n label.className = LABEL_CLS;\n btn.appendChild(label);\n\n const chevron = document.createElement('span');\n chevron.className = CHEVRON_CLS;\n chevron.setAttribute('aria-hidden', 'true');\n chevron.textContent = '\\u25BE'; // \u25BE small down-pointing triangle\n btn.appendChild(chevron);\n\n shadow.appendChild(btn);\n\n this._trigger = btn;\n this._menuId = `dt-sel-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n connectedCallback(): void {\n ensureMenuStyles();\n this._trigger!.addEventListener('click', this._onTriggerClick);\n this._updateLabel();\n }\n\n disconnectedCallback(): void {\n this._trigger!.removeEventListener('click', this._onTriggerClick);\n this._close();\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'value') {\n this._updateLabel();\n if (this._open) {\n this._renderMenuItems();\n }\n }\n if (name === 'placeholder' && !this.value) {\n this._updateLabel();\n }\n if (name === 'disabled' && this.disabled) {\n this._close();\n }\n }\n\n // \u2500\u2500 Private helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _updateLabel(): void {\n const labelEl = this._trigger!.querySelector(`.${LABEL_CLS}`) as HTMLSpanElement;\n const selected = this._options.find((o) => o.value === this.value);\n labelEl.textContent = selected?.label ?? this.placeholder;\n }\n\n // \u2500\u2500 Toggle / open / close \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _onTriggerClick = (): void => {\n if (this.disabled) return;\n if (this._open) {\n this._close();\n } else {\n this._openMenu();\n }\n };\n\n private _openMenu(): void {\n if (this._open) return;\n\n const menu = document.createElement('div');\n menu.className = MENU_CLS;\n menu.id = this._menuId;\n menu.setAttribute('role', 'listbox');\n document.body.appendChild(menu);\n this._menu = menu;\n\n this._renderMenuItems();\n this._position();\n\n // Show after a microtask so the transition plays\n requestAnimationFrame(() => {\n menu.setAttribute('data-open', '');\n });\n\n this._open = true;\n this._trigger!.setAttribute('aria-expanded', 'true');\n\n // Close on outside click (next tick to avoid the current click)\n requestAnimationFrame(() => {\n document.addEventListener('mousedown', this._onOutsideClick);\n document.addEventListener('keydown', this._onKeyDown);\n window.addEventListener('blur', this._onWindowBlur);\n });\n }\n\n private _close(): void {\n if (!this._open) return;\n\n document.removeEventListener('mousedown', this._onOutsideClick);\n document.removeEventListener('keydown', this._onKeyDown);\n window.removeEventListener('blur', this._onWindowBlur);\n\n if (this._menu) {\n this._menu.removeAttribute('data-open');\n // Remove after the fade-out transition\n const menu = this._menu;\n setTimeout(() => menu.remove(), 140);\n this._menu = null;\n }\n\n this._open = false;\n this._trigger!.setAttribute('aria-expanded', 'false');\n }\n\n private _onOutsideClick = (e: MouseEvent): void => {\n const target = e.target as Node;\n // Click inside the menu or on the trigger \u2014 ignore\n if (this._menu?.contains(target) || this.contains(target)) return;\n this._close();\n };\n\n private _onWindowBlur = (): void => {\n requestAnimationFrame(() => {\n if (document.activeElement?.tagName === 'IFRAME') {\n this._close();\n }\n });\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n this._close();\n this._trigger!.focus();\n }\n };\n\n // \u2500\u2500 Menu rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _renderMenuItems(): void {\n const menu = this._menu;\n if (!menu) return;\n\n menu.innerHTML = '';\n\n for (const opt of this._options) {\n const item = document.createElement('button');\n item.type = 'button';\n item.className = OPTION_CLS;\n item.setAttribute('role', 'option');\n item.setAttribute('aria-selected', String(opt.value === this.value));\n\n if (opt.value === this.value) {\n item.classList.add(OPTION_ACTIVE_CLS);\n }\n\n const label = document.createElement('span');\n label.textContent = opt.label;\n item.appendChild(label);\n\n item.addEventListener('click', () => {\n this._selectValue(opt.value);\n });\n\n menu.appendChild(item);\n }\n }\n\n private _selectValue(val: string): void {\n const prev = this.value;\n this.value = val;\n this._updateLabel();\n this._close();\n\n if (val !== prev) {\n this.dispatchEvent(\n new CustomEvent('dt-change', {\n detail: { value: val },\n bubbles: true,\n composed: true,\n }),\n );\n }\n }\n\n // \u2500\u2500 Positioning \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _position(): void {\n const menu = this._menu;\n if (!menu) return;\n\n const triggerRect = this.getBoundingClientRect();\n const gap = 10;\n const minW = Math.max(triggerRect.width, 240);\n\n // Place below the trigger by default\n let top = triggerRect.bottom + gap;\n\n // If the menu would overflow the viewport bottom, flip above\n const menuHeight = menu.scrollHeight || 260;\n const vh = window.innerHeight;\n if (top + menuHeight > vh && triggerRect.top - menuHeight - gap > 0) {\n top = triggerRect.top - menuHeight - gap;\n }\n\n menu.style.minWidth = `${minW}px`;\n\n // Horizontal alignment\n if (this.align === 'right') {\n // Anchor the menu's right edge to the trigger's right edge\n const vw = window.innerWidth;\n menu.style.right = `${vw - triggerRect.right}px`;\n menu.style.left = 'auto';\n } else {\n menu.style.left = `${triggerRect.left}px`;\n menu.style.right = 'auto';\n }\n\n menu.style.top = `${top}px`;\n }\n}\n", "export default \":host {\\n display: block;\\n margin-bottom: 12px;\\n}\\n\\n.dt-grid-inner {\\n display: grid;\\n gap: var(--grid-gap, 12px);\\n grid-template-columns: repeat(auto-fit, minmax(var(--min-width, 220px), 1fr));\\n}\\n\\n:host([cols='1']) .dt-grid-inner {\\n grid-template-columns: repeat(1, 1fr);\\n}\\n\\n:host([cols='2']) .dt-grid-inner {\\n grid-template-columns: repeat(2, 1fr);\\n}\\n\\n:host([cols='3']) .dt-grid-inner {\\n grid-template-columns: repeat(3, 1fr);\\n}\\n\\n:host([cols='4']) .dt-grid-inner {\\n grid-template-columns: repeat(4, 1fr);\\n}\\n\\n:host([cols='5']) .dt-grid-inner {\\n grid-template-columns: repeat(5, 1fr);\\n}\\n\\n:host([cols='6']) .dt-grid-inner {\\n grid-template-columns: repeat(6, 1fr);\\n}\\n\\n@media (max-width: 480px) {\\n :host([cols='2']) .dt-grid-inner,\\n :host([cols='3']) .dt-grid-inner,\\n :host([cols='4']) .dt-grid-inner,\\n :host([cols='5']) .dt-grid-inner,\\n :host([cols='6']) .dt-grid-inner {\\n grid-template-columns: 1fr;\\n }\\n}\\n\\n:host([gap='0']) .dt-grid-inner {\\n --grid-gap: 0;\\n}\\n:host([gap='4']) .dt-grid-inner {\\n --grid-gap: 4px;\\n}\\n:host([gap='8']) .dt-grid-inner {\\n --grid-gap: 8px;\\n}\\n:host([gap='12']) .dt-grid-inner {\\n --grid-gap: 12px;\\n}\\n:host([gap='16']) .dt-grid-inner {\\n --grid-gap: 16px;\\n}\\n:host([gap='20']) .dt-grid-inner {\\n --grid-gap: 20px;\\n}\\n:host([gap='24']) .dt-grid-inner {\\n --grid-gap: 24px;\\n}\\n:host([gap='32']) .dt-grid-inner {\\n --grid-gap: 32px;\\n}\\n\\n:host([min-width='150']) .dt-grid-inner {\\n --min-width: 150px;\\n}\\n:host([min-width='180']) .dt-grid-inner {\\n --min-width: 180px;\\n}\\n:host([min-width='200']) .dt-grid-inner {\\n --min-width: 200px;\\n}\\n:host([min-width='220']) .dt-grid-inner {\\n --min-width: 220px;\\n}\\n:host([min-width='260']) .dt-grid-inner {\\n --min-width: 260px;\\n}\\n:host([min-width='300']) .dt-grid-inner {\\n --min-width: 300px;\\n}\\n\\n::slotted(*) {\\n min-width: 0;\\n}\\n\";", "import gridCss from './styles/grid.css?raw';\n\nconst GRID_CLS = 'dt-grid-inner';\n\ntype GridCols = '1' | '2' | '3' | '4' | '5' | '6';\ntype GridGap = '0' | '4' | '8' | '12' | '16' | '20' | '24' | '32';\ntype GridMinWidth = '150' | '180' | '200' | '220' | '260' | '300';\n\n/**\n * `<dt-grid>` \u2014 framework-agnostic responsive grid web component.\n *\n * Provides a grid layout that auto-collapses to single column in narrow views.\n * Uses CSS Grid's repeat(auto-fit) pattern with minmax for responsive behavior.\n *\n * ## Attributes\n * - `cols` \u2014 fixed number of columns (1-6). Auto-fit responsive when omitted.\n * - `gap` \u2014 spacing between items: 0, 4, 8, 12, 16, 20, 24, 32 (default: 16)\n * - `min-width` \u2014 minimum width for auto-fit columns: 150, 180, 200, 220, 260, 300 (default: 220)\n *\n * ## Usage\n * ```html\n * <!-- Auto-responsive: columns collapse based on available space -->\n * <dt-grid>\n * <dt-card>Item 1</dt-card>\n * <dt-card>Item 2</dt-card>\n * <dt-card>Item 3</dt-card>\n * </dt-grid>\n *\n * <!-- Fixed 3 columns, collapses to 1 on mobile -->\n * <dt-grid cols=\"3\" gap=\"24\">\n * <dt-card>Item 1</dt-card>\n * <dt-card>Item 2</dt-card>\n * <dt-card>Item 3</dt-card>\n * </dt-grid>\n *\n * <!-- Narrow items: more columns fit side-by-side -->\n * <dt-grid min-width=\"150\">\n * <dt-stat label=\"CPU\" value=\"42%\"></dt-stat>\n * <dt-stat label=\"RAM\" value=\"8GB\"></dt-stat>\n * <dt-stat label=\"Disk\" value=\"256GB\"></dt-stat>\n * </dt-grid>\n * ```\n */\nexport class DtGrid extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['cols', 'gap', 'min-width'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get cols(): GridCols | null {\n const val = this.getAttribute('cols');\n if (val === '1' || val === '2' || val === '3' || val === '4' || val === '5' || val === '6') {\n return val;\n }\n return null;\n }\n\n set cols(val: GridCols | null) {\n if (val === null) {\n this.removeAttribute('cols');\n } else {\n this.setAttribute('cols', val);\n }\n }\n\n get gap(): GridGap {\n const val = this.getAttribute('gap');\n if (\n val === '0' ||\n val === '4' ||\n val === '8' ||\n val === '12' ||\n val === '20' ||\n val === '24' ||\n val === '32'\n ) {\n return val;\n }\n return '16';\n }\n\n set gap(val: GridGap) {\n this.setAttribute('gap', val);\n }\n\n get minWidth(): GridMinWidth {\n const val = this.getAttribute('min-width');\n if (val === '150' || val === '180' || val === '200' || val === '260' || val === '300') {\n return val;\n }\n return '220';\n }\n\n set minWidth(val: GridMinWidth) {\n this.setAttribute('min-width', val);\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = gridCss;\n shadow.appendChild(style);\n\n const wrapper = document.createElement('div');\n wrapper.className = GRID_CLS;\n wrapper.innerHTML = '<slot></slot>';\n shadow.appendChild(wrapper);\n }\n}\n", "export default \":host {\\n display: block;\\n margin-bottom: 12px;\\n}\\n\\n.dt-stack-inner {\\n display: flex;\\n flex-direction: var(--flex-direction, column);\\n gap: var(--stack-gap, 12px);\\n align-items: var(--align-items, stretch);\\n}\\n\\n:host([direction='column']) .dt-stack-inner {\\n --flex-direction: column;\\n}\\n:host([direction='row']) .dt-stack-inner {\\n --flex-direction: row;\\n}\\n\\n:host([gap='0']) .dt-stack-inner {\\n --stack-gap: 0;\\n}\\n:host([gap='4']) .dt-stack-inner {\\n --stack-gap: 4px;\\n}\\n:host([gap='8']) .dt-stack-inner {\\n --stack-gap: 8px;\\n}\\n:host([gap='12']) .dt-stack-inner {\\n --stack-gap: 12px;\\n}\\n:host([gap='16']) .dt-stack-inner {\\n --stack-gap: 16px;\\n}\\n:host([gap='20']) .dt-stack-inner {\\n --stack-gap: 20px;\\n}\\n:host([gap='24']) .dt-stack-inner {\\n --stack-gap: 24px;\\n}\\n:host([gap='32']) .dt-stack-inner {\\n --stack-gap: 32px;\\n}\\n\\n:host([align='start']) .dt-stack-inner {\\n --align-items: flex-start;\\n}\\n:host([align='center']) .dt-stack-inner {\\n --align-items: center;\\n}\\n:host([align='end']) .dt-stack-inner {\\n --align-items: flex-end;\\n}\\n:host([align='stretch']) .dt-stack-inner {\\n --align-items: stretch;\\n}\\n\\n@media (max-width: 480px) {\\n :host([direction='row']) .dt-stack-inner {\\n --flex-direction: column;\\n }\\n}\\n\\n::slotted(*) {\\n min-width: 0;\\n}\\n\";", "import stackCss from './styles/stack.css?raw';\n\nconst STACK_CLS = 'dt-stack-inner';\n\ntype StackDirection = 'column' | 'row';\ntype StackGap = '0' | '4' | '8' | '12' | '16' | '20' | '24' | '32';\ntype StackAlign = 'start' | 'center' | 'end' | 'stretch';\n\nfunction normalizeDirection(value: string | null): StackDirection {\n if (value === 'row' || value === 'horizontal') {\n return 'row';\n }\n\n return 'column';\n}\n\n/**\n * `<dt-stack>` \u2014 framework-agnostic flexbox stack web component.\n *\n * Provides vertical or horizontal flexbox layout with responsive behavior.\n * Row stacks automatically wrap to column on narrow views.\n *\n * ## Attributes\n * - `direction` \u2014 stack direction: `column` (default) or `row`\n * - `gap` \u2014 spacing between items: 0, 4, 8, 12, 16, 20, 24, 32 (default: 16)\n * - `align` \u2014 cross-axis alignment: `start`, `center`, `end`, `stretch` (default: stretch)\n *\n * ## Usage\n * ```html\n * <!-- Vertical stack (default) -->\n * <dt-stack>\n * <dt-card>Item 1</dt-card>\n * <dt-card>Item 2</dt-card>\n * <dt-card>Item 3</dt-card>\n * </dt-stack>\n *\n * <!-- Horizontal row (wraps to column on narrow views) -->\n * <dt-stack direction=\"row\" gap=\"24\">\n * <dt-button>Save</dt-button>\n * <dt-button variant=\"secondary\">Cancel</dt-button>\n * </dt-stack>\n *\n * <!-- Centered horizontal row -->\n * <dt-stack direction=\"row\" align=\"center\" gap=\"8\">\n * <dt-badge variant=\"success\">Active</dt-badge>\n * <span>System running</span>\n * </dt-stack>\n * ```\n */\nexport class DtStack extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['direction', 'gap', 'align'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get direction(): StackDirection {\n return normalizeDirection(this.getAttribute('direction'));\n }\n\n set direction(val: StackDirection) {\n this.setAttribute('direction', normalizeDirection(val));\n }\n\n get gap(): StackGap {\n const val = this.getAttribute('gap');\n if (\n val === '0' ||\n val === '4' ||\n val === '8' ||\n val === '12' ||\n val === '20' ||\n val === '24' ||\n val === '32'\n ) {\n return val;\n }\n return '16';\n }\n\n set gap(val: StackGap) {\n this.setAttribute('gap', val);\n }\n\n get align(): StackAlign {\n const val = this.getAttribute('align');\n if (val === 'start' || val === 'center' || val === 'end') {\n return val;\n }\n return 'stretch';\n }\n\n set align(val: StackAlign) {\n this.setAttribute('align', val);\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n connectedCallback() {\n this.#normalizeAttributes();\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'direction') {\n this.#normalizeAttributes();\n }\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = stackCss;\n shadow.appendChild(style);\n\n const wrapper = document.createElement('div');\n wrapper.className = STACK_CLS;\n wrapper.innerHTML = '<slot></slot>';\n shadow.appendChild(wrapper);\n }\n\n #normalizeAttributes(): void {\n const rawDirection = this.getAttribute('direction');\n const normalizedDirection = normalizeDirection(rawDirection);\n if (rawDirection !== null && rawDirection !== normalizedDirection) {\n this.setAttribute('direction', normalizedDirection);\n }\n }\n}\n", "export default \":host {\\n display: block;\\n}\\n\\n.dt-stat-inner {\\n background: var(--dt-surface);\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n padding: 12px;\\n font-family: var(--font-ui, 'Work Sans', system-ui, sans-serif);\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n position: relative;\\n}\\n\\n/* Corner accents */\\n.dt-stat-inner::before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 6px;\\n height: 6px;\\n border-top: 1px solid var(--dt-accent);\\n border-left: 1px solid var(--dt-accent);\\n}\\n\\n.dt-stat-inner .label {\\n font-size: 0.625rem;\\n font-weight: 600;\\n color: var(--dt-text-muted);\\n text-transform: uppercase;\\n letter-spacing: 0.12em;\\n}\\n\\n.dt-stat-inner .value {\\n font-size: 1.5rem;\\n font-weight: 600;\\n color: var(--dt-accent);\\n line-height: 1.1;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n font-family: var(--font-display, 'Sora', system-ui, sans-serif);\\n}\\n\\n.dt-stat-inner .description {\\n font-size: 0.75rem;\\n color: var(--dt-text-secondary);\\n line-height: 1.3;\\n}\\n\\n/* Size variants */\\n:host([size='sm']) .dt-stat-inner .value {\\n font-size: 1.125rem;\\n}\\n\\n:host([size='sm']) .dt-stat-inner {\\n padding: 8px;\\n}\\n\\n:host([size='lg']) .dt-stat-inner .value {\\n font-size: 2rem;\\n}\\n\\n:host([size='lg']) .dt-stat-inner {\\n padding: 16px;\\n}\\n\\n/* Variant: outlined */\\n:host([variant='outlined']) .dt-stat-inner {\\n background: transparent;\\n border-style: dashed;\\n}\\n\\n/* Variant: filled */\\n:host([variant='filled']) .dt-stat-inner {\\n background: var(--dt-accent-subtle);\\n border-style: solid;\\n}\\n\\n/* Trend indicators */\\n.dt-stat-inner .trend {\\n display: inline-flex;\\n align-items: center;\\n gap: 3px;\\n font-size: 0.6875rem;\\n font-weight: 600;\\n margin-top: 2px;\\n text-transform: uppercase;\\n letter-spacing: 0.05em;\\n}\\n\\n.dt-stat-inner .trend.positive {\\n color: var(--dt-success);\\n}\\n\\n.dt-stat-inner .trend.negative {\\n color: var(--dt-danger);\\n}\\n\\n.dt-stat-inner .trend.neutral {\\n color: var(--dt-text-muted);\\n}\\n\";", "import statCss from './styles/stat.css?raw';\n\nconst STAT_CLS = 'dt-stat-inner';\n\ntype StatSize = 'sm' | 'md' | 'lg';\ntype StatVariant = 'default' | 'outlined' | 'filled';\n\n/**\n * `<dt-stat>` \u2014 framework-agnostic statistic/metric display web component.\n *\n * Displays a metric/KPI with label, value, and optional description.\n * Designed for dashboards and system monitors.\n *\n * ## Attributes\n * - `label` \u2014 the metric label (e.g., \"CPU Usage\", \"Memory\")\n * - `value` \u2014 the metric value (e.g., \"42%\", \"8.2 GB\")\n * - `description` \u2014 optional descriptive text\n * - `size` \u2014 size variant: `sm`, `md` (default), `lg`\n * - `variant` \u2014 visual style: `default`, `outlined`, `filled`\n * - `trend` \u2014 optional trend indicator: `up`, `down`, `neutral` (shows +/\u2212 symbol)\n * - `trend-value` \u2014 value to display with trend (e.g., \"+5%\")\n *\n * ## Usage\n * ```html\n * <dt-stat label=\"CPU Usage\" value=\"42%\"></dt-stat>\n *\n * <dt-stat label=\"Memory\" value=\"8.2 GB\" description=\"of 16 GB used\"></dt-stat>\n *\n * <dt-stat label=\"Uptime\" value=\"99.9%\" size=\"lg\" variant=\"filled\"></dt-stat>\n *\n * <dt-stat\n * label=\"Traffic\"\n * value=\"12.5k\"\n * description=\"visitors today\"\n * trend=\"up\"\n * trend-value=\"+18%\"\n * ></dt-stat>\n * ```\n */\nexport class DtStat extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['label', 'value', 'description', 'size', 'variant', 'trend', 'trend-value'];\n }\n\n // \u2500\u2500 Internal refs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _container!: HTMLDivElement;\n private _labelEl!: HTMLDivElement;\n private _valueEl!: HTMLDivElement;\n private _descEl!: HTMLDivElement;\n private _trendEl!: HTMLDivElement;\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get label(): string | null {\n return this.getAttribute('label');\n }\n\n set label(val: string | null) {\n if (val === null) {\n this.removeAttribute('label');\n } else {\n this.setAttribute('label', val);\n }\n }\n\n get value(): string | null {\n return this.getAttribute('value');\n }\n\n set value(val: string | null) {\n if (val === null) {\n this.removeAttribute('value');\n } else {\n this.setAttribute('value', val);\n }\n }\n\n get description(): string | null {\n return this.getAttribute('description');\n }\n\n set description(val: string | null) {\n if (val === null) {\n this.removeAttribute('description');\n } else {\n this.setAttribute('description', val);\n }\n }\n\n get size(): StatSize {\n const val = this.getAttribute('size');\n if (val === 'sm' || val === 'lg') return val;\n return 'md';\n }\n\n set size(val: StatSize) {\n this.setAttribute('size', val);\n }\n\n get variant(): StatVariant {\n const val = this.getAttribute('variant');\n if (val === 'outlined' || val === 'filled') return val;\n return 'default';\n }\n\n set variant(val: StatVariant) {\n this.setAttribute('variant', val);\n }\n\n get trend(): 'up' | 'down' | 'neutral' | null {\n const val = this.getAttribute('trend');\n if (val === 'up' || val === 'down' || val === 'neutral') return val;\n return null;\n }\n\n set trend(val: 'up' | 'down' | 'neutral' | null) {\n if (val === null) {\n this.removeAttribute('trend');\n } else {\n this.setAttribute('trend', val);\n }\n }\n\n get trendValue(): string | null {\n return this.getAttribute('trend-value');\n }\n\n set trendValue(val: string | null) {\n if (val === null) {\n this.removeAttribute('trend-value');\n } else {\n this.setAttribute('trend-value', val);\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = statCss;\n shadow.appendChild(style);\n\n this._container = document.createElement('div');\n this._container.className = STAT_CLS;\n\n this._labelEl = document.createElement('div');\n this._labelEl.className = 'label';\n this._container.appendChild(this._labelEl);\n\n this._valueEl = document.createElement('div');\n this._valueEl.className = 'value';\n this._container.appendChild(this._valueEl);\n\n this._descEl = document.createElement('div');\n this._descEl.className = 'description';\n this._container.appendChild(this._descEl);\n\n this._trendEl = document.createElement('div');\n this._trendEl.className = 'trend';\n this._container.appendChild(this._trendEl);\n\n shadow.appendChild(this._container);\n\n this._render();\n }\n\n // \u2500\u2500 Updates \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n attributeChangedCallback(name: string, _oldVal: string | null, _newVal: string | null): void {\n if (\n name === 'label' ||\n name === 'value' ||\n name === 'description' ||\n name === 'size' ||\n name === 'variant' ||\n name === 'trend' ||\n name === 'trend-value'\n ) {\n this._render();\n }\n }\n\n private _render(): void {\n this._labelEl.textContent = this.label ?? '';\n this._labelEl.style.display = this.label ? 'block' : 'none';\n\n this._valueEl.textContent = this.value ?? '';\n this._valueEl.style.display = this.value ? 'block' : 'none';\n\n this._descEl.textContent = this.description ?? '';\n this._descEl.style.display = this.description ? 'block' : 'none';\n\n const trend = this.trend;\n const trendValue = this.trendValue;\n\n if (trend && trendValue) {\n this._trendEl.style.display = 'inline-flex';\n this._trendEl.className = `trend ${trend === 'up' ? 'positive' : trend === 'down' ? 'negative' : 'neutral'}`;\n\n let symbol = '';\n if (trend === 'up') symbol = '\u2191';\n else if (trend === 'down') symbol = '\u2193';\n else symbol = '\u2192';\n\n this._trendEl.textContent = `${symbol} ${trendValue}`;\n } else {\n this._trendEl.style.display = 'none';\n }\n }\n}\n", "export default \":host {\\n display: inline-flex;\\n vertical-align: middle;\\n}\\n\\n.dt-badge-inner {\\n display: inline-flex;\\n align-items: center;\\n padding: 2px 6px;\\n border: 1px solid;\\n border-radius: 2px;\\n font-size: 0.6875rem;\\n font-weight: 600;\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n line-height: 1.2;\\n white-space: nowrap;\\n text-transform: uppercase;\\n letter-spacing: 0.1em;\\n}\\n\\n/* Variant: accent (default) */\\n:host([variant='accent']) .dt-badge-inner,\\n.dt-badge-inner {\\n background: var(--dt-accent-subtle);\\n border-color: var(--dt-accent);\\n color: var(--dt-accent);\\n}\\n\\n/* Variant: success */\\n:host([variant='success']) .dt-badge-inner {\\n background: var(--dt-success-subtle);\\n border-color: var(--dt-success);\\n color: var(--dt-success);\\n}\\n\\n/* Variant: danger */\\n:host([variant='danger']) .dt-badge-inner {\\n background: var(--dt-danger-subtle);\\n border-color: var(--dt-danger);\\n color: var(--dt-danger);\\n}\\n\\n/* Variant: warning */\\n:host([variant='warning']) .dt-badge-inner {\\n background: var(--dt-warning-subtle);\\n border-color: var(--dt-warning);\\n color: var(--dt-warning);\\n}\\n\\n/* Variant: info */\\n:host([variant='info']) .dt-badge-inner {\\n background: var(--dt-info-subtle);\\n border-color: var(--dt-info);\\n color: var(--dt-info);\\n}\\n\\n/* Variant: default/neutral */\\n:host([variant='default']) .dt-badge-inner,\\n:host([variant='neutral']) .dt-badge-inner {\\n background: transparent;\\n border-color: var(--dt-border);\\n color: var(--dt-text-secondary);\\n}\\n\\n/* Size variants */\\n:host([size='sm']) .dt-badge-inner {\\n padding: 1px 4px;\\n font-size: 0.625rem;\\n}\\n\\n:host([size='lg']) .dt-badge-inner {\\n padding: 3px 8px;\\n font-size: 0.75rem;\\n}\\n\";", "import badgeCss from './styles/badge.css?raw';\n\nconst BADGE_CLS = 'dt-badge-inner';\n\ntype BadgeVariant = 'accent' | 'success' | 'danger' | 'warning' | 'info' | 'default' | 'neutral';\ntype BadgeSize = 'sm' | 'md' | 'lg';\n\n/**\n * `<dt-badge>` \u2014 framework-agnostic status badge web component.\n *\n * Inline status pill/badge for labels and indicators.\n *\n * ## Attributes\n * - `variant` \u2014 status color: `accent` (default), `success`, `danger`, `warning`, `info`, `neutral`\n * - `size` \u2014 size: `sm`, `md` (default), `lg`\n * - `text` \u2014 the badge text (alternative to slot)\n *\n * ## Usage\n * ```html\n * <dt-badge>New</dt-badge>\n *\n * <dt-badge variant=\"success\">Active</dt-badge>\n *\n * <dt-badge variant=\"danger\" size=\"lg\">Error</dt-badge>\n *\n * <dt-badge variant=\"info\" size=\"sm\">Beta</dt-badge>\n * ```\n */\nexport class DtBadge extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['variant', 'size', 'text'];\n }\n\n // \u2500\u2500 Internal refs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _container!: HTMLSpanElement;\n private _slot!: HTMLSlotElement;\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get variant(): BadgeVariant {\n const val = this.getAttribute('variant');\n if (\n val === 'success' ||\n val === 'danger' ||\n val === 'warning' ||\n val === 'info' ||\n val === 'default' ||\n val === 'neutral'\n ) {\n return val;\n }\n return 'accent';\n }\n\n set variant(val: BadgeVariant) {\n this.setAttribute('variant', val);\n }\n\n get size(): BadgeSize {\n const val = this.getAttribute('size');\n if (val === 'sm' || val === 'lg') return val;\n return 'md';\n }\n\n set size(val: BadgeSize) {\n this.setAttribute('size', val);\n }\n\n get text(): string | null {\n return this.getAttribute('text');\n }\n\n set text(val: string | null) {\n if (val === null) {\n this.removeAttribute('text');\n } else {\n this.setAttribute('text', val);\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = badgeCss;\n shadow.appendChild(style);\n\n this._container = document.createElement('span');\n this._container.className = BADGE_CLS;\n\n // If text attribute is set, use it; otherwise use a slot\n const textAttr = this.text;\n if (textAttr !== null) {\n this._container.textContent = textAttr;\n } else {\n this._slot = document.createElement('slot');\n this._container.appendChild(this._slot);\n }\n\n shadow.appendChild(this._container);\n }\n\n // \u2500\u2500 Updates \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n attributeChangedCallback(name: string, _oldVal: string | null, _newVal: string | null): void {\n if (name === 'text') {\n this._render();\n }\n }\n\n private _render(): void {\n const textAttr = this.text;\n if (textAttr !== null) {\n this._container.textContent = textAttr;\n }\n }\n}\n", "export default \":host {\\n display: inline-flex;\\n vertical-align: middle;\\n}\\n\\n.dt-button-inner {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: 4px;\\n padding: 6px 12px;\\n border: 1px solid var(--dt-accent);\\n border-radius: 2px;\\n font-size: 0.8125rem;\\n font-weight: 600;\\n font-family: var(--font-ui, 'Work Sans', system-ui, sans-serif);\\n line-height: 1.2;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n cursor: pointer;\\n transition: all 0.1s ease;\\n background: var(--dt-surface);\\n color: var(--dt-accent);\\n text-transform: uppercase;\\n letter-spacing: 0.08em;\\n position: relative;\\n}\\n\\n/* Corner accents */\\n.dt-button-inner::before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 4px;\\n height: 4px;\\n border-top: 1px solid var(--dt-accent);\\n border-left: 1px solid var(--dt-accent);\\n}\\n\\n.dt-button-inner::after {\\n content: '';\\n position: absolute;\\n bottom: 0;\\n right: 0;\\n width: 4px;\\n height: 4px;\\n border-bottom: 1px solid var(--dt-accent);\\n border-right: 1px solid var(--dt-accent);\\n}\\n\\n.dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n.dt-button-inner:hover:not(:disabled)::before,\\n.dt-button-inner:hover:not(:disabled)::after {\\n border-color: var(--dt-text-on-accent);\\n}\\n\\n.dt-button-inner:active:not(:disabled) {\\n background: var(--dt-accent-active);\\n}\\n\\n.dt-button-inner:disabled {\\n opacity: 0.4;\\n cursor: not-allowed;\\n border-color: var(--dt-border);\\n color: var(--dt-text-muted);\\n}\\n\\n.dt-button-inner:disabled::before,\\n.dt-button-inner:disabled::after {\\n border-color: var(--dt-border);\\n}\\n\\n/* Variant: primary - filled accent */\\n:host([variant='primary']) .dt-button-inner {\\n background: var(--dt-accent);\\n color: var(--dt-text-on-accent);\\n}\\n\\n:host([variant='primary']) .dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-accent-hover);\\n}\\n\\n/* Variant: secondary - outlined */\\n:host([variant='secondary']) .dt-button-inner {\\n background: transparent;\\n border-color: var(--dt-border);\\n color: var(--dt-text);\\n}\\n\\n:host([variant='secondary']) .dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-surface-hover);\\n border-color: var(--dt-accent);\\n color: var(--dt-accent);\\n}\\n\\n/* Variant: ghost - minimal */\\n:host([variant='ghost']) .dt-button-inner {\\n background: transparent;\\n border-color: transparent;\\n color: var(--dt-text-secondary);\\n}\\n\\n:host([variant='ghost']) .dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-surface);\\n border-color: var(--dt-border);\\n color: var(--dt-text);\\n}\\n\\n:host([variant='ghost']) .dt-button-inner::before,\\n:host([variant='ghost']) .dt-button-inner::after {\\n display: none;\\n}\\n\\n/* Variant: danger */\\n:host([variant='danger']) .dt-button-inner {\\n background: transparent;\\n border-color: var(--dt-danger);\\n color: var(--dt-danger);\\n}\\n\\n:host([variant='danger']) .dt-button-inner:hover:not(:disabled) {\\n background: var(--dt-danger);\\n color: var(--dt-text-on-accent);\\n}\\n\\n:host([variant='danger']) .dt-button-inner::before,\\n:host([variant='danger']) .dt-button-inner::after {\\n border-color: var(--dt-danger);\\n}\\n\\n:host([variant='danger']) .dt-button-inner:hover:not(:disabled)::before,\\n:host([variant='danger']) .dt-button-inner:hover:not(:disabled)::after {\\n border-color: var(--dt-text-on-accent);\\n}\\n\\n/* Size: sm */\\n:host([size='sm']) .dt-button-inner {\\n padding: 4px 8px;\\n font-size: 0.75rem;\\n}\\n\\n/* Size: lg */\\n:host([size='lg']) .dt-button-inner {\\n padding: 8px 16px;\\n font-size: 0.875rem;\\n}\\n\\n:host([fullwidth]) .dt-button-inner {\\n width: 100%;\\n}\\n\\n::slotted([slot='icon']) {\\n display: inline-flex;\\n width: 1em;\\n height: 1em;\\n}\\n\";", "import buttonCss from './styles/button.css?raw';\n\nconst BUTTON_CLS = 'dt-button-inner';\n\ntype ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';\ntype ButtonSize = 'sm' | 'md' | 'lg';\n\n/**\n * `<dt-button>` \u2014 framework-agnostic button web component.\n *\n * Themed button with multiple variants and sizes. Automatically styles to match\n * the DeskTalk design system using CSS custom properties.\n *\n * ## Attributes\n * - `variant` \u2014 button style: `primary` (default), `secondary`, `ghost`, `danger`\n * - `size` \u2014 button size: `sm`, `md` (default), `lg`\n * - `disabled` \u2014 disables the button\n * - `fullwidth` \u2014 makes the button fill its container width\n * - `type` \u2014 HTML button type: `button` (default), `submit`, `reset`\n *\n * ## Slots\n * - default \u2014 button content (text, icons, etc.)\n * - `icon` \u2014 icon element positioned before the content\n *\n * ## Usage\n * ```html\n * <dt-button>Save</dt-button>\n *\n * <dt-button variant=\"secondary\">Cancel</dt-button>\n *\n * <dt-button variant=\"danger\" size=\"sm\">Delete</dt-button>\n *\n * <dt-button variant=\"ghost\" disabled>Disabled</dt-button>\n *\n * <dt-button fullwidth>Full Width Button</dt-button>\n * ```\n */\nexport class DtButton extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['variant', 'size', 'disabled', 'fullwidth', 'type'];\n }\n\n // \u2500\u2500 Internal refs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private _button!: HTMLButtonElement;\n private _slot!: HTMLSlotElement;\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get variant(): ButtonVariant {\n const val = this.getAttribute('variant');\n if (val === 'secondary' || val === 'ghost' || val === 'danger') return val;\n return 'primary';\n }\n\n set variant(val: ButtonVariant) {\n this.setAttribute('variant', val);\n }\n\n get size(): ButtonSize {\n const val = this.getAttribute('size');\n if (val === 'sm' || val === 'lg') return val;\n return 'md';\n }\n\n set size(val: ButtonSize) {\n this.setAttribute('size', val);\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(val: boolean) {\n if (val) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n get fullwidth(): boolean {\n return this.hasAttribute('fullwidth');\n }\n\n set fullwidth(val: boolean) {\n if (val) {\n this.setAttribute('fullwidth', '');\n } else {\n this.removeAttribute('fullwidth');\n }\n }\n\n get type(): 'button' | 'submit' | 'reset' {\n const val = this.getAttribute('type');\n if (val === 'submit' || val === 'reset') return val;\n return 'button';\n }\n\n set type(val: 'button' | 'submit' | 'reset') {\n this.setAttribute('type', val);\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = buttonCss;\n shadow.appendChild(style);\n\n this._button = document.createElement('button');\n this._button.className = BUTTON_CLS;\n this._button.type = this.type;\n this._button.disabled = this.disabled;\n\n this._slot = document.createElement('slot');\n this._button.appendChild(this._slot);\n\n // Handle form submission for submit buttons\n this._button.addEventListener('click', () => {\n if (this.type === 'submit' && !this.disabled) {\n const form = this.closest('form');\n if (form) {\n form.requestSubmit();\n }\n }\n });\n\n shadow.appendChild(this._button);\n }\n\n // \u2500\u2500 Updates \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n attributeChangedCallback(name: string, _oldVal: string | null, _newVal: string | null): void {\n switch (name) {\n case 'disabled':\n this._button.disabled = this.disabled;\n break;\n case 'type':\n this._button.type = this.type;\n break;\n }\n }\n}\n", "export default \":host {\\n display: block;\\n}\\n\\n.dt-divider-inner {\\n border: none;\\n margin: 0;\\n flex-shrink: 0;\\n}\\n\\n/* Horizontal (default) */\\n:host([direction='horizontal']) .dt-divider-inner,\\n.dt-divider-inner {\\n width: 100%;\\n height: 1px;\\n background: var(--dt-accent);\\n opacity: 0.5;\\n}\\n\\n/* Vertical */\\n:host([direction='vertical']) .dt-divider-inner {\\n width: 1px;\\n height: 100%;\\n min-height: 1em;\\n background: var(--dt-accent);\\n opacity: 0.5;\\n}\\n\\n/* Style variants */\\n:host([style-variant='subtle']) .dt-divider-inner {\\n background: var(--dt-border);\\n opacity: 1;\\n}\\n\\n:host([style-variant='strong']) .dt-divider-inner {\\n background: var(--dt-accent);\\n opacity: 1;\\n height: 2px;\\n}\\n\\n:host([direction='vertical'][style-variant='strong']) .dt-divider-inner {\\n width: 2px;\\n height: 100%;\\n}\\n\\n/* Spacing */\\n:host([spacing='sm']) .dt-divider-inner {\\n margin: 6px 0;\\n}\\n:host([spacing='md']) .dt-divider-inner {\\n margin: 12px 0;\\n}\\n:host([spacing='lg']) .dt-divider-inner {\\n margin: 18px 0;\\n}\\n\\n:host([direction='vertical'][spacing='sm']) .dt-divider-inner {\\n margin: 0 6px;\\n}\\n:host([direction='vertical'][spacing='md']) .dt-divider-inner {\\n margin: 0 12px;\\n}\\n:host([direction='vertical'][spacing='lg']) .dt-divider-inner {\\n margin: 0 18px;\\n}\\n\";", "import dividerCss from './styles/divider.css?raw';\n\nconst DIVIDER_CLS = 'dt-divider-inner';\n\ntype DividerDirection = 'horizontal' | 'vertical';\ntype DividerStyle = 'default' | 'subtle' | 'strong';\ntype DividerSpacing = 'sm' | 'md' | 'lg';\n\n/**\n * `<dt-divider>` \u2014 framework-agnostic divider/separator web component.\n *\n * Horizontal or vertical separator line for organizing content.\n *\n * ## Attributes\n * - `direction` \u2014 divider orientation: `horizontal` (default) or `vertical`\n * - `style-variant` \u2014 border style: `default`, `subtle`, `strong`\n * - `spacing` \u2014 margin around divider: `sm`, `md`, `lg`\n *\n * ## Usage\n * ```html\n * <!-- Horizontal divider (default) -->\n * <dt-divider></dt-divider>\n *\n * <!-- Subtle horizontal divider with spacing -->\n * <dt-divider style-variant=\"subtle\" spacing=\"md\"></dt-divider>\n *\n * <!-- Vertical divider in a row layout -->\n * <dt-stack direction=\"row\">\n * <span>Left</span>\n * <dt-divider direction=\"vertical\"></dt-divider>\n * <span>Right</span>\n * </dt-stack>\n * ```\n */\nexport class DtDivider extends HTMLElement {\n // \u2500\u2500 Observed attributes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n static get observedAttributes(): string[] {\n return ['direction', 'style-variant', 'spacing'];\n }\n\n // \u2500\u2500 Attribute helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n get direction(): DividerDirection {\n const val = this.getAttribute('direction');\n if (val === 'vertical') return 'vertical';\n return 'horizontal';\n }\n\n set direction(val: DividerDirection) {\n this.setAttribute('direction', val);\n }\n\n get styleVariant(): DividerStyle {\n const val = this.getAttribute('style-variant');\n if (val === 'subtle' || val === 'strong') return val;\n return 'default';\n }\n\n set styleVariant(val: DividerStyle) {\n this.setAttribute('style-variant', val);\n }\n\n get spacing(): DividerSpacing | null {\n const val = this.getAttribute('spacing');\n if (val === 'sm' || val === 'md' || val === 'lg') return val;\n return null;\n }\n\n set spacing(val: DividerSpacing | null) {\n if (val === null) {\n this.removeAttribute('spacing');\n } else {\n this.setAttribute('spacing', val);\n }\n }\n\n // \u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = dividerCss;\n shadow.appendChild(style);\n\n const hr = document.createElement('hr');\n hr.className = DIVIDER_CLS;\n shadow.appendChild(hr);\n }\n}\n", "export default \":host {\\n display: block;\\n min-height: 180px;\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n}\\n\\n.dt-table-view {\\n display: flex;\\n flex-direction: column;\\n min-height: inherit;\\n height: 100%;\\n overflow: hidden;\\n background: var(--dt-surface);\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n position: relative;\\n}\\n\\n.dt-table-view::before,\\n.dt-table-view::after {\\n content: '';\\n position: absolute;\\n width: 8px;\\n height: 8px;\\n pointer-events: none;\\n z-index: 3;\\n}\\n\\n.dt-table-view::before {\\n top: -1px;\\n left: -1px;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-table-view::after {\\n right: -1px;\\n bottom: -1px;\\n border-right: 2px solid var(--dt-accent);\\n border-bottom: 2px solid var(--dt-accent);\\n}\\n\\n.dt-table-scroll {\\n min-height: inherit;\\n height: 100%;\\n overflow: auto;\\n}\\n\\n.dt-table-header,\\n.dt-table-row {\\n display: grid;\\n grid-template-columns: var(--dt-table-columns, minmax(0, 1fr));\\n min-width: fit-content;\\n}\\n\\n.dt-table-header {\\n position: sticky;\\n top: 0;\\n z-index: 2;\\n background: color-mix(in srgb, var(--dt-surface) 88%, var(--dt-accent) 12%);\\n border-bottom: 1px solid var(--dt-border);\\n}\\n\\n.dt-table-header-cell,\\n.dt-table-cell {\\n min-width: 0;\\n padding: 10px 12px;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n font-size: 0.8125rem;\\n}\\n\\n.dt-table-header-cell {\\n color: var(--dt-accent);\\n font-size: 0.75rem;\\n font-weight: 600;\\n letter-spacing: 0.1em;\\n text-transform: uppercase;\\n}\\n\\n.dt-table-header-cell--sortable {\\n cursor: pointer;\\n user-select: none;\\n}\\n\\n.dt-table-header-cell--sortable:hover {\\n background: var(--dt-surface-hover);\\n}\\n\\n.dt-table-header-label {\\n display: inline-flex;\\n align-items: center;\\n gap: 6px;\\n}\\n\\n.dt-table-sort-indicator {\\n color: var(--dt-text-secondary);\\n font-size: 0.7rem;\\n}\\n\\n.dt-table-body {\\n position: relative;\\n}\\n\\n.dt-table-canvas {\\n position: relative;\\n}\\n\\n.dt-table-row {\\n position: absolute;\\n left: 0;\\n right: 0;\\n border-bottom: 1px solid var(--dt-border-subtle);\\n}\\n\\n.dt-table-row--clickable {\\n cursor: pointer;\\n}\\n\\n.dt-table-row--clickable:hover {\\n background: var(--dt-surface-hover);\\n}\\n\\n:host([striped]) .dt-table-row:nth-child(even) {\\n background: color-mix(in srgb, var(--dt-surface) 92%, var(--dt-accent) 8%);\\n}\\n\\n:host([bordered]) .dt-table-header-cell,\\n:host([bordered]) .dt-table-cell {\\n border-right: 1px solid var(--dt-border-subtle);\\n}\\n\\n:host([bordered]) .dt-table-header-cell:last-child,\\n:host([bordered]) .dt-table-cell:last-child {\\n border-right: 0;\\n}\\n\\n.dt-table-cell[data-align='center'],\\n.dt-table-header-cell[data-align='center'] {\\n text-align: center;\\n}\\n\\n.dt-table-cell[data-align='right'],\\n.dt-table-header-cell[data-align='right'] {\\n text-align: right;\\n}\\n\\n.dt-table-empty {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n min-height: 140px;\\n padding: 20px;\\n color: var(--dt-text-muted);\\n text-transform: uppercase;\\n letter-spacing: 0.08em;\\n font-size: 0.75rem;\\n}\\n\";", "function normalizeBoundValue(value: unknown): string | null {\n if (value === null || value === undefined || value === false) {\n return null;\n }\n\n if (value === true) {\n return '';\n }\n\n return String(value);\n}\n\nexport function bindTemplateFragment(\n fragment: DocumentFragment,\n data: Record<string, unknown>,\n): void {\n const elements = fragment.querySelectorAll<HTMLElement>('*');\n\n for (const element of elements) {\n const textField = element.getAttribute('data-field');\n if (textField) {\n const value = data[textField];\n element.textContent = value === null || value === undefined ? '' : String(value);\n }\n\n for (const attrName of element.getAttributeNames()) {\n if (attrName === 'data-field' || !attrName.startsWith('data-field-')) {\n continue;\n }\n\n const targetAttr = attrName.slice('data-field-'.length);\n if (!targetAttr) {\n continue;\n }\n\n const fieldName = element.getAttribute(attrName);\n if (!fieldName) {\n continue;\n }\n\n const boundValue = normalizeBoundValue(data[fieldName]);\n if (boundValue === null) {\n element.removeAttribute(targetAttr);\n } else {\n element.setAttribute(targetAttr, boundValue);\n }\n }\n }\n}\n\nexport function createBoundTemplate(\n template: HTMLTemplateElement,\n data: Record<string, unknown>,\n): DocumentFragment {\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n bindTemplateFragment(fragment, data);\n return fragment;\n}\n", "export interface VirtualRange {\n start: number;\n end: number;\n paddingTop: number;\n paddingBottom: number;\n totalHeight: number;\n}\n\ninterface VirtualizerOptions {\n count?: number;\n estimateSize?: number;\n overscan?: number;\n fixedSize?: number | null;\n}\n\nexport class DtVirtualizer {\n private _count = 0;\n private _estimateSize = 56;\n private _overscan = 5;\n private _fixedSize: number | null = null;\n private _viewportHeight = 0;\n private _scrollTop = 0;\n private _sizes = new Map<number, number>();\n\n constructor(options: VirtualizerOptions = {}) {\n this._count = options.count ?? 0;\n this._estimateSize = options.estimateSize ?? 56;\n this._overscan = options.overscan ?? 5;\n this._fixedSize = options.fixedSize ?? null;\n }\n\n setCount(count: number): void {\n this._count = Math.max(0, count);\n for (const index of this._sizes.keys()) {\n if (index >= this._count) {\n this._sizes.delete(index);\n }\n }\n }\n\n setViewportHeight(height: number): void {\n this._viewportHeight = Math.max(0, height);\n }\n\n setScrollTop(scrollTop: number): void {\n this._scrollTop = Math.max(0, scrollTop);\n }\n\n setEstimateSize(size: number): void {\n this._estimateSize = Math.max(1, size);\n }\n\n setFixedSize(size: number | null): void {\n this._fixedSize = size && size > 0 ? size : null;\n }\n\n resetMeasurements(): void {\n this._sizes.clear();\n }\n\n measure(index: number, size: number): number {\n if (this._fixedSize !== null || index < 0 || index >= this._count) {\n return 0;\n }\n\n const normalized = Math.max(1, Math.round(size));\n const previous = this._sizes.get(index);\n if (previous === normalized) {\n return 0;\n }\n\n this._sizes.set(index, normalized);\n\n if (this.getOffset(index + 1) <= this._scrollTop) {\n return normalized - (previous ?? this._estimateSize);\n }\n\n return 0;\n }\n\n getOffset(index: number): number {\n if (index <= 0) {\n return 0;\n }\n\n const boundedIndex = Math.min(index, this._count);\n\n if (this._fixedSize !== null) {\n return boundedIndex * this._fixedSize;\n }\n\n let offset = 0;\n for (let i = 0; i < boundedIndex; i += 1) {\n offset += this._sizes.get(i) ?? this._estimateSize;\n }\n return offset;\n }\n\n getTotalHeight(): number {\n return this.getOffset(this._count);\n }\n\n getRange(): VirtualRange {\n if (this._count === 0) {\n return { start: 0, end: 0, paddingTop: 0, paddingBottom: 0, totalHeight: 0 };\n }\n\n if (this._fixedSize !== null) {\n const visibleCount = Math.max(1, Math.ceil(this._viewportHeight / this._fixedSize));\n const start = Math.max(0, Math.floor(this._scrollTop / this._fixedSize) - this._overscan);\n const end = Math.min(this._count, start + visibleCount + this._overscan * 2);\n const paddingTop = start * this._fixedSize;\n const totalHeight = this._count * this._fixedSize;\n const paddingBottom = Math.max(0, totalHeight - paddingTop - (end - start) * this._fixedSize);\n return { start, end, paddingTop, paddingBottom, totalHeight };\n }\n\n let start = 0;\n let offset = 0;\n while (start < this._count) {\n const size = this._sizes.get(start) ?? this._estimateSize;\n if (offset + size > this._scrollTop) {\n break;\n }\n offset += size;\n start += 1;\n }\n\n start = Math.max(0, start - this._overscan);\n const paddingTop = this.getOffset(start);\n\n let end = start;\n let renderedHeight = 0;\n while (end < this._count && renderedHeight < this._viewportHeight) {\n renderedHeight += this._sizes.get(end) ?? this._estimateSize;\n end += 1;\n }\n end = Math.min(this._count, end + this._overscan);\n\n const totalHeight = this.getTotalHeight();\n const paddingBottom = Math.max(0, totalHeight - this.getOffset(end));\n\n return { start, end, paddingTop, paddingBottom, totalHeight };\n }\n}\n", "import tableViewCss from './styles/table-view.css?raw';\nimport { createBoundTemplate } from './lib/template-bind';\nimport { DtVirtualizer } from './lib/virtualizer';\n\nexport type DtTableViewAlign = 'left' | 'center' | 'right';\nexport type DtTableViewSortDirection = 'asc' | 'desc';\n\nexport interface DtTableViewSortDetail {\n field: string;\n direction: DtTableViewSortDirection;\n}\n\nexport interface DtTableViewRowClickDetail<T = unknown> {\n row: T;\n index: number;\n}\n\ninterface DtTableColumnConfig {\n field: string;\n header: string;\n width: string;\n minWidth: string;\n align: DtTableViewAlign;\n template: HTMLTemplateElement | null;\n}\n\nfunction ensureRecord(row: unknown): Record<string, unknown> {\n if (row && typeof row === 'object') {\n return row as Record<string, unknown>;\n }\n return { value: row };\n}\n\nfunction normalizeAlign(value: string | null): DtTableViewAlign {\n if (value === 'center' || value === 'right') {\n return value;\n }\n return 'left';\n}\n\nexport class DtColumn extends HTMLElement {\n static get observedAttributes(): string[] {\n return ['field', 'header', 'width', 'min-width', 'align'];\n }\n\n get field(): string {\n return this.getAttribute('field') ?? '';\n }\n\n get header(): string {\n return this.getAttribute('header') ?? this.field;\n }\n\n get width(): string {\n return this.getAttribute('width') ?? 'auto';\n }\n\n get minWidth(): string {\n return this.getAttribute('min-width') ?? '0';\n }\n\n get align(): DtTableViewAlign {\n return normalizeAlign(this.getAttribute('align'));\n }\n\n connectedCallback(): void {\n this.hidden = true;\n }\n\n attributeChangedCallback(): void {\n this.dispatchEvent(new CustomEvent('dt-column-change', { bubbles: true, composed: true }));\n }\n}\n\n/**\n * `<dt-table-view>` \u2014 virtualized data table for structured row/column data.\n *\n * Columns are declared with child `<dt-column>` elements. Rows are provided via\n * the JS-only `rows` property. Sorting is event-driven: the component updates\n * header state and emits `dt-sort`, while the consumer is responsible for\n * reordering and reassigning `rows`.\n *\n * ## Attributes\n * - `row-height` \u2014 fixed row height in px\n * - `sortable` \u2014 when present, enables sortable header cells\n * - `striped` \u2014 when present, alternates row backgrounds\n * - `bordered` \u2014 when present, shows cell borders\n * - `empty-text` \u2014 text shown when there are no rows or no columns\n *\n * ## Properties\n * - `rows` \u2014 array of row objects to render\n *\n * ## `<dt-column>` attributes\n * - `field` \u2014 row field key\n * - `header` \u2014 header label; defaults to `field`\n * - `width` \u2014 column width in px or `auto`\n * - `min-width` \u2014 minimum column width\n * - `align` \u2014 `left`, `center`, or `right`\n *\n * If a `<dt-column>` contains a child `<template>`, that template is cloned for\n * each cell in the column. Template bindings work the same way as in\n * `<dt-list-view>`:\n * - `data-field=\"status\"` sets text content from `row.status`\n * - `data-field-variant=\"statusVariant\"` sets the `variant` attribute from `row.statusVariant`\n *\n * ## Events\n * - `dt-sort` \u2014 fired with `{ field, direction }` when a header is activated\n * - `dt-row-click` \u2014 fired with `{ row, index }` when a body row is clicked\n *\n * ## Usage\n * ```html\n * <dt-table-view id=\"processes\" row-height=\"40\" sortable striped>\n * <dt-column field=\"name\" header=\"Process\" width=\"220\"></dt-column>\n * <dt-column field=\"cpu\" header=\"CPU %\" width=\"100\" align=\"right\"></dt-column>\n * <dt-column field=\"status\" header=\"Status\" width=\"140\">\n * <template>\n * <dt-badge data-field=\"status\" data-field-variant=\"statusVariant\"></dt-badge>\n * </template>\n * </dt-column>\n * </dt-table-view>\n * <script>\n * const table = document.getElementById('processes');\n * const rows = [\n * { name: 'node', cpu: '12.4', status: 'running', statusVariant: 'success' },\n * { name: 'cron', cpu: '1.2', status: 'idle', statusVariant: 'neutral' },\n * ];\n * table.rows = rows;\n * table.addEventListener('dt-sort', (event) => {\n * const { field, direction } = event.detail;\n * table.rows = [...rows].sort((a, b) =>\n * direction === 'asc'\n * ? String(a[field]).localeCompare(String(b[field]), undefined, { numeric: true })\n * : String(b[field]).localeCompare(String(a[field]), undefined, { numeric: true }),\n * );\n * });\n * </script>\n * ```\n */\nexport class DtTableView extends HTMLElement {\n private _rows: unknown[] = [];\n private _columns: DtTableColumnConfig[] = [];\n private readonly _virtualizer = new DtVirtualizer({\n estimateSize: 40,\n overscan: 5,\n fixedSize: 40,\n });\n private readonly _root: HTMLDivElement;\n private readonly _scroll: HTMLDivElement;\n private readonly _header: HTMLDivElement;\n private readonly _body: HTMLDivElement;\n private readonly _canvas: HTMLDivElement;\n private readonly _emptyState: HTMLDivElement;\n private _resizeObserver: ResizeObserver | null = null;\n private _mutationObserver: MutationObserver | null = null;\n private _sortField: string | null = null;\n private _sortDirection: DtTableViewSortDirection = 'asc';\n\n static get observedAttributes(): string[] {\n return ['row-height', 'sortable', 'striped', 'bordered', 'empty-text'];\n }\n\n get rows(): unknown[] {\n return this._rows;\n }\n\n set rows(value: unknown[]) {\n this._rows = Array.isArray(value) ? value : [];\n this._virtualizer.setCount(this._rows.length);\n this._render();\n }\n\n get rowHeight(): number {\n const raw = Number(this.getAttribute('row-height') ?? '40');\n return Number.isFinite(raw) && raw > 0 ? raw : 40;\n }\n\n set rowHeight(value: number) {\n this.setAttribute('row-height', String(value));\n }\n\n get sortable(): boolean {\n return this.hasAttribute('sortable');\n }\n\n get emptyText(): string {\n return this.getAttribute('empty-text') ?? 'No data';\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = tableViewCss;\n shadow.appendChild(style);\n\n this._root = document.createElement('div');\n this._root.className = 'dt-table-view';\n\n this._scroll = document.createElement('div');\n this._scroll.className = 'dt-table-scroll';\n this._scroll.addEventListener('scroll', this._onScroll, { passive: true });\n\n this._header = document.createElement('div');\n this._header.className = 'dt-table-header';\n\n this._body = document.createElement('div');\n this._body.className = 'dt-table-body';\n\n this._canvas = document.createElement('div');\n this._canvas.className = 'dt-table-canvas';\n\n this._emptyState = document.createElement('div');\n this._emptyState.className = 'dt-table-empty';\n\n this._body.append(this._canvas, this._emptyState);\n this._scroll.append(this._header, this._body);\n this._root.appendChild(this._scroll);\n shadow.appendChild(this._root);\n }\n\n connectedCallback(): void {\n this._virtualizer.setFixedSize(this.rowHeight);\n this._virtualizer.setEstimateSize(this.rowHeight);\n this._syncColumns();\n\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.target === this._scroll) {\n const headerHeight = this._header.offsetHeight;\n this._virtualizer.setViewportHeight(Math.max(0, entry.contentRect.height - headerHeight));\n this._render();\n }\n }\n });\n this._resizeObserver.observe(this._scroll);\n\n this._mutationObserver = new MutationObserver(() => {\n this._syncColumns();\n this._render();\n });\n this._mutationObserver.observe(this, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['field', 'header', 'width', 'min-width', 'align'],\n });\n\n this._virtualizer.setCount(this._rows.length);\n this._virtualizer.setViewportHeight(\n Math.max(0, this._scroll.clientHeight - this._header.offsetHeight),\n );\n this._render();\n }\n\n disconnectedCallback(): void {\n this._scroll.removeEventListener('scroll', this._onScroll);\n this._resizeObserver?.disconnect();\n this._mutationObserver?.disconnect();\n this._resizeObserver = null;\n this._mutationObserver = null;\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'row-height') {\n this._virtualizer.setFixedSize(this.rowHeight);\n this._virtualizer.setEstimateSize(this.rowHeight);\n }\n this._render();\n }\n\n private _onScroll = (): void => {\n this._virtualizer.setScrollTop(Math.max(0, this._scroll.scrollTop - this._header.offsetHeight));\n this._renderBody();\n };\n\n private _syncColumns(): void {\n this._columns = Array.from(this.children)\n .filter((child): child is DtColumn => child instanceof DtColumn)\n .map((column) => ({\n field: column.field,\n header: column.header,\n width: column.width,\n minWidth: column.minWidth,\n align: column.align,\n template:\n Array.from(column.children).find(\n (child): child is HTMLTemplateElement => child instanceof HTMLTemplateElement,\n ) ?? null,\n }))\n .filter((column) => column.field);\n }\n\n private _render(): void {\n if (!this.isConnected) {\n return;\n }\n\n this._emptyState.textContent = this.emptyText;\n const columnsTemplate =\n this._columns.length > 0\n ? this._columns.map((column) => this._toGridColumn(column)).join(' ')\n : 'minmax(0, 1fr)';\n this._header.style.setProperty('--dt-table-columns', columnsTemplate);\n this._canvas.style.setProperty('--dt-table-columns', columnsTemplate);\n\n this._renderHeader();\n this._renderBody();\n }\n\n private _renderHeader(): void {\n const fragment = document.createDocumentFragment();\n\n for (const column of this._columns) {\n const cell = document.createElement('div');\n cell.className = 'dt-table-header-cell';\n cell.dataset.align = column.align;\n\n if (this.sortable) {\n cell.classList.add('dt-table-header-cell--sortable');\n cell.tabIndex = 0;\n cell.setAttribute('role', 'button');\n cell.setAttribute('aria-label', `Sort by ${column.header}`);\n cell.addEventListener('click', () => this._requestSort(column.field));\n cell.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this._requestSort(column.field);\n }\n });\n }\n\n const label = document.createElement('span');\n label.className = 'dt-table-header-label';\n label.textContent = column.header;\n\n if (this.sortable) {\n const indicator = document.createElement('span');\n indicator.className = 'dt-table-sort-indicator';\n if (this._sortField === column.field) {\n indicator.textContent = this._sortDirection === 'asc' ? '\u25B2' : '\u25BC';\n } else {\n indicator.textContent = '\u2195';\n }\n label.appendChild(indicator);\n }\n\n cell.appendChild(label);\n fragment.appendChild(cell);\n }\n\n this._header.replaceChildren(fragment);\n }\n\n private _renderBody(): void {\n if (this._rows.length === 0 || this._columns.length === 0) {\n this._emptyState.hidden = false;\n this._canvas.replaceChildren();\n this._body.style.height = '140px';\n this._canvas.style.height = '0px';\n return;\n }\n\n this._emptyState.hidden = true;\n this._virtualizer.setCount(this._rows.length);\n this._virtualizer.setScrollTop(Math.max(0, this._scroll.scrollTop - this._header.offsetHeight));\n this._virtualizer.setViewportHeight(\n Math.max(0, this._scroll.clientHeight - this._header.offsetHeight),\n );\n\n const range = this._virtualizer.getRange();\n this._body.style.height = `${Math.max(range.totalHeight, this._scroll.clientHeight - this._header.offsetHeight)}px`;\n this._canvas.style.height = `${range.totalHeight}px`;\n\n const fragment = document.createDocumentFragment();\n for (let index = range.start; index < range.end; index += 1) {\n fragment.appendChild(this._renderRow(index));\n }\n\n this._canvas.replaceChildren(fragment);\n }\n\n private _renderRow(index: number): HTMLElement {\n const row = this._rows[index];\n const rowElement = document.createElement('div');\n rowElement.className = 'dt-table-row dt-table-row--clickable';\n rowElement.style.top = `${this._virtualizer.getOffset(index)}px`;\n rowElement.style.height = `${this.rowHeight}px`;\n rowElement.style.setProperty(\n '--dt-table-columns',\n this._header.style.getPropertyValue('--dt-table-columns'),\n );\n rowElement.addEventListener('click', () => {\n this.dispatchEvent(\n new CustomEvent<DtTableViewRowClickDetail>('dt-row-click', {\n detail: { row, index },\n bubbles: true,\n composed: true,\n }),\n );\n });\n\n const record = ensureRecord(row);\n\n for (const column of this._columns) {\n const cell = document.createElement('div');\n cell.className = 'dt-table-cell';\n cell.dataset.align = column.align;\n\n if (column.template) {\n cell.appendChild(createBoundTemplate(column.template, record));\n } else {\n const value = record[column.field];\n cell.textContent = value === null || value === undefined ? '' : String(value);\n }\n\n rowElement.appendChild(cell);\n }\n\n return rowElement;\n }\n\n private _requestSort(field: string): void {\n if (this._sortField === field) {\n this._sortDirection = this._sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this._sortField = field;\n this._sortDirection = 'asc';\n }\n\n this._renderHeader();\n this.dispatchEvent(\n new CustomEvent<DtTableViewSortDetail>('dt-sort', {\n detail: { field, direction: this._sortDirection },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _toGridColumn(column: DtTableColumnConfig): string {\n const minWidth = /^\\d+$/.test(column.minWidth) ? `${column.minWidth}px` : column.minWidth;\n if (column.width === 'auto') {\n return `minmax(${minWidth}, 1fr)`;\n }\n\n const width = /^\\d+$/.test(column.width) ? `${column.width}px` : column.width;\n return `minmax(${minWidth}, ${width})`;\n }\n}\n", "export default \":host {\\n display: block;\\n min-height: 120px;\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n}\\n\\n.dt-list-view {\\n position: relative;\\n display: block;\\n min-height: inherit;\\n height: 100%;\\n overflow: auto;\\n background: var(--dt-surface);\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n}\\n\\n.dt-list-view::before,\\n.dt-list-view::after {\\n content: '';\\n position: sticky;\\n z-index: 2;\\n width: 8px;\\n height: 8px;\\n pointer-events: none;\\n}\\n\\n.dt-list-view::before {\\n top: 0;\\n left: 0;\\n display: block;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-list-view::after {\\n right: 0;\\n bottom: 0;\\n float: right;\\n border-right: 2px solid var(--dt-accent);\\n border-bottom: 2px solid var(--dt-accent);\\n}\\n\\n.dt-list-spacer {\\n position: relative;\\n min-height: 100%;\\n}\\n\\n.dt-list-items {\\n position: relative;\\n}\\n\\n.dt-list-item {\\n box-sizing: border-box;\\n width: 100%;\\n padding: 12px;\\n color: inherit;\\n}\\n\\n.dt-list-item--interactive {\\n cursor: pointer;\\n}\\n\\n.dt-list-item--interactive:hover {\\n background: var(--dt-surface-hover);\\n}\\n\\n.dt-list-item--selected {\\n background: var(--dt-accent-subtle);\\n}\\n\\n:host([dividers]) .dt-list-item {\\n border-bottom: 1px solid var(--dt-border-subtle);\\n}\\n\\n:host([dividers]) .dt-list-item:last-child {\\n border-bottom: 0;\\n}\\n\\n.dt-list-empty {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n min-height: 120px;\\n padding: 20px;\\n color: var(--dt-text-muted);\\n text-transform: uppercase;\\n letter-spacing: 0.08em;\\n font-size: 0.75rem;\\n}\\n\";", "import listViewCss from './styles/list-view.css?raw';\nimport { createBoundTemplate } from './lib/template-bind';\nimport { DtVirtualizer } from './lib/virtualizer';\n\nexport type DtListViewSelectable = 'none' | 'single' | 'multi';\n\nexport interface DtListViewItemClickDetail<T = unknown> {\n item: T;\n index: number;\n}\n\nexport interface DtListViewSelectionChangeDetail<T = unknown> {\n selected: T[];\n}\n\nexport type DtListViewRenderItem<T = unknown> = (\n item: T,\n container: HTMLElement,\n index: number,\n) => void;\n\nconst DEFAULT_ESTIMATE = 56;\n\nfunction ensureRecord(item: unknown): Record<string, unknown> {\n if (item && typeof item === 'object') {\n return item as Record<string, unknown>;\n }\n return { value: item };\n}\n\n/**\n * `<dt-list-view>` \u2014 virtualized list web component for long collections.\n *\n * Supports two sizing modes:\n * - fixed-height mode via `item-height`\n * - variable-height mode when `item-height` is omitted\n *\n * ## Attributes\n * - `item-height` \u2014 fixed row height in px; omit for measured variable-height rows\n * - `dividers` \u2014 when present, shows dividers between items\n * - `selectable` \u2014 selection mode: `none`, `single`, or `multi`\n * - `empty-text` \u2014 text shown when the list has no items\n *\n * ## Properties\n * - `items` \u2014 array of item objects to render\n * - `renderItem` \u2014 optional custom renderer `(item, container, index) => void`\n * - `selectedItems` \u2014 readonly array of currently selected item objects\n *\n * ## Template binding\n * When using a child `<template>`, bindings are applied as follows:\n * - `data-field=\"title\"` sets `textContent` from `item.title`\n * - `data-field-variant=\"statusVariant\"` sets the `variant` attribute from `item.statusVariant`\n *\n * ## Events\n * - `dt-item-click` \u2014 fired when an item is clicked; `detail` contains `{ item, index }`\n * - `dt-selection-change` \u2014 fired when selection changes; `detail.selected` is the selected items array\n *\n * ## Usage\n * ```html\n * <dt-list-view id=\"tasks\" item-height=\"72\" dividers selectable=\"single\">\n * <template>\n * <dt-stack gap=\"8\">\n * <dt-stack direction=\"row\" align=\"center\" gap=\"8\">\n * <strong data-field=\"title\"></strong>\n * <dt-badge data-field=\"status\" data-field-variant=\"statusVariant\"></dt-badge>\n * </dt-stack>\n * <span class=\"text-muted\" data-field=\"summary\"></span>\n * </dt-stack>\n * </template>\n * </dt-list-view>\n * <script>\n * const list = document.getElementById('tasks');\n * list.items = [\n * { title: 'Review report', status: 'Queued', statusVariant: 'warning', summary: 'Waiting on CPU budget' },\n * { title: 'Ship release', status: 'Done', statusVariant: 'success', summary: 'Published 4 minutes ago' },\n * ];\n * </script>\n * ```\n */\nexport class DtListView extends HTMLElement {\n private _items: unknown[] = [];\n private _selectedIndices = new Set<number>();\n private _renderItem: DtListViewRenderItem | null = null;\n private readonly _virtualizer = new DtVirtualizer({\n estimateSize: DEFAULT_ESTIMATE,\n overscan: 5,\n });\n private readonly _viewport: HTMLDivElement;\n private readonly _spacer: HTMLDivElement;\n private readonly _itemsLayer: HTMLDivElement;\n private readonly _emptyState: HTMLDivElement;\n private _resizeObserver: ResizeObserver | null = null;\n private _itemResizeObserver: ResizeObserver | null = null;\n\n static get observedAttributes(): string[] {\n return ['item-height', 'dividers', 'selectable', 'empty-text'];\n }\n\n get items(): unknown[] {\n return this._items;\n }\n\n set items(value: unknown[]) {\n this._items = Array.isArray(value) ? value : [];\n this._selectedIndices = new Set(\n [...this._selectedIndices].filter((index) => index < this._items.length),\n );\n this._virtualizer.setCount(this._items.length);\n this._syncSizingMode(true);\n this._render();\n }\n\n get selectedItems(): unknown[] {\n return [...this._selectedIndices].sort((a, b) => a - b).map((index) => this._items[index]);\n }\n\n get renderItem(): DtListViewRenderItem | null {\n return this._renderItem;\n }\n\n set renderItem(value: DtListViewRenderItem | null) {\n this._renderItem = typeof value === 'function' ? value : null;\n this._render();\n }\n\n get itemHeight(): number | null {\n const raw = this.getAttribute('item-height');\n if (!raw) {\n return null;\n }\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n }\n\n set itemHeight(value: number | null) {\n if (value === null || value <= 0) {\n this.removeAttribute('item-height');\n return;\n }\n this.setAttribute('item-height', String(value));\n }\n\n get selectable(): DtListViewSelectable {\n const value = this.getAttribute('selectable');\n if (value === 'single' || value === 'multi') {\n return value;\n }\n return 'none';\n }\n\n set selectable(value: DtListViewSelectable) {\n this.setAttribute('selectable', value);\n }\n\n get emptyText(): string {\n return this.getAttribute('empty-text') ?? 'No items';\n }\n\n set emptyText(value: string) {\n this.setAttribute('empty-text', value);\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = listViewCss;\n shadow.appendChild(style);\n\n this._viewport = document.createElement('div');\n this._viewport.className = 'dt-list-view';\n this._viewport.addEventListener('scroll', this._onScroll, { passive: true });\n\n this._spacer = document.createElement('div');\n this._spacer.className = 'dt-list-spacer';\n\n this._itemsLayer = document.createElement('div');\n this._itemsLayer.className = 'dt-list-items';\n\n this._emptyState = document.createElement('div');\n this._emptyState.className = 'dt-list-empty';\n\n this._spacer.append(this._itemsLayer, this._emptyState);\n this._viewport.appendChild(this._spacer);\n shadow.appendChild(this._viewport);\n }\n\n connectedCallback(): void {\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.target === this._viewport) {\n this._virtualizer.setViewportHeight(entry.contentRect.height);\n this._render();\n }\n }\n });\n this._resizeObserver.observe(this._viewport);\n\n this._itemResizeObserver = new ResizeObserver((entries) => {\n let adjustment = 0;\n for (const entry of entries) {\n const target = entry.target as HTMLElement;\n const index = Number(target.dataset.index);\n if (!Number.isFinite(index)) {\n continue;\n }\n adjustment += this._virtualizer.measure(index, entry.contentRect.height);\n }\n\n if (adjustment !== 0) {\n this._viewport.scrollTop += adjustment;\n }\n\n if (entries.length > 0) {\n this._render();\n }\n });\n\n this._virtualizer.setCount(this._items.length);\n this._virtualizer.setViewportHeight(this._viewport.clientHeight);\n this._syncSizingMode(false);\n this._render();\n }\n\n disconnectedCallback(): void {\n this._viewport.removeEventListener('scroll', this._onScroll);\n this._resizeObserver?.disconnect();\n this._itemResizeObserver?.disconnect();\n this._resizeObserver = null;\n this._itemResizeObserver = null;\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'item-height') {\n this._syncSizingMode(true);\n }\n\n if (name === 'selectable' && this.selectable === 'none' && this._selectedIndices.size > 0) {\n this._selectedIndices.clear();\n this._emitSelectionChange();\n }\n\n this._render();\n }\n\n private _onScroll = (): void => {\n this._virtualizer.setScrollTop(this._viewport.scrollTop);\n this._render();\n };\n\n private _syncSizingMode(resetMeasurements: boolean): void {\n const fixedHeight = this.itemHeight;\n this._virtualizer.setFixedSize(fixedHeight);\n this._virtualizer.setEstimateSize(fixedHeight ?? DEFAULT_ESTIMATE);\n if (resetMeasurements) {\n this._virtualizer.resetMeasurements();\n }\n }\n\n private _render(): void {\n if (!this.isConnected) {\n return;\n }\n\n this._emptyState.textContent = this.emptyText;\n this._emptyState.hidden = this._items.length > 0;\n\n if (this._items.length === 0) {\n this._itemsLayer.replaceChildren();\n this._spacer.style.height = '100%';\n return;\n }\n\n this._virtualizer.setScrollTop(this._viewport.scrollTop);\n this._virtualizer.setViewportHeight(this._viewport.clientHeight);\n this._virtualizer.setCount(this._items.length);\n\n const range = this._virtualizer.getRange();\n this._spacer.style.height = `${Math.max(range.totalHeight, this._viewport.clientHeight)}px`;\n this._itemsLayer.style.transform = `translateY(${range.paddingTop}px)`;\n\n const fragment = document.createDocumentFragment();\n for (let index = range.start; index < range.end; index += 1) {\n fragment.appendChild(this._renderVisibleItem(index));\n }\n\n this._itemsLayer.replaceChildren(fragment);\n }\n\n private _renderVisibleItem(index: number): HTMLElement {\n const item = this._items[index];\n const itemElement = document.createElement('div');\n itemElement.className = 'dt-list-item';\n itemElement.dataset.index = String(index);\n\n if (this.selectable !== 'none') {\n itemElement.classList.add('dt-list-item--interactive');\n itemElement.setAttribute('role', 'option');\n itemElement.setAttribute('aria-selected', String(this._selectedIndices.has(index)));\n itemElement.tabIndex = 0;\n }\n\n if (this._selectedIndices.has(index)) {\n itemElement.classList.add('dt-list-item--selected');\n }\n\n if (this.itemHeight !== null) {\n itemElement.style.minHeight = `${this.itemHeight}px`;\n }\n\n if (this._renderItem) {\n this._renderItem(item, itemElement, index);\n } else {\n const template = this._getTemplate();\n if (template) {\n itemElement.appendChild(createBoundTemplate(template, ensureRecord(item)));\n } else {\n itemElement.textContent = String(item ?? '');\n }\n }\n\n itemElement.addEventListener('click', () => this._handleItemClick(index));\n itemElement.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this._handleItemClick(index);\n }\n });\n\n if (this.itemHeight === null) {\n this._itemResizeObserver?.observe(itemElement);\n }\n\n return itemElement;\n }\n\n private _handleItemClick(index: number): void {\n const item = this._items[index];\n const selectable = this.selectable;\n\n if (selectable === 'single') {\n this._selectedIndices = new Set([index]);\n this._emitSelectionChange();\n this._render();\n } else if (selectable === 'multi') {\n if (this._selectedIndices.has(index)) {\n this._selectedIndices.delete(index);\n } else {\n this._selectedIndices.add(index);\n }\n this._emitSelectionChange();\n this._render();\n }\n\n this.dispatchEvent(\n new CustomEvent<DtListViewItemClickDetail>('dt-item-click', {\n detail: { item, index },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _emitSelectionChange(): void {\n this.dispatchEvent(\n new CustomEvent<DtListViewSelectionChangeDetail>('dt-selection-change', {\n detail: { selected: this.selectedItems },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _getTemplate(): HTMLTemplateElement | null {\n for (const child of Array.from(this.children)) {\n if (child instanceof HTMLTemplateElement) {\n return child;\n }\n }\n return null;\n }\n}\n", "export default \":host {\\n display: block;\\n min-height: 220px;\\n color: var(--dt-text);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n}\\n\\n.dt-chart {\\n position: relative;\\n display: block;\\n min-height: inherit;\\n height: 100%;\\n overflow: hidden;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n background:\\n radial-gradient(\\n circle at top left,\\n color-mix(in srgb, var(--dt-accent) 16%, transparent),\\n transparent 42%\\n ),\\n linear-gradient(\\n 180deg,\\n color-mix(in srgb, var(--dt-surface) 90%, var(--dt-accent) 10%),\\n var(--dt-surface)\\n );\\n}\\n\\n.dt-chart::before,\\n.dt-chart::after {\\n content: '';\\n position: absolute;\\n z-index: 3;\\n width: 8px;\\n height: 8px;\\n pointer-events: none;\\n}\\n\\n.dt-chart::before {\\n top: -1px;\\n left: -1px;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-chart::after {\\n right: -1px;\\n bottom: -1px;\\n border-right: 2px solid var(--dt-accent);\\n border-bottom: 2px solid var(--dt-accent);\\n}\\n\\n.dt-chart__canvas {\\n position: relative;\\n z-index: 1;\\n display: block;\\n width: 100%;\\n height: 100%;\\n}\\n\\n.dt-chart__status {\\n position: absolute;\\n inset: 0;\\n z-index: 2;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 20px;\\n color: var(--dt-text-muted);\\n font-size: 0.75rem;\\n letter-spacing: 0.08em;\\n text-align: center;\\n text-transform: uppercase;\\n background: color-mix(in srgb, var(--dt-surface) 72%, transparent);\\n}\\n\\n.dt-chart__status[hidden] {\\n display: none;\\n}\\n\";", "export interface DtChartRuntime {\n Chart: typeof import('chart.js').Chart;\n}\n\ndeclare global {\n interface Window {\n __DtChart?: DtChartRuntime;\n }\n}\n\nlet loadPromise: Promise<DtChartRuntime> | null = null;\n\nexport function loadChartJs(): Promise<DtChartRuntime> {\n if (window.__DtChart) {\n return Promise.resolve(window.__DtChart);\n }\n\n if (loadPromise) {\n return loadPromise;\n }\n\n loadPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = '/api/ui/chart.umd.js';\n script.async = true;\n script.dataset.dtChart = 'true';\n script.onload = () => {\n if (window.__DtChart) {\n resolve(window.__DtChart);\n return;\n }\n\n reject(new Error('Chart runtime loaded without a __DtChart export.'));\n };\n script.onerror = () => reject(new Error('Failed to load the Chart.js runtime bundle.'));\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n", "import chartCss from './styles/chart.css?raw';\nimport { loadChartJs } from './lib/chart-loader';\nimport type { DtChartRuntime } from './lib/chart-loader';\n\ntype DtChartLegend = 'top' | 'bottom' | 'left' | 'right' | 'none';\ntype DtChartType = 'bar' | 'line' | 'area' | 'pie' | 'doughnut' | 'radar' | 'scatter' | 'bubble';\ntype DtChartCoreType = Exclude<DtChartType, 'area'>;\n\nexport interface DtChartDatasetInput {\n label?: string;\n data: Array<number | { x: number; y: number } | { x: number; y: number; r: number }>;\n color?: string;\n}\n\nexport interface DtChartDataInput {\n labels?: string[];\n datasets: DtChartDatasetInput[];\n}\n\nexport interface DtChartClickDetail {\n label: string | null;\n datasetIndex: number;\n index: number;\n value: unknown;\n}\n\ninterface HslColor {\n h: number;\n s: number;\n l: number;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction parseCsv(value: string | null): string[] {\n if (!value) {\n return [];\n }\n\n return value\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction parseColorToHsl(value: string): HslColor | null {\n const hex = value.trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (hex) {\n const raw = hex[1];\n const normalized =\n raw.length === 3\n ? raw\n .split('')\n .map((char) => `${char}${char}`)\n .join('')\n : raw;\n const r = parseInt(normalized.slice(0, 2), 16) / 255;\n const g = parseInt(normalized.slice(2, 4), 16) / 255;\n const b = parseInt(normalized.slice(4, 6), 16) / 255;\n return rgbToHsl(r, g, b);\n }\n\n const rgb = value\n .trim()\n .match(\n /^rgba?\\((\\d+(?:\\.\\d+)?)[,\\s]+(\\d+(?:\\.\\d+)?)[,\\s]+(\\d+(?:\\.\\d+)?)(?:[,/\\s]+[\\d.]+)?\\)$/i,\n );\n if (rgb) {\n return rgbToHsl(Number(rgb[1]) / 255, Number(rgb[2]) / 255, Number(rgb[3]) / 255);\n }\n\n const hsl = value\n .trim()\n .match(/^hsla?\\(([-\\d.]+)(?:deg)?[,\\s]+([\\d.]+)%[,\\s]+([\\d.]+)%(?:[,/\\s]+[\\d.]+)?\\)$/i);\n if (hsl) {\n return {\n h: ((Number(hsl[1]) % 360) + 360) % 360,\n s: clamp(Number(hsl[2]), 0, 100),\n l: clamp(Number(hsl[3]), 0, 100),\n };\n }\n\n return null;\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): HslColor {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n let h = 0;\n const l = (max + min) / 2;\n const s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));\n\n if (delta !== 0) {\n switch (max) {\n case r:\n h = 60 * (((g - b) / delta) % 6);\n break;\n case g:\n h = 60 * ((b - r) / delta + 2);\n break;\n default:\n h = 60 * ((r - g) / delta + 4);\n break;\n }\n }\n\n return {\n h: (h + 360) % 360,\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\nfunction hslString(color: HslColor, alpha = 1): string {\n return `hsla(${Math.round(color.h)} ${Math.round(color.s)}% ${Math.round(color.l)}% / ${alpha})`;\n}\n\nfunction getPalette(accent: string): HslColor[] {\n const base = parseColorToHsl(accent) ?? { h: 185, s: 88, l: 56 };\n const offsets = [0, 32, 68, 118, 164, 212, 258, 304];\n return offsets.map((offset, index) => ({\n h: (base.h + offset) % 360,\n s: clamp(base.s - index * 2, 55, 90),\n l: clamp(base.l + (index % 2 === 0 ? 0 : 6) - index, 38, 66),\n }));\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction deepMerge<T>(base: T, override: unknown): T {\n if (!isPlainObject(base) || !isPlainObject(override)) {\n return (override as T) ?? base;\n }\n\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const current = result[key];\n result[key] =\n isPlainObject(current) && isPlainObject(value) ? deepMerge(current, value) : value;\n }\n return result as T;\n}\n\nfunction normalizeLegend(value: string | null): DtChartLegend {\n if (value === 'top' || value === 'bottom' || value === 'left' || value === 'right') {\n return value;\n }\n return 'none';\n}\n\nfunction normalizeType(value: string | null): DtChartType {\n if (\n value === 'bar' ||\n value === 'line' ||\n value === 'area' ||\n value === 'pie' ||\n value === 'doughnut' ||\n value === 'radar' ||\n value === 'scatter' ||\n value === 'bubble'\n ) {\n return value;\n }\n return 'bar';\n}\n\nfunction isCartesianType(type: DtChartType): boolean {\n return (\n type === 'bar' || type === 'line' || type === 'area' || type === 'scatter' || type === 'bubble'\n );\n}\n\nfunction formatLabels(value: string[]): string[] {\n return value.map((item) => item.trim()).filter(Boolean);\n}\n\n/**\n * `<dt-chart>` \u2014 lazy-loaded Chart.js wrapper.\n *\n * Set the `.data` JS property to provide chart data. This is the only supported\n * method for filling data into the chart.\n */\nexport class DtChart extends HTMLElement {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _status: HTMLDivElement;\n private _runtime: DtChartRuntime | null = null;\n private _loadPromise: Promise<DtChartRuntime> | null = null;\n private _chart: import('chart.js').Chart | null = null;\n private _renderedType: DtChartCoreType | null = null;\n private _dataInput: DtChartDataInput | null = null;\n private _optionsOverride: Record<string, unknown> | null = null;\n private _syncFrame = 0;\n\n static get observedAttributes(): string[] {\n return ['type', 'legend', 'stacked', 'labels'];\n }\n\n get type(): DtChartType {\n return normalizeType(this.getAttribute('type'));\n }\n\n set type(value: DtChartType) {\n this.setAttribute('type', value);\n }\n\n get legend(): DtChartLegend {\n return normalizeLegend(this.getAttribute('legend'));\n }\n\n set legend(value: DtChartLegend) {\n this.setAttribute('legend', value);\n }\n\n get stacked(): boolean {\n return this.hasAttribute('stacked');\n }\n\n set stacked(value: boolean) {\n this.toggleAttribute('stacked', value);\n }\n\n get labels(): string[] {\n return formatLabels(parseCsv(this.getAttribute('labels')));\n }\n\n set labels(value: string[]) {\n this.setAttribute('labels', value.join(','));\n }\n\n get data(): DtChartDataInput | null {\n return this._dataInput;\n }\n\n set data(value: DtChartDataInput | null) {\n this._dataInput = value ? structuredClone(value) : null;\n this._scheduleSync();\n }\n\n get options(): Record<string, unknown> | null {\n return this._optionsOverride;\n }\n\n set options(value: Record<string, unknown> | null) {\n this._optionsOverride = value ? structuredClone(value) : null;\n void this._renderChart();\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = chartCss;\n shadow.appendChild(style);\n\n const root = document.createElement('div');\n root.className = 'dt-chart';\n\n this._canvas = document.createElement('canvas');\n this._canvas.className = 'dt-chart__canvas';\n\n this._status = document.createElement('div');\n this._status.className = 'dt-chart__status';\n this._status.textContent = 'Loading chart';\n\n root.append(this._canvas, this._status);\n shadow.appendChild(root);\n }\n\n connectedCallback(): void {\n this._canvas.addEventListener('click', this._handleCanvasClick);\n void this._ensureRuntime().then(() => this._renderChart());\n this._scheduleSync();\n }\n\n disconnectedCallback(): void {\n this._canvas.removeEventListener('click', this._handleCanvasClick);\n if (this._syncFrame !== 0) {\n cancelAnimationFrame(this._syncFrame);\n this._syncFrame = 0;\n }\n this._chart?.destroy();\n this._chart = null;\n this._renderedType = null;\n }\n\n attributeChangedCallback(): void {\n this._scheduleSync();\n }\n\n private _handleCanvasClick = (event: Event): void => {\n if (!this._chart) {\n return;\n }\n\n const points = this._chart.getElementsAtEventForMode(\n event as unknown as MouseEvent,\n 'nearest',\n { intersect: true },\n true,\n );\n const point = points[0];\n if (!point) {\n return;\n }\n\n const label = Array.isArray(this._chart.data.labels)\n ? ((this._chart.data.labels[point.index] as string | undefined) ?? null)\n : null;\n const dataset = this._chart.data.datasets[point.datasetIndex];\n const value = Array.isArray(dataset?.data) ? dataset.data[point.index] : undefined;\n\n this.dispatchEvent(\n new CustomEvent<DtChartClickDetail>('dt-chart-click', {\n bubbles: true,\n composed: true,\n detail: {\n label,\n datasetIndex: point.datasetIndex,\n index: point.index,\n value,\n },\n }),\n );\n };\n\n private _scheduleSync(): void {\n if (this._syncFrame !== 0) {\n return;\n }\n\n this._syncFrame = requestAnimationFrame(() => {\n this._syncFrame = 0;\n this._syncFromCurrentSource();\n });\n }\n\n private _syncFromCurrentSource(): void {\n void this._renderChart();\n }\n\n private async _ensureRuntime(): Promise<DtChartRuntime> {\n if (this._runtime) {\n return this._runtime;\n }\n\n if (!this._loadPromise) {\n this._loadPromise = loadChartJs().then((runtime) => {\n this._runtime = runtime;\n return runtime;\n });\n }\n\n return this._loadPromise;\n }\n\n private async _renderChart(): Promise<void> {\n const data = this._dataInput;\n if (!data) {\n this._setStatus('Waiting for data');\n return;\n }\n\n const runtime = await this._ensureRuntime();\n const config = this._buildConfig(runtime, data);\n const nextType = config.type as DtChartCoreType;\n\n if (!this._chart || this._renderedType !== nextType) {\n this._chart?.destroy();\n this._chart = new runtime.Chart(this._canvas, config as never);\n this._renderedType = nextType;\n } else {\n this._chart.data = config.data as never;\n this._chart.options = config.options as never;\n this._chart.update();\n }\n\n this._setStatus(data.datasets.length > 0 ? null : 'Waiting for data');\n }\n\n private _buildConfig(_runtime: DtChartRuntime, data: DtChartDataInput) {\n const computed = getComputedStyle(this);\n const accent = computed.getPropertyValue('--dt-accent').trim() || '#42d4ff';\n const text = computed.getPropertyValue('--dt-text').trim() || '#d6ebff';\n const muted = computed.getPropertyValue('--dt-text-muted').trim() || '#7b93a6';\n const border = computed.getPropertyValue('--dt-border').trim() || 'rgba(123, 147, 166, 0.3)';\n const font =\n computed.getPropertyValue('--font-mono').trim() ||\n \"'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, monospace\";\n const palette = getPalette(accent);\n const normalizedType = this.type === 'area' ? 'line' : this.type;\n const chartData = {\n labels: data.labels ?? this.labels,\n datasets: data.datasets.map((dataset, index) => {\n const tone = palette[index % palette.length];\n const color = dataset.color ?? hslString(tone, 1);\n const baseDataset = {\n label: dataset.label ?? '',\n data: dataset.data,\n backgroundColor:\n normalizedType === 'line' || normalizedType === 'radar' || normalizedType === 'scatter'\n ? hslString(tone, normalizedType === 'scatter' ? 0.95 : 0.24)\n : color,\n borderColor: color,\n pointBackgroundColor: color,\n pointBorderColor: color,\n pointHoverBackgroundColor: color,\n pointRadius: this.type === 'line' || this.type === 'area' ? 3 : 4,\n pointHoverRadius: this.type === 'line' || this.type === 'area' ? 5 : 6,\n borderWidth: normalizedType === 'radar' ? 2 : 2,\n tension: normalizedType === 'line' || this.type === 'area' ? 0.32 : undefined,\n fill: this.type === 'area',\n };\n\n if (normalizedType === 'pie' || normalizedType === 'doughnut') {\n return {\n ...baseDataset,\n backgroundColor: Array.isArray(dataset.data)\n ? dataset.data.map((_, itemIndex) =>\n hslString(palette[itemIndex % palette.length], 0.86),\n )\n : color,\n borderColor: Array.isArray(dataset.data)\n ? dataset.data.map((_, itemIndex) =>\n hslString(palette[itemIndex % palette.length], 1),\n )\n : color,\n borderWidth: 1,\n };\n }\n\n if (normalizedType === 'scatter' || normalizedType === 'bubble') {\n return {\n ...baseDataset,\n showLine: false,\n backgroundColor: hslString(tone, 0.78),\n };\n }\n\n return baseDataset;\n }),\n };\n\n const baseOptions = {\n responsive: true,\n maintainAspectRatio: false,\n animation: {\n duration: 320,\n },\n interaction: {\n mode: 'nearest',\n intersect: true,\n },\n plugins: {\n legend: {\n display: this.legend !== 'none',\n position: this.legend === 'none' ? 'top' : this.legend,\n labels: {\n color: text,\n boxWidth: 12,\n boxHeight: 12,\n padding: 14,\n font: {\n family: font,\n size: 11,\n },\n },\n },\n tooltip: {\n backgroundColor: 'rgba(10, 18, 24, 0.92)',\n borderColor: colorMix(border, accent, 0.35),\n borderWidth: 1,\n titleColor: text,\n bodyColor: text,\n footerColor: muted,\n titleFont: { family: font, size: 11 },\n bodyFont: { family: font, size: 11 },\n padding: 10,\n },\n },\n scales: isCartesianType(this.type)\n ? {\n x: {\n stacked: this.stacked,\n grid: { display: false, color: border },\n border: { color: border },\n ticks: {\n color: muted,\n font: { family: font, size: 11 },\n },\n },\n y: {\n stacked: this.stacked,\n beginAtZero: true,\n grid: { display: false, color: border },\n border: { color: border },\n ticks: {\n color: muted,\n font: { family: font, size: 11 },\n },\n },\n }\n : normalizedType === 'radar'\n ? {\n r: {\n angleLines: { color: border },\n grid: { color: border },\n pointLabels: {\n color: muted,\n font: { family: font, size: 11 },\n },\n ticks: {\n color: muted,\n backdropColor: 'transparent',\n font: { family: font, size: 10 },\n },\n },\n }\n : undefined,\n };\n\n return {\n type: normalizedType,\n data: chartData,\n options: deepMerge(baseOptions, this._optionsOverride ?? {}),\n };\n }\n\n private _setStatus(message: string | null): void {\n if (!message) {\n this._status.hidden = true;\n return;\n }\n\n this._status.hidden = false;\n this._status.textContent = message;\n }\n}\n\nfunction colorMix(primary: string, secondary: string, weight: number): string {\n const first = parseColorToHsl(primary);\n const second = parseColorToHsl(secondary);\n if (!first || !second) {\n return primary;\n }\n\n const ratio = clamp(weight, 0, 1);\n const hueDelta = ((((second.h - first.h) % 360) + 540) % 360) - 180;\n return hslString({\n h: (first.h + hueDelta * ratio + 360) % 360,\n s: first.s + (second.s - first.s) * ratio,\n l: first.l + (second.l - first.l) * ratio,\n });\n}\n", "export default \":host {\\n display: block;\\n color: var(--dt-text);\\n font-family: var(--font-sans, 'Inter', sans-serif);\\n}\\n\\n.dt-markdown {\\n color: inherit;\\n line-height: 1.7;\\n word-break: break-word;\\n}\\n\\n.dt-markdown > :first-child {\\n margin-top: 0;\\n}\\n\\n.dt-markdown > :last-child {\\n margin-bottom: 0;\\n}\\n\\n.dt-markdown :is(h1, h2, h3, h4, h5, h6) {\\n margin: 1.2em 0 0.55em;\\n color: var(--dt-text);\\n font-family: var(--font-sans, 'Inter', sans-serif);\\n line-height: 1.2;\\n}\\n\\n.dt-markdown h1 {\\n color: var(--dt-accent);\\n font-size: 1.6rem;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n}\\n\\n.dt-markdown h2 {\\n font-size: 1.3rem;\\n}\\n\\n.dt-markdown h3 {\\n font-size: 1.1rem;\\n}\\n\\n.dt-markdown p,\\n.dt-markdown ul,\\n.dt-markdown ol,\\n.dt-markdown blockquote,\\n.dt-markdown pre,\\n.dt-markdown table {\\n margin: 0.8em 0;\\n}\\n\\n.dt-markdown ul,\\n.dt-markdown ol {\\n padding-left: 1.4rem;\\n}\\n\\n.dt-markdown li + li {\\n margin-top: 0.28em;\\n}\\n\\n.dt-markdown strong {\\n color: var(--dt-text);\\n}\\n\\n.dt-markdown a,\\n.dt-markdown .dt-md-link {\\n color: var(--dt-accent);\\n text-decoration: none;\\n}\\n\\n.dt-markdown a:hover,\\n.dt-markdown .dt-md-link:hover {\\n text-decoration: underline;\\n}\\n\\n.dt-markdown code {\\n padding: 0.12rem 0.35rem;\\n border-radius: 2px;\\n background: color-mix(in srgb, var(--dt-surface) 88%, var(--dt-accent) 12%);\\n color: var(--dt-accent);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n font-size: 0.92em;\\n}\\n\\n.dt-md-pre {\\n overflow-x: auto;\\n padding: 14px 16px;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--dt-surface) 85%, var(--dt-accent) 15%);\\n}\\n\\n.dt-md-pre code {\\n display: block;\\n padding: 0;\\n background: transparent;\\n color: var(--dt-text);\\n}\\n\\n.dt-md-blockquote {\\n margin: 0.9em 0;\\n padding: 0.15rem 0 0.15rem 1rem;\\n border-left: 3px solid var(--dt-accent);\\n color: var(--dt-text-muted);\\n}\\n\\n.dt-md-table {\\n width: 100%;\\n border-collapse: collapse;\\n border: 1px solid var(--dt-border);\\n background: var(--dt-surface);\\n}\\n\\n.dt-md-table th,\\n.dt-md-table td {\\n padding: 0.6rem 0.8rem;\\n border: 1px solid var(--dt-border-subtle, var(--dt-border));\\n text-align: left;\\n vertical-align: top;\\n}\\n\\n.dt-md-table th {\\n color: var(--dt-accent);\\n background: color-mix(in srgb, var(--dt-surface) 88%, var(--dt-accent) 12%);\\n font-size: 0.75rem;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n}\\n\\n.dt-markdown hr {\\n border: 0;\\n border-top: 1px solid var(--dt-border);\\n}\\n\\n.dt-md-image {\\n display: block;\\n max-width: 100%;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n}\\n\\n.dt-markdown__caret {\\n display: inline-block;\\n margin-left: 0.15rem;\\n color: var(--dt-accent);\\n animation: dt-markdown-caret 0.9s steps(1) infinite;\\n}\\n\\n.dt-markdown__caret[hidden] {\\n display: none;\\n}\\n\\n@keyframes dt-markdown-caret {\\n 0%,\\n 49% {\\n opacity: 1;\\n }\\n\\n 50%,\\n 100% {\\n opacity: 0;\\n }\\n}\\n\";", "export interface DtMarkedRenderOptions {\n unsafeHtml?: boolean;\n}\n\nexport interface DtMarkedRuntime {\n render(markdown: string, options?: DtMarkedRenderOptions): string;\n}\n\ndeclare global {\n interface Window {\n __DtMarked?: DtMarkedRuntime;\n }\n}\n\nlet loadPromise: Promise<DtMarkedRuntime> | null = null;\n\nexport function loadMarked(): Promise<DtMarkedRuntime> {\n if (window.__DtMarked) {\n return Promise.resolve(window.__DtMarked);\n }\n\n if (loadPromise) {\n return loadPromise;\n }\n\n loadPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = '/api/ui/marked.js';\n script.async = true;\n script.dataset.dtMarked = 'true';\n script.onload = () => {\n if (window.__DtMarked) {\n resolve(window.__DtMarked);\n return;\n }\n\n reject(new Error('Marked runtime loaded without a __DtMarked export.'));\n };\n script.onerror = () => reject(new Error('Failed to load the marked runtime bundle.'));\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n", "import markdownCss from './styles/markdown.css?raw';\nimport { loadMarked } from './lib/marked-loader';\nimport type { DtMarkedRuntime } from './lib/marked-loader';\n\nexport interface DtMarkdownLinkClickDetail {\n href: string;\n}\n\nfunction normalizeLineEndings(value: string): string {\n return value.replaceAll('\\r\\n', '\\n');\n}\n\nfunction dedentBlock(value: string): string {\n const lines = normalizeLineEndings(value).split('\\n');\n\n while (lines.length > 0 && lines[0].trim() === '') {\n lines.shift();\n }\n\n while (lines.length > 0 && lines[lines.length - 1].trim() === '') {\n lines.pop();\n }\n\n const indents = lines\n .filter((line) => line.trim() !== '')\n .map((line) => line.match(/^\\s*/)?.[0].length ?? 0);\n const minIndent = indents.length > 0 ? Math.min(...indents) : 0;\n\n if (minIndent === 0) {\n return lines.join('\\n');\n }\n\n return lines.map((line) => line.slice(minIndent)).join('\\n');\n}\n\nfunction closeStreamingBlocks(value: string): string {\n const normalized = normalizeLineEndings(value);\n const fenceCount = (normalized.match(/(^|\\n)(```|~~~)/g) ?? []).length;\n if (fenceCount % 2 === 0) {\n return normalized;\n }\n\n const closingFence = normalized.includes('~~~') && !normalized.includes('```') ? '~~~' : '```';\n return `${normalized}\\n${closingFence}`;\n}\n\n/**\n * `<dt-markdown>` \u2014 themed markdown renderer for LiveApps.\n *\n * Markdown can be provided either inline between the tags or through the JS-only\n * `content` property. When `streaming` is present the component appends a live\n * caret and performs lightweight fence balancing for incomplete code blocks.\n *\n * ## Attributes\n * - `streaming` \u2014 when present, shows a blinking caret for in-progress content\n * - `unsafe-html` \u2014 when present, allows raw HTML in the markdown source\n *\n * ## Properties\n * - `content` \u2014 JS-only markdown source; overrides inline light-DOM text\n * - `streaming` \u2014 boolean reflection of the `streaming` attribute\n *\n * ## Events\n * - `dt-link-click` \u2014 fired with `{ href }` when a rendered link is activated\n */\nexport class DtMarkdown extends HTMLElement {\n private readonly _body: HTMLDivElement;\n private readonly _caret: HTMLSpanElement;\n private _contentOverride: string | null = null;\n private _runtime: DtMarkedRuntime | null = null;\n private _loadPromise: Promise<DtMarkedRuntime> | null = null;\n private _observer: MutationObserver | null = null;\n private _renderFrame = 0;\n\n static get observedAttributes(): string[] {\n return ['streaming', 'unsafe-html'];\n }\n\n get content(): string {\n return this._contentOverride ?? this._readInlineMarkdown();\n }\n\n set content(value: string) {\n this._contentOverride = String(value ?? '');\n this._scheduleRender();\n }\n\n get streaming(): boolean {\n return this.hasAttribute('streaming');\n }\n\n set streaming(value: boolean) {\n this.toggleAttribute('streaming', value);\n }\n\n get unsafeHtml(): boolean {\n return this.hasAttribute('unsafe-html');\n }\n\n set unsafeHtml(value: boolean) {\n this.toggleAttribute('unsafe-html', value);\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = markdownCss;\n shadow.appendChild(style);\n\n this._body = document.createElement('div');\n this._body.className = 'dt-markdown';\n this._body.addEventListener('click', this._onLinkClick);\n\n this._caret = document.createElement('span');\n this._caret.className = 'dt-markdown__caret';\n this._caret.textContent = '\u258C';\n this._caret.hidden = true;\n\n shadow.append(this._body, this._caret);\n }\n\n connectedCallback(): void {\n if (!this._observer) {\n this._observer = new MutationObserver(() => {\n if (this._contentOverride === null) {\n this._scheduleRender();\n }\n });\n\n this._observer.observe(this, {\n childList: true,\n characterData: true,\n subtree: true,\n });\n }\n\n void this._ensureRuntime();\n this._scheduleRender();\n }\n\n disconnectedCallback(): void {\n this._observer?.disconnect();\n this._observer = null;\n if (this._renderFrame !== 0) {\n cancelAnimationFrame(this._renderFrame);\n this._renderFrame = 0;\n }\n }\n\n attributeChangedCallback(): void {\n this._scheduleRender();\n }\n\n private _onLinkClick = (event: Event): void => {\n const path = event.composedPath();\n const anchor = path.find((entry) => entry instanceof HTMLAnchorElement) as\n | HTMLAnchorElement\n | undefined;\n if (!anchor) {\n return;\n }\n\n event.preventDefault();\n this.dispatchEvent(\n new CustomEvent<DtMarkdownLinkClickDetail>('dt-link-click', {\n bubbles: true,\n composed: true,\n detail: { href: anchor.getAttribute('href') ?? '#' },\n }),\n );\n };\n\n private _readInlineMarkdown(): string {\n return dedentBlock(this.textContent ?? '');\n }\n\n private _scheduleRender(): void {\n if (this._renderFrame !== 0) {\n return;\n }\n\n this._renderFrame = requestAnimationFrame(() => {\n this._renderFrame = 0;\n void this._render();\n });\n }\n\n private async _ensureRuntime(): Promise<DtMarkedRuntime> {\n if (this._runtime) {\n return this._runtime;\n }\n\n if (!this._loadPromise) {\n this._loadPromise = loadMarked().then((runtime) => {\n this._runtime = runtime;\n return runtime;\n });\n }\n\n return this._loadPromise;\n }\n\n private async _render(): Promise<void> {\n const runtime = await this._ensureRuntime();\n let markdown = this.content;\n\n if (this.streaming) {\n markdown = closeStreamingBlocks(markdown);\n }\n\n this._body.innerHTML = runtime.render(markdown, {\n unsafeHtml: this.unsafeHtml,\n });\n this._caret.hidden = !this.streaming;\n }\n}\n", "export default \":host {\\n display: block;\\n min-height: 240px;\\n color: var(--dt-text);\\n font-family: var(--font-sans, 'Inter', sans-serif);\\n}\\n\\n.dt-markdown-editor {\\n position: relative;\\n height: 100%;\\n min-height: inherit;\\n overflow: hidden;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n}\\n\\n.dt-markdown-editor::before,\\n.dt-markdown-editor::after {\\n content: '';\\n position: absolute;\\n z-index: 3;\\n width: 8px;\\n height: 8px;\\n pointer-events: none;\\n}\\n\\n.dt-markdown-editor::before {\\n top: -1px;\\n left: -1px;\\n border-top: 2px solid var(--dt-accent);\\n border-left: 2px solid var(--dt-accent);\\n}\\n\\n.dt-markdown-editor::after {\\n right: -1px;\\n bottom: -1px;\\n border-right: 2px solid var(--dt-accent);\\n border-bottom: 2px solid var(--dt-accent);\\n}\\n\\n.dt-markdown-editor__surface {\\n height: 100%;\\n min-height: inherit;\\n}\\n\\n.dt-markdown-editor__content {\\n height: 100%;\\n min-height: inherit;\\n}\\n\\n.dt-markdown-editor__status {\\n position: absolute;\\n inset: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 20px;\\n background: color-mix(in srgb, var(--dt-surface) 84%, transparent);\\n color: var(--dt-text-muted);\\n font-size: 0.75rem;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n}\\n\\n.dt-markdown-editor__status[hidden] {\\n display: none;\\n}\\n\\n.milkdown {\\n --crepe-color-background: transparent;\\n --crepe-color-on-background: var(--dt-text);\\n --crepe-color-surface: var(--dt-surface);\\n --crepe-color-surface-low: color-mix(in srgb, var(--dt-surface) 94%, var(--dt-accent) 6%);\\n --crepe-color-on-surface: var(--dt-text);\\n --crepe-color-on-surface-variant: var(--dt-text-muted);\\n --crepe-color-outline: var(--dt-border);\\n --crepe-color-primary: var(--dt-accent);\\n --crepe-color-secondary: color-mix(in srgb, var(--dt-surface) 84%, var(--dt-accent) 16%);\\n --crepe-color-on-secondary: var(--dt-text);\\n --crepe-color-inverse: var(--dt-text);\\n --crepe-color-on-inverse: var(--dt-surface);\\n --crepe-color-inline-code: var(--dt-accent);\\n --crepe-color-error: var(--dt-danger, #ff6a6a);\\n --crepe-color-hover: var(--dt-surface-hover);\\n --crepe-color-selected: color-mix(in srgb, var(--dt-surface) 82%, var(--dt-accent) 18%);\\n --crepe-color-inline-area: color-mix(in srgb, var(--dt-surface) 90%, var(--dt-accent) 10%);\\n --crepe-font-title: var(--font-sans, 'Inter', sans-serif);\\n --crepe-font-default: var(--font-sans, 'Inter', sans-serif);\\n --crepe-font-code: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n --crepe-shadow-1: 0 0 0 1px color-mix(in srgb, var(--dt-surface) 82%, var(--dt-accent) 18%);\\n --crepe-shadow-2:\\n 0 0 0 1px color-mix(in srgb, var(--dt-surface) 78%, var(--dt-accent) 22%),\\n 0 8px 24px color-mix(in srgb, var(--dt-accent) 12%, transparent);\\n\\n height: 100%;\\n background: transparent;\\n color: var(--dt-text);\\n}\\n\\n.milkdown .ProseMirror.editor {\\n padding: 0px 54px;\\n}\\n\\n.milkdown .ProseMirror.editor h1 {\\n font-size: 36px;\\n}\\n\\n.milkdown .ProseMirror.editor h2 {\\n font-size: 30px;\\n}\\n\\n.milkdown .ProseMirror.editor h3 {\\n font-size: 24px;\\n}\\n\\n.milkdown .ProseMirror.editor h4 {\\n font-size: 20px;\\n}\\n\\n.milkdown .ProseMirror.editor h5 {\\n font-size: 16px;\\n}\\n\\n.milkdown .ProseMirror.editor h6 {\\n font-size: 16px;\\n}\\n\\n.milkdown .editor {\\n min-height: 100%;\\n padding: 16px 18px 20px;\\n outline: none;\\n color: var(--dt-text);\\n font-family: var(--font-sans, 'Inter', sans-serif);\\n font-size: 14px;\\n line-height: 1.7;\\n}\\n\\n.milkdown .editor h1,\\n.milkdown .editor h2,\\n.milkdown .editor h3,\\n.milkdown .editor h4,\\n.milkdown .editor h5,\\n.milkdown .editor h6 {\\n margin: 0.95em 0 0.45em;\\n line-height: 1.2;\\n}\\n\\n.milkdown .editor h1 {\\n color: var(--dt-accent);\\n font-size: 1.6rem;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n}\\n\\n.milkdown .editor h2 {\\n font-size: 1.28rem;\\n}\\n\\n.milkdown .editor h3 {\\n font-size: 1.08rem;\\n}\\n\\n.milkdown .editor code {\\n padding: 2px 5px;\\n border-radius: 2px;\\n background: color-mix(in srgb, var(--dt-surface) 88%, var(--dt-accent) 12%);\\n font-family: var(\\n --font-mono,\\n 'SF Mono',\\n Monaco,\\n 'Cascadia Code',\\n 'Roboto Mono',\\n Consolas,\\n monospace\\n );\\n font-size: 0.9em;\\n}\\n\\n.milkdown .editor pre {\\n overflow-x: auto;\\n margin: 0.9em 0;\\n padding: 12px 14px;\\n border: 1px solid var(--dt-border);\\n border-radius: 2px;\\n background: var(--dt-surface);\\n}\\n\\n.milkdown .editor pre code {\\n padding: 0;\\n background: transparent;\\n}\\n\\n.milkdown .editor blockquote {\\n margin: 0.9em 0;\\n padding-left: 12px;\\n border-left: 3px solid var(--dt-accent);\\n color: var(--dt-text-muted);\\n}\\n\\n.milkdown .editor a {\\n color: var(--dt-accent);\\n text-decoration: none;\\n}\\n\\n.milkdown .editor a:hover {\\n text-decoration: underline;\\n}\\n\\n.milkdown .editor hr {\\n border: 0;\\n border-top: 1px solid var(--dt-border);\\n}\\n\\n.milkdown .editor ul,\\n.milkdown .editor ol {\\n padding-left: 1.5rem;\\n}\\n\\n/* Runtime Milkdown styles are injected after this file, so use scoped CSS\\n variables instead of direct property overrides. */\\n.milkdown .milkdown-list-item-block {\\n --crepe-color-outline: var(--dt-text-secondary);\\n}\\n\\n.milkdown .milkdown-block-handle {\\n --crepe-color-outline: var(--dt-text-muted);\\n}\\n\\n.milkdown .milkdown-block-handle .operation-item:hover {\\n --crepe-color-outline: var(--dt-text-secondary);\\n}\\n\\n.milkdown .milkdown-toolbar {\\n --crepe-color-outline: var(--dt-text-muted);\\n --crepe-color-hover: color-mix(\\n in srgb,\\n var(--dt-surface-hover) 88%,\\n var(--dt-text-secondary) 12%\\n );\\n --crepe-color-selected: color-mix(in srgb, var(--dt-surface-active) 74%, var(--dt-accent) 26%);\\n}\\n\\n.milkdown .milkdown-toolbar .toolbar-item:hover {\\n --crepe-color-outline: var(--dt-text-secondary);\\n}\\n\\n.milkdown .milkdown-toolbar .toolbar-item.active {\\n --crepe-color-primary: var(--dt-accent);\\n}\\n\\n.milkdown .editor img {\\n max-width: 100%;\\n border-radius: 2px;\\n}\\n\\n.milkdown .editor table {\\n width: 100%;\\n border-collapse: collapse;\\n}\\n\\n.milkdown .editor th,\\n.milkdown .editor td {\\n border: 1px solid var(--dt-border);\\n}\\n\";", "export interface DtMilkdownCssEntry {\n name: string;\n css: string;\n}\n\nexport interface DtMilkdownRuntime {\n Crepe: typeof import('@milkdown/crepe').Crepe;\n replaceAll: typeof import('@milkdown/kit/utils').replaceAll;\n cssText: string;\n cssEntries: DtMilkdownCssEntry[];\n}\n\ndeclare global {\n interface Window {\n __DtMilkdown?: DtMilkdownRuntime;\n }\n}\n\nlet loadPromise: Promise<DtMilkdownRuntime> | null = null;\n\nexport function loadMilkdown(): Promise<DtMilkdownRuntime> {\n if (window.__DtMilkdown) {\n return Promise.resolve(window.__DtMilkdown);\n }\n\n if (loadPromise) {\n return loadPromise;\n }\n\n loadPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = '/api/ui/milkdown.umd.js';\n script.async = true;\n script.dataset.dtMilkdown = 'true';\n script.onload = () => {\n if (window.__DtMilkdown) {\n resolve(window.__DtMilkdown);\n return;\n }\n\n reject(new Error('Milkdown runtime loaded without a __DtMilkdown export.'));\n };\n script.onerror = () => reject(new Error('Failed to load the Milkdown runtime bundle.'));\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n", "import markdownEditorCss from './styles/markdown-editor.css?raw';\nimport { loadMilkdown } from './lib/milkdown-loader';\nimport type { DtMilkdownRuntime } from './lib/milkdown-loader';\n\nexport interface DtMarkdownEditorChangeDetail {\n value: string;\n}\n\n/**\n * `<dt-markdown-editor>` \u2014 full WYSIWYG markdown editor powered by Milkdown.\n *\n * The component lazy-loads Milkdown on first use, injects the required editor\n * styles into its shadow root, and exposes a simple `value` property that reads\n * and writes markdown.\n *\n * ## Attributes\n * - `placeholder` \u2014 empty-state hint text\n * - `readonly` \u2014 when present, disables editing\n *\n * ## Properties\n * - `value` \u2014 JS-only markdown value for get/set access\n * - `readonly` \u2014 boolean reflection of the `readonly` attribute\n *\n * ## Events\n * - `dt-change` \u2014 debounced content updates with `{ value }`\n * - `dt-focus` \u2014 fired when the editor gains focus\n * - `dt-blur` \u2014 fired when the editor loses focus\n */\nexport class DtMarkdownEditor extends HTMLElement {\n private readonly _shadow: ShadowRoot;\n private readonly _runtimeStyleAnchor: Comment;\n private readonly _surface: HTMLDivElement;\n private readonly _content: HTMLDivElement;\n private readonly _status: HTMLDivElement;\n private _runtime: DtMilkdownRuntime | null = null;\n private _loadPromise: Promise<DtMilkdownRuntime> | null = null;\n private _editor: import('@milkdown/crepe').Crepe | null = null;\n private _pendingValue = '';\n private _changeTimer: ReturnType<typeof setTimeout> | null = null;\n private _setupToken = 0;\n private _suppressNextChange = false;\n\n static get observedAttributes(): string[] {\n return ['placeholder', 'readonly'];\n }\n\n get placeholder(): string {\n return this.getAttribute('placeholder') ?? '';\n }\n\n set placeholder(value: string) {\n this.setAttribute('placeholder', value);\n }\n\n get readonly(): boolean {\n return this.hasAttribute('readonly');\n }\n\n set readonly(value: boolean) {\n this.toggleAttribute('readonly', value);\n }\n\n get value(): string {\n if (this._editor) {\n this._pendingValue = this._editor.getMarkdown();\n }\n\n return this._pendingValue;\n }\n\n set value(value: string) {\n const nextValue = String(value ?? '');\n this._pendingValue = nextValue;\n\n if (this._editor && this._runtime && this._editor.getMarkdown() !== nextValue) {\n this._suppressNextChange = true;\n this._editor.editor.action(this._runtime.replaceAll(nextValue));\n }\n }\n\n constructor() {\n super();\n const shadow = this.attachShadow({ mode: 'open' });\n this._shadow = shadow;\n\n const style = document.createElement('style');\n style.textContent = markdownEditorCss;\n shadow.appendChild(style);\n\n this._runtimeStyleAnchor = document.createComment('runtime-styles');\n shadow.appendChild(this._runtimeStyleAnchor);\n\n this._surface = document.createElement('div');\n this._surface.className = 'dt-markdown-editor';\n\n this._content = document.createElement('div');\n this._content.className = 'dt-markdown-editor__surface';\n\n const mount = document.createElement('div');\n mount.className = 'dt-markdown-editor__content';\n this._content.appendChild(mount);\n\n this._status = document.createElement('div');\n this._status.className = 'dt-markdown-editor__status';\n this._status.textContent = 'Loading editor';\n\n this._surface.append(this._content, this._status);\n shadow.appendChild(this._surface);\n }\n\n connectedCallback(): void {\n void this._initializeEditor();\n }\n\n disconnectedCallback(): void {\n this._setupToken += 1;\n this._clearChangeTimer();\n void this._destroyEditor();\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'readonly') {\n this._editor?.setReadonly(this.readonly);\n return;\n }\n\n if (name === 'placeholder' && this.isConnected) {\n void this._initializeEditor(true);\n }\n }\n\n private async _ensureRuntime(): Promise<DtMilkdownRuntime> {\n if (this._runtime) {\n return this._runtime;\n }\n\n if (!this._loadPromise) {\n this._loadPromise = loadMilkdown().then((runtime) => {\n this._runtime = runtime;\n const anchor = this._runtimeStyleAnchor;\n for (const entry of runtime.cssEntries) {\n const el = document.createElement('style');\n el.dataset.css = entry.name;\n el.textContent = entry.css;\n anchor.parentNode!.insertBefore(el, anchor.nextSibling);\n }\n return runtime;\n });\n }\n\n return this._loadPromise;\n }\n\n private async _initializeEditor(force = false): Promise<void> {\n const setupToken = ++this._setupToken;\n this._setStatus('Loading editor');\n\n if (force) {\n await this._destroyEditor();\n } else if (this._editor) {\n this._setStatus(null);\n return;\n }\n\n try {\n const runtime = await this._ensureRuntime();\n if (!this.isConnected || setupToken !== this._setupToken) {\n return;\n }\n\n this._content.replaceChildren();\n const mount = document.createElement('div');\n mount.className = 'dt-markdown-editor__content';\n this._content.appendChild(mount);\n\n const editor = new runtime.Crepe({\n root: mount,\n defaultValue: this._pendingValue,\n features: {\n [runtime.Crepe.Feature.CodeMirror]: false,\n [runtime.Crepe.Feature.ImageBlock]: false,\n [runtime.Crepe.Feature.Latex]: false,\n },\n featureConfigs: {\n [runtime.Crepe.Feature.Placeholder]: {\n text: this.placeholder,\n mode: 'doc',\n },\n },\n });\n\n editor.on((listener) => {\n listener.markdownUpdated((_ctx, markdown) => {\n this._pendingValue = markdown;\n if (this._suppressNextChange) {\n this._suppressNextChange = false;\n return;\n }\n this._queueChange(markdown);\n });\n listener.focus(() => {\n this.dispatchEvent(new CustomEvent('dt-focus', { bubbles: true, composed: true }));\n });\n listener.blur(() => {\n this.dispatchEvent(new CustomEvent('dt-blur', { bubbles: true, composed: true }));\n });\n });\n\n await editor.create();\n\n if (!this.isConnected || setupToken !== this._setupToken) {\n await editor.destroy();\n return;\n }\n\n this._editor = editor;\n this._editor.setReadonly(this.readonly);\n this._pendingValue = this._editor.getMarkdown();\n this._setStatus(null);\n } catch {\n if (setupToken === this._setupToken) {\n this._setStatus('Failed to load editor');\n }\n }\n }\n\n private async _destroyEditor(): Promise<void> {\n const editor = this._editor;\n this._editor = null;\n if (!editor) {\n return;\n }\n\n try {\n await editor.destroy();\n } catch {\n // Ignore teardown errors while the host is disconnecting.\n }\n }\n\n private _queueChange(markdown: string): void {\n this._clearChangeTimer();\n this._changeTimer = setTimeout(() => {\n this._changeTimer = null;\n this.dispatchEvent(\n new CustomEvent<DtMarkdownEditorChangeDetail>('dt-change', {\n bubbles: true,\n composed: true,\n detail: { value: markdown },\n }),\n );\n }, 300);\n }\n\n private _clearChangeTimer(): void {\n if (this._changeTimer) {\n clearTimeout(this._changeTimer);\n this._changeTimer = null;\n }\n }\n\n private _setStatus(message: string | null): void {\n if (message) {\n this._status.hidden = false;\n this._status.textContent = message;\n return;\n }\n\n this._status.hidden = true;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["index_exports", "__export", "DtBadge", "DtButton", "DtCard", "DtChart", "DtColumn", "DtDivider", "DtGrid", "DtListView", "DtMarkdown", "DtMarkdownEditor", "DtSelect", "DtStack", "DtStat", "DtTableView", "DtTooltip", "tooltip_default", "CLS", "ARROW_GAP", "styleInjected", "ensureStyles", "style", "tooltip_default", "DtTooltip", "val", "shadow", "name", "_old", "_next", "show", "popup", "trigger", "assigned", "triggerRect", "popupRect", "vw", "vh", "viewportPadding", "actual", "top", "left", "anchorX", "anchorY", "card_default", "CARD_CLS", "DtCard", "val", "shadow", "style", "card_default", "wrapper", "select_menu_default", "select_trigger_default", "TRIGGER_CLS", "LABEL_CLS", "CHEVRON_CLS", "MENU_CLS", "OPTION_CLS", "OPTION_ACTIVE_CLS", "menuStyleInjected", "ensureMenuStyles", "style", "select_menu_default", "DtSelect", "val", "shadow", "select_trigger_default", "btn", "label", "chevron", "name", "labelEl", "selected", "o", "menu", "e", "target", "opt", "item", "prev", "triggerRect", "gap", "minW", "top", "menuHeight", "vh", "vw", "grid_default", "GRID_CLS", "DtGrid", "val", "shadow", "style", "grid_default", "wrapper", "stack_default", "STACK_CLS", "normalizeDirection", "value", "DtStack", "val", "#normalizeAttributes", "name", "shadow", "style", "stack_default", "wrapper", "rawDirection", "normalizedDirection", "stat_default", "STAT_CLS", "DtStat", "val", "shadow", "style", "stat_default", "name", "_oldVal", "_newVal", "trend", "trendValue", "symbol", "badge_default", "BADGE_CLS", "DtBadge", "val", "shadow", "style", "badge_default", "textAttr", "name", "_oldVal", "_newVal", "button_default", "BUTTON_CLS", "DtButton", "val", "shadow", "style", "button_default", "form", "name", "_oldVal", "_newVal", "divider_default", "DIVIDER_CLS", "DtDivider", "val", "shadow", "style", "divider_default", "hr", "table_view_default", "normalizeBoundValue", "value", "bindTemplateFragment", "fragment", "data", "elements", "element", "textField", "attrName", "targetAttr", "fieldName", "boundValue", "createBoundTemplate", "template", "DtVirtualizer", "options", "count", "index", "height", "scrollTop", "size", "normalized", "previous", "boundedIndex", "offset", "visibleCount", "start", "end", "paddingTop", "totalHeight", "paddingBottom", "renderedHeight", "ensureRecord", "row", "normalizeAlign", "value", "DtColumn", "DtTableView", "DtVirtualizer", "raw", "shadow", "style", "table_view_default", "entries", "entry", "headerHeight", "name", "child", "column", "columnsTemplate", "fragment", "cell", "event", "label", "indicator", "range", "index", "rowElement", "record", "createBoundTemplate", "field", "minWidth", "width", "list_view_default", "DEFAULT_ESTIMATE", "ensureRecord", "item", "DtListView", "DtVirtualizer", "value", "index", "a", "b", "raw", "parsed", "shadow", "style", "list_view_default", "entries", "entry", "adjustment", "target", "name", "resetMeasurements", "fixedHeight", "range", "fragment", "itemElement", "template", "createBoundTemplate", "event", "selectable", "child", "chart_default", "loadPromise", "loadChartJs", "resolve", "reject", "script", "clamp", "value", "min", "max", "parseCsv", "part", "parseColorToHsl", "hex", "raw", "normalized", "char", "r", "g", "b", "rgbToHsl", "rgb", "hsl", "delta", "h", "l", "s", "hslString", "color", "alpha", "getPalette", "accent", "base", "offset", "index", "isPlainObject", "deepMerge", "override", "result", "key", "current", "normalizeLegend", "normalizeType", "isCartesianType", "type", "formatLabels", "item", "DtChart", "shadow", "style", "chart_default", "root", "event", "point", "label", "dataset", "loadChartJs", "runtime", "data", "config", "nextType", "_runtime", "computed", "text", "muted", "border", "font", "palette", "normalizedType", "chartData", "tone", "baseDataset", "_", "itemIndex", "baseOptions", "colorMix", "message", "primary", "secondary", "weight", "first", "second", "ratio", "hueDelta", "markdown_default", "loadPromise", "loadMarked", "resolve", "reject", "script", "normalizeLineEndings", "value", "dedentBlock", "lines", "indents", "line", "minIndent", "closeStreamingBlocks", "normalized", "closingFence", "DtMarkdown", "shadow", "style", "markdown_default", "event", "anchor", "entry", "loadMarked", "runtime", "markdown", "markdown_editor_default", "loadPromise", "loadMilkdown", "resolve", "reject", "script", "DtMarkdownEditor", "value", "nextValue", "shadow", "style", "markdown_editor_default", "mount", "name", "loadMilkdown", "runtime", "anchor", "entry", "el", "force", "setupToken", "editor", "listener", "_ctx", "markdown", "message", "DtTooltip", "DtCard", "DtSelect", "DtGrid", "DtStack", "DtStat", "DtBadge", "DtButton", "DtDivider", "DtListView", "DtTableView", "DtColumn", "DtChart", "DtMarkdown", "DtMarkdownEditor"]
|
|
7
7
|
}
|