@hypoth-ui/wc 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/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/button-MKQKTC5Q.js +10 -0
- package/dist/button-MKQKTC5Q.js.map +1 -0
- package/dist/chunk-4HLM6DBG.js +910 -0
- package/dist/chunk-4HLM6DBG.js.map +1 -0
- package/dist/chunk-55ID7LJL.js +3602 -0
- package/dist/chunk-55ID7LJL.js.map +1 -0
- package/dist/chunk-66HFYJD7.js +86 -0
- package/dist/chunk-66HFYJD7.js.map +1 -0
- package/dist/chunk-CZOXIJVS.js +70 -0
- package/dist/chunk-CZOXIJVS.js.map +1 -0
- package/dist/chunk-DHUM4Q5Y.js +495 -0
- package/dist/chunk-DHUM4Q5Y.js.map +1 -0
- package/dist/chunk-DNNI5BDE.js +1842 -0
- package/dist/chunk-DNNI5BDE.js.map +1 -0
- package/dist/chunk-GXKZ6E6K.js +99 -0
- package/dist/chunk-GXKZ6E6K.js.map +1 -0
- package/dist/chunk-H4GJJZ3N.js +51 -0
- package/dist/chunk-H4GJJZ3N.js.map +1 -0
- package/dist/chunk-JMPTFALJ.js +175 -0
- package/dist/chunk-JMPTFALJ.js.map +1 -0
- package/dist/chunk-MYQWCLUJ.js +45 -0
- package/dist/chunk-MYQWCLUJ.js.map +1 -0
- package/dist/chunk-QZSPWT7L.js +183 -0
- package/dist/chunk-QZSPWT7L.js.map +1 -0
- package/dist/chunk-TSKBQCTR.js +5137 -0
- package/dist/chunk-TSKBQCTR.js.map +1 -0
- package/dist/chunk-TXIIUVL3.js +130 -0
- package/dist/chunk-TXIIUVL3.js.map +1 -0
- package/dist/chunk-UM7WRO7W.js +237 -0
- package/dist/chunk-UM7WRO7W.js.map +1 -0
- package/dist/chunk-VPXL4RB3.js +202 -0
- package/dist/chunk-VPXL4RB3.js.map +1 -0
- package/dist/chunk-VX5CKSMN.js +39 -0
- package/dist/chunk-VX5CKSMN.js.map +1 -0
- package/dist/chunk-WQ5BEP3E.js +2845 -0
- package/dist/chunk-WQ5BEP3E.js.map +1 -0
- package/dist/chunk-YDQ434UH.js +60 -0
- package/dist/chunk-YDQ434UH.js.map +1 -0
- package/dist/chunk-ZWV4VI6D.js +153 -0
- package/dist/chunk-ZWV4VI6D.js.map +1 -0
- package/dist/core.d.ts +127 -0
- package/dist/core.js +38 -0
- package/dist/core.js.map +1 -0
- package/dist/data-display.d.ts +872 -0
- package/dist/data-display.js +57 -0
- package/dist/data-display.js.map +1 -0
- package/dist/ds-element-Db0LMfxI.d.ts +43 -0
- package/dist/feedback.d.ts +292 -0
- package/dist/feedback.js +31 -0
- package/dist/feedback.js.map +1 -0
- package/dist/form-controls.d.ts +1713 -0
- package/dist/form-controls.js +63 -0
- package/dist/form-controls.js.map +1 -0
- package/dist/icon-7IZTJ5WT.js +8 -0
- package/dist/icon-7IZTJ5WT.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +423 -0
- package/dist/index.js.map +1 -0
- package/dist/input-LB6UR37A.js +10 -0
- package/dist/input-LB6UR37A.js.map +1 -0
- package/dist/layout.d.ts +504 -0
- package/dist/layout.js +34 -0
- package/dist/layout.js.map +1 -0
- package/dist/link-NHDJ6SFY.js +9 -0
- package/dist/link-NHDJ6SFY.js.map +1 -0
- package/dist/navigation.d.ts +255 -0
- package/dist/navigation.js +111 -0
- package/dist/navigation.js.map +1 -0
- package/dist/overlays.d.ts +1291 -0
- package/dist/overlays.js +106 -0
- package/dist/overlays.js.map +1 -0
- package/dist/primitives.d.ts +230 -0
- package/dist/primitives.js +26 -0
- package/dist/primitives.js.map +1 -0
- package/dist/registry-Bns0t11H.d.ts +233 -0
- package/dist/skeleton-MUdd2029.d.ts +109 -0
- package/dist/spinner-BWaNlc-Y.d.ts +45 -0
- package/dist/spinner-UIYDUVBZ.js +8 -0
- package/dist/spinner-UIYDUVBZ.js.map +1 -0
- package/dist/stepper-CCRwcQOe.d.ts +851 -0
- package/dist/text-MT3S3EMU.js +8 -0
- package/dist/text-MT3S3EMU.js.map +1 -0
- package/dist/visually-hidden-MW2XY4CS.js +8 -0
- package/dist/visually-hidden-MW2XY4CS.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/textarea/textarea.ts","../src/components/checkbox/checkbox.ts","../src/components/switch/switch.ts","../src/components/radio/radio.ts","../src/components/radio/radio-group.ts","../src/components/select/select-content.ts","../src/components/select/select-option.ts","../src/components/select/select-trigger.ts","../src/components/select/select.ts","../src/components/combobox/combobox-content.ts","../src/components/combobox/combobox-input.ts","../src/components/combobox/combobox-option.ts","../src/components/combobox/combobox-tag.ts","../src/components/combobox/combobox.ts","../src/components/slider/slider.ts","../src/components/number-input/number-input.ts","../src/components/file-upload/file-upload.ts","../src/components/time-picker/time-picker.ts","../src/components/pin-input/pin-input.ts","../src/components/date-picker/date-picker-calendar.ts","../src/components/date-picker/date-picker.ts","../src/components/date-picker/date-utils.ts","../src/components/field/label.ts","../src/components/field/field-description.ts","../src/components/field/field-error.ts","../src/components/field/field.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\nimport { devWarn, hasAccessibleLabel, Warnings } from \"../../utils/dev-warnings.js\";\n\nexport type TextareaSize = \"sm\" | \"md\" | \"lg\";\n\n/**\n * A textarea component with optional auto-resize.\n *\n * @element ds-textarea\n * @fires input - Fired when the textarea value changes\n * @fires ds:change - Fired when the textarea value is committed\n *\n * @example\n * ```html\n * <ds-field>\n * <ds-label>Description</ds-label>\n * <ds-textarea placeholder=\"Enter description...\"></ds-textarea>\n * </ds-field>\n * ```\n */\nexport class DsTextarea extends DSElement {\n /** Textarea size */\n @property({ type: String, reflect: true })\n size: TextareaSize = \"md\";\n\n /** Textarea name */\n @property({ type: String, reflect: true })\n name = \"\";\n\n /** Textarea value */\n @property({ type: String })\n value = \"\";\n\n /** Placeholder text */\n @property({ type: String })\n placeholder = \"\";\n\n /** Disabled state */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Read-only state */\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n /** Required state */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /** Error state */\n @property({ type: Boolean, reflect: true })\n error = false;\n\n /** Minimum length */\n @property({ type: Number })\n minlength?: number;\n\n /** Maximum length */\n @property({ type: Number })\n maxlength?: number;\n\n /** Number of visible text rows */\n @property({ type: Number })\n rows = 3;\n\n /** Minimum number of rows (for auto-resize) */\n @property({ type: Number })\n minRows = 3;\n\n /** Maximum number of rows (for auto-resize) */\n @property({ type: Number })\n maxRows?: number;\n\n /** Enable auto-resize behavior */\n @property({ type: Boolean })\n autoResize = true;\n\n /** ARIA labelledby - ID of element that labels this textarea */\n @state()\n private ariaLabelledBy?: string;\n\n /** ARIA describedby - IDs of elements that describe this textarea */\n @state()\n private ariaDescribedBy?: string;\n\n private attributeObserver: MutationObserver | null = null;\n private nativeTextarea: HTMLTextAreaElement | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Observe ARIA attribute changes on the host element\n this.attributeObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === \"attributes\") {\n this.syncAriaAttributes();\n }\n }\n });\n\n this.attributeObserver.observe(this, {\n attributes: true,\n attributeFilter: [\n \"aria-labelledby\",\n \"aria-describedby\",\n \"aria-invalid\",\n \"aria-required\",\n \"aria-disabled\",\n ],\n });\n\n // Initial sync\n this.syncAriaAttributes();\n\n // Dev warning: Check for accessible label after DOM is ready\n requestAnimationFrame(() => {\n if (!hasAccessibleLabel(this)) {\n const field = this.closest(\"ds-field\");\n const hasFieldLabel = field?.querySelector(\"ds-label\") !== null;\n if (!hasFieldLabel) {\n devWarn(Warnings.inputMissingLabel(\"ds-textarea\"));\n }\n }\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.attributeObserver?.disconnect();\n this.attributeObserver = null;\n }\n\n /**\n * Syncs ARIA attributes from the host element to internal state.\n * The render method will apply these to the native textarea.\n */\n private syncAriaAttributes(): void {\n this.ariaLabelledBy = this.getAttribute(\"aria-labelledby\") ?? undefined;\n this.ariaDescribedBy = this.getAttribute(\"aria-describedby\") ?? undefined;\n\n // Sync error state from aria-invalid\n const ariaInvalid = this.getAttribute(\"aria-invalid\");\n if (ariaInvalid === \"true\") {\n this.error = true;\n } else if (ariaInvalid === \"false\") {\n this.error = false;\n }\n\n // Sync required state from aria-required\n const ariaRequired = this.getAttribute(\"aria-required\");\n if (ariaRequired === \"true\") {\n this.required = true;\n }\n\n // Sync disabled state from aria-disabled\n const ariaDisabled = this.getAttribute(\"aria-disabled\");\n if (ariaDisabled === \"true\") {\n this.disabled = true;\n }\n }\n\n private handleInput(event: Event) {\n const textarea = event.target as HTMLTextAreaElement;\n this.value = textarea.value;\n\n // Auto-resize if enabled\n if (this.autoResize) {\n this.adjustHeight(textarea);\n }\n\n // Also emit native input event for compatibility\n this.dispatchEvent(\n new CustomEvent(\"input\", {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private handleChange(event: Event) {\n const textarea = event.target as HTMLTextAreaElement;\n this.value = textarea.value;\n // Emit ds:change event using standard convention\n emitEvent(this, StandardEvents.CHANGE, {\n detail: { value: this.value },\n });\n }\n\n /**\n * Adjusts the textarea height based on content.\n */\n private adjustHeight(textarea: HTMLTextAreaElement): void {\n // Reset height to calculate scrollHeight\n textarea.style.height = \"auto\";\n\n // Calculate line height from computed styles\n const computedStyle = getComputedStyle(textarea);\n const lineHeight = Number.parseFloat(computedStyle.lineHeight) || 20;\n const paddingTop = Number.parseFloat(computedStyle.paddingTop) || 0;\n const paddingBottom = Number.parseFloat(computedStyle.paddingBottom) || 0;\n const borderTop = Number.parseFloat(computedStyle.borderTopWidth) || 0;\n const borderBottom = Number.parseFloat(computedStyle.borderBottomWidth) || 0;\n\n // Calculate min and max heights based on rows\n const minHeight =\n this.minRows * lineHeight + paddingTop + paddingBottom + borderTop + borderBottom;\n const maxHeight = this.maxRows\n ? this.maxRows * lineHeight + paddingTop + paddingBottom + borderTop + borderBottom\n : Number.POSITIVE_INFINITY;\n\n // Set height within bounds\n const scrollHeight = textarea.scrollHeight;\n const newHeight = Math.min(Math.max(scrollHeight, minHeight), maxHeight);\n textarea.style.height = `${newHeight}px`;\n\n // Enable scrolling if maxRows is set and content exceeds it\n textarea.style.overflowY = scrollHeight > maxHeight ? \"auto\" : \"hidden\";\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n // Get reference to native textarea\n if (!this.nativeTextarea) {\n this.nativeTextarea = this.querySelector(\"textarea\");\n }\n\n // Adjust height when value changes and auto-resize is enabled\n if (changedProperties.has(\"value\") && this.autoResize && this.nativeTextarea) {\n this.adjustHeight(this.nativeTextarea);\n }\n }\n\n /**\n * Returns the effective number of rows.\n */\n private getEffectiveRows(): number {\n return Math.max(this.rows, this.minRows);\n }\n\n override render() {\n return html`\n <div class=\"ds-textarea\" part=\"container\" data-size=${this.size}>\n <textarea\n part=\"textarea\"\n class=\"ds-textarea__field\"\n name=${this.name}\n .value=${this.value}\n placeholder=${this.placeholder}\n .rows=${this.getEffectiveRows()}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n aria-invalid=${this.error ? \"true\" : \"false\"}\n aria-labelledby=${ifDefined(this.ariaLabelledBy)}\n aria-describedby=${ifDefined(this.ariaDescribedBy)}\n aria-required=${this.required ? \"true\" : \"false\"}\n minlength=${ifDefined(this.minlength)}\n maxlength=${ifDefined(this.maxlength)}\n @input=${this.handleInput}\n @change=${this.handleChange}\n ></textarea>\n </div>\n `;\n }\n}\n\ndefine(\"ds-textarea\", DsTextarea);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-textarea\": DsTextarea;\n }\n}\n","import { html } from \"lit\";\nimport type { PropertyValues } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { FormAssociatedMixin } from \"../../base/form-associated.js\";\nimport type { ValidationFlags } from \"../../base/form-associated.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Checkbox input with tri-state support and native form participation.\n *\n * Uses ElementInternals for form association - values are submitted with the form\n * and the checkbox participates in constraint validation.\n *\n * @element ds-checkbox\n * @fires ds:change - Fired on state change with { checked, indeterminate }\n * @fires ds:invalid - Fired when customValidation is true and validation fails\n *\n * @slot - Checkbox label\n *\n * @example\n * ```html\n * <form>\n * <ds-checkbox name=\"accept\" required>Accept terms and conditions</ds-checkbox>\n * <button type=\"submit\">Submit</button>\n * </form>\n *\n * <ds-field>\n * <ds-checkbox name=\"newsletter\" custom-validation>Subscribe to newsletter</ds-checkbox>\n * <ds-field-error></ds-field-error>\n * </ds-field>\n * ```\n */\nexport class DsCheckbox extends FormAssociatedMixin(DSElement) {\n /** Checked state */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /** Indeterminate (mixed) state */\n @property({ type: Boolean, reflect: true })\n indeterminate = false;\n\n /** ARIA describedby - IDs of elements that describe this checkbox */\n @state()\n private ariaDescribedBy?: string;\n\n /** Label text captured from slot */\n @state()\n private labelText = \"\";\n\n /** Unique ID for label association */\n @state()\n private labelId = \"\";\n\n /** Default checked state for form reset */\n private _defaultChecked = false;\n\n private attributeObserver: MutationObserver | null = null;\n\n override connectedCallback(): void {\n // Capture label text before Lit renders\n this.labelText = this.textContent?.trim() ?? \"\";\n // Generate unique ID for label\n this.labelId = `checkbox-label-${crypto.randomUUID().slice(0, 8)}`;\n // Store default checked state\n this._defaultChecked = this.checked;\n\n super.connectedCallback();\n\n // Set default value for form association\n if (!this.value) {\n this.value = \"on\";\n }\n\n // Observe ARIA attribute changes on the host element\n this.attributeObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === \"attributes\") {\n this.syncAriaAttributes();\n }\n }\n });\n\n this.attributeObserver.observe(this, {\n attributes: true,\n attributeFilter: [\"aria-describedby\", \"aria-invalid\", \"aria-required\", \"aria-disabled\"],\n });\n\n // Initial sync\n this.syncAriaAttributes();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.attributeObserver?.disconnect();\n this.attributeObserver = null;\n }\n\n /**\n * Syncs ARIA attributes from the host element to internal state.\n */\n private syncAriaAttributes(): void {\n this.ariaDescribedBy = this.getAttribute(\"aria-describedby\") ?? undefined;\n\n // Sync required state from aria-required\n const ariaRequired = this.getAttribute(\"aria-required\");\n if (ariaRequired === \"true\") {\n this.required = true;\n }\n\n // Sync disabled state from aria-disabled\n const ariaDisabled = this.getAttribute(\"aria-disabled\");\n if (ariaDisabled === \"true\") {\n this.disabled = true;\n }\n }\n\n /**\n * Returns the aria-checked value based on state.\n */\n private getAriaChecked(): \"true\" | \"false\" | \"mixed\" {\n if (this.indeterminate) return \"mixed\";\n return this.checked ? \"true\" : \"false\";\n }\n\n /**\n * Toggles the checkbox state.\n */\n private toggle(): void {\n if (this.disabled) return;\n\n // Clear indeterminate on any interaction\n this.indeterminate = false;\n this.checked = !this.checked;\n\n emitEvent(this, StandardEvents.CHANGE, {\n detail: {\n checked: this.checked,\n indeterminate: this.indeterminate,\n },\n });\n }\n\n private handleClick = (event: Event): void => {\n event.preventDefault();\n this.toggle();\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key === \" \") {\n event.preventDefault();\n this.toggle();\n }\n };\n\n // Form association implementation\n\n protected getFormValue(): string | null {\n return this.checked ? this.value : null;\n }\n\n protected getValidationAnchor(): HTMLElement | undefined {\n return this.querySelector(\".ds-checkbox__control\") as HTMLElement | undefined;\n }\n\n protected getValidationFlags(): ValidationFlags {\n if (this.required && !this.checked) {\n return { valueMissing: true };\n }\n return {};\n }\n\n protected getValidationMessage(flags: ValidationFlags): string {\n if (flags.valueMissing) {\n return \"Please check this box to proceed\";\n }\n return \"\";\n }\n\n protected shouldUpdateFormValue(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"checked\");\n }\n\n protected shouldUpdateValidity(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"checked\");\n }\n\n protected onFormReset(): void {\n this.checked = this._defaultChecked;\n this.indeterminate = false;\n }\n\n protected onFormStateRestore(\n state: string | File | FormData | null,\n _mode: \"restore\" | \"autocomplete\"\n ): void {\n if (typeof state === \"string\") {\n this.checked = state === this.value;\n }\n }\n\n override render() {\n return html`\n <div\n class=\"ds-checkbox\"\n part=\"container\"\n @click=${this.handleClick}\n >\n <div\n role=\"checkbox\"\n part=\"control\"\n class=\"ds-checkbox__control\"\n tabindex=${this.disabled ? -1 : 0}\n aria-checked=${this.getAriaChecked()}\n aria-disabled=${this.disabled ? \"true\" : \"false\"}\n aria-required=${this.required ? \"true\" : \"false\"}\n aria-labelledby=${this.labelId}\n aria-describedby=${ifDefined(this.ariaDescribedBy)}\n @keydown=${this.handleKeyDown}\n >\n <span class=\"ds-checkbox__indicator\" part=\"indicator\">\n ${\n this.indeterminate\n ? html`<span class=\"ds-checkbox__indeterminate-icon\">−</span>`\n : this.checked\n ? html`<span class=\"ds-checkbox__check-icon\">✓</span>`\n : null\n }\n </span>\n </div>\n <span id=${this.labelId} class=\"ds-checkbox__label\" part=\"label\">\n ${this.labelText}\n </span>\n </div>\n `;\n }\n}\n\ndefine(\"ds-checkbox\", DsCheckbox);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-checkbox\": DsCheckbox;\n }\n}\n","import { html } from \"lit\";\nimport type { PropertyValues } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { FormAssociatedMixin } from \"../../base/form-associated.js\";\nimport type { ValidationFlags } from \"../../base/form-associated.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Toggle switch for boolean settings with role=\"switch\" semantics and native form participation.\n *\n * Uses ElementInternals for form association - values are submitted with the form\n * and the switch participates in constraint validation.\n *\n * @element ds-switch\n * @fires ds:change - Fired on state change with { checked }\n * @fires ds:invalid - Fired when customValidation is true and validation fails\n *\n * @slot - Switch label\n *\n * @example\n * ```html\n * <form>\n * <ds-switch name=\"notifications\">Enable notifications</ds-switch>\n * <button type=\"submit\">Submit</button>\n * </form>\n *\n * <ds-field>\n * <ds-label>Dark Mode</ds-label>\n * <ds-switch name=\"darkMode\" custom-validation>Enable dark mode</ds-switch>\n * <ds-field-description>Switch between light and dark themes</ds-field-description>\n * <ds-field-error></ds-field-error>\n * </ds-field>\n * ```\n */\nexport class DsSwitch extends FormAssociatedMixin(DSElement) {\n /** Checked (on) state */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /** ARIA describedby - IDs of elements that describe this switch */\n @state()\n private ariaDescribedBy?: string;\n\n /** Label text captured from slot */\n @state()\n private labelText = \"\";\n\n /** Unique ID for label association */\n @state()\n private labelId = \"\";\n\n /** Default checked state for form reset */\n private _defaultChecked = false;\n\n private attributeObserver: MutationObserver | null = null;\n\n override connectedCallback(): void {\n // Capture label text before Lit renders\n this.labelText = this.textContent?.trim() ?? \"\";\n // Generate unique ID for label\n this.labelId = `switch-label-${crypto.randomUUID().slice(0, 8)}`;\n // Store default checked state\n this._defaultChecked = this.checked;\n\n super.connectedCallback();\n\n // Set default value for form association\n if (!this.value) {\n this.value = \"on\";\n }\n\n // Observe ARIA attribute changes on the host element\n this.attributeObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === \"attributes\") {\n this.syncAriaAttributes();\n }\n }\n });\n\n this.attributeObserver.observe(this, {\n attributes: true,\n attributeFilter: [\"aria-describedby\", \"aria-invalid\", \"aria-required\", \"aria-disabled\"],\n });\n\n // Initial sync\n this.syncAriaAttributes();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.attributeObserver?.disconnect();\n this.attributeObserver = null;\n }\n\n /**\n * Syncs ARIA attributes from the host element to internal state.\n */\n private syncAriaAttributes(): void {\n this.ariaDescribedBy = this.getAttribute(\"aria-describedby\") ?? undefined;\n\n // Sync required state from aria-required\n const ariaRequired = this.getAttribute(\"aria-required\");\n if (ariaRequired === \"true\") {\n this.required = true;\n }\n\n // Sync disabled state from aria-disabled\n const ariaDisabled = this.getAttribute(\"aria-disabled\");\n if (ariaDisabled === \"true\") {\n this.disabled = true;\n }\n }\n\n /**\n * Toggles the switch state.\n */\n private toggle(): void {\n if (this.disabled) return;\n\n this.checked = !this.checked;\n\n emitEvent(this, StandardEvents.CHANGE, {\n detail: {\n checked: this.checked,\n },\n });\n }\n\n private handleClick = (event: Event): void => {\n event.preventDefault();\n this.toggle();\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n // Both Space and Enter keys toggle the switch (distinct from checkbox)\n if ((event.key === \" \" || event.key === \"Enter\") && !this.disabled) {\n event.preventDefault();\n this.toggle();\n }\n };\n\n // Form association implementation\n\n protected getFormValue(): string | null {\n return this.checked ? this.value : null;\n }\n\n protected getValidationAnchor(): HTMLElement | undefined {\n return this.querySelector(\".ds-switch__control\") as HTMLElement | undefined;\n }\n\n protected getValidationFlags(): ValidationFlags {\n if (this.required && !this.checked) {\n return { valueMissing: true };\n }\n return {};\n }\n\n protected getValidationMessage(flags: ValidationFlags): string {\n if (flags.valueMissing) {\n return \"Please turn this switch on to proceed\";\n }\n return \"\";\n }\n\n protected shouldUpdateFormValue(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"checked\");\n }\n\n protected shouldUpdateValidity(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"checked\");\n }\n\n protected onFormReset(): void {\n this.checked = this._defaultChecked;\n }\n\n protected onFormStateRestore(\n state: string | File | FormData | null,\n _mode: \"restore\" | \"autocomplete\"\n ): void {\n if (typeof state === \"string\") {\n this.checked = state === this.value;\n }\n }\n\n override render() {\n return html`\n <div\n class=\"ds-switch\"\n part=\"container\"\n @click=${this.handleClick}\n >\n <div\n role=\"switch\"\n part=\"control\"\n class=\"ds-switch__control\"\n tabindex=${this.disabled ? -1 : 0}\n aria-checked=${this.checked ? \"true\" : \"false\"}\n aria-disabled=${this.disabled ? \"true\" : \"false\"}\n aria-required=${this.required ? \"true\" : \"false\"}\n aria-labelledby=${this.labelId}\n aria-describedby=${ifDefined(this.ariaDescribedBy)}\n @keydown=${this.handleKeyDown}\n >\n <span class=\"ds-switch__track\" part=\"track\">\n <span class=\"ds-switch__thumb\" part=\"thumb\"></span>\n </span>\n </div>\n <span id=${this.labelId} class=\"ds-switch__label\" part=\"label\">\n ${this.labelText}\n </span>\n </div>\n `;\n }\n}\n\ndefine(\"ds-switch\", DsSwitch);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-switch\": DsSwitch;\n }\n}\n","import { html } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Individual radio button within a group.\n *\n * @element ds-radio\n *\n * @slot - Radio label\n *\n * @example\n * ```html\n * <ds-radio-group name=\"size\">\n * <ds-radio value=\"sm\">Small</ds-radio>\n * <ds-radio value=\"md\">Medium</ds-radio>\n * <ds-radio value=\"lg\">Large</ds-radio>\n * </ds-radio-group>\n * ```\n */\nexport class DsRadio extends DSElement {\n /** Radio value */\n @property({ type: String, reflect: true })\n value = \"\";\n\n /** Selected state (managed by group) */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /** Disabled state */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Label text captured from slot */\n @state()\n private labelText = \"\";\n\n /** Unique ID for label association */\n @state()\n private labelId = \"\";\n\n /** Whether this radio is focusable (managed by group) */\n @state()\n private _tabIndexValue: number | undefined = undefined;\n\n get tabIndexValue(): number {\n return this._tabIndexValue ?? -1;\n }\n\n override connectedCallback(): void {\n // Capture label text before Lit renders\n this.labelText = this.textContent?.trim() ?? \"\";\n // Generate unique ID for label\n this.labelId = `radio-label-${crypto.randomUUID().slice(0, 8)}`;\n super.connectedCallback();\n }\n\n /**\n * Sets the checked state (called by RadioGroup).\n */\n setChecked(checked: boolean): void {\n this.checked = checked;\n }\n\n /**\n * Sets the tabindex (called by RadioGroup for roving focus).\n */\n setTabIndex(index: number): void {\n this._tabIndexValue = index;\n this.requestUpdate();\n }\n\n /**\n * Focus the control element.\n */\n focusControl(): void {\n const control = this.querySelector(\"[role='radio']\") as HTMLElement | null;\n control?.focus();\n }\n\n private handleClick = (event: Event): void => {\n if (this.disabled) return;\n event.preventDefault();\n\n // Dispatch custom event for parent to handle\n this.dispatchEvent(\n new CustomEvent(\"ds:radio-select\", {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n // Space key selects the radio\n if (event.key === \" \" && !this.disabled) {\n event.preventDefault();\n this.dispatchEvent(\n new CustomEvent(\"ds:radio-select\", {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n })\n );\n }\n };\n\n override render() {\n return html`\n <div\n class=\"ds-radio\"\n part=\"container\"\n @click=${this.handleClick}\n >\n <div\n role=\"radio\"\n part=\"control\"\n class=\"ds-radio__control\"\n .tabIndex=${this.tabIndexValue}\n aria-checked=${this.checked ? \"true\" : \"false\"}\n aria-disabled=${this.disabled ? \"true\" : \"false\"}\n aria-labelledby=${this.labelId}\n @keydown=${this.handleKeyDown}\n >\n <span class=\"ds-radio__indicator\" part=\"indicator\">\n ${this.checked ? html`<span class=\"ds-radio__dot\"></span>` : null}\n </span>\n </div>\n <span id=${this.labelId} class=\"ds-radio__label\" part=\"label\">\n ${this.labelText}\n </span>\n </div>\n `;\n }\n}\n\ndefine(\"ds-radio\", DsRadio);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-radio\": DsRadio;\n }\n}\n","import { type RovingFocus, createRovingFocus } from \"@hypoth-ui/primitives-dom\";\nimport { html } from \"lit\";\nimport type { PropertyValues } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { FormAssociatedMixin } from \"../../base/form-associated.js\";\nimport type { ValidationFlags } from \"../../base/form-associated.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\nimport type { DsRadio } from \"./radio.js\";\n\n// Import radio component\nimport \"./radio.js\";\n\nexport type RadioOrientation = \"horizontal\" | \"vertical\";\n\n/**\n * Container for radio button group with roving tabindex and native form participation.\n *\n * Uses ElementInternals for form association - the selected value is submitted with the form\n * and the group participates in constraint validation.\n *\n * @element ds-radio-group\n * @fires ds:change - Fired when selection changes with { value }\n * @fires ds:invalid - Fired when customValidation is true and validation fails\n *\n * @slot - ds-radio children\n *\n * @example\n * ```html\n * <form>\n * <ds-field>\n * <ds-label>Size</ds-label>\n * <ds-radio-group name=\"size\" required>\n * <ds-radio value=\"sm\">Small</ds-radio>\n * <ds-radio value=\"md\">Medium</ds-radio>\n * <ds-radio value=\"lg\">Large</ds-radio>\n * </ds-radio-group>\n * <ds-field-error></ds-field-error>\n * </ds-field>\n * <button type=\"submit\">Submit</button>\n * </form>\n * ```\n */\nexport class DsRadioGroup extends FormAssociatedMixin(DSElement) {\n /** Layout and navigation axis */\n @property({ type: String, reflect: true })\n orientation: RadioOrientation = \"vertical\";\n\n /** Default value for form reset */\n private _defaultValue = \"\";\n\n private rovingFocus: RovingFocus | null = null;\n private childObserver: MutationObserver | null = null;\n\n override connectedCallback(): void {\n // Store default value for form reset\n this._defaultValue = this.value;\n\n super.connectedCallback();\n\n // Set role on the group\n this.setAttribute(\"role\", \"radiogroup\");\n\n // Observe child changes\n this.childObserver = new MutationObserver(() => {\n this.setupRadios();\n });\n this.childObserver.observe(this, { childList: true, subtree: true });\n\n // Listen for radio selection events\n this.addEventListener(\"ds:radio-select\", this.handleRadioSelect as EventListener);\n\n // Setup after first render\n this.updateComplete.then(() => {\n this.setupRadios();\n this.setupRovingFocus();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.childObserver?.disconnect();\n this.childObserver = null;\n this.rovingFocus?.destroy();\n this.rovingFocus = null;\n this.removeEventListener(\"ds:radio-select\", this.handleRadioSelect as EventListener);\n }\n\n /**\n * Sets up the radio items with correct checked state and disabled state.\n */\n private setupRadios(): void {\n const radios = this.getRadioItems();\n\n radios.forEach((radio) => {\n // Set checked state based on group value\n radio.setChecked(radio.value === this.value);\n\n // Propagate disabled state from group\n if (this.disabled) {\n radio.disabled = true;\n }\n });\n\n // Update roving focus tabindex\n this.updateTabIndices();\n }\n\n /**\n * Updates tabindex values for roving focus.\n */\n private updateTabIndices(): void {\n const radios = this.getRadioItems();\n const selectedIndex = radios.findIndex((r) => r.value === this.value);\n const focusIndex = selectedIndex >= 0 ? selectedIndex : 0;\n\n radios.forEach((radio, index) => {\n radio.setTabIndex(index === focusIndex ? 0 : -1);\n });\n }\n\n /**\n * Sets up roving focus for keyboard navigation.\n */\n private setupRovingFocus(): void {\n this.rovingFocus?.destroy();\n\n const direction = this.orientation === \"horizontal\" ? \"horizontal\" : \"vertical\";\n\n this.rovingFocus = createRovingFocus({\n container: this,\n selector: \"[role='radio']\",\n direction,\n loop: true,\n skipDisabled: true,\n onFocus: (element, _index) => {\n // Find the parent ds-radio and select it (selection follows focus)\n const radio = element.closest(\"ds-radio\") as DsRadio | null;\n if (radio && !radio.disabled && !this.disabled) {\n this.selectValue(radio.value);\n }\n },\n });\n }\n\n /**\n * Gets all radio items in the group.\n */\n private getRadioItems(): DsRadio[] {\n return Array.from(this.querySelectorAll(\"ds-radio\")) as DsRadio[];\n }\n\n /**\n * Handles radio selection from click or keyboard.\n */\n private handleRadioSelect = (event: CustomEvent<{ value: string }>): void => {\n if (this.disabled) return;\n\n const { value } = event.detail;\n this.selectValue(value);\n };\n\n /**\n * Selects a value and updates state.\n */\n private selectValue(value: string): void {\n if (value === this.value) return;\n\n this.value = value;\n this.setupRadios();\n\n emitEvent(this, StandardEvents.CHANGE, {\n detail: { value: this.value },\n });\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"value\")) {\n this.setupRadios();\n }\n\n if (changedProperties.has(\"orientation\")) {\n this.setupRovingFocus();\n }\n\n if (changedProperties.has(\"disabled\")) {\n this.setupRadios();\n }\n }\n\n // Form association implementation\n\n protected getFormValue(): string | null {\n return this.value || null;\n }\n\n protected getValidationAnchor(): HTMLElement | undefined {\n // Use the first radio control as validation anchor\n return this.querySelector(\"ds-radio [role='radio']\") as HTMLElement | undefined;\n }\n\n protected getValidationFlags(): ValidationFlags {\n if (this.required && !this.value) {\n return { valueMissing: true };\n }\n return {};\n }\n\n protected getValidationMessage(flags: ValidationFlags): string {\n if (flags.valueMissing) {\n return \"Please select an option\";\n }\n return \"\";\n }\n\n protected shouldUpdateFormValue(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"value\");\n }\n\n protected shouldUpdateValidity(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"value\");\n }\n\n protected onFormReset(): void {\n this.value = this._defaultValue;\n this.setupRadios();\n }\n\n protected onFormStateRestore(\n state: string | File | FormData | null,\n _mode: \"restore\" | \"autocomplete\"\n ): void {\n if (typeof state === \"string\") {\n this.value = state;\n this.setupRadios();\n }\n }\n\n override render() {\n return html`\n <div\n class=\"ds-radio-group\"\n part=\"container\"\n data-orientation=${this.orientation}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\ndefine(\"ds-radio-group\", DsRadioGroup);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-radio-group\": DsRadioGroup;\n }\n}\n","import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport type SelectContentState = \"open\" | \"closed\";\n\n/**\n * Select content container with role=\"listbox\".\n *\n * @element ds-select-content\n *\n * @slot - Select options (ds-select-option elements)\n *\n * @attr {string} data-state - Animation state (\"open\" or \"closed\")\n * @attr {string} data-placement - Current anchor position placement\n *\n * @example\n * ```html\n * <ds-select>\n * <button slot=\"trigger\">Select fruit</button>\n * <ds-select-content>\n * <ds-select-option value=\"apple\">Apple</ds-select-option>\n * <ds-select-option value=\"banana\">Banana</ds-select-option>\n * </ds-select-content>\n * </ds-select>\n * ```\n */\nexport class DsSelectContent extends DSElement {\n /** Unique ID for ARIA association */\n @property({ type: String, reflect: true })\n override id = \"\";\n\n /** Animation state (open or closed) - set by parent ds-select */\n @property({ type: String, reflect: true, attribute: \"data-state\" })\n dataState: SelectContentState = \"closed\";\n\n /** Optional label for the listbox */\n @property({ type: String })\n label = \"\";\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Generate ID if not set\n if (!this.id) {\n this.id = `select-content-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n // Set ARIA role for listbox\n this.setAttribute(\"role\", \"listbox\");\n\n // Set label if provided\n if (this.label) {\n this.setAttribute(\"aria-label\", this.label);\n }\n\n // Hidden by default (parent select controls visibility)\n this.setAttribute(\"hidden\", \"\");\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"label\")) {\n if (this.label) {\n this.setAttribute(\"aria-label\", this.label);\n } else {\n this.removeAttribute(\"aria-label\");\n }\n }\n }\n\n override render() {\n return html`\n <div class=\"ds-select-content\" part=\"container\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndefine(\"ds-select-content\", DsSelectContent);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-select-content\": DsSelectContent;\n }\n}\n","import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Select option with role=\"option\".\n *\n * @element ds-select-option\n *\n * @slot - Option content (text, icon, etc.)\n *\n * @example\n * ```html\n * <ds-select-option value=\"apple\">Apple</ds-select-option>\n * <ds-select-option value=\"banana\" disabled>Banana</ds-select-option>\n * ```\n */\nexport class DsSelectOption extends DSElement {\n /** Whether the option is disabled */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Value associated with this option */\n @property({ type: String, reflect: true })\n value = \"\";\n\n /** Display label (uses textContent if not specified) */\n @property({ type: String })\n label = \"\";\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Set ARIA role\n this.setAttribute(\"role\", \"option\");\n\n // Set tabIndex for roving focus (will be managed by parent)\n this.tabIndex = -1;\n\n // Generate ID if not set\n if (!this.id) {\n this.id = `select-option-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n // Update aria-disabled\n this.updateAriaDisabled();\n }\n\n /**\n * Gets the display label for this option.\n */\n public getLabel(): string {\n return this.label || this.textContent?.trim() || this.value;\n }\n\n private updateAriaDisabled(): void {\n if (this.disabled) {\n this.setAttribute(\"aria-disabled\", \"true\");\n } else {\n this.removeAttribute(\"aria-disabled\");\n }\n }\n\n /**\n * Sets the selected state of this option.\n */\n public setSelected(selected: boolean): void {\n this.setAttribute(\"aria-selected\", String(selected));\n if (selected) {\n this.setAttribute(\"data-selected\", \"\");\n } else {\n this.removeAttribute(\"data-selected\");\n }\n }\n\n /**\n * Sets the highlighted state of this option.\n */\n public setHighlighted(highlighted: boolean): void {\n if (highlighted) {\n this.setAttribute(\"data-highlighted\", \"\");\n } else {\n this.removeAttribute(\"data-highlighted\");\n }\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"disabled\")) {\n this.updateAriaDisabled();\n }\n }\n\n override render() {\n return html`\n <div class=\"ds-select-option\" part=\"container\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndefine(\"ds-select-option\", DsSelectOption);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-select-option\": DsSelectOption;\n }\n}\n","import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Select trigger button with combobox role.\n *\n * @element ds-select-trigger\n *\n * @slot - Trigger content (button, etc.)\n *\n * @example\n * ```html\n * <ds-select>\n * <ds-select-trigger>\n * <button>Select fruit</button>\n * </ds-select-trigger>\n * <ds-select-content>...</ds-select-content>\n * </ds-select>\n * ```\n */\nexport class DsSelectTrigger extends DSElement {\n /** Whether the parent select is disabled */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Setup ARIA on first slotted element after render\n this.updateComplete.then(() => {\n this.setupTriggerAccessibility();\n });\n }\n\n private setupTriggerAccessibility(): void {\n const trigger = this.querySelector(\"button, [role='button']\") as HTMLElement | null;\n if (trigger) {\n trigger.setAttribute(\"aria-haspopup\", \"listbox\");\n trigger.setAttribute(\"aria-expanded\", \"false\");\n if (this.disabled) {\n trigger.setAttribute(\"aria-disabled\", \"true\");\n }\n }\n }\n\n /**\n * Updates ARIA attributes on the trigger element.\n */\n public updateAria(expanded: boolean, activeDescendantId?: string, controlsId?: string): void {\n const trigger = this.querySelector(\"button, [role='button']\") as HTMLElement | null;\n if (trigger) {\n trigger.setAttribute(\"aria-expanded\", String(expanded));\n if (controlsId) {\n trigger.setAttribute(\"aria-controls\", controlsId);\n }\n if (expanded && activeDescendantId) {\n trigger.setAttribute(\"aria-activedescendant\", activeDescendantId);\n } else {\n trigger.removeAttribute(\"aria-activedescendant\");\n }\n }\n }\n\n /**\n * Gets the actual trigger button element.\n */\n public getTriggerElement(): HTMLElement | null {\n return this.querySelector(\"button, [role='button']\");\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"disabled\")) {\n const trigger = this.querySelector(\"button, [role='button']\") as HTMLElement | null;\n if (trigger) {\n if (this.disabled) {\n trigger.setAttribute(\"aria-disabled\", \"true\");\n trigger.setAttribute(\"disabled\", \"\");\n } else {\n trigger.removeAttribute(\"aria-disabled\");\n trigger.removeAttribute(\"disabled\");\n }\n }\n }\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndefine(\"ds-select-trigger\", DsSelectTrigger);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-select-trigger\": DsSelectTrigger;\n }\n}\n","import {\n type AnchorPosition,\n type DismissableLayer,\n type Option,\n type Placement,\n type Presence,\n type RovingFocus,\n type SelectBehavior,\n type TypeAhead,\n type VirtualizedList,\n createAnchorPosition,\n createDismissableLayer,\n createPresence,\n createRovingFocus,\n createSelectBehavior,\n createTypeAhead,\n prefersReducedMotion,\n} from \"@hypoth-ui/primitives-dom\";\nimport { html, nothing } from \"lit\";\nimport type { PropertyValues } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { FormAssociatedMixin } from \"../../base/form-associated.js\";\nimport type { ValidationFlags } from \"../../base/form-associated.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\n// Import child components to ensure they're registered\nimport type { DsSelectContent } from \"./select-content.js\";\nimport type { DsSelectOption } from \"./select-option.js\";\nimport type { DsSelectTrigger } from \"./select-trigger.js\";\nimport \"./select-content.js\";\nimport \"./select-option.js\";\nimport \"./select-trigger.js\";\nimport \"./select-group.js\";\nimport \"./select-label.js\";\n\n/**\n * Select component with keyboard navigation, type-ahead, and native form participation.\n *\n * Uses ElementInternals for form association - the selected value is submitted with the form\n * and the select participates in constraint validation.\n *\n * Implements WAI-ARIA Listbox pattern with:\n * - Arrow key navigation between options\n * - Type-ahead search to jump to options\n * - Enter/Space/Click to select options\n * - Escape to close\n *\n * @element ds-select\n *\n * @slot trigger - Trigger element (ds-select-trigger with button inside)\n * @slot - Select content (ds-select-content with ds-select-option children)\n *\n * @fires ds:open-change - Fired when open state changes (detail: { open, reason })\n * @fires ds:change - Fired when value changes (detail: { value, label })\n * @fires ds:invalid - Fired when customValidation is true and validation fails\n *\n * @example\n * ```html\n * <form>\n * <ds-select name=\"fruit\" required>\n * <ds-select-trigger slot=\"trigger\">\n * <button>Select fruit</button>\n * </ds-select-trigger>\n * <ds-select-content>\n * <ds-select-option value=\"apple\">Apple</ds-select-option>\n * <ds-select-option value=\"banana\">Banana</ds-select-option>\n * </ds-select-content>\n * </ds-select>\n * <button type=\"submit\">Submit</button>\n * </form>\n * ```\n */\nexport class DsSelect extends FormAssociatedMixin(DSElement) {\n /** Whether the select is open */\n @property({ type: Boolean, reflect: true })\n open = false;\n\n /** Current selected value */\n @property({ type: String, reflect: true })\n value = \"\";\n\n /** Placement relative to trigger */\n @property({ type: String, reflect: true })\n placement: Placement = \"bottom-start\";\n\n /** Offset distance from trigger in pixels */\n @property({ type: Number })\n offset = 4;\n\n /** Whether to flip placement when near viewport edge */\n @property({ type: Boolean })\n flip = true;\n\n /** Whether to animate open/close transitions */\n @property({ type: Boolean })\n animated = true;\n\n /** Whether the select is disabled */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Whether the select is read-only */\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n /** Whether to enable type-ahead search */\n @property({ type: Boolean })\n searchable = true;\n\n /** Whether to show clear button */\n @property({ type: Boolean })\n clearable = false;\n\n /** Enable virtualization for large lists */\n @property({ type: Boolean })\n virtualize = false;\n\n /** Virtualization threshold (default: 100) */\n @property({ type: Number, attribute: \"virtualization-threshold\" })\n virtualizationThreshold = 100;\n\n /** Whether the select is in a loading state (e.g., fetching options) */\n @property({ type: Boolean, reflect: true })\n loading = false;\n\n /** Text to display/announce during loading */\n @property({ type: String, attribute: \"loading-text\" })\n loadingText = \"Loading...\";\n\n /**\n * Data-driven options array. Use this for programmatic option rendering.\n * When provided, options will be rendered from this array instead of slots.\n */\n @property({ attribute: false })\n items: Option<string>[] = [];\n\n /** Visible item IDs for virtualization */\n @state()\n private visibleItemIds = new Set<string>();\n\n /** Default value for form reset */\n private _defaultValue = \"\";\n\n private behavior: SelectBehavior<string> | null = null;\n private anchorPosition: AnchorPosition | null = null;\n private dismissLayer: DismissableLayer | null = null;\n private presence: Presence | null = null;\n private rovingFocus: RovingFocus | null = null;\n private typeAhead: TypeAhead | null = null;\n private virtualizedList: VirtualizedList | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private scrollHandler: (() => void) | null = null;\n private focusFirstOnOpen: \"first\" | \"last\" | \"selected\" | null = null;\n\n override connectedCallback(): void {\n // Store default value for form reset\n this._defaultValue = this.value;\n\n super.connectedCallback();\n\n // Initialize behavior\n this.behavior = createSelectBehavior({\n defaultValue: this.value || null,\n disabled: this.disabled,\n readOnly: this.readonly,\n searchable: this.searchable,\n clearable: this.clearable,\n onValueChange: (value) => {\n this.value = value ?? \"\";\n const option = this.getOptionByValue(value ?? \"\");\n emitEvent(this, StandardEvents.CHANGE, {\n detail: {\n value: value ?? \"\",\n label: option?.getLabel() ?? \"\",\n },\n });\n },\n onOpenChange: (open) => {\n this.open = open;\n emitEvent(this, StandardEvents.OPEN_CHANGE, {\n detail: { open, reason: \"trigger\" },\n });\n },\n });\n\n // Listen for trigger interactions\n this.addEventListener(\"click\", this.handleTriggerClick);\n this.addEventListener(\"keydown\", this.handleKeyDown);\n\n // Setup after first render\n this.updateComplete.then(() => {\n this.setupTriggerAccessibility();\n this.registerOptions();\n this.updateOptionStates();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(\"click\", this.handleTriggerClick);\n this.removeEventListener(\"keydown\", this.handleKeyDown);\n this.cleanup();\n this.behavior?.destroy();\n this.behavior = null;\n }\n\n /**\n * Opens the select.\n */\n public show(): void {\n if (this.open || this.disabled || this.loading) return;\n this.behavior?.open();\n }\n\n /**\n * Closes the select.\n */\n public close(): void {\n if (!this.open) return;\n\n const content = this.querySelector(\"ds-select-content\") as DsSelectContent | null;\n\n // If animated, use presence for exit animation\n if (this.animated && content && !prefersReducedMotion()) {\n // Cleanup dismiss layer so it doesn't re-trigger\n this.dismissLayer?.deactivate();\n this.dismissLayer = null;\n\n // Create presence for exit animation\n this.presence = createPresence({\n onExitComplete: () => {\n this.completeClose();\n },\n });\n this.presence.hide(content);\n } else {\n // No animation - close immediately\n this.cleanup();\n this.behavior?.close();\n\n // Return focus to trigger\n this.getTriggerElement()?.focus();\n }\n }\n\n /**\n * Completes the close after exit animation.\n */\n private completeClose(): void {\n this.cleanup();\n this.behavior?.close();\n\n // Return focus to trigger\n this.getTriggerElement()?.focus();\n }\n\n /**\n * Toggles the select open/closed state.\n */\n public toggle(): void {\n if (this.open) {\n this.close();\n } else {\n this.show();\n }\n }\n\n /**\n * Selects a value programmatically.\n */\n public select(value: string): void {\n if (this.disabled || this.readonly) return;\n this.behavior?.select(value);\n }\n\n /**\n * Clears the selection.\n */\n public clear(): void {\n if (!this.clearable || this.disabled || this.readonly) return;\n this.behavior?.clear();\n this.updateOptionStates();\n }\n\n private getTriggerElement(): HTMLElement | null {\n const trigger = this.querySelector(\"ds-select-trigger\") as DsSelectTrigger | null;\n return trigger?.getTriggerElement() ?? null;\n }\n\n private getOptions(): DsSelectOption[] {\n const content = this.querySelector(\"ds-select-content\");\n if (!content) return [];\n return Array.from(content.querySelectorAll<DsSelectOption>(\"ds-select-option\"));\n }\n\n private getEnabledOptions(): DsSelectOption[] {\n return this.getOptions().filter((opt) => !opt.disabled);\n }\n\n private getOptionByValue(value: string): DsSelectOption | null {\n return this.getOptions().find((opt) => opt.value === value) ?? null;\n }\n\n private registerOptions(): void {\n const options = this.getOptions();\n const items = options.map((opt) => ({\n value: opt.value,\n disabled: opt.disabled,\n }));\n this.behavior?.setItems(items);\n this.behavior?.setOptionCount(options.length);\n }\n\n private updateOptionStates(): void {\n const currentValue = this.behavior?.state.value ?? this.value;\n const highlightedValue = this.behavior?.state.highlightedValue;\n\n for (const option of this.getOptions()) {\n option.setSelected(option.value === currentValue);\n option.setHighlighted(option.value === highlightedValue);\n }\n }\n\n private handleTriggerClick = (event: Event): void => {\n const target = event.target as HTMLElement;\n const trigger = target.closest(\"ds-select-trigger\");\n\n if (trigger && this.contains(trigger)) {\n event.preventDefault();\n if (this.disabled || this.loading) return;\n this.focusFirstOnOpen = this.value ? \"selected\" : \"first\";\n this.toggle();\n }\n\n // Handle option click\n const option = target.closest(\"ds-select-option\") as DsSelectOption | null;\n if (option && this.contains(option) && !option.disabled) {\n event.preventDefault();\n this.selectOption(option);\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n const target = event.target as HTMLElement;\n\n // Handle trigger keys when closed\n if (!this.open) {\n const trigger = target.closest(\"ds-select-trigger\");\n if (trigger && this.contains(trigger)) {\n this.handleTriggerKeyDown(event);\n }\n return;\n }\n\n // Handle content keys when open\n this.handleContentKeyDown(event);\n };\n\n private handleTriggerKeyDown(event: KeyboardEvent): void {\n if (this.disabled || this.loading) return;\n\n switch (event.key) {\n case \"Enter\":\n case \" \":\n event.preventDefault();\n this.focusFirstOnOpen = this.value ? \"selected\" : \"first\";\n this.show();\n break;\n case \"ArrowDown\":\n event.preventDefault();\n this.focusFirstOnOpen = \"first\";\n this.show();\n break;\n case \"ArrowUp\":\n event.preventDefault();\n this.focusFirstOnOpen = \"last\";\n this.show();\n break;\n }\n }\n\n private handleContentKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case \"Enter\":\n case \" \":\n event.preventDefault();\n this.selectHighlighted();\n break;\n case \"Escape\":\n event.preventDefault();\n this.close();\n break;\n case \"ArrowDown\":\n event.preventDefault();\n this.behavior?.highlightNext();\n this.updateOptionStates();\n this.updateTriggerAria();\n break;\n case \"ArrowUp\":\n event.preventDefault();\n this.behavior?.highlightPrev();\n this.updateOptionStates();\n this.updateTriggerAria();\n break;\n case \"Home\":\n event.preventDefault();\n this.behavior?.highlightFirst();\n this.updateOptionStates();\n this.updateTriggerAria();\n break;\n case \"End\":\n event.preventDefault();\n this.behavior?.highlightLast();\n this.updateOptionStates();\n this.updateTriggerAria();\n break;\n case \"Tab\":\n // Close on tab without preventing default\n this.close();\n break;\n }\n }\n\n private selectOption(option: DsSelectOption): void {\n this.behavior?.select(option.value);\n this.updateOptionStates();\n this.close();\n }\n\n private selectHighlighted(): void {\n const highlightedValue = this.behavior?.state.highlightedValue;\n if (highlightedValue) {\n this.behavior?.select(highlightedValue);\n this.updateOptionStates();\n this.close();\n }\n }\n\n private handleDismiss = (): void => {\n this.close();\n };\n\n private setupTriggerAccessibility(): void {\n const trigger = this.querySelector(\"ds-select-trigger\") as DsSelectTrigger | null;\n const content = this.querySelector(\"ds-select-content\") as DsSelectContent | null;\n\n if (trigger && content) {\n trigger.disabled = this.disabled;\n trigger.updateAria(this.open, undefined, content.id);\n }\n\n // Set aria-busy on the trigger element when loading\n this.updateLoadingState();\n }\n\n private updateLoadingState(): void {\n const triggerElement = this.getTriggerElement();\n if (triggerElement) {\n if (this.loading) {\n triggerElement.setAttribute(\"aria-busy\", \"true\");\n } else {\n triggerElement.removeAttribute(\"aria-busy\");\n }\n }\n }\n\n private updateTriggerAria(): void {\n const trigger = this.querySelector(\"ds-select-trigger\") as DsSelectTrigger | null;\n const content = this.querySelector(\"ds-select-content\") as DsSelectContent | null;\n\n if (trigger && content) {\n const highlightedValue = this.behavior?.state.highlightedValue;\n const highlightedOption = highlightedValue ? this.getOptionByValue(highlightedValue) : null;\n trigger.updateAria(this.open, highlightedOption?.id, content.id);\n }\n }\n\n private setupPositioning(): void {\n const trigger = this.getTriggerElement();\n const content = this.querySelector(\"ds-select-content\") as HTMLElement | null;\n\n if (!trigger || !content) return;\n\n // Setup anchor positioning\n this.anchorPosition = createAnchorPosition({\n anchor: trigger,\n floating: content,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n onPositionChange: (pos) => {\n content.setAttribute(\"data-placement\", pos.placement);\n },\n });\n\n // Setup resize observer for repositioning\n this.resizeObserver = new ResizeObserver(() => {\n this.anchorPosition?.update();\n });\n this.resizeObserver.observe(trigger);\n this.resizeObserver.observe(content);\n\n // Setup scroll handler for repositioning\n this.scrollHandler = () => {\n this.anchorPosition?.update();\n };\n window.addEventListener(\"scroll\", this.scrollHandler, { passive: true });\n window.addEventListener(\"resize\", this.scrollHandler, { passive: true });\n }\n\n private setupDismissLayer(): void {\n const content = this.querySelector(\"ds-select-content\") as HTMLElement | null;\n const trigger = this.getTriggerElement();\n\n if (!content) return;\n\n this.dismissLayer = createDismissableLayer({\n container: content,\n excludeElements: trigger ? [trigger] : [],\n onDismiss: this.handleDismiss,\n closeOnEscape: true,\n closeOnOutsideClick: true,\n });\n this.dismissLayer.activate();\n }\n\n private setupRovingFocus(): void {\n const content = this.querySelector(\"ds-select-content\") as HTMLElement | null;\n\n if (!content) return;\n\n this.rovingFocus = createRovingFocus({\n container: content,\n selector: \"ds-select-option:not([disabled])\",\n direction: \"vertical\",\n loop: true,\n skipDisabled: true,\n });\n }\n\n private setupTypeAhead(): void {\n if (!this.searchable) return;\n\n const content = this.querySelector(\"ds-select-content\") as HTMLElement | null;\n if (!content) return;\n\n this.typeAhead = createTypeAhead({\n items: () => this.getEnabledOptions() as HTMLElement[],\n getText: (item) => (item as DsSelectOption).getLabel(),\n onMatch: (item) => {\n const option = item as DsSelectOption;\n this.behavior?.highlight(option.value);\n this.updateOptionStates();\n this.updateTriggerAria();\n // Scroll into view\n option.scrollIntoView({ block: \"nearest\" });\n },\n });\n\n // Wire type-ahead to keydown events\n content.addEventListener(\"keydown\", this.handleTypeAheadKeyDown);\n }\n\n private handleTypeAheadKeyDown = (event: KeyboardEvent): void => {\n this.typeAhead?.handleKeyDown(event);\n };\n\n private focusInitialItem(): void {\n const content = this.querySelector(\"ds-select-content\");\n if (!content) return;\n\n const options = this.getEnabledOptions();\n if (options.length === 0) return;\n\n let initialIndex = 0;\n\n if (this.focusFirstOnOpen === \"last\") {\n initialIndex = options.length - 1;\n } else if (this.focusFirstOnOpen === \"selected\" && this.value) {\n const selectedIndex = options.findIndex((opt) => opt.value === this.value);\n if (selectedIndex >= 0) {\n initialIndex = selectedIndex;\n }\n }\n\n // Highlight the initial option\n const initialOption = options[initialIndex];\n if (initialOption) {\n this.behavior?.highlight(initialOption.value);\n this.updateOptionStates();\n this.rovingFocus?.setFocusedIndex(initialIndex);\n initialOption.scrollIntoView({ block: \"nearest\" });\n }\n\n this.focusFirstOnOpen = null;\n }\n\n private cleanup(): void {\n const content = this.querySelector(\"ds-select-content\") as HTMLElement | null;\n\n // Cleanup type-ahead listener\n if (content) {\n content.removeEventListener(\"keydown\", this.handleTypeAheadKeyDown);\n }\n\n // Cleanup anchor positioning\n this.anchorPosition?.destroy();\n this.anchorPosition = null;\n\n // Cleanup dismiss layer\n this.dismissLayer?.deactivate();\n this.dismissLayer = null;\n\n // Cleanup presence\n this.presence?.destroy();\n this.presence = null;\n\n // Cleanup roving focus\n this.rovingFocus?.destroy();\n this.rovingFocus = null;\n\n // Cleanup type-ahead\n this.typeAhead?.reset();\n this.typeAhead = null;\n\n // Cleanup virtualized list\n this.virtualizedList?.destroy();\n this.virtualizedList = null;\n\n // Cleanup resize observer\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n\n // Cleanup scroll handler\n if (this.scrollHandler) {\n window.removeEventListener(\"scroll\", this.scrollHandler);\n window.removeEventListener(\"resize\", this.scrollHandler);\n this.scrollHandler = null;\n }\n }\n\n override async updated(changedProperties: Map<string, unknown>): Promise<void> {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"open\")) {\n this.updateTriggerAria();\n\n const content = this.querySelector(\"ds-select-content\") as DsSelectContent | null;\n\n if (this.open) {\n // Re-register options in case they changed\n this.registerOptions();\n\n // Show content\n content?.removeAttribute(\"hidden\");\n\n // Set data-state to open for entry animation\n if (content) {\n content.dataState = \"open\";\n }\n\n // Wait for DOM update\n await this.updateComplete;\n\n // Setup all behaviors\n this.setupPositioning();\n this.setupDismissLayer();\n this.setupRovingFocus();\n this.setupTypeAhead();\n\n // Focus initial item\n this.focusInitialItem();\n } else {\n // Set data-state to closed for exit animation\n if (content) {\n content.dataState = \"closed\";\n }\n // Hide content\n content?.setAttribute(\"hidden\", \"\");\n }\n }\n\n if (changedProperties.has(\"value\")) {\n this.updateOptionStates();\n }\n\n if (changedProperties.has(\"disabled\")) {\n const trigger = this.querySelector(\"ds-select-trigger\") as DsSelectTrigger | null;\n if (trigger) {\n trigger.disabled = this.disabled;\n }\n if (this.disabled && this.open) {\n this.close();\n }\n }\n\n // Handle loading state changes\n if (changedProperties.has(\"loading\")) {\n this.updateLoadingState();\n // Close dropdown if loading starts while open\n if (this.loading && this.open) {\n this.close();\n }\n }\n\n // Update positioning if placement or offset changes while open\n if (this.open && (changedProperties.has(\"placement\") || changedProperties.has(\"offset\"))) {\n this.cleanup();\n this.setupPositioning();\n this.setupDismissLayer();\n this.setupRovingFocus();\n this.setupTypeAhead();\n }\n }\n\n // Form association implementation\n\n protected getFormValue(): string | null {\n return this.value || null;\n }\n\n protected getValidationAnchor(): HTMLElement | undefined {\n return this.getTriggerElement() as HTMLElement | undefined;\n }\n\n protected getValidationFlags(): ValidationFlags {\n if (this.required && !this.value) {\n return { valueMissing: true };\n }\n return {};\n }\n\n protected getValidationMessage(flags: ValidationFlags): string {\n if (flags.valueMissing) {\n return \"Please select an option\";\n }\n return \"\";\n }\n\n protected shouldUpdateFormValue(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"value\");\n }\n\n protected shouldUpdateValidity(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"value\");\n }\n\n protected onFormReset(): void {\n this.value = this._defaultValue;\n this.updateOptionStates();\n }\n\n protected onFormStateRestore(\n state: string | File | FormData | null,\n _mode: \"restore\" | \"autocomplete\"\n ): void {\n if (typeof state === \"string\") {\n this.value = state;\n this.updateOptionStates();\n }\n }\n\n /**\n * Returns true if using data-driven rendering.\n */\n private get isDataDriven(): boolean {\n return this.items.length > 0;\n }\n\n /**\n * Renders a single option from data.\n */\n private renderDataOption(item: Option<string>) {\n const currentValue = this.behavior?.state.value ?? this.value;\n const highlightedValue = this.behavior?.state.highlightedValue;\n const isSelected = item.value === currentValue;\n const isHighlighted = item.value === highlightedValue;\n\n return html`\n <ds-select-option\n value=${item.value}\n ?disabled=${item.disabled}\n data-selected=${isSelected || nothing}\n data-highlighted=${isHighlighted || nothing}\n >\n ${item.label}\n </ds-select-option>\n `;\n }\n\n /**\n * Renders data-driven options with optional virtualization.\n */\n private renderDataOptions() {\n // Use virtualization for large lists\n if (this.virtualize && this.items.length > this.virtualizationThreshold) {\n return html`\n <div class=\"ds-select__virtualized\" style=\"height: ${Math.min(this.items.length * 40, 300)}px; overflow-y: auto;\">\n ${repeat(\n this.items,\n (item) => item.value,\n (item) => this.renderDataOption(item)\n )}\n </div>\n `;\n }\n\n return repeat(\n this.items,\n (item) => item.value,\n (item) => this.renderDataOption(item)\n );\n }\n\n override render() {\n return html`\n <slot name=\"trigger\"></slot>\n ${\n this.isDataDriven\n ? html`\n <ds-select-content>\n ${this.renderDataOptions()}\n </ds-select-content>\n `\n : html`<slot></slot>`\n }\n `;\n }\n}\n\ndefine(\"ds-select\", DsSelect);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-select\": DsSelect;\n }\n}\n","import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport type ComboboxContentState = \"open\" | \"closed\";\n\n/**\n * Combobox content container with role=\"listbox\".\n *\n * @element ds-combobox-content\n *\n * @slot - Combobox options (ds-combobox-option elements)\n *\n * @attr {string} data-state - Animation state (\"open\" or \"closed\")\n * @attr {string} data-placement - Current anchor position placement\n *\n * @example\n * ```html\n * <ds-combobox>\n * <input slot=\"input\" placeholder=\"Search fruits...\" />\n * <ds-combobox-content>\n * <ds-combobox-option value=\"apple\">Apple</ds-combobox-option>\n * <ds-combobox-option value=\"banana\">Banana</ds-combobox-option>\n * </ds-combobox-content>\n * </ds-combobox>\n * ```\n */\nexport class DsComboboxContent extends DSElement {\n /** Unique ID for ARIA association */\n @property({ type: String, reflect: true })\n override id = \"\";\n\n /** Animation state (open or closed) - set by parent ds-combobox */\n @property({ type: String, reflect: true, attribute: \"data-state\" })\n dataState: ComboboxContentState = \"closed\";\n\n /** Optional label for the listbox */\n @property({ type: String })\n label = \"\";\n\n /** Whether to show loading indicator */\n @property({ type: Boolean, reflect: true })\n loading = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Generate ID if not set\n if (!this.id) {\n this.id = `combobox-content-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n // Set ARIA role for listbox\n this.setAttribute(\"role\", \"listbox\");\n\n // Set label if provided\n if (this.label) {\n this.setAttribute(\"aria-label\", this.label);\n }\n\n // Hidden by default (parent combobox controls visibility)\n this.setAttribute(\"hidden\", \"\");\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"label\")) {\n if (this.label) {\n this.setAttribute(\"aria-label\", this.label);\n } else {\n this.removeAttribute(\"aria-label\");\n }\n }\n\n if (changedProperties.has(\"loading\")) {\n this.setAttribute(\"aria-busy\", String(this.loading));\n }\n }\n\n override render() {\n return html`\n <div class=\"ds-combobox-content\" part=\"container\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndefine(\"ds-combobox-content\", DsComboboxContent);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-combobox-content\": DsComboboxContent;\n }\n}\n","import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Combobox input wrapper with combobox role.\n *\n * @element ds-combobox-input\n *\n * @slot - Input element\n *\n * @example\n * ```html\n * <ds-combobox>\n * <ds-combobox-input>\n * <input placeholder=\"Search...\" />\n * </ds-combobox-input>\n * <ds-combobox-content>...</ds-combobox-content>\n * </ds-combobox>\n * ```\n */\nexport class DsComboboxInput extends DSElement {\n /** Whether the parent combobox is disabled */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Setup ARIA on first slotted element after render\n this.updateComplete.then(() => {\n this.setupInputAccessibility();\n });\n }\n\n private setupInputAccessibility(): void {\n const input = this.querySelector(\"input\") as HTMLInputElement | null;\n if (input) {\n input.setAttribute(\"role\", \"combobox\");\n input.setAttribute(\"aria-autocomplete\", \"list\");\n input.setAttribute(\"aria-expanded\", \"false\");\n if (this.disabled) {\n input.setAttribute(\"aria-disabled\", \"true\");\n input.setAttribute(\"disabled\", \"\");\n }\n }\n }\n\n /**\n * Updates ARIA attributes on the input element.\n */\n public updateAria(expanded: boolean, activeDescendantId?: string, controlsId?: string): void {\n const input = this.querySelector(\"input\") as HTMLInputElement | null;\n if (input) {\n input.setAttribute(\"aria-expanded\", String(expanded));\n if (controlsId) {\n input.setAttribute(\"aria-controls\", controlsId);\n }\n if (expanded && activeDescendantId) {\n input.setAttribute(\"aria-activedescendant\", activeDescendantId);\n } else {\n input.removeAttribute(\"aria-activedescendant\");\n }\n }\n }\n\n /**\n * Sets the loading state on the input.\n */\n public setLoading(loading: boolean): void {\n const input = this.querySelector(\"input\") as HTMLInputElement | null;\n if (input) {\n if (loading) {\n input.setAttribute(\"aria-busy\", \"true\");\n } else {\n input.removeAttribute(\"aria-busy\");\n }\n }\n }\n\n /**\n * Gets the actual input element.\n */\n public getInputElement(): HTMLInputElement | null {\n return this.querySelector(\"input\");\n }\n\n /**\n * Gets the current input value.\n */\n public getValue(): string {\n return this.getInputElement()?.value ?? \"\";\n }\n\n /**\n * Sets the input value.\n */\n public setValue(value: string): void {\n const input = this.getInputElement();\n if (input) {\n input.value = value;\n }\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"disabled\")) {\n const input = this.querySelector(\"input\") as HTMLInputElement | null;\n if (input) {\n if (this.disabled) {\n input.setAttribute(\"aria-disabled\", \"true\");\n input.setAttribute(\"disabled\", \"\");\n } else {\n input.removeAttribute(\"aria-disabled\");\n input.removeAttribute(\"disabled\");\n }\n }\n }\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndefine(\"ds-combobox-input\", DsComboboxInput);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-combobox-input\": DsComboboxInput;\n }\n}\n","import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Combobox option with role=\"option\".\n *\n * @element ds-combobox-option\n *\n * @slot - Option content (text, icon, etc.)\n *\n * @example\n * ```html\n * <ds-combobox-option value=\"apple\">Apple</ds-combobox-option>\n * <ds-combobox-option value=\"banana\" disabled>Banana</ds-combobox-option>\n * ```\n */\nexport class DsComboboxOption extends DSElement {\n /** Whether the option is disabled */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Value associated with this option */\n @property({ type: String, reflect: true })\n value = \"\";\n\n /** Display label (uses textContent if not specified) */\n @property({ type: String })\n label = \"\";\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Set ARIA role\n this.setAttribute(\"role\", \"option\");\n\n // Set tabIndex for roving focus (will be managed by parent)\n this.tabIndex = -1;\n\n // Generate ID if not set\n if (!this.id) {\n this.id = `combobox-option-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n // Update aria-disabled\n this.updateAriaDisabled();\n }\n\n /**\n * Gets the display label for this option.\n */\n public getLabel(): string {\n return this.label || this.textContent?.trim() || this.value;\n }\n\n private updateAriaDisabled(): void {\n if (this.disabled) {\n this.setAttribute(\"aria-disabled\", \"true\");\n } else {\n this.removeAttribute(\"aria-disabled\");\n }\n }\n\n /**\n * Sets the selected state of this option.\n */\n public setSelected(selected: boolean): void {\n this.setAttribute(\"aria-selected\", String(selected));\n if (selected) {\n this.setAttribute(\"data-selected\", \"\");\n } else {\n this.removeAttribute(\"data-selected\");\n }\n }\n\n /**\n * Sets the highlighted state of this option.\n */\n public setHighlighted(highlighted: boolean): void {\n if (highlighted) {\n this.setAttribute(\"data-highlighted\", \"\");\n } else {\n this.removeAttribute(\"data-highlighted\");\n }\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"disabled\")) {\n this.updateAriaDisabled();\n }\n }\n\n override render() {\n return html`\n <div class=\"ds-combobox-option\" part=\"container\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndefine(\"ds-combobox-option\", DsComboboxOption);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-combobox-option\": DsComboboxOption;\n }\n}\n","import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Combobox tag for multi-select mode.\n *\n * @element ds-combobox-tag\n *\n * @slot - Tag content\n *\n * @fires ds:remove - Fired when tag remove button is clicked\n *\n * @example\n * ```html\n * <ds-combobox-tag value=\"apple\">\n * Apple\n * <button slot=\"remove\" aria-label=\"Remove Apple\">×</button>\n * </ds-combobox-tag>\n * ```\n */\nexport class DsComboboxTag extends DSElement {\n /** Value associated with this tag */\n @property({ type: String, reflect: true })\n value = \"\";\n\n /** Display label */\n @property({ type: String })\n label = \"\";\n\n /** Whether the tag is disabled (can't be removed) */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Set ARIA role\n this.setAttribute(\"role\", \"listitem\");\n\n // Setup remove button listener\n this.addEventListener(\"click\", this.handleClick);\n this.addEventListener(\"keydown\", this.handleKeyDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(\"click\", this.handleClick);\n this.removeEventListener(\"keydown\", this.handleKeyDown);\n }\n\n private handleClick = (event: Event): void => {\n const target = event.target as HTMLElement;\n const removeButton = target.closest('[slot=\"remove\"]');\n if (removeButton && !this.disabled) {\n event.stopPropagation();\n this.remove_();\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (this.disabled) return;\n\n if (event.key === \"Delete\" || event.key === \"Backspace\") {\n event.preventDefault();\n this.remove_();\n }\n };\n\n /**\n * Triggers removal of this tag.\n */\n public remove_(): void {\n if (this.disabled) return;\n emitEvent(this, \"remove\", { detail: { value: this.value } });\n }\n\n /**\n * Gets the display label for this tag.\n */\n public getLabel(): string {\n return this.label || this.textContent?.trim() || this.value;\n }\n\n override render() {\n return html`\n <div class=\"ds-combobox-tag\" part=\"container\" aria-label=\"${this.getLabel()}, press Delete to remove\">\n <slot></slot>\n <slot name=\"remove\"></slot>\n </div>\n `;\n }\n}\n\ndefine(\"ds-combobox-tag\", DsComboboxTag);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-combobox-tag\": DsComboboxTag;\n }\n}\n","import {\n type AnchorPosition,\n type ComboboxBehavior,\n type DismissableLayer,\n type Option,\n type Placement,\n type Presence,\n type RovingFocus,\n type VirtualizedList,\n createAnchorPosition,\n createComboboxBehavior,\n createDismissableLayer,\n createPresence,\n createRovingFocus,\n prefersReducedMotion,\n} from \"@hypoth-ui/primitives-dom\";\nimport { html, nothing } from \"lit\";\nimport type { PropertyValues } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { FormAssociatedMixin } from \"../../base/form-associated.js\";\nimport type { ValidationFlags } from \"../../base/form-associated.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\n// Import child components to ensure they're registered\nimport type { DsComboboxContent } from \"./combobox-content.js\";\nimport type { DsComboboxInput } from \"./combobox-input.js\";\nimport type { DsComboboxOption } from \"./combobox-option.js\";\nimport \"./combobox-content.js\";\nimport \"./combobox-input.js\";\nimport \"./combobox-option.js\";\nimport \"./combobox-tag.js\";\n\n/**\n * Combobox component with async loading, multi-select, keyboard navigation, and native form participation.\n *\n * Uses ElementInternals for form association - the selected value(s) are submitted with the form\n * and the combobox participates in constraint validation.\n *\n * Implements WAI-ARIA Combobox pattern with:\n * - Text input with autocomplete suggestions\n * - Arrow key navigation between options\n * - Async loading with debounce\n * - Multi-select with tag display\n * - Enter to select, Escape to close\n *\n * @element ds-combobox\n *\n * @slot input - Input element (ds-combobox-input with input inside)\n * @slot tags - Selected value tags (for multi-select)\n * @slot - Combobox content (ds-combobox-content with ds-combobox-option children)\n *\n * @fires ds:open - Fired when combobox opens\n * @fires ds:close - Fired when combobox closes\n * @fires ds:change - Fired when value changes (detail: { value, label } or { values, labels })\n * @fires ds:input - Fired when input value changes (detail: { value })\n * @fires ds:invalid - Fired when customValidation is true and validation fails\n *\n * @example\n * ```html\n * <form>\n * <ds-combobox name=\"fruit\" required>\n * <ds-combobox-input slot=\"input\">\n * <input placeholder=\"Search fruits...\" />\n * </ds-combobox-input>\n * <ds-combobox-content>\n * <ds-combobox-option value=\"apple\">Apple</ds-combobox-option>\n * <ds-combobox-option value=\"banana\">Banana</ds-combobox-option>\n * </ds-combobox-content>\n * </ds-combobox>\n * <button type=\"submit\">Submit</button>\n * </form>\n * ```\n */\nexport class DsCombobox extends FormAssociatedMixin(DSElement) {\n /** Whether the combobox is open */\n @property({ type: Boolean, reflect: true })\n open = false;\n\n /** Current selected value (single-select mode) */\n @property({ type: String, reflect: true })\n value = \"\";\n\n /** Current selected values (multi-select mode) */\n @property({ type: Array })\n values: string[] = [];\n\n /** Placement relative to input */\n @property({ type: String, reflect: true })\n placement: Placement = \"bottom-start\";\n\n /** Offset distance from input in pixels */\n @property({ type: Number })\n offset = 4;\n\n /** Whether to flip placement when near viewport edge */\n @property({ type: Boolean })\n flip = true;\n\n /** Whether to animate open/close transitions */\n @property({ type: Boolean })\n animated = true;\n\n /** Whether the combobox is disabled */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Enable multi-select mode */\n @property({ type: Boolean, reflect: true })\n multiple = false;\n\n /** Allow creating new values */\n @property({ type: Boolean })\n creatable = false;\n\n /** Debounce delay for async loading in milliseconds */\n @property({ type: Number })\n debounce = 300;\n\n /** Virtualization threshold (default: 100) */\n @property({ type: Number, attribute: \"virtualization-threshold\" })\n virtualizationThreshold = 100;\n\n /** Enable virtualization for large lists */\n @property({ type: Boolean })\n virtualize = false;\n\n /**\n * Async loading function. Called when input changes (after debounce).\n * Return an array of Option objects: { value: string, label: string, disabled?: boolean }\n */\n @property({ attribute: false })\n loadItems?: (query: string, signal: AbortSignal) => Promise<Option<string>[]>;\n\n /**\n * Data-driven options array. Use this for programmatic option rendering.\n * When provided, options will be rendered from this array instead of slots.\n */\n @property({ attribute: false })\n items: Option<string>[] = [];\n\n /** Whether async loading is in progress (read-only) */\n @state()\n loading = false;\n\n /** Error message from async loading (read-only) */\n @state()\n loadError: string | null = null;\n\n /** Filtered items for display */\n @state()\n private filteredItems: Option<string>[] = [];\n\n /** Visible item IDs for virtualization */\n @state()\n private visibleItemIds = new Set<string>();\n\n /** Default value for form reset (single-select) */\n private _defaultValue = \"\";\n\n /** Default values for form reset (multi-select) */\n private _defaultValues: string[] = [];\n\n private behavior: ComboboxBehavior<string, false> | ComboboxBehavior<string, true> | null = null;\n private anchorPosition: AnchorPosition | null = null;\n private dismissLayer: DismissableLayer | null = null;\n private presence: Presence | null = null;\n private rovingFocus: RovingFocus | null = null;\n private virtualizedList: VirtualizedList | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private scrollHandler: (() => void) | null = null;\n private loadAbortController: AbortController | null = null;\n private debounceTimeout: number | null = null;\n\n override connectedCallback(): void {\n // Store default value(s) for form reset\n this._defaultValue = this.value;\n this._defaultValues = [...this.values];\n\n super.connectedCallback();\n\n // Initialize behavior based on multiple prop\n this.initBehavior();\n\n // Listen for input interactions\n this.addEventListener(\"input\", this.handleInput);\n this.addEventListener(\"keydown\", this.handleKeyDown);\n this.addEventListener(\"click\", this.handleClick);\n\n // Listen for tag removal\n this.addEventListener(\"ds:remove\", this.handleTagRemove);\n\n // Setup after first render\n this.updateComplete.then(() => {\n this.setupInputAccessibility();\n this.registerOptions();\n this.updateOptionStates();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(\"input\", this.handleInput);\n this.removeEventListener(\"keydown\", this.handleKeyDown);\n this.removeEventListener(\"click\", this.handleClick);\n this.removeEventListener(\"ds:remove\", this.handleTagRemove);\n this.cleanup();\n this.behavior?.destroy();\n this.behavior = null;\n }\n\n private initBehavior(): void {\n if (this.multiple) {\n this.behavior = createComboboxBehavior<string, true>({\n defaultValue: this.values,\n multiple: true,\n creatable: this.creatable,\n debounce: this.debounce,\n virtualizationThreshold: this.virtualizationThreshold,\n disabled: this.disabled,\n onValueChange: (values) => {\n this.values = values;\n const options = this.getOptions();\n const labels = values.map((v) => {\n const opt = options.find((o) => o.value === v);\n return opt?.getLabel() ?? v;\n });\n emitEvent(this, StandardEvents.CHANGE, { detail: { values, labels } });\n },\n onInputChange: (query) => {\n emitEvent(this, \"input\", { detail: { value: query } });\n this.filterOptions(query);\n },\n onCreateValue: (value) => {\n emitEvent(this, \"create\", { detail: { value } });\n },\n });\n } else {\n this.behavior = createComboboxBehavior<string, false>({\n defaultValue: this.value || null,\n multiple: false,\n creatable: this.creatable,\n debounce: this.debounce,\n virtualizationThreshold: this.virtualizationThreshold,\n disabled: this.disabled,\n onValueChange: (value) => {\n this.value = value ?? \"\";\n const option = this.getOptionByValue(value ?? \"\");\n emitEvent(this, StandardEvents.CHANGE, {\n detail: {\n value: value ?? \"\",\n label: option?.getLabel() ?? \"\",\n },\n });\n },\n onInputChange: (query) => {\n emitEvent(this, \"input\", { detail: { value: query } });\n this.filterOptions(query);\n },\n onCreateValue: (value) => {\n emitEvent(this, \"create\", { detail: { value } });\n },\n });\n }\n }\n\n /**\n * Opens the combobox.\n */\n public show(): void {\n if (this.open || this.disabled) return;\n this.behavior?.open();\n this.open = true;\n emitEvent(this, StandardEvents.OPEN);\n }\n\n /**\n * Closes the combobox.\n */\n public close(): void {\n if (!this.open) return;\n\n const content = this.querySelector(\"ds-combobox-content\") as DsComboboxContent | null;\n\n // If animated, use presence for exit animation\n if (this.animated && content && !prefersReducedMotion()) {\n this.dismissLayer?.deactivate();\n this.dismissLayer = null;\n\n this.presence = createPresence({\n onExitComplete: () => {\n this.completeClose();\n },\n });\n this.presence.hide(content);\n } else {\n this.cleanup();\n this.behavior?.close();\n this.open = false;\n emitEvent(this, StandardEvents.CLOSE);\n }\n }\n\n private completeClose(): void {\n this.cleanup();\n this.behavior?.close();\n this.open = false;\n emitEvent(this, StandardEvents.CLOSE);\n }\n\n /**\n * Selects a value programmatically.\n */\n public select(value: string): void {\n if (this.disabled) return;\n this.behavior?.select(value);\n this.updateOptionStates();\n if (!this.multiple) {\n this.close();\n }\n }\n\n /**\n * Removes a value (multi-select mode).\n */\n public removeValue(value: string): void {\n if (this.disabled || !this.multiple) return;\n (this.behavior as ComboboxBehavior<string, true>)?.remove(value);\n this.updateOptionStates();\n }\n\n /**\n * Clears all selections.\n */\n public clear(): void {\n if (this.disabled) return;\n this.behavior?.clear();\n this.updateOptionStates();\n }\n\n /**\n * Creates a new value (creatable mode).\n */\n public create(value: string): void {\n if (!this.creatable || this.disabled) return;\n this.behavior?.create(value);\n }\n\n private getInputWrapper(): DsComboboxInput | null {\n return this.querySelector(\"ds-combobox-input\") as DsComboboxInput | null;\n }\n\n private getInputElement(): HTMLInputElement | null {\n return this.getInputWrapper()?.getInputElement() ?? null;\n }\n\n private getOptions(): DsComboboxOption[] {\n const content = this.querySelector(\"ds-combobox-content\");\n if (!content) return [];\n return Array.from(content.querySelectorAll<DsComboboxOption>(\"ds-combobox-option\"));\n }\n\n private getEnabledOptions(): DsComboboxOption[] {\n return this.getOptions().filter((opt) => !opt.disabled);\n }\n\n private getOptionByValue(value: string): DsComboboxOption | null {\n return this.getOptions().find((opt) => opt.value === value) ?? null;\n }\n\n private registerOptions(): void {\n const options = this.getOptions();\n const _items: Option<string>[] = options.map((opt) => ({\n value: opt.value,\n label: opt.getLabel(),\n disabled: opt.disabled,\n }));\n // Set static items on behavior (for filtering)\n // Note: behavior stores items internally via the items option\n }\n\n private filterOptions(query: string): void {\n const options = this.getOptions();\n const lowerQuery = query.toLowerCase();\n\n for (const option of options) {\n const label = option.getLabel().toLowerCase();\n const matches = !query || label.includes(lowerQuery);\n\n if (matches) {\n option.removeAttribute(\"hidden\");\n } else {\n option.setAttribute(\"hidden\", \"\");\n }\n }\n\n // Auto-highlight first visible option\n const visibleOptions = this.getEnabledOptions().filter((opt) => !opt.hasAttribute(\"hidden\"));\n if (visibleOptions.length > 0 && visibleOptions[0]) {\n this.behavior?.highlightFirst();\n this.updateOptionStates();\n }\n }\n\n private updateOptionStates(): void {\n const currentValue = this.multiple\n ? ((this.behavior as ComboboxBehavior<string, true>)?.state.value ?? this.values)\n : ([this.behavior?.state.value ?? this.value].filter(Boolean) as string[]);\n const highlightedValue = this.behavior?.state.highlightedValue;\n\n for (const option of this.getOptions()) {\n const isSelected = currentValue.includes(option.value);\n option.setSelected(isSelected);\n option.setHighlighted(option.value === highlightedValue);\n }\n }\n\n private handleInput = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n if (target.tagName !== \"INPUT\") return;\n\n const value = target.value;\n this.behavior?.setInputValue(value);\n\n // Auto-open on input\n if (!this.open && value) {\n this.show();\n }\n\n // Handle async loading with debounce\n if (this.loadItems) {\n this.scheduleAsyncLoad(value);\n }\n };\n\n /**\n * Schedules async loading with debounce.\n */\n private scheduleAsyncLoad(query: string): void {\n // Clear previous debounce\n if (this.debounceTimeout !== null) {\n window.clearTimeout(this.debounceTimeout);\n }\n\n // Cancel previous request\n this.loadAbortController?.abort();\n\n this.debounceTimeout = window.setTimeout(() => {\n this.executeAsyncLoad(query);\n }, this.debounce);\n }\n\n /**\n * Executes the async load.\n */\n private async executeAsyncLoad(query: string): Promise<void> {\n if (!this.loadItems) return;\n\n // Create new abort controller\n this.loadAbortController = new AbortController();\n const signal = this.loadAbortController.signal;\n\n this.loading = true;\n this.loadError = null;\n\n try {\n const results = await this.loadItems(query, signal);\n\n // Check if aborted\n if (signal.aborted) return;\n\n this.items = results;\n this.filteredItems = results;\n this.loading = false;\n\n // Update highlighting\n if (results.length > 0) {\n this.behavior?.highlightFirst();\n this.updateOptionStates();\n }\n } catch (error) {\n // Ignore abort errors\n if (error instanceof Error && error.name === \"AbortError\") {\n return;\n }\n\n this.loading = false;\n this.loadError = error instanceof Error ? error.message : \"Failed to load items\";\n this.items = [];\n this.filteredItems = [];\n }\n }\n\n /**\n * Manually trigger async loading (useful for initial load).\n */\n public async load(query = \"\"): Promise<void> {\n if (!this.loadItems) return;\n await this.executeAsyncLoad(query);\n }\n\n private handleClick = (event: Event): void => {\n const target = event.target as HTMLElement;\n\n // Handle option click\n const option = target.closest(\"ds-combobox-option\") as DsComboboxOption | null;\n if (option && this.contains(option) && !option.disabled && !option.hasAttribute(\"hidden\")) {\n event.preventDefault();\n this.select(option.value);\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n const target = event.target as HTMLElement;\n const isInput = target.tagName === \"INPUT\";\n\n if (!this.open) {\n // Open on arrow down when focused on input\n if (isInput && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")) {\n event.preventDefault();\n this.show();\n }\n return;\n }\n\n switch (event.key) {\n case \"Enter\": {\n event.preventDefault();\n const highlightedValue = this.behavior?.state.highlightedValue;\n if (highlightedValue) {\n this.select(highlightedValue);\n } else if (this.creatable && isInput) {\n const inputValue = (target as HTMLInputElement).value.trim();\n if (inputValue) {\n this.create(inputValue);\n }\n }\n break;\n }\n case \"Escape\":\n event.preventDefault();\n this.close();\n this.getInputElement()?.focus();\n break;\n case \"ArrowDown\":\n event.preventDefault();\n this.behavior?.highlightNext();\n this.updateOptionStates();\n this.updateInputAria();\n this.scrollHighlightedIntoView();\n break;\n case \"ArrowUp\":\n event.preventDefault();\n this.behavior?.highlightPrev();\n this.updateOptionStates();\n this.updateInputAria();\n this.scrollHighlightedIntoView();\n break;\n case \"Home\":\n if (isInput && (target as HTMLInputElement).selectionStart === 0) {\n event.preventDefault();\n this.behavior?.highlightFirst();\n this.updateOptionStates();\n this.updateInputAria();\n this.scrollHighlightedIntoView();\n }\n break;\n case \"End\":\n if (\n isInput &&\n (target as HTMLInputElement).selectionEnd === (target as HTMLInputElement).value.length\n ) {\n event.preventDefault();\n this.behavior?.highlightLast();\n this.updateOptionStates();\n this.updateInputAria();\n this.scrollHighlightedIntoView();\n }\n break;\n case \"Backspace\":\n if (this.multiple && isInput && (target as HTMLInputElement).value === \"\") {\n // Remove last tag\n (this.behavior as ComboboxBehavior<string, true>)?.removeLastTag();\n this.updateOptionStates();\n }\n break;\n case \"Tab\":\n // Close on tab without preventing default\n this.close();\n break;\n }\n };\n\n private handleTagRemove = (event: Event): void => {\n const customEvent = event as CustomEvent<{ value: string }>;\n this.removeValue(customEvent.detail.value);\n };\n\n private scrollHighlightedIntoView(): void {\n const highlightedValue = this.behavior?.state.highlightedValue;\n if (highlightedValue) {\n const option = this.getOptionByValue(highlightedValue);\n option?.scrollIntoView({ block: \"nearest\" });\n }\n }\n\n private handleDismiss = (): void => {\n this.close();\n };\n\n private setupInputAccessibility(): void {\n const inputWrapper = this.getInputWrapper();\n const content = this.querySelector(\"ds-combobox-content\") as DsComboboxContent | null;\n\n if (inputWrapper && content) {\n inputWrapper.disabled = this.disabled;\n inputWrapper.updateAria(this.open, undefined, content.id);\n }\n }\n\n private updateInputAria(): void {\n const inputWrapper = this.getInputWrapper();\n const content = this.querySelector(\"ds-combobox-content\") as DsComboboxContent | null;\n\n if (inputWrapper && content) {\n const highlightedValue = this.behavior?.state.highlightedValue;\n const highlightedOption = highlightedValue ? this.getOptionByValue(highlightedValue) : null;\n inputWrapper.updateAria(this.open, highlightedOption?.id, content.id);\n }\n }\n\n private setupPositioning(): void {\n const input = this.getInputElement();\n const content = this.querySelector(\"ds-combobox-content\") as HTMLElement | null;\n\n if (!input || !content) return;\n\n this.anchorPosition = createAnchorPosition({\n anchor: input,\n floating: content,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n onPositionChange: (pos) => {\n content.setAttribute(\"data-placement\", pos.placement);\n },\n });\n\n this.resizeObserver = new ResizeObserver(() => {\n this.anchorPosition?.update();\n });\n this.resizeObserver.observe(input);\n this.resizeObserver.observe(content);\n\n this.scrollHandler = () => {\n this.anchorPosition?.update();\n };\n window.addEventListener(\"scroll\", this.scrollHandler, { passive: true });\n window.addEventListener(\"resize\", this.scrollHandler, { passive: true });\n }\n\n private setupDismissLayer(): void {\n const content = this.querySelector(\"ds-combobox-content\") as HTMLElement | null;\n const input = this.getInputElement();\n\n if (!content) return;\n\n this.dismissLayer = createDismissableLayer({\n container: content,\n excludeElements: input ? [input] : [],\n onDismiss: this.handleDismiss,\n closeOnEscape: true,\n closeOnOutsideClick: true,\n });\n this.dismissLayer.activate();\n }\n\n private setupRovingFocus(): void {\n const content = this.querySelector(\"ds-combobox-content\") as HTMLElement | null;\n\n if (!content) return;\n\n this.rovingFocus = createRovingFocus({\n container: content,\n selector: \"ds-combobox-option:not([disabled]):not([hidden])\",\n direction: \"vertical\",\n loop: true,\n skipDisabled: true,\n });\n }\n\n private cleanup(): void {\n this.anchorPosition?.destroy();\n this.anchorPosition = null;\n\n this.dismissLayer?.deactivate();\n this.dismissLayer = null;\n\n this.presence?.destroy();\n this.presence = null;\n\n this.rovingFocus?.destroy();\n this.rovingFocus = null;\n\n this.virtualizedList?.destroy();\n this.virtualizedList = null;\n\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n\n if (this.scrollHandler) {\n window.removeEventListener(\"scroll\", this.scrollHandler);\n window.removeEventListener(\"resize\", this.scrollHandler);\n this.scrollHandler = null;\n }\n\n // Cancel any pending async operations\n if (this.debounceTimeout !== null) {\n window.clearTimeout(this.debounceTimeout);\n this.debounceTimeout = null;\n }\n this.loadAbortController?.abort();\n this.loadAbortController = null;\n }\n\n override async updated(changedProperties: Map<string, unknown>): Promise<void> {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"open\")) {\n this.updateInputAria();\n\n const content = this.querySelector(\"ds-combobox-content\") as DsComboboxContent | null;\n\n if (this.open) {\n this.registerOptions();\n\n content?.removeAttribute(\"hidden\");\n\n if (content) {\n content.dataState = \"open\";\n }\n\n await this.updateComplete;\n\n this.setupPositioning();\n this.setupDismissLayer();\n this.setupRovingFocus();\n\n // Highlight first option or current value\n const visibleOptions = this.getEnabledOptions().filter(\n (opt) => !opt.hasAttribute(\"hidden\")\n );\n if (visibleOptions.length > 0) {\n this.behavior?.highlightFirst();\n this.updateOptionStates();\n }\n } else {\n if (content) {\n content.dataState = \"closed\";\n }\n content?.setAttribute(\"hidden\", \"\");\n\n // Clear filter when closing\n for (const option of this.getOptions()) {\n option.removeAttribute(\"hidden\");\n }\n }\n }\n\n if (changedProperties.has(\"value\") || changedProperties.has(\"values\")) {\n this.updateOptionStates();\n }\n\n if (changedProperties.has(\"disabled\")) {\n const inputWrapper = this.getInputWrapper();\n if (inputWrapper) {\n inputWrapper.disabled = this.disabled;\n }\n if (this.disabled && this.open) {\n this.close();\n }\n }\n\n if (this.open && (changedProperties.has(\"placement\") || changedProperties.has(\"offset\"))) {\n this.cleanup();\n this.setupPositioning();\n this.setupDismissLayer();\n this.setupRovingFocus();\n }\n }\n\n /**\n * Returns true if using data-driven rendering.\n */\n private get isDataDriven(): boolean {\n return this.items.length > 0 || this.loadItems !== undefined;\n }\n\n /**\n * Renders a single option from data.\n */\n private renderDataOption(item: Option<string>) {\n const currentValue = this.multiple\n ? ((this.behavior as ComboboxBehavior<string, true>)?.state.value ?? this.values)\n : ([this.behavior?.state.value ?? this.value].filter(Boolean) as string[]);\n const highlightedValue = this.behavior?.state.highlightedValue;\n const isSelected = currentValue.includes(item.value);\n const isHighlighted = item.value === highlightedValue;\n\n return html`\n <ds-combobox-option\n value=${item.value}\n ?disabled=${item.disabled}\n data-selected=${isSelected || nothing}\n data-highlighted=${isHighlighted || nothing}\n >\n ${item.label}\n </ds-combobox-option>\n `;\n }\n\n /**\n * Renders loading state.\n */\n private renderLoading() {\n return html`\n <div class=\"ds-combobox__loading\" role=\"status\" aria-live=\"polite\">\n <slot name=\"loading\">Loading...</slot>\n </div>\n `;\n }\n\n /**\n * Renders error state.\n */\n private renderError() {\n return html`\n <div class=\"ds-combobox__error\" role=\"alert\">\n <slot name=\"error\">${this.loadError}</slot>\n </div>\n `;\n }\n\n /**\n * Renders empty state.\n */\n private renderEmpty() {\n return html`\n <div class=\"ds-combobox__empty\">\n <slot name=\"empty\">No results found</slot>\n </div>\n `;\n }\n\n // Form association implementation\n\n protected getFormValue(): FormData | string | null {\n if (this.multiple) {\n // For multi-select, submit as FormData with multiple values\n if (this.values.length === 0) return null;\n const formData = new FormData();\n for (const val of this.values) {\n formData.append(this.name, val);\n }\n return formData;\n }\n return this.value || null;\n }\n\n protected getValidationAnchor(): HTMLElement | undefined {\n return this.getInputElement() as HTMLElement | undefined;\n }\n\n protected getValidationFlags(): ValidationFlags {\n const hasValue = this.multiple ? this.values.length > 0 : Boolean(this.value);\n if (this.required && !hasValue) {\n return { valueMissing: true };\n }\n return {};\n }\n\n protected getValidationMessage(flags: ValidationFlags): string {\n if (flags.valueMissing) {\n return \"Please select an option\";\n }\n return \"\";\n }\n\n protected shouldUpdateFormValue(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"value\") || changedProperties.has(\"values\");\n }\n\n protected shouldUpdateValidity(changedProperties: PropertyValues): boolean {\n return changedProperties.has(\"value\") || changedProperties.has(\"values\");\n }\n\n protected onFormReset(): void {\n if (this.multiple) {\n this.values = [...this._defaultValues];\n } else {\n this.value = this._defaultValue;\n }\n this.updateOptionStates();\n }\n\n protected onFormStateRestore(\n state: string | File | FormData | null,\n _mode: \"restore\" | \"autocomplete\"\n ): void {\n if (this.multiple && state instanceof FormData) {\n this.values = state.getAll(this.name) as string[];\n } else if (typeof state === \"string\") {\n this.value = state;\n }\n this.updateOptionStates();\n }\n\n /**\n * Renders data-driven options.\n */\n private renderDataOptions() {\n const items = this.filteredItems.length > 0 ? this.filteredItems : this.items;\n\n if (this.loading) {\n return this.renderLoading();\n }\n\n if (this.loadError) {\n return this.renderError();\n }\n\n if (items.length === 0) {\n return this.renderEmpty();\n }\n\n // Use virtualization for large lists\n if (this.virtualize && items.length > this.virtualizationThreshold) {\n return html`\n <div class=\"ds-combobox__virtualized\" style=\"height: ${Math.min(items.length * 40, 300)}px; overflow-y: auto;\">\n ${repeat(\n items,\n (item) => item.value,\n (item) => this.renderDataOption(item)\n )}\n </div>\n `;\n }\n\n return repeat(\n items,\n (item) => item.value,\n (item) => this.renderDataOption(item)\n );\n }\n\n override render() {\n return html`\n <slot name=\"tags\"></slot>\n <slot name=\"input\"></slot>\n ${\n this.isDataDriven\n ? html`\n <ds-combobox-content>\n ${this.renderDataOptions()}\n </ds-combobox-content>\n `\n : html`<slot></slot>`\n }\n `;\n }\n}\n\ndefine(\"ds-combobox\", DsCombobox);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-combobox\": DsCombobox;\n }\n}\n","/**\n * Slider component for numeric value selection via draggable thumb(s).\n *\n * @element ds-slider\n * @fires ds:change - Fired on value change with { value } or { min, max } for range mode\n *\n * @example\n * ```html\n * <!-- Single value slider -->\n * <ds-slider min=\"0\" max=\"100\" value=\"50\"></ds-slider>\n *\n * <!-- Range slider -->\n * <ds-slider range min=\"0\" max=\"1000\" range-min=\"200\" range-max=\"800\"></ds-slider>\n *\n * <!-- Vertical slider -->\n * <ds-slider orientation=\"vertical\" min=\"0\" max=\"100\"></ds-slider>\n * ```\n */\n\nimport { type SliderBehavior, type ThumbType, createSliderBehavior } from \"@hypoth-ui/primitives-dom\";\nimport { html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport class DsSlider extends DSElement {\n /** Minimum allowed value */\n @property({ type: Number, reflect: true })\n min = 0;\n\n /** Maximum allowed value */\n @property({ type: Number, reflect: true })\n max = 100;\n\n /** Step increment */\n @property({ type: Number, reflect: true })\n step = 1;\n\n /** Current value (single mode) */\n @property({ type: Number, reflect: true })\n value = 0;\n\n /** Range mode (two thumbs) */\n @property({ type: Boolean, reflect: true })\n range = false;\n\n /** Minimum value in range mode */\n @property({ type: Number, reflect: true, attribute: \"range-min\" })\n rangeMin = 0;\n\n /** Maximum value in range mode */\n @property({ type: Number, reflect: true, attribute: \"range-max\" })\n rangeMax = 100;\n\n /** Orientation */\n @property({ type: String, reflect: true })\n orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\n\n /** Disabled state */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Optional label */\n @property({ type: String })\n label = \"\";\n\n /** ARIA label */\n @property({ type: String, attribute: \"aria-label\" })\n override ariaLabel: string | null = null;\n\n /** Value text formatter for screen readers */\n @property({ attribute: false })\n formatValueText?: (value: number) => string;\n\n /** Show tick marks */\n @property({ type: Boolean, reflect: true, attribute: \"show-ticks\" })\n showTicks = false;\n\n /** Show value tooltip on focus/drag */\n @property({ type: Boolean, reflect: true, attribute: \"show-tooltip\" })\n showTooltip = false;\n\n /** Number of tick marks (defaults to (max-min)/step if step > 1) */\n @property({ type: Number, attribute: \"tick-count\" })\n tickCount?: number;\n\n @state()\n private behavior: SliderBehavior | null = null;\n\n @state()\n private focusedThumb: ThumbType | null = null;\n\n @state()\n private dragging = false;\n\n private trackRef: HTMLElement | null = null;\n private boundHandlePointerMove: ((e: PointerEvent) => void) | null = null;\n private boundHandlePointerUp: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.initBehavior();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.behavior?.destroy();\n this.behavior = null;\n this.removeGlobalListeners();\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n // Re-init behavior if key props change\n if (\n changedProperties.has(\"min\") ||\n changedProperties.has(\"max\") ||\n changedProperties.has(\"step\") ||\n changedProperties.has(\"range\") ||\n changedProperties.has(\"orientation\") ||\n changedProperties.has(\"disabled\")\n ) {\n this.initBehavior();\n }\n }\n\n private initBehavior(): void {\n this.behavior?.destroy();\n\n this.behavior = createSliderBehavior({\n min: this.min,\n max: this.max,\n step: this.step,\n defaultValue: this.value,\n defaultRange: { min: this.rangeMin, max: this.rangeMax },\n range: this.range,\n orientation: this.orientation,\n disabled: this.disabled,\n onValueChange: (value) => {\n this.value = value;\n emitEvent(this, StandardEvents.CHANGE, { detail: { value } });\n },\n onRangeChange: (range) => {\n this.rangeMin = range.min;\n this.rangeMax = range.max;\n emitEvent(this, StandardEvents.CHANGE, { detail: range });\n },\n });\n\n // Set track reference after render\n this.updateComplete.then(() => {\n const track = this.querySelector<HTMLElement>(\".ds-slider__track\");\n if (track && this.behavior) {\n this.trackRef = track;\n this.behavior.trackElement = track;\n }\n });\n }\n\n private handleThumbPointerDown(thumb: ThumbType, event: PointerEvent): void {\n if (this.disabled || !this.behavior) return;\n\n event.preventDefault();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n\n this.behavior.startDrag(thumb, event);\n this.dragging = true;\n this.addGlobalListeners();\n }\n\n private handlePointerMove = (event: PointerEvent): void => {\n if (!this.dragging || !this.behavior) return;\n this.behavior.drag(event);\n this.requestUpdate();\n };\n\n private handlePointerUp = (): void => {\n if (!this.behavior) return;\n this.behavior.endDrag();\n this.dragging = false;\n this.removeGlobalListeners();\n this.requestUpdate();\n };\n\n private handleTrackClick(event: PointerEvent): void {\n if (this.disabled || !this.behavior) return;\n\n // Determine which thumb to move (closest in range mode)\n const thumb = this.getClosestThumb(event);\n this.behavior.startDrag(thumb, event);\n this.behavior.endDrag();\n this.requestUpdate();\n }\n\n private getClosestThumb(event: PointerEvent): ThumbType {\n if (!this.range || !this.behavior) return \"single\";\n\n const { rangeValue, min, max, orientation } = this.behavior.state;\n const track = this.trackRef;\n if (!track) return \"min\";\n\n const rect = track.getBoundingClientRect();\n let percent: number;\n\n if (orientation === \"horizontal\") {\n percent = ((event.clientX - rect.left) / rect.width) * 100;\n } else {\n percent = 100 - ((event.clientY - rect.top) / rect.height) * 100;\n }\n\n const clickValue = (percent / 100) * (max - min) + min;\n const minDist = Math.abs(clickValue - rangeValue.min);\n const maxDist = Math.abs(clickValue - rangeValue.max);\n\n return minDist <= maxDist ? \"min\" : \"max\";\n }\n\n private handleThumbKeyDown(thumb: ThumbType, event: KeyboardEvent): void {\n if (this.disabled || !this.behavior) return;\n\n const isVertical = this.orientation === \"vertical\";\n\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n event.preventDefault();\n if (isVertical ? event.key === \"ArrowUp\" : event.key === \"ArrowRight\") {\n this.behavior.increment(thumb);\n } else {\n this.behavior.decrement(thumb);\n }\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n event.preventDefault();\n if (isVertical ? event.key === \"ArrowDown\" : event.key === \"ArrowLeft\") {\n this.behavior.decrement(thumb);\n } else {\n this.behavior.increment(thumb);\n }\n break;\n case \"PageUp\":\n event.preventDefault();\n this.behavior.increment(thumb, true);\n break;\n case \"PageDown\":\n event.preventDefault();\n this.behavior.decrement(thumb, true);\n break;\n case \"Home\":\n event.preventDefault();\n this.behavior.setToMin(thumb);\n break;\n case \"End\":\n event.preventDefault();\n this.behavior.setToMax(thumb);\n break;\n }\n\n this.requestUpdate();\n }\n\n private addGlobalListeners(): void {\n this.boundHandlePointerMove = this.handlePointerMove;\n this.boundHandlePointerUp = this.handlePointerUp;\n document.addEventListener(\"pointermove\", this.boundHandlePointerMove);\n document.addEventListener(\"pointerup\", this.boundHandlePointerUp);\n }\n\n private removeGlobalListeners(): void {\n if (this.boundHandlePointerMove) {\n document.removeEventListener(\"pointermove\", this.boundHandlePointerMove);\n }\n if (this.boundHandlePointerUp) {\n document.removeEventListener(\"pointerup\", this.boundHandlePointerUp);\n }\n this.boundHandlePointerMove = null;\n this.boundHandlePointerUp = null;\n }\n\n private getValueText(value: number): string {\n if (this.formatValueText) {\n return this.formatValueText(value);\n }\n return String(value);\n }\n\n private handleThumbFocus(thumb: ThumbType): void {\n this.focusedThumb = thumb;\n }\n\n private handleThumbBlur(): void {\n this.focusedThumb = null;\n }\n\n private getTickPositions(): number[] {\n const count = this.tickCount ?? Math.floor((this.max - this.min) / this.step) + 1;\n // Limit to reasonable number of ticks\n const effectiveCount = Math.min(count, 21);\n const positions: number[] = [];\n\n for (let i = 0; i < effectiveCount; i++) {\n positions.push((i / (effectiveCount - 1)) * 100);\n }\n return positions;\n }\n\n private renderTicks() {\n if (!this.showTicks) return nothing;\n\n const positions = this.getTickPositions();\n const isVertical = this.orientation === \"vertical\";\n\n return html`\n <div class=\"ds-slider__ticks\">\n ${positions.map(\n (pos) => html`\n <div\n class=\"ds-slider__tick\"\n style=${isVertical ? `bottom: ${pos}%` : `left: ${pos}%`}\n ></div>\n `\n )}\n </div>\n `;\n }\n\n private renderTooltip(value: number, percent: number, isVisible: boolean) {\n if (!this.showTooltip) return nothing;\n\n const isVertical = this.orientation === \"vertical\";\n const style = isVertical ? `bottom: ${percent}%` : `left: ${percent}%`;\n\n return html`\n <div\n class=\"ds-slider__tooltip\"\n style=${style}\n data-visible=${isVisible || nothing}\n >\n ${this.getValueText(value)}\n </div>\n `;\n }\n\n override render() {\n if (!this.behavior) return nothing;\n\n const { state } = this.behavior;\n const singlePercent = this.behavior.valueToPercent(state.value);\n const minPercent = this.behavior.valueToPercent(state.rangeValue.min);\n const maxPercent = this.behavior.valueToPercent(state.rangeValue.max);\n\n const isVertical = this.orientation === \"vertical\";\n const thumbStyle = (percent: number) =>\n isVertical ? `bottom: ${percent}%` : `left: ${percent}%`;\n\n const rangeStyle = this.range\n ? isVertical\n ? `bottom: ${minPercent}%; height: ${maxPercent - minPercent}%`\n : `left: ${minPercent}%; width: ${maxPercent - minPercent}%`\n : isVertical\n ? `height: ${singlePercent}%`\n : `width: ${singlePercent}%`;\n\n return html`\n <div\n class=\"ds-slider\"\n data-orientation=${this.orientation}\n data-disabled=${this.disabled || nothing}\n data-dragging=${this.dragging || nothing}\n >\n <div\n class=\"ds-slider__track\"\n @pointerdown=${(e: PointerEvent) => this.handleTrackClick(e)}\n >\n <div class=\"ds-slider__range\" style=${rangeStyle}></div>\n\n ${this.renderTicks()}\n\n ${\n this.range\n ? html`\n <!-- Min thumb -->\n <div\n class=\"ds-slider__thumb\"\n role=\"slider\"\n tabindex=${this.disabled ? -1 : 0}\n aria-label=${this.ariaLabel || this.label || \"Minimum value\"}\n aria-valuemin=${this.min}\n aria-valuemax=${state.rangeValue.max}\n aria-valuenow=${state.rangeValue.min}\n aria-valuetext=${this.getValueText(state.rangeValue.min)}\n aria-orientation=${this.orientation}\n aria-disabled=${this.disabled}\n data-thumb=\"min\"\n style=${thumbStyle(minPercent)}\n @pointerdown=${(e: PointerEvent) => this.handleThumbPointerDown(\"min\", e)}\n @keydown=${(e: KeyboardEvent) => this.handleThumbKeyDown(\"min\", e)}\n @focus=${() => this.handleThumbFocus(\"min\")}\n @blur=${() => this.handleThumbBlur()}\n >\n ${this.renderTooltip(state.rangeValue.min, minPercent, this.focusedThumb === \"min\" || this.dragging)}\n </div>\n\n <!-- Max thumb -->\n <div\n class=\"ds-slider__thumb\"\n role=\"slider\"\n tabindex=${this.disabled ? -1 : 0}\n aria-label=${this.ariaLabel || this.label || \"Maximum value\"}\n aria-valuemin=${state.rangeValue.min}\n aria-valuemax=${this.max}\n aria-valuenow=${state.rangeValue.max}\n aria-valuetext=${this.getValueText(state.rangeValue.max)}\n aria-orientation=${this.orientation}\n aria-disabled=${this.disabled}\n data-thumb=\"max\"\n style=${thumbStyle(maxPercent)}\n @pointerdown=${(e: PointerEvent) => this.handleThumbPointerDown(\"max\", e)}\n @keydown=${(e: KeyboardEvent) => this.handleThumbKeyDown(\"max\", e)}\n @focus=${() => this.handleThumbFocus(\"max\")}\n @blur=${() => this.handleThumbBlur()}\n >\n ${this.renderTooltip(state.rangeValue.max, maxPercent, this.focusedThumb === \"max\" || this.dragging)}\n </div>\n `\n : html`\n <!-- Single thumb -->\n <div\n class=\"ds-slider__thumb\"\n role=\"slider\"\n tabindex=${this.disabled ? -1 : 0}\n aria-label=${this.ariaLabel || this.label || \"Value\"}\n aria-valuemin=${this.min}\n aria-valuemax=${this.max}\n aria-valuenow=${state.value}\n aria-valuetext=${this.getValueText(state.value)}\n aria-orientation=${this.orientation}\n aria-disabled=${this.disabled}\n data-thumb=\"single\"\n style=${thumbStyle(singlePercent)}\n @pointerdown=${(e: PointerEvent) => this.handleThumbPointerDown(\"single\", e)}\n @keydown=${(e: KeyboardEvent) => this.handleThumbKeyDown(\"single\", e)}\n @focus=${() => this.handleThumbFocus(\"single\")}\n @blur=${() => this.handleThumbBlur()}\n >\n ${this.renderTooltip(state.value, singlePercent, this.focusedThumb === \"single\" || this.dragging)}\n </div>\n `\n }\n </div>\n </div>\n `;\n }\n}\n\ndefine(\"ds-slider\", DsSlider);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-slider\": DsSlider;\n }\n}\n","/**\n * NumberInput component for numeric value input with increment/decrement controls.\n *\n * @element ds-number-input\n * @fires ds:change - Fired on value change with { value }\n *\n * @example\n * ```html\n * <!-- Basic number input -->\n * <ds-number-input min=\"0\" max=\"100\" value=\"50\"></ds-number-input>\n *\n * <!-- With step and precision -->\n * <ds-number-input step=\"0.01\" precision=\"2\" value=\"9.99\"></ds-number-input>\n *\n * <!-- Currency format -->\n * <ds-number-input format=\"currency\" currency=\"USD\" precision=\"2\"></ds-number-input>\n * ```\n */\n\nimport { type NumberInputBehavior, createNumberInputBehavior } from \"@hypoth-ui/primitives-dom\";\nimport { html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport type NumberInputFormat = \"decimal\" | \"currency\" | \"percent\";\n\nexport class DsNumberInput extends DSElement {\n /** Minimum allowed value */\n @property({ type: Number, reflect: true })\n min: number | undefined = undefined;\n\n /** Maximum allowed value */\n @property({ type: Number, reflect: true })\n max: number | undefined = undefined;\n\n /** Step increment */\n @property({ type: Number, reflect: true })\n step = 1;\n\n /** Current value */\n @property({ type: Number, reflect: true })\n value: number | undefined = undefined;\n\n /** Decimal precision */\n @property({ type: Number, reflect: true })\n precision = 0;\n\n /** Format type */\n @property({ type: String, reflect: true })\n format: NumberInputFormat = \"decimal\";\n\n /** Currency code (for currency format) */\n @property({ type: String, reflect: true })\n currency = \"USD\";\n\n /** Locale for formatting */\n @property({ type: String, reflect: true })\n locale = \"en-US\";\n\n /** Disabled state */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Placeholder text */\n @property({ type: String })\n placeholder = \"\";\n\n /** Form field name */\n @property({ type: String, reflect: true })\n name = \"\";\n\n /** ARIA label */\n @property({ type: String, attribute: \"aria-label\" })\n override ariaLabel: string | null = null;\n\n /** Allow empty input */\n @property({ type: Boolean, attribute: \"allow-empty\" })\n allowEmpty = false;\n\n /** Show increment/decrement buttons */\n @property({ type: Boolean, attribute: \"show-buttons\" })\n showButtons = true;\n\n /** Prefix text (displayed before input) */\n @property({ type: String })\n prefix = \"\";\n\n /** Suffix text (displayed after input) */\n @property({ type: String })\n suffix = \"\";\n\n @state()\n private behavior: NumberInputBehavior | null = null;\n\n @state()\n private inputValue = \"\";\n\n @state()\n private isFocused = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.initBehavior();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.behavior?.destroy();\n this.behavior = null;\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n // Re-init behavior if key props change\n if (\n changedProperties.has(\"min\") ||\n changedProperties.has(\"max\") ||\n changedProperties.has(\"step\") ||\n changedProperties.has(\"precision\") ||\n changedProperties.has(\"format\") ||\n changedProperties.has(\"currency\") ||\n changedProperties.has(\"locale\") ||\n changedProperties.has(\"allowEmpty\") ||\n changedProperties.has(\"disabled\")\n ) {\n this.initBehavior();\n }\n }\n\n private initBehavior(): void {\n this.behavior?.destroy();\n\n this.behavior = createNumberInputBehavior({\n min: this.min,\n max: this.max,\n step: this.step,\n precision: this.precision,\n defaultValue: this.value,\n format: this.format,\n currency: this.currency,\n locale: this.locale,\n allowEmpty: this.allowEmpty,\n disabled: this.disabled,\n onValueChange: (value) => {\n this.value = value;\n emitEvent(this, StandardEvents.CHANGE, { detail: { value } });\n },\n });\n\n this.inputValue = this.behavior.state.inputValue;\n }\n\n private handleInput(event: Event): void {\n if (!this.behavior) return;\n const input = event.target as HTMLInputElement;\n this.inputValue = input.value;\n this.behavior.handleInput(input.value);\n }\n\n private handleBlur(): void {\n if (!this.behavior) return;\n this.isFocused = false;\n this.behavior.commit();\n this.inputValue = this.behavior.state.inputValue;\n }\n\n private handleFocus(): void {\n this.isFocused = true;\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (!this.behavior) return;\n this.behavior.handleKeyDown(event);\n this.inputValue = this.behavior.state.inputValue;\n }\n\n private handleIncrement(): void {\n if (!this.behavior || this.disabled) return;\n this.behavior.increment();\n this.inputValue = this.behavior.state.inputValue;\n }\n\n private handleDecrement(): void {\n if (!this.behavior || this.disabled) return;\n this.behavior.decrement();\n this.inputValue = this.behavior.state.inputValue;\n }\n\n override render() {\n if (!this.behavior) return nothing;\n\n const inputProps = this.behavior.getInputProps();\n const isAtMin = this.min !== undefined && this.value !== undefined && this.value <= this.min;\n const isAtMax = this.max !== undefined && this.value !== undefined && this.value >= this.max;\n\n return html`\n <div\n class=\"ds-number-input\"\n data-disabled=${this.disabled || nothing}\n data-focused=${this.isFocused || nothing}\n data-invalid=${!this.behavior.state.isValid || nothing}\n >\n ${\n this.showButtons\n ? html`\n <button\n type=\"button\"\n class=\"ds-number-input__decrement\"\n aria-label=\"Decrement\"\n tabindex=\"-1\"\n ?disabled=${this.disabled || isAtMin}\n @click=${this.handleDecrement}\n >\n <span aria-hidden=\"true\">−</span>\n </button>\n `\n : nothing\n }\n\n ${\n this.prefix\n ? html`<span class=\"ds-number-input__prefix\" aria-hidden=\"true\">${this.prefix}</span>`\n : nothing\n }\n\n <input\n type=${inputProps.type}\n inputmode=${inputProps.inputMode}\n role=${inputProps.role}\n class=\"ds-number-input__field\"\n .value=${this.inputValue}\n placeholder=${this.placeholder || nothing}\n name=${this.name || nothing}\n aria-label=${this.ariaLabel || nothing}\n aria-valuemin=${inputProps[\"aria-valuemin\"] ?? nothing}\n aria-valuemax=${inputProps[\"aria-valuemax\"] ?? nothing}\n aria-valuenow=${inputProps[\"aria-valuenow\"] ?? nothing}\n aria-disabled=${inputProps[\"aria-disabled\"] ?? nothing}\n aria-invalid=${inputProps[\"aria-invalid\"] ?? nothing}\n ?disabled=${this.disabled}\n @input=${this.handleInput}\n @blur=${this.handleBlur}\n @focus=${this.handleFocus}\n @keydown=${this.handleKeyDown}\n />\n\n ${\n this.suffix\n ? html`<span class=\"ds-number-input__suffix\" aria-hidden=\"true\">${this.suffix}</span>`\n : nothing\n }\n\n ${\n this.showButtons\n ? html`\n <button\n type=\"button\"\n class=\"ds-number-input__increment\"\n aria-label=\"Increment\"\n tabindex=\"-1\"\n ?disabled=${this.disabled || isAtMax}\n @click=${this.handleIncrement}\n >\n <span aria-hidden=\"true\">+</span>\n </button>\n `\n : nothing\n }\n </div>\n `;\n }\n}\n\ndefine(\"ds-number-input\", DsNumberInput);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-number-input\": DsNumberInput;\n }\n}\n","/**\n * FileUpload component for file selection with drag-and-drop support.\n *\n * @element ds-file-upload\n * @fires ds:change - Fired when files change with { files }\n * @fires ds:error - Fired on validation error\n *\n * @slot - Custom dropzone content\n * @slot file-list - Custom file list rendering\n *\n * @example\n * ```html\n * <!-- Basic file upload -->\n * <ds-file-upload accept=\"image/*\" max-size=\"5242880\"></ds-file-upload>\n *\n * <!-- Multiple files -->\n * <ds-file-upload multiple max-files=\"5\"></ds-file-upload>\n *\n * <!-- Custom content -->\n * <ds-file-upload>\n * <span slot=\"dropzone\">Drop your files here</span>\n * </ds-file-upload>\n * ```\n */\n\nimport {\n type FileInfo,\n type FileUploadBehavior,\n createFileUploadBehavior,\n formatBytes,\n} from \"@hypoth-ui/primitives-dom\";\nimport { html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport class DsFileUpload extends DSElement {\n /** Accepted file types (MIME types or extensions) */\n @property({ type: String, reflect: true })\n accept = \"\";\n\n /** Maximum number of files */\n @property({ type: Number, reflect: true, attribute: \"max-files\" })\n maxFiles = Number.POSITIVE_INFINITY;\n\n /** Maximum file size in bytes */\n @property({ type: Number, reflect: true, attribute: \"max-size\" })\n maxSize: number | undefined = undefined;\n\n /** Minimum file size in bytes */\n @property({ type: Number, reflect: true, attribute: \"min-size\" })\n minSize: number | undefined = undefined;\n\n /** Allow multiple files */\n @property({ type: Boolean, reflect: true })\n multiple = false;\n\n /** Disabled state */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Show file list */\n @property({ type: Boolean, attribute: \"show-file-list\" })\n showFileList = true;\n\n /** Show remove buttons in file list */\n @property({ type: Boolean, attribute: \"show-remove\" })\n showRemove = true;\n\n /** ARIA label */\n @property({ type: String, attribute: \"aria-label\" })\n override ariaLabel: string | null = null;\n\n @state()\n private behavior: FileUploadBehavior | null = null;\n\n @state()\n private files: FileInfo[] = [];\n\n @state()\n private isDragging = false;\n\n @state()\n private announcement = \"\";\n\n private inputRef: HTMLInputElement | null = null;\n private announcementTimeout: number | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.initBehavior();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.behavior?.destroy();\n this.behavior = null;\n if (this.announcementTimeout) {\n clearTimeout(this.announcementTimeout);\n }\n }\n\n private announce(message: string): void {\n // Clear previous announcement timeout\n if (this.announcementTimeout) {\n clearTimeout(this.announcementTimeout);\n }\n\n // Set the announcement\n this.announcement = message;\n\n // Clear the announcement after a delay to allow repeat announcements\n this.announcementTimeout = window.setTimeout(() => {\n this.announcement = \"\";\n }, 1000);\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (\n changedProperties.has(\"accept\") ||\n changedProperties.has(\"maxFiles\") ||\n changedProperties.has(\"maxSize\") ||\n changedProperties.has(\"minSize\") ||\n changedProperties.has(\"multiple\") ||\n changedProperties.has(\"disabled\")\n ) {\n this.initBehavior();\n }\n }\n\n private initBehavior(): void {\n // Preserve existing files\n const existingFiles = this.files;\n this.behavior?.destroy();\n\n this.behavior = createFileUploadBehavior({\n accept: this.accept,\n maxFiles: this.maxFiles,\n maxSize: this.maxSize,\n minSize: this.minSize,\n multiple: this.multiple,\n disabled: this.disabled,\n onFilesChange: (files) => {\n const previousCount = this.files.length;\n const newCount = files.length;\n this.files = files;\n\n // Announce file changes for screen readers\n if (newCount > previousCount) {\n const added = newCount - previousCount;\n const lastFile = files[files.length - 1];\n this.announce(\n added === 1 && lastFile ? `${lastFile.name} added` : `${added} files added`\n );\n }\n\n emitEvent(this, StandardEvents.CHANGE, { detail: { files } });\n },\n onError: (error) => {\n emitEvent(this, \"ds:error\", { detail: error });\n },\n });\n\n // Restore files if re-initializing\n if (existingFiles.length > 0) {\n // Files are managed by behavior, need to re-add them\n }\n }\n\n /** Public method to get current files */\n getFiles(): FileInfo[] {\n return this.files;\n }\n\n /** Public method to clear all files */\n clearFiles(): void {\n this.behavior?.clearFiles();\n }\n\n /** Public method to remove a file */\n removeFile(id: string): void {\n this.behavior?.removeFile(id);\n }\n\n private handleClick(): void {\n if (this.disabled) return;\n this.inputRef?.click();\n }\n\n private handleInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n this.behavior?.addFiles(input.files);\n // Reset input so the same file can be selected again\n input.value = \"\";\n }\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (this.behavior?.handleKeyDown(event)) {\n this.inputRef?.click();\n }\n }\n\n private handleDragEnter(event: DragEvent): void {\n this.behavior?.handleDragEnter(event);\n this.isDragging = this.behavior?.state.isDragging ?? false;\n }\n\n private handleDragLeave(event: DragEvent): void {\n this.behavior?.handleDragLeave(event);\n this.isDragging = this.behavior?.state.isDragging ?? false;\n }\n\n private handleDragOver(event: DragEvent): void {\n this.behavior?.handleDragOver(event);\n }\n\n private handleDrop(event: DragEvent): void {\n this.behavior?.handleDrop(event);\n this.isDragging = false;\n }\n\n private handleRemoveFile(id: string): void {\n const file = this.files.find((f) => f.id === id);\n if (file) {\n this.announce(`${file.name} removed`);\n }\n this.behavior?.removeFile(id);\n }\n\n private renderFileItem(file: FileInfo) {\n return html`\n <div\n class=\"ds-file-upload__file\"\n data-status=${file.status}\n >\n ${\n file.preview\n ? html`<img\n class=\"ds-file-upload__preview\"\n src=${file.preview}\n alt=${file.name}\n />`\n : html`<span class=\"ds-file-upload__file-icon\" aria-hidden=\"true\">📄</span>`\n }\n\n <div class=\"ds-file-upload__file-info\">\n <span class=\"ds-file-upload__file-name\">${file.name}</span>\n <span class=\"ds-file-upload__file-size\">${formatBytes(file.size)}</span>\n ${\n file.status === \"error\"\n ? html`<span class=\"ds-file-upload__file-error\">${file.error}</span>`\n : nothing\n }\n ${\n file.status === \"uploading\"\n ? html`<progress\n class=\"ds-file-upload__progress\"\n value=${file.progress}\n max=\"100\"\n ></progress>`\n : nothing\n }\n </div>\n\n ${\n this.showRemove && !this.disabled\n ? html`\n <button\n type=\"button\"\n class=\"ds-file-upload__remove\"\n aria-label=\"Remove ${file.name}\"\n @click=${() => this.handleRemoveFile(file.id)}\n >\n ×\n </button>\n `\n : nothing\n }\n </div>\n `;\n }\n\n override render() {\n if (!this.behavior) return nothing;\n\n const dropzoneProps = this.behavior.getDropzoneProps();\n const inputProps = this.behavior.getInputProps();\n\n return html`\n <div class=\"ds-file-upload\" data-disabled=${this.disabled || nothing}>\n <div\n class=\"ds-file-upload__dropzone\"\n role=${dropzoneProps.role}\n tabindex=${dropzoneProps.tabIndex}\n aria-label=${this.ariaLabel || dropzoneProps[\"aria-label\"]}\n aria-disabled=${dropzoneProps[\"aria-disabled\"] ?? nothing}\n data-dragging=${this.isDragging || nothing}\n @click=${this.handleClick}\n @keydown=${this.handleKeyDown}\n @dragenter=${this.handleDragEnter}\n @dragleave=${this.handleDragLeave}\n @dragover=${this.handleDragOver}\n @drop=${this.handleDrop}\n >\n <slot>\n <span class=\"ds-file-upload__icon\" aria-hidden=\"true\">📁</span>\n <span class=\"ds-file-upload__text\">\n ${\n this.isDragging\n ? \"Drop files here\"\n : this.multiple\n ? \"Drop files here or click to upload\"\n : \"Drop file here or click to upload\"\n }\n </span>\n ${\n this.accept\n ? html`<span class=\"ds-file-upload__hint\">Accepted: ${this.accept}</span>`\n : nothing\n }\n ${\n this.maxSize\n ? html`<span class=\"ds-file-upload__hint\">Max size: ${formatBytes(this.maxSize)}</span>`\n : nothing\n }\n </slot>\n\n <input\n class=\"ds-file-upload__input\"\n type=${inputProps.type}\n accept=${inputProps.accept ?? nothing}\n ?multiple=${inputProps.multiple}\n ?disabled=${inputProps.disabled}\n aria-hidden=${inputProps[\"aria-hidden\"]}\n tabindex=${inputProps.tabIndex}\n @change=${this.handleInputChange}\n .ref=${(el: HTMLInputElement | null) => {\n this.inputRef = el;\n }}\n />\n </div>\n\n ${\n this.showFileList && this.files.length > 0\n ? html`\n <div class=\"ds-file-upload__list\" role=\"list\" aria-label=\"Selected files\">\n <slot name=\"file-list\">\n ${this.files.map((file) => this.renderFileItem(file))}\n </slot>\n </div>\n `\n : nothing\n }\n\n <!-- ARIA live region for announcements -->\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n class=\"ds-file-upload__announcer\"\n >\n ${this.announcement}\n </div>\n </div>\n `;\n }\n}\n\ndefine(\"ds-file-upload\", DsFileUpload);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-file-upload\": DsFileUpload;\n }\n}\n","/**\n * TimePicker component for time selection with segmented input.\n *\n * @element ds-time-picker\n * @fires ds:change - Fired on time change with { value }\n *\n * @example\n * ```html\n * <!-- Basic time picker (12h format) -->\n * <ds-time-picker hour-format=\"12\"></ds-time-picker>\n *\n * <!-- 24h format with seconds -->\n * <ds-time-picker hour-format=\"24\" show-seconds></ds-time-picker>\n *\n * <!-- With initial value -->\n * <ds-time-picker value=\"14:30\"></ds-time-picker>\n * ```\n */\n\nimport {\n type TimePickerBehavior,\n type TimeSegment,\n type TimeValue,\n createTimePickerBehavior,\n} from \"@hypoth-ui/primitives-dom\";\nimport { html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport class DsTimePicker extends DSElement {\n /** 12-hour or 24-hour format */\n @property({ type: Number, reflect: true, attribute: \"hour-format\" })\n hourFormat: 12 | 24 = 12;\n\n /** Show seconds segment */\n @property({ type: Boolean, reflect: true, attribute: \"show-seconds\" })\n showSeconds = false;\n\n /** Time value as HH:MM or HH:MM:SS string */\n @property({ type: String, reflect: true })\n value = \"\";\n\n /** Minute step */\n @property({ type: Number, attribute: \"minute-step\" })\n minuteStep = 1;\n\n /** Second step */\n @property({ type: Number, attribute: \"second-step\" })\n secondStep = 1;\n\n /** Disabled state */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** ARIA label */\n @property({ type: String, attribute: \"aria-label\" })\n override ariaLabel: string | null = null;\n\n @state()\n private behavior: TimePickerBehavior | null = null;\n\n @state()\n private focusedSegment: TimeSegment | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.initBehavior();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.behavior?.destroy();\n this.behavior = null;\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (\n changedProperties.has(\"hourFormat\") ||\n changedProperties.has(\"showSeconds\") ||\n changedProperties.has(\"minuteStep\") ||\n changedProperties.has(\"secondStep\") ||\n changedProperties.has(\"disabled\")\n ) {\n this.initBehavior();\n }\n }\n\n private initBehavior(): void {\n this.behavior?.destroy();\n\n // Parse initial value\n let defaultValue: TimeValue = { hour: 0, minute: 0, second: 0 };\n if (this.value) {\n const parsed = this.parseTimeString(this.value);\n if (parsed) defaultValue = parsed;\n }\n\n this.behavior = createTimePickerBehavior({\n defaultValue,\n hourFormat: this.hourFormat,\n showSeconds: this.showSeconds,\n minuteStep: this.minuteStep,\n secondStep: this.secondStep,\n disabled: this.disabled,\n onValueChange: (value) => {\n this.value = this.behavior?.formatTime(value) ?? \"\";\n emitEvent(this, StandardEvents.CHANGE, { detail: { value } });\n },\n });\n }\n\n private parseTimeString(str: string): TimeValue | null {\n const match = str.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?(?:\\s*(AM|PM))?$/i);\n if (!match) return null;\n\n const hourStr = match[1];\n const minuteStr = match[2];\n if (!hourStr || !minuteStr) return null;\n\n let hour = Number.parseInt(hourStr, 10);\n const minute = Number.parseInt(minuteStr, 10);\n const second = match[3] ? Number.parseInt(match[3], 10) : 0;\n const period = match[4]?.toUpperCase() as \"AM\" | \"PM\" | undefined;\n\n if (period) {\n if (period === \"PM\" && hour !== 12) hour += 12;\n if (period === \"AM\" && hour === 12) hour = 0;\n }\n\n return { hour, minute, second };\n }\n\n private handleSegmentFocus(segment: TimeSegment): void {\n this.focusedSegment = segment;\n this.behavior?.focusSegment(segment);\n }\n\n private handleSegmentBlur(): void {\n this.focusedSegment = null;\n this.behavior?.blur();\n }\n\n private handleSegmentKeyDown(segment: TimeSegment, event: KeyboardEvent): void {\n this.behavior?.handleSegmentKeyDown(segment, event);\n this.requestUpdate();\n }\n\n private renderSegment(segment: TimeSegment, _label: string) {\n if (!this.behavior) return nothing;\n\n const props = this.behavior.getSegmentProps(segment);\n const displayValue = this.behavior.getSegmentDisplayValue(segment);\n const isFocused = this.focusedSegment === segment;\n\n return html`\n <span\n class=\"ds-time-picker__segment\"\n role=${props.role}\n tabindex=${props.tabIndex}\n aria-valuemin=${props[\"aria-valuemin\"]}\n aria-valuemax=${props[\"aria-valuemax\"]}\n aria-valuenow=${props[\"aria-valuenow\"]}\n aria-valuetext=${props[\"aria-valuetext\"]}\n aria-label=${props[\"aria-label\"]}\n aria-disabled=${props[\"aria-disabled\"] ?? nothing}\n data-segment=${segment}\n data-focused=${isFocused || nothing}\n @focus=${() => this.handleSegmentFocus(segment)}\n @blur=${this.handleSegmentBlur}\n @keydown=${(e: KeyboardEvent) => this.handleSegmentKeyDown(segment, e)}\n >\n ${displayValue}\n </span>\n `;\n }\n\n override render() {\n if (!this.behavior) return nothing;\n\n return html`\n <div\n class=\"ds-time-picker\"\n role=\"group\"\n aria-label=${this.ariaLabel || \"Time picker\"}\n data-disabled=${this.disabled || nothing}\n >\n ${this.renderSegment(\"hour\", \"Hour\")}\n <span class=\"ds-time-picker__separator\" aria-hidden=\"true\">:</span>\n ${this.renderSegment(\"minute\", \"Minute\")}\n ${\n this.showSeconds\n ? html`\n <span class=\"ds-time-picker__separator\" aria-hidden=\"true\">:</span>\n ${this.renderSegment(\"second\", \"Second\")}\n `\n : nothing\n }\n ${\n this.hourFormat === 12\n ? html`\n <span class=\"ds-time-picker__separator\" aria-hidden=\"true\"> </span>\n ${this.renderSegment(\"period\", \"AM/PM\")}\n `\n : nothing\n }\n </div>\n `;\n }\n}\n\ndefine(\"ds-time-picker\", DsTimePicker);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-time-picker\": DsTimePicker;\n }\n}\n","/**\n * PinInput component for PIN/OTP entry with auto-advance.\n *\n * @element ds-pin-input\n * @fires ds:change - Fired on value change with { value }\n * @fires ds:complete - Fired when all digits entered\n *\n * @example\n * ```html\n * <!-- 6-digit PIN -->\n * <ds-pin-input length=\"6\"></ds-pin-input>\n *\n * <!-- 4-digit with initial value -->\n * <ds-pin-input length=\"4\" value=\"1234\"></ds-pin-input>\n *\n * <!-- Alphanumeric code -->\n * <ds-pin-input length=\"6\" alphanumeric></ds-pin-input>\n * ```\n */\n\nimport { type PinInputBehavior, createPinInputBehavior } from \"@hypoth-ui/primitives-dom\";\nimport { html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport class DsPinInput extends DSElement {\n /** Number of input fields */\n @property({ type: Number, reflect: true })\n length = 6;\n\n /** Current value */\n @property({ type: String, reflect: true })\n value = \"\";\n\n /** Allow alphanumeric characters */\n @property({ type: Boolean, reflect: true })\n alphanumeric = false;\n\n /** Disabled state */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Mask input (like password) */\n @property({ type: Boolean, reflect: true })\n mask = false;\n\n /** ARIA label */\n @property({ type: String, attribute: \"aria-label\" })\n override ariaLabel: string | null = null;\n\n @state()\n private behavior: PinInputBehavior | null = null;\n\n @state()\n private focusedIndex: number | null = null;\n\n private inputRefs: (HTMLInputElement | null)[] = [];\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.initBehavior();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.behavior?.destroy();\n this.behavior = null;\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (\n changedProperties.has(\"length\") ||\n changedProperties.has(\"alphanumeric\") ||\n changedProperties.has(\"disabled\")\n ) {\n this.initBehavior();\n }\n }\n\n private initBehavior(): void {\n this.behavior?.destroy();\n\n this.behavior = createPinInputBehavior({\n length: this.length,\n defaultValue: this.value,\n alphanumeric: this.alphanumeric,\n disabled: this.disabled,\n onValueChange: (value) => {\n this.value = value;\n emitEvent(this, StandardEvents.CHANGE, { detail: { value } });\n },\n onComplete: (value) => {\n emitEvent(this, \"ds:complete\", { detail: { value } });\n },\n });\n\n this.inputRefs = new Array(this.length).fill(null);\n }\n\n /** Public method to clear the input */\n clear(): void {\n this.behavior?.clear();\n this.focusInput(0);\n }\n\n /** Public method to set value programmatically */\n setValue(value: string): void {\n this.behavior?.setValue(value);\n }\n\n private focusInput(index: number): void {\n const input = this.inputRefs[index];\n if (input) {\n input.focus();\n input.select();\n }\n }\n\n private handleInput(index: number, event: InputEvent): void {\n if (!this.behavior) return;\n\n const input = event.target as HTMLInputElement;\n const char = input.value.slice(-1); // Get last character\n\n if (char) {\n this.behavior.input(index, char);\n\n // Auto-advance to next input\n const nextIndex = this.behavior.state.focusedIndex;\n if (nextIndex !== null && nextIndex !== index) {\n this.focusInput(nextIndex);\n }\n }\n\n // Clear input to prevent accumulation\n input.value = this.behavior.getValueAt(index);\n }\n\n private handleKeyDown(index: number, event: KeyboardEvent): void {\n if (!this.behavior) return;\n\n switch (event.key) {\n case \"Backspace\": {\n event.preventDefault();\n this.behavior.backspace(index);\n const prevIndex = this.behavior.state.focusedIndex;\n if (prevIndex !== null && prevIndex !== index) {\n this.focusInput(prevIndex);\n }\n break;\n }\n case \"ArrowLeft\":\n event.preventDefault();\n this.behavior.focusPrev();\n if (this.behavior.state.focusedIndex !== null) {\n this.focusInput(this.behavior.state.focusedIndex);\n }\n break;\n case \"ArrowRight\":\n event.preventDefault();\n this.behavior.focusNext();\n if (this.behavior.state.focusedIndex !== null) {\n this.focusInput(this.behavior.state.focusedIndex);\n }\n break;\n case \"Delete\": {\n event.preventDefault();\n // Clear current position without moving\n const chars = this.behavior.state.value.split(\"\");\n chars[index] = \" \";\n this.behavior.setValue(chars.join(\"\"));\n break;\n }\n }\n }\n\n private handlePaste(event: ClipboardEvent): void {\n event.preventDefault();\n const pastedText = event.clipboardData?.getData(\"text\") ?? \"\";\n if (pastedText && this.behavior) {\n this.behavior.paste(pastedText);\n // Focus last filled position\n const focusedIdx = this.behavior.state.focusedIndex;\n if (focusedIdx !== null) {\n this.focusInput(focusedIdx);\n }\n }\n }\n\n private handleFocus(index: number): void {\n this.focusedIndex = index;\n this.behavior?.focus(index);\n }\n\n private handleBlur(): void {\n this.focusedIndex = null;\n }\n\n override render() {\n if (!this.behavior) return nothing;\n\n const containerProps = this.behavior.getContainerProps();\n const inputs = [];\n\n for (let i = 0; i < this.length; i++) {\n const inputProps = this.behavior.getInputProps(i);\n const value = this.behavior.getValueAt(i);\n const isFocused = this.focusedIndex === i;\n\n inputs.push(html`\n <input\n class=\"ds-pin-input__field\"\n type=${this.mask ? \"password\" : inputProps.type}\n inputmode=${inputProps.inputMode}\n maxlength=${inputProps.maxLength}\n autocomplete=${inputProps.autoComplete}\n aria-label=${inputProps[\"aria-label\"]}\n tabindex=${inputProps.tabIndex}\n .value=${value}\n ?disabled=${this.disabled}\n data-index=${i}\n data-focused=${isFocused || nothing}\n data-filled=${value ? true : nothing}\n @input=${(e: InputEvent) => this.handleInput(i, e)}\n @keydown=${(e: KeyboardEvent) => this.handleKeyDown(i, e)}\n @paste=${this.handlePaste}\n @focus=${() => this.handleFocus(i)}\n @blur=${this.handleBlur}\n .ref=${(el: HTMLInputElement | null) => {\n this.inputRefs[i] = el;\n }}\n />\n `);\n }\n\n return html`\n <div\n class=\"ds-pin-input\"\n role=${containerProps.role}\n aria-label=${this.ariaLabel || containerProps[\"aria-label\"]}\n data-disabled=${this.disabled || nothing}\n >\n ${inputs}\n </div>\n `;\n }\n}\n\ndefine(\"ds-pin-input\", DsPinInput);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-pin-input\": DsPinInput;\n }\n}\n","import { html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport type CalendarState = \"open\" | \"closed\";\n\n/**\n * DatePicker calendar grid with navigation.\n *\n * @element ds-date-picker-calendar\n *\n * @slot header - Custom header content\n *\n * @fires ds:date-select - Fired when a date is selected\n * @fires ds:navigate - Fired when month/year navigation occurs\n *\n * @example\n * ```html\n * <ds-date-picker-calendar\n * viewing-month=\"2026-01\"\n * selected-date=\"2026-01-15\"\n * min-date=\"2026-01-01\"\n * ></ds-date-picker-calendar>\n * ```\n */\nexport class DsDatePickerCalendar extends DSElement {\n /** Current viewing month (YYYY-MM format) */\n @property({ type: String, attribute: \"viewing-month\" })\n viewingMonth = \"\";\n\n /** Selected date (ISO format) */\n @property({ type: String, attribute: \"selected-date\" })\n selectedDate = \"\";\n\n /** Selected range start (ISO format) */\n @property({ type: String, attribute: \"range-start\" })\n rangeStart = \"\";\n\n /** Selected range end (ISO format) */\n @property({ type: String, attribute: \"range-end\" })\n rangeEnd = \"\";\n\n /** Minimum selectable date (ISO format) */\n @property({ type: String, attribute: \"min-date\" })\n minDate = \"\";\n\n /** Maximum selectable date (ISO format) */\n @property({ type: String, attribute: \"max-date\" })\n maxDate = \"\";\n\n /** Locale for formatting */\n @property({ type: String })\n locale = \"en-US\";\n\n /** First day of week (0=Sunday, 1=Monday, etc.) */\n @property({ type: Number, attribute: \"first-day-of-week\" })\n firstDayOfWeek: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 0;\n\n /** Animation state */\n @property({ type: String, reflect: true, attribute: \"data-state\" })\n dataState: CalendarState = \"closed\";\n\n /** Whether in range selection mode */\n @property({ type: Boolean, reflect: true })\n range = false;\n\n @state()\n private focusedDate = \"\";\n\n private monthFormatter: Intl.DateTimeFormat | null = null;\n private weekdayFormatter: Intl.DateTimeFormat | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n this.setAttribute(\"role\", \"application\");\n\n // Generate ID if not set\n if (!this.id) {\n this.id = `date-picker-calendar-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n // Initialize viewing month to current if not set\n if (!this.viewingMonth) {\n const now = new Date();\n this.viewingMonth = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}`;\n }\n\n // Initialize focused date\n this.focusedDate = this.selectedDate || this.getTodayIso();\n\n // Initialize formatters\n this.updateFormatters();\n\n // Listen for keyboard navigation\n this.addEventListener(\"keydown\", this.handleKeyDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(\"keydown\", this.handleKeyDown);\n }\n\n private updateFormatters(): void {\n this.monthFormatter = new Intl.DateTimeFormat(this.locale, {\n month: \"long\",\n year: \"numeric\",\n });\n this.weekdayFormatter = new Intl.DateTimeFormat(this.locale, {\n weekday: \"short\",\n });\n }\n\n private getTodayIso(): string {\n return new Date().toISOString().split(\"T\")[0] ?? \"\";\n }\n\n private parseDate(dateStr: string): Date | null {\n if (!dateStr) return null;\n const parsed = new Date(dateStr);\n if (Number.isNaN(parsed.getTime())) return null;\n return parsed;\n }\n\n private formatIso(date: Date): string {\n return date.toISOString().split(\"T\")[0] ?? \"\";\n }\n\n private getViewingDate(): Date {\n const [year, month] = this.viewingMonth.split(\"-\").map(Number);\n return new Date(year ?? 2026, (month ?? 1) - 1, 1);\n }\n\n private getWeekdayNames(): string[] {\n if (!this.weekdayFormatter) return [];\n const names: string[] = [];\n const date = new Date(2024, 0, this.firstDayOfWeek);\n for (let i = 0; i < 7; i++) {\n const d = new Date(date);\n d.setDate(d.getDate() + i);\n names.push(this.weekdayFormatter.format(d));\n }\n return names;\n }\n\n private getMonthDays(): Date[] {\n const viewDate = this.getViewingDate();\n const days: Date[] = [];\n\n // Get first day of month\n const monthStart = new Date(viewDate.getFullYear(), viewDate.getMonth(), 1);\n const monthEnd = new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 0);\n\n // Get calendar start (may include days from previous month)\n const calendarStart = new Date(monthStart);\n const dayOffset = (calendarStart.getDay() - this.firstDayOfWeek + 7) % 7;\n calendarStart.setDate(calendarStart.getDate() - dayOffset);\n\n // Get calendar end (may include days from next month)\n const calendarEnd = new Date(monthEnd);\n const endOffset = 6 - ((calendarEnd.getDay() - this.firstDayOfWeek + 7) % 7);\n calendarEnd.setDate(calendarEnd.getDate() + endOffset);\n\n // Generate all days\n const current = new Date(calendarStart);\n while (current <= calendarEnd) {\n days.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n\n return days;\n }\n\n private isDateDisabled(date: Date): boolean {\n const isoDate = this.formatIso(date);\n if (this.minDate && isoDate < this.minDate) return true;\n if (this.maxDate && isoDate > this.maxDate) return true;\n return false;\n }\n\n private isDateSelected(date: Date): boolean {\n const isoDate = this.formatIso(date);\n if (this.range) {\n return isoDate === this.rangeStart || isoDate === this.rangeEnd;\n }\n return isoDate === this.selectedDate;\n }\n\n private isDateInRange(date: Date): boolean {\n if (!this.range || !this.rangeStart || !this.rangeEnd) return false;\n const isoDate = this.formatIso(date);\n return isoDate >= this.rangeStart && isoDate <= this.rangeEnd;\n }\n\n private isDateToday(date: Date): boolean {\n return this.formatIso(date) === this.getTodayIso();\n }\n\n private isDateInCurrentMonth(date: Date): boolean {\n const viewDate = this.getViewingDate();\n return date.getMonth() === viewDate.getMonth() && date.getFullYear() === viewDate.getFullYear();\n }\n\n private handleDateClick(date: Date): void {\n if (this.isDateDisabled(date)) return;\n\n const isoDate = this.formatIso(date);\n this.focusedDate = isoDate;\n\n this.dispatchEvent(\n new CustomEvent(\"ds:date-select\", {\n bubbles: true,\n composed: true,\n detail: { date: isoDate },\n })\n );\n }\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n const focused = this.parseDate(this.focusedDate);\n if (!focused) return;\n\n let newFocused: Date | null = null;\n\n switch (event.key) {\n case \"ArrowLeft\":\n event.preventDefault();\n newFocused = new Date(focused);\n newFocused.setDate(newFocused.getDate() - 1);\n break;\n case \"ArrowRight\":\n event.preventDefault();\n newFocused = new Date(focused);\n newFocused.setDate(newFocused.getDate() + 1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n newFocused = new Date(focused);\n newFocused.setDate(newFocused.getDate() - 7);\n break;\n case \"ArrowDown\":\n event.preventDefault();\n newFocused = new Date(focused);\n newFocused.setDate(newFocused.getDate() + 7);\n break;\n case \"Home\":\n event.preventDefault();\n newFocused = new Date(focused);\n newFocused.setDate(newFocused.getDate() - newFocused.getDay() + this.firstDayOfWeek);\n break;\n case \"End\":\n event.preventDefault();\n newFocused = new Date(focused);\n newFocused.setDate(newFocused.getDate() + (6 - newFocused.getDay() + this.firstDayOfWeek));\n break;\n case \"PageUp\":\n event.preventDefault();\n if (event.shiftKey) {\n this.navigateYear(-1);\n } else {\n this.navigateMonth(-1);\n }\n return;\n case \"PageDown\":\n event.preventDefault();\n if (event.shiftKey) {\n this.navigateYear(1);\n } else {\n this.navigateMonth(1);\n }\n return;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n this.handleDateClick(focused);\n return;\n }\n\n if (newFocused) {\n this.focusedDate = this.formatIso(newFocused);\n // Update viewing month if needed\n const newMonth = `${newFocused.getFullYear()}-${String(newFocused.getMonth() + 1).padStart(2, \"0\")}`;\n if (newMonth !== this.viewingMonth) {\n this.viewingMonth = newMonth;\n }\n this.requestUpdate();\n }\n };\n\n /**\n * Navigate to previous/next month.\n */\n public navigateMonth(delta: number): void {\n const current = this.getViewingDate();\n current.setMonth(current.getMonth() + delta);\n this.viewingMonth = `${current.getFullYear()}-${String(current.getMonth() + 1).padStart(2, \"0\")}`;\n this.dispatchEvent(\n new CustomEvent(\"ds:navigate\", {\n bubbles: true,\n composed: true,\n detail: { viewingMonth: this.viewingMonth },\n })\n );\n }\n\n /**\n * Navigate to previous/next year.\n */\n public navigateYear(delta: number): void {\n const current = this.getViewingDate();\n current.setFullYear(current.getFullYear() + delta);\n this.viewingMonth = `${current.getFullYear()}-${String(current.getMonth() + 1).padStart(2, \"0\")}`;\n this.dispatchEvent(\n new CustomEvent(\"ds:navigate\", {\n bubbles: true,\n composed: true,\n detail: { viewingMonth: this.viewingMonth },\n })\n );\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"locale\")) {\n this.updateFormatters();\n }\n\n if (changedProperties.has(\"selectedDate\") && this.selectedDate) {\n this.focusedDate = this.selectedDate;\n }\n }\n\n override render() {\n const viewDate = this.getViewingDate();\n const monthLabel = this.monthFormatter?.format(viewDate) ?? \"\";\n const weekdays = this.getWeekdayNames();\n const days = this.getMonthDays();\n\n return html`\n <div class=\"ds-date-picker-calendar\" part=\"container\">\n <!-- Header with navigation -->\n <div class=\"ds-date-picker-calendar-header\" part=\"header\">\n <button\n type=\"button\"\n class=\"ds-date-picker-nav-button\"\n part=\"prev-year\"\n aria-label=\"Previous year\"\n @click=${() => this.navigateYear(-1)}\n >\n <slot name=\"prev-year-icon\">«</slot>\n </button>\n <button\n type=\"button\"\n class=\"ds-date-picker-nav-button\"\n part=\"prev-month\"\n aria-label=\"Previous month\"\n @click=${() => this.navigateMonth(-1)}\n >\n <slot name=\"prev-month-icon\">‹</slot>\n </button>\n <span class=\"ds-date-picker-month-label\" part=\"month-label\">${monthLabel}</span>\n <button\n type=\"button\"\n class=\"ds-date-picker-nav-button\"\n part=\"next-month\"\n aria-label=\"Next month\"\n @click=${() => this.navigateMonth(1)}\n >\n <slot name=\"next-month-icon\">›</slot>\n </button>\n <button\n type=\"button\"\n class=\"ds-date-picker-nav-button\"\n part=\"next-year\"\n aria-label=\"Next year\"\n @click=${() => this.navigateYear(1)}\n >\n <slot name=\"next-year-icon\">»</slot>\n </button>\n </div>\n\n <!-- Calendar grid -->\n <table class=\"ds-date-picker-grid\" part=\"grid\" role=\"grid\" aria-label=\"${monthLabel}\">\n <thead>\n <tr class=\"ds-date-picker-weekdays\" part=\"weekdays\">\n ${weekdays.map(\n (day) => html`\n <th scope=\"col\" class=\"ds-date-picker-weekday\" part=\"weekday\" abbr=\"${day}\">\n ${day}\n </th>\n `\n )}\n </tr>\n </thead>\n <tbody>\n ${this.renderWeeks(days)}\n </tbody>\n </table>\n </div>\n `;\n }\n\n private renderWeeks(days: Date[]) {\n const weeks: Date[][] = [];\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks.map(\n (week) => html`\n <tr class=\"ds-date-picker-week\" part=\"week\">\n ${week.map((day) => this.renderDay(day))}\n </tr>\n `\n );\n }\n\n private renderDay(date: Date) {\n const isoDate = this.formatIso(date);\n const isDisabled = this.isDateDisabled(date);\n const isSelected = this.isDateSelected(date);\n const isInRange = this.isDateInRange(date);\n const isToday = this.isDateToday(date);\n const isCurrentMonth = this.isDateInCurrentMonth(date);\n const isFocused = isoDate === this.focusedDate;\n\n return html`\n <td\n class=\"ds-date-picker-day\"\n part=\"day\"\n role=\"gridcell\"\n aria-selected=\"${isSelected}\"\n aria-disabled=\"${isDisabled || nothing}\"\n data-date=\"${isoDate}\"\n data-selected=\"${isSelected || nothing}\"\n data-in-range=\"${isInRange || nothing}\"\n data-today=\"${isToday || nothing}\"\n data-current-month=\"${isCurrentMonth || nothing}\"\n data-focused=\"${isFocused || nothing}\"\n tabindex=\"${isFocused ? 0 : -1}\"\n @click=${() => this.handleDateClick(date)}\n >\n <span class=\"ds-date-picker-day-number\" part=\"day-number\">${date.getDate()}</span>\n </td>\n `;\n }\n}\n\ndefine(\"ds-date-picker-calendar\", DsDatePickerCalendar);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-date-picker-calendar\": DsDatePickerCalendar;\n }\n}\n","import {\n type AnchorPosition,\n type DismissableLayer,\n type Placement,\n type Presence,\n createAnchorPosition,\n createDismissableLayer,\n createPresence,\n prefersReducedMotion,\n} from \"@hypoth-ui/primitives-dom\";\nimport { html } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\n\n// Import child components\nimport type { DsDatePickerCalendar } from \"./date-picker-calendar.js\";\nimport \"./date-picker-calendar.js\";\nimport {\n type DateParseResult,\n formatTypedDate,\n getDateFormatPlaceholder,\n parseTypedDate,\n validateTypedDate,\n} from \"./date-utils.js\";\n\nexport type DatePickerMode = \"single\" | \"range\";\n\n/**\n * DatePicker component with calendar dropdown.\n *\n * Implements WAI-ARIA DatePicker pattern with:\n * - Arrow key navigation within calendar grid\n * - Page Up/Down for month navigation\n * - Enter/Space to select date\n * - Escape to close\n *\n * @element ds-date-picker\n *\n * @slot trigger - Trigger element (button or input)\n * @slot - Calendar content (ds-date-picker-calendar)\n *\n * @fires ds:open - Fired when calendar opens\n * @fires ds:close - Fired when calendar closes\n * @fires ds:change - Fired when date changes (detail: { date } or { start, end })\n *\n * @example\n * ```html\n * <ds-date-picker value=\"2026-01-15\">\n * <button slot=\"trigger\">Select date</button>\n * <ds-date-picker-calendar></ds-date-picker-calendar>\n * </ds-date-picker>\n * ```\n */\nexport class DsDatePicker extends DSElement {\n /** Whether the calendar is open */\n @property({ type: Boolean, reflect: true })\n open = false;\n\n /** Selection mode: single date or date range */\n @property({ type: String, reflect: true })\n mode: DatePickerMode = \"single\";\n\n /** Selected date in ISO format (YYYY-MM-DD) */\n @property({ type: String, reflect: true })\n value = \"\";\n\n /** Range start date in ISO format */\n @property({ type: String, attribute: \"range-start\" })\n rangeStart = \"\";\n\n /** Range end date in ISO format */\n @property({ type: String, attribute: \"range-end\" })\n rangeEnd = \"\";\n\n /** Minimum selectable date in ISO format */\n @property({ type: String, attribute: \"min-date\" })\n minDate = \"\";\n\n /** Maximum selectable date in ISO format */\n @property({ type: String, attribute: \"max-date\" })\n maxDate = \"\";\n\n /** Locale for date formatting */\n @property({ type: String })\n locale = \"en-US\";\n\n /** First day of week (0=Sunday, 1=Monday) */\n @property({ type: Number, attribute: \"first-day-of-week\" })\n firstDayOfWeek: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 0;\n\n /** Placement relative to trigger */\n @property({ type: String, reflect: true })\n placement: Placement = \"bottom-start\";\n\n /** Offset distance from trigger in pixels */\n @property({ type: Number })\n offset = 4;\n\n /** Whether to flip placement when near viewport edge */\n @property({ type: Boolean })\n flip = true;\n\n /** Whether to animate open/close transitions */\n @property({ type: Boolean })\n animated = true;\n\n /** Whether the date picker is disabled */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Whether the date picker is read-only */\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n /** Whether to allow typed date input (when using input trigger) */\n @property({ type: Boolean, attribute: \"typed-input\" })\n typedInput = false;\n\n /** Current text value of the input (for typed input mode) */\n @state()\n inputValue = \"\";\n\n /** Current validation error message */\n @state()\n inputError: string | null = null;\n\n private anchorPosition: AnchorPosition | null = null;\n private dismissLayer: DismissableLayer | null = null;\n private presence: Presence | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private scrollHandler: (() => void) | null = null;\n private isSelectingRange = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Listen for trigger interactions\n this.addEventListener(\"click\", this.handleTriggerClick);\n this.addEventListener(\"keydown\", this.handleTriggerKeyDown);\n\n // Listen for date selection from calendar\n this.addEventListener(\"ds:date-select\", this.handleDateSelect);\n\n // Listen for input events (typed input mode)\n this.addEventListener(\"input\", this.handleTypedInput);\n this.addEventListener(\"blur\", this.handleInputBlur, true);\n\n // Initialize input value from date value\n if (this.value) {\n this.inputValue = formatTypedDate(this.value, this.locale);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(\"click\", this.handleTriggerClick);\n this.removeEventListener(\"keydown\", this.handleTriggerKeyDown);\n this.removeEventListener(\"ds:date-select\", this.handleDateSelect);\n this.removeEventListener(\"input\", this.handleTypedInput);\n this.removeEventListener(\"blur\", this.handleInputBlur, true);\n this.cleanup();\n }\n\n /**\n * Opens the calendar.\n */\n public show(): void {\n if (this.open || this.disabled) return;\n this.open = true;\n emitEvent(this, StandardEvents.OPEN);\n }\n\n /**\n * Closes the calendar.\n */\n public close(): void {\n if (!this.open) return;\n\n const calendar = this.querySelector(\"ds-date-picker-calendar\") as DsDatePickerCalendar | null;\n\n if (this.animated && calendar && !prefersReducedMotion()) {\n this.dismissLayer?.deactivate();\n this.dismissLayer = null;\n\n this.presence = createPresence({\n onExitComplete: () => {\n this.completeClose();\n },\n });\n this.presence.hide(calendar);\n } else {\n this.cleanup();\n this.open = false;\n emitEvent(this, StandardEvents.CLOSE);\n this.getTriggerElement()?.focus();\n }\n }\n\n private completeClose(): void {\n this.cleanup();\n this.open = false;\n emitEvent(this, StandardEvents.CLOSE);\n this.getTriggerElement()?.focus();\n }\n\n /**\n * Toggles the calendar.\n */\n public toggle(): void {\n if (this.open) {\n this.close();\n } else {\n this.show();\n }\n }\n\n /**\n * Sets the selected date programmatically.\n */\n public setDate(date: string): void {\n if (this.disabled || this.readonly) return;\n this.value = date;\n emitEvent(this, StandardEvents.CHANGE, { detail: { date } });\n }\n\n /**\n * Sets the date range programmatically.\n */\n public setRange(start: string, end: string): void {\n if (this.disabled || this.readonly || this.mode !== \"range\") return;\n this.rangeStart = start;\n this.rangeEnd = end;\n emitEvent(this, StandardEvents.CHANGE, { detail: { start, end } });\n }\n\n /**\n * Clears the selected date(s).\n */\n public clear(): void {\n if (this.disabled || this.readonly) return;\n this.value = \"\";\n this.rangeStart = \"\";\n this.rangeEnd = \"\";\n this.isSelectingRange = false;\n emitEvent(this, StandardEvents.CHANGE, {\n detail: this.mode === \"range\" ? { start: \"\", end: \"\" } : { date: \"\" },\n });\n }\n\n private getTriggerElement(): HTMLElement | null {\n const triggerSlot = this.querySelector('[slot=\"trigger\"]');\n return triggerSlot as HTMLElement | null;\n }\n\n private handleTriggerClick = (event: Event): void => {\n const target = event.target as HTMLElement;\n const trigger = target.closest('[slot=\"trigger\"]');\n\n if (trigger && this.contains(trigger)) {\n event.preventDefault();\n if (!this.disabled) {\n this.toggle();\n }\n }\n };\n\n private handleTriggerKeyDown = (event: KeyboardEvent): void => {\n const target = event.target as HTMLElement;\n const trigger = target.closest('[slot=\"trigger\"]');\n\n if (!trigger || !this.contains(trigger)) return;\n if (this.disabled) return;\n\n switch (event.key) {\n case \"Enter\":\n case \" \":\n event.preventDefault();\n this.toggle();\n break;\n case \"ArrowDown\":\n event.preventDefault();\n if (!this.open) this.show();\n break;\n }\n };\n\n private handleDateSelect = (event: Event): void => {\n const customEvent = event as CustomEvent<{ date: string }>;\n const selectedDate = customEvent.detail.date;\n\n if (this.mode === \"single\") {\n this.value = selectedDate;\n emitEvent(this, StandardEvents.CHANGE, { detail: { date: selectedDate } });\n this.close();\n } else {\n // Range mode\n if (!this.isSelectingRange || !this.rangeStart) {\n // Start new range\n this.rangeStart = selectedDate;\n this.rangeEnd = \"\";\n this.isSelectingRange = true;\n } else {\n // Complete range\n if (selectedDate < this.rangeStart) {\n this.rangeEnd = this.rangeStart;\n this.rangeStart = selectedDate;\n } else {\n this.rangeEnd = selectedDate;\n }\n this.isSelectingRange = false;\n emitEvent(this, StandardEvents.CHANGE, {\n detail: { start: this.rangeStart, end: this.rangeEnd },\n });\n this.close();\n }\n }\n };\n\n private handleDismiss = (): void => {\n this.close();\n };\n\n /**\n * Handles typed input events.\n */\n private handleTypedInput = (event: Event): void => {\n if (!this.typedInput) return;\n\n const target = event.target as HTMLInputElement;\n if (target.tagName !== \"INPUT\") return;\n if (!this.contains(target)) return;\n\n this.inputValue = target.value;\n this.inputError = null;\n\n // Parse on each keystroke for real-time feedback\n const result = parseTypedDate(target.value, this.locale);\n if (result.valid && result.date) {\n // Validate against min/max\n const validation = validateTypedDate(result.date, this.minDate, this.maxDate, this.locale);\n if (validation.valid) {\n this.inputError = null;\n } else {\n this.inputError = validation.error;\n }\n }\n };\n\n /**\n * Handles input blur to finalize typed input.\n */\n private handleInputBlur = (event: Event): void => {\n if (!this.typedInput) return;\n\n const target = event.target as HTMLInputElement;\n if (target.tagName !== \"INPUT\") return;\n if (!this.contains(target)) return;\n\n this.commitTypedInput();\n };\n\n /**\n * Commits the typed input value as the selected date.\n */\n private commitTypedInput(): void {\n if (!this.inputValue) {\n // Clear the date if input is empty\n if (this.value) {\n this.value = \"\";\n this.inputError = null;\n emitEvent(this, StandardEvents.CHANGE, { detail: { date: \"\" } });\n }\n return;\n }\n\n const result = parseTypedDate(this.inputValue, this.locale);\n if (!result.valid || !result.date) {\n this.inputError = result.error;\n return;\n }\n\n // Validate against min/max\n const validation = validateTypedDate(result.date, this.minDate, this.maxDate, this.locale);\n if (!validation.valid) {\n this.inputError = validation.error;\n return;\n }\n\n // Commit the value\n this.inputError = null;\n this.value = result.date;\n this.inputValue = formatTypedDate(result.date, this.locale);\n emitEvent(this, StandardEvents.CHANGE, { detail: { date: result.date } });\n }\n\n /**\n * Gets the expected input format placeholder.\n */\n public getFormatPlaceholder(): string {\n return getDateFormatPlaceholder(this.locale);\n }\n\n /**\n * Gets the current validation error.\n */\n public getValidationError(): string | null {\n return this.inputError;\n }\n\n /**\n * Parses a typed date string and returns the validation result.\n */\n public parseInput(input: string): DateParseResult {\n const result = parseTypedDate(input, this.locale);\n if (result.valid && result.date) {\n return validateTypedDate(result.date, this.minDate, this.maxDate, this.locale);\n }\n return result;\n }\n\n private setupPositioning(): void {\n const trigger = this.getTriggerElement();\n const calendar = this.querySelector(\"ds-date-picker-calendar\") as HTMLElement | null;\n\n if (!trigger || !calendar) return;\n\n this.anchorPosition = createAnchorPosition({\n anchor: trigger,\n floating: calendar,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n onPositionChange: (pos) => {\n calendar.setAttribute(\"data-placement\", pos.placement);\n },\n });\n\n this.resizeObserver = new ResizeObserver(() => {\n this.anchorPosition?.update();\n });\n this.resizeObserver.observe(trigger);\n this.resizeObserver.observe(calendar);\n\n this.scrollHandler = () => {\n this.anchorPosition?.update();\n };\n window.addEventListener(\"scroll\", this.scrollHandler, { passive: true });\n window.addEventListener(\"resize\", this.scrollHandler, { passive: true });\n }\n\n private setupDismissLayer(): void {\n const calendar = this.querySelector(\"ds-date-picker-calendar\") as HTMLElement | null;\n const trigger = this.getTriggerElement();\n\n if (!calendar) return;\n\n this.dismissLayer = createDismissableLayer({\n container: calendar,\n excludeElements: trigger ? [trigger] : [],\n onDismiss: this.handleDismiss,\n closeOnEscape: true,\n closeOnOutsideClick: true,\n });\n this.dismissLayer.activate();\n }\n\n private cleanup(): void {\n this.anchorPosition?.destroy();\n this.anchorPosition = null;\n\n this.dismissLayer?.deactivate();\n this.dismissLayer = null;\n\n this.presence?.destroy();\n this.presence = null;\n\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n\n if (this.scrollHandler) {\n window.removeEventListener(\"scroll\", this.scrollHandler);\n window.removeEventListener(\"resize\", this.scrollHandler);\n this.scrollHandler = null;\n }\n }\n\n override async updated(changedProperties: Map<string, unknown>): Promise<void> {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"open\")) {\n const calendar = this.querySelector(\"ds-date-picker-calendar\") as DsDatePickerCalendar | null;\n\n if (this.open) {\n // Update calendar props\n if (calendar) {\n calendar.removeAttribute(\"hidden\");\n calendar.dataState = \"open\";\n calendar.range = this.mode === \"range\";\n calendar.locale = this.locale;\n calendar.firstDayOfWeek = this.firstDayOfWeek;\n calendar.minDate = this.minDate;\n calendar.maxDate = this.maxDate;\n calendar.selectedDate = this.value;\n calendar.rangeStart = this.rangeStart;\n calendar.rangeEnd = this.rangeEnd;\n\n // Set initial viewing month\n const initialDate =\n this.value || this.rangeStart || new Date().toISOString().split(\"T\")[0];\n if (initialDate) {\n const date = new Date(initialDate);\n calendar.viewingMonth = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}`;\n }\n }\n\n await this.updateComplete;\n\n this.setupPositioning();\n this.setupDismissLayer();\n\n // Focus the calendar\n calendar?.focus();\n } else {\n if (calendar) {\n calendar.dataState = \"closed\";\n calendar.setAttribute(\"hidden\", \"\");\n }\n }\n }\n\n // Sync typed input value when value changes externally\n if (changedProperties.has(\"value\") && this.typedInput) {\n // Only update inputValue if it wasn't set from typed input\n const expectedInput = formatTypedDate(this.value, this.locale);\n if (this.inputValue !== expectedInput) {\n this.inputValue = expectedInput;\n this.inputError = null;\n }\n }\n\n // Sync props to calendar when open\n if (this.open) {\n const calendar = this.querySelector(\"ds-date-picker-calendar\") as DsDatePickerCalendar | null;\n if (calendar) {\n if (changedProperties.has(\"value\")) {\n calendar.selectedDate = this.value;\n }\n if (changedProperties.has(\"rangeStart\")) {\n calendar.rangeStart = this.rangeStart;\n }\n if (changedProperties.has(\"rangeEnd\")) {\n calendar.rangeEnd = this.rangeEnd;\n }\n if (changedProperties.has(\"locale\")) {\n calendar.locale = this.locale;\n }\n if (changedProperties.has(\"firstDayOfWeek\")) {\n calendar.firstDayOfWeek = this.firstDayOfWeek;\n }\n if (changedProperties.has(\"minDate\")) {\n calendar.minDate = this.minDate;\n }\n if (changedProperties.has(\"maxDate\")) {\n calendar.maxDate = this.maxDate;\n }\n }\n }\n\n if (this.open && (changedProperties.has(\"placement\") || changedProperties.has(\"offset\"))) {\n this.cleanup();\n this.setupPositioning();\n this.setupDismissLayer();\n }\n }\n\n override render() {\n return html`\n <slot name=\"trigger\"></slot>\n <slot></slot>\n `;\n }\n}\n\ndefine(\"ds-date-picker\", DsDatePicker);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-date-picker\": DsDatePicker;\n }\n}\n","/**\n * Date utility functions for DatePicker component.\n * Uses date-fns for reliable date manipulation across timezones.\n */\n\nimport {\n addMonths,\n addYears,\n isToday as dateFnsIsToday,\n eachDayOfInterval,\n endOfMonth,\n endOfWeek,\n format,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n isValid,\n parse,\n parseISO,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\n\nexport type WeekStartsOn = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n/**\n * Returns today's date in ISO format (YYYY-MM-DD).\n */\nexport function getTodayIso(): string {\n return format(new Date(), \"yyyy-MM-dd\");\n}\n\n/**\n * Parses a date string to a Date object.\n * Returns null if the string is empty or invalid.\n */\nexport function parseDate(dateStr: string): Date | null {\n if (!dateStr) return null;\n const parsed = parseISO(dateStr);\n return isValid(parsed) ? parsed : null;\n}\n\n/**\n * Formats a Date object to ISO format (YYYY-MM-DD).\n */\nexport function formatIso(date: Date): string {\n return format(date, \"yyyy-MM-dd\");\n}\n\n/**\n * Formats a Date object to a viewing month string (YYYY-MM).\n */\nexport function formatViewingMonth(date: Date): string {\n return format(date, \"yyyy-MM\");\n}\n\n/**\n * Parses a viewing month string (YYYY-MM) to a Date object (first day of month).\n */\nexport function parseViewingMonth(viewingMonth: string): Date {\n if (!viewingMonth) {\n return startOfMonth(new Date());\n }\n const parsed = parse(viewingMonth, \"yyyy-MM\", new Date());\n return isValid(parsed) ? parsed : startOfMonth(new Date());\n}\n\n/**\n * Gets the weekday names for a locale, starting from the specified day.\n */\nexport function getWeekdayNames(\n locale: string,\n weekStartsOn: WeekStartsOn = 0,\n formatStyle: \"short\" | \"narrow\" | \"long\" = \"short\"\n): string[] {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: formatStyle });\n\n // Start from January 2024, which starts on Monday (day 1)\n // We adjust based on weekStartsOn\n const baseDate = new Date(2024, 0, weekStartsOn);\n const names: string[] = [];\n\n for (let i = 0; i < 7; i++) {\n const day = new Date(baseDate);\n day.setDate(day.getDate() + i);\n names.push(formatter.format(day));\n }\n\n return names;\n}\n\n/**\n * Gets all days to display in a calendar month grid.\n * Includes padding days from previous and next months.\n */\nexport function getMonthDays(viewingMonth: string, weekStartsOn: WeekStartsOn = 0): Date[] {\n const monthDate = parseViewingMonth(viewingMonth);\n const monthStart = startOfMonth(monthDate);\n const monthEnd = endOfMonth(monthDate);\n\n // Get calendar bounds (including days from adjacent months)\n const calendarStart = startOfWeek(monthStart, { weekStartsOn });\n const calendarEnd = endOfWeek(monthEnd, { weekStartsOn });\n\n return eachDayOfInterval({ start: calendarStart, end: calendarEnd });\n}\n\n/**\n * Gets the formatted month label (e.g., \"January 2026\").\n */\nexport function getMonthLabel(\n viewingMonth: string,\n locale: string,\n options: Intl.DateTimeFormatOptions = { month: \"long\", year: \"numeric\" }\n): string {\n const date = parseViewingMonth(viewingMonth);\n return new Intl.DateTimeFormat(locale, options).format(date);\n}\n\n/**\n * Navigates to the previous or next month.\n */\nexport function navigateMonth(viewingMonth: string, delta: number): string {\n const date = parseViewingMonth(viewingMonth);\n return formatViewingMonth(addMonths(date, delta));\n}\n\n/**\n * Navigates to the previous or next year.\n */\nexport function navigateYear(viewingMonth: string, delta: number): string {\n const date = parseViewingMonth(viewingMonth);\n return formatViewingMonth(addYears(date, delta));\n}\n\n/**\n * Checks if a date is disabled (outside min/max range).\n */\nexport function isDateDisabled(\n date: Date,\n minDate: string | undefined,\n maxDate: string | undefined\n): boolean {\n if (minDate) {\n const min = parseDate(minDate);\n if (min && isBefore(date, min) && !isSameDay(date, min)) {\n return true;\n }\n }\n if (maxDate) {\n const max = parseDate(maxDate);\n if (max && isAfter(date, max) && !isSameDay(date, max)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Checks if a date is selected (single mode or range endpoints).\n */\nexport function isDateSelected(\n date: Date,\n selectedDate: string | undefined,\n rangeStart: string | undefined,\n rangeEnd: string | undefined,\n isRangeMode: boolean\n): boolean {\n if (isRangeMode) {\n if (rangeStart) {\n const start = parseDate(rangeStart);\n if (start && isSameDay(date, start)) return true;\n }\n if (rangeEnd) {\n const end = parseDate(rangeEnd);\n if (end && isSameDay(date, end)) return true;\n }\n return false;\n }\n\n if (selectedDate) {\n const selected = parseDate(selectedDate);\n return selected ? isSameDay(date, selected) : false;\n }\n\n return false;\n}\n\n/**\n * Checks if a date is within a selected range (exclusive of endpoints).\n */\nexport function isDateInRange(\n date: Date,\n rangeStart: string | undefined,\n rangeEnd: string | undefined\n): boolean {\n if (!rangeStart || !rangeEnd) return false;\n\n const start = parseDate(rangeStart);\n const end = parseDate(rangeEnd);\n\n if (!start || !end) return false;\n\n return isAfter(date, start) && isBefore(date, end);\n}\n\n/**\n * Checks if a date is today.\n */\nexport function isToday(date: Date): boolean {\n return dateFnsIsToday(date);\n}\n\n/**\n * Checks if a date is in the currently viewed month.\n */\nexport function isDateInCurrentMonth(date: Date, viewingMonth: string): boolean {\n const monthDate = parseViewingMonth(viewingMonth);\n return isSameMonth(date, monthDate);\n}\n\n/**\n * Formats a date for display in the input field.\n */\nexport function formatDisplayDate(\n date: Date | null,\n locale: string,\n options: Intl.DateTimeFormatOptions = { dateStyle: \"medium\" }\n): string {\n if (!date) return \"\";\n return new Intl.DateTimeFormat(locale, options).format(date);\n}\n\n/**\n * Formats a date range for display.\n */\nexport function formatDisplayRange(\n start: string | undefined,\n end: string | undefined,\n locale: string,\n options: Intl.DateTimeFormatOptions = { dateStyle: \"medium\" }\n): string {\n const startDate = start ? parseDate(start) : null;\n const endDate = end ? parseDate(end) : null;\n const formatter = new Intl.DateTimeFormat(locale, options);\n\n if (startDate && endDate) {\n return `${formatter.format(startDate)} – ${formatter.format(endDate)}`;\n }\n if (startDate) {\n return formatter.format(startDate);\n }\n return \"\";\n}\n\n/**\n * Validates a date string format (YYYY-MM-DD).\n */\nexport function isValidDateString(dateStr: string): boolean {\n if (!dateStr) return false;\n const regex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!regex.test(dateStr)) return false;\n const parsed = parseISO(dateStr);\n return isValid(parsed);\n}\n\n/**\n * Clamps a date to within min/max bounds.\n */\nexport function clampDate(\n date: Date,\n minDate: string | undefined,\n maxDate: string | undefined\n): Date {\n let result = date;\n\n if (minDate) {\n const min = parseDate(minDate);\n if (min && isBefore(result, min)) {\n result = min;\n }\n }\n\n if (maxDate) {\n const max = parseDate(maxDate);\n if (max && isAfter(result, max)) {\n result = max;\n }\n }\n\n return result;\n}\n\n/**\n * Date format patterns for common locales.\n * Maps locale codes to their date-fns format patterns.\n */\nconst LOCALE_DATE_FORMATS: Record<string, string> = {\n \"en-US\": \"MM/dd/yyyy\",\n \"en-GB\": \"dd/MM/yyyy\",\n \"en-CA\": \"yyyy-MM-dd\",\n \"en-AU\": \"dd/MM/yyyy\",\n \"de-DE\": \"dd.MM.yyyy\",\n \"fr-FR\": \"dd/MM/yyyy\",\n \"es-ES\": \"dd/MM/yyyy\",\n \"it-IT\": \"dd/MM/yyyy\",\n \"pt-BR\": \"dd/MM/yyyy\",\n \"ja-JP\": \"yyyy/MM/dd\",\n \"ko-KR\": \"yyyy.MM.dd\",\n \"zh-CN\": \"yyyy/MM/dd\",\n \"zh-TW\": \"yyyy/MM/dd\",\n \"ru-RU\": \"dd.MM.yyyy\",\n \"pl-PL\": \"dd.MM.yyyy\",\n \"nl-NL\": \"dd-MM-yyyy\",\n \"sv-SE\": \"yyyy-MM-dd\",\n \"da-DK\": \"dd-MM-yyyy\",\n \"fi-FI\": \"dd.MM.yyyy\",\n \"nb-NO\": \"dd.MM.yyyy\",\n \"cs-CZ\": \"dd.MM.yyyy\",\n \"hu-HU\": \"yyyy.MM.dd\",\n \"tr-TR\": \"dd.MM.yyyy\",\n \"ar-SA\": \"dd/MM/yyyy\",\n \"he-IL\": \"dd/MM/yyyy\",\n \"th-TH\": \"dd/MM/yyyy\",\n};\n\n/**\n * Gets the date format pattern for a locale.\n * Returns MM/dd/yyyy as default for unknown locales.\n */\nexport function getDateFormat(locale: string): string {\n // Try exact match\n if (LOCALE_DATE_FORMATS[locale]) {\n return LOCALE_DATE_FORMATS[locale];\n }\n\n // Try language only (e.g., \"en\" from \"en-XX\")\n const lang = locale.split(\"-\")[0];\n for (const [key, fmt] of Object.entries(LOCALE_DATE_FORMATS)) {\n if (key.startsWith(`${lang}-`)) {\n return fmt;\n }\n }\n\n // Default to MM/dd/yyyy\n return \"MM/dd/yyyy\";\n}\n\n/**\n * Gets a human-readable date format placeholder for a locale.\n * E.g., \"MM/DD/YYYY\" for en-US, \"DD/MM/YYYY\" for en-GB\n */\nexport function getDateFormatPlaceholder(locale: string): string {\n const fmt = getDateFormat(locale);\n return fmt.replace(/yyyy/g, \"YYYY\").replace(/MM/g, \"MM\").replace(/dd/g, \"DD\");\n}\n\n/**\n * Result of parsing a typed date input.\n */\nexport interface DateParseResult {\n /** Whether the input was successfully parsed */\n valid: boolean;\n /** The parsed date in ISO format (YYYY-MM-DD), if valid */\n date: string | null;\n /** Error message if invalid */\n error: string | null;\n}\n\n/**\n * Parses a user-typed date string based on locale format.\n * Supports flexible separator matching (/, -, .).\n */\nexport function parseTypedDate(input: string, locale: string): DateParseResult {\n if (!input || !input.trim()) {\n return { valid: false, date: null, error: null };\n }\n\n const trimmed = input.trim();\n const fmt = getDateFormat(locale);\n\n // Try parsing with the locale format\n const parsed = parse(trimmed, fmt, new Date());\n if (isValid(parsed)) {\n return { valid: true, date: formatIso(parsed), error: null };\n }\n\n // Try common separator variations\n const separators = [\"/\", \"-\", \".\"];\n for (const sep of separators) {\n const normalizedInput = trimmed.replace(/[\\/\\-\\.]/g, sep);\n const normalizedFormat = fmt.replace(/[\\/\\-\\.]/g, sep);\n const attempt = parse(normalizedInput, normalizedFormat, new Date());\n if (isValid(attempt)) {\n return { valid: true, date: formatIso(attempt), error: null };\n }\n }\n\n // Try ISO format as fallback\n const isoAttempt = parseISO(trimmed);\n if (isValid(isoAttempt)) {\n return { valid: true, date: formatIso(isoAttempt), error: null };\n }\n\n return {\n valid: false,\n date: null,\n error: `Invalid date format. Expected: ${getDateFormatPlaceholder(locale)}`,\n };\n}\n\n/**\n * Formats a date for display in a typed input field.\n * Uses the locale-specific format pattern.\n */\nexport function formatTypedDate(dateIso: string, locale: string): string {\n if (!dateIso) return \"\";\n const date = parseDate(dateIso);\n if (!date) return \"\";\n return format(date, getDateFormat(locale));\n}\n\n/**\n * Validates a typed date against min/max constraints.\n */\nexport function validateTypedDate(\n dateIso: string,\n minDate: string | undefined,\n maxDate: string | undefined,\n locale: string\n): DateParseResult {\n if (!dateIso) {\n return { valid: false, date: null, error: null };\n }\n\n const date = parseDate(dateIso);\n if (!date) {\n return { valid: false, date: null, error: \"Invalid date\" };\n }\n\n if (minDate) {\n const min = parseDate(minDate);\n if (min && isBefore(date, min) && !isSameDay(date, min)) {\n const minFormatted = formatTypedDate(minDate, locale);\n return {\n valid: false,\n date: dateIso,\n error: `Date must be on or after ${minFormatted}`,\n };\n }\n }\n\n if (maxDate) {\n const max = parseDate(maxDate);\n if (max && isAfter(date, max) && !isSameDay(date, max)) {\n const maxFormatted = formatTypedDate(maxDate, locale);\n return {\n valid: false,\n date: dateIso,\n error: `Date must be on or before ${maxFormatted}`,\n };\n }\n }\n\n return { valid: true, date: dateIso, error: null };\n}\n","import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Label component for form fields.\n *\n * Used within ds-field to provide an accessible label that is\n * automatically associated with the form control via aria-labelledby.\n *\n * @element ds-label\n *\n * @slot - Label text content\n *\n * @example\n * ```html\n * <ds-field>\n * <ds-label>Email address</ds-label>\n * <ds-input type=\"email\"></ds-input>\n * </ds-field>\n * ```\n */\nexport class DsLabel extends DSElement {\n /**\n * ID of the associated form control.\n * Typically set automatically by the parent ds-field component.\n */\n @property({ type: String, attribute: \"for\" })\n for = \"\";\n\n override render() {\n return html`\n <label\n class=\"ds-label\"\n part=\"label\"\n for=${this.for || nothing}\n >\n <slot></slot>\n </label>\n `;\n }\n}\n\n// Import nothing for conditional attributes\nimport { nothing } from \"lit\";\n\ndefine(\"ds-label\", DsLabel);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-label\": DsLabel;\n }\n}\n","import { html } from \"lit\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Description/help text component for form fields.\n *\n * Used within ds-field to provide supplementary help text that is\n * automatically associated with the form control via aria-describedby.\n *\n * @element ds-field-description\n *\n * @slot - Description text content\n *\n * @example\n * ```html\n * <ds-field>\n * <ds-label>Password</ds-label>\n * <ds-input type=\"password\"></ds-input>\n * <ds-field-description>\n * Must be at least 8 characters with one number\n * </ds-field-description>\n * </ds-field>\n * ```\n */\nexport class DsFieldDescription extends DSElement {\n override render() {\n return html`\n <div class=\"ds-field-description\" part=\"description\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndefine(\"ds-field-description\", DsFieldDescription);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-field-description\": DsFieldDescription;\n }\n}\n","import { html } from \"lit\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\n/**\n * Error message component for form fields.\n *\n * Used within ds-field to display validation error messages that are\n * automatically associated with the form control via aria-describedby.\n * Error messages take precedence over descriptions in the ARIA description.\n *\n * @element ds-field-error\n *\n * @slot - Error message text content\n *\n * @example\n * ```html\n * <ds-field>\n * <ds-label>Email</ds-label>\n * <ds-input type=\"email\" error></ds-input>\n * <ds-field-error>Please enter a valid email address</ds-field-error>\n * </ds-field>\n * ```\n */\nexport class DsFieldError extends DSElement {\n override render() {\n return html`\n <div\n class=\"ds-field-error\"\n part=\"error\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\ndefine(\"ds-field-error\", DsFieldError);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-field-error\": DsFieldError;\n }\n}\n","import { html } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\n// Import child components to ensure they're registered\nimport \"./label.js\";\nimport \"./field-description.js\";\nimport \"./field-error.js\";\n\n/**\n * Field container component for form controls.\n *\n * Provides consistent layout and automatic ARIA attribute composition\n * for form fields. Associates labels, descriptions, and error messages\n * with the form control for accessibility.\n *\n * @element ds-field\n *\n * @slot - Field contents (label, form control, description, error)\n *\n * @csspart container - The field container element\n *\n * @cssprop --ds-field-gap - Gap between field children (default: 0.5rem)\n * @cssprop --ds-field-error-color - Error message color\n *\n * @example\n * ```html\n * <ds-field required>\n * <ds-label>Email address</ds-label>\n * <ds-field-description>We'll never share your email</ds-field-description>\n * <ds-input type=\"email\" name=\"email\"></ds-input>\n * <ds-field-error>Please enter a valid email</ds-field-error>\n * </ds-field>\n * ```\n */\nexport class DsField extends DSElement {\n /** Marks the field as required */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /** Whether the field is disabled */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Generated unique ID for ARIA associations */\n @state()\n private fieldId = \"\";\n\n /** Whether an error child is present */\n @state()\n private hasError = false;\n\n /** Whether a description child is present */\n @state()\n private hasDescription = false;\n\n private observer: MutationObserver | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Generate unique ID for this field instance\n this.fieldId = `field-${crypto.randomUUID().slice(0, 8)}`;\n\n // Set up mutation observer to track child changes\n this.observer = new MutationObserver(() => this.updateChildComponents());\n this.observer.observe(this, { childList: true, subtree: true });\n\n // Initial setup after first render\n this.updateComplete.then(() => {\n this.updateChildComponents();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.observer?.disconnect();\n this.observer = null;\n }\n\n /**\n * Updates ARIA attributes on child components based on field structure.\n */\n private updateChildComponents(): void {\n // Find child components\n const label = this.querySelector(\"ds-label\");\n const description = this.querySelector(\"ds-field-description\");\n const error = this.querySelector(\"ds-field-error\");\n const formControl = this.querySelector(\n \"ds-input, ds-textarea, ds-checkbox, ds-radio-group, ds-switch, ds-select, ds-combobox, ds-date-picker, ds-slider, ds-number-input, ds-file-upload, ds-time-picker, ds-pin-input, input, textarea, select\"\n );\n\n // Track which components are present\n this.hasError = !!error && error.textContent?.trim() !== \"\";\n this.hasDescription = !!description && description.textContent?.trim() !== \"\";\n\n // Assign IDs to components\n if (label) {\n const labelId = `${this.fieldId}-label`;\n label.id = labelId;\n\n // Set data-required on label for styling\n if (this.required) {\n label.setAttribute(\"data-required\", \"\");\n } else {\n label.removeAttribute(\"data-required\");\n }\n }\n\n if (description) {\n description.id = `${this.fieldId}-desc`;\n }\n\n if (error) {\n error.id = `${this.fieldId}-error`;\n }\n\n // Compose ARIA attributes for form control\n if (formControl) {\n // Build aria-labelledby\n if (label) {\n formControl.setAttribute(\"aria-labelledby\", label.id);\n }\n\n // Build aria-describedby (error first, then description)\n const describedByIds: string[] = [];\n if (this.hasError && error) {\n describedByIds.push(error.id);\n }\n if (this.hasDescription && description) {\n describedByIds.push(description.id);\n }\n\n if (describedByIds.length > 0) {\n formControl.setAttribute(\"aria-describedby\", describedByIds.join(\" \"));\n } else {\n formControl.removeAttribute(\"aria-describedby\");\n }\n\n // Set aria-invalid if error is present\n if (this.hasError) {\n formControl.setAttribute(\"aria-invalid\", \"true\");\n // Also set error property if it's a design system component\n if (\"error\" in formControl) {\n (formControl as { error: boolean }).error = true;\n }\n } else {\n formControl.setAttribute(\"aria-invalid\", \"false\");\n if (\"error\" in formControl) {\n (formControl as { error: boolean }).error = false;\n }\n }\n\n // Set aria-required if field is required\n if (this.required) {\n formControl.setAttribute(\"aria-required\", \"true\");\n if (\"required\" in formControl) {\n (formControl as { required: boolean }).required = true;\n }\n }\n\n // Set disabled state\n if (this.disabled) {\n formControl.setAttribute(\"aria-disabled\", \"true\");\n if (\"disabled\" in formControl) {\n (formControl as { disabled: boolean }).disabled = true;\n }\n }\n }\n\n // Update data attributes on self for CSS styling\n if (this.hasError) {\n this.setAttribute(\"data-error\", \"\");\n } else {\n this.removeAttribute(\"data-error\");\n }\n\n if (this.disabled) {\n this.setAttribute(\"data-disabled\", \"\");\n } else {\n this.removeAttribute(\"data-disabled\");\n }\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n // Re-apply ARIA attributes when required or disabled changes\n if (changedProperties.has(\"required\") || changedProperties.has(\"disabled\")) {\n this.updateChildComponents();\n }\n }\n\n override render() {\n return html`\n <div class=\"ds-field\" part=\"container\">\n <slot @slotchange=${this.updateChildComponents}></slot>\n </div>\n `;\n }\n}\n\ndefine(\"ds-field\", DsField);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-field\": DsField;\n }\n}\n"],"mappings":"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","names":["html","property","state","ifDefined","state","html","ifDefined","property","html","property","state","ifDefined","state","html","ifDefined","property","html","property","state","html","property","state","html","property","state","html","property","html","property","html","property","html","property","html","property","html","property","html","property","createRovingFocus","html","property","state","createRovingFocus","state","html","property","html","property","html","property","html","property","html","property","html","property","html","property","html","property","html","property","createAnchorPosition","createDismissableLayer","createPresence","createRovingFocus","prefersReducedMotion","html","nothing","property","state","repeat","prefersReducedMotion","createPresence","createAnchorPosition","createDismissableLayer","createRovingFocus","html","nothing","state","repeat","property","html","nothing","property","state","nothing","html","state","property","html","nothing","property","state","nothing","html","property","state","html","nothing","property","state","html","nothing","property","state","html","nothing","property","state","nothing","html","property","state","html","nothing","property","state","nothing","html","property","state","html","nothing","property","state","html","nothing","property","state","createAnchorPosition","createDismissableLayer","createPresence","prefersReducedMotion","html","property","state","prefersReducedMotion","createPresence","createAnchorPosition","createDismissableLayer","html","property","state","html","property","nothing","html","nothing","property","html","html","html","html","html","property","state","html","property","state"]}
|