@verbb/plugin-kit-web 2.0.3 → 2.0.4
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/CHANGELOG.md +13 -0
- package/dist/chunks/{autoloader-DzOTQqe6.js → autoloader-DXK9MVuw.js} +2 -2
- package/dist/chunks/{autoloader-DzOTQqe6.js.map → autoloader-DXK9MVuw.js.map} +1 -1
- package/dist/chunks/{component-registry-CpZiIDh4.js → component-registry-BOlxFlou.js} +1 -1
- package/dist/chunks/{component-registry-CpZiIDh4.js.map → component-registry-BOlxFlou.js.map} +1 -1
- package/dist/chunks/{pk-button-Cilu5WAT.js → pk-button-QpDDlRbG.js} +8 -3
- package/dist/chunks/pk-button-QpDDlRbG.js.map +1 -0
- package/dist/chunks/{pk-checkbox-select-ZEJ6WIQn.js → pk-checkbox-select-9lqd9Rwz.js} +2 -1
- package/dist/chunks/{pk-checkbox-select-ZEJ6WIQn.js.map → pk-checkbox-select-9lqd9Rwz.js.map} +1 -1
- package/dist/chunks/{pk-combobox-Dd1ik0Ko.js → pk-combobox-DtkXaX67.js} +3 -2
- package/dist/chunks/pk-combobox-DtkXaX67.js.map +1 -0
- package/dist/chunks/{pk-copy-button-DPh5TOF9.js → pk-copy-button-C17MLLYS.js} +2 -1
- package/dist/chunks/{pk-copy-button-DPh5TOF9.js.map → pk-copy-button-C17MLLYS.js.map} +1 -1
- package/dist/chunks/{pk-date-picker-CkwU4DzD.js → pk-date-picker-DIoQlPI9.js} +3 -2
- package/dist/chunks/pk-date-picker-DIoQlPI9.js.map +1 -0
- package/dist/chunks/{pk-dropdown-item-BFyjtsL5.js → pk-dropdown-item-P3LLojCI.js} +16 -1
- package/dist/chunks/pk-dropdown-item-P3LLojCI.js.map +1 -0
- package/dist/chunks/{pk-dropdown-label-DfACId-K.js → pk-dropdown-label-ibVrU6-U.js} +10 -4
- package/dist/chunks/pk-dropdown-label-ibVrU6-U.js.map +1 -0
- package/dist/chunks/{pk-dropdown-menu-DWlxkDIs.js → pk-dropdown-menu-CsX95MCP.js} +2 -2
- package/dist/chunks/pk-dropdown-menu-CsX95MCP.js.map +1 -0
- package/dist/chunks/{pk-editable-table-pBkD6izs.js → pk-editable-table-wtsSKfzS.js} +14 -1
- package/dist/chunks/{pk-editable-table-pBkD6izs.js.map → pk-editable-table-wtsSKfzS.js.map} +1 -1
- package/dist/chunks/{pk-option-C3Zqmu3z.js → pk-option-C-cR-jOv.js} +11 -3
- package/dist/chunks/pk-option-C-cR-jOv.js.map +1 -0
- package/dist/chunks/{pk-popover-XZZdJ4WI.js → pk-popover-CVvwXMld.js} +2 -2
- package/dist/chunks/pk-popover-CVvwXMld.js.map +1 -0
- package/dist/chunks/{pk-select-B17rV6BR.js → pk-select-odSNU1tN.js} +3 -2
- package/dist/chunks/pk-select-odSNU1tN.js.map +1 -0
- package/dist/chunks/{pk-tab-CzV7pOdp.js → pk-tab-BdoPiYfT.js} +8 -2
- package/dist/chunks/pk-tab-BdoPiYfT.js.map +1 -0
- package/dist/chunks/{pk-time-picker-DbW_hMs2.js → pk-time-picker-DtX0LtID.js} +3 -2
- package/dist/chunks/{pk-time-picker-DbW_hMs2.js.map → pk-time-picker-DtX0LtID.js.map} +1 -1
- package/dist/chunks/{pk-tiptap-editor-umIuEaXh.js → pk-tiptap-editor-CdoutapZ.js} +10 -1
- package/dist/chunks/{pk-tiptap-editor-umIuEaXh.js.map → pk-tiptap-editor-CdoutapZ.js.map} +1 -1
- package/dist/chunks/pk-tooltip-fcUbVGli.js.map +1 -1
- package/dist/chunks/popup-pointer-DMnuZDQl.js +34 -0
- package/dist/chunks/popup-pointer-DMnuZDQl.js.map +1 -0
- package/dist/chunks/register-22v142C-.js +143 -0
- package/dist/chunks/register-22v142C-.js.map +1 -0
- package/dist/chunks/{register-components-DNw6EYNo.js → register-components-BG_6_v_T.js} +1 -1
- package/dist/chunks/{register-components-DNw6EYNo.js.map → register-components-BG_6_v_T.js.map} +1 -1
- package/dist/components/button/pk-button.js +1 -1
- package/dist/components/button/pk-button.styles.d.ts.map +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/checkbox-select/pk-checkbox-select.js +1 -1
- package/dist/components/checkbox-select.js +1 -1
- package/dist/components/combobox/pk-combobox.d.ts.map +1 -1
- package/dist/components/combobox/pk-combobox.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/copy-button/pk-copy-button.js +1 -1
- package/dist/components/copy-button.js +1 -1
- package/dist/components/date-picker/pk-date-picker.d.ts.map +1 -1
- package/dist/components/date-picker/pk-date-picker.js +1 -1
- package/dist/components/date-picker.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu-size.styles.d.ts.map +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-item.js +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-item.styles.d.ts.map +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-label.js +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-label.styles.d.ts.map +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-menu.js +1 -1
- package/dist/components/dropdown-menu.js +3 -3
- package/dist/components/editable-table/pk-editable-table.js +1 -1
- package/dist/components/editable-table.js +1 -1
- package/dist/components/popover/pk-popover.d.ts.map +1 -1
- package/dist/components/popover/pk-popover.js +1 -1
- package/dist/components/popover.js +1 -1
- package/dist/components/select/pk-option.js +1 -1
- package/dist/components/select/pk-option.styles.d.ts.map +1 -1
- package/dist/components/select/pk-select.d.ts.map +1 -1
- package/dist/components/select/pk-select.js +1 -1
- package/dist/components/select.js +2 -2
- package/dist/components/tabs/pk-tab.js +1 -1
- package/dist/components/tabs/pk-tab.styles.d.ts.map +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/time-picker/pk-time-picker.js +1 -1
- package/dist/components/time-picker.js +1 -1
- package/dist/components/tiptap/pk-tiptap-editor.js +1 -1
- package/dist/components/tiptap-editor.js +1 -1
- package/dist/components/tooltip/pk-tooltip.d.ts.map +1 -1
- package/dist/index.js +19 -19
- package/dist/plugin-kit.js +2 -2
- package/dist/register-components.js +1 -1
- package/dist/register.js +18 -79
- package/dist/utils/popup-pointer.d.ts +3 -0
- package/dist/utils/popup-pointer.d.ts.map +1 -1
- package/dist-loader/chunks/{pk-button-BlSs4e6V.js → pk-button-CK5FZiwP.js} +9 -5
- package/dist-loader/chunks/{pk-calendar-RXCDDhLI.js → pk-calendar-Ir5izQJH.js} +3 -3
- package/dist-loader/chunks/{pk-checkbox-hJCj8In8.js → pk-checkbox-CoDX2G3J.js} +2 -2
- package/dist-loader/chunks/{pk-color-input-BfNtLznP.js → pk-color-input-BEmVZXSP.js} +2 -2
- package/dist-loader/chunks/{pk-combobox-1PJBcIrV.js → pk-combobox-fXGaY4L0.js} +11 -10
- package/dist-loader/chunks/{pk-date-picker-D4vCtbw-.js → pk-date-picker-B3eWgHtv.js} +12 -11
- package/dist-loader/chunks/{pk-dialog-D1RZjwQN.js → pk-dialog-CP1YT85H.js} +4 -4
- package/dist-loader/chunks/{pk-dropdown-item-BJIhQ0Mw.js → pk-dropdown-item-DkZRcPJ5.js} +20 -5
- package/dist-loader/chunks/{pk-dropdown-menu-I1s3TBiA.js → pk-dropdown-menu-CajQAobW.js} +6 -6
- package/dist-loader/chunks/{pk-field-BnKPT_Kk.js → pk-field-CIfymz5G.js} +3 -3
- package/dist-loader/chunks/{pk-input-Oarjv7Vc.js → pk-input-CXE7_rTQ.js} +6 -6
- package/dist-loader/chunks/{pk-lightswitch-D-UrNM3y.js → pk-lightswitch-BHEOy7aK.js} +4 -4
- package/dist-loader/chunks/{pk-option-CCZebfif.js → pk-option-vh8UvSAI.js} +12 -4
- package/dist-loader/chunks/{pk-popup-BNRyCsVX.js → pk-popup-BYFbKaHH.js} +2 -2
- package/dist-loader/chunks/{pk-select-BcbtjIoP.js → pk-select-CbmPJCx8.js} +11 -10
- package/dist-loader/chunks/{pk-textarea-CC6WXpIu.js → pk-textarea-Ch8JpP83.js} +4 -4
- package/dist-loader/chunks/{pk-time-picker-BtGXo-KJ.js → pk-time-picker-DZljwJn9.js} +4 -3
- package/dist-loader/chunks/{pk-tooltip-JJRxVXYD.js → pk-tooltip-DHiCn33o.js} +3 -3
- package/dist-loader/chunks/popup-pointer-BTS3Y6LE.js +32 -0
- package/dist-loader/chunks/{render-DApFfV9S.js → render-BCU9WDSk.js} +1 -1
- package/dist-loader/chunks/{icons-B1i-oRoD.js → svg-BCGsRUz7.js} +34 -1
- package/dist-loader/chunks/{tiptap-Db7MTUH1.js → tiptap-_LAjdgeV.js} +1 -1
- package/dist-loader/chunks/{tiptap.styles-DAH_90Fi.js → tiptap.styles-CDjt6Iz4.js} +1 -1
- package/dist-loader/components/button/button.js +1 -1
- package/dist-loader/components/button-group/button-group-text.js +1 -1
- package/dist-loader/components/calendar/calendar.js +1 -1
- package/dist-loader/components/checkbox/checkbox.js +1 -1
- package/dist-loader/components/checkbox-select/checkbox-select.js +1 -0
- package/dist-loader/components/code-editor/code-editor.js +2 -2
- package/dist-loader/components/color-input/color-input.js +1 -1
- package/dist-loader/components/combobox/combobox.js +1 -1
- package/dist-loader/components/copy-button/copy-button.js +3 -2
- package/dist-loader/components/date-picker/date-picker.js +1 -1
- package/dist-loader/components/dialog/dialog.js +1 -1
- package/dist-loader/components/dropdown-menu/dropdown-item.js +1 -1
- package/dist-loader/components/dropdown-menu/dropdown-label.js +9 -3
- package/dist-loader/components/dropdown-menu/dropdown-menu.js +1 -1
- package/dist-loader/components/editable-table/editable-table.js +16 -3
- package/dist-loader/components/field/field.js +1 -1
- package/dist-loader/components/icon/icon.js +43 -2
- package/dist-loader/components/input/input.js +1 -1
- package/dist-loader/components/input-group/input-group.js +1 -1
- package/dist-loader/components/lightswitch/lightswitch.js +1 -1
- package/dist-loader/components/popover/popover.js +6 -6
- package/dist-loader/components/popup/popup.js +1 -1
- package/dist-loader/components/radio-group/radio-group.js +3 -3
- package/dist-loader/components/select/option.js +1 -1
- package/dist-loader/components/select/select.js +1 -1
- package/dist-loader/components/tabs/tab.js +7 -1
- package/dist-loader/components/textarea/textarea.js +1 -1
- package/dist-loader/components/time-picker/time-picker.js +1 -1
- package/dist-loader/components/tiptap/tiptap-content.js +2 -2
- package/dist-loader/components/tiptap/tiptap-editor.js +13 -5
- package/dist-loader/components/tiptap/tiptap-input.js +3 -3
- package/dist-loader/components/toggle/toggle.js +1 -1
- package/dist-loader/components/tooltip/tooltip.js +1 -1
- package/package.json +8 -7
- package/dist/chunks/pk-button-Cilu5WAT.js.map +0 -1
- package/dist/chunks/pk-combobox-Dd1ik0Ko.js.map +0 -1
- package/dist/chunks/pk-date-picker-CkwU4DzD.js.map +0 -1
- package/dist/chunks/pk-dropdown-item-BFyjtsL5.js.map +0 -1
- package/dist/chunks/pk-dropdown-label-DfACId-K.js.map +0 -1
- package/dist/chunks/pk-dropdown-menu-DWlxkDIs.js.map +0 -1
- package/dist/chunks/pk-option-C3Zqmu3z.js.map +0 -1
- package/dist/chunks/pk-popover-XZZdJ4WI.js.map +0 -1
- package/dist/chunks/pk-select-B17rV6BR.js.map +0 -1
- package/dist/chunks/pk-tab-CzV7pOdp.js.map +0 -1
- package/dist/chunks/popup-pointer-C8lypj8V.js +0 -21
- package/dist/chunks/popup-pointer-C8lypj8V.js.map +0 -1
- package/dist/register.js.map +0 -1
- package/dist-loader/chunks/popup-pointer-BC4n_sNb.js +0 -19
- package/dist-loader/chunks/svg-Boar0Kf1.js +0 -34
- /package/dist-loader/chunks/{animate-with-class-DT0jwaR_.js → animate-with-class-B2hHgK5M.js} +0 -0
- /package/dist-loader/chunks/{button-group-item.styles-Dwakbyx5.js → button-group-item.styles-BNc-ksl1.js} +0 -0
- /package/dist-loader/chunks/{codemirror-CSgOT0QM.js → codemirror-CHXb-wYU.js} +0 -0
- /package/dist-loader/chunks/{field-labels-D3lKQ2nq.js → field-labels-Vo3wHq49.js} +0 -0
- /package/dist-loader/chunks/{floating-ui-87vslRWW.js → floating-ui-BTBNFWAR.js} +0 -0
- /package/dist-loader/chunks/{has-slot-BGJeJdHr.js → has-slot-BZDcCpf9.js} +0 -0
- /package/dist-loader/chunks/{mirror-validator-C5XrXPaq.js → mirror-validator-DEz3BsbN.js} +0 -0
- /package/dist-loader/chunks/{overlay-lifecycle-C3tSQ3UR.js → overlay-lifecycle-BG4QMRLw.js} +0 -0
- /package/dist-loader/chunks/{pk-clear-BMZUzwDt.js → pk-clear-BRS8vkV-.js} +0 -0
- /package/dist-loader/chunks/{popup-content-animation.styles-S6CK-zPp.js → popup-content-animation.styles-C9ffC35f.js} +0 -0
- /package/dist-loader/chunks/{popup-placement-animation-WlEXnS85.js → popup-placement-animation-BPjq650B.js} +0 -0
- /package/dist-loader/chunks/{required-validator-0XwZtX9k.js → required-validator-DXqqPVeW.js} +0 -0
- /package/dist-loader/chunks/{sync-listbox-separators-Bcja51HC.js → sync-listbox-separators-CT3oGzTf.js} +0 -0
|
@@ -5,7 +5,7 @@ import { i as unregisterDismissible, n as isTopDismissible, r as registerDismiss
|
|
|
5
5
|
import { i as PkShowEvent, n as PkAfterShowEvent, r as PkHideEvent, t as PkAfterHideEvent } from "./overlay-lifecycle-D0pkTQyI.js";
|
|
6
6
|
import { r as resolveElementById } from "./pk-popup-CgiXok-U.js";
|
|
7
7
|
import { i as waitForPopupReposition, r as syncPopupPlacementAnimation } from "./popup-placement-animation-WlEXnS85.js";
|
|
8
|
-
import { n as isPointerInsideOverlay } from "./popup-pointer-
|
|
8
|
+
import { n as isPointerInsideOverlay } from "./popup-pointer-DMnuZDQl.js";
|
|
9
9
|
import { t as popupContentAnimationStyles } from "./popup-content-animation.styles-Dc6d9quJ.js";
|
|
10
10
|
import { css, html, nothing } from "lit";
|
|
11
11
|
import { classMap } from "lit/directives/class-map.js";
|
|
@@ -374,4 +374,4 @@ PkPopover = __decorate([customElement("pk-popover")], PkPopover);
|
|
|
374
374
|
//#endregion
|
|
375
375
|
export { PkPopover as t };
|
|
376
376
|
|
|
377
|
-
//# sourceMappingURL=pk-popover-
|
|
377
|
+
//# sourceMappingURL=pk-popover-CVvwXMld.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pk-popover-CVvwXMld.js","names":[],"sources":["../../src/components/popover/pk-popover.styles.ts","../../src/components/popover/pk-popover.ts"],"sourcesContent":["import { css } from 'lit';\n\nimport { buttonGroupCornerRoleStyles } from '../button-group/button-group-item.styles.js';\nimport { popupContentAnimationStyles } from '../../styles/popup-content-animation.styles.js';\n\nexport const pkPopoverStyles = [\n buttonGroupCornerRoleStyles(),\n popupContentAnimationStyles,\n css`\n @layer pk-component {\n :host {\n /* Flex column parents stretch cross-axis size — pin to content.\n (inline-block + align-self; same class of fix as dialog / dropdown.) */\n display: inline-block;\n max-width: 100%;\n align-self: flex-start;\n flex: none;\n vertical-align: middle;\n }\n\n :host([data-pk-group-orientation]) {\n display: inline-flex;\n vertical-align: middle;\n flex: 0 0 auto;\n align-self: auto;\n }\n\n :host([data-pk-group-orientation]) ::slotted([slot='trigger']) {\n --pk-bg-start-start-radius: inherit;\n --pk-bg-start-end-radius: inherit;\n --pk-bg-end-start-radius: inherit;\n --pk-bg-end-end-radius: inherit;\n }\n\n :host([data-pk-group-orientation='horizontal'][data-pk-group-join]) {\n margin-inline-start: var(--pk-bg-horizontal-indent, 0);\n }\n\n :host([data-pk-group-orientation='vertical'][data-pk-group-join]) {\n margin-block-start: var(--pk-bg-vertical-indent, 0);\n }\n\n :host([data-pk-group-orientation='horizontal'][data-pk-group-join]:has([slot='trigger'][variant='outline'], [slot='trigger'][variant='dashed'])) {\n margin-inline-start: var(--pk-bg-horizontal-indent-outlined, 0);\n }\n\n :host([data-pk-group-orientation='vertical'][data-pk-group-join]:has([slot='trigger'][variant='outline'], [slot='trigger'][variant='dashed'])) {\n margin-block-start: var(--pk-bg-vertical-indent-outlined, 0);\n }\n\n /* Match pk-popup's arrow fill to the panel surface when with-arrow is on. */\n :host([with-arrow]) {\n --pk-popup-arrow-color: var(--pk-color-white);\n --pk-popup-arrow-size: 8px;\n }\n\n .panel {\n box-sizing: border-box;\n width: 18rem;\n padding: 1rem;\n border-radius: var(--pk-radius-md);\n background: var(--pk-color-white);\n box-shadow: var(--pk-shadow-popover);\n /* Craft CP body text (~gray-700), not gray-900. */\n color: var(--pk-color-gray-700);\n }\n\n /* Flush panels for command/menu chrome that owns its own inset (variable picker, etc.).\n Match kit v1 PopoverContent min-w 260px / max-w 360px: without min-width,\n width max-content shrinks to short labels and looks narrower than the old picker. */\n :host([flush]) .panel {\n width: max-content;\n min-width: var(--pk-popover-flush-min-width, 16.25rem);\n max-width: min(var(--pk-popover-flush-max-width, 22.5rem), 100vw - 1rem);\n padding: 0;\n }\n\n .panel[hidden] {\n display: none !important;\n }\n }\n `,\n];\n","import { html, nothing } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport type { PropertyValues } from 'lit';\n\nimport { isTopDismissible, registerDismissible, unregisterDismissible } from '../../a11y/dismissible-stack.js';\nimport { uniqueId } from '../../a11y/focus.js';\nimport { PkElement } from '../../base/pk-element.js';\nimport { resolveElementById } from '../../internal/resolve-element-by-id.js';\nimport {\n PkAfterHideEvent,\n PkAfterShowEvent,\n PkHideEvent,\n PkShowEvent,\n type PkOverlaySource,\n} from '../../events/overlay-lifecycle.js';\n// Keep the internal element registered when production builds erase type-only imports.\nimport '../popup/pk-popup.js';\nimport type { PkPopup, PkPopupPlacement } from '../popup/pk-popup.js';\nimport {\n syncPopupPlacementAnimation,\n waitForPopupReposition,\n} from '../../utils/popup-placement-animation.js';\nimport { isPointerInsideOverlay } from '../../utils/popup-pointer.js';\nimport { pkPopoverStyles } from './pk-popover.styles.js';\n\n/**\n * Popover — pattern: trigger toggles a floating panel.\n *\n * @slot trigger - Popover trigger\n * @slot - Popover content\n *\n * @csspart panel - Floating content panel\n *\n * @attr with-arrow - Show a pointing arrow toward the trigger (default: off)\n */\n@customElement('pk-popover')\nexport class PkPopover extends PkElement {\n static override styles = pkPopoverStyles;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ reflect: true })\n placement: PkPopupPlacement = 'bottom';\n\n @property({ attribute: 'side-offset', type: Number })\n sideOffset = 4;\n\n /**\n * Drop default panel padding/fixed width so slotted chrome (command lists, etc.)\n * can control its own inset. Consumer outer `p-0` alone cannot reach `.panel`.\n */\n @property({ type: Boolean, reflect: true })\n flush = false;\n\n /**\n * Show a floating-ui arrow on the panel (off by default).\n * Named like other optional chrome (`with-clear`, `with-caret`) — tooltip always\n * paints its own arrow and has no toggle.\n */\n @property({ attribute: 'with-arrow', type: Boolean, reflect: true })\n withArrow = false;\n\n /** Anchor element id — alternative to the trigger slot. */\n @property({ reflect: true })\n for = '';\n\n /**\n * Live element anchor — use when the target lives in another shadow tree\n * (e.g. TipTap chips). Preferred over `for` / trigger slot when set.\n * Stays in the consumer tree so modal `showModal()` inert does not apply\n * (unlike portaling the panel to a root outside the dialog).\n */\n @property({ attribute: false })\n anchor: Element | null = null;\n\n @query('pk-popup')\n private popupElement!: PkPopup;\n\n private get panelElement(): HTMLDivElement | null {\n return this.popupElement?.getContentElement() as HTMLDivElement | null ?? null;\n }\n\n @state()\n private triggerElement: HTMLElement | null = null;\n\n /** True while the shared popup-content exit animation is running. */\n @state()\n private closing = false;\n\n /** Gates `data-open` so enter motion starts after Floating UI places the panel. */\n @state()\n private panelAnimated = false;\n\n private readonly triggerId = uniqueId('pk-popover-trigger');\n private dismissRegistered = false;\n /** Guard re-entry while openPopover/closePopover mutate `open`. */\n private syncingOpenSideEffects = false;\n /** Coalesce overlapping close calls (updated + light-dismiss) onto one exit. */\n private exitAnimationPromise: Promise<void> | null = null;\n\n override disconnectedCallback(): void {\n // Skip exit motion on teardown — demote immediately.\n void this.closePopover('api', true);\n super.disconnectedCallback();\n }\n\n /**\n * When controlled/toggle `open` flips false, arm `closing` in the same update so the\n * panel is not `hidden` for a frame before the exit animation starts.\n */\n override willUpdate(changed: PropertyValues): void {\n if (\n changed.has('open')\n && this.open === false\n && changed.get('open') === true\n && !this.syncingOpenSideEffects\n && !this.closing\n ) {\n this.closing = true;\n this.panelAnimated = false;\n }\n }\n\n /**\n * Controlled `open` (e.g. React) must arm/disarm light-dismiss the same way as\n * trigger toggles. Without this, programmatic open shows the panel but click-away\n * never fires.\n */\n override async updated(changed: PropertyValues): Promise<void> {\n super.updated(changed);\n\n if (!changed.has('open') || this.syncingOpenSideEffects) {\n return;\n }\n\n const previousOpen = changed.get('open');\n\n if (previousOpen === this.open) {\n return;\n }\n\n // Initial connect with open=false — nothing to tear down.\n if (previousOpen === undefined && this.open === false) {\n return;\n }\n\n if (this.open) {\n await this.openPopover();\n } else {\n await this.closePopover('api');\n }\n }\n\n private onTriggerSlotChange(event: Event): void {\n const slot = event.target as HTMLSlotElement;\n const [trigger] = slot.assignedElements({ flatten: true }) as HTMLElement[];\n\n this.unbindTrigger(this.triggerElement);\n this.triggerElement = trigger ?? null;\n this.bindTrigger(this.triggerElement);\n }\n\n private bindTrigger(trigger: HTMLElement | null): void {\n if (!trigger) {\n return;\n }\n\n if (!trigger.id) {\n trigger.id = this.triggerId;\n }\n\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.addEventListener('click', this.handleToggleClick);\n this.syncExpanded();\n }\n\n private unbindTrigger(trigger: HTMLElement | null): void {\n trigger?.removeEventListener('click', this.handleToggleClick);\n }\n\n private handleToggleClick = (event: Event): void => {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.closing) {\n return;\n }\n\n // Flip `open` only — side effects run from `updated()` (same as dropdown-menu).\n this.open = !this.open;\n };\n\n private async openPopover(): Promise<void> {\n if (!this.getAnchor()) {\n return;\n }\n\n // Finish any in-flight exit before arming a new open.\n if (this.exitAnimationPromise) {\n await this.exitAnimationPromise;\n }\n\n // Already armed from a prior controlled/toggle open.\n if (this.dismissRegistered && this.open) {\n if (this.panelElement) {\n this.panelElement.hidden = false;\n }\n this.syncExpanded();\n return;\n }\n\n if (!this.dispatchEvent(new PkShowEvent())) {\n this.syncingOpenSideEffects = true;\n this.open = false;\n this.syncingOpenSideEffects = false;\n return;\n }\n\n this.syncingOpenSideEffects = true;\n this.open = true;\n this.syncingOpenSideEffects = false;\n this.closing = false;\n this.panelAnimated = false;\n\n if (this.panelElement) {\n this.panelElement.hidden = false;\n // Seed side before first paint so enter keyframes pick a direction.\n syncPopupPlacementAnimation(this.panelElement, this.placement);\n }\n\n this.syncExpanded();\n this.registerDismissHandlers();\n\n await this.updateComplete;\n const placement = await waitForPopupReposition(this.popupElement, this.placement);\n\n if (this.panelElement) {\n syncPopupPlacementAnimation(this.panelElement, placement);\n }\n\n // Flip data-open after placement so the shared enter animation can run.\n this.panelAnimated = true;\n\n this.dispatchEvent(new PkAfterShowEvent());\n this.dispatchEvent(new CustomEvent('pk-open-change', {\n detail: { open: true },\n bubbles: true,\n composed: true,\n }));\n }\n\n /**\n * @param immediate Skip exit animation (disconnect / forced teardown).\n */\n async closePopover(source: PkOverlaySource = 'unknown', immediate = false): Promise<void> {\n if (this.exitAnimationPromise) {\n return this.exitAnimationPromise;\n }\n\n if (!this.dismissRegistered && !this.closing && !this.open) {\n return;\n }\n\n const hideEvent = new PkHideEvent(source);\n\n if (!this.dispatchEvent(hideEvent)) {\n // Controlled close was cancelled — restore open and cancel exit arming.\n this.syncingOpenSideEffects = true;\n this.open = true;\n this.syncingOpenSideEffects = false;\n this.closing = false;\n this.panelAnimated = true;\n return;\n }\n\n this.unregisterDismissHandlers();\n this.closing = true;\n this.panelAnimated = false;\n\n if (this.open) {\n this.syncingOpenSideEffects = true;\n this.open = false;\n this.syncingOpenSideEffects = false;\n }\n\n const finishClose = async (): Promise<void> => {\n if (!immediate) {\n await this.updateComplete;\n await this.waitForExitAnimation();\n }\n\n this.closing = false;\n this.panelAnimated = false;\n\n if (this.panelElement) {\n this.panelElement.hidden = true;\n this.panelElement.removeAttribute('data-side');\n }\n\n this.syncExpanded();\n\n this.dispatchEvent(new PkAfterHideEvent());\n this.dispatchEvent(new CustomEvent('pk-open-change', {\n detail: { open: false },\n bubbles: true,\n composed: true,\n }));\n };\n\n this.exitAnimationPromise = finishClose().finally(() => {\n this.exitAnimationPromise = null;\n });\n\n return this.exitAnimationPromise;\n }\n\n private waitForExitAnimation(): Promise<void> {\n const panel = this.panelElement;\n\n if (!panel) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n panel.removeEventListener('animationend', onAnimationEnd);\n window.clearTimeout(fallback);\n panel.classList.remove('closing');\n resolve();\n };\n\n const onAnimationEnd = (event: AnimationEvent): void => {\n if (event.target === panel && event.animationName.startsWith('pk-popup-content-out')) {\n finish();\n }\n };\n\n panel.classList.add('closing');\n panel.addEventListener('animationend', onAnimationEnd);\n const fallback = window.setTimeout(finish, 150);\n });\n }\n\n private getAnchor(): Element | string | null {\n if (this.anchor) {\n return this.anchor;\n }\n\n if (this.for) {\n return resolveElementById(this, this.for);\n }\n\n if (this.triggerElement) {\n return this.triggerElement;\n }\n\n return null;\n }\n\n private registerDismissHandlers(): void {\n if (this.dismissRegistered) {\n return;\n }\n\n registerDismissible(this);\n this.dismissRegistered = true;\n document.addEventListener('pointerdown', this.onDocumentPointerDown, true);\n document.addEventListener('keydown', this.onDocumentKeyDown, true);\n }\n\n private unregisterDismissHandlers(): void {\n if (this.dismissRegistered) {\n unregisterDismissible(this);\n this.dismissRegistered = false;\n }\n\n document.removeEventListener('pointerdown', this.onDocumentPointerDown, true);\n document.removeEventListener('keydown', this.onDocumentKeyDown, true);\n }\n\n private onDocumentPointerDown = (event: PointerEvent): void => {\n if (this.isPointerInside(event) || this.closing) {\n return;\n }\n\n void this.closePopover('light-dismiss');\n };\n\n private isPointerInside(event: PointerEvent): boolean {\n return isPointerInsideOverlay(event, {\n host: this,\n anchor: this.getAnchorElement(),\n panel: this.panelElement,\n });\n };\n\n private onDocumentKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || !isTopDismissible(this) || this.closing) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n void this.closePopover('escape');\n };\n\n private getAnchorElement(): HTMLElement | null {\n if (this.anchor instanceof HTMLElement) {\n return this.anchor;\n }\n\n if (this.triggerElement) {\n return this.triggerElement;\n }\n\n if (this.for) {\n return resolveElementById(this, this.for);\n }\n\n return null;\n }\n\n private syncExpanded(): void {\n this.triggerElement?.setAttribute('aria-expanded', this.open ? 'true' : 'false');\n }\n\n override render() {\n const anchor = this.getAnchor();\n\n return html`\n <slot name=\"trigger\" @slotchange=${this.onTriggerSlotChange}></slot>\n <pk-popup\n .active=${this.open || this.closing}\n .anchor=${anchor ?? ''}\n .placement=${this.placement}\n .distance=${this.sideOffset}\n .arrow=${this.withArrow}\n flip\n shift\n >\n <div\n part=\"panel\"\n class=${classMap({\n panel: true,\n 'pk-popup-content': true,\n closing: this.closing,\n })}\n ?hidden=${!this.open && !this.closing}\n data-open=${this.panelAnimated && !this.closing ? '' : nothing}\n tabindex=${this.open ? '-1' : nothing}\n >\n <slot></slot>\n </div>\n </pk-popup>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-popover': PkPopover;\n }\n}\n"],"mappings":"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"}
|
|
@@ -10,9 +10,10 @@ import { i as unregisterDismissible, n as isTopDismissible, r as registerDismiss
|
|
|
10
10
|
import { i as scrollIntoView } from "./scroll-lock-B4o9vdzJ.js";
|
|
11
11
|
import { t as PkClearEvent } from "./pk-clear--mPWZP7H.js";
|
|
12
12
|
import { i as PkShowEvent, n as PkAfterShowEvent, r as PkHideEvent, t as PkAfterHideEvent } from "./overlay-lifecycle-D0pkTQyI.js";
|
|
13
|
+
import "./pk-popup-CgiXok-U.js";
|
|
13
14
|
import { i as waitForPopupReposition, r as syncPopupPlacementAnimation } from "./popup-placement-animation-WlEXnS85.js";
|
|
14
15
|
import { a as isListboxTypeToSelectKey, i as handleListboxKeyDown, n as LISTBOX_NAVIGATION_KEYS, r as createTypeToSelectHandler, t as syncListboxSeparators } from "./sync-listbox-separators-B1-V0oJi.js";
|
|
15
|
-
import { n as isPointerInsideOverlay, t as isEventInsideOverlay } from "./popup-pointer-
|
|
16
|
+
import { n as isPointerInsideOverlay, t as isEventInsideOverlay } from "./popup-pointer-DMnuZDQl.js";
|
|
16
17
|
import { t as popupContentAnimationStyles } from "./popup-content-animation.styles-Dc6d9quJ.js";
|
|
17
18
|
import { css, html, nothing } from "lit";
|
|
18
19
|
import { classMap } from "lit/directives/class-map.js";
|
|
@@ -1126,4 +1127,4 @@ PkSelect = __decorate([customElement("pk-select")], PkSelect);
|
|
|
1126
1127
|
//#endregion
|
|
1127
1128
|
export { pkSelectStyles as n, PkSelect as t };
|
|
1128
1129
|
|
|
1129
|
-
//# sourceMappingURL=pk-select-
|
|
1130
|
+
//# sourceMappingURL=pk-select-odSNU1tN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pk-select-odSNU1tN.js","names":[],"sources":["../../src/components/select/pk-select.styles.ts","../../src/components/select/pk-select.ts"],"sourcesContent":["import { css } from 'lit';\n\nimport { iconStyles } from '../../base/icon.styles.js';\nimport { popupContentAnimationStyles } from '../../styles/popup-content-animation.styles.js';\n\nexport const pkSelectStyles = [\n popupContentAnimationStyles,\n css`\n ${iconStyles}\n @layer pk-component {\n :host {\n display: inline-block;\n position: relative;\n width: fit-content;\n max-width: 100%;\n align-self: flex-start;\n flex: none;\n color: var(--pk-color-gray-700);\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-base);\n line-height: var(--pk-line-height);\n --pk-select-trigger-border-width: 1px;\n --pk-select-item-min-height: var(--pk-input-height);\n --pk-select-item-padding-block: 6px;\n --pk-select-item-padding-inline: 10px;\n --pk-select-item-padding-inline-end: 2rem;\n --pk-select-item-font-size: var(--pk-font-size-base);\n --pk-select-item-line-height: var(--pk-input-control-line-height, 1.25rem);\n --pk-select-item-indicator-size: 0.75rem;\n --pk-select-item-indicator-inset: 0.5rem;\n /* v1 SelectLabel default: text-xs → 12px */\n --pk-select-group-label-font-size: 12px;\n --pk-select-decoration-size: 0.875rem;\n }\n\n :host([width='full']) {\n display: block;\n width: 100%;\n }\n\n :host([width='full']) .control {\n width: 100%;\n }\n\n :host([width='full']) button.control .icon {\n margin-inline-start: auto;\n }\n\n .control {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n /* Fill the host when consumers set min-width/width on :host. */\n width: 100%;\n max-width: 100%;\n min-width: 0;\n margin: 0;\n padding: var(--pk-select-item-padding-block) var(--pk-select-item-padding-inline);\n border: var(--pk-select-trigger-border-width) solid transparent;\n border-radius: var(--pk-radius-lg);\n --pk-select-fill: var(--pk-color-slate-250);\n --pk-select-fill-hover: var(--pk-color-slate-300);\n background: var(--pk-select-fill);\n color: var(--pk-color-gray-700);\n font: inherit;\n font-size: var(--pk-select-item-font-size);\n line-height: var(--pk-input-control-line-height, 1.25rem);\n white-space: nowrap;\n cursor: pointer;\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.12s ease, box-shadow 0.12s ease, background 0.12s ease;\n }\n\n button.control {\n appearance: none;\n -webkit-appearance: none;\n text-align: left;\n background-color: var(--pk-select-fill);\n border: var(--pk-select-trigger-border-width) solid transparent;\n }\n\n :host(:not([disabled])) .control:hover:not(.is-disabled):not(:disabled),\n :host(:not([disabled])) button.control:hover:not(.is-disabled):not(:disabled) {\n background: var(--pk-select-fill-hover);\n }\n\n :host(:not([disabled])) button.control:hover:not(.is-disabled):not(:disabled) {\n background-color: var(--pk-select-fill-hover);\n }\n\n :host(:not([invalid]):not(:state(user-invalid))) button.control:focus-visible,\n :host(:not([invalid]):not(:state(user-invalid))[data-state='focus-visible']) button.control {\n border-color: var(--pk-color-sky-600);\n box-shadow: var(--pk-input-focus-shadow);\n }\n\n .control.is-disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n min-width: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: inherit;\n outline: none;\n }\n\n .control > .trigger:not(.trigger--icon) {\n flex: 0 1 auto;\n justify-content: flex-start;\n }\n\n .trigger--icon {\n width: 1.25rem;\n }\n\n .trigger-start {\n display: none;\n flex: 0 0 auto;\n align-items: center;\n }\n\n .trigger-start.has-decoration {\n display: inline-flex;\n }\n\n .control-start,\n .control-end {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n line-height: 0;\n color: var(--pk-color-gray-600);\n }\n\n slot[name='start']::slotted(svg),\n slot[name='end']::slotted(svg) {\n width: var(--pk-select-decoration-size);\n height: var(--pk-select-decoration-size);\n }\n\n .value {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n }\n\n .icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n line-height: 0;\n pointer-events: none;\n color: var(--pk-color-gray-600);\n }\n\n /* Extra space before the expand chevron (control gap stays for start icon ↔ label). */\n .control > .icon,\n .control > .trigger--icon {\n margin-inline-start: 0.25rem;\n }\n\n .icon svg {\n display: block;\n width: 0.75rem;\n height: 0.75rem;\n }\n\n .tags {\n display: flex;\n flex: 0 1 auto;\n flex-wrap: wrap;\n gap: 0.25rem;\n min-width: 0;\n }\n\n .tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n max-width: 10ch;\n padding: 0.125rem 0.375rem;\n border-radius: var(--pk-radius-sm);\n background: var(--pk-color-gray-200);\n color: var(--pk-color-gray-800);\n font-size: 12px;\n line-height: 1.3;\n }\n\n .tag-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tag-remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 0.875rem;\n height: 0.875rem;\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-sm);\n background: transparent;\n color: var(--pk-color-gray-600);\n cursor: pointer;\n }\n\n .tag-remove:hover {\n background: rgb(0 0 0 / 8%);\n }\n\n .clear-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-sm);\n background: transparent;\n color: var(--pk-color-gray-600);\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .clear-button:hover {\n background: rgb(0 0 0 / 6%);\n color: var(--pk-color-gray-800);\n }\n\n .value-input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .panel ::slotted(pk-separator) {\n margin: 4px 0;\n }\n\n .panel {\n width: max-content;\n min-width: var(--pk-select-anchor-width, 8rem);\n max-height: 16rem;\n overflow: auto;\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-md);\n background: var(--pk-color-white);\n box-shadow: var(--pk-shadow-popup);\n color: var(--pk-color-gray-700);\n outline: none;\n }\n\n .panel[hidden] {\n display: none !important;\n }\n\n :host([invalid]) .control,\n :host(:state(user-invalid)) .control {\n border-color: var(--pk-color-rose-600);\n }\n\n :host([invalid]) button.control:focus-visible,\n :host([invalid][data-state='focus-visible']) button.control,\n :host(:state(user-invalid)) button.control:focus-visible,\n :host(:state(user-invalid)[data-state='focus-visible']) button.control {\n border-color: var(--pk-color-rose-600);\n box-shadow: var(--pk-input-invalid-focus-shadow);\n }\n\n :host([size='xs']) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 4px;\n --pk-select-item-padding-inline: 8px;\n --pk-select-item-padding-inline-end: 1.75rem;\n --pk-select-item-font-size: 11px;\n --pk-select-item-line-height: 1.25;\n /* v1 SelectLabel xs: text-[11px] */\n --pk-select-group-label-font-size: 11px;\n --pk-select-decoration-size: 0.625rem;\n }\n\n :host([size='xs']) .control {\n border-radius: var(--pk-radius-sm);\n /* Match trigger line-height to the compact item token (default is 1.25rem). */\n line-height: var(--pk-select-item-line-height, 1.25);\n }\n\n :host([size='xs']) .icon svg {\n width: 0.625rem;\n height: 0.625rem;\n }\n\n /* Options live in light DOM; ::slotted pushes size tokens onto each pk-option\n * host so the open listbox matches the trigger (inheritance alone is flaky when\n * the panel is promoted to the popover top layer). */\n :host([size='xs']) ::slotted(pk-option) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 4px;\n --pk-select-item-padding-inline: 8px;\n --pk-select-item-padding-inline-end: 1.75rem;\n --pk-select-item-font-size: 11px;\n --pk-select-item-line-height: 1.25;\n --pk-select-item-indicator-size: 0.625rem;\n }\n\n :host([size='xs']) .panel {\n max-height: 12rem;\n }\n\n /* Editable-table cells only (class set by pk-editable-table) — compact chip + menu. */\n :host(.cell-pk-control) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 5px;\n --pk-select-item-padding-inline: 8px;\n --pk-select-item-padding-inline-end: 1.5rem;\n --pk-select-item-font-size: 11px;\n --pk-select-item-line-height: 1.2;\n /* Compact table chip — match xs label size. */\n --pk-select-group-label-font-size: 11px;\n --pk-select-decoration-size: 0.625rem;\n --pk-select-item-indicator-size: 0.625rem;\n }\n\n :host(.cell-pk-control) .control {\n border-radius: var(--pk-radius-sm);\n line-height: var(--pk-select-item-line-height, 1.2);\n }\n\n :host(.cell-pk-control) ::slotted(pk-option) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 5px;\n --pk-select-item-padding-inline: 8px;\n --pk-select-item-padding-inline-end: 1.5rem;\n --pk-select-item-font-size: 11px;\n --pk-select-item-line-height: 1.2;\n --pk-select-item-indicator-size: 0.625rem;\n }\n\n :host(.cell-pk-control) .panel {\n max-height: 11rem;\n }\n\n :host([size='sm']) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 6px;\n --pk-select-item-padding-inline: 10px;\n --pk-select-item-padding-inline-end: 1.75rem;\n --pk-select-item-font-size: 12px;\n --pk-select-item-indicator-inset: 0.625rem;\n /* v1 SelectLabel sm: text-[12px] */\n --pk-select-group-label-font-size: 12px;\n --pk-select-decoration-size: 0.6875rem;\n }\n\n :host([size='sm']) .control {\n border-radius: var(--pk-radius-md);\n }\n\n :host([size='sm']) .icon svg {\n width: 0.6875rem;\n height: 0.6875rem;\n }\n\n :host([size='lg']) {\n --pk-select-item-padding-block: 8px;\n --pk-select-item-padding-inline: 12px;\n --pk-select-item-font-size: var(--pk-font-size-base);\n --pk-select-item-indicator-inset: 0.75rem;\n /* v1 SelectLabel lg: text-sm → 14px */\n --pk-select-group-label-font-size: 14px;\n --pk-select-decoration-size: 1rem;\n }\n\n :host([size='xl']) {\n --pk-select-item-padding-block: 10px;\n --pk-select-item-padding-inline: 14px;\n --pk-select-item-padding-inline-end: 2.25rem;\n --pk-select-item-font-size: var(--pk-font-size-base);\n --pk-select-item-indicator-inset: 0.875rem;\n /* v1 SelectLabel xl: text-base → 16px */\n --pk-select-group-label-font-size: 16px;\n --pk-select-decoration-size: 1.125rem;\n }\n\n :host([size='xl']) .icon svg {\n width: 0.875rem;\n height: 0.875rem;\n }\n }\n`,\n];\n","import { html, nothing } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport type { PropertyValues } from 'lit';\n\nimport { chevronDown, renderIconHtml } from '../../icons/index.js';\n\nimport { isTopDismissible, registerDismissible, unregisterDismissible } from '../../a11y/dismissible-stack.js';\nimport { scrollIntoView } from '../../a11y/scroll-lock.js';\nimport { uniqueId } from '../../a11y/focus.js';\nimport { PkFormAssociatedElement } from '../../base/pk-form-associated-element.js';\nimport { HasSlotController } from '../../internal/has-slot.js';\nimport { PkClearEvent } from '../../events/pk-clear.js';\nimport {\n PkAfterHideEvent,\n PkAfterShowEvent,\n PkHideEvent,\n PkShowEvent,\n type PkOverlaySource,\n} from '../../events/overlay-lifecycle.js';\nimport type { PkValidator } from '../../validators/types.js';\nimport { MirrorValidator } from '../../validators/mirror-validator.js';\n// Keep the internal element registered when production builds erase type-only imports.\nimport '../popup/pk-popup.js';\nimport type { PkPopup, PkPopupPlacement } from '../popup/pk-popup.js';\nimport {\n createTypeToSelectHandler,\n handleListboxKeyDown,\n isListboxTypeToSelectKey,\n LISTBOX_NAVIGATION_KEYS,\n} from '../../utils/listbox-keyboard.js';\nimport {\n syncPopupPlacementAnimation,\n waitForPopupReposition,\n} from '../../utils/popup-placement-animation.js';\nimport { isEventInsideOverlay, isPointerInsideOverlay } from '../../utils/popup-pointer.js';\nimport { syncListboxSeparators } from '../../internal/sync-listbox-separators.js';\nimport type { PkOption } from './pk-option.js';\nimport type { PkOptionGroup } from './pk-option-group.js';\nimport { pkSelectStyles } from './pk-select.styles.js';\n\nexport type PkSelectSize = 'xs' | 'sm' | 'default' | 'lg' | 'xl';\n\nconst CHEVRON_ICON = renderIconHtml(chevronDown);\n\n/**\n * Select — pattern: slotted `pk-option` children, form-associated, clearable, multiselect tags.\n *\n * @slot start - Presentational decoration before the trigger label (e.g. icons)\n * @slot end - Presentational decoration before the expand chevron\n * @slot - `pk-option` and `pk-option-group` items\n *\n * @csspart control - Trigger control wrapper\n * @csspart start - Host start decoration container\n * @csspart end - Host end decoration container\n * @csspart trigger-start - Mirrored start decoration from the selected option\n * @csspart trigger - Select trigger button\n * @csspart panel - Listbox panel\n */\n@customElement('pk-select')\nexport class PkSelect extends PkFormAssociatedElement {\n static override styles = pkSelectStyles;\n\n static override get validators(): PkValidator[] {\n return [\n ...super.validators,\n MirrorValidator(),\n {\n observedAttributes: ['required'],\n checkValidity: (element) => {\n const select = element as PkSelect;\n const result = {\n message: 'Please select an item in the list.',\n isValid: true,\n invalidKeys: [] as ReturnType<PkValidator['checkValidity']>['invalidKeys'],\n };\n\n if (!select.required) {\n return result;\n }\n\n const missing = select.multiple ? select.values.length === 0 : !select.value;\n\n if (!missing) {\n return result;\n }\n\n result.isValid = false;\n result.invalidKeys.push('valueMissing');\n return result;\n },\n },\n ];\n }\n\n override assumeInteractionOn = ['blur', 'input'];\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: Boolean, reflect: true })\n multiple = false;\n\n @property({ reflect: true })\n placement: PkPopupPlacement = 'bottom-start';\n\n /** Gap between the trigger and listbox panel in px (default: 4). */\n @property({ attribute: 'side-offset', type: Number })\n sideOffset = 4;\n\n @property({ type: Boolean, reflect: true })\n clearable = false;\n\n @property({ attribute: 'with-clear', type: Boolean })\n withClear = false;\n\n @property({ type: Boolean, reflect: true })\n invalid = false;\n\n @property({ reflect: true })\n size: PkSelectSize = 'default';\n\n /** When `full`, the trigger stretches to the host width. */\n @property({ reflect: true })\n width?: 'full';\n\n /** Empty by default — consumers opt in when a prompt is useful. */\n @property()\n placeholder = '';\n\n @property()\n value = '';\n\n @property({ attribute: 'default-value' })\n defaultValue = '';\n\n @property({ type: Array, attribute: false })\n values: string[] = [];\n\n @property({ attribute: false })\n defaultValues: string[] = [];\n\n @property({ attribute: 'aria-label' })\n ariaLabel: string | null = null;\n\n /**\n * Whether arrow-key focus loops from the last option back to the first (and vice versa).\n * Base UI `Select` has no equivalent; default: `false`.\n */\n @property({ attribute: 'loop-focus', type: Boolean })\n loopFocus = false;\n\n private readonly hasSlotController = new HasSlotController(this, 'start', 'end');\n\n private readonly listboxId = uniqueId('pk-select-listbox');\n private readonly triggerId = uniqueId('pk-select-trigger');\n\n @query('.trigger-start')\n private triggerStartElement?: HTMLSpanElement;\n\n @query('pk-popup')\n private popupElement!: PkPopup;\n\n @query('.control')\n private controlElement!: HTMLElement;\n\n @query('button.control, .control > button.trigger')\n private triggerButton?: HTMLButtonElement;\n\n @query('.value-input')\n override input!: HTMLInputElement;\n\n private get panelElement(): HTMLDivElement | null {\n return this.popupElement?.getContentElement() as HTMLDivElement | null ?? null;\n }\n\n private options: PkOption[] = [];\n\n @state()\n private highlightedIndex = 0;\n\n private dismissRegistered = false;\n private panelEventTarget: HTMLElement | null = null;\n private typeToSelect = createTypeToSelectHandler([], () => {});\n private optionsObserver?: MutationObserver;\n\n /** True while the shared popup-content exit animation is running. */\n @state()\n private closing = false;\n\n /** Gates `data-open` so enter motion starts after Floating UI places the panel. */\n @state()\n private panelAnimated = false;\n\n override connectedCallback(): void {\n this.refreshOptions();\n super.connectedCallback();\n this.addEventListener('pk-listbox-keydown', this.handleListboxKeyDownEvent as EventListener);\n this.addEventListener('keydown', this.onKeyDown);\n this.optionsObserver = new MutationObserver(() => {\n this.handleOptionsMutation({ render: true });\n });\n this.optionsObserver.observe(this, { childList: true, subtree: true });\n }\n\n override disconnectedCallback(): void {\n this.unbindPanelEvents();\n this.removeEventListener('pk-listbox-keydown', this.handleListboxKeyDownEvent as EventListener);\n this.removeEventListener('keydown', this.onKeyDown);\n this.optionsObserver?.disconnect();\n void this.closePanel('api');\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('value') || changed.has('values') || changed.has('multiple')) {\n this.applySelection();\n }\n\n super.updated(changed);\n }\n\n private getOptionElements(): PkOption[] {\n const portaled = this.popupElement?.getContentElement()?.querySelectorAll('pk-option');\n\n if (portaled && portaled.length > 0) {\n return [...portaled];\n }\n\n return [...this.querySelectorAll('pk-option')];\n }\n\n private handleOptionsMutation = (options: { render?: boolean } = {}): void => {\n const next = this.getOptionElements();\n const changed = next.length !== this.options.length\n || next.some((option, index) => option !== this.options[index]);\n\n this.options = next;\n this.applySelection();\n this.updateTypeToSelect();\n\n if (options.render !== false && changed) {\n this.requestUpdate();\n }\n };\n\n private refreshOptions(): void {\n this.handleOptionsMutation({ render: false });\n }\n\n private syncOptions = (): void => {\n this.handleOptionsMutation({ render: true });\n };\n\n /** Portaled listbox options are outside the host tree — listen on the panel instead. */\n private bindPanelEvents(): void {\n const panel = this.panelElement;\n\n if (!panel || panel === this.panelEventTarget) {\n return;\n }\n\n this.unbindPanelEvents();\n this.panelEventTarget = panel;\n panel.addEventListener('pk-option-select', this.handleOptionSelect as EventListener);\n panel.addEventListener('pk-option-highlight', this.handleOptionHighlight as EventListener);\n panel.addEventListener('pk-listbox-keydown', this.handleListboxKeyDownEvent as EventListener);\n }\n\n private unbindPanelEvents(): void {\n if (!this.panelEventTarget) {\n return;\n }\n\n this.panelEventTarget.removeEventListener('pk-option-select', this.handleOptionSelect as EventListener);\n this.panelEventTarget.removeEventListener('pk-option-highlight', this.handleOptionHighlight as EventListener);\n this.panelEventTarget.removeEventListener('pk-listbox-keydown', this.handleListboxKeyDownEvent as EventListener);\n this.panelEventTarget = null;\n }\n\n protected override get validationTarget(): HTMLElement | undefined {\n return this.input ?? this.triggerButton ?? this.controlElement;\n }\n\n protected override getAriaMirrorTarget(): HTMLElement | null {\n return this.triggerButton ?? this.controlElement ?? null;\n }\n\n protected override syncFormValue(): void {\n if (!this.name) {\n this.setFormValue(null);\n return;\n }\n\n if (this.multiple) {\n const formData = new FormData();\n\n for (const item of this.values) {\n formData.append(this.name, item);\n }\n\n this.setFormValue(formData);\n return;\n }\n\n this.setFormValue(this.value || '');\n }\n\n protected override resetToDefaultValue(): void {\n if (this.multiple) {\n this.values = [...this.defaultValues];\n } else {\n this.value = this.defaultValue;\n }\n\n this.applySelection();\n }\n\n protected override restoreFormState(state: string | File | FormData | null): void {\n if (state instanceof FormData && this.name) {\n this.values = state.getAll(this.name).map(String);\n return;\n }\n\n if (typeof state === 'string') {\n this.value = state;\n }\n }\n\n private isOptionInHiddenGroup(option: PkOption): boolean {\n const group = option.closest('pk-option-group') as PkOptionGroup | null;\n\n return Boolean(group?.hidden);\n }\n\n private getVisibleOptions(): PkOption[] {\n return this.options.filter((option) => !this.isOptionInHiddenGroup(option));\n }\n\n private getEnabledVisibleOptions(): PkOption[] {\n return this.getVisibleOptions().filter((option) => !option.disabled);\n }\n\n private isSelected(value: string): boolean {\n if (this.multiple) {\n return this.values.includes(value);\n }\n\n return this.value === value;\n }\n\n private applySelection(): void {\n const visible = this.getVisibleOptions();\n\n for (const option of this.options) {\n option.selected = this.isSelected(option.value);\n option.hidden = !visible.includes(option);\n option.optionId = `${this.listboxId}-option-${option.value}`;\n }\n\n for (const group of this.querySelectorAll('pk-option-group')) {\n const groupOptions = [...group.querySelectorAll('pk-option')];\n group.hidden = groupOptions.length > 0 && groupOptions.every((option) => option.hidden);\n }\n\n syncListboxSeparators(this);\n\n this.syncValueInput();\n this.syncTriggerDecorations();\n\n if (this.open) {\n this.syncHighlight();\n }\n }\n\n private syncValueInput(): void {\n if (!this.input) {\n return;\n }\n\n if (this.multiple) {\n this.input.value = this.values.join(',');\n this.input.required = this.required;\n return;\n }\n\n this.input.value = this.value;\n this.input.required = this.required;\n }\n\n private getDisplayValue(): string {\n if (this.multiple) {\n const labels = this.getSelectedOptions()\n .map((option) => option.getLabel());\n\n return labels.length > 0 ? labels.join(', ') : this.placeholder;\n }\n\n const selected = this.options.find((option) => option.value === this.value);\n\n return selected?.getLabel() || this.placeholder;\n }\n\n private getSelectedOptions(): PkOption[] {\n return this.options.filter((option) => this.isSelected(option.value));\n }\n\n /**\n * Mirror the selected option's `slot=\"start\"` decorations into the trigger —\n * `pk-select` start/end decoration pattern.\n */\n private syncTriggerDecorations(): void {\n const container = this.triggerStartElement;\n\n if (!container || this.multiple) {\n return;\n }\n\n container.replaceChildren();\n container.classList.remove('has-decoration');\n\n const selected = this.options.find((option) => option.value === this.value);\n\n if (!selected) {\n return;\n }\n\n for (const element of selected.getStartElements()) {\n container.append(element.cloneNode(true));\n }\n\n container.classList.toggle('has-decoration', container.childElementCount > 0);\n }\n\n private hasSelection(): boolean {\n if (this.multiple) {\n return this.values.length > 0;\n }\n\n // Empty-string values are valid when an option declares them (e.g. \"Default\").\n return this.options.some((option) => option.value === this.value) || Boolean(this.value);\n }\n\n private syncHighlightedIndexToSelection(): void {\n if (this.multiple) {\n return;\n }\n\n const enabled = this.getEnabledVisibleOptions();\n\n if (enabled.length === 0) {\n return;\n }\n\n const selectedIndex = enabled.findIndex((option) => option.value === this.value);\n\n if (selectedIndex >= 0) {\n this.highlightedIndex = selectedIndex;\n }\n }\n\n private syncHighlight(): void {\n const enabled = this.getEnabledVisibleOptions();\n\n for (const option of this.options) {\n option.highlighted = false;\n option.focusIndex = -1;\n }\n\n if (enabled.length === 0) {\n this.highlightedIndex = 0;\n return;\n }\n\n if (this.highlightedIndex >= enabled.length) {\n this.highlightedIndex = 0;\n }\n\n const highlighted = enabled[this.highlightedIndex];\n\n if (highlighted && this.panelElement) {\n highlighted.highlighted = true;\n highlighted.focusIndex = 0;\n scrollIntoView(highlighted, this.panelElement, 'vertical', 'auto');\n }\n }\n\n private updateTypeToSelect(): void {\n this.typeToSelect = createTypeToSelectHandler(\n this.getEnabledVisibleOptions() as unknown as HTMLElement[],\n (index) => {\n this.highlightedIndex = index;\n this.syncHighlight();\n this.getEnabledVisibleOptions()[index]?.focusControl();\n },\n );\n }\n\n private togglePanel = (event?: Event): void => {\n event?.preventDefault();\n event?.stopPropagation();\n\n if (this.disabled || this.closing) {\n return;\n }\n\n if (this.open) {\n void this.closePanel('api');\n } else {\n void this.openPanel();\n }\n };\n\n private getPopupAnchor(): HTMLElement | null {\n return this.controlElement ?? null;\n }\n\n private getActiveDescendantId(): string | null {\n const enabled = this.getEnabledVisibleOptions();\n const highlighted = enabled[this.highlightedIndex];\n return highlighted?.optionId || null;\n }\n\n async show(): Promise<void> {\n if (this.open || this.closing || this.disabled) {\n return;\n }\n\n await this.openPanel();\n }\n\n async hide(source: PkOverlaySource = 'api'): Promise<void> {\n if (!this.open || this.closing) {\n return;\n }\n\n await this.closePanel(source);\n }\n\n private openPanel(): Promise<void> {\n const anchor = this.getPopupAnchor();\n\n if (!anchor || this.closing) {\n return Promise.resolve();\n }\n\n this.dispatchEvent(new PkShowEvent());\n this.closing = false;\n this.panelAnimated = false;\n this.open = true;\n this.popupElement.active = true;\n this.applySelection();\n this.syncHighlightedIndexToSelection();\n\n if (this.panelElement) {\n this.panelElement.hidden = false;\n // Seed side before first paint so enter keyframes pick a direction.\n syncPopupPlacementAnimation(this.panelElement, this.placement);\n }\n\n const anchorWidth = anchor.getBoundingClientRect().width;\n this.style.setProperty('--pk-select-anchor-width', `${anchorWidth}px`);\n this.registerDismissHandlers();\n this.syncHighlight();\n this.updateTypeToSelect();\n\n return this.updateComplete.then(async () => {\n const placement = await waitForPopupReposition(this.popupElement, this.placement, 300, {\n requireEvent: true,\n });\n\n if (this.panelElement) {\n syncPopupPlacementAnimation(this.panelElement, placement);\n }\n\n // Flip data-open after placement so the shared enter animation can run.\n this.panelAnimated = true;\n this.bindPanelEvents();\n this.refreshOptions();\n this.getEnabledVisibleOptions()[this.highlightedIndex]?.focusControl();\n\n this.dispatchEvent(new PkAfterShowEvent());\n this.dispatchEvent(new CustomEvent('pk-open-change', {\n detail: { open: true },\n bubbles: true,\n composed: true,\n }));\n });\n }\n\n private async closePanel(source: PkOverlaySource = 'unknown'): Promise<void> {\n if (!this.open || this.closing) {\n return;\n }\n\n const hideEvent = new PkHideEvent(source);\n\n if (!this.dispatchEvent(hideEvent)) {\n return;\n }\n\n this.typeToSelect.reset();\n this.unbindPanelEvents();\n this.unregisterDismissHandlers();\n\n this.closing = true;\n this.panelAnimated = false;\n await this.waitForExitAnimation();\n\n this.open = false;\n this.closing = false;\n this.panelAnimated = false;\n\n if (this.panelElement) {\n this.panelElement.hidden = true;\n this.panelElement.removeAttribute('data-side');\n }\n\n this.popupElement.active = false;\n\n this.dispatchEvent(new PkAfterHideEvent());\n this.dispatchEvent(new CustomEvent('pk-open-change', {\n detail: { open: false },\n bubbles: true,\n composed: true,\n }));\n\n if (this.shouldReturnFocusToTrigger(source)) {\n this.triggerButton?.focus({ preventScroll: true });\n } else {\n this.triggerButton?.blur();\n }\n }\n\n private waitForExitAnimation(): Promise<void> {\n const panel = this.panelElement;\n\n if (!panel) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n panel.removeEventListener('animationend', onAnimationEnd);\n window.clearTimeout(fallback);\n panel.classList.remove('closing');\n resolve();\n };\n\n const onAnimationEnd = (event: AnimationEvent): void => {\n if (event.target === panel && event.animationName.startsWith('pk-popup-content-out')) {\n finish();\n }\n };\n\n panel.classList.add('closing');\n panel.addEventListener('animationend', onAnimationEnd);\n const fallback = window.setTimeout(finish, 150);\n });\n }\n\n /** Base UI skips return focus on outside press — avoids an unwanted focus ring after light dismiss. */\n private shouldReturnFocusToTrigger(source: PkOverlaySource): boolean {\n return source !== 'light-dismiss' && source !== 'pointer-dismiss';\n }\n\n private registerDismissHandlers(): void {\n registerDismissible(this);\n this.dismissRegistered = true;\n document.addEventListener('pointerdown', this.onDocumentPointerDown, true);\n document.addEventListener('keydown', this.onDocumentKeyDown, true);\n }\n\n private unregisterDismissHandlers(): void {\n if (this.dismissRegistered) {\n unregisterDismissible(this);\n this.dismissRegistered = false;\n }\n\n document.removeEventListener('pointerdown', this.onDocumentPointerDown, true);\n document.removeEventListener('keydown', this.onDocumentKeyDown, true);\n }\n\n private onDocumentPointerDown = (event: PointerEvent): void => {\n if (this.isPointerInside(event)) {\n return;\n }\n\n void this.closePanel('light-dismiss');\n };\n\n private isPointerInside(event: PointerEvent): boolean {\n return isPointerInsideOverlay(event, {\n anchor: this.getPopupAnchor(),\n panel: this.panelElement,\n });\n };\n\n private onDocumentKeyDown = (event: KeyboardEvent): void => {\n if (!this.open) {\n return;\n }\n\n if (event.key === 'Escape') {\n if (!isTopDismissible(this)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n void this.closePanel('escape');\n return;\n }\n\n const isListboxKey = LISTBOX_NAVIGATION_KEYS.has(event.key) || isListboxTypeToSelectKey(event);\n\n if (!isListboxKey) {\n return;\n }\n\n if (!isEventInsideOverlay(event, {\n anchor: this.getPopupAnchor(),\n panel: this.panelElement,\n })) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.onListboxKeyDown(event);\n };\n\n private handleOptionSelect = (event: CustomEvent<{ value: string }>): void => {\n const { value } = event.detail;\n\n if (this.multiple) {\n this.values = this.values.includes(value)\n ? this.values.filter((v) => v !== value)\n : [...this.values, value];\n } else {\n this.value = value;\n void this.closePanel('api');\n }\n\n this.applySelection();\n this.emitValueChange();\n };\n\n private handleOptionHighlight = (event: CustomEvent<{ value: string }>): void => {\n if (!this.open) {\n return;\n }\n\n const enabled = this.getEnabledVisibleOptions();\n const index = enabled.findIndex((option) => option.value === event.detail.value);\n\n if (index === -1 || index === this.highlightedIndex) {\n return;\n }\n\n this.highlightedIndex = index;\n this.syncHighlight();\n };\n\n private removeTag(value: string, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.values = this.values.filter((item) => item !== value);\n this.applySelection();\n this.emitValueChange();\n }\n\n private handleClear(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.multiple) {\n this.values = [];\n } else {\n this.value = '';\n }\n\n this.applySelection();\n this.dispatchEvent(new PkClearEvent());\n this.emitValueChange();\n this.triggerButton?.focus();\n }\n\n private emitValueChange(): void {\n this.dispatchEvent(new CustomEvent('pk-change', {\n detail: {\n value: this.multiple ? [...this.values] : this.value,\n },\n bubbles: true,\n composed: true,\n }));\n\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n if (!this.open) {\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void this.openPanel();\n }\n\n return;\n }\n\n this.onListboxKeyDown(event);\n };\n\n private onListboxKeyDown(event: KeyboardEvent): void {\n const enabled = this.getEnabledVisibleOptions();\n\n this.highlightedIndex = handleListboxKeyDown(event, {\n items: enabled as unknown as HTMLElement[],\n currentIndex: this.highlightedIndex,\n multiselect: this.multiple,\n loop: this.loopFocus,\n onSelect: (index) => {\n this.highlightedIndex = index;\n this.syncHighlight();\n },\n focusItem: (index) => {\n enabled[index]?.focusControl();\n },\n onClose: () => { void this.closePanel('escape'); },\n });\n\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n this.typeToSelect.handleKey(event);\n }\n }\n\n private handleListboxKeyDownEvent = (event: CustomEvent<{ keyboardEvent: KeyboardEvent }>): void => {\n if (!this.open) {\n return;\n }\n\n this.onListboxKeyDown(event.detail.keyboardEvent);\n };\n\n private renderTags() {\n return this.getSelectedOptions().map((option) => html`\n <span class=\"tag\" part=\"tag\">\n <span class=\"tag-label\">${option.getLabel()}</span>\n <button\n type=\"button\"\n class=\"tag-remove\"\n part=\"tag-remove\"\n aria-label=${`Remove ${option.getLabel()}`}\n @click=${(event: Event) => this.removeTag(option.value, event)}\n >\n ×\n </button>\n </span>\n `);\n }\n\n private renderChevronIcon() {\n return html`\n <span class=\"icon\" aria-hidden=\"true\">${unsafeSVG(CHEVRON_ICON)}</span>\n `;\n }\n\n private renderHostDecorationSlot(name: 'start' | 'end') {\n if (!this.hasSlotController.test(name)) {\n return html`<slot name=${name} hidden></slot>`;\n }\n\n const className = name === 'start' ? 'control-start' : 'control-end';\n\n return html`\n <span part=${name} class=${className}>\n <slot name=${name}></slot>\n </span>\n `;\n }\n\n override render() {\n const displayValue = this.getDisplayValue();\n const isPlaceholder = !this.hasSelection();\n const showClear = (this.clearable || this.withClear) && this.hasSelection() && !this.disabled;\n\n return html`\n <input\n class=\"value-input\"\n part=\"value-input\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n .value=${this.multiple ? this.values.join(',') : this.value}\n ?required=${this.required}\n @input=${() => this.updateValidity()}\n />\n ${this.multiple\n ? html`\n <div\n part=\"control\"\n class=${classMap({\n control: true,\n 'is-disabled': this.disabled,\n })}\n >\n ${this.renderHostDecorationSlot('start')}\n ${this.hasSelection()\n ? html`\n <div class=\"tags\" part=\"tags\">${this.renderTags()}</div>\n ${showClear\n ? html`\n <button\n type=\"button\"\n class=\"clear-button\"\n part=\"clear-button\"\n aria-label=\"Clear selection\"\n @click=${this.handleClear}\n >\n ×\n </button>\n `\n : nothing}\n `\n : html`\n <button\n part=\"trigger\"\n type=\"button\"\n class=\"trigger\"\n id=${this.triggerId}\n ?disabled=${this.disabled}\n aria-label=${this.ariaLabel ?? nothing}\n aria-haspopup=\"listbox\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.listboxId}\n @click=${this.togglePanel}\n >\n <span class=\"value is-placeholder\">${this.placeholder}</span>\n </button>\n `}\n ${this.renderHostDecorationSlot('end')}\n <button\n type=\"button\"\n class=\"trigger trigger--icon\"\n part=\"trigger expand-button\"\n aria-label=\"Toggle options\"\n ?disabled=${this.disabled}\n @click=${this.togglePanel}\n >\n ${this.renderChevronIcon()}\n </button>\n </div>\n `\n : html`\n <button\n part=\"control\"\n type=\"button\"\n class=${classMap({\n control: true,\n 'is-disabled': this.disabled,\n })}\n id=${this.triggerId}\n ?disabled=${this.disabled}\n aria-label=${this.ariaLabel ?? nothing}\n aria-haspopup=\"listbox\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.listboxId}\n @click=${this.togglePanel}\n >\n ${this.renderHostDecorationSlot('start')}\n <span part=\"trigger-start\" class=\"trigger-start\"></span>\n <span\n class=${classMap({\n value: true,\n 'is-placeholder': isPlaceholder,\n })}\n >${displayValue}</span>\n ${showClear\n ? html`\n <span\n class=\"clear-button\"\n part=\"clear-button\"\n role=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear selection\"\n @click=${this.handleClear}\n >\n ×\n </span>\n `\n : nothing}\n ${this.renderHostDecorationSlot('end')}\n ${this.renderChevronIcon()}\n </button>\n `}\n <pk-popup\n .anchor=${this.getPopupAnchor() ?? ''}\n .placement=${this.placement}\n .distance=${this.sideOffset}\n .sync=${'width'}\n flip\n shift\n >\n <div\n part=\"panel\"\n class=${classMap({\n panel: true,\n 'pk-popup-content': true,\n closing: this.closing,\n })}\n id=${this.listboxId}\n role=\"listbox\"\n aria-multiselectable=${this.multiple ? 'true' : 'false'}\n tabindex=\"-1\"\n ?hidden=${!this.open && !this.closing}\n data-open=${this.panelAnimated && !this.closing ? '' : nothing}\n @slotchange=${this.syncOptions}\n >\n <slot></slot>\n </div>\n </pk-popup>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-select': PkSelect;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAKA,IAAa,iBAAiB,CAC1B,6BACA,GAAG;MACD,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuZhB;;;ACnXD,IAAM,eAAe,eAAe,cAAA,YAAY;AAiBzC,IAAA,WAAA,MAAM,iBAAiB,wBAAwB;;;6BAmCnB,CAAC,QAAQ,QAAQ;cAGzC;kBAGI;mBAGmB;oBAIjB;mBAGD;mBAGA;iBAGF;cAGW;qBAQP;eAGN;sBAGO;gBAGI,EAAE;uBAGK,EAAE;mBAGD;mBAOf;2BAEyB,IAAI,kBAAkB,MAAM,SAAS,MAAM;mBAEnD,SAAS,oBAAoB;mBAC7B,SAAS,oBAAoB;iBAqB5B,EAAE;0BAGL;2BAEC;0BACmB;sBACxB,0BAA0B,EAAE,QAAQ,GAAG;iBAK5C;uBAIM;gCAwCS,UAAgC,EAAE,KAAW;GAC1E,MAAM,OAAO,KAAK,mBAAmB;GACrC,MAAM,UAAU,KAAK,WAAW,KAAK,QAAQ,UACtC,KAAK,MAAM,QAAQ,UAAU,WAAW,KAAK,QAAQ,OAAO;AAEnE,QAAK,UAAU;AACf,QAAK,gBAAgB;AACrB,QAAK,oBAAoB;AAEzB,OAAI,QAAQ,WAAW,SAAS,QAC5B,MAAK,eAAe;;2BAQM;AAC9B,QAAK,sBAAsB,EAAE,QAAQ,MAAM,CAAC;;sBAuPzB,UAAwB;AAC3C,UAAO,gBAAgB;AACvB,UAAO,iBAAiB;AAExB,OAAI,KAAK,YAAY,KAAK,QACtB;AAGJ,OAAI,KAAK,KACA,MAAK,WAAW,MAAM;OAEtB,MAAK,WAAW;;gCAqLI,UAA8B;AAC3D,OAAI,KAAK,gBAAgB,MAAM,CAC3B;AAGC,QAAK,WAAW,gBAAgB;;4BAUZ,UAA+B;AACxD,OAAI,CAAC,KAAK,KACN;AAGJ,OAAI,MAAM,QAAQ,UAAU;AACxB,QAAI,CAAC,iBAAiB,KAAK,CACvB;AAGJ,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AAClB,SAAK,WAAW,SAAS;AAC9B;;AAKJ,OAAI,EAFiB,wBAAwB,IAAI,MAAM,IAAI,IAAI,yBAAyB,MAAM,EAG1F;AAGJ,OAAI,CAAC,qBAAqB,OAAO;IAC7B,QAAQ,KAAK,gBAAgB;IAC7B,OAAO,KAAK;IACf,CAAC,CACE;AAGJ,SAAM,gBAAgB;AACtB,SAAM,iBAAiB;AACvB,QAAK,iBAAiB,MAAM;;6BAGF,UAAgD;GAC1E,MAAM,EAAE,UAAU,MAAM;AAExB,OAAI,KAAK,SACL,MAAK,SAAS,KAAK,OAAO,SAAS,MAAM,GACnC,KAAK,OAAO,QAAQ,MAAM,MAAM,MAAM,GACtC,CAAC,GAAG,KAAK,QAAQ,MAAM;QAC1B;AACH,SAAK,QAAQ;AACR,SAAK,WAAW,MAAM;;AAG/B,QAAK,gBAAgB;AACrB,QAAK,iBAAiB;;gCAGO,UAAgD;AAC7E,OAAI,CAAC,KAAK,KACN;GAIJ,MAAM,QADU,KAAK,0BACP,CAAQ,WAAW,WAAW,OAAO,UAAU,MAAM,OAAO,MAAM;AAEhF,OAAI,UAAU,MAAM,UAAU,KAAK,iBAC/B;AAGJ,QAAK,mBAAmB;AACxB,QAAK,eAAe;;oBAwCH,UAA+B;AAChD,OAAI,CAAC,KAAK,MAAM;AACZ,QAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AACzE,WAAM,gBAAgB;AACjB,UAAK,WAAW;;AAGzB;;AAGJ,QAAK,iBAAiB,MAAM;;oCA0BK,UAA+D;AAChG,OAAI,CAAC,KAAK,KACN;AAGJ,QAAK,iBAAiB,MAAM,OAAO,cAAc;;;;gBApxB5B;;CAEzB,WAAoB,aAA4B;AAC5C,SAAO;GACH,GAAG,MAAM;GACT,iBAAiB;GACjB;IACI,oBAAoB,CAAC,WAAW;IAChC,gBAAgB,YAAY;KACxB,MAAM,SAAS;KACf,MAAM,SAAS;MACX,SAAS;MACT,SAAS;MACT,aAAa,EAAE;MAClB;AAED,SAAI,CAAC,OAAO,SACR,QAAO;AAKX,SAAI,EAFY,OAAO,WAAW,OAAO,OAAO,WAAW,IAAI,CAAC,OAAO,OAGnE,QAAO;AAGX,YAAO,UAAU;AACjB,YAAO,YAAY,KAAK,eAAe;AACvC,YAAO;;IAEd;GACJ;;CAgFL,IAAY,eAAsC;AAC9C,SAAO,KAAK,cAAc,mBAAmB,IAA6B;;CAqB9E,oBAAmC;AAC/B,OAAK,gBAAgB;AACrB,QAAM,mBAAmB;AACzB,OAAK,iBAAiB,sBAAsB,KAAK,0BAA2C;AAC5F,OAAK,iBAAiB,WAAW,KAAK,UAAU;AAChD,OAAK,kBAAkB,IAAI,uBAAuB;AAC9C,QAAK,sBAAsB,EAAE,QAAQ,MAAM,CAAC;IAC9C;AACF,OAAK,gBAAgB,QAAQ,MAAM;GAAE,WAAW;GAAM,SAAS;GAAM,CAAC;;CAG1E,uBAAsC;AAClC,OAAK,mBAAmB;AACxB,OAAK,oBAAoB,sBAAsB,KAAK,0BAA2C;AAC/F,OAAK,oBAAoB,WAAW,KAAK,UAAU;AACnD,OAAK,iBAAiB,YAAY;AAC7B,OAAK,WAAW,MAAM;AAC3B,QAAM,sBAAsB;;CAGhC,QAAiB,SAA+B;AAC5C,MAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,SAAS,IAAI,QAAQ,IAAI,WAAW,CACxE,MAAK,gBAAgB;AAGzB,QAAM,QAAQ,QAAQ;;CAG1B,oBAAwC;EACpC,MAAM,WAAW,KAAK,cAAc,mBAAmB,EAAE,iBAAiB,YAAY;AAEtF,MAAI,YAAY,SAAS,SAAS,EAC9B,QAAO,CAAC,GAAG,SAAS;AAGxB,SAAO,CAAC,GAAG,KAAK,iBAAiB,YAAY,CAAC;;CAiBlD,iBAA+B;AAC3B,OAAK,sBAAsB,EAAE,QAAQ,OAAO,CAAC;;;CAQjD,kBAAgC;EAC5B,MAAM,QAAQ,KAAK;AAEnB,MAAI,CAAC,SAAS,UAAU,KAAK,iBACzB;AAGJ,OAAK,mBAAmB;AACxB,OAAK,mBAAmB;AACxB,QAAM,iBAAiB,oBAAoB,KAAK,mBAAoC;AACpF,QAAM,iBAAiB,uBAAuB,KAAK,sBAAuC;AAC1F,QAAM,iBAAiB,sBAAsB,KAAK,0BAA2C;;CAGjG,oBAAkC;AAC9B,MAAI,CAAC,KAAK,iBACN;AAGJ,OAAK,iBAAiB,oBAAoB,oBAAoB,KAAK,mBAAoC;AACvG,OAAK,iBAAiB,oBAAoB,uBAAuB,KAAK,sBAAuC;AAC7G,OAAK,iBAAiB,oBAAoB,sBAAsB,KAAK,0BAA2C;AAChH,OAAK,mBAAmB;;CAG5B,IAAuB,mBAA4C;AAC/D,SAAO,KAAK,SAAS,KAAK,iBAAiB,KAAK;;CAGpD,sBAA6D;AACzD,SAAO,KAAK,iBAAiB,KAAK,kBAAkB;;CAGxD,gBAAyC;AACrC,MAAI,CAAC,KAAK,MAAM;AACZ,QAAK,aAAa,KAAK;AACvB;;AAGJ,MAAI,KAAK,UAAU;GACf,MAAM,WAAW,IAAI,UAAU;AAE/B,QAAK,MAAM,QAAQ,KAAK,OACpB,UAAS,OAAO,KAAK,MAAM,KAAK;AAGpC,QAAK,aAAa,SAAS;AAC3B;;AAGJ,OAAK,aAAa,KAAK,SAAS,GAAG;;CAGvC,sBAA+C;AAC3C,MAAI,KAAK,SACL,MAAK,SAAS,CAAC,GAAG,KAAK,cAAc;MAErC,MAAK,QAAQ,KAAK;AAGtB,OAAK,gBAAgB;;CAGzB,iBAAoC,OAA8C;AAC9E,MAAI,iBAAiB,YAAY,KAAK,MAAM;AACxC,QAAK,SAAS,MAAM,OAAO,KAAK,KAAK,CAAC,IAAI,OAAO;AACjD;;AAGJ,MAAI,OAAO,UAAU,SACjB,MAAK,QAAQ;;CAIrB,sBAA8B,QAA2B;EACrD,MAAM,QAAQ,OAAO,QAAQ,kBAAkB;AAE/C,SAAO,QAAQ,OAAO,OAAO;;CAGjC,oBAAwC;AACpC,SAAO,KAAK,QAAQ,QAAQ,WAAW,CAAC,KAAK,sBAAsB,OAAO,CAAC;;CAG/E,2BAA+C;AAC3C,SAAO,KAAK,mBAAmB,CAAC,QAAQ,WAAW,CAAC,OAAO,SAAS;;CAGxE,WAAmB,OAAwB;AACvC,MAAI,KAAK,SACL,QAAO,KAAK,OAAO,SAAS,MAAM;AAGtC,SAAO,KAAK,UAAU;;CAG1B,iBAA+B;EAC3B,MAAM,UAAU,KAAK,mBAAmB;AAExC,OAAK,MAAM,UAAU,KAAK,SAAS;AAC/B,UAAO,WAAW,KAAK,WAAW,OAAO,MAAM;AAC/C,UAAO,SAAS,CAAC,QAAQ,SAAS,OAAO;AACzC,UAAO,WAAW,GAAG,KAAK,UAAU,UAAU,OAAO;;AAGzD,OAAK,MAAM,SAAS,KAAK,iBAAiB,kBAAkB,EAAE;GAC1D,MAAM,eAAe,CAAC,GAAG,MAAM,iBAAiB,YAAY,CAAC;AAC7D,SAAM,SAAS,aAAa,SAAS,KAAK,aAAa,OAAO,WAAW,OAAO,OAAO;;AAG3F,wBAAsB,KAAK;AAE3B,OAAK,gBAAgB;AACrB,OAAK,wBAAwB;AAE7B,MAAI,KAAK,KACL,MAAK,eAAe;;CAI5B,iBAA+B;AAC3B,MAAI,CAAC,KAAK,MACN;AAGJ,MAAI,KAAK,UAAU;AACf,QAAK,MAAM,QAAQ,KAAK,OAAO,KAAK,IAAI;AACxC,QAAK,MAAM,WAAW,KAAK;AAC3B;;AAGJ,OAAK,MAAM,QAAQ,KAAK;AACxB,OAAK,MAAM,WAAW,KAAK;;CAG/B,kBAAkC;AAC9B,MAAI,KAAK,UAAU;GACf,MAAM,SAAS,KAAK,oBAAoB,CACnC,KAAK,WAAW,OAAO,UAAU,CAAC;AAEvC,UAAO,OAAO,SAAS,IAAI,OAAO,KAAK,KAAK,GAAG,KAAK;;AAKxD,SAFiB,KAAK,QAAQ,MAAM,WAAW,OAAO,UAAU,KAAK,MAE9D,EAAU,UAAU,IAAI,KAAK;;CAGxC,qBAAyC;AACrC,SAAO,KAAK,QAAQ,QAAQ,WAAW,KAAK,WAAW,OAAO,MAAM,CAAC;;;;;;CAOzE,yBAAuC;EACnC,MAAM,YAAY,KAAK;AAEvB,MAAI,CAAC,aAAa,KAAK,SACnB;AAGJ,YAAU,iBAAiB;AAC3B,YAAU,UAAU,OAAO,iBAAiB;EAE5C,MAAM,WAAW,KAAK,QAAQ,MAAM,WAAW,OAAO,UAAU,KAAK,MAAM;AAE3E,MAAI,CAAC,SACD;AAGJ,OAAK,MAAM,WAAW,SAAS,kBAAkB,CAC7C,WAAU,OAAO,QAAQ,UAAU,KAAK,CAAC;AAG7C,YAAU,UAAU,OAAO,kBAAkB,UAAU,oBAAoB,EAAE;;CAGjF,eAAgC;AAC5B,MAAI,KAAK,SACL,QAAO,KAAK,OAAO,SAAS;AAIhC,SAAO,KAAK,QAAQ,MAAM,WAAW,OAAO,UAAU,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM;;CAG5F,kCAAgD;AAC5C,MAAI,KAAK,SACL;EAGJ,MAAM,UAAU,KAAK,0BAA0B;AAE/C,MAAI,QAAQ,WAAW,EACnB;EAGJ,MAAM,gBAAgB,QAAQ,WAAW,WAAW,OAAO,UAAU,KAAK,MAAM;AAEhF,MAAI,iBAAiB,EACjB,MAAK,mBAAmB;;CAIhC,gBAA8B;EAC1B,MAAM,UAAU,KAAK,0BAA0B;AAE/C,OAAK,MAAM,UAAU,KAAK,SAAS;AAC/B,UAAO,cAAc;AACrB,UAAO,aAAa;;AAGxB,MAAI,QAAQ,WAAW,GAAG;AACtB,QAAK,mBAAmB;AACxB;;AAGJ,MAAI,KAAK,oBAAoB,QAAQ,OACjC,MAAK,mBAAmB;EAG5B,MAAM,cAAc,QAAQ,KAAK;AAEjC,MAAI,eAAe,KAAK,cAAc;AAClC,eAAY,cAAc;AAC1B,eAAY,aAAa;AACzB,kBAAe,aAAa,KAAK,cAAc,YAAY,OAAO;;;CAI1E,qBAAmC;AAC/B,OAAK,eAAe,0BAChB,KAAK,0BAA0B,GAC9B,UAAU;AACP,QAAK,mBAAmB;AACxB,QAAK,eAAe;AACpB,QAAK,0BAA0B,CAAC,QAAQ,cAAc;IAE7D;;CAkBL,iBAA6C;AACzC,SAAO,KAAK,kBAAkB;;CAGlC,wBAA+C;AAG3C,SAFgB,KAAK,0BACD,CAAQ,KAAK,mBACb,YAAY;;CAGpC,MAAM,OAAsB;AACxB,MAAI,KAAK,QAAQ,KAAK,WAAW,KAAK,SAClC;AAGJ,QAAM,KAAK,WAAW;;CAG1B,MAAM,KAAK,SAA0B,OAAsB;AACvD,MAAI,CAAC,KAAK,QAAQ,KAAK,QACnB;AAGJ,QAAM,KAAK,WAAW,OAAO;;CAGjC,YAAmC;EAC/B,MAAM,SAAS,KAAK,gBAAgB;AAEpC,MAAI,CAAC,UAAU,KAAK,QAChB,QAAO,QAAQ,SAAS;AAG5B,OAAK,cAAc,IAAI,aAAa,CAAC;AACrC,OAAK,UAAU;AACf,OAAK,gBAAgB;AACrB,OAAK,OAAO;AACZ,OAAK,aAAa,SAAS;AAC3B,OAAK,gBAAgB;AACrB,OAAK,iCAAiC;AAEtC,MAAI,KAAK,cAAc;AACnB,QAAK,aAAa,SAAS;AAE3B,+BAA4B,KAAK,cAAc,KAAK,UAAU;;EAGlE,MAAM,cAAc,OAAO,uBAAuB,CAAC;AACnD,OAAK,MAAM,YAAY,4BAA4B,GAAG,YAAY,IAAI;AACtE,OAAK,yBAAyB;AAC9B,OAAK,eAAe;AACpB,OAAK,oBAAoB;AAEzB,SAAO,KAAK,eAAe,KAAK,YAAY;GACxC,MAAM,YAAY,MAAM,uBAAuB,KAAK,cAAc,KAAK,WAAW,KAAK,EACnF,cAAc,MACjB,CAAC;AAEF,OAAI,KAAK,aACL,6BAA4B,KAAK,cAAc,UAAU;AAI7D,QAAK,gBAAgB;AACrB,QAAK,iBAAiB;AACtB,QAAK,gBAAgB;AACrB,QAAK,0BAA0B,CAAC,KAAK,mBAAmB,cAAc;AAEtE,QAAK,cAAc,IAAI,kBAAkB,CAAC;AAC1C,QAAK,cAAc,IAAI,YAAY,kBAAkB;IACjD,QAAQ,EAAE,MAAM,MAAM;IACtB,SAAS;IACT,UAAU;IACb,CAAC,CAAC;IACL;;CAGN,MAAc,WAAW,SAA0B,WAA0B;AACzE,MAAI,CAAC,KAAK,QAAQ,KAAK,QACnB;EAGJ,MAAM,YAAY,IAAI,YAAY,OAAO;AAEzC,MAAI,CAAC,KAAK,cAAc,UAAU,CAC9B;AAGJ,OAAK,aAAa,OAAO;AACzB,OAAK,mBAAmB;AACxB,OAAK,2BAA2B;AAEhC,OAAK,UAAU;AACf,OAAK,gBAAgB;AACrB,QAAM,KAAK,sBAAsB;AAEjC,OAAK,OAAO;AACZ,OAAK,UAAU;AACf,OAAK,gBAAgB;AAErB,MAAI,KAAK,cAAc;AACnB,QAAK,aAAa,SAAS;AAC3B,QAAK,aAAa,gBAAgB,YAAY;;AAGlD,OAAK,aAAa,SAAS;AAE3B,OAAK,cAAc,IAAI,kBAAkB,CAAC;AAC1C,OAAK,cAAc,IAAI,YAAY,kBAAkB;GACjD,QAAQ,EAAE,MAAM,OAAO;GACvB,SAAS;GACT,UAAU;GACb,CAAC,CAAC;AAEH,MAAI,KAAK,2BAA2B,OAAO,CACvC,MAAK,eAAe,MAAM,EAAE,eAAe,MAAM,CAAC;MAElD,MAAK,eAAe,MAAM;;CAIlC,uBAA8C;EAC1C,MAAM,QAAQ,KAAK;AAEnB,MAAI,CAAC,MACD,QAAO,QAAQ,SAAS;AAG5B,SAAO,IAAI,SAAS,YAAY;GAC5B,IAAI,UAAU;GAEd,MAAM,eAAqB;AACvB,QAAI,QACA;AAGJ,cAAU;AACV,UAAM,oBAAoB,gBAAgB,eAAe;AACzD,WAAO,aAAa,SAAS;AAC7B,UAAM,UAAU,OAAO,UAAU;AACjC,aAAS;;GAGb,MAAM,kBAAkB,UAAgC;AACpD,QAAI,MAAM,WAAW,SAAS,MAAM,cAAc,WAAW,uBAAuB,CAChF,SAAQ;;AAIhB,SAAM,UAAU,IAAI,UAAU;AAC9B,SAAM,iBAAiB,gBAAgB,eAAe;GACtD,MAAM,WAAW,OAAO,WAAW,QAAQ,IAAI;IACjD;;;CAIN,2BAAmC,QAAkC;AACjE,SAAO,WAAW,mBAAmB,WAAW;;CAGpD,0BAAwC;AACpC,sBAAoB,KAAK;AACzB,OAAK,oBAAoB;AACzB,WAAS,iBAAiB,eAAe,KAAK,uBAAuB,KAAK;AAC1E,WAAS,iBAAiB,WAAW,KAAK,mBAAmB,KAAK;;CAGtE,4BAA0C;AACtC,MAAI,KAAK,mBAAmB;AACxB,yBAAsB,KAAK;AAC3B,QAAK,oBAAoB;;AAG7B,WAAS,oBAAoB,eAAe,KAAK,uBAAuB,KAAK;AAC7E,WAAS,oBAAoB,WAAW,KAAK,mBAAmB,KAAK;;CAWzE,gBAAwB,OAA8B;AAClD,SAAO,uBAAuB,OAAO;GACjC,QAAQ,KAAK,gBAAgB;GAC7B,OAAO,KAAK;GACf,CAAC;;CAqEN,UAAkB,OAAe,OAAoB;AACjD,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AACvB,OAAK,SAAS,KAAK,OAAO,QAAQ,SAAS,SAAS,MAAM;AAC1D,OAAK,gBAAgB;AACrB,OAAK,iBAAiB;;CAG1B,YAAoB,OAAoB;AACpC,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AAEvB,MAAI,KAAK,SACL,MAAK,SAAS,EAAE;MAEhB,MAAK,QAAQ;AAGjB,OAAK,gBAAgB;AACrB,OAAK,cAAc,IAAI,cAAc,CAAC;AACtC,OAAK,iBAAiB;AACtB,OAAK,eAAe,OAAO;;CAG/B,kBAAgC;AAC5B,OAAK,cAAc,IAAI,YAAY,aAAa;GAC5C,QAAQ,EACJ,OAAO,KAAK,WAAW,CAAC,GAAG,KAAK,OAAO,GAAG,KAAK,OAClD;GACD,SAAS;GACT,UAAU;GACb,CAAC,CAAC;AAEH,OAAK,cAAc,IAAI,MAAM,SAAS;GAAE,SAAS;GAAM,UAAU;GAAM,CAAC,CAAC;AACzE,OAAK,cAAc,IAAI,MAAM,UAAU;GAAE,SAAS;GAAM,UAAU;GAAM,CAAC,CAAC;;CAgB9E,iBAAyB,OAA4B;EACjD,MAAM,UAAU,KAAK,0BAA0B;AAE/C,OAAK,mBAAmB,qBAAqB,OAAO;GAChD,OAAO;GACP,cAAc,KAAK;GACnB,aAAa,KAAK;GAClB,MAAM,KAAK;GACX,WAAW,UAAU;AACjB,SAAK,mBAAmB;AACxB,SAAK,eAAe;;GAExB,YAAY,UAAU;AAClB,YAAQ,QAAQ,cAAc;;GAElC,eAAe;AAAO,SAAK,WAAW,SAAS;;GAClD,CAAC;AAEF,MAAI,MAAM,IAAI,WAAW,KAAK,CAAC,MAAM,WAAW,CAAC,MAAM,WAAW,CAAC,MAAM,OACrE,MAAK,aAAa,UAAU,MAAM;;CAY1C,aAAqB;AACjB,SAAO,KAAK,oBAAoB,CAAC,KAAK,WAAW,IAAI;;0CAEnB,OAAO,UAAU,CAAC;;;;;iCAK3B,UAAU,OAAO,UAAU,GAAG;8BACjC,UAAiB,KAAK,UAAU,OAAO,OAAO,MAAM,CAAC;;;;;UAKzE;;CAGN,oBAA4B;AACxB,SAAO,IAAI;oDACiC,UAAU,aAAa,CAAC;;;CAIxE,yBAAiC,MAAuB;AACpD,MAAI,CAAC,KAAK,kBAAkB,KAAK,KAAK,CAClC,QAAO,IAAI,cAAc,KAAK;AAKlC,SAAO,IAAI;yBACM,KAAK,SAHJ,SAAS,UAAU,kBAAkB,cAGd;6BACpB,KAAK;;;;CAK9B,SAAkB;EACd,MAAM,eAAe,KAAK,iBAAiB;EAC3C,MAAM,gBAAgB,CAAC,KAAK,cAAc;EAC1C,MAAM,aAAa,KAAK,aAAa,KAAK,cAAc,KAAK,cAAc,IAAI,CAAC,KAAK;AAErF,SAAO,IAAI;;;;;;yBAMM,KAAK,WAAW,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM;4BAChD,KAAK,SAAS;+BACX,KAAK,gBAAgB,CAAC;;cAEvC,KAAK,WACD,IAAI;;;gCAGU,SAAS;GACb,SAAS;GACT,eAAe,KAAK;GACvB,CAAC,CAAC;;0BAED,KAAK,yBAAyB,QAAQ,CAAC;0BACvC,KAAK,cAAc,GACf,IAAI;gEAC8B,KAAK,YAAY,CAAC;kCAChD,YACI,IAAI;;;;;;qDAMW,KAAK,YAAY;;;;wCAKhC,QAAQ;gCAEhB,IAAI;;;;;yCAKO,KAAK,UAAU;gDACR,KAAK,SAAS;iDACb,KAAK,aAAa,QAAQ;;oDAEvB,KAAK,OAAO,SAAS,QAAQ;oDAC7B,KAAK,UAAU;6CACtB,KAAK,YAAY;;yEAEW,KAAK,YAAY;;8BAE5D;0BACJ,KAAK,yBAAyB,MAAM,CAAC;;;;;;wCAMvB,KAAK,SAAS;qCACjB,KAAK,YAAY;;8BAExB,KAAK,mBAAmB,CAAC;;;oBAIrC,IAAI;;;;gCAIU,SAAS;GACb,SAAS;GACT,eAAe,KAAK;GACvB,CAAC,CAAC;6BACE,KAAK,UAAU;oCACR,KAAK,SAAS;qCACb,KAAK,aAAa,QAAQ;;wCAEvB,KAAK,OAAO,SAAS,QAAQ;wCAC7B,KAAK,UAAU;iCACtB,KAAK,YAAY;;0BAExB,KAAK,yBAAyB,QAAQ,CAAC;;;oCAG7B,SAAS;GACb,OAAO;GACP,kBAAkB;GACrB,CAAC,CAAC;2BACJ,aAAa;0BACd,YACI,IAAI;;;;;;;6CAOW,KAAK,YAAY;;;;gCAKhC,QAAQ;0BACZ,KAAK,yBAAyB,MAAM,CAAC;0BACrC,KAAK,mBAAmB,CAAC;;kBAEjC;;0BAEQ,KAAK,gBAAgB,IAAI,GAAG;6BACzB,KAAK,UAAU;4BAChB,KAAK,WAAW;wBACpB,QAAQ;;;;;;4BAMJ,SAAS;GACb,OAAO;GACP,oBAAoB;GACpB,SAAS,KAAK;GACjB,CAAC,CAAC;yBACE,KAAK,UAAU;;2CAEG,KAAK,WAAW,SAAS,QAAQ;;8BAE9C,CAAC,KAAK,QAAQ,CAAC,KAAK,QAAQ;gCAC1B,KAAK,iBAAiB,CAAC,KAAK,UAAU,KAAK,QAAQ;kCACjD,KAAK,YAAY;;;;;;;;YA95B9C,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,SAAA,WAAA,QAAA,KAAA,EAAA;YAG1C,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,SAAA,WAAA,YAAA,KAAA,EAAA;YAG1C,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,SAAA,WAAA,aAAA,KAAA,EAAA;YAI3B,SAAS;CAAE,WAAW;CAAe,MAAM;CAAQ,CAAC,CAAA,EAAA,SAAA,WAAA,cAAA,KAAA,EAAA;YAGpD,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,SAAA,WAAA,aAAA,KAAA,EAAA;YAG1C,SAAS;CAAE,WAAW;CAAc,MAAM;CAAS,CAAC,CAAA,EAAA,SAAA,WAAA,aAAA,KAAA,EAAA;YAGpD,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,SAAA,WAAA,WAAA,KAAA,EAAA;YAG1C,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,SAAA,WAAA,QAAA,KAAA,EAAA;YAI3B,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,SAAA,WAAA,SAAA,KAAA,EAAA;YAI3B,UAAU,CAAA,EAAA,SAAA,WAAA,eAAA,KAAA,EAAA;YAGV,UAAU,CAAA,EAAA,SAAA,WAAA,SAAA,KAAA,EAAA;YAGV,SAAS,EAAE,WAAW,iBAAiB,CAAC,CAAA,EAAA,SAAA,WAAA,gBAAA,KAAA,EAAA;YAGxC,SAAS;CAAE,MAAM;CAAO,WAAW;CAAO,CAAC,CAAA,EAAA,SAAA,WAAA,UAAA,KAAA,EAAA;YAG3C,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,SAAA,WAAA,iBAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,WAAW,cAAc,CAAC,CAAA,EAAA,SAAA,WAAA,aAAA,KAAA,EAAA;YAOrC,SAAS;CAAE,WAAW;CAAc,MAAM;CAAS,CAAC,CAAA,EAAA,SAAA,WAAA,aAAA,KAAA,EAAA;YAQpD,MAAM,iBAAiB,CAAA,EAAA,SAAA,WAAA,uBAAA,KAAA,EAAA;YAGvB,MAAM,WAAW,CAAA,EAAA,SAAA,WAAA,gBAAA,KAAA,EAAA;YAGjB,MAAM,WAAW,CAAA,EAAA,SAAA,WAAA,kBAAA,KAAA,EAAA;YAGjB,MAAM,4CAA4C,CAAA,EAAA,SAAA,WAAA,iBAAA,KAAA,EAAA;YAGlD,MAAM,eAAe,CAAA,EAAA,SAAA,WAAA,SAAA,KAAA,EAAA;YASrB,OAAO,CAAA,EAAA,SAAA,WAAA,oBAAA,KAAA,EAAA;YASP,OAAO,CAAA,EAAA,SAAA,WAAA,WAAA,KAAA,EAAA;YAIP,OAAO,CAAA,EAAA,SAAA,WAAA,iBAAA,KAAA,EAAA;uBApIX,cAAc,YAAY,CAAA,EAAA,SAAA"}
|
|
@@ -88,6 +88,12 @@ var pkTabStyles = css`
|
|
|
88
88
|
height: auto;
|
|
89
89
|
min-height: auto;
|
|
90
90
|
align-items: stretch;
|
|
91
|
+
/* Pin type metrics for slotted labels — vars cascade from pk-tabs. */
|
|
92
|
+
font-family: var(--pk-font-family);
|
|
93
|
+
font-size: var(--pk-tabs-trigger-font-size, 13px);
|
|
94
|
+
font-weight: var(--pk-tabs-trigger-font-weight, 400);
|
|
95
|
+
line-height: var(--pk-tabs-trigger-line-height, 1.4);
|
|
96
|
+
color: var(--pk-tabs-trigger-color, inherit);
|
|
91
97
|
}
|
|
92
98
|
|
|
93
99
|
.trigger {
|
|
@@ -104,7 +110,7 @@ var pkTabStyles = css`
|
|
|
104
110
|
border-top: var(--pk-tabs-trigger-border-top, 0 solid transparent);
|
|
105
111
|
border-radius: var(--pk-tabs-trigger-radius, var(--pk-radius-sm));
|
|
106
112
|
background: transparent;
|
|
107
|
-
color:
|
|
113
|
+
color: inherit;
|
|
108
114
|
font: inherit;
|
|
109
115
|
font-family: var(--pk-font-family);
|
|
110
116
|
font-size: var(--pk-tabs-trigger-font-size, 13px);
|
|
@@ -256,4 +262,4 @@ PkTab = __decorate([customElement("pk-tab")], PkTab);
|
|
|
256
262
|
//#endregion
|
|
257
263
|
export { PkTab as t };
|
|
258
264
|
|
|
259
|
-
//# sourceMappingURL=pk-tab-
|
|
265
|
+
//# sourceMappingURL=pk-tab-BdoPiYfT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pk-tab-BdoPiYfT.js","names":[],"sources":["../../src/components/tabs/pk-tab-base.ts","../../src/components/tabs/pk-tab.styles.ts","../../src/components/tabs/pk-tab.ts"],"sourcesContent":["import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport { PkElement } from '../../base/pk-element.js';\n\n/** Shared tab trigger behaviour for all tab variants. */\nexport class PkTabBase extends PkElement {\n @property()\n value = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n @property({ type: Number, attribute: 'focus-index' })\n focusIndex = -1;\n\n @property()\n panelId?: string;\n\n focusControl(): void {\n this.shadowRoot?.querySelector<HTMLButtonElement>('.trigger')?.focus();\n }\n\n protected handleClick(): void {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(new CustomEvent('pk-tab-select', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n protected handleKeyDown(event: KeyboardEvent): void {\n this.dispatchEvent(new CustomEvent('pk-tab-keydown', {\n detail: { event, value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n protected renderTrigger(className: string) {\n return html`\n <button\n part=\"trigger\"\n type=\"button\"\n class=${className}\n role=\"tab\"\n ?disabled=${this.disabled}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-selected=${this.selected ? 'true' : 'false'}\n tabindex=${this.focusIndex}\n aria-controls=${this.panelId ?? nothing}\n @click=${this.handleClick}\n @keydown=${this.handleKeyDown}\n >\n <span part=\"icon\" class=\"icon\">\n <slot name=\"icon\"></slot>\n </span>\n <span part=\"label\" class=\"label\">\n <slot></slot>\n </span>\n <span part=\"status\" class=\"status\">\n <slot name=\"status\"></slot>\n </span>\n </button>\n `;\n }\n}\n","import { css } from 'lit';\n\nexport const pkTabStyles = css`\n @layer pk-component {\n :host {\n /* Size to the shadow trigger. Prefer flex-start so a short list line\n * (or host utilities like Tailwind items-center) cannot stretch the\n * host shorter than the trigger and clip the modal active underline. */\n display: inline-flex;\n flex-shrink: 0;\n align-self: flex-start;\n height: auto;\n min-height: auto;\n align-items: stretch;\n /* Pin type metrics for slotted labels — vars cascade from pk-tabs. */\n font-family: var(--pk-font-family);\n font-size: var(--pk-tabs-trigger-font-size, 13px);\n font-weight: var(--pk-tabs-trigger-font-weight, 400);\n line-height: var(--pk-tabs-trigger-line-height, 1.4);\n color: var(--pk-tabs-trigger-color, inherit);\n }\n\n .trigger {\n position: relative;\n display: var(--pk-tabs-trigger-display, inline-flex);\n align-items: center;\n justify-content: var(--pk-tabs-trigger-justify, center);\n gap: var(--pk-tabs-trigger-gap, 0.5rem);\n width: var(--pk-tabs-trigger-width, auto);\n min-height: var(--pk-tabs-trigger-min-height, 2rem);\n padding: var(--pk-tabs-trigger-padding-block, 0.375rem)\n var(--pk-tabs-trigger-padding-inline, 0.75rem);\n border: 0;\n border-top: var(--pk-tabs-trigger-border-top, 0 solid transparent);\n border-radius: var(--pk-tabs-trigger-radius, var(--pk-radius-sm));\n background: transparent;\n color: inherit;\n font: inherit;\n font-family: var(--pk-font-family);\n font-size: var(--pk-tabs-trigger-font-size, 13px);\n font-weight: var(--pk-tabs-trigger-font-weight, 400);\n line-height: var(--pk-tabs-trigger-line-height, 1.4);\n text-align: var(--pk-tabs-trigger-text-align, center);\n text-transform: var(--pk-tabs-trigger-text-transform, none);\n white-space: nowrap;\n cursor: pointer;\n outline: none;\n box-shadow: none;\n box-sizing: border-box;\n transition: background-color 0.12s ease, color 0.12s ease, box-shadow 0.12s ease, border-color 0.12s ease;\n }\n\n /* Collapse optional icon/status lanes when nothing is slotted. */\n .icon,\n .status {\n display: none;\n flex: none;\n align-items: center;\n justify-content: center;\n line-height: 0;\n }\n\n .icon:has(::slotted(*)),\n .status:has(::slotted(*)) {\n display: inline-flex;\n }\n\n .icon {\n width: var(--pk-tabs-trigger-icon-size, 1.125rem);\n height: var(--pk-tabs-trigger-icon-size, 1.125rem);\n font-size: var(--pk-tabs-trigger-icon-size, 1.125rem);\n color: var(--pk-tabs-trigger-icon-color, inherit);\n }\n\n .icon ::slotted(*) {\n display: block;\n max-width: 100%;\n max-height: 100%;\n /* Kill pk-icon text-baseline nudge so logos/icons sit on the flex midline. */\n vertical-align: 0;\n }\n\n .label {\n display: inline-flex;\n flex: var(--pk-tabs-trigger-label-flex, 0 1 auto);\n align-items: center;\n min-width: 0;\n line-height: inherit;\n }\n\n .status {\n margin-inline-start: var(--pk-tabs-trigger-status-margin, 0);\n color: var(--pk-tabs-trigger-status-color, inherit);\n }\n\n .trigger:hover:not(:disabled):not([aria-disabled='true']):not([aria-selected='true']) {\n border-top-color: transparent;\n background: var(--pk-tabs-trigger-hover-bg, rgb(255 255 255 / 0.7));\n color: var(--pk-tabs-trigger-hover-color, var(--pk-color-gray-700));\n }\n\n /*\n * Focus ring is only for :focus-visible on a non-selected tab (manual\n * activation). Selected + focus-visible must NOT draw a ring — active\n * chrome is the underline (mouse) or is replaced by the modal focus box\n * via --pk-tabs-trigger-focus-selected-shadow when set.\n */\n .trigger:focus-visible:not([aria-selected='true']) {\n box-shadow: inset 0 0 0 2px var(--pk-color-sky-600);\n }\n\n .trigger:disabled,\n .trigger[aria-disabled='true'] {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .trigger[aria-selected='true'],\n :host([selected]) .trigger {\n border-top: var(--pk-tabs-trigger-selected-border-top, var(--pk-tabs-trigger-border-top, 0 solid transparent));\n border-radius: var(--pk-tabs-trigger-selected-radius, var(--pk-radius-sm));\n background: var(--pk-tabs-trigger-selected-bg, var(--pk-color-white));\n color: var(--pk-tabs-trigger-selected-color, var(--pk-color-gray-800));\n box-shadow: var(--pk-tabs-trigger-selected-shadow, 0 1px 2px rgba(31, 41, 51, 0.12));\n }\n\n .trigger[aria-selected='true']:hover,\n :host([selected]) .trigger:hover {\n background: var(--pk-tabs-trigger-selected-hover-bg, var(--pk-tabs-trigger-selected-bg, var(--pk-color-white)));\n color: var(--pk-tabs-trigger-selected-hover-color, var(--pk-tabs-trigger-selected-color, var(--pk-color-gray-800)));\n }\n\n /* screen3: keyboard focus on the active tab → full inset box, no underline. */\n .trigger[aria-selected='true']:focus-visible,\n :host([selected]) .trigger:focus-visible {\n box-shadow: var(\n --pk-tabs-trigger-focus-selected-shadow,\n var(--pk-tabs-trigger-selected-shadow, 0 0 #0000)\n );\n }\n\n .trigger[aria-selected='true']:focus-visible::after,\n :host([selected]) .trigger:focus-visible::after {\n height: var(--pk-tabs-trigger-focus-selected-underline-height, var(--pk-tabs-trigger-underline-height, 0));\n }\n\n .trigger[aria-selected='true']::after,\n :host([selected]) .trigger::after {\n content: '';\n position: absolute;\n right: var(--pk-tabs-trigger-underline-inset, 15px);\n bottom: 0;\n left: var(--pk-tabs-trigger-underline-inset, 15px);\n height: var(--pk-tabs-trigger-underline-height, 0);\n /* Keep the bar above the list hairline when both meet at the clip edge. */\n z-index: 1;\n background: var(--pk-color-sky-600);\n pointer-events: none;\n }\n\n /*\n * Validation error chrome (v1 ModalTabs / PaneTabs text-error).\n * Host sets data-has-errors; light-DOM text-* cannot pierce the trigger.\n */\n :host([data-has-errors]) {\n --pk-tabs-trigger-color: var(--pk-color-error, #d81f23);\n --pk-tabs-trigger-hover-color: var(--pk-color-rose-700, #be123c);\n --pk-tabs-trigger-selected-color: var(--pk-color-error, #d81f23);\n --pk-tabs-trigger-selected-hover-color: var(--pk-color-rose-700, #be123c);\n --pk-tabs-trigger-icon-color: inherit;\n --pk-tabs-trigger-status-color: inherit;\n }\n }\n`;\n","import { customElement } from 'lit/decorators.js';\n\nimport { PkTabBase } from './pk-tab-base.js';\nimport { pkTabStyles } from './pk-tab.styles.js';\n\n/**\n * Tab trigger — use inside `pk-tabs` with `slot=\"nav\"`.\n *\n * @slot - Tab label\n * @slot icon - Optional leading content (icon, logo, etc.)\n * @slot status - Optional trailing content (status dot, badge, etc.)\n *\n * @csspart trigger - Tab button\n * @csspart icon - Icon slot wrapper (hidden when empty)\n * @csspart label - Label slot wrapper\n * @csspart status - Status slot wrapper (hidden when empty)\n */\n@customElement('pk-tab')\nexport class PkTab extends PkTabBase {\n static override styles = pkTabStyles;\n\n override render() {\n return this.renderTrigger('trigger pk-tabs__trigger');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-tab': PkTab;\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,YAAb,cAA+B,UAAU;;;eAE7B;kBAGG;kBAGA;oBAGE;;CAKb,eAAqB;AACjB,OAAK,YAAY,cAAiC,WAAW,EAAE,OAAO;;CAG1E,cAA8B;AAC1B,MAAI,KAAK,SACL;AAGJ,OAAK,cAAc,IAAI,YAAY,iBAAiB;GAChD,QAAQ,EAAE,OAAO,KAAK,OAAO;GAC7B,SAAS;GACT,UAAU;GACb,CAAC,CAAC;;CAGP,cAAwB,OAA4B;AAChD,OAAK,cAAc,IAAI,YAAY,kBAAkB;GACjD,QAAQ;IAAE;IAAO,OAAO,KAAK;IAAO;GACpC,SAAS;GACT,UAAU;GACb,CAAC,CAAC;;CAGP,cAAwB,WAAmB;AACvC,SAAO,IAAI;;;;wBAIK,UAAU;;4BAEN,KAAK,SAAS;gCACV,KAAK,WAAW,SAAS,QAAQ;gCACjC,KAAK,WAAW,SAAS,QAAQ;2BACtC,KAAK,WAAW;gCACX,KAAK,WAAW,QAAQ;yBAC/B,KAAK,YAAY;2BACf,KAAK,cAAc;;;;;;;;;;;;;;;YApDzC,UAAU,CAAA,EAAA,UAAA,WAAA,SAAA,KAAA,EAAA;YAGV,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,UAAA,WAAA,YAAA,KAAA,EAAA;YAG1C,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,UAAA,WAAA,YAAA,KAAA,EAAA;YAG1C,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,CAAC,CAAA,EAAA,UAAA,WAAA,cAAA,KAAA,EAAA;YAGpD,UAAU,CAAA,EAAA,UAAA,WAAA,WAAA,KAAA,EAAA;;;ACjBf,IAAa,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACgBvB,IAAA,QAAA,MAAM,cAAc,UAAU;;gBACR;;CAEzB,SAAkB;AACd,SAAO,KAAK,cAAc,2BAA2B;;;oBAL5D,cAAc,SAAS,CAAA,EAAA,MAAA"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { t as icons_exports } from "./icons-BR8JcQj2.js";
|
|
2
2
|
import { t as __decorate } from "./decorate-W02hmVTt.js";
|
|
3
3
|
import { t as createIconElement } from "./render-Dvc3MHQR.js";
|
|
4
|
-
import
|
|
4
|
+
import "./pk-option-C-cR-jOv.js";
|
|
5
|
+
import { n as pkSelectStyles, t as PkSelect } from "./pk-select-odSNU1tN.js";
|
|
5
6
|
import { css } from "lit";
|
|
6
7
|
import { customElement } from "lit/decorators.js";
|
|
7
8
|
//#region src/utils/time-options.ts
|
|
@@ -225,4 +226,4 @@ PkTimePicker = __decorate([customElement("pk-time-picker")], PkTimePicker);
|
|
|
225
226
|
//#endregion
|
|
226
227
|
export { PkTimePicker as t };
|
|
227
228
|
|
|
228
|
-
//# sourceMappingURL=pk-time-picker-
|
|
229
|
+
//# sourceMappingURL=pk-time-picker-DtX0LtID.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pk-time-picker-DbW_hMs2.js","names":[],"sources":["../../src/utils/time-options.ts","../../src/components/time-picker/pk-time-picker.styles.ts","../../src/components/time-picker/pk-time-picker.ts"],"sourcesContent":["export type TimeOption = {\n value: string;\n label: string;\n};\n\nexport type TimepickerFormatOptions = {\n timeFormat?: string;\n lang?: {\n AM?: string;\n PM?: string;\n };\n locale?: string;\n};\n\nlet timeOptionsCache: TimeOption[] | null = null;\n\nfunction resolveTimepickerOptions(): Required<Pick<TimepickerFormatOptions, 'timeFormat' | 'lang'>> & { locale: string } {\n const craft = (globalThis as typeof globalThis & {\n Craft?: { timepicker?: TimepickerFormatOptions };\n }).Craft?.timepicker;\n\n return {\n timeFormat: craft?.timeFormat || 'g:i A',\n lang: {\n AM: craft?.lang?.AM || 'AM',\n PM: craft?.lang?.PM || 'PM',\n },\n locale: craft?.locale || document.documentElement.lang || 'en-US',\n };\n}\n\n/** Generate time options in 30-minute increments — mirrors React `generateTimeOptions`. */\nexport function generateTimeOptions(): TimeOption[] {\n if (timeOptionsCache) {\n return timeOptionsCache;\n }\n\n const options: TimeOption[] = [];\n const { timeFormat, lang, locale } = resolveTimepickerOptions();\n\n for (let hour = 0; hour < 24; hour += 1) {\n for (let minute = 0; minute < 60; minute += 30) {\n const timeString = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`;\n\n let displayTime: string;\n\n if (timeFormat === 'g:i A') {\n let displayHour = hour;\n\n if (hour === 0) {\n displayHour = 12;\n } else if (hour > 12) {\n displayHour = hour - 12;\n }\n\n const ampm = hour >= 12 ? lang.PM : lang.AM;\n displayTime = `${displayHour}:${minute.toString().padStart(2, '0')} ${ampm}`;\n } else if (timeFormat === 'G:i') {\n displayTime = timeString;\n } else {\n displayTime = new Date(`2000-01-01T${timeString}:00`).toLocaleTimeString(locale, {\n hour: 'numeric',\n minute: '2-digit',\n hour12: timeFormat.includes('A'),\n });\n }\n\n options.push({\n value: timeString,\n label: displayTime,\n });\n }\n }\n\n timeOptionsCache = options;\n\n return options;\n}\n\nexport function clearTimeOptionsCache(): void {\n timeOptionsCache = null;\n}\n","import { css } from 'lit';\n\nexport const pkTimePickerStyles = css`\n @layer pk-component {\n :host {\n display: inline-block;\n width: 8.125rem;\n min-width: 8.125rem;\n color: var(--pk-color-gray-700);\n --pk-select-trigger-border-width: 1px;\n --pk-select-item-min-height: 2.125rem;\n --pk-select-item-padding-block: 0;\n --pk-select-item-padding-inline: 10px;\n --pk-select-item-font-size: var(--pk-font-size-base);\n }\n\n .control {\n justify-content: flex-start;\n gap: 0.5rem;\n width: 100%;\n height: 2.125rem;\n min-height: 2.125rem;\n border-color: var(--pk-color-slate-400) !important;\n border-radius: var(--pk-radius-lg) !important;\n background: transparent !important;\n background-color: transparent !important;\n text-align: left;\n font-weight: 400;\n line-height: 1.2;\n cursor: default;\n }\n\n :host([open]) .control {\n background: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n background-color: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n border-color: var(--pk-color-slate-400) !important;\n box-shadow: none;\n }\n\n :host(:not([disabled])) .control:hover:not(:disabled) {\n background: var(--pk-color-slate-50) !important;\n background-color: var(--pk-color-slate-50) !important;\n }\n\n :host(:not([disabled])[open]) .control:hover:not(:disabled),\n :host(:not([disabled])) .control:active:not(:disabled) {\n background: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n background-color: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n }\n\n :host(:not([invalid]):not(:state(user-invalid))) .control:focus-visible,\n :host(:not([invalid]):not(:state(user-invalid))[data-state='focus-visible']) .control {\n border-color: var(--pk-color-sky-600) !important;\n box-shadow: var(--pk-input-focus-shadow);\n }\n\n :host(:not([invalid]):not(:state(user-invalid))[open]) .control:focus-visible,\n :host(:not([invalid]):not(:state(user-invalid))[open][data-state='focus-visible']) .control {\n border-color: var(--pk-color-slate-400) !important;\n box-shadow: none;\n }\n\n :host([invalid]) .control,\n :host(:state(user-invalid)) .control {\n border-color: var(--pk-color-rose-600) !important;\n }\n\n :host([invalid]) .control:focus-visible,\n :host([invalid][data-state='focus-visible']) .control,\n :host(:state(user-invalid)) .control:focus-visible,\n :host(:state(user-invalid)[data-state='focus-visible']) .control {\n box-shadow: var(--pk-input-invalid-focus-shadow);\n }\n\n .control-start {\n color: var(--pk-color-gray-400);\n pointer-events: none;\n }\n\n .control-start svg {\n display: block;\n width: 14px;\n height: 14px;\n }\n\n .value {\n flex: 1;\n line-height: 1.2;\n color: inherit;\n }\n\n .value.is-placeholder {\n color: var(--pk-color-gray-400);\n }\n\n .icon {\n margin-inline-start: auto;\n color: var(--pk-color-gray-600);\n }\n\n .panel {\n min-width: 8rem;\n max-height: 15rem;\n }\n\n /* Editable-table cells: flush fill — must live here so !important beats the\n * standalone trigger chrome (external ::part cannot override it). */\n :host(.cell-pk-control) {\n display: block;\n width: 100%;\n min-width: 0;\n height: 100%;\n --pk-select-trigger-border-width: 0;\n --pk-select-item-min-height: 100%;\n --pk-select-item-padding-block: 0;\n }\n\n :host(.cell-pk-control) .control {\n width: 100%;\n height: 100% !important;\n min-height: 100% !important;\n border: 0 !important;\n border-radius: 0 !important;\n background: transparent !important;\n background-color: transparent !important;\n }\n\n :host(.cell-pk-control:not([disabled])) .control:hover:not(:disabled),\n :host(.cell-pk-control[open]) .control,\n :host(.cell-pk-control:not([disabled])[open]) .control:hover:not(:disabled),\n :host(.cell-pk-control:not([disabled])) .control:active:not(:disabled) {\n border-radius: 0 !important;\n }\n\n :host(.cell-pk-control:not([invalid]):not(:state(user-invalid))) .control:focus-visible,\n :host(.cell-pk-control:not([invalid]):not(:state(user-invalid))[data-state='focus-visible']) .control {\n border: 0 !important;\n box-shadow: inset 0 0 0 1px var(--pk-color-gray-200, #e5e7eb);\n }\n }\n`;\n","import { customElement } from 'lit/decorators.js';\n\nimport { createIconElement, clock } from '../../icons/index.js';\nimport { PkSelect } from '../select/pk-select.js';\n// Time picker seeds light-DOM options at connect — register the CE so getLabel() works.\nimport '../select/pk-option.js';\nimport { pkSelectStyles } from '../select/pk-select.styles.js';\nimport { generateTimeOptions } from '../../utils/time-options.js';\nimport { pkTimePickerStyles } from './pk-time-picker.styles.js';\n\n/**\n * Time picker — select wrapper with 30-minute increments and a clock icon.\n * Mirrors React `TimePicker` (not `pk-time-input`).\n *\n * @slot start - Overrides the default clock icon\n * @slot - Additional `pk-option` items append after the generated list\n *\n * @event input\n * @event change\n * @event pk-change - `detail.value`\n */\n@customElement('pk-time-picker')\nexport class PkTimePicker extends PkSelect {\n // Flatten — `pkSelectStyles` is already a CSSResult[].\n static override styles = [...pkSelectStyles, pkTimePickerStyles];\n\n private optionsSeeded = false;\n\n override connectedCallback(): void {\n this.ensureTimeOptions();\n this.ensureClockIcon();\n super.connectedCallback();\n }\n\n private ensureTimeOptions(): void {\n if (this.optionsSeeded || this.querySelector('pk-option')) {\n this.optionsSeeded = true;\n return;\n }\n\n for (const option of generateTimeOptions()) {\n const element = document.createElement('pk-option');\n element.value = option.value;\n element.textContent = option.label;\n this.append(element);\n }\n\n this.optionsSeeded = true;\n }\n\n private ensureClockIcon(): void {\n if (this.querySelector('[slot=\"start\"]')) {\n return;\n }\n\n const icon = createIconElement(clock);\n icon.setAttribute('slot', 'start');\n this.prepend(icon);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-time-picker': PkTimePicker;\n }\n}\n"],"mappings":";;;;;;;AAcA,IAAI,mBAAwC;AAE5C,SAAS,2BAAgH;CACrH,MAAM,QAAS,WAEZ,OAAO;AAEV,QAAO;EACH,YAAY,OAAO,cAAc;EACjC,MAAM;GACF,IAAI,OAAO,MAAM,MAAM;GACvB,IAAI,OAAO,MAAM,MAAM;GAC1B;EACD,QAAQ,OAAO,UAAU,SAAS,gBAAgB,QAAQ;EAC7D;;;AAIL,SAAgB,sBAAoC;AAChD,KAAI,iBACA,QAAO;CAGX,MAAM,UAAwB,EAAE;CAChC,MAAM,EAAE,YAAY,MAAM,WAAW,0BAA0B;AAE/D,MAAK,IAAI,OAAO,GAAG,OAAO,IAAI,QAAQ,EAClC,MAAK,IAAI,SAAS,GAAG,SAAS,IAAI,UAAU,IAAI;EAC5C,MAAM,aAAa,GAAG,KAAK,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,SAAS,GAAG,IAAI;EAE5F,IAAI;AAEJ,MAAI,eAAe,SAAS;GACxB,IAAI,cAAc;AAElB,OAAI,SAAS,EACT,eAAc;YACP,OAAO,GACd,eAAc,OAAO;GAGzB,MAAM,OAAO,QAAQ,KAAK,KAAK,KAAK,KAAK;AACzC,iBAAc,GAAG,YAAY,GAAG,OAAO,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;aAC/D,eAAe,MACtB,eAAc;MAEd,gCAAc,IAAI,KAAK,cAAc,WAAW,KAAK,EAAC,mBAAmB,QAAQ;GAC7E,MAAM;GACN,QAAQ;GACR,QAAQ,WAAW,SAAS,IAAI;GACnC,CAAC;AAGN,UAAQ,KAAK;GACT,OAAO;GACP,OAAO;GACV,CAAC;;AAIV,oBAAmB;AAEnB,QAAO;;;;AC1EX,IAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACoB9B,IAAA,eAAA,MAAM,qBAAqB,SAAS;;;uBAIf;;;gBAFC,CAAC,GAAG,gBAAgB,mBAAmB;;CAIhE,oBAAmC;AAC/B,OAAK,mBAAmB;AACxB,OAAK,iBAAiB;AACtB,QAAM,mBAAmB;;CAG7B,oBAAkC;AAC9B,MAAI,KAAK,iBAAiB,KAAK,cAAc,YAAY,EAAE;AACvD,QAAK,gBAAgB;AACrB;;AAGJ,OAAK,MAAM,UAAU,qBAAqB,EAAE;GACxC,MAAM,UAAU,SAAS,cAAc,YAAY;AACnD,WAAQ,QAAQ,OAAO;AACvB,WAAQ,cAAc,OAAO;AAC7B,QAAK,OAAO,QAAQ;;AAGxB,OAAK,gBAAgB;;CAGzB,kBAAgC;AAC5B,MAAI,KAAK,cAAc,mBAAiB,CACpC;EAGJ,MAAM,OAAO,kBAAkB,cAAA,MAAM;AACrC,OAAK,aAAa,QAAQ,QAAQ;AAClC,OAAK,QAAQ,KAAK;;;2BApCzB,cAAc,iBAAiB,CAAA,EAAA,aAAA"}
|
|
1
|
+
{"version":3,"file":"pk-time-picker-DtX0LtID.js","names":[],"sources":["../../src/utils/time-options.ts","../../src/components/time-picker/pk-time-picker.styles.ts","../../src/components/time-picker/pk-time-picker.ts"],"sourcesContent":["export type TimeOption = {\n value: string;\n label: string;\n};\n\nexport type TimepickerFormatOptions = {\n timeFormat?: string;\n lang?: {\n AM?: string;\n PM?: string;\n };\n locale?: string;\n};\n\nlet timeOptionsCache: TimeOption[] | null = null;\n\nfunction resolveTimepickerOptions(): Required<Pick<TimepickerFormatOptions, 'timeFormat' | 'lang'>> & { locale: string } {\n const craft = (globalThis as typeof globalThis & {\n Craft?: { timepicker?: TimepickerFormatOptions };\n }).Craft?.timepicker;\n\n return {\n timeFormat: craft?.timeFormat || 'g:i A',\n lang: {\n AM: craft?.lang?.AM || 'AM',\n PM: craft?.lang?.PM || 'PM',\n },\n locale: craft?.locale || document.documentElement.lang || 'en-US',\n };\n}\n\n/** Generate time options in 30-minute increments — mirrors React `generateTimeOptions`. */\nexport function generateTimeOptions(): TimeOption[] {\n if (timeOptionsCache) {\n return timeOptionsCache;\n }\n\n const options: TimeOption[] = [];\n const { timeFormat, lang, locale } = resolveTimepickerOptions();\n\n for (let hour = 0; hour < 24; hour += 1) {\n for (let minute = 0; minute < 60; minute += 30) {\n const timeString = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`;\n\n let displayTime: string;\n\n if (timeFormat === 'g:i A') {\n let displayHour = hour;\n\n if (hour === 0) {\n displayHour = 12;\n } else if (hour > 12) {\n displayHour = hour - 12;\n }\n\n const ampm = hour >= 12 ? lang.PM : lang.AM;\n displayTime = `${displayHour}:${minute.toString().padStart(2, '0')} ${ampm}`;\n } else if (timeFormat === 'G:i') {\n displayTime = timeString;\n } else {\n displayTime = new Date(`2000-01-01T${timeString}:00`).toLocaleTimeString(locale, {\n hour: 'numeric',\n minute: '2-digit',\n hour12: timeFormat.includes('A'),\n });\n }\n\n options.push({\n value: timeString,\n label: displayTime,\n });\n }\n }\n\n timeOptionsCache = options;\n\n return options;\n}\n\nexport function clearTimeOptionsCache(): void {\n timeOptionsCache = null;\n}\n","import { css } from 'lit';\n\nexport const pkTimePickerStyles = css`\n @layer pk-component {\n :host {\n display: inline-block;\n width: 8.125rem;\n min-width: 8.125rem;\n color: var(--pk-color-gray-700);\n --pk-select-trigger-border-width: 1px;\n --pk-select-item-min-height: 2.125rem;\n --pk-select-item-padding-block: 0;\n --pk-select-item-padding-inline: 10px;\n --pk-select-item-font-size: var(--pk-font-size-base);\n }\n\n .control {\n justify-content: flex-start;\n gap: 0.5rem;\n width: 100%;\n height: 2.125rem;\n min-height: 2.125rem;\n border-color: var(--pk-color-slate-400) !important;\n border-radius: var(--pk-radius-lg) !important;\n background: transparent !important;\n background-color: transparent !important;\n text-align: left;\n font-weight: 400;\n line-height: 1.2;\n cursor: default;\n }\n\n :host([open]) .control {\n background: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n background-color: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n border-color: var(--pk-color-slate-400) !important;\n box-shadow: none;\n }\n\n :host(:not([disabled])) .control:hover:not(:disabled) {\n background: var(--pk-color-slate-50) !important;\n background-color: var(--pk-color-slate-50) !important;\n }\n\n :host(:not([disabled])[open]) .control:hover:not(:disabled),\n :host(:not([disabled])) .control:active:not(:disabled) {\n background: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n background-color: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n }\n\n :host(:not([invalid]):not(:state(user-invalid))) .control:focus-visible,\n :host(:not([invalid]):not(:state(user-invalid))[data-state='focus-visible']) .control {\n border-color: var(--pk-color-sky-600) !important;\n box-shadow: var(--pk-input-focus-shadow);\n }\n\n :host(:not([invalid]):not(:state(user-invalid))[open]) .control:focus-visible,\n :host(:not([invalid]):not(:state(user-invalid))[open][data-state='focus-visible']) .control {\n border-color: var(--pk-color-slate-400) !important;\n box-shadow: none;\n }\n\n :host([invalid]) .control,\n :host(:state(user-invalid)) .control {\n border-color: var(--pk-color-rose-600) !important;\n }\n\n :host([invalid]) .control:focus-visible,\n :host([invalid][data-state='focus-visible']) .control,\n :host(:state(user-invalid)) .control:focus-visible,\n :host(:state(user-invalid)[data-state='focus-visible']) .control {\n box-shadow: var(--pk-input-invalid-focus-shadow);\n }\n\n .control-start {\n color: var(--pk-color-gray-400);\n pointer-events: none;\n }\n\n .control-start svg {\n display: block;\n width: 14px;\n height: 14px;\n }\n\n .value {\n flex: 1;\n line-height: 1.2;\n color: inherit;\n }\n\n .value.is-placeholder {\n color: var(--pk-color-gray-400);\n }\n\n .icon {\n margin-inline-start: auto;\n color: var(--pk-color-gray-600);\n }\n\n .panel {\n min-width: 8rem;\n max-height: 15rem;\n }\n\n /* Editable-table cells: flush fill — must live here so !important beats the\n * standalone trigger chrome (external ::part cannot override it). */\n :host(.cell-pk-control) {\n display: block;\n width: 100%;\n min-width: 0;\n height: 100%;\n --pk-select-trigger-border-width: 0;\n --pk-select-item-min-height: 100%;\n --pk-select-item-padding-block: 0;\n }\n\n :host(.cell-pk-control) .control {\n width: 100%;\n height: 100% !important;\n min-height: 100% !important;\n border: 0 !important;\n border-radius: 0 !important;\n background: transparent !important;\n background-color: transparent !important;\n }\n\n :host(.cell-pk-control:not([disabled])) .control:hover:not(:disabled),\n :host(.cell-pk-control[open]) .control,\n :host(.cell-pk-control:not([disabled])[open]) .control:hover:not(:disabled),\n :host(.cell-pk-control:not([disabled])) .control:active:not(:disabled) {\n border-radius: 0 !important;\n }\n\n :host(.cell-pk-control:not([invalid]):not(:state(user-invalid))) .control:focus-visible,\n :host(.cell-pk-control:not([invalid]):not(:state(user-invalid))[data-state='focus-visible']) .control {\n border: 0 !important;\n box-shadow: inset 0 0 0 1px var(--pk-color-gray-200, #e5e7eb);\n }\n }\n`;\n","import { customElement } from 'lit/decorators.js';\n\nimport { createIconElement, clock } from '../../icons/index.js';\nimport { PkSelect } from '../select/pk-select.js';\n// Time picker seeds light-DOM options at connect — register the CE so getLabel() works.\nimport '../select/pk-option.js';\nimport { pkSelectStyles } from '../select/pk-select.styles.js';\nimport { generateTimeOptions } from '../../utils/time-options.js';\nimport { pkTimePickerStyles } from './pk-time-picker.styles.js';\n\n/**\n * Time picker — select wrapper with 30-minute increments and a clock icon.\n * Mirrors React `TimePicker` (not `pk-time-input`).\n *\n * @slot start - Overrides the default clock icon\n * @slot - Additional `pk-option` items append after the generated list\n *\n * @event input\n * @event change\n * @event pk-change - `detail.value`\n */\n@customElement('pk-time-picker')\nexport class PkTimePicker extends PkSelect {\n // Flatten — `pkSelectStyles` is already a CSSResult[].\n static override styles = [...pkSelectStyles, pkTimePickerStyles];\n\n private optionsSeeded = false;\n\n override connectedCallback(): void {\n this.ensureTimeOptions();\n this.ensureClockIcon();\n super.connectedCallback();\n }\n\n private ensureTimeOptions(): void {\n if (this.optionsSeeded || this.querySelector('pk-option')) {\n this.optionsSeeded = true;\n return;\n }\n\n for (const option of generateTimeOptions()) {\n const element = document.createElement('pk-option');\n element.value = option.value;\n element.textContent = option.label;\n this.append(element);\n }\n\n this.optionsSeeded = true;\n }\n\n private ensureClockIcon(): void {\n if (this.querySelector('[slot=\"start\"]')) {\n return;\n }\n\n const icon = createIconElement(clock);\n icon.setAttribute('slot', 'start');\n this.prepend(icon);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-time-picker': PkTimePicker;\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAI,mBAAwC;AAE5C,SAAS,2BAAgH;CACrH,MAAM,QAAS,WAEZ,OAAO;AAEV,QAAO;EACH,YAAY,OAAO,cAAc;EACjC,MAAM;GACF,IAAI,OAAO,MAAM,MAAM;GACvB,IAAI,OAAO,MAAM,MAAM;GAC1B;EACD,QAAQ,OAAO,UAAU,SAAS,gBAAgB,QAAQ;EAC7D;;;AAIL,SAAgB,sBAAoC;AAChD,KAAI,iBACA,QAAO;CAGX,MAAM,UAAwB,EAAE;CAChC,MAAM,EAAE,YAAY,MAAM,WAAW,0BAA0B;AAE/D,MAAK,IAAI,OAAO,GAAG,OAAO,IAAI,QAAQ,EAClC,MAAK,IAAI,SAAS,GAAG,SAAS,IAAI,UAAU,IAAI;EAC5C,MAAM,aAAa,GAAG,KAAK,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,SAAS,GAAG,IAAI;EAE5F,IAAI;AAEJ,MAAI,eAAe,SAAS;GACxB,IAAI,cAAc;AAElB,OAAI,SAAS,EACT,eAAc;YACP,OAAO,GACd,eAAc,OAAO;GAGzB,MAAM,OAAO,QAAQ,KAAK,KAAK,KAAK,KAAK;AACzC,iBAAc,GAAG,YAAY,GAAG,OAAO,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;aAC/D,eAAe,MACtB,eAAc;MAEd,gCAAc,IAAI,KAAK,cAAc,WAAW,KAAK,EAAC,mBAAmB,QAAQ;GAC7E,MAAM;GACN,QAAQ;GACR,QAAQ,WAAW,SAAS,IAAI;GACnC,CAAC;AAGN,UAAQ,KAAK;GACT,OAAO;GACP,OAAO;GACV,CAAC;;AAIV,oBAAmB;AAEnB,QAAO;;;;AC1EX,IAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACoB9B,IAAA,eAAA,MAAM,qBAAqB,SAAS;;;uBAIf;;;gBAFC,CAAC,GAAG,gBAAgB,mBAAmB;;CAIhE,oBAAmC;AAC/B,OAAK,mBAAmB;AACxB,OAAK,iBAAiB;AACtB,QAAM,mBAAmB;;CAG7B,oBAAkC;AAC9B,MAAI,KAAK,iBAAiB,KAAK,cAAc,YAAY,EAAE;AACvD,QAAK,gBAAgB;AACrB;;AAGJ,OAAK,MAAM,UAAU,qBAAqB,EAAE;GACxC,MAAM,UAAU,SAAS,cAAc,YAAY;AACnD,WAAQ,QAAQ,OAAO;AACvB,WAAQ,cAAc,OAAO;AAC7B,QAAK,OAAO,QAAQ;;AAGxB,OAAK,gBAAgB;;CAGzB,kBAAgC;AAC5B,MAAI,KAAK,cAAc,mBAAiB,CACpC;EAGJ,MAAM,OAAO,kBAAkB,cAAA,MAAM;AACrC,OAAK,aAAa,QAAQ,QAAQ;AAClC,OAAK,QAAQ,KAAK;;;2BApCzB,cAAc,iBAAiB,CAAA,EAAA,aAAA"}
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import { t as icons_exports } from "./icons-BR8JcQj2.js";
|
|
2
2
|
import { t as __decorate } from "./decorate-W02hmVTt.js";
|
|
3
|
+
import "./pk-button-QpDDlRbG.js";
|
|
3
4
|
import { t as PkFormAssociatedElement } from "./pk-form-associated-element-DmZKgNPL.js";
|
|
4
5
|
import { t as MirrorValidator } from "./mirror-validator-DCjNYrrx.js";
|
|
6
|
+
import "./pk-checkbox-Bavq3-9C.js";
|
|
5
7
|
import { t as formControlStyles } from "./form-control.styles-BQdimE5o.js";
|
|
6
8
|
import { n as renderIconHtml } from "./render-Dvc3MHQR.js";
|
|
7
9
|
import { i as uniqueId } from "./focus-aa5dlv8k.js";
|
|
10
|
+
import "./pk-input-naIRPWGC.js";
|
|
11
|
+
import "./pk-dialog-DZZd1Tzb.js";
|
|
12
|
+
import "./pk-dropdown-item-P3LLojCI.js";
|
|
13
|
+
import "./pk-dropdown-menu-CsX95MCP.js";
|
|
14
|
+
import "../components/dropdown-menu/pk-dropdown-separator.js";
|
|
15
|
+
import "./pk-field-Buy_AtYF.js";
|
|
16
|
+
import "./pk-tooltip-fcUbVGli.js";
|
|
8
17
|
import { i as createVariableTagDomNodeView, r as tiptapProseMirrorStyles } from "./tiptap.styles-BytOpP0H.js";
|
|
9
18
|
import { css, html, nothing } from "lit";
|
|
10
19
|
import { customElement, property, query, state } from "lit/decorators.js";
|
|
@@ -1081,4 +1090,4 @@ PkTiptapEditor = __decorate([customElement("pk-tiptap-editor")], PkTiptapEditor)
|
|
|
1081
1090
|
//#endregion
|
|
1082
1091
|
export { PkTiptapEditor as t };
|
|
1083
1092
|
|
|
1084
|
-
//# sourceMappingURL=pk-tiptap-editor-
|
|
1093
|
+
//# sourceMappingURL=pk-tiptap-editor-CdoutapZ.js.map
|