kanto-ds 1.3.0 → 1.5.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/README.md +10 -10
- package/dist/chunks/defaults-CFrjqae2.js +59 -0
- package/dist/chunks/{defaults-DKzFsNbv.js.map → defaults-CFrjqae2.js.map} +1 -1
- package/dist/chunks/events-r51msXNf.js +22 -0
- package/dist/chunks/{events-Bjl5Zmmq.js.map → events-r51msXNf.js.map} +1 -1
- package/dist/chunks/floating-B7_Dahpn.js +54 -0
- package/dist/chunks/floating-B7_Dahpn.js.map +1 -0
- package/dist/chunks/{form-control-CxjBTt1c.js → form-control-B74_EHtG.js} +7 -7
- package/dist/chunks/form-control-B74_EHtG.js.map +1 -0
- package/dist/chunks/{index-fzPIgxe2.js → index-STEEvEP7.js} +33 -16
- package/dist/chunks/index-STEEvEP7.js.map +1 -0
- package/dist/chunks/kt-calendar-B_hFdD9V.js +640 -0
- package/dist/chunks/kt-calendar-B_hFdD9V.js.map +1 -0
- package/dist/chunks/{kt-element-mdd5cXZX.js → kt-element-Djx2JcGl.js} +2 -2
- package/dist/chunks/{kt-element-mdd5cXZX.js.map → kt-element-Djx2JcGl.js.map} +1 -1
- package/dist/chunks/{listbox-Sm3nvsC6.js → listbox-llcUu_V-.js} +18 -14
- package/dist/chunks/{listbox-Sm3nvsC6.js.map → listbox-llcUu_V-.js.map} +1 -1
- package/dist/chunks/locale-C5xLkGx5.js +14 -0
- package/dist/chunks/locale-C5xLkGx5.js.map +1 -0
- package/dist/chunks/position-Cx_ZH5zh.js +39 -0
- package/dist/chunks/position-Cx_ZH5zh.js.map +1 -0
- package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
- package/dist/components/core/kt-badge/kt-badge.js +3 -3
- package/dist/components/core/kt-button/kt-button.js +1 -1
- package/dist/components/core/kt-card/kt-card.js +2 -2
- package/dist/components/core/kt-code/kt-code.js +3 -3
- package/dist/components/core/kt-icon/kt-icon.js +2 -2
- package/dist/components/core/kt-kbd/kt-kbd.js +1 -1
- package/dist/components/core/kt-split-button/kt-split-button.js +4 -4
- package/dist/components/data/kt-chart/kt-chart.js +52 -52
- package/dist/components/data/kt-chart/kt-chart.js.map +1 -1
- package/dist/components/data/kt-meter/kt-meter.js +1 -1
- package/dist/components/data/kt-pagination/kt-pagination.js +3 -3
- package/dist/components/data/kt-stat/kt-stat.js +1 -1
- package/dist/components/data/kt-table/kt-table.d.ts +53 -3
- package/dist/components/data/kt-table/kt-table.js +286 -131
- package/dist/components/data/kt-table/kt-table.js.map +1 -1
- package/dist/components/data/kt-table/window.d.ts +19 -0
- package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
- package/dist/components/feedback/kt-alert/kt-alert.js +3 -3
- package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +10 -10
- package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js.map +1 -1
- package/dist/components/feedback/kt-skeleton/kt-skeleton.js +1 -1
- package/dist/components/feedback/kt-toast/kt-toast.js +58 -42
- package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -1
- package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
- package/dist/components/feedback/kt-tooltip/kt-tooltip.d.ts +20 -0
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js +95 -51
- package/dist/components/feedback/kt-tooltip/kt-tooltip.js.map +1 -1
- package/dist/components/forms/kt-calendar/kt-calendar.d.ts +96 -0
- package/dist/components/forms/kt-calendar/kt-calendar.js +13 -0
- package/dist/components/forms/kt-calendar/kt-calendar.js.map +1 -0
- package/dist/components/forms/kt-checkbox/kt-checkbox.d.ts +75 -0
- package/dist/components/forms/kt-checkbox/kt-checkbox.js +212 -0
- package/dist/components/forms/kt-checkbox/kt-checkbox.js.map +1 -0
- package/dist/components/forms/kt-date-picker/kt-date-picker.d.ts +105 -0
- package/dist/components/forms/kt-date-picker/kt-date-picker.js +382 -0
- package/dist/components/forms/kt-date-picker/kt-date-picker.js.map +1 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.d.ts +9 -0
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +36 -22
- package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -1
- package/dist/components/forms/kt-form/kt-form.js +11 -10
- package/dist/components/forms/kt-form/kt-form.js.map +1 -1
- package/dist/components/forms/kt-input/kt-input.d.ts +37 -1
- package/dist/components/forms/kt-input/kt-input.js +380 -194
- package/dist/components/forms/kt-input/kt-input.js.map +1 -1
- package/dist/components/forms/kt-input-menu/kt-input-menu.d.ts +13 -0
- package/dist/components/forms/kt-input-menu/kt-input-menu.js +73 -42
- package/dist/components/forms/kt-input-menu/kt-input-menu.js.map +1 -1
- package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
- package/dist/components/forms/kt-radio-group/kt-radio-group.d.ts +112 -0
- package/dist/components/forms/kt-radio-group/kt-radio-group.js +279 -0
- package/dist/components/forms/kt-radio-group/kt-radio-group.js.map +1 -0
- package/dist/components/forms/kt-select/kt-select.d.ts +13 -0
- package/dist/components/forms/kt-select/kt-select.js +87 -56
- package/dist/components/forms/kt-select/kt-select.js.map +1 -1
- package/dist/components/forms/kt-textarea/kt-textarea.d.ts +9 -0
- package/dist/components/forms/kt-textarea/kt-textarea.js +28 -14
- package/dist/components/forms/kt-textarea/kt-textarea.js.map +1 -1
- package/dist/components/forms/kt-toggle/kt-toggle.d.ts +9 -0
- package/dist/components/forms/kt-toggle/kt-toggle.js +43 -29
- package/dist/components/forms/kt-toggle/kt-toggle.js.map +1 -1
- package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +3 -3
- package/dist/components/navigation/kt-header/kt-header.js +3 -3
- package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.d.ts +9 -0
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +40 -22
- package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js.map +1 -1
- package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +3 -3
- package/dist/components/navigation/kt-tabs/kt-tabs.js +2 -2
- package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +2 -2
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +13 -7
- package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js.map +1 -1
- package/dist/components/overlays/kt-collapsible/kt-collapsible.js +2 -2
- package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +3 -3
- package/dist/components/overlays/kt-dropdown/kt-dropdown.d.ts +7 -5
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js +67 -57
- package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
- package/dist/components/overlays/kt-modal/kt-modal.js +3 -3
- package/dist/components/overlays/kt-side-panel/kt-side-panel.js +3 -3
- package/dist/custom-elements.json +3526 -741
- package/dist/icons/defaults.d.ts +2 -0
- package/dist/icons/index.js +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +99 -90
- package/dist/index.js.map +1 -1
- package/dist/internal/countries.d.ts +24 -9
- package/dist/internal/date.d.ts +53 -0
- package/dist/internal/events.d.ts +5 -0
- package/dist/internal/floating.d.ts +48 -0
- package/dist/internal/form-control.d.ts +5 -1
- package/dist/internal/locale.d.ts +15 -0
- package/dist/internal/position.d.ts +27 -0
- package/dist/internal/strings.d.ts +25 -0
- package/dist/react/index.d.ts +25 -0
- package/dist/react/index.js +189 -156
- package/dist/react/index.js.map +1 -1
- package/dist/react/jsx.d.ts +22 -1
- package/dist/strings/index.js +1 -1
- package/dist/tokens/base.css +5 -0
- package/dist/tokens/responsive.css +1 -0
- package/dist/tokens/spacing.css +1 -0
- package/dist/vscode.css-custom-data.json +20 -0
- package/dist/vscode.html-custom-data.json +221 -9
- package/dist/vue/index.d.ts +10 -0
- package/dist/vue/index.js +11 -7
- package/dist/vue/index.js.map +1 -1
- package/dist/web-types.json +514 -12
- package/package.json +18 -1
- package/dist/chunks/defaults-DKzFsNbv.js +0 -57
- package/dist/chunks/events-Bjl5Zmmq.js +0 -18
- package/dist/chunks/form-control-CxjBTt1c.js.map +0 -1
- package/dist/chunks/index-fzPIgxe2.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kt-input-menu.js","sources":["../../../../src/components/forms/kt-input-menu/kt-input-menu.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { live } from 'lit/directives/live.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit, uniqueId } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport {\n filterOptions,\n firstEnabledIndex,\n lastEnabledIndex,\n listboxStyles,\n nextEnabledIndex,\n optionLabel,\n type KtOption,\n} from '#internal/listbox';\nimport { strings } from '#internal/strings';\nimport '../../core/kt-icon/kt-icon.js';\n\n/**\n * A combobox: type to narrow the list, then pick.\n *\n * Reach for it over `<kt-select>` once the list is long enough that scanning it\n * is slower than typing three letters — somewhere around twenty options.\n *\n * @element kt-input-menu\n *\n * @csspart control - The field.\n * @csspart input - The native `<input>`.\n * @csspart popup - The option list.\n * @csspart option - An option row.\n *\n * @fires kt-change - An option was chosen or cleared. `detail: { value, option }`.\n * @fires kt-filter - The query changed. `detail: { query }`.\n */\nexport class KtInputMenu extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n listboxStyles,\n css`\n :host {\n position: relative;\n display: block;\n --field-height: var(--button-height);\n }\n\n .control {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-element);\n width: 100%;\n height: var(--field-height);\n padding: 0 var(--button-padding-x);\n color: var(--text-body);\n font: var(--font-input);\n background-color: var(--color-dark-20);\n border: none;\n border-radius: var(--radius-input);\n /* A resting hairline. A field is a fill on --surface-field, which is\n one ramp step from the page in dark and almost the same colour in\n light — so on a card or inside a modal it simply disappeared and\n read as a bare native control.\n\n A border rather than an outline, because the control inside fills\n the field exactly and a coincident outline is painted over by the\n native widget. A border insets the control by its own width, so it\n cannot be covered. box-sizing: border-box keeps the outer size.\n\n The hover and focus rings stay outlines on top of it, and the\n transparent resting outline is what they animate from: without it\n outline-color starts at the initial value, which resolves to the\n text colour, and hover flashed near-white before settling. */\n border: var(--border-width) solid var(--border-field);\n outline: var(--outline-width) solid transparent;\n cursor: text;\n transition:\n background-color var(--duration-instant),\n outline-color var(--duration-instant);\n }\n\n .control:hover {\n outline: var(--outline-width) solid var(--color-text-700);\n }\n .control:focus-within {\n background-color: var(--color-dark-12);\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n .error .control,\n .error .control:hover,\n .error .control:focus-within {\n outline: var(--outline-width) solid var(--color-danger-base);\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n input {\n width: 100%;\n min-width: 0;\n color: var(--text-body);\n font: var(--font-input);\n background: transparent;\n border: none;\n outline: none;\n }\n\n input::placeholder {\n color: var(--text-muted);\n }\n\n .icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n color: inherit;\n background: transparent;\n border: none;\n cursor: pointer;\n }\n\n .clear {\n transition: transform var(--duration-instant) ease-in-out;\n }\n .clear:hover {\n transform: rotate(90deg);\n }\n\n .toggle {\n transition: transform var(--duration-fast) ease-in-out;\n }\n .open .toggle {\n transform: scaleY(-1);\n }\n `,\n ];\n\n @query('input')\n private input!: HTMLInputElement;\n\n private internals: UsableInternals | null = null;\n private defaultValue: string | number | null = null;\n private readonly listId = uniqueId('kt-input-menu-list');\n\n @state()\n private open = false;\n\n @state()\n private query = '';\n\n @state()\n private activeIndex = -1;\n\n @property({ attribute: false })\n options: readonly KtOption[] = [];\n\n @property({ type: String })\n value: string | number | null = null;\n\n @property({ type: String })\n placeholder = '';\n\n @property({ type: String })\n name = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n @property({ type: String, reflect: true })\n error = '';\n\n @property({ type: String })\n label = '';\n\n @property({ type: String, attribute: 'empty-text' })\n emptyText: string | undefined = undefined;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n document.addEventListener('pointerdown', this.onDocumentPointerDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('pointerdown', this.onDocumentPointerDown);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (\n changed.has('value') ||\n changed.has('required') ||\n changed.has('error') ||\n this.stringsChanged(changed)\n ) {\n // The option id is what is submitted, never the label the field shows:\n // the label is for people, the id is for the server.\n setFormValue(this.internals, this.value === null ? null : String(this.value));\n\n const missing = this.required && this.value === null;\n setValidity(\n this.internals,\n { valueMissing: missing, customError: Boolean(this.error) },\n this.error || (missing ? strings().selectOption : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n this.close();\n }\n\n formStateRestoreCallback(state: string): void {\n this.value = state;\n }\n\n override focus(options?: FocusOptions): void {\n this.input?.focus(options);\n }\n\n get selectedOption(): KtOption | undefined {\n return this.options.find((option) => option.id === this.value);\n }\n\n /** Options after the current query, which is what the keyboard walks. */\n private get visibleOptions(): readonly KtOption[] {\n return filterOptions(this.options, this.query);\n }\n\n /**\n * While filtering, the field shows the query; otherwise it shows the chosen\n * option. Keeping the two in one input is what makes it a combobox rather\n * than a search box that happens to sit above a list.\n */\n private get displayValue(): string {\n if (this.open && this.query) return this.query;\n const selected = this.selectedOption;\n return selected ? optionLabel(selected) : this.query;\n }\n\n private onDocumentPointerDown = (event: Event): void => {\n if (event.composedPath().includes(this)) return;\n this.close();\n };\n\n private openList(): void {\n if (this.disabled || this.open) return;\n this.open = true;\n this.activeIndex = firstEnabledIndex(this.visibleOptions);\n }\n\n private close(): void {\n this.open = false;\n this.query = '';\n this.activeIndex = -1;\n }\n\n private onInput(event: Event): void {\n this.query = (event.target as HTMLInputElement).value;\n this.open = true;\n this.activeIndex = firstEnabledIndex(this.visibleOptions);\n emit(this, 'kt-filter', { query: this.query });\n }\n\n private choose(option: KtOption): void {\n if (option.disabled) return;\n this.value = option.id;\n this.close();\n emit(this, 'kt-change', { value: option.id, option });\n }\n\n private clear(event: Event): void {\n event.stopPropagation();\n this.value = null;\n this.query = '';\n emit(this, 'kt-change', { value: null, option: null });\n this.input?.focus();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n const options = this.visibleOptions;\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n if (!this.open) return this.openList();\n this.activeIndex = nextEnabledIndex(\n options,\n this.activeIndex,\n event.key === 'ArrowDown' ? 1 : -1,\n );\n return;\n case 'Home':\n if (!this.open) return;\n event.preventDefault();\n this.activeIndex = firstEnabledIndex(options);\n return;\n case 'End':\n if (!this.open) return;\n event.preventDefault();\n this.activeIndex = lastEnabledIndex(options);\n return;\n case 'Enter': {\n if (!this.open) return;\n event.preventDefault();\n const option = options[this.activeIndex];\n if (option) this.choose(option);\n return;\n }\n case 'Escape':\n if (!this.open) return;\n event.stopPropagation();\n this.close();\n return;\n case 'Tab':\n this.close();\n }\n }\n\n private optionId(index: number): string {\n return `${this.listId}-option-${index}`;\n }\n\n override render(): TemplateResult {\n const options = this.visibleOptions;\n const showClear = this.selectedOption !== undefined && !this.disabled;\n\n return html`<div\n class=${classMap({ open: this.open, error: Boolean(this.error) })}\n @keydown=${this.onKeyDown}\n >\n <div part=\"control\" class=\"control\" @click=${this.openList}>\n <input\n part=\"input\"\n role=\"combobox\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.listId}\n aria-autocomplete=\"list\"\n aria-activedescendant=${\n this.open && this.activeIndex >= 0 ? this.optionId(this.activeIndex) : nothing\n }\n aria-label=${this.label || nothing}\n aria-invalid=${this.error ? 'true' : nothing}\n placeholder=${this.placeholder || nothing}\n .value=${live(this.displayValue)}\n ?disabled=${this.disabled}\n @focus=${this.openList}\n @input=${this.onInput}\n />\n\n ${\n showClear\n ? html`<button\n type=\"button\"\n class=\"icon-button clear\"\n aria-label=${strings().clear}\n tabindex=\"-1\"\n @click=${this.clear}\n >\n <kt-icon name=\"x\" size=\"18\"></kt-icon>\n </button>`\n : nothing\n }\n\n <button\n type=\"button\"\n class=\"icon-button toggle\"\n aria-label=${this.open ? strings().closeList : strings().openList}\n tabindex=\"-1\"\n @click=${(event: Event) => {\n event.stopPropagation();\n if (this.open) this.close();\n else this.openList();\n }}\n >\n <kt-icon name=\"chevron-down\" size=\"18\"></kt-icon>\n </button>\n </div>\n\n <ul\n part=\"popup\"\n id=${this.listId}\n class=${classMap({ popup: true, open: this.open })}\n role=\"listbox\"\n aria-label=${this.label || this.placeholder}\n >\n ${\n options.length === 0\n ? html`<li class=\"empty\">${this.emptyText ?? strings().noOptions}</li>`\n : options.map(\n (option, index) =>\n html`<li\n part=\"option\"\n id=${this.optionId(index)}\n class=${classMap({\n option: true,\n selected: option.id === this.value,\n active: index === this.activeIndex,\n disabled: Boolean(option.disabled),\n })}\n role=\"option\"\n aria-selected=${option.id === this.value ? 'true' : 'false'}\n @click=${() => this.choose(option)}\n >\n ${optionLabel(option)}\n </li>`,\n )\n }\n </ul>\n </div>`;\n }\n}\n\ndefineElement('kt-input-menu', KtInputMenu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-input-menu': KtInputMenu;\n }\n}\n"],"names":["KtInputMenu","KtElement","uniqueId","event","listboxStyles","css","attachFormInternals","changed","setFormValue","missing","setValidity","strings","state","options","option","filterOptions","selected","optionLabel","firstEnabledIndex","emit","nextEnabledIndex","lastEnabledIndex","index","showClear","html","classMap","nothing","live","__decorateClass","query","property","defineElement"],"mappings":";;;;;;;;;;;;;;;AAwCO,MAAMA,UAAoBC,EAAU;AAAA,EAApC,cAAA;AAAA,UAAA,GAAA,SAAA,GA+GL,KAAQ,YAAoC,MAC5C,KAAQ,eAAuC,MAC/C,KAAiB,SAASC,EAAS,oBAAoB,GAGvD,KAAQ,OAAO,IAGf,KAAQ,QAAQ,IAGhB,KAAQ,cAAc,IAGtB,KAAA,UAA+B,CAAA,GAG/B,KAAA,QAAgC,MAGhC,KAAA,cAAc,IAGd,KAAA,OAAO,IAGP,KAAA,WAAW,IAGX,KAAA,WAAW,IAGX,KAAA,QAAQ,IAGR,KAAA,QAAQ,IAGR,KAAA,YAAgC,QAmEhC,KAAQ,wBAAwB,CAACC,MAAuB;AACtD,MAAIA,EAAM,aAAA,EAAe,SAAS,IAAI,KACtC,KAAK,MAAA;AAAA,IACP;AAAA,EAAA;AAAA,EA1NA,OAAA;AAAA,SAAgB,iBAAiB;AAAA,EAAA;AAAA,EAEjC,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBF,EAAU;AAAA,MACVG;AAAA,MACAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAoGF;AAAA,EA6CS,oBAA0B;AACjC,UAAM,kBAAA,GACN,KAAK,cAAcC,EAAoB,IAAI,GAC3C,KAAK,eAAe,KAAK,OACzB,SAAS,iBAAiB,eAAe,KAAK,qBAAqB;AAAA,EACrE;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAA,GACN,SAAS,oBAAoB,eAAe,KAAK,qBAAqB;AAAA,EACxE;AAAA,EAES,WAAWC,GAAqC;AACvD,QACEA,EAAQ,IAAI,OAAO,KACnBA,EAAQ,IAAI,UAAU,KACtBA,EAAQ,IAAI,OAAO,KACnB,KAAK,eAAeA,CAAO,GAC3B;AAGA,MAAAC,EAAa,KAAK,WAAW,KAAK,UAAU,OAAO,OAAO,OAAO,KAAK,KAAK,CAAC;AAE5E,YAAMC,IAAU,KAAK,YAAY,KAAK,UAAU;AAChD,MAAAC;AAAA,QACE,KAAK;AAAA,QACL,EAAE,cAAcD,GAAS,aAAa,EAAQ,KAAK,MAAK;AAAA,QACxD,KAAK,UAAUA,IAAUE,EAAA,EAAU,eAAe;AAAA,MAAA;AAAA,IAEtD;AAAA,EACF;AAAA,EAEA,oBAA0B;AACxB,SAAK,QAAQ,KAAK,cAClB,KAAK,MAAA;AAAA,EACP;AAAA,EAEA,yBAAyBC,GAAqB;AAC5C,SAAK,QAAQA;AAAAA,EACf;AAAA,EAES,MAAMC,GAA8B;AAC3C,SAAK,OAAO,MAAMA,CAAO;AAAA,EAC3B;AAAA,EAEA,IAAI,iBAAuC;AACzC,WAAO,KAAK,QAAQ,KAAK,CAACC,MAAWA,EAAO,OAAO,KAAK,KAAK;AAAA,EAC/D;AAAA;AAAA,EAGA,IAAY,iBAAsC;AAChD,WAAOC,EAAc,KAAK,SAAS,KAAK,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAY,eAAuB;AACjC,QAAI,KAAK,QAAQ,KAAK,cAAc,KAAK;AACzC,UAAMC,IAAW,KAAK;AACtB,WAAOA,IAAWC,EAAYD,CAAQ,IAAI,KAAK;AAAA,EACjD;AAAA,EAOQ,WAAiB;AACvB,IAAI,KAAK,YAAY,KAAK,SAC1B,KAAK,OAAO,IACZ,KAAK,cAAcE,EAAkB,KAAK,cAAc;AAAA,EAC1D;AAAA,EAEQ,QAAc;AACpB,SAAK,OAAO,IACZ,KAAK,QAAQ,IACb,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,QAAQf,GAAoB;AAClC,SAAK,QAASA,EAAM,OAA4B,OAChD,KAAK,OAAO,IACZ,KAAK,cAAce,EAAkB,KAAK,cAAc,GACxDC,EAAK,MAAM,aAAa,EAAE,OAAO,KAAK,OAAO;AAAA,EAC/C;AAAA,EAEQ,OAAOL,GAAwB;AACrC,IAAIA,EAAO,aACX,KAAK,QAAQA,EAAO,IACpB,KAAK,MAAA,GACLK,EAAK,MAAM,aAAa,EAAE,OAAOL,EAAO,IAAI,QAAAA,GAAQ;AAAA,EACtD;AAAA,EAEQ,MAAMX,GAAoB;AAChC,IAAAA,EAAM,gBAAA,GACN,KAAK,QAAQ,MACb,KAAK,QAAQ,IACbgB,EAAK,MAAM,aAAa,EAAE,OAAO,MAAM,QAAQ,MAAM,GACrD,KAAK,OAAO,MAAA;AAAA,EACd;AAAA,EAEQ,UAAUhB,GAA4B;AAC5C,UAAMU,IAAU,KAAK;AAErB,YAAQV,EAAM,KAAA;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAEH,YADAA,EAAM,eAAA,GACF,CAAC,KAAK,KAAM,QAAO,KAAK,SAAA;AAC5B,aAAK,cAAciB;AAAA,UACjBP;AAAA,UACA,KAAK;AAAA,UACLV,EAAM,QAAQ,cAAc,IAAI;AAAA,QAAA;AAElC;AAAA,MACF,KAAK;AACH,YAAI,CAAC,KAAK,KAAM;AAChB,QAAAA,EAAM,eAAA,GACN,KAAK,cAAce,EAAkBL,CAAO;AAC5C;AAAA,MACF,KAAK;AACH,YAAI,CAAC,KAAK,KAAM;AAChB,QAAAV,EAAM,eAAA,GACN,KAAK,cAAckB,EAAiBR,CAAO;AAC3C;AAAA,MACF,KAAK,SAAS;AACZ,YAAI,CAAC,KAAK,KAAM;AAChB,QAAAV,EAAM,eAAA;AACN,cAAMW,IAASD,EAAQ,KAAK,WAAW;AACvC,QAAIC,KAAQ,KAAK,OAAOA,CAAM;AAC9B;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,CAAC,KAAK,KAAM;AAChB,QAAAX,EAAM,gBAAA,GACN,KAAK,MAAA;AACL;AAAA,MACF,KAAK;AACH,aAAK,MAAA;AAAA,IAAM;AAAA,EAEjB;AAAA,EAEQ,SAASmB,GAAuB;AACtC,WAAO,GAAG,KAAK,MAAM,WAAWA,CAAK;AAAA,EACvC;AAAA,EAES,SAAyB;AAChC,UAAMT,IAAU,KAAK,gBACfU,IAAY,KAAK,mBAAmB,UAAa,CAAC,KAAK;AAE7D,WAAOC;AAAA,cACGC,EAAS,EAAE,MAAM,KAAK,MAAM,OAAO,EAAQ,KAAK,OAAQ,CAAC;AAAA,iBACtD,KAAK,SAAS;AAAA;AAAA,mDAEoB,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA,0BAItC,KAAK,OAAO,SAAS,OAAO;AAAA,0BAC5B,KAAK,MAAM;AAAA;AAAA,kCAGzB,KAAK,QAAQ,KAAK,eAAe,IAAI,KAAK,SAAS,KAAK,WAAW,IAAIC,CACzE;AAAA,uBACa,KAAK,SAASA,CAAO;AAAA,yBACnB,KAAK,QAAQ,SAASA,CAAO;AAAA,wBAC9B,KAAK,eAAeA,CAAO;AAAA,mBAChCC,EAAK,KAAK,YAAY,CAAC;AAAA,sBACpB,KAAK,QAAQ;AAAA,mBAChB,KAAK,QAAQ;AAAA,mBACb,KAAK,OAAO;AAAA;AAAA;AAAA,UAIrBJ,IACIC;AAAA;AAAA;AAAA,6BAGeb,EAAA,EAAU,KAAK;AAAA;AAAA,yBAEnB,KAAK,KAAK;AAAA;AAAA;AAAA,2BAIrBe,CACN;AAAA;AAAA;AAAA;AAAA;AAAA,uBAKe,KAAK,OAAOf,EAAA,EAAU,YAAYA,EAAA,EAAU,QAAQ;AAAA;AAAA,mBAExD,CAACR,MAAiB;AACzB,MAAAA,EAAM,gBAAA,GACF,KAAK,OAAM,KAAK,MAAA,SACV,SAAA;AAAA,IACZ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAQE,KAAK,MAAM;AAAA,gBACRsB,EAAS,EAAE,OAAO,IAAM,MAAM,KAAK,MAAM,CAAC;AAAA;AAAA,qBAErC,KAAK,SAAS,KAAK,WAAW;AAAA;AAAA,UAGzCZ,EAAQ,WAAW,IACfW,sBAAyB,KAAK,aAAab,EAAA,EAAU,SAAS,UAC9DE,EAAQ;AAAA,MACN,CAACC,GAAQQ,MACPE;AAAA;AAAA,yBAEO,KAAK,SAASF,CAAK,CAAC;AAAA,4BACjBG,EAAS;AAAA,QACf,QAAQ;AAAA,QACR,UAAUX,EAAO,OAAO,KAAK;AAAA,QAC7B,QAAQQ,MAAU,KAAK;AAAA,QACvB,UAAU,EAAQR,EAAO;AAAA,MAAQ,CAClC,CAAC;AAAA;AAAA,oCAEcA,EAAO,OAAO,KAAK,QAAQ,SAAS,OAAO;AAAA,6BAClD,MAAM,KAAK,OAAOA,CAAM,CAAC;AAAA;AAAA,sBAEhCG,EAAYH,CAAM,CAAC;AAAA;AAAA,IAAA,CAGjC;AAAA;AAAA;AAAA,EAGN;AACF;AAvRUc,EAAA;AAAA,EADPC,EAAM,OAAO;AAAA,GA5GH7B,EA6GH,WAAA,OAAA;AAOA4B,EAAA;AAAA,EADPhB,EAAA;AAAM,GAnHIZ,EAoHH,WAAA,MAAA;AAGA4B,EAAA;AAAA,EADPhB,EAAA;AAAM,GAtHIZ,EAuHH,WAAA,OAAA;AAGA4B,EAAA;AAAA,EADPhB,EAAA;AAAM,GAzHIZ,EA0HH,WAAA,aAAA;AAGR4B,EAAA;AAAA,EADCE,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA5HnB9B,EA6HX,WAAA,SAAA;AAGA4B,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA/Hf9B,EAgIX,WAAA,OAAA;AAGA4B,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAlIf9B,EAmIX,WAAA,aAAA;AAGA4B,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GArIf9B,EAsIX,WAAA,MAAA;AAGA4B,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAxI/B9B,EAyIX,WAAA,UAAA;AAGA4B,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GA3I/B9B,EA4IX,WAAA,UAAA;AAGA4B,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GA9I9B9B,EA+IX,WAAA,OAAA;AAGA4B,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAjJf9B,EAkJX,WAAA,OAAA;AAGA4B,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,WAAW,cAAc;AAAA,GApJxC9B,EAqJX,WAAA,WAAA;AAiPF+B,EAAc,iBAAiB/B,CAAW;"}
|
|
1
|
+
{"version":3,"file":"kt-input-menu.js","sources":["../../../../src/components/forms/kt-input-menu/kt-input-menu.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { live } from 'lit/directives/live.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit, toggleListener, uniqueId } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport {\n filterOptions,\n firstEnabledIndex,\n lastEnabledIndex,\n listboxStyles,\n nextEnabledIndex,\n optionLabel,\n type KtOption,\n} from '#internal/listbox';\nimport { FloatingController, floatingStyles } from '#internal/floating';\nimport type { Side } from '#internal/position';\nimport { strings } from '#internal/strings';\nimport '../../core/kt-icon/kt-icon.js';\n\n/**\n * A combobox: type to narrow the list, then pick.\n *\n * Reach for it over `<kt-select>` once the list is long enough that scanning it\n * is slower than typing three letters — somewhere around twenty options.\n *\n * @element kt-input-menu\n *\n * @csspart control - The field.\n * @csspart input - The native `<input>`.\n * @csspart popup - The option list.\n * @csspart option - An option row.\n *\n * @fires kt-change - An option was chosen or cleared. `detail: { value, option }`.\n * @fires kt-filter - The query changed. `detail: { query }`.\n */\nexport class KtInputMenu extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n floatingStyles,\n listboxStyles,\n css`\n :host {\n position: relative;\n display: block;\n --field-height: var(--button-height);\n }\n\n .control {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-element);\n width: 100%;\n height: var(--field-height);\n padding: 0 var(--button-padding-x);\n color: var(--text-body);\n font: var(--font-input);\n background-color: var(--color-dark-20);\n border: none;\n border-radius: var(--radius-input);\n /* A resting hairline. A field is a fill on --surface-field, which is\n one ramp step from the page in dark and almost the same colour in\n light — so on a card or inside a modal it simply disappeared and\n read as a bare native control.\n\n A border rather than an outline, because the control inside fills\n the field exactly and a coincident outline is painted over by the\n native widget. A border insets the control by its own width, so it\n cannot be covered. box-sizing: border-box keeps the outer size.\n\n The hover and focus rings stay outlines on top of it, and the\n transparent resting outline is what they animate from: without it\n outline-color starts at the initial value, which resolves to the\n text colour, and hover flashed near-white before settling. */\n border: var(--border-width) solid var(--border-field);\n outline: var(--outline-width) solid transparent;\n cursor: text;\n transition:\n background-color var(--duration-instant),\n outline-color var(--duration-instant);\n }\n\n .control:hover {\n outline: var(--outline-width) solid var(--color-text-700);\n }\n .control:focus-within {\n background-color: var(--color-dark-12);\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n\n .error .control,\n .error .control:hover,\n .error .control:focus-within {\n outline: var(--outline-width) solid var(--color-danger-base);\n }\n\n :host(:disabled) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n input {\n width: 100%;\n min-width: 0;\n color: var(--text-body);\n font: var(--font-input);\n background: transparent;\n border: none;\n outline: none;\n }\n\n input::placeholder {\n color: var(--text-muted);\n }\n\n .icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n color: inherit;\n background: transparent;\n border: none;\n cursor: pointer;\n }\n\n .clear {\n transition: transform var(--duration-instant) ease-in-out;\n }\n .clear:hover {\n transform: rotate(90deg);\n }\n\n .toggle {\n transition: transform var(--duration-fast) ease-in-out;\n }\n .open .toggle {\n transform: scaleY(-1);\n }\n `,\n ];\n\n @query('input')\n private input!: HTMLInputElement;\n\n private internals: UsableInternals | null = null;\n private defaultValue: string | number | null = null;\n private readonly listId = uniqueId('kt-input-menu-list');\n\n @state()\n private open = false;\n\n /** The side the list opened on, for the direction of its entrance. */\n @state()\n private placement: Side = 'bottom';\n\n private floating = new FloatingController(this, {\n panel: () => this.shadowRoot?.querySelector<HTMLElement>('.popup'),\n anchor: () => this.shadowRoot?.querySelector('.control'),\n matchWidth: true,\n onPlace: (side) => {\n this.placement = side;\n },\n });\n\n @state()\n private query = '';\n\n @state()\n private activeIndex = -1;\n\n @property({ attribute: false })\n options: readonly KtOption[] = [];\n\n @property({ type: String })\n value: string | number | null = null;\n\n @property({ type: String })\n placeholder = '';\n\n @property({ type: String })\n name = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */\n @state()\n private formDisabled = false;\n\n /** Whether the control is off, by its own `disabled` or by its form. */\n private get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n @property({ type: String, reflect: true })\n error = '';\n\n @property({ type: String })\n label = '';\n\n @property({ type: String, attribute: 'empty-text' })\n emptyText: string | undefined = undefined;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n // Back on the document if it was reconnected while open.\n toggleListener(this.open, document, 'pointerdown', this.onDocumentPointerDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('pointerdown', this.onDocumentPointerDown);\n }\n\n // Untyped: `open` is private, so not among the keys PropertyValues<this> knows.\n override updated(changed: PropertyValues): void {\n // Only an open list closes on an outside click, so only an open one listens.\n if (changed.has('open')) {\n toggleListener(this.open, document, 'pointerdown', this.onDocumentPointerDown);\n }\n this.floating.sync(this.open);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (\n changed.has('value') ||\n changed.has('required') ||\n changed.has('error') ||\n this.stringsChanged(changed)\n ) {\n // The option id is what is submitted, never the label the field shows:\n // the label is for people, the id is for the server.\n setFormValue(this.internals, this.value === null ? null : String(this.value));\n\n const missing = this.required && this.value === null;\n setValidity(\n this.internals,\n { valueMissing: missing, customError: Boolean(this.error) },\n this.error || (missing ? strings().selectOption : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n this.close();\n }\n\n /**\n * Called by the platform when the control's disabled state changes — its\n * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.\n */\n formDisabledCallback(disabled: boolean): void {\n this.formDisabled = disabled;\n }\n\n formStateRestoreCallback(state: string): void {\n this.value = state;\n }\n\n override focus(options?: FocusOptions): void {\n this.input?.focus(options);\n }\n\n get selectedOption(): KtOption | undefined {\n return this.options.find((option) => option.id === this.value);\n }\n\n /** Options after the current query, which is what the keyboard walks. */\n private get visibleOptions(): readonly KtOption[] {\n return filterOptions(this.options, this.query);\n }\n\n /**\n * While filtering, the field shows the query; otherwise it shows the chosen\n * option. Keeping the two in one input is what makes it a combobox rather\n * than a search box that happens to sit above a list.\n */\n private get displayValue(): string {\n if (this.open && this.query) return this.query;\n const selected = this.selectedOption;\n return selected ? optionLabel(selected) : this.query;\n }\n\n private onDocumentPointerDown = (event: Event): void => {\n if (event.composedPath().includes(this)) return;\n this.close();\n };\n\n private openList(): void {\n if (this.inactive || this.open) return;\n this.open = true;\n this.activeIndex = firstEnabledIndex(this.visibleOptions);\n }\n\n private close(): void {\n this.open = false;\n this.query = '';\n this.activeIndex = -1;\n }\n\n private onInput(event: Event): void {\n this.query = (event.target as HTMLInputElement).value;\n this.open = true;\n this.activeIndex = firstEnabledIndex(this.visibleOptions);\n emit(this, 'kt-filter', { query: this.query });\n }\n\n private choose(option: KtOption): void {\n if (option.disabled) return;\n this.value = option.id;\n this.close();\n emit(this, 'kt-change', { value: option.id, option });\n }\n\n private clear(event: Event): void {\n event.stopPropagation();\n this.value = null;\n this.query = '';\n emit(this, 'kt-change', { value: null, option: null });\n this.input?.focus();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n const options = this.visibleOptions;\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n if (!this.open) return this.openList();\n this.activeIndex = nextEnabledIndex(\n options,\n this.activeIndex,\n event.key === 'ArrowDown' ? 1 : -1,\n );\n return;\n case 'Home':\n if (!this.open) return;\n event.preventDefault();\n this.activeIndex = firstEnabledIndex(options);\n return;\n case 'End':\n if (!this.open) return;\n event.preventDefault();\n this.activeIndex = lastEnabledIndex(options);\n return;\n case 'Enter': {\n if (!this.open) return;\n event.preventDefault();\n const option = options[this.activeIndex];\n if (option) this.choose(option);\n return;\n }\n case 'Escape':\n if (!this.open) return;\n event.stopPropagation();\n this.close();\n return;\n case 'Tab':\n this.close();\n }\n }\n\n private optionId(index: number): string {\n return `${this.listId}-option-${index}`;\n }\n\n override render(): TemplateResult {\n const options = this.visibleOptions;\n const showClear = this.selectedOption !== undefined && !this.inactive;\n\n return html`<div\n class=${classMap({ open: this.open, error: Boolean(this.error) })}\n @keydown=${this.onKeyDown}\n >\n <div part=\"control\" class=\"control\" @click=${this.openList}>\n <input\n part=\"input\"\n role=\"combobox\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.listId}\n aria-autocomplete=\"list\"\n aria-activedescendant=${\n this.open && this.activeIndex >= 0 ? this.optionId(this.activeIndex) : nothing\n }\n aria-label=${this.label || nothing}\n aria-invalid=${this.error ? 'true' : nothing}\n placeholder=${this.placeholder || nothing}\n .value=${live(this.displayValue)}\n ?disabled=${this.inactive}\n @focus=${this.openList}\n @input=${this.onInput}\n />\n\n ${\n showClear\n ? html`<button\n type=\"button\"\n class=\"icon-button clear\"\n aria-label=${strings().clear}\n tabindex=\"-1\"\n @click=${this.clear}\n >\n <kt-icon name=\"x\" size=\"18\"></kt-icon>\n </button>`\n : nothing\n }\n\n <button\n type=\"button\"\n class=\"icon-button toggle\"\n aria-label=${this.open ? strings().closeList : strings().openList}\n tabindex=\"-1\"\n @click=${(event: Event) => {\n event.stopPropagation();\n if (this.open) this.close();\n else this.openList();\n }}\n >\n <kt-icon name=\"chevron-down\" size=\"18\"></kt-icon>\n </button>\n </div>\n\n <ul\n part=\"popup\"\n id=${this.listId}\n popover=\"manual\"\n class=${classMap({ popup: true, floating: true, open: this.open, top: this.placement === 'top' })}\n role=\"listbox\"\n aria-label=${this.label || this.placeholder}\n >\n ${\n options.length === 0\n ? html`<li class=\"empty\">${this.emptyText ?? strings().noOptions}</li>`\n : options.map(\n (option, index) =>\n html`<li\n part=\"option\"\n id=${this.optionId(index)}\n class=${classMap({\n option: true,\n selected: option.id === this.value,\n active: index === this.activeIndex,\n disabled: Boolean(option.disabled),\n })}\n role=\"option\"\n aria-selected=${option.id === this.value ? 'true' : 'false'}\n @click=${() => this.choose(option)}\n >\n ${optionLabel(option)}\n </li>`,\n )\n }\n </ul>\n </div>`;\n }\n}\n\ndefineElement('kt-input-menu', KtInputMenu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-input-menu': KtInputMenu;\n }\n}\n"],"names":["KtInputMenu","KtElement","uniqueId","FloatingController","side","event","floatingStyles","listboxStyles","css","attachFormInternals","toggleListener","changed","setFormValue","missing","setValidity","strings","disabled","state","options","option","filterOptions","selected","optionLabel","firstEnabledIndex","emit","nextEnabledIndex","lastEnabledIndex","index","showClear","html","classMap","nothing","live","__decorateClass","query","property","defineElement"],"mappings":";;;;;;;;;;;;;;;;AA0CO,MAAMA,UAAoBC,EAAU;AAAA,EAApC,cAAA;AAAA,UAAA,GAAA,SAAA,GAgHL,KAAQ,YAAoC,MAC5C,KAAQ,eAAuC,MAC/C,KAAiB,SAASC,EAAS,oBAAoB,GAGvD,KAAQ,OAAO,IAIf,KAAQ,YAAkB,UAE1B,KAAQ,WAAW,IAAIC,EAAmB,MAAM;AAAA,MAC9C,OAAO,MAAM,KAAK,YAAY,cAA2B,QAAQ;AAAA,MACjE,QAAQ,MAAM,KAAK,YAAY,cAAc,UAAU;AAAA,MACvD,YAAY;AAAA,MACZ,SAAS,CAACC,MAAS;AACjB,aAAK,YAAYA;AAAA,MACnB;AAAA,IAAA,CACD,GAGD,KAAQ,QAAQ,IAGhB,KAAQ,cAAc,IAGtB,KAAA,UAA+B,CAAA,GAG/B,KAAA,QAAgC,MAGhC,KAAA,cAAc,IAGd,KAAA,OAAO,IAGP,KAAA,WAAW,IAIX,KAAQ,eAAe,IAQvB,KAAA,WAAW,IAGX,KAAA,QAAQ,IAGR,KAAA,QAAQ,IAGR,KAAA,YAAgC,QAqFhC,KAAQ,wBAAwB,CAACC,MAAuB;AACtD,MAAIA,EAAM,aAAA,EAAe,SAAS,IAAI,KACtC,KAAK,MAAA;AAAA,IACP;AAAA,EAAA;AAAA,EAnQA,OAAA;AAAA,SAAgB,iBAAiB;AAAA,EAAA;AAAA,EAEjC,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBJ,EAAU;AAAA,MACVK;AAAA,MACAC;AAAA,MACAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAoGF;AAAA;AAAA,EAmDA,IAAY,WAAoB;AAC9B,WAAO,KAAK,YAAY,KAAK;AAAA,EAC/B;AAAA,EAcS,oBAA0B;AACjC,UAAM,kBAAA,GACN,KAAK,cAAcC,EAAoB,IAAI,GAC3C,KAAK,eAAe,KAAK,OAEzBC,EAAe,KAAK,MAAM,UAAU,eAAe,KAAK,qBAAqB;AAAA,EAC/E;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAA,GACN,SAAS,oBAAoB,eAAe,KAAK,qBAAqB;AAAA,EACxE;AAAA;AAAA,EAGS,QAAQC,GAA+B;AAE9C,IAAIA,EAAQ,IAAI,MAAM,KACpBD,EAAe,KAAK,MAAM,UAAU,eAAe,KAAK,qBAAqB,GAE/E,KAAK,SAAS,KAAK,KAAK,IAAI;AAAA,EAC9B;AAAA,EAES,WAAWC,GAAqC;AACvD,QACEA,EAAQ,IAAI,OAAO,KACnBA,EAAQ,IAAI,UAAU,KACtBA,EAAQ,IAAI,OAAO,KACnB,KAAK,eAAeA,CAAO,GAC3B;AAGA,MAAAC,EAAa,KAAK,WAAW,KAAK,UAAU,OAAO,OAAO,OAAO,KAAK,KAAK,CAAC;AAE5E,YAAMC,IAAU,KAAK,YAAY,KAAK,UAAU;AAChD,MAAAC;AAAA,QACE,KAAK;AAAA,QACL,EAAE,cAAcD,GAAS,aAAa,EAAQ,KAAK,MAAK;AAAA,QACxD,KAAK,UAAUA,IAAUE,EAAA,EAAU,eAAe;AAAA,MAAA;AAAA,IAEtD;AAAA,EACF;AAAA,EAEA,oBAA0B;AACxB,SAAK,QAAQ,KAAK,cAClB,KAAK,MAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqBC,GAAyB;AAC5C,SAAK,eAAeA;AAAA,EACtB;AAAA,EAEA,yBAAyBC,GAAqB;AAC5C,SAAK,QAAQA;AAAAA,EACf;AAAA,EAES,MAAMC,GAA8B;AAC3C,SAAK,OAAO,MAAMA,CAAO;AAAA,EAC3B;AAAA,EAEA,IAAI,iBAAuC;AACzC,WAAO,KAAK,QAAQ,KAAK,CAACC,MAAWA,EAAO,OAAO,KAAK,KAAK;AAAA,EAC/D;AAAA;AAAA,EAGA,IAAY,iBAAsC;AAChD,WAAOC,EAAc,KAAK,SAAS,KAAK,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAY,eAAuB;AACjC,QAAI,KAAK,QAAQ,KAAK,cAAc,KAAK;AACzC,UAAMC,IAAW,KAAK;AACtB,WAAOA,IAAWC,EAAYD,CAAQ,IAAI,KAAK;AAAA,EACjD;AAAA,EAOQ,WAAiB;AACvB,IAAI,KAAK,YAAY,KAAK,SAC1B,KAAK,OAAO,IACZ,KAAK,cAAcE,EAAkB,KAAK,cAAc;AAAA,EAC1D;AAAA,EAEQ,QAAc;AACpB,SAAK,OAAO,IACZ,KAAK,QAAQ,IACb,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,QAAQlB,GAAoB;AAClC,SAAK,QAASA,EAAM,OAA4B,OAChD,KAAK,OAAO,IACZ,KAAK,cAAckB,EAAkB,KAAK,cAAc,GACxDC,EAAK,MAAM,aAAa,EAAE,OAAO,KAAK,OAAO;AAAA,EAC/C;AAAA,EAEQ,OAAOL,GAAwB;AACrC,IAAIA,EAAO,aACX,KAAK,QAAQA,EAAO,IACpB,KAAK,MAAA,GACLK,EAAK,MAAM,aAAa,EAAE,OAAOL,EAAO,IAAI,QAAAA,GAAQ;AAAA,EACtD;AAAA,EAEQ,MAAMd,GAAoB;AAChC,IAAAA,EAAM,gBAAA,GACN,KAAK,QAAQ,MACb,KAAK,QAAQ,IACbmB,EAAK,MAAM,aAAa,EAAE,OAAO,MAAM,QAAQ,MAAM,GACrD,KAAK,OAAO,MAAA;AAAA,EACd;AAAA,EAEQ,UAAUnB,GAA4B;AAC5C,UAAMa,IAAU,KAAK;AAErB,YAAQb,EAAM,KAAA;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAEH,YADAA,EAAM,eAAA,GACF,CAAC,KAAK,KAAM,QAAO,KAAK,SAAA;AAC5B,aAAK,cAAcoB;AAAA,UACjBP;AAAA,UACA,KAAK;AAAA,UACLb,EAAM,QAAQ,cAAc,IAAI;AAAA,QAAA;AAElC;AAAA,MACF,KAAK;AACH,YAAI,CAAC,KAAK,KAAM;AAChB,QAAAA,EAAM,eAAA,GACN,KAAK,cAAckB,EAAkBL,CAAO;AAC5C;AAAA,MACF,KAAK;AACH,YAAI,CAAC,KAAK,KAAM;AAChB,QAAAb,EAAM,eAAA,GACN,KAAK,cAAcqB,EAAiBR,CAAO;AAC3C;AAAA,MACF,KAAK,SAAS;AACZ,YAAI,CAAC,KAAK,KAAM;AAChB,QAAAb,EAAM,eAAA;AACN,cAAMc,IAASD,EAAQ,KAAK,WAAW;AACvC,QAAIC,KAAQ,KAAK,OAAOA,CAAM;AAC9B;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,CAAC,KAAK,KAAM;AAChB,QAAAd,EAAM,gBAAA,GACN,KAAK,MAAA;AACL;AAAA,MACF,KAAK;AACH,aAAK,MAAA;AAAA,IAAM;AAAA,EAEjB;AAAA,EAEQ,SAASsB,GAAuB;AACtC,WAAO,GAAG,KAAK,MAAM,WAAWA,CAAK;AAAA,EACvC;AAAA,EAES,SAAyB;AAChC,UAAMT,IAAU,KAAK,gBACfU,IAAY,KAAK,mBAAmB,UAAa,CAAC,KAAK;AAE7D,WAAOC;AAAA,cACGC,EAAS,EAAE,MAAM,KAAK,MAAM,OAAO,EAAQ,KAAK,OAAQ,CAAC;AAAA,iBACtD,KAAK,SAAS;AAAA;AAAA,mDAEoB,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA,0BAItC,KAAK,OAAO,SAAS,OAAO;AAAA,0BAC5B,KAAK,MAAM;AAAA;AAAA,kCAGzB,KAAK,QAAQ,KAAK,eAAe,IAAI,KAAK,SAAS,KAAK,WAAW,IAAIC,CACzE;AAAA,uBACa,KAAK,SAASA,CAAO;AAAA,yBACnB,KAAK,QAAQ,SAASA,CAAO;AAAA,wBAC9B,KAAK,eAAeA,CAAO;AAAA,mBAChCC,EAAK,KAAK,YAAY,CAAC;AAAA,sBACpB,KAAK,QAAQ;AAAA,mBAChB,KAAK,QAAQ;AAAA,mBACb,KAAK,OAAO;AAAA;AAAA;AAAA,UAIrBJ,IACIC;AAAA;AAAA;AAAA,6BAGed,EAAA,EAAU,KAAK;AAAA;AAAA,yBAEnB,KAAK,KAAK;AAAA;AAAA;AAAA,2BAIrBgB,CACN;AAAA;AAAA;AAAA;AAAA;AAAA,uBAKe,KAAK,OAAOhB,EAAA,EAAU,YAAYA,EAAA,EAAU,QAAQ;AAAA;AAAA,mBAExD,CAACV,MAAiB;AACzB,MAAAA,EAAM,gBAAA,GACF,KAAK,OAAM,KAAK,MAAA,SACV,SAAA;AAAA,IACZ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAQE,KAAK,MAAM;AAAA;AAAA,gBAERyB,EAAS,EAAE,OAAO,IAAM,UAAU,IAAM,MAAM,KAAK,MAAM,KAAK,KAAK,cAAc,MAAA,CAAO,CAAC;AAAA;AAAA,qBAEpF,KAAK,SAAS,KAAK,WAAW;AAAA;AAAA,UAGzCZ,EAAQ,WAAW,IACfW,sBAAyB,KAAK,aAAad,EAAA,EAAU,SAAS,UAC9DG,EAAQ;AAAA,MACN,CAACC,GAAQQ,MACPE;AAAA;AAAA,yBAEO,KAAK,SAASF,CAAK,CAAC;AAAA,4BACjBG,EAAS;AAAA,QACf,QAAQ;AAAA,QACR,UAAUX,EAAO,OAAO,KAAK;AAAA,QAC7B,QAAQQ,MAAU,KAAK;AAAA,QACvB,UAAU,EAAQR,EAAO;AAAA,MAAQ,CAClC,CAAC;AAAA;AAAA,oCAEcA,EAAO,OAAO,KAAK,QAAQ,SAAS,OAAO;AAAA,6BAClD,MAAM,KAAK,OAAOA,CAAM,CAAC;AAAA;AAAA,sBAEhCG,EAAYH,CAAM,CAAC;AAAA;AAAA,IAAA,CAGjC;AAAA;AAAA;AAAA,EAGN;AACF;AAhUUc,EAAA;AAAA,EADPC,EAAM,OAAO;AAAA,GA7GHlC,EA8GH,WAAA,OAAA;AAOAiC,EAAA;AAAA,EADPhB,EAAA;AAAM,GApHIjB,EAqHH,WAAA,MAAA;AAIAiC,EAAA;AAAA,EADPhB,EAAA;AAAM,GAxHIjB,EAyHH,WAAA,WAAA;AAYAiC,EAAA;AAAA,EADPhB,EAAA;AAAM,GApIIjB,EAqIH,WAAA,OAAA;AAGAiC,EAAA;AAAA,EADPhB,EAAA;AAAM,GAvIIjB,EAwIH,WAAA,aAAA;AAGRiC,EAAA;AAAA,EADCE,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA1InBnC,EA2IX,WAAA,SAAA;AAGAiC,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA7IfnC,EA8IX,WAAA,OAAA;AAGAiC,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAhJfnC,EAiJX,WAAA,aAAA;AAGAiC,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAnJfnC,EAoJX,WAAA,MAAA;AAGAiC,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAtJ/BnC,EAuJX,WAAA,UAAA;AAIQiC,EAAA;AAAA,EADPhB,EAAA;AAAM,GA1JIjB,EA2JH,WAAA,cAAA;AAQRiC,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAlK/BnC,EAmKX,WAAA,UAAA;AAGAiC,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GArK9BnC,EAsKX,WAAA,OAAA;AAGAiC,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAxKfnC,EAyKX,WAAA,OAAA;AAGAiC,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAQ,WAAW,cAAc;AAAA,GA3KxCnC,EA4KX,WAAA,WAAA;AAoQFoC,EAAc,iBAAiBpC,CAAW;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css as p, html as i } from "lit";
|
|
2
2
|
import { query as d, property as f } from "lit/decorators.js";
|
|
3
|
-
import { K as u, d as c } from "../../../chunks/kt-element-
|
|
3
|
+
import { K as u, d as c } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
4
4
|
var b = Object.defineProperty, a = (r, t, s, h) => {
|
|
5
5
|
for (var e = void 0, o = r.length - 1, n; o >= 0; o--)
|
|
6
6
|
(n = r[o]) && (e = n(t, s, e) || e);
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
2
|
+
import { KtElement } from '#internal/kt-element';
|
|
3
|
+
export type KtRadioGroupOrientation = 'vertical' | 'horizontal';
|
|
4
|
+
/**
|
|
5
|
+
* One option of a `<kt-radio-group>`.
|
|
6
|
+
*
|
|
7
|
+
* It draws itself and carries `role="radio"`; the group owns the selection,
|
|
8
|
+
* the tab stop and the keyboard. A `<kt-radio>` outside a group does nothing
|
|
9
|
+
* useful.
|
|
10
|
+
*
|
|
11
|
+
* @element kt-radio
|
|
12
|
+
*
|
|
13
|
+
* @slot - The label.
|
|
14
|
+
*
|
|
15
|
+
* @csspart base - The `role="radio"` row.
|
|
16
|
+
* @csspart circle - The drawn circle.
|
|
17
|
+
*/
|
|
18
|
+
export declare class KtRadio extends KtElement {
|
|
19
|
+
static styles: import("lit").CSSResultGroup[];
|
|
20
|
+
/** Submitted by the group when this option is chosen. */
|
|
21
|
+
value: string;
|
|
22
|
+
disabled: boolean;
|
|
23
|
+
/** Set by the group. */
|
|
24
|
+
checked: boolean;
|
|
25
|
+
/** Set by the group: whether this option holds the group's one tab stop. */
|
|
26
|
+
tabbable: boolean;
|
|
27
|
+
/** Set by the group while it reports an error. */
|
|
28
|
+
invalid: boolean;
|
|
29
|
+
/** Set by the group while the whole group is disabled. */
|
|
30
|
+
groupDisabled: boolean;
|
|
31
|
+
private get inactive();
|
|
32
|
+
focus(options?: FocusOptions): void;
|
|
33
|
+
render(): TemplateResult;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* One choice among a few, all visible at once.
|
|
37
|
+
*
|
|
38
|
+
* Reach for it over `<kt-select>` when there are few enough options to show
|
|
39
|
+
* them all — seeing every option is the point — and over
|
|
40
|
+
* `<kt-segmented-control>` when the options need a sentence each, or the
|
|
41
|
+
* choice belongs in a form rather than a toolbar.
|
|
42
|
+
*
|
|
43
|
+
* Native radios cannot form a group across shadow roots, so this is the ARIA
|
|
44
|
+
* radio group pattern: one tab stop for the whole group, arrow keys move and
|
|
45
|
+
* select, disabled options are skipped.
|
|
46
|
+
*
|
|
47
|
+
* @element kt-radio-group
|
|
48
|
+
*
|
|
49
|
+
* @slot - The `<kt-radio>` options.
|
|
50
|
+
*
|
|
51
|
+
* @csspart base - The `role="radiogroup"` container.
|
|
52
|
+
*
|
|
53
|
+
* @fires kt-change - An option was chosen. `detail: { value }`.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```html
|
|
57
|
+
* <kt-radio-group label="Billing" name="billing" value="monthly">
|
|
58
|
+
* <kt-radio value="monthly">Monthly</kt-radio>
|
|
59
|
+
* <kt-radio value="yearly">Yearly — two months free</kt-radio>
|
|
60
|
+
* </kt-radio-group>
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare class KtRadioGroup extends KtElement {
|
|
64
|
+
static readonly formAssociated = true;
|
|
65
|
+
static styles: import("lit").CSSResultGroup[];
|
|
66
|
+
private radios;
|
|
67
|
+
private internals;
|
|
68
|
+
private defaultValue;
|
|
69
|
+
/** The chosen option's value, or `null`. */
|
|
70
|
+
value: string | null;
|
|
71
|
+
name: string;
|
|
72
|
+
/** Accessible name of the group. */
|
|
73
|
+
label: string;
|
|
74
|
+
disabled: boolean;
|
|
75
|
+
/** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */
|
|
76
|
+
private formDisabled;
|
|
77
|
+
/** Whether the control is off, by its own `disabled` or by its form. */
|
|
78
|
+
private get inactive();
|
|
79
|
+
required: boolean;
|
|
80
|
+
orientation: KtRadioGroupOrientation;
|
|
81
|
+
/** Error message. A non-empty value puts the group in its error state. */
|
|
82
|
+
error: string;
|
|
83
|
+
connectedCallback(): void;
|
|
84
|
+
disconnectedCallback(): void;
|
|
85
|
+
willUpdate(changed: PropertyValues<this>): void;
|
|
86
|
+
updated(): void;
|
|
87
|
+
formResetCallback(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Called by the platform when the control's disabled state changes — its
|
|
90
|
+
* own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.
|
|
91
|
+
*/
|
|
92
|
+
formDisabledCallback(disabled: boolean): void;
|
|
93
|
+
formStateRestoreCallback(state: string | null): void;
|
|
94
|
+
focus(options?: FocusOptions): void;
|
|
95
|
+
private enabled;
|
|
96
|
+
/**
|
|
97
|
+
* Pushes the group's state down; the radios are the display, not the truth.
|
|
98
|
+
* The tab stop sits on the chosen option, or the first enabled one.
|
|
99
|
+
*/
|
|
100
|
+
private syncRadios;
|
|
101
|
+
private choose;
|
|
102
|
+
private onClick;
|
|
103
|
+
/** Arrows move and select, wrapping; Space selects the focused option. */
|
|
104
|
+
private onKeyDown;
|
|
105
|
+
render(): TemplateResult;
|
|
106
|
+
}
|
|
107
|
+
declare global {
|
|
108
|
+
interface HTMLElementTagNameMap {
|
|
109
|
+
'kt-radio': KtRadio;
|
|
110
|
+
'kt-radio-group': KtRadioGroup;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { css as b, nothing as d, html as p } from "lit";
|
|
2
|
+
import { property as a, queryAssignedElements as y, state as m } from "lit/decorators.js";
|
|
3
|
+
import { K as u, d as v } from "../../../chunks/kt-element-Djx2JcGl.js";
|
|
4
|
+
import { e as g } from "../../../chunks/events-r51msXNf.js";
|
|
5
|
+
import { a as k, s as w, b as x } from "../../../chunks/form-control-B74_EHtG.js";
|
|
6
|
+
import { s as f } from "../../../chunks/index-STEEvEP7.js";
|
|
7
|
+
var D = Object.defineProperty, i = (c, e, t, l) => {
|
|
8
|
+
for (var r = void 0, o = c.length - 1, h; o >= 0; o--)
|
|
9
|
+
(h = c[o]) && (r = h(e, t, r) || r);
|
|
10
|
+
return r && D(e, t, r), r;
|
|
11
|
+
};
|
|
12
|
+
class n extends u {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments), this.value = "", this.disabled = !1, this.checked = !1, this.tabbable = !1, this.invalid = !1, this.groupDisabled = !1;
|
|
15
|
+
}
|
|
16
|
+
static {
|
|
17
|
+
this.styles = [
|
|
18
|
+
u.styles,
|
|
19
|
+
b`
|
|
20
|
+
:host {
|
|
21
|
+
display: block;
|
|
22
|
+
--radio-size: calc(var(--button-height) * 0.45);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.radio {
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
align-items: flex-start;
|
|
28
|
+
gap: var(--gap-button);
|
|
29
|
+
color: var(--text-body);
|
|
30
|
+
font: var(--font-normal-regular);
|
|
31
|
+
outline: none;
|
|
32
|
+
cursor: pointer;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.circle {
|
|
36
|
+
position: relative;
|
|
37
|
+
flex: none;
|
|
38
|
+
width: var(--radio-size);
|
|
39
|
+
height: var(--radio-size);
|
|
40
|
+
margin-top: calc((1lh - var(--radio-size)) / 2);
|
|
41
|
+
background-color: var(--surface-field);
|
|
42
|
+
border: var(--border-width) solid var(--border-field);
|
|
43
|
+
border-radius: var(--radius-full);
|
|
44
|
+
transition: border-color var(--duration-instant);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* The dot: a fill inset by a third of the circle. */
|
|
48
|
+
.circle::after {
|
|
49
|
+
content: '';
|
|
50
|
+
position: absolute;
|
|
51
|
+
inset: 22%;
|
|
52
|
+
border-radius: var(--radius-full);
|
|
53
|
+
background-color: var(--color-primary-base);
|
|
54
|
+
transform: scale(0);
|
|
55
|
+
transition: transform var(--duration-fast);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.radio:hover .circle {
|
|
59
|
+
border-color: var(--text-muted);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.radio:focus-visible .circle {
|
|
63
|
+
outline: var(--outline-width) solid var(--color-primary-base);
|
|
64
|
+
outline-offset: 2px;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.radio[aria-checked='true'] .circle {
|
|
68
|
+
border-color: var(--color-primary-base);
|
|
69
|
+
}
|
|
70
|
+
.radio[aria-checked='true'] .circle::after {
|
|
71
|
+
transform: scale(1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
:host([invalid]) .circle {
|
|
75
|
+
border-color: var(--color-danger-base);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
:host([disabled]) .radio,
|
|
79
|
+
:host([group-disabled]) .radio {
|
|
80
|
+
color: var(--text-disabled);
|
|
81
|
+
cursor: not-allowed;
|
|
82
|
+
}
|
|
83
|
+
:host([disabled]) .circle,
|
|
84
|
+
:host([group-disabled]) .circle {
|
|
85
|
+
background-color: var(--color-dark-22);
|
|
86
|
+
border-color: var(--color-dark-24);
|
|
87
|
+
}
|
|
88
|
+
:host([disabled]) .circle::after,
|
|
89
|
+
:host([group-disabled]) .circle::after {
|
|
90
|
+
background-color: var(--text-disabled);
|
|
91
|
+
}
|
|
92
|
+
`
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
get inactive() {
|
|
96
|
+
return this.disabled || this.groupDisabled;
|
|
97
|
+
}
|
|
98
|
+
focus(e) {
|
|
99
|
+
this.shadowRoot?.querySelector(".radio")?.focus(e);
|
|
100
|
+
}
|
|
101
|
+
render() {
|
|
102
|
+
return p`<div
|
|
103
|
+
part="base"
|
|
104
|
+
class="radio"
|
|
105
|
+
role="radio"
|
|
106
|
+
aria-checked=${this.checked ? "true" : "false"}
|
|
107
|
+
aria-disabled=${this.inactive ? "true" : d}
|
|
108
|
+
tabindex=${this.tabbable && !this.inactive ? 0 : -1}
|
|
109
|
+
>
|
|
110
|
+
<span part="circle" class="circle"></span>
|
|
111
|
+
<span class="text"><slot></slot></span>
|
|
112
|
+
</div>`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
i([
|
|
116
|
+
a({ type: String, reflect: !0 })
|
|
117
|
+
], n.prototype, "value");
|
|
118
|
+
i([
|
|
119
|
+
a({ type: Boolean, reflect: !0 })
|
|
120
|
+
], n.prototype, "disabled");
|
|
121
|
+
i([
|
|
122
|
+
a({ type: Boolean, reflect: !0 })
|
|
123
|
+
], n.prototype, "checked");
|
|
124
|
+
i([
|
|
125
|
+
a({ type: Boolean, attribute: !1 })
|
|
126
|
+
], n.prototype, "tabbable");
|
|
127
|
+
i([
|
|
128
|
+
a({ type: Boolean, reflect: !0 })
|
|
129
|
+
], n.prototype, "invalid");
|
|
130
|
+
i([
|
|
131
|
+
a({ type: Boolean, reflect: !0, attribute: "group-disabled" })
|
|
132
|
+
], n.prototype, "groupDisabled");
|
|
133
|
+
class s extends u {
|
|
134
|
+
constructor() {
|
|
135
|
+
super(...arguments), this.internals = null, this.defaultValue = null, this.value = null, this.name = "", this.label = "", this.disabled = !1, this.formDisabled = !1, this.required = !1, this.orientation = "vertical", this.error = "", this.syncRadios = () => {
|
|
136
|
+
const e = this.enabled(), l = e.find((r) => r.value === this.value) ?? e[0];
|
|
137
|
+
for (const r of this.radios)
|
|
138
|
+
r.checked = r.value === this.value, r.tabbable = r === l, r.invalid = !!this.error, r.groupDisabled = this.inactive;
|
|
139
|
+
}, this.onClick = (e) => {
|
|
140
|
+
const t = e.composedPath().find((l) => l instanceof n);
|
|
141
|
+
!t || !this.enabled().includes(t) || (this.choose(t), t.focus());
|
|
142
|
+
}, this.onKeyDown = (e) => {
|
|
143
|
+
const t = this.enabled();
|
|
144
|
+
if (t.length === 0) return;
|
|
145
|
+
const l = e.composedPath().find((h) => h instanceof n), r = l ? t.indexOf(l) : -1;
|
|
146
|
+
let o;
|
|
147
|
+
if (e.key === "ArrowDown" || e.key === "ArrowRight")
|
|
148
|
+
o = t[(r + 1) % t.length];
|
|
149
|
+
else if (e.key === "ArrowUp" || e.key === "ArrowLeft")
|
|
150
|
+
o = t[(r - 1 + t.length) % t.length];
|
|
151
|
+
else if (e.key === " " && l && r >= 0)
|
|
152
|
+
o = l;
|
|
153
|
+
else
|
|
154
|
+
return;
|
|
155
|
+
e.preventDefault(), o && (this.choose(o), this.updateComplete.then(() => o.focus()));
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
static {
|
|
159
|
+
this.formAssociated = !0;
|
|
160
|
+
}
|
|
161
|
+
static {
|
|
162
|
+
this.styles = [
|
|
163
|
+
u.styles,
|
|
164
|
+
b`
|
|
165
|
+
:host {
|
|
166
|
+
display: block;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.group {
|
|
170
|
+
display: flex;
|
|
171
|
+
flex-direction: column;
|
|
172
|
+
gap: var(--gap-element);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
:host([orientation='horizontal']) .group {
|
|
176
|
+
flex-direction: row;
|
|
177
|
+
flex-wrap: wrap;
|
|
178
|
+
column-gap: var(--gap-card);
|
|
179
|
+
}
|
|
180
|
+
`
|
|
181
|
+
];
|
|
182
|
+
}
|
|
183
|
+
/** Whether the control is off, by its own `disabled` or by its form. */
|
|
184
|
+
get inactive() {
|
|
185
|
+
return this.disabled || this.formDisabled;
|
|
186
|
+
}
|
|
187
|
+
connectedCallback() {
|
|
188
|
+
super.connectedCallback(), this.internals ??= k(this), this.defaultValue = this.value, this.addEventListener("click", this.onClick), this.addEventListener("keydown", this.onKeyDown);
|
|
189
|
+
}
|
|
190
|
+
disconnectedCallback() {
|
|
191
|
+
super.disconnectedCallback(), this.removeEventListener("click", this.onClick), this.removeEventListener("keydown", this.onKeyDown);
|
|
192
|
+
}
|
|
193
|
+
willUpdate(e) {
|
|
194
|
+
if (e.has("value") || e.has("required") || e.has("error") || this.stringsChanged(e)) {
|
|
195
|
+
w(this.internals, this.value);
|
|
196
|
+
const t = this.required && this.value === null;
|
|
197
|
+
x(
|
|
198
|
+
this.internals,
|
|
199
|
+
{ valueMissing: t, customError: !!this.error },
|
|
200
|
+
this.error || (t ? f().selectOption : "")
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
updated() {
|
|
205
|
+
this.syncRadios();
|
|
206
|
+
}
|
|
207
|
+
formResetCallback() {
|
|
208
|
+
this.value = this.defaultValue;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Called by the platform when the control's disabled state changes — its
|
|
212
|
+
* own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.
|
|
213
|
+
*/
|
|
214
|
+
formDisabledCallback(e) {
|
|
215
|
+
this.formDisabled = e;
|
|
216
|
+
}
|
|
217
|
+
formStateRestoreCallback(e) {
|
|
218
|
+
this.value = e;
|
|
219
|
+
}
|
|
220
|
+
focus(e) {
|
|
221
|
+
this.radios.find((t) => t.tabbable)?.focus(e);
|
|
222
|
+
}
|
|
223
|
+
enabled() {
|
|
224
|
+
return this.inactive ? [] : this.radios.filter((e) => !e.disabled);
|
|
225
|
+
}
|
|
226
|
+
choose(e) {
|
|
227
|
+
e.value !== this.value && (this.value = e.value, g(this, "kt-change", { value: this.value }));
|
|
228
|
+
}
|
|
229
|
+
render() {
|
|
230
|
+
return p`${this.error ? p`<span id="error-message" class="visually-hidden">${this.error}</span>` : d}
|
|
231
|
+
<div
|
|
232
|
+
part="base"
|
|
233
|
+
class="group"
|
|
234
|
+
role="radiogroup"
|
|
235
|
+
aria-label=${this.label || f().options}
|
|
236
|
+
aria-orientation=${this.orientation}
|
|
237
|
+
aria-required=${this.required ? "true" : d}
|
|
238
|
+
aria-invalid=${this.error ? "true" : d}
|
|
239
|
+
aria-disabled=${this.inactive ? "true" : d}
|
|
240
|
+
aria-describedby=${this.error ? "error-message" : d}
|
|
241
|
+
>
|
|
242
|
+
<slot @slotchange=${this.syncRadios}></slot>
|
|
243
|
+
</div>`;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
i([
|
|
247
|
+
y({ selector: "kt-radio" })
|
|
248
|
+
], s.prototype, "radios");
|
|
249
|
+
i([
|
|
250
|
+
a({ type: String, reflect: !0 })
|
|
251
|
+
], s.prototype, "value");
|
|
252
|
+
i([
|
|
253
|
+
a({ type: String })
|
|
254
|
+
], s.prototype, "name");
|
|
255
|
+
i([
|
|
256
|
+
a({ type: String })
|
|
257
|
+
], s.prototype, "label");
|
|
258
|
+
i([
|
|
259
|
+
a({ type: Boolean, reflect: !0 })
|
|
260
|
+
], s.prototype, "disabled");
|
|
261
|
+
i([
|
|
262
|
+
m()
|
|
263
|
+
], s.prototype, "formDisabled");
|
|
264
|
+
i([
|
|
265
|
+
a({ type: Boolean, reflect: !0 })
|
|
266
|
+
], s.prototype, "required");
|
|
267
|
+
i([
|
|
268
|
+
a({ type: String, reflect: !0 })
|
|
269
|
+
], s.prototype, "orientation");
|
|
270
|
+
i([
|
|
271
|
+
a({ type: String, reflect: !0 })
|
|
272
|
+
], s.prototype, "error");
|
|
273
|
+
v("kt-radio", n);
|
|
274
|
+
v("kt-radio-group", s);
|
|
275
|
+
export {
|
|
276
|
+
n as KtRadio,
|
|
277
|
+
s as KtRadioGroup
|
|
278
|
+
};
|
|
279
|
+
//# sourceMappingURL=kt-radio-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kt-radio-group.js","sources":["../../../../src/components/forms/kt-radio-group/kt-radio-group.ts"],"sourcesContent":["import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, queryAssignedElements, state } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from '#internal/form-control';\nimport { strings } from '#internal/strings';\n\nexport type KtRadioGroupOrientation = 'vertical' | 'horizontal';\n\n/**\n * One option of a `<kt-radio-group>`.\n *\n * It draws itself and carries `role=\"radio\"`; the group owns the selection,\n * the tab stop and the keyboard. A `<kt-radio>` outside a group does nothing\n * useful.\n *\n * @element kt-radio\n *\n * @slot - The label.\n *\n * @csspart base - The `role=\"radio\"` row.\n * @csspart circle - The drawn circle.\n */\nexport class KtRadio extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n --radio-size: calc(var(--button-height) * 0.45);\n }\n\n .radio {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--gap-button);\n color: var(--text-body);\n font: var(--font-normal-regular);\n outline: none;\n cursor: pointer;\n }\n\n .circle {\n position: relative;\n flex: none;\n width: var(--radio-size);\n height: var(--radio-size);\n margin-top: calc((1lh - var(--radio-size)) / 2);\n background-color: var(--surface-field);\n border: var(--border-width) solid var(--border-field);\n border-radius: var(--radius-full);\n transition: border-color var(--duration-instant);\n }\n\n /* The dot: a fill inset by a third of the circle. */\n .circle::after {\n content: '';\n position: absolute;\n inset: 22%;\n border-radius: var(--radius-full);\n background-color: var(--color-primary-base);\n transform: scale(0);\n transition: transform var(--duration-fast);\n }\n\n .radio:hover .circle {\n border-color: var(--text-muted);\n }\n\n .radio:focus-visible .circle {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 2px;\n }\n\n .radio[aria-checked='true'] .circle {\n border-color: var(--color-primary-base);\n }\n .radio[aria-checked='true'] .circle::after {\n transform: scale(1);\n }\n\n :host([invalid]) .circle {\n border-color: var(--color-danger-base);\n }\n\n :host([disabled]) .radio,\n :host([group-disabled]) .radio {\n color: var(--text-disabled);\n cursor: not-allowed;\n }\n :host([disabled]) .circle,\n :host([group-disabled]) .circle {\n background-color: var(--color-dark-22);\n border-color: var(--color-dark-24);\n }\n :host([disabled]) .circle::after,\n :host([group-disabled]) .circle::after {\n background-color: var(--text-disabled);\n }\n `,\n ];\n\n /** Submitted by the group when this option is chosen. */\n @property({ type: String, reflect: true })\n value = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Set by the group. */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /** Set by the group: whether this option holds the group's one tab stop. */\n @property({ type: Boolean, attribute: false })\n tabbable = false;\n\n /** Set by the group while it reports an error. */\n @property({ type: Boolean, reflect: true })\n invalid = false;\n\n /** Set by the group while the whole group is disabled. */\n @property({ type: Boolean, reflect: true, attribute: 'group-disabled' })\n groupDisabled = false;\n\n private get inactive(): boolean {\n return this.disabled || this.groupDisabled;\n }\n\n override focus(options?: FocusOptions): void {\n this.shadowRoot?.querySelector<HTMLElement>('.radio')?.focus(options);\n }\n\n override render(): TemplateResult {\n return html`<div\n part=\"base\"\n class=\"radio\"\n role=\"radio\"\n aria-checked=${this.checked ? 'true' : 'false'}\n aria-disabled=${this.inactive ? 'true' : nothing}\n tabindex=${this.tabbable && !this.inactive ? 0 : -1}\n >\n <span part=\"circle\" class=\"circle\"></span>\n <span class=\"text\"><slot></slot></span>\n </div>`;\n }\n}\n\n/**\n * One choice among a few, all visible at once.\n *\n * Reach for it over `<kt-select>` when there are few enough options to show\n * them all — seeing every option is the point — and over\n * `<kt-segmented-control>` when the options need a sentence each, or the\n * choice belongs in a form rather than a toolbar.\n *\n * Native radios cannot form a group across shadow roots, so this is the ARIA\n * radio group pattern: one tab stop for the whole group, arrow keys move and\n * select, disabled options are skipped.\n *\n * @element kt-radio-group\n *\n * @slot - The `<kt-radio>` options.\n *\n * @csspart base - The `role=\"radiogroup\"` container.\n *\n * @fires kt-change - An option was chosen. `detail: { value }`.\n *\n * @example\n * ```html\n * <kt-radio-group label=\"Billing\" name=\"billing\" value=\"monthly\">\n * <kt-radio value=\"monthly\">Monthly</kt-radio>\n * <kt-radio value=\"yearly\">Yearly — two months free</kt-radio>\n * </kt-radio-group>\n * ```\n */\nexport class KtRadioGroup extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .group {\n display: flex;\n flex-direction: column;\n gap: var(--gap-element);\n }\n\n :host([orientation='horizontal']) .group {\n flex-direction: row;\n flex-wrap: wrap;\n column-gap: var(--gap-card);\n }\n `,\n ];\n\n @queryAssignedElements({ selector: 'kt-radio' })\n private radios!: KtRadio[];\n\n private internals: UsableInternals | null = null;\n private defaultValue: string | null = null;\n\n /** The chosen option's value, or `null`. */\n @property({ type: String, reflect: true })\n value: string | null = null;\n\n @property({ type: String })\n name = '';\n\n /** Accessible name of the group. */\n @property({ type: String })\n label = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */\n @state()\n private formDisabled = false;\n\n /** Whether the control is off, by its own `disabled` or by its form. */\n private get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n @property({ type: String, reflect: true })\n orientation: KtRadioGroupOrientation = 'vertical';\n\n /** Error message. A non-empty value puts the group in its error state. */\n @property({ type: String, reflect: true })\n error = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n // On the host: the radios are slotted light-DOM children.\n this.addEventListener('click', this.onClick);\n this.addEventListener('keydown', this.onKeyDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('click', this.onClick);\n this.removeEventListener('keydown', this.onKeyDown);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (\n changed.has('value') ||\n changed.has('required') ||\n changed.has('error') ||\n this.stringsChanged(changed)\n ) {\n setFormValue(this.internals, this.value);\n\n const missing = this.required && this.value === null;\n setValidity(\n this.internals,\n { valueMissing: missing, customError: Boolean(this.error) },\n this.error || (missing ? strings().selectOption : ''),\n );\n }\n }\n\n override updated(): void {\n this.syncRadios();\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n }\n\n /**\n * Called by the platform when the control's disabled state changes — its\n * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.\n */\n formDisabledCallback(disabled: boolean): void {\n this.formDisabled = disabled;\n }\n\n formStateRestoreCallback(state: string | null): void {\n this.value = state;\n }\n\n override focus(options?: FocusOptions): void {\n this.radios.find((radio) => radio.tabbable)?.focus(options);\n }\n\n private enabled(): KtRadio[] {\n return this.inactive ? [] : this.radios.filter((radio) => !radio.disabled);\n }\n\n /**\n * Pushes the group's state down; the radios are the display, not the truth.\n * The tab stop sits on the chosen option, or the first enabled one.\n */\n private syncRadios = (): void => {\n const enabled = this.enabled();\n const chosen = enabled.find((radio) => radio.value === this.value);\n const tabStop = chosen ?? enabled[0];\n\n for (const radio of this.radios) {\n radio.checked = radio.value === this.value;\n radio.tabbable = radio === tabStop;\n radio.invalid = Boolean(this.error);\n radio.groupDisabled = this.inactive;\n }\n };\n\n private choose(radio: KtRadio): void {\n if (radio.value === this.value) return;\n this.value = radio.value;\n emit(this, 'kt-change', { value: this.value });\n }\n\n private onClick = (event: Event): void => {\n const radio = event.composedPath().find((node): node is KtRadio => node instanceof KtRadio);\n if (!radio || !this.enabled().includes(radio)) return;\n this.choose(radio);\n radio.focus();\n };\n\n /** Arrows move and select, wrapping; Space selects the focused option. */\n private onKeyDown = (event: KeyboardEvent): void => {\n const enabled = this.enabled();\n if (enabled.length === 0) return;\n\n const focused = event.composedPath().find((node): node is KtRadio => node instanceof KtRadio);\n const from = focused ? enabled.indexOf(focused) : -1;\n\n let target: KtRadio | undefined;\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {\n target = enabled[(from + 1) % enabled.length];\n } else if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') {\n target = enabled[(from - 1 + enabled.length) % enabled.length];\n } else if (event.key === ' ' && focused && from >= 0) {\n target = focused;\n } else {\n return;\n }\n\n event.preventDefault();\n if (!target) return;\n this.choose(target);\n void this.updateComplete.then(() => target.focus());\n };\n\n override render(): TemplateResult {\n return html`${\n this.error\n ? html`<span id=\"error-message\" class=\"visually-hidden\">${this.error}</span>`\n : nothing\n }\n <div\n part=\"base\"\n class=\"group\"\n role=\"radiogroup\"\n aria-label=${this.label || strings().options}\n aria-orientation=${this.orientation}\n aria-required=${this.required ? 'true' : nothing}\n aria-invalid=${this.error ? 'true' : nothing}\n aria-disabled=${this.inactive ? 'true' : nothing}\n aria-describedby=${this.error ? 'error-message' : nothing}\n >\n <slot @slotchange=${this.syncRadios}></slot>\n </div>`;\n }\n}\n\ndefineElement('kt-radio', KtRadio);\ndefineElement('kt-radio-group', KtRadioGroup);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-radio': KtRadio;\n 'kt-radio-group': KtRadioGroup;\n }\n}\n"],"names":["KtRadio","KtElement","css","options","html","nothing","__decorateClass","property","KtRadioGroup","enabled","tabStop","radio","event","node","focused","from","target","attachFormInternals","changed","setFormValue","missing","setValidity","strings","disabled","state","emit","queryAssignedElements","defineElement"],"mappings":"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"}
|
|
@@ -36,6 +36,9 @@ export declare class KtSelect extends KtElement {
|
|
|
36
36
|
private defaultValue;
|
|
37
37
|
private readonly listId;
|
|
38
38
|
private open;
|
|
39
|
+
/** The side the list opened on, for the direction of its entrance. */
|
|
40
|
+
private placement;
|
|
41
|
+
private floating;
|
|
39
42
|
/** Index of the active descendant while the list is open; -1 for none. */
|
|
40
43
|
private activeIndex;
|
|
41
44
|
/** The options to choose from. A property: this is data, not an attribute. */
|
|
@@ -46,6 +49,10 @@ export declare class KtSelect extends KtElement {
|
|
|
46
49
|
name: string;
|
|
47
50
|
size: KtSelectSize;
|
|
48
51
|
disabled: boolean;
|
|
52
|
+
/** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */
|
|
53
|
+
private formDisabled;
|
|
54
|
+
/** Whether the control is off, by its own `disabled` or by its form. */
|
|
55
|
+
private get inactive();
|
|
49
56
|
required: boolean;
|
|
50
57
|
/** Error message. A non-empty value puts the control in its error state. */
|
|
51
58
|
error: string;
|
|
@@ -57,8 +64,14 @@ export declare class KtSelect extends KtElement {
|
|
|
57
64
|
emptyText: string | undefined;
|
|
58
65
|
connectedCallback(): void;
|
|
59
66
|
disconnectedCallback(): void;
|
|
67
|
+
updated(changed: PropertyValues): void;
|
|
60
68
|
willUpdate(changed: PropertyValues<this>): void;
|
|
61
69
|
formResetCallback(): void;
|
|
70
|
+
/**
|
|
71
|
+
* Called by the platform when the control's disabled state changes — its
|
|
72
|
+
* own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.
|
|
73
|
+
*/
|
|
74
|
+
formDisabledCallback(disabled: boolean): void;
|
|
62
75
|
formStateRestoreCallback(state: string): void;
|
|
63
76
|
focus(options?: FocusOptions): void;
|
|
64
77
|
/** The currently selected option, if the id still matches one. */
|