@krollins/blueprint 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion/accordion.d.ts +6 -1
- package/dist/components/accordion/accordion.d.ts.map +1 -1
- package/dist/components/accordion.js +30 -28
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert/alert.d.ts +6 -1
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert.js +9 -7
- package/dist/components/alert.js.map +1 -1
- package/dist/components/avatar/avatar.d.ts +6 -1
- package/dist/components/avatar/avatar.d.ts.map +1 -1
- package/dist/components/avatar.js +9 -7
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts +6 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb.js +25 -23
- package/dist/components/breadcrumb.js.map +1 -1
- package/dist/components/drawer/drawer.d.ts +6 -1
- package/dist/components/drawer/drawer.d.ts.map +1 -1
- package/dist/components/drawer.js +7 -5
- package/dist/components/drawer.js.map +1 -1
- package/dist/components/notification/notification.d.ts +6 -1
- package/dist/components/notification/notification.d.ts.map +1 -1
- package/dist/components/notification.js +7 -5
- package/dist/components/notification.js.map +1 -1
- package/dist/components/popover/popover.d.ts +2 -1
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/popover.js +8 -6
- package/dist/components/popover.js.map +1 -1
- package/dist/components/table/table.d.ts +6 -1
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/table.js +7 -5
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs/tabs.d.ts +6 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/components/tabs.js +7 -5
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tag/tag.d.ts +6 -1
- package/dist/components/tag/tag.d.ts.map +1 -1
- package/dist/components/tag.js +8 -6
- package/dist/components/tag.js.map +1 -1
- package/dist/components/tree/tree.d.ts +8 -2
- package/dist/components/tree/tree.d.ts.map +1 -1
- package/dist/components/tree.js +7 -5
- package/dist/components/tree.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.js","sources":["../../source/components/popover/popover.style.ts","../../source/components/popover/popover.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const popoverStyles = css`\n /* Base styles */\n :host {\n display: inline-block;\n position: relative;\n }\n\n .popover {\n position: relative;\n display: inline-block;\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-base);\n color: var(--bp-color-text);\n }\n\n /* Trigger */\n .popover__trigger {\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n outline: none;\n user-select: none;\n }\n\n .popover__trigger:hover {\n opacity: 0.8;\n }\n\n .popover__trigger:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n border-radius: var(--bp-border-radius-sm);\n }\n\n .popover--disabled .popover__trigger {\n cursor: not-allowed;\n opacity: var(--bp-opacity-disabled);\n }\n\n /* Panel base */\n .popover__panel {\n position: absolute;\n z-index: var(--bp-z-popover);\n min-width: 160px;\n max-width: 320px;\n max-height: calc(100vh - 80px);\n background-color: var(--bp-color-surface-elevated);\n border: var(--bp-border-width) solid var(--bp-color-border);\n border-radius: var(--bp-border-radius-lg);\n box-shadow: var(--bp-shadow-lg);\n opacity: 1;\n animation: popover-fade-in var(--bp-transition-fast) ease-out;\n }\n\n @keyframes popover-fade-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n /* Panel placements - Bottom */\n .popover__panel--bottom,\n .popover__panel--bottom-start,\n .popover__panel--bottom-end {\n top: 100%;\n margin-top: var(--popover-distance);\n }\n\n .popover__panel--bottom {\n left: 50%;\n transform: translateX(-50%);\n }\n\n .popover__panel--bottom-start {\n left: 0;\n }\n\n .popover__panel--bottom-end {\n right: 0;\n }\n\n /* Panel placements - Top */\n .popover__panel--top,\n .popover__panel--top-start,\n .popover__panel--top-end {\n bottom: 100%;\n margin-bottom: var(--popover-distance);\n }\n\n .popover__panel--top {\n left: 50%;\n transform: translateX(-50%);\n }\n\n .popover__panel--top-start {\n left: 0;\n }\n\n .popover__panel--top-end {\n right: 0;\n }\n\n /* Panel placements - Left */\n .popover__panel--left,\n .popover__panel--left-start,\n .popover__panel--left-end {\n right: 100%;\n margin-right: var(--popover-distance);\n }\n\n .popover__panel--left {\n top: 50%;\n transform: translateY(-50%);\n }\n\n .popover__panel--left-start {\n top: 0;\n }\n\n .popover__panel--left-end {\n bottom: 0;\n }\n\n /* Panel placements - Right */\n .popover__panel--right,\n .popover__panel--right-start,\n .popover__panel--right-end {\n left: 100%;\n margin-left: var(--popover-distance);\n }\n\n .popover__panel--right {\n top: 50%;\n transform: translateY(-50%);\n }\n\n .popover__panel--right-start {\n top: 0;\n }\n\n .popover__panel--right-end {\n bottom: 0;\n }\n\n /* Arrow */\n .popover__arrow {\n position: absolute;\n width: var(--bp-spacing-5);\n height: var(--bp-spacing-5);\n background-color: var(--bp-color-surface-elevated);\n border: var(--bp-border-width) solid var(--bp-color-border);\n transform: rotate(45deg);\n z-index: -1;\n }\n\n /* Arrow positions - bottom placements */\n .popover__panel--bottom .popover__arrow,\n .popover__panel--bottom-start .popover__arrow,\n .popover__panel--bottom-end .popover__arrow {\n top: calc(var(--bp-spacing-2) * -1);\n border-bottom: none;\n border-right: none;\n }\n\n .popover__panel--bottom .popover__arrow {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n }\n\n .popover__panel--bottom-start .popover__arrow {\n left: var(--bp-spacing-5);\n }\n\n .popover__panel--bottom-end .popover__arrow {\n right: var(--bp-spacing-5);\n }\n\n /* Arrow positions - top placements */\n .popover__panel--top .popover__arrow,\n .popover__panel--top-start .popover__arrow,\n .popover__panel--top-end .popover__arrow {\n bottom: calc(var(--bp-spacing-2) * -1);\n border-top: none;\n border-left: none;\n }\n\n .popover__panel--top .popover__arrow {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n }\n\n .popover__panel--top-start .popover__arrow {\n left: var(--bp-spacing-5);\n }\n\n .popover__panel--top-end .popover__arrow {\n right: var(--bp-spacing-5);\n }\n\n /* Arrow positions - left placements */\n .popover__panel--left .popover__arrow,\n .popover__panel--left-start .popover__arrow,\n .popover__panel--left-end .popover__arrow {\n right: calc(var(--bp-spacing-2) * -1);\n border-left: none;\n border-bottom: none;\n }\n\n .popover__panel--left .popover__arrow {\n top: 50%;\n transform: translateY(-50%) rotate(45deg);\n }\n\n .popover__panel--left-start .popover__arrow {\n top: var(--bp-spacing-5);\n }\n\n .popover__panel--left-end .popover__arrow {\n bottom: var(--bp-spacing-5);\n }\n\n /* Arrow positions - right placements */\n .popover__panel--right .popover__arrow,\n .popover__panel--right-start .popover__arrow,\n .popover__panel--right-end .popover__arrow {\n left: calc(var(--bp-spacing-2) * -1);\n border-right: none;\n border-top: none;\n }\n\n .popover__panel--right .popover__arrow {\n top: 50%;\n transform: translateY(-50%) rotate(45deg);\n }\n\n .popover__panel--right-start .popover__arrow {\n top: var(--bp-spacing-5);\n }\n\n .popover__panel--right-end .popover__arrow {\n bottom: var(--bp-spacing-5);\n }\n\n /* Header */\n .popover__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--bp-spacing-4);\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n .popover__header ::slotted(*) {\n margin: 0;\n font-size: var(--bp-font-size-base);\n font-weight: var(--bp-font-weight-semibold);\n color: var(--bp-color-text-strong);\n }\n\n /* Body */\n .popover__body {\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n overflow-y: auto;\n max-height: calc(100vh - 160px);\n }\n\n /* Footer */\n .popover__footer {\n display: flex;\n align-items: center;\n gap: var(--bp-spacing-4);\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n border-top: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n /* Close button */\n .popover__close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n padding: 0;\n margin-left: auto;\n background: transparent;\n border: none;\n border-radius: var(--bp-border-radius-sm);\n color: var(--bp-color-text-muted);\n cursor: pointer;\n transition:\n background-color var(--bp-transition-fast),\n color var(--bp-transition-fast),\n transform var(--bp-transition-fast);\n }\n\n .popover__close:hover {\n background-color: var(--bp-color-surface-subdued);\n color: var(--bp-color-text);\n }\n\n .popover__close:active {\n background-color: var(--bp-color-surface-pressed);\n transform: translateY(1px);\n }\n\n .popover__close:focus {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n .popover__close:focus:not(:focus-visible) {\n outline: none;\n }\n\n .popover__close:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n .popover__close bp-icon {\n width: var(--bp-spacing-4);\n height: var(--bp-spacing-4);\n }\n\n /* Reduced motion */\n @media (prefers-reduced-motion: reduce) {\n .popover__panel {\n animation: none;\n }\n\n .popover__close {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { popoverStyles } from './popover.style.js';\nimport { booleanConverter } from '../../utilities/boolean-converter.js';\nimport { closeSvg } from '../icon/icons/entries/close.js';\nimport '../icon/icon.js';\n\nexport type PopoverPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end';\n\nexport type PopoverTrigger = 'click' | 'hover' | 'focus' | 'manual';\n\n/**\n * A popover component that displays rich content in a floating panel.\n * Supports multiple trigger modes: click, hover, focus, or manual control.\n *\n * @fires bp-show - Fired when the popover opens\n * @fires bp-hide - Fired when the popover closes\n * @fires bp-after-show - Fired after the popover open animation completes\n * @fires bp-after-hide - Fired after the popover close animation completes\n *\n * @slot - The trigger element that controls the popover\n * @slot content - The rich content to display in the popover panel\n * @slot header - Optional header content for the popover\n * @slot footer - Optional footer content for the popover\n *\n * @csspart trigger - The trigger wrapper element\n * @csspart panel - The popover panel container\n * @csspart header - The header section\n * @csspart body - The body/content section\n * @csspart footer - The footer section\n * @csspart arrow - The arrow pointing to the trigger\n * @csspart close-button - The close button (when showClose is true)\n */\n@customElement('bp-popover')\nexport class BpPopover extends LitElement {\n /** Whether the popover is currently open */\n @property({ type: Boolean, reflect: true }) declare open: boolean;\n\n /** Placement of the popover relative to the trigger */\n @property({\n type: String,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null): PopoverPlacement => {\n const validPlacements: PopoverPlacement[] = [\n 'top',\n 'top-start',\n 'top-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n ];\n return validPlacements.includes(value as PopoverPlacement)\n ? (value as PopoverPlacement)\n : 'bottom';\n },\n },\n })\n declare placement: PopoverPlacement;\n\n /** How the popover is triggered */\n @property({\n type: String,\n converter: {\n fromAttribute: (value: string | null): PopoverTrigger => {\n const validTriggers: PopoverTrigger[] = [\n 'click',\n 'hover',\n 'focus',\n 'manual',\n ];\n return validTriggers.includes(value as PopoverTrigger)\n ? (value as PopoverTrigger)\n : 'click';\n },\n },\n })\n declare trigger: PopoverTrigger;\n\n /** Whether to show an arrow pointing to the trigger */\n @property({ type: Boolean }) declare arrow: boolean;\n\n /** Whether to show a close button in the popover */\n @property({ type: Boolean, attribute: 'show-close' })\n declare showClose: boolean;\n\n /** Whether clicking outside closes the popover */\n @property({\n converter: booleanConverter,\n attribute: 'close-on-outside-click',\n reflect: true,\n })\n declare closeOnOutsideClick: boolean;\n\n /** Whether pressing Escape closes the popover */\n @property({\n converter: booleanConverter,\n attribute: 'close-on-escape',\n reflect: true,\n })\n declare closeOnEscape: boolean;\n\n /** Distance in pixels between the trigger and the panel */\n @property({ type: Number }) declare distance: number;\n\n /** Delay in milliseconds before showing (for hover trigger) */\n @property({ type: Number, attribute: 'show-delay' })\n declare showDelay: number;\n\n /** Delay in milliseconds before hiding (for hover trigger) */\n @property({ type: Number, attribute: 'hide-delay' })\n declare hideDelay: number;\n\n /** Whether the popover is disabled */\n @property({ type: Boolean }) declare disabled: boolean;\n\n /** Accessible label for the popover panel */\n @property({ type: String }) declare label: string;\n\n /** Whether the popover has header slot content */\n @state() private hasHeader = false;\n\n /** Whether the popover has footer slot content */\n @state() private hasFooter = false;\n\n @query('.popover__trigger') private triggerElement!: HTMLElement;\n\n private showTimeout: number | null = null;\n private hideTimeout: number | null = null;\n private popoverId = `popover-${Math.random().toString(36).substring(2, 11)}`;\n\n static styles = [popoverStyles];\n\n constructor() {\n super();\n this.open = false;\n this.placement = 'bottom';\n this.trigger = 'click';\n this.arrow = false;\n this.showClose = false;\n this.closeOnOutsideClick = true;\n this.closeOnEscape = true;\n this.distance = 8;\n this.showDelay = 200;\n this.hideDelay = 200;\n this.disabled = false;\n this.label = '';\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('click', this.handleDocumentClick, {\n passive: true,\n });\n document.addEventListener('keydown', this.handleDocumentKeydown);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('click', this.handleDocumentClick, {\n passive: true,\n } as EventListenerOptions);\n document.removeEventListener('keydown', this.handleDocumentKeydown);\n this.clearTimeouts();\n }\n\n /** Show the popover */\n show(): void {\n if (this.disabled || this.open) return;\n\n this.clearTimeouts();\n this.open = true;\n\n this.dispatchEvent(\n new CustomEvent('bp-show', { bubbles: true, composed: true })\n );\n\n this.updateComplete.then(() => {\n this.dispatchEvent(\n new CustomEvent('bp-after-show', { bubbles: true, composed: true })\n );\n });\n }\n\n /** Hide the popover */\n hide(): void {\n if (!this.open) return;\n\n this.clearTimeouts();\n this.open = false;\n\n this.dispatchEvent(\n new CustomEvent('bp-hide', { bubbles: true, composed: true })\n );\n\n this.updateComplete.then(() => {\n this.dispatchEvent(\n new CustomEvent('bp-after-hide', { bubbles: true, composed: true })\n );\n });\n }\n\n /** Toggle the popover open/closed */\n toggle(): void {\n if (this.open) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * Clears any pending show/hide timeout operations.\n * Prevents race conditions with rapid trigger interactions.\n */\n private clearTimeouts(): void {\n if (this.showTimeout !== null) {\n window.clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n if (this.hideTimeout !== null) {\n window.clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n }\n\n /**\n * Handles click events on the trigger element.\n * Toggles popover state for click trigger mode.\n * @param event - The mouse click event\n */\n private handleTriggerClick = (event: MouseEvent): void => {\n if (this.disabled || this.trigger !== 'click') return;\n event.stopPropagation();\n this.toggle();\n };\n\n /**\n * Handles keyboard events on the trigger element.\n * Toggles popover on Enter or Space key for click trigger mode.\n * @param event - The keyboard event\n */\n private handleTriggerKeydown = (event: KeyboardEvent): void => {\n if (this.disabled) return;\n\n if (\n this.trigger === 'click' &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n event.preventDefault();\n this.toggle();\n }\n };\n\n /**\n * Handles mouse enter events on the trigger element.\n * Starts the show delay timer for hover trigger mode.\n */\n private handleTriggerMouseEnter = (): void => {\n if (this.disabled || this.trigger !== 'hover') return;\n\n this.clearTimeouts();\n this.showTimeout = window.setTimeout(() => {\n this.show();\n }, this.showDelay);\n };\n\n /**\n * Handles mouse leave events on the trigger element.\n * Starts the hide delay timer for hover trigger mode.\n */\n private handleTriggerMouseLeave = (): void => {\n if (this.trigger !== 'hover') return;\n\n this.clearTimeouts();\n this.hideTimeout = window.setTimeout(() => {\n this.hide();\n }, this.hideDelay);\n };\n\n /**\n * Handles mouse enter events on the popover panel.\n * Prevents the popover from hiding when hovering over panel content in hover trigger mode.\n */\n private handlePanelMouseEnter = (): void => {\n if (this.trigger !== 'hover') return;\n this.clearTimeouts();\n };\n\n /**\n * Handles mouse leave events on the popover panel.\n * Starts the hide delay timer when leaving panel in hover trigger mode.\n */\n private handlePanelMouseLeave = (): void => {\n if (this.trigger !== 'hover') return;\n\n this.clearTimeouts();\n this.hideTimeout = window.setTimeout(() => {\n this.hide();\n }, this.hideDelay);\n };\n\n /**\n * Handles focus events on the trigger element.\n * Shows popover immediately for focus trigger mode.\n */\n private handleTriggerFocus = (): void => {\n if (this.disabled || this.trigger !== 'focus') return;\n this.show();\n };\n\n /**\n * Handles blur events on the trigger element.\n * Hides popover immediately for focus trigger mode.\n */\n private handleTriggerBlur = (): void => {\n if (this.trigger !== 'focus') return;\n this.hide();\n };\n\n /**\n * Handles click events on the document.\n * Closes popover when clicking outside if closeOnOutsideClick is true.\n * @param event - The mouse click event\n */\n private handleDocumentClick = (event: MouseEvent): void => {\n if (!this.closeOnOutsideClick || !this.open) return;\n if (this.trigger === 'manual') return;\n\n const path = event.composedPath();\n if (!path.includes(this)) {\n this.hide();\n }\n };\n\n /**\n * Handles keyboard events on the document.\n * Closes popover on Escape key if closeOnEscape is true and returns focus to trigger.\n * @param event - The keyboard event\n */\n private handleDocumentKeydown = (event: KeyboardEvent): void => {\n if (!this.closeOnEscape || !this.open) return;\n\n if (event.key === 'Escape') {\n event.preventDefault();\n this.hide();\n this.triggerElement?.focus();\n }\n };\n\n /**\n * Handles click events on the close button.\n * Closes the popover immediately.\n */\n private handleCloseClick = (): void => {\n this.hide();\n };\n\n /**\n * Handles changes to the header slot.\n * Updates internal state to conditionally render header wrapper.\n * @param event - The slotchange event\n */\n private handleHeaderSlotChange = (event: Event): void => {\n const slot = event.target as HTMLElement & {\n assignedNodes: (options?: { flatten?: boolean }) => Node[];\n };\n this.hasHeader = slot.assignedNodes({ flatten: true }).length > 0;\n };\n\n /**\n * Handles changes to the footer slot.\n * Updates internal state to conditionally render footer wrapper.\n * @param event - The slotchange event\n */\n private handleFooterSlotChange = (event: Event): void => {\n const slot = event.target as HTMLElement & {\n assignedNodes: (options?: { flatten?: boolean }) => Node[];\n };\n this.hasFooter = slot.assignedNodes({ flatten: true }).length > 0;\n };\n\n render() {\n return html`\n <div\n class=\"popover ${this.open ? 'popover--open' : ''} ${this.disabled\n ? 'popover--disabled'\n : ''}\"\n >\n <div\n class=\"popover__trigger\"\n part=\"trigger\"\n tabindex=${this.disabled ? -1 : 0}\n role=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded=${this.open}\n aria-controls=${this.open ? this.popoverId : nothing}\n aria-disabled=${this.disabled}\n @click=${this.handleTriggerClick}\n @keydown=${this.handleTriggerKeydown}\n @mouseenter=${this.handleTriggerMouseEnter}\n @mouseleave=${this.handleTriggerMouseLeave}\n @focus=${this.handleTriggerFocus}\n @blur=${this.handleTriggerBlur}\n >\n <slot></slot>\n </div>\n ${this.open\n ? html`\n <div\n id=${this.popoverId}\n class=\"popover__panel popover__panel--${this.placement}\"\n part=\"panel\"\n role=\"dialog\"\n aria-label=${this.label || nothing}\n aria-modal=\"false\"\n style=\"--popover-distance: ${this.distance}px;\"\n @mouseenter=${this.handlePanelMouseEnter}\n @mouseleave=${this.handlePanelMouseLeave}\n >\n ${this.arrow\n ? html`<div class=\"popover__arrow\" part=\"arrow\"></div>`\n : nothing}\n ${this.hasHeader || this.showClose\n ? html`\n <div class=\"popover__header\" part=\"header\">\n <slot\n name=\"header\"\n @slotchange=${this.handleHeaderSlotChange}\n ></slot>\n ${this.showClose\n ? html`\n <button\n class=\"popover__close\"\n part=\"close-button\"\n type=\"button\"\n aria-label=\"Close popover\"\n @click=${this.handleCloseClick}\n >\n <bp-icon .svg=${closeSvg} size=\"sm\"></bp-icon>\n </button>\n `\n : nothing}\n </div>\n `\n : html`<slot\n name=\"header\"\n @slotchange=${this.handleHeaderSlotChange}\n ></slot>`}\n <div class=\"popover__body\" part=\"body\">\n <slot name=\"content\"></slot>\n </div>\n ${this.hasFooter\n ? html`\n <div class=\"popover__footer\" part=\"footer\">\n <slot\n name=\"footer\"\n @slotchange=${this.handleFooterSlotChange}\n ></slot>\n </div>\n `\n : html`<slot\n name=\"footer\"\n @slotchange=${this.handleFooterSlotChange}\n ></slot>`}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'bp-popover': BpPopover;\n }\n}\n"],"names":["popoverStyles","css","BpPopover","LitElement","event","slot","html","nothing","closeSvg","__decorateClass","property","value","booleanConverter","state","query","customElement"],"mappings":";;;;AAEO,MAAMA,IAAgBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}
|
|
1
|
+
{"version":3,"file":"popover.js","sources":["../../source/components/popover/popover.style.ts","../../source/components/popover/popover.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const popoverStyles = css`\n /* Base styles */\n :host {\n display: inline-block;\n position: relative;\n }\n\n .popover {\n position: relative;\n display: inline-block;\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-base);\n color: var(--bp-color-text);\n }\n\n /* Trigger */\n .popover__trigger {\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n outline: none;\n user-select: none;\n }\n\n .popover__trigger:hover {\n opacity: 0.8;\n }\n\n .popover__trigger:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n border-radius: var(--bp-border-radius-sm);\n }\n\n .popover--disabled .popover__trigger {\n cursor: not-allowed;\n opacity: var(--bp-opacity-disabled);\n }\n\n /* Panel base */\n .popover__panel {\n position: absolute;\n z-index: var(--bp-z-popover);\n min-width: 160px;\n max-width: 320px;\n max-height: calc(100vh - 80px);\n background-color: var(--bp-color-surface-elevated);\n border: var(--bp-border-width) solid var(--bp-color-border);\n border-radius: var(--bp-border-radius-lg);\n box-shadow: var(--bp-shadow-lg);\n opacity: 1;\n animation: popover-fade-in var(--bp-transition-fast) ease-out;\n }\n\n @keyframes popover-fade-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n /* Panel placements - Bottom */\n .popover__panel--bottom,\n .popover__panel--bottom-start,\n .popover__panel--bottom-end {\n top: 100%;\n margin-top: var(--popover-distance);\n }\n\n .popover__panel--bottom {\n left: 50%;\n transform: translateX(-50%);\n }\n\n .popover__panel--bottom-start {\n left: 0;\n }\n\n .popover__panel--bottom-end {\n right: 0;\n }\n\n /* Panel placements - Top */\n .popover__panel--top,\n .popover__panel--top-start,\n .popover__panel--top-end {\n bottom: 100%;\n margin-bottom: var(--popover-distance);\n }\n\n .popover__panel--top {\n left: 50%;\n transform: translateX(-50%);\n }\n\n .popover__panel--top-start {\n left: 0;\n }\n\n .popover__panel--top-end {\n right: 0;\n }\n\n /* Panel placements - Left */\n .popover__panel--left,\n .popover__panel--left-start,\n .popover__panel--left-end {\n right: 100%;\n margin-right: var(--popover-distance);\n }\n\n .popover__panel--left {\n top: 50%;\n transform: translateY(-50%);\n }\n\n .popover__panel--left-start {\n top: 0;\n }\n\n .popover__panel--left-end {\n bottom: 0;\n }\n\n /* Panel placements - Right */\n .popover__panel--right,\n .popover__panel--right-start,\n .popover__panel--right-end {\n left: 100%;\n margin-left: var(--popover-distance);\n }\n\n .popover__panel--right {\n top: 50%;\n transform: translateY(-50%);\n }\n\n .popover__panel--right-start {\n top: 0;\n }\n\n .popover__panel--right-end {\n bottom: 0;\n }\n\n /* Arrow */\n .popover__arrow {\n position: absolute;\n width: var(--bp-spacing-5);\n height: var(--bp-spacing-5);\n background-color: var(--bp-color-surface-elevated);\n border: var(--bp-border-width) solid var(--bp-color-border);\n transform: rotate(45deg);\n z-index: -1;\n }\n\n /* Arrow positions - bottom placements */\n .popover__panel--bottom .popover__arrow,\n .popover__panel--bottom-start .popover__arrow,\n .popover__panel--bottom-end .popover__arrow {\n top: calc(var(--bp-spacing-2) * -1);\n border-bottom: none;\n border-right: none;\n }\n\n .popover__panel--bottom .popover__arrow {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n }\n\n .popover__panel--bottom-start .popover__arrow {\n left: var(--bp-spacing-5);\n }\n\n .popover__panel--bottom-end .popover__arrow {\n right: var(--bp-spacing-5);\n }\n\n /* Arrow positions - top placements */\n .popover__panel--top .popover__arrow,\n .popover__panel--top-start .popover__arrow,\n .popover__panel--top-end .popover__arrow {\n bottom: calc(var(--bp-spacing-2) * -1);\n border-top: none;\n border-left: none;\n }\n\n .popover__panel--top .popover__arrow {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n }\n\n .popover__panel--top-start .popover__arrow {\n left: var(--bp-spacing-5);\n }\n\n .popover__panel--top-end .popover__arrow {\n right: var(--bp-spacing-5);\n }\n\n /* Arrow positions - left placements */\n .popover__panel--left .popover__arrow,\n .popover__panel--left-start .popover__arrow,\n .popover__panel--left-end .popover__arrow {\n right: calc(var(--bp-spacing-2) * -1);\n border-left: none;\n border-bottom: none;\n }\n\n .popover__panel--left .popover__arrow {\n top: 50%;\n transform: translateY(-50%) rotate(45deg);\n }\n\n .popover__panel--left-start .popover__arrow {\n top: var(--bp-spacing-5);\n }\n\n .popover__panel--left-end .popover__arrow {\n bottom: var(--bp-spacing-5);\n }\n\n /* Arrow positions - right placements */\n .popover__panel--right .popover__arrow,\n .popover__panel--right-start .popover__arrow,\n .popover__panel--right-end .popover__arrow {\n left: calc(var(--bp-spacing-2) * -1);\n border-right: none;\n border-top: none;\n }\n\n .popover__panel--right .popover__arrow {\n top: 50%;\n transform: translateY(-50%) rotate(45deg);\n }\n\n .popover__panel--right-start .popover__arrow {\n top: var(--bp-spacing-5);\n }\n\n .popover__panel--right-end .popover__arrow {\n bottom: var(--bp-spacing-5);\n }\n\n /* Header */\n .popover__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--bp-spacing-4);\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n .popover__header ::slotted(*) {\n margin: 0;\n font-size: var(--bp-font-size-base);\n font-weight: var(--bp-font-weight-semibold);\n color: var(--bp-color-text-strong);\n }\n\n /* Body */\n .popover__body {\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n overflow-y: auto;\n max-height: calc(100vh - 160px);\n }\n\n /* Footer */\n .popover__footer {\n display: flex;\n align-items: center;\n gap: var(--bp-spacing-4);\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n border-top: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n /* Close button */\n .popover__close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n padding: 0;\n margin-left: auto;\n background: transparent;\n border: none;\n border-radius: var(--bp-border-radius-sm);\n color: var(--bp-color-text-muted);\n cursor: pointer;\n transition:\n background-color var(--bp-transition-fast),\n color var(--bp-transition-fast),\n transform var(--bp-transition-fast);\n }\n\n .popover__close:hover {\n background-color: var(--bp-color-surface-subdued);\n color: var(--bp-color-text);\n }\n\n .popover__close:active {\n background-color: var(--bp-color-surface-pressed);\n transform: translateY(1px);\n }\n\n .popover__close:focus {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n .popover__close:focus:not(:focus-visible) {\n outline: none;\n }\n\n .popover__close:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n .popover__close bp-icon {\n width: var(--bp-spacing-4);\n height: var(--bp-spacing-4);\n }\n\n /* Reduced motion */\n @media (prefers-reduced-motion: reduce) {\n .popover__panel {\n animation: none;\n }\n\n .popover__close {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { popoverStyles } from './popover.style.js';\nimport { booleanConverter } from '../../utilities/boolean-converter.js';\nimport { closeSvg } from '../icon/icons/entries/close.js';\nimport { BpIcon } from '../icon/icon.js';\n\nexport type PopoverPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end';\n\nexport type PopoverTrigger = 'click' | 'hover' | 'focus' | 'manual';\n\n/**\n * A popover component that displays rich content in a floating panel.\n * Supports multiple trigger modes: click, hover, focus, or manual control.\n *\n * @fires bp-show - Fired when the popover opens\n * @fires bp-hide - Fired when the popover closes\n * @fires bp-after-show - Fired after the popover open animation completes\n * @fires bp-after-hide - Fired after the popover close animation completes\n *\n * @slot - The trigger element that controls the popover\n * @slot content - The rich content to display in the popover panel\n * @slot header - Optional header content for the popover\n * @slot footer - Optional footer content for the popover\n *\n * @csspart trigger - The trigger wrapper element\n * @csspart panel - The popover panel container\n * @csspart header - The header section\n * @csspart body - The body/content section\n * @csspart footer - The footer section\n * @csspart arrow - The arrow pointing to the trigger\n * @csspart close-button - The close button (when showClose is true)\n */\n@customElement('bp-popover')\nexport class BpPopover extends LitElement { /**\n * Child components that self-register as custom elements on import.\n * Value imports prevent bundler tree-shaking of the registration side effect.\n */\n static dependencies = [BpIcon];\n /** Whether the popover is currently open */\n @property({ type: Boolean, reflect: true }) declare open: boolean;\n\n /** Placement of the popover relative to the trigger */\n @property({\n type: String,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null): PopoverPlacement => {\n const validPlacements: PopoverPlacement[] = [\n 'top',\n 'top-start',\n 'top-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n ];\n return validPlacements.includes(value as PopoverPlacement)\n ? (value as PopoverPlacement)\n : 'bottom';\n },\n },\n })\n declare placement: PopoverPlacement;\n\n /** How the popover is triggered */\n @property({\n type: String,\n converter: {\n fromAttribute: (value: string | null): PopoverTrigger => {\n const validTriggers: PopoverTrigger[] = [\n 'click',\n 'hover',\n 'focus',\n 'manual',\n ];\n return validTriggers.includes(value as PopoverTrigger)\n ? (value as PopoverTrigger)\n : 'click';\n },\n },\n })\n declare trigger: PopoverTrigger;\n\n /** Whether to show an arrow pointing to the trigger */\n @property({ type: Boolean }) declare arrow: boolean;\n\n /** Whether to show a close button in the popover */\n @property({ type: Boolean, attribute: 'show-close' })\n declare showClose: boolean;\n\n /** Whether clicking outside closes the popover */\n @property({\n converter: booleanConverter,\n attribute: 'close-on-outside-click',\n reflect: true,\n })\n declare closeOnOutsideClick: boolean;\n\n /** Whether pressing Escape closes the popover */\n @property({\n converter: booleanConverter,\n attribute: 'close-on-escape',\n reflect: true,\n })\n declare closeOnEscape: boolean;\n\n /** Distance in pixels between the trigger and the panel */\n @property({ type: Number }) declare distance: number;\n\n /** Delay in milliseconds before showing (for hover trigger) */\n @property({ type: Number, attribute: 'show-delay' })\n declare showDelay: number;\n\n /** Delay in milliseconds before hiding (for hover trigger) */\n @property({ type: Number, attribute: 'hide-delay' })\n declare hideDelay: number;\n\n /** Whether the popover is disabled */\n @property({ type: Boolean }) declare disabled: boolean;\n\n /** Accessible label for the popover panel */\n @property({ type: String }) declare label: string;\n\n /** Whether the popover has header slot content */\n @state() private hasHeader = false;\n\n /** Whether the popover has footer slot content */\n @state() private hasFooter = false;\n\n @query('.popover__trigger') private triggerElement!: HTMLElement;\n\n private showTimeout: number | null = null;\n private hideTimeout: number | null = null;\n private popoverId = `popover-${Math.random().toString(36).substring(2, 11)}`;\n\n static styles = [popoverStyles];\n\n constructor() {\n super();\n this.open = false;\n this.placement = 'bottom';\n this.trigger = 'click';\n this.arrow = false;\n this.showClose = false;\n this.closeOnOutsideClick = true;\n this.closeOnEscape = true;\n this.distance = 8;\n this.showDelay = 200;\n this.hideDelay = 200;\n this.disabled = false;\n this.label = '';\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('click', this.handleDocumentClick, {\n passive: true,\n });\n document.addEventListener('keydown', this.handleDocumentKeydown);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('click', this.handleDocumentClick, {\n passive: true,\n } as EventListenerOptions);\n document.removeEventListener('keydown', this.handleDocumentKeydown);\n this.clearTimeouts();\n }\n\n /** Show the popover */\n show(): void {\n if (this.disabled || this.open) return;\n\n this.clearTimeouts();\n this.open = true;\n\n this.dispatchEvent(\n new CustomEvent('bp-show', { bubbles: true, composed: true })\n );\n\n this.updateComplete.then(() => {\n this.dispatchEvent(\n new CustomEvent('bp-after-show', { bubbles: true, composed: true })\n );\n });\n }\n\n /** Hide the popover */\n hide(): void {\n if (!this.open) return;\n\n this.clearTimeouts();\n this.open = false;\n\n this.dispatchEvent(\n new CustomEvent('bp-hide', { bubbles: true, composed: true })\n );\n\n this.updateComplete.then(() => {\n this.dispatchEvent(\n new CustomEvent('bp-after-hide', { bubbles: true, composed: true })\n );\n });\n }\n\n /** Toggle the popover open/closed */\n toggle(): void {\n if (this.open) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * Clears any pending show/hide timeout operations.\n * Prevents race conditions with rapid trigger interactions.\n */\n private clearTimeouts(): void {\n if (this.showTimeout !== null) {\n window.clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n if (this.hideTimeout !== null) {\n window.clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n }\n\n /**\n * Handles click events on the trigger element.\n * Toggles popover state for click trigger mode.\n * @param event - The mouse click event\n */\n private handleTriggerClick = (event: MouseEvent): void => {\n if (this.disabled || this.trigger !== 'click') return;\n event.stopPropagation();\n this.toggle();\n };\n\n /**\n * Handles keyboard events on the trigger element.\n * Toggles popover on Enter or Space key for click trigger mode.\n * @param event - The keyboard event\n */\n private handleTriggerKeydown = (event: KeyboardEvent): void => {\n if (this.disabled) return;\n\n if (\n this.trigger === 'click' &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n event.preventDefault();\n this.toggle();\n }\n };\n\n /**\n * Handles mouse enter events on the trigger element.\n * Starts the show delay timer for hover trigger mode.\n */\n private handleTriggerMouseEnter = (): void => {\n if (this.disabled || this.trigger !== 'hover') return;\n\n this.clearTimeouts();\n this.showTimeout = window.setTimeout(() => {\n this.show();\n }, this.showDelay);\n };\n\n /**\n * Handles mouse leave events on the trigger element.\n * Starts the hide delay timer for hover trigger mode.\n */\n private handleTriggerMouseLeave = (): void => {\n if (this.trigger !== 'hover') return;\n\n this.clearTimeouts();\n this.hideTimeout = window.setTimeout(() => {\n this.hide();\n }, this.hideDelay);\n };\n\n /**\n * Handles mouse enter events on the popover panel.\n * Prevents the popover from hiding when hovering over panel content in hover trigger mode.\n */\n private handlePanelMouseEnter = (): void => {\n if (this.trigger !== 'hover') return;\n this.clearTimeouts();\n };\n\n /**\n * Handles mouse leave events on the popover panel.\n * Starts the hide delay timer when leaving panel in hover trigger mode.\n */\n private handlePanelMouseLeave = (): void => {\n if (this.trigger !== 'hover') return;\n\n this.clearTimeouts();\n this.hideTimeout = window.setTimeout(() => {\n this.hide();\n }, this.hideDelay);\n };\n\n /**\n * Handles focus events on the trigger element.\n * Shows popover immediately for focus trigger mode.\n */\n private handleTriggerFocus = (): void => {\n if (this.disabled || this.trigger !== 'focus') return;\n this.show();\n };\n\n /**\n * Handles blur events on the trigger element.\n * Hides popover immediately for focus trigger mode.\n */\n private handleTriggerBlur = (): void => {\n if (this.trigger !== 'focus') return;\n this.hide();\n };\n\n /**\n * Handles click events on the document.\n * Closes popover when clicking outside if closeOnOutsideClick is true.\n * @param event - The mouse click event\n */\n private handleDocumentClick = (event: MouseEvent): void => {\n if (!this.closeOnOutsideClick || !this.open) return;\n if (this.trigger === 'manual') return;\n\n const path = event.composedPath();\n if (!path.includes(this)) {\n this.hide();\n }\n };\n\n /**\n * Handles keyboard events on the document.\n * Closes popover on Escape key if closeOnEscape is true and returns focus to trigger.\n * @param event - The keyboard event\n */\n private handleDocumentKeydown = (event: KeyboardEvent): void => {\n if (!this.closeOnEscape || !this.open) return;\n\n if (event.key === 'Escape') {\n event.preventDefault();\n this.hide();\n this.triggerElement?.focus();\n }\n };\n\n /**\n * Handles click events on the close button.\n * Closes the popover immediately.\n */\n private handleCloseClick = (): void => {\n this.hide();\n };\n\n /**\n * Handles changes to the header slot.\n * Updates internal state to conditionally render header wrapper.\n * @param event - The slotchange event\n */\n private handleHeaderSlotChange = (event: Event): void => {\n const slot = event.target as HTMLElement & {\n assignedNodes: (options?: { flatten?: boolean }) => Node[];\n };\n this.hasHeader = slot.assignedNodes({ flatten: true }).length > 0;\n };\n\n /**\n * Handles changes to the footer slot.\n * Updates internal state to conditionally render footer wrapper.\n * @param event - The slotchange event\n */\n private handleFooterSlotChange = (event: Event): void => {\n const slot = event.target as HTMLElement & {\n assignedNodes: (options?: { flatten?: boolean }) => Node[];\n };\n this.hasFooter = slot.assignedNodes({ flatten: true }).length > 0;\n };\n\n render() {\n return html`\n <div\n class=\"popover ${this.open ? 'popover--open' : ''} ${this.disabled\n ? 'popover--disabled'\n : ''}\"\n >\n <div\n class=\"popover__trigger\"\n part=\"trigger\"\n tabindex=${this.disabled ? -1 : 0}\n role=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded=${this.open}\n aria-controls=${this.open ? this.popoverId : nothing}\n aria-disabled=${this.disabled}\n @click=${this.handleTriggerClick}\n @keydown=${this.handleTriggerKeydown}\n @mouseenter=${this.handleTriggerMouseEnter}\n @mouseleave=${this.handleTriggerMouseLeave}\n @focus=${this.handleTriggerFocus}\n @blur=${this.handleTriggerBlur}\n >\n <slot></slot>\n </div>\n ${this.open\n ? html`\n <div\n id=${this.popoverId}\n class=\"popover__panel popover__panel--${this.placement}\"\n part=\"panel\"\n role=\"dialog\"\n aria-label=${this.label || nothing}\n aria-modal=\"false\"\n style=\"--popover-distance: ${this.distance}px;\"\n @mouseenter=${this.handlePanelMouseEnter}\n @mouseleave=${this.handlePanelMouseLeave}\n >\n ${this.arrow\n ? html`<div class=\"popover__arrow\" part=\"arrow\"></div>`\n : nothing}\n ${this.hasHeader || this.showClose\n ? html`\n <div class=\"popover__header\" part=\"header\">\n <slot\n name=\"header\"\n @slotchange=${this.handleHeaderSlotChange}\n ></slot>\n ${this.showClose\n ? html`\n <button\n class=\"popover__close\"\n part=\"close-button\"\n type=\"button\"\n aria-label=\"Close popover\"\n @click=${this.handleCloseClick}\n >\n <bp-icon .svg=${closeSvg} size=\"sm\"></bp-icon>\n </button>\n `\n : nothing}\n </div>\n `\n : html`<slot\n name=\"header\"\n @slotchange=${this.handleHeaderSlotChange}\n ></slot>`}\n <div class=\"popover__body\" part=\"body\">\n <slot name=\"content\"></slot>\n </div>\n ${this.hasFooter\n ? html`\n <div class=\"popover__footer\" part=\"footer\">\n <slot\n name=\"footer\"\n @slotchange=${this.handleFooterSlotChange}\n ></slot>\n </div>\n `\n : html`<slot\n name=\"footer\"\n @slotchange=${this.handleFooterSlotChange}\n ></slot>`}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'bp-popover': BpPopover;\n }\n}\n"],"names":["popoverStyles","css","BpPopover","LitElement","event","slot","html","nothing","closeSvg","BpIcon","__decorateClass","property","value","booleanConverter","state","query","customElement"],"mappings":";;;;;AAEO,MAAMA,IAAgBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;AC4CtB,IAAMC,IAAN,cAAwBC,EAAW;AAAA,EA6GxC,cAAc;AACZ,UAAA,GAdO,KAAQ,YAAY,IAGpB,KAAQ,YAAY,IAI7B,KAAQ,cAA6B,MACrC,KAAQ,cAA6B,MACrC,KAAQ,YAAY,WAAW,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC,IAsG1E,KAAQ,qBAAqB,CAACC,MAA4B;AACxD,MAAI,KAAK,YAAY,KAAK,YAAY,YACtCA,EAAM,gBAAA,GACN,KAAK,OAAA;AAAA,IACP,GAOA,KAAQ,uBAAuB,CAACA,MAA+B;AAC7D,MAAI,KAAK,YAGP,KAAK,YAAY,YAChBA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SAExCA,EAAM,eAAA,GACN,KAAK,OAAA;AAAA,IAET,GAMA,KAAQ,0BAA0B,MAAY;AAC5C,MAAI,KAAK,YAAY,KAAK,YAAY,YAEtC,KAAK,cAAA,GACL,KAAK,cAAc,OAAO,WAAW,MAAM;AACzC,aAAK,KAAA;AAAA,MACP,GAAG,KAAK,SAAS;AAAA,IACnB,GAMA,KAAQ,0BAA0B,MAAY;AAC5C,MAAI,KAAK,YAAY,YAErB,KAAK,cAAA,GACL,KAAK,cAAc,OAAO,WAAW,MAAM;AACzC,aAAK,KAAA;AAAA,MACP,GAAG,KAAK,SAAS;AAAA,IACnB,GAMA,KAAQ,wBAAwB,MAAY;AAC1C,MAAI,KAAK,YAAY,WACrB,KAAK,cAAA;AAAA,IACP,GAMA,KAAQ,wBAAwB,MAAY;AAC1C,MAAI,KAAK,YAAY,YAErB,KAAK,cAAA,GACL,KAAK,cAAc,OAAO,WAAW,MAAM;AACzC,aAAK,KAAA;AAAA,MACP,GAAG,KAAK,SAAS;AAAA,IACnB,GAMA,KAAQ,qBAAqB,MAAY;AACvC,MAAI,KAAK,YAAY,KAAK,YAAY,WACtC,KAAK,KAAA;AAAA,IACP,GAMA,KAAQ,oBAAoB,MAAY;AACtC,MAAI,KAAK,YAAY,WACrB,KAAK,KAAA;AAAA,IACP,GAOA,KAAQ,sBAAsB,CAACA,MAA4B;AAEzD,UADI,CAAC,KAAK,uBAAuB,CAAC,KAAK,QACnC,KAAK,YAAY,SAAU;AAG/B,MADaA,EAAM,aAAA,EACT,SAAS,IAAI,KACrB,KAAK,KAAA;AAAA,IAET,GAOA,KAAQ,wBAAwB,CAACA,MAA+B;AAC9D,MAAI,CAAC,KAAK,iBAAiB,CAAC,KAAK,QAE7BA,EAAM,QAAQ,aAChBA,EAAM,eAAA,GACN,KAAK,KAAA,GACL,KAAK,gBAAgB,MAAA;AAAA,IAEzB,GAMA,KAAQ,mBAAmB,MAAY;AACrC,WAAK,KAAA;AAAA,IACP,GAOA,KAAQ,yBAAyB,CAACA,MAAuB;AACvD,YAAMC,IAAOD,EAAM;AAGnB,WAAK,YAAYC,EAAK,cAAc,EAAE,SAAS,GAAA,CAAM,EAAE,SAAS;AAAA,IAClE,GAOA,KAAQ,yBAAyB,CAACD,MAAuB;AACvD,YAAMC,IAAOD,EAAM;AAGnB,WAAK,YAAYC,EAAK,cAAc,EAAE,SAAS,GAAA,CAAM,EAAE,SAAS;AAAA,IAClE,GArPE,KAAK,OAAO,IACZ,KAAK,YAAY,UACjB,KAAK,UAAU,SACf,KAAK,QAAQ,IACb,KAAK,YAAY,IACjB,KAAK,sBAAsB,IAC3B,KAAK,gBAAgB,IACrB,KAAK,WAAW,GAChB,KAAK,YAAY,KACjB,KAAK,YAAY,KACjB,KAAK,WAAW,IAChB,KAAK,QAAQ;AAAA,EACf;AAAA,EAEA,oBAA0B;AACxB,UAAM,kBAAA,GACN,SAAS,iBAAiB,SAAS,KAAK,qBAAqB;AAAA,MAC3D,SAAS;AAAA,IAAA,CACV,GACD,SAAS,iBAAiB,WAAW,KAAK,qBAAqB;AAAA,EACjE;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAA,GACN,SAAS,oBAAoB,SAAS,KAAK,qBAAqB;AAAA,MAC9D,SAAS;AAAA,IAAA,CACc,GACzB,SAAS,oBAAoB,WAAW,KAAK,qBAAqB,GAClE,KAAK,cAAA;AAAA,EACP;AAAA;AAAA,EAGA,OAAa;AACX,IAAI,KAAK,YAAY,KAAK,SAE1B,KAAK,cAAA,GACL,KAAK,OAAO,IAEZ,KAAK;AAAA,MACH,IAAI,YAAY,WAAW,EAAE,SAAS,IAAM,UAAU,IAAM;AAAA,IAAA,GAG9D,KAAK,eAAe,KAAK,MAAM;AAC7B,WAAK;AAAA,QACH,IAAI,YAAY,iBAAiB,EAAE,SAAS,IAAM,UAAU,IAAM;AAAA,MAAA;AAAA,IAEtE,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAa;AACX,IAAK,KAAK,SAEV,KAAK,cAAA,GACL,KAAK,OAAO,IAEZ,KAAK;AAAA,MACH,IAAI,YAAY,WAAW,EAAE,SAAS,IAAM,UAAU,IAAM;AAAA,IAAA,GAG9D,KAAK,eAAe,KAAK,MAAM;AAC7B,WAAK;AAAA,QACH,IAAI,YAAY,iBAAiB,EAAE,SAAS,IAAM,UAAU,IAAM;AAAA,MAAA;AAAA,IAEtE,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SAAe;AACb,IAAI,KAAK,OACP,KAAK,KAAA,IAEL,KAAK,KAAA;AAAA,EAET;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAsB;AAC5B,IAAI,KAAK,gBAAgB,SACvB,OAAO,aAAa,KAAK,WAAW,GACpC,KAAK,cAAc,OAEjB,KAAK,gBAAgB,SACvB,OAAO,aAAa,KAAK,WAAW,GACpC,KAAK,cAAc;AAAA,EAEvB;AAAA,EA8JA,SAAS;AACP,WAAOC;AAAA;AAAA,yBAEc,KAAK,OAAO,kBAAkB,EAAE,IAAI,KAAK,WACtD,sBACA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKO,KAAK,WAAW,KAAK,CAAC;AAAA;AAAA;AAAA,0BAGjB,KAAK,IAAI;AAAA,0BACT,KAAK,OAAO,KAAK,YAAYC,CAAO;AAAA,0BACpC,KAAK,QAAQ;AAAA,mBACpB,KAAK,kBAAkB;AAAA,qBACrB,KAAK,oBAAoB;AAAA,wBACtB,KAAK,uBAAuB;AAAA,wBAC5B,KAAK,uBAAuB;AAAA,mBACjC,KAAK,kBAAkB;AAAA,kBACxB,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA,UAI9B,KAAK,OACHD;AAAA;AAAA,qBAES,KAAK,SAAS;AAAA,wDACqB,KAAK,SAAS;AAAA;AAAA;AAAA,6BAGzC,KAAK,SAASC,CAAO;AAAA;AAAA,6CAEL,KAAK,QAAQ;AAAA,8BAC5B,KAAK,qBAAqB;AAAA,8BAC1B,KAAK,qBAAqB;AAAA;AAAA,kBAEtC,KAAK,QACHD,qDACAC,CAAO;AAAA,kBACT,KAAK,aAAa,KAAK,YACrBD;AAAA;AAAA;AAAA;AAAA,wCAIoB,KAAK,sBAAsB;AAAA;AAAA,0BAEzC,KAAK,YACHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAMa,KAAK,gBAAgB;AAAA;AAAA,gDAEdE,CAAQ;AAAA;AAAA,gCAG5BD,CAAO;AAAA;AAAA,wBAGfD;AAAA;AAAA,oCAEgB,KAAK,sBAAsB;AAAA,6BAClC;AAAA;AAAA;AAAA;AAAA,kBAIX,KAAK,YACHA;AAAA;AAAA;AAAA;AAAA,wCAIoB,KAAK,sBAAsB;AAAA;AAAA;AAAA,wBAI/CA;AAAA;AAAA,oCAEgB,KAAK,sBAAsB;AAAA,6BAClC;AAAA;AAAA,gBAGjBC,CAAO;AAAA;AAAA;AAAA,EAGjB;AACF;AA/baL,EAIJ,eAAe,CAACO,CAAM;AAJlBP,EA2GJ,SAAS,CAACF,CAAa;AArGsBU,EAAA;AAAA,EAAnDC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAN/BT,EAMyC,WAAA,QAAA,CAAA;AA4B5CQ,EAAA;AAAA,EAzBPC,EAAS;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,MACT,eAAe,CAACC,MAC8B;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,EAEqB,SAASA,CAAyB,IACpDA,IACD;AAAA,IACN;AAAA,EACF,CACD;AAAA,GAjCUV,EAkCH,WAAA,aAAA,CAAA;AAmBAQ,EAAA;AAAA,EAhBPC,EAAS;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,MACT,eAAe,CAACC,MAC0B;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,EAEmB,SAASA,CAAuB,IAChDA,IACD;AAAA,IACN;AAAA,EACF,CACD;AAAA,GApDUV,EAqDH,WAAA,WAAA,CAAA;AAG6BQ,EAAA;AAAA,EAApCC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GAxDhBT,EAwD0B,WAAA,SAAA,CAAA;AAI7BQ,EAAA;AAAA,EADPC,EAAS,EAAE,MAAM,SAAS,WAAW,cAAc;AAAA,GA3DzCT,EA4DH,WAAA,aAAA,CAAA;AAQAQ,EAAA;AAAA,EALPC,EAAS;AAAA,IACR,WAAWE;AAAA,IACX,WAAW;AAAA,IACX,SAAS;AAAA,EAAA,CACV;AAAA,GAnEUX,EAoEH,WAAA,uBAAA,CAAA;AAQAQ,EAAA;AAAA,EALPC,EAAS;AAAA,IACR,WAAWE;AAAA,IACX,WAAW;AAAA,IACX,SAAS;AAAA,EAAA,CACV;AAAA,GA3EUX,EA4EH,WAAA,iBAAA,CAAA;AAG4BQ,EAAA;AAAA,EAAnCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA/EfT,EA+EyB,WAAA,YAAA,CAAA;AAI5BQ,EAAA;AAAA,EADPC,EAAS,EAAE,MAAM,QAAQ,WAAW,cAAc;AAAA,GAlFxCT,EAmFH,WAAA,aAAA,CAAA;AAIAQ,EAAA;AAAA,EADPC,EAAS,EAAE,MAAM,QAAQ,WAAW,cAAc;AAAA,GAtFxCT,EAuFH,WAAA,aAAA,CAAA;AAG6BQ,EAAA;AAAA,EAApCC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GA1FhBT,EA0F0B,WAAA,YAAA,CAAA;AAGDQ,EAAA;AAAA,EAAnCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA7FfT,EA6FyB,WAAA,SAAA,CAAA;AAGnBQ,EAAA;AAAA,EAAhBI,EAAA;AAAM,GAhGIZ,EAgGM,WAAA,aAAA,CAAA;AAGAQ,EAAA;AAAA,EAAhBI,EAAA;AAAM,GAnGIZ,EAmGM,WAAA,aAAA,CAAA;AAEmBQ,EAAA;AAAA,EAAnCK,EAAM,mBAAmB;AAAA,GArGfb,EAqGyB,WAAA,kBAAA,CAAA;AArGzBA,IAANQ,EAAA;AAAA,EADNM,EAAc,YAAY;AAAA,GACdd,CAAA;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LitElement, TemplateResult, PropertyValues } from 'lit';
|
|
2
|
-
import '../icon/icon.js';
|
|
2
|
+
import { BpIcon } from '../icon/icon.js';
|
|
3
3
|
export type TableVariant = 'default' | 'striped' | 'bordered';
|
|
4
4
|
export type TableSize = 'sm' | 'md' | 'lg';
|
|
5
5
|
export type TableSortDirection = 'asc' | 'desc' | 'none';
|
|
@@ -74,6 +74,11 @@ export interface TableSortState {
|
|
|
74
74
|
* @csspart empty-state - Empty state container
|
|
75
75
|
*/
|
|
76
76
|
export declare class BpTable extends LitElement {
|
|
77
|
+
/**
|
|
78
|
+
* Child components that self-register as custom elements on import.
|
|
79
|
+
* Value imports prevent bundler tree-shaking of the registration side effect.
|
|
80
|
+
*/
|
|
81
|
+
static dependencies: (typeof BpIcon)[];
|
|
77
82
|
/** Array of column definitions */
|
|
78
83
|
columns: TableColumn[];
|
|
79
84
|
/** Array of row data objects */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../source/components/table/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAUhF,OAAO,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../source/components/table/table.ts"],"names":[],"mappings":"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"}
|
package/dist/components/table.js
CHANGED
|
@@ -7,7 +7,8 @@ import { m as S } from "../shared/memoize-DlOFy-92.js";
|
|
|
7
7
|
import { b as x } from "../shared/boolean-converter-XDGfS9LC.js";
|
|
8
8
|
import { chevronUpSvg as v } from "../icons/chevron-up.js";
|
|
9
9
|
import { chevronDownSvg as R } from "../icons/chevron-down.js";
|
|
10
|
-
|
|
10
|
+
import { BpIcon as $ } from "./icon.js";
|
|
11
|
+
const C = y`
|
|
11
12
|
/* Base styles */
|
|
12
13
|
:host {
|
|
13
14
|
display: block;
|
|
@@ -266,10 +267,10 @@ const $ = y`
|
|
|
266
267
|
}
|
|
267
268
|
}
|
|
268
269
|
`;
|
|
269
|
-
var
|
|
270
|
-
for (var r = l > 1 ? void 0 : l ?
|
|
270
|
+
var z = Object.defineProperty, E = Object.getOwnPropertyDescriptor, i = (e, t, o, l) => {
|
|
271
|
+
for (var r = l > 1 ? void 0 : l ? E(t, o) : t, d = e.length - 1, a; d >= 0; d--)
|
|
271
272
|
(a = e[d]) && (r = (l ? a(t, o, r) : a(r)) || r);
|
|
272
|
-
return l && r &&
|
|
273
|
+
return l && r && z(t, o, r), r;
|
|
273
274
|
};
|
|
274
275
|
let s = class extends g {
|
|
275
276
|
constructor() {
|
|
@@ -582,11 +583,12 @@ let s = class extends g {
|
|
|
582
583
|
`;
|
|
583
584
|
}
|
|
584
585
|
};
|
|
586
|
+
s.dependencies = [$];
|
|
585
587
|
s.VISUAL_ONLY_PROPS = /* @__PURE__ */ new Set([
|
|
586
588
|
"hoverable",
|
|
587
589
|
"stickyHeader"
|
|
588
590
|
]);
|
|
589
|
-
s.styles = [
|
|
591
|
+
s.styles = [C];
|
|
590
592
|
i([
|
|
591
593
|
n({ type: Array })
|
|
592
594
|
], s.prototype, "columns", 2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sources":["../../source/components/table/table.style.ts","../../source/components/table/table.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const tableStyles = css`\n /* Base styles */\n :host {\n display: block;\n }\n\n .table-wrapper {\n overflow-x: auto;\n border-radius: var(--bp-border-radius);\n }\n\n .table {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-sm);\n color: var(--bp-color-text);\n background: var(--bp-color-surface);\n }\n\n /* Header styles */\n .header-row {\n background: var(--bp-color-surface-subdued);\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n .header-cell {\n font-weight: var(--bp-font-weight-semibold);\n text-align: left;\n color: var(--bp-color-text);\n }\n\n .header-cell--sortable {\n cursor: pointer;\n user-select: none;\n transition: background-color var(--bp-transition-fast);\n position: relative;\n }\n\n .header-cell--sortable::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n transition: background var(--bp-transition-fast);\n }\n\n .header-cell--sortable:hover::after {\n background: var(--bp-color-primary);\n opacity: 0.3;\n }\n\n .header-cell--sortable:hover {\n background: var(--bp-color-surface);\n }\n\n .header-cell--sortable:active {\n background: var(--bp-color-surface-subdued);\n transform: translateY(1px);\n }\n\n .header-cell__content {\n display: flex;\n align-items: center;\n gap: var(--bp-spacing-1);\n }\n\n .header-cell__label {\n flex: 1;\n }\n\n /* Sort icon */\n .sort-icon {\n display: flex;\n align-items: center;\n color: var(--bp-color-text-muted);\n transition: color var(--bp-transition-fast);\n }\n\n .sort-icon--active {\n color: var(--bp-color-primary);\n }\n\n /* Cell styles */\n .cell {\n padding: var(--bp-spacing-3) var(--bp-spacing-4);\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\n vertical-align: middle;\n }\n\n .cell--checkbox {\n width: var(--bp-spacing-10);\n text-align: center;\n padding-left: var(--bp-spacing-3);\n padding-right: 0;\n }\n\n .cell--checkbox input[type='checkbox'] {\n width: var(--bp-spacing-6);\n height: var(--bp-spacing-6);\n cursor: pointer;\n }\n\n /* Row styles */\n .row {\n transition: background-color var(--bp-transition-fast);\n content-visibility: auto;\n contain-intrinsic-size: auto 48px;\n }\n\n .row--hoverable:hover {\n background: var(--bp-color-surface-subdued);\n }\n\n .row--selected {\n background: oklch(from var(--bp-color-primary) l c h / 0.15);\n }\n\n .row--selected:hover {\n background: oklch(from var(--bp-color-primary) l c h / 0.2);\n }\n\n /* Remove border from last row */\n tbody tr:last-child .cell {\n border-bottom: none;\n }\n\n /* Variants */\n .table--striped tbody tr:nth-child(even) {\n background: var(--bp-color-surface-subdued);\n }\n\n .table--striped tbody tr:nth-child(even):hover {\n background: var(--bp-color-surface);\n }\n\n .table--striped .row--selected {\n background: oklch(from var(--bp-color-primary) l c h / 0.15) !important;\n }\n\n .table--striped .row--selected:hover {\n background: oklch(from var(--bp-color-primary) l c h / 0.2) !important;\n }\n\n .table--bordered {\n border: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n .table--bordered .cell {\n border: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n /* Sizes */\n .table--sm .cell {\n padding: var(--bp-spacing-1) var(--bp-spacing-3);\n font-size: var(--bp-font-size-xs);\n }\n\n .table--sm .row {\n contain-intrinsic-size: auto 36px;\n }\n\n .table--md .cell {\n padding: var(--bp-spacing-3) var(--bp-spacing-4);\n font-size: var(--bp-font-size-sm);\n }\n\n .table--md .row {\n contain-intrinsic-size: auto 48px;\n }\n\n .table--lg .cell {\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n font-size: var(--bp-font-size-base);\n }\n\n .table--lg .row {\n contain-intrinsic-size: auto 56px;\n }\n\n /* Sticky header */\n .table--sticky-header thead {\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n .table--sticky-header .header-row {\n box-shadow: var(--bp-shadow-sm);\n }\n\n /* Selectable - add pointer cursor */\n .table--selectable .row {\n cursor: pointer;\n }\n\n /* Loading state */\n .table--loading {\n opacity: var(--bp-opacity-disabled);\n pointer-events: none;\n }\n\n /* Empty state */\n .empty-state {\n text-align: center;\n padding: var(--bp-spacing-10);\n color: var(--bp-color-text-muted);\n background: var(--bp-color-surface-subdued);\n }\n\n .state-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--bp-spacing-3);\n padding: var(--bp-spacing-5);\n }\n\n .sort-icon--inactive {\n opacity: 0.4;\n }\n\n /* Focus styles for keyboard navigation */\n .header-cell--sortable:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n .row:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: calc(-1 * var(--bp-focus-offset));\n }\n\n .cell--checkbox input[type='checkbox']:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n /* Reduced motion */\n @media (prefers-reduced-motion: reduce) {\n .row,\n .header-cell--sortable,\n .sort-icon {\n transition: none;\n }\n\n .header-cell--sortable:active {\n transform: none;\n }\n\n .header-cell--sortable::after {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing, TemplateResult, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { tableStyles } from './table.style.js';\nimport { memoizeOne } from '../../utilities/memoize.js';\nimport { booleanConverter } from '../../utilities/boolean-converter.js';\nimport { chevronUpSvg } from '../icon/icons/entries/chevron-up.js';\nimport { chevronDownSvg } from '../icon/icons/entries/chevron-down.js';\nimport '../icon/icon.js';\n\nexport type TableVariant = 'default' | 'striped' | 'bordered';\nexport type TableSize = 'sm' | 'md' | 'lg';\nexport type TableSortDirection = 'asc' | 'desc' | 'none';\n\n/**\n * Column definition for the table\n */\nexport interface TableColumn {\n /** Unique key for the column (matches data property) */\n key: string;\n /** Header label for the column */\n label: string;\n /** Whether this column is sortable */\n sortable?: boolean;\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n /** Fixed width for the column */\n width?: string;\n /** Custom render function for cell content */\n render?: (value: unknown, row: TableRow) => TemplateResult | string;\n}\n\n/**\n * Row data for the table\n */\nexport interface TableRow {\n /** Unique identifier for the row */\n id: string | number;\n /** Row data keyed by column key */\n [key: string]: unknown;\n}\n\n/**\n * Sort state for the table\n */\nexport interface TableSortState {\n /** Column key being sorted */\n column: string;\n /** Sort direction */\n direction: TableSortDirection;\n}\n\n/**\n * A data table component for displaying tabular data with sorting and selection.\n *\n * @element bp-table\n *\n * @property {TableColumn[]} columns - Array of column definitions\n * @property {TableRow[]} rows - Array of row data objects\n * @property {TableVariant} variant - Visual style variant\n * @property {TableSize} size - Size of the table cells\n * @property {boolean} selectable - Whether rows can be selected\n * @property {boolean} multiSelect - Whether multiple rows can be selected\n * @property {(string|number)[]} selectedRows - Array of selected row IDs\n * @property {TableSortState} sortState - Current sort state\n * @property {boolean} stickyHeader - Whether the header sticks on scroll\n * @property {boolean} hoverable - Whether rows highlight on hover\n * @property {boolean} loading - Whether the table is in loading state\n *\n * @fires bp-sort - Fired when a sortable column header is clicked\n * @fires bp-select - Fired when row selection changes\n * @fires bp-row-click - Fired when a row is clicked\n *\n * @slot empty - Content to show when table has no data\n * @slot loading - Content to show when table is loading\n *\n * @csspart table - The table element\n * @csspart thead - The table header section\n * @csspart tbody - The table body section\n * @csspart header-row - A header row\n * @csspart header-cell - A header cell\n * @csspart row - A data row\n * @csspart cell - A data cell\n * @csspart checkbox - Selection checkbox\n * @csspart sort-icon - Sort direction icon\n * @csspart empty-state - Empty state container\n */\n@customElement('bp-table')\nexport class BpTable extends LitElement {\n /** Array of column definitions */\n @property({ type: Array }) declare columns: TableColumn[];\n\n /** Array of row data objects */\n @property({ type: Array }) declare rows: TableRow[];\n\n /** Visual style variant */\n @property({\n type: String,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null) => {\n const valid: TableVariant[] = ['default', 'striped', 'bordered'];\n return value && valid.includes(value as TableVariant)\n ? (value as TableVariant)\n : 'default';\n },\n },\n })\n declare variant: TableVariant;\n\n /** Size of the table cells */\n @property({\n type: String,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null) => {\n const valid: TableSize[] = ['sm', 'md', 'lg'];\n return value && valid.includes(value as TableSize)\n ? (value as TableSize)\n : 'md';\n },\n },\n })\n declare size: TableSize;\n\n /** Whether rows can be selected */\n @property({ type: Boolean, reflect: true }) declare selectable: boolean;\n\n /** Whether multiple rows can be selected */\n @property({ type: Boolean, reflect: true }) declare multiSelect: boolean;\n\n /** Array of selected row IDs */\n @property({ type: Array }) declare selectedRows: (string | number)[];\n\n /** Current sort state */\n @property({ type: Object }) declare sortState: TableSortState | null;\n\n /** Whether the header sticks on scroll */\n @property({ type: Boolean, reflect: true, attribute: 'sticky-header' })\n declare stickyHeader: boolean;\n\n /** Whether rows highlight on hover */\n @property({ converter: booleanConverter, reflect: true })\n declare hoverable: boolean;\n\n /** Whether the table is in loading state */\n @property({ type: Boolean, reflect: true }) declare loading: boolean;\n\n @state() private allSelected = false;\n\n /**\n * Properties that only affect visual styling, not rendered structure.\n * Changes to only these properties can skip a full re-render.\n */\n private static readonly VISUAL_ONLY_PROPS = new Set([\n 'hoverable',\n 'stickyHeader',\n ]);\n\n static styles = [tableStyles];\n\n constructor() {\n super();\n this.columns = [];\n this.rows = [];\n this.variant = 'default';\n this.size = 'md';\n this.selectable = false;\n this.multiSelect = false;\n this.selectedRows = [];\n this.sortState = null;\n this.stickyHeader = false;\n this.hoverable = true;\n this.loading = false;\n }\n\n protected shouldUpdate(changedProperties: PropertyValues): boolean {\n // If all changed properties are visual-only, skip the update.\n // Be conservative: return true if any non-visual property changed.\n for (const key of changedProperties.keys()) {\n if (!BpTable.VISUAL_ONLY_PROPS.has(key as string)) {\n return true;\n }\n }\n // All changes are visual-only — still need to update for CSS class changes\n return true;\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (\n changedProperties.has('selectedRows') ||\n changedProperties.has('rows')\n ) {\n this.allSelected =\n this.rows.length > 0 && this.selectedRows.length === this.rows.length;\n }\n }\n\n /**\n * Memoized sorted rows computation.\n * Only recomputes when rows or sortState references change.\n */\n private computeSortedRows = memoizeOne(\n (rows: TableRow[], sortState: TableSortState | null): TableRow[] => {\n if (!sortState || sortState.direction === 'none') {\n return rows;\n }\n\n const { column, direction } = sortState;\n return [...rows].sort((a, b) => {\n const aVal = a[column];\n const bVal = b[column];\n\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n\n let comparison = 0;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n comparison = aVal.localeCompare(bVal);\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n comparison = aVal - bVal;\n } else {\n comparison = String(aVal).localeCompare(String(bVal));\n }\n\n return direction === 'desc' ? -comparison : comparison;\n });\n }\n );\n\n /**\n * Get sorted rows based on current sort state (memoized).\n */\n private get sortedRows(): TableRow[] {\n return this.computeSortedRows(this.rows, this.sortState);\n }\n\n /**\n * Handles click on sortable column header.\n * Cycles through sort directions: asc → desc → none.\n * Manages focus on header after sort completes.\n */\n private handleHeaderClick(column: TableColumn, event: Event) {\n if (!column.sortable) return;\n\n let direction: TableSortDirection = 'asc';\n if (this.sortState?.column === column.key) {\n if (this.sortState.direction === 'asc') {\n direction = 'desc';\n } else if (this.sortState.direction === 'desc') {\n direction = 'none';\n }\n }\n\n this.sortState = { column: column.key, direction };\n this.dispatchEvent(\n new CustomEvent('bp-sort', {\n detail: { column: column.key, direction },\n bubbles: true,\n composed: true,\n })\n );\n\n // Focus management: focus header after sort completes\n this.updateComplete.then(() => {\n (event.target as HTMLElement)?.focus();\n });\n }\n\n /**\n * Handles click events on table rows.\n * Dispatches bp-row-click event and toggles selection if selectable.\n */\n private handleRowClick(row: TableRow, event: Event) {\n this.dispatchEvent(\n new CustomEvent('bp-row-click', {\n detail: { row, originalEvent: event },\n bubbles: true,\n composed: true,\n })\n );\n\n if (this.selectable) {\n this.toggleRowSelection(row);\n }\n }\n\n /**\n * Handles keyboard events on table rows.\n * Triggers selection on Enter or Space key press when selectable.\n */\n private handleRowKeyDown(row: TableRow, event: KeyboardEvent) {\n if (!this.selectable) return;\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggleRowSelection(row);\n }\n }\n\n /**\n * Toggles selection state for a row.\n * Respects multiSelect setting for single vs multiple selection.\n */\n private toggleRowSelection(row: TableRow) {\n const rowId = row.id;\n const isSelected = this.selectedRows.includes(rowId);\n\n let newSelection: (string | number)[];\n if (this.multiSelect) {\n newSelection = isSelected\n ? this.selectedRows.filter((id) => id !== rowId)\n : [...this.selectedRows, rowId];\n } else {\n newSelection = isSelected ? [] : [rowId];\n }\n\n this.selectedRows = newSelection;\n this.dispatchEvent(\n new CustomEvent('bp-select', {\n detail: { selectedRows: newSelection, row, selected: !isSelected },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n /**\n * Handles select all checkbox toggle.\n * Selects or deselects all rows based on current state.\n */\n private handleSelectAll() {\n if (this.allSelected) {\n this.selectedRows = [];\n } else {\n this.selectedRows = this.rows.map((row) => row.id);\n }\n this.dispatchEvent(\n new CustomEvent('bp-select', {\n detail: {\n selectedRows: this.selectedRows,\n selectAll: !this.allSelected,\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n /**\n * Handles checkbox click events.\n * Stops propagation only on the checkbox itself to prevent row click.\n */\n private handleCheckboxClick(event: Event, row?: TableRow) {\n // Only stop propagation on the checkbox to prevent triggering row click\n if (event.target instanceof HTMLInputElement) {\n event.stopPropagation();\n }\n if (row) {\n this.toggleRowSelection(row);\n } else {\n this.handleSelectAll();\n }\n }\n\n /** Select all rows */\n selectAll() {\n this.selectedRows = this.rows.map((row) => row.id);\n this.dispatchEvent(\n new CustomEvent('bp-select', {\n detail: { selectedRows: this.selectedRows, selectAll: true },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n /** Deselect all rows */\n deselectAll() {\n this.selectedRows = [];\n this.dispatchEvent(\n new CustomEvent('bp-select', {\n detail: { selectedRows: [], selectAll: false },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n /** Clear sort state */\n clearSort() {\n this.sortState = null;\n }\n\n /**\n * Renders the sort icon for sortable columns.\n * Shows chevron-up for ascending, chevron-down for descending, unsorted icon otherwise.\n */\n private renderSortIcon(column: TableColumn) {\n if (!column.sortable) return nothing;\n\n const isActive = this.sortState?.column === column.key;\n const direction = isActive ? this.sortState?.direction : 'none';\n\n const iconSvg =\n direction === 'asc'\n ? chevronUpSvg\n : direction === 'desc'\n ? chevronDownSvg\n : chevronUpSvg;\n\n const iconClasses = {\n 'sort-icon': true,\n 'sort-icon--active': isActive && direction !== 'none',\n 'sort-icon--inactive': direction === 'none',\n };\n\n return html`\n <span class=${classMap(iconClasses)} part=\"sort-icon\" aria-hidden=\"true\">\n <bp-icon .svg=${iconSvg} size=\"sm\"></bp-icon>\n </span>\n `;\n }\n\n /**\n * Renders the table header with column labels and sort icons.\n */\n private renderHeader() {\n return html`\n <thead part=\"thead\">\n <tr class=\"header-row\" part=\"header-row\">\n ${this.selectable && this.multiSelect\n ? html`\n <th class=\"cell cell--checkbox\" part=\"header-cell\">\n <input\n type=\"checkbox\"\n part=\"checkbox\"\n .checked=${this.allSelected}\n .indeterminate=${this.selectedRows.length > 0 &&\n !this.allSelected}\n @click=${(e: Event) => this.handleCheckboxClick(e)}\n aria-label=\"Select all rows\"\n />\n </th>\n `\n : this.selectable\n ? html`<th class=\"cell cell--checkbox\" part=\"header-cell\"></th>`\n : nothing}\n ${repeat(\n this.columns,\n (column) => column.key,\n (column) => html`\n <th\n class=\"cell header-cell ${column.sortable\n ? 'header-cell--sortable'\n : ''}\"\n part=\"header-cell\"\n style=${column.width ? `width: ${column.width}` : ''}\n @click=${(e: Event) => this.handleHeaderClick(column, e)}\n tabindex=${column.sortable ? 0 : -1}\n @keydown=${(e: KeyboardEvent) => {\n if (column.sortable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n this.handleHeaderClick(column, e);\n }\n }}\n aria-sort=${this.sortState?.column === column.key\n ? this.sortState.direction === 'asc'\n ? 'ascending'\n : this.sortState.direction === 'desc'\n ? 'descending'\n : 'none'\n : 'none'}\n >\n <span\n class=\"header-cell__content\"\n style=\"justify-content: ${column.align === 'center'\n ? 'center'\n : column.align === 'right'\n ? 'flex-end'\n : 'flex-start'}\"\n >\n <span class=\"header-cell__label\">${column.label}</span>\n ${this.renderSortIcon(column)}\n </span>\n </th>\n `\n )}\n </tr>\n </thead>\n `;\n }\n\n /**\n * Renders the table body with rows and cells.\n * Handles loading and empty states.\n */\n private renderBody() {\n const sortedRows = this.sortedRows;\n\n if (this.loading) {\n return html`\n <tbody part=\"tbody\">\n <tr>\n <td\n colspan=${this.columns.length + (this.selectable ? 1 : 0)}\n class=\"empty-state\"\n part=\"empty-state\"\n >\n <slot name=\"loading\">\n <div class=\"state-content\">Loading...</div>\n </slot>\n </td>\n </tr>\n </tbody>\n `;\n }\n\n if (sortedRows.length === 0) {\n return html`\n <tbody part=\"tbody\">\n <tr>\n <td\n colspan=${this.columns.length + (this.selectable ? 1 : 0)}\n class=\"empty-state\"\n part=\"empty-state\"\n >\n <slot name=\"empty\">\n <div class=\"state-content\">No data available</div>\n </slot>\n </td>\n </tr>\n </tbody>\n `;\n }\n\n return html`\n <tbody part=\"tbody\">\n ${repeat(\n sortedRows,\n (row) => row.id,\n (row) => {\n const isSelected = this.selectedRows.includes(row.id);\n const rowClasses = {\n row: true,\n 'row--selected': isSelected,\n 'row--hoverable': this.hoverable,\n };\n\n return html`\n <tr\n class=${classMap(rowClasses)}\n part=\"row\"\n @click=${(e: Event) => this.handleRowClick(row, e)}\n @keydown=${(e: KeyboardEvent) => this.handleRowKeyDown(row, e)}\n tabindex=${this.selectable ? 0 : -1}\n aria-selected=${ifDefined(\n this.selectable ? (isSelected ? 'true' : 'false') : undefined\n )}\n >\n ${this.selectable\n ? html`\n <td class=\"cell cell--checkbox\" part=\"cell\">\n <input\n type=\"checkbox\"\n part=\"checkbox\"\n .checked=${isSelected}\n @click=${(e: Event) =>\n this.handleCheckboxClick(e, row)}\n aria-label=\"Select row\"\n />\n </td>\n `\n : nothing}\n ${repeat(\n this.columns,\n (column) => column.key,\n (column) => {\n const value = row[column.key];\n const content = column.render\n ? column.render(value, row)\n : value;\n\n return html`\n <td\n class=\"cell\"\n part=\"cell\"\n style=\"text-align: ${column.align || 'left'}\"\n >\n ${content}\n </td>\n `;\n }\n )}\n </tr>\n `;\n }\n )}\n </tbody>\n `;\n }\n\n render() {\n const tableClasses = {\n table: true,\n [`table--${this.variant}`]: true,\n [`table--${this.size}`]: true,\n 'table--sticky-header': this.stickyHeader,\n 'table--selectable': this.selectable,\n 'table--loading': this.loading,\n };\n\n return html`\n <div class=\"table-wrapper\">\n <table\n class=${classMap(tableClasses)}\n part=\"table\"\n role=\"grid\"\n aria-busy=${this.loading}\n >\n ${this.renderHeader()} ${this.renderBody()}\n </table>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'bp-table': BpTable;\n }\n}\n"],"names":["tableStyles","css","BpTable","LitElement","memoizeOne","rows","sortState","column","direction","a","b","aVal","bVal","comparison","changedProperties","key","event","row","rowId","isSelected","newSelection","id","nothing","isActive","iconSvg","chevronUpSvg","chevronDownSvg","html","classMap","repeat","e","sortedRows","rowClasses","ifDefined","value","content","tableClasses","__decorateClass","property","booleanConverter","state","customElement"],"mappings":";;;;;;;;;AAEO,MAAMA,IAAcC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}
|
|
1
|
+
{"version":3,"file":"table.js","sources":["../../source/components/table/table.style.ts","../../source/components/table/table.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const tableStyles = css`\n /* Base styles */\n :host {\n display: block;\n }\n\n .table-wrapper {\n overflow-x: auto;\n border-radius: var(--bp-border-radius);\n }\n\n .table {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-sm);\n color: var(--bp-color-text);\n background: var(--bp-color-surface);\n }\n\n /* Header styles */\n .header-row {\n background: var(--bp-color-surface-subdued);\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n .header-cell {\n font-weight: var(--bp-font-weight-semibold);\n text-align: left;\n color: var(--bp-color-text);\n }\n\n .header-cell--sortable {\n cursor: pointer;\n user-select: none;\n transition: background-color var(--bp-transition-fast);\n position: relative;\n }\n\n .header-cell--sortable::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n transition: background var(--bp-transition-fast);\n }\n\n .header-cell--sortable:hover::after {\n background: var(--bp-color-primary);\n opacity: 0.3;\n }\n\n .header-cell--sortable:hover {\n background: var(--bp-color-surface);\n }\n\n .header-cell--sortable:active {\n background: var(--bp-color-surface-subdued);\n transform: translateY(1px);\n }\n\n .header-cell__content {\n display: flex;\n align-items: center;\n gap: var(--bp-spacing-1);\n }\n\n .header-cell__label {\n flex: 1;\n }\n\n /* Sort icon */\n .sort-icon {\n display: flex;\n align-items: center;\n color: var(--bp-color-text-muted);\n transition: color var(--bp-transition-fast);\n }\n\n .sort-icon--active {\n color: var(--bp-color-primary);\n }\n\n /* Cell styles */\n .cell {\n padding: var(--bp-spacing-3) var(--bp-spacing-4);\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\n vertical-align: middle;\n }\n\n .cell--checkbox {\n width: var(--bp-spacing-10);\n text-align: center;\n padding-left: var(--bp-spacing-3);\n padding-right: 0;\n }\n\n .cell--checkbox input[type='checkbox'] {\n width: var(--bp-spacing-6);\n height: var(--bp-spacing-6);\n cursor: pointer;\n }\n\n /* Row styles */\n .row {\n transition: background-color var(--bp-transition-fast);\n content-visibility: auto;\n contain-intrinsic-size: auto 48px;\n }\n\n .row--hoverable:hover {\n background: var(--bp-color-surface-subdued);\n }\n\n .row--selected {\n background: oklch(from var(--bp-color-primary) l c h / 0.15);\n }\n\n .row--selected:hover {\n background: oklch(from var(--bp-color-primary) l c h / 0.2);\n }\n\n /* Remove border from last row */\n tbody tr:last-child .cell {\n border-bottom: none;\n }\n\n /* Variants */\n .table--striped tbody tr:nth-child(even) {\n background: var(--bp-color-surface-subdued);\n }\n\n .table--striped tbody tr:nth-child(even):hover {\n background: var(--bp-color-surface);\n }\n\n .table--striped .row--selected {\n background: oklch(from var(--bp-color-primary) l c h / 0.15) !important;\n }\n\n .table--striped .row--selected:hover {\n background: oklch(from var(--bp-color-primary) l c h / 0.2) !important;\n }\n\n .table--bordered {\n border: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n .table--bordered .cell {\n border: var(--bp-border-width) solid var(--bp-color-border);\n }\n\n /* Sizes */\n .table--sm .cell {\n padding: var(--bp-spacing-1) var(--bp-spacing-3);\n font-size: var(--bp-font-size-xs);\n }\n\n .table--sm .row {\n contain-intrinsic-size: auto 36px;\n }\n\n .table--md .cell {\n padding: var(--bp-spacing-3) var(--bp-spacing-4);\n font-size: var(--bp-font-size-sm);\n }\n\n .table--md .row {\n contain-intrinsic-size: auto 48px;\n }\n\n .table--lg .cell {\n padding: var(--bp-spacing-4) var(--bp-spacing-5);\n font-size: var(--bp-font-size-base);\n }\n\n .table--lg .row {\n contain-intrinsic-size: auto 56px;\n }\n\n /* Sticky header */\n .table--sticky-header thead {\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n .table--sticky-header .header-row {\n box-shadow: var(--bp-shadow-sm);\n }\n\n /* Selectable - add pointer cursor */\n .table--selectable .row {\n cursor: pointer;\n }\n\n /* Loading state */\n .table--loading {\n opacity: var(--bp-opacity-disabled);\n pointer-events: none;\n }\n\n /* Empty state */\n .empty-state {\n text-align: center;\n padding: var(--bp-spacing-10);\n color: var(--bp-color-text-muted);\n background: var(--bp-color-surface-subdued);\n }\n\n .state-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--bp-spacing-3);\n padding: var(--bp-spacing-5);\n }\n\n .sort-icon--inactive {\n opacity: 0.4;\n }\n\n /* Focus styles for keyboard navigation */\n .header-cell--sortable:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n .row:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: calc(-1 * var(--bp-focus-offset));\n }\n\n .cell--checkbox input[type='checkbox']:focus-visible {\n outline: var(--bp-focus-width) var(--bp-focus-style) var(--bp-color-focus);\n outline-offset: var(--bp-focus-offset);\n }\n\n /* Reduced motion */\n @media (prefers-reduced-motion: reduce) {\n .row,\n .header-cell--sortable,\n .sort-icon {\n transition: none;\n }\n\n .header-cell--sortable:active {\n transform: none;\n }\n\n .header-cell--sortable::after {\n transition: none;\n }\n }\n`;\n","import { LitElement, html, nothing, TemplateResult, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { tableStyles } from './table.style.js';\nimport { memoizeOne } from '../../utilities/memoize.js';\nimport { booleanConverter } from '../../utilities/boolean-converter.js';\nimport { chevronUpSvg } from '../icon/icons/entries/chevron-up.js';\nimport { chevronDownSvg } from '../icon/icons/entries/chevron-down.js';\nimport { BpIcon } from '../icon/icon.js';\n\nexport type TableVariant = 'default' | 'striped' | 'bordered';\nexport type TableSize = 'sm' | 'md' | 'lg';\nexport type TableSortDirection = 'asc' | 'desc' | 'none';\n\n/**\n * Column definition for the table\n */\nexport interface TableColumn {\n /** Unique key for the column (matches data property) */\n key: string;\n /** Header label for the column */\n label: string;\n /** Whether this column is sortable */\n sortable?: boolean;\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n /** Fixed width for the column */\n width?: string;\n /** Custom render function for cell content */\n render?: (value: unknown, row: TableRow) => TemplateResult | string;\n}\n\n/**\n * Row data for the table\n */\nexport interface TableRow {\n /** Unique identifier for the row */\n id: string | number;\n /** Row data keyed by column key */\n [key: string]: unknown;\n}\n\n/**\n * Sort state for the table\n */\nexport interface TableSortState {\n /** Column key being sorted */\n column: string;\n /** Sort direction */\n direction: TableSortDirection;\n}\n\n/**\n * A data table component for displaying tabular data with sorting and selection.\n *\n * @element bp-table\n *\n * @property {TableColumn[]} columns - Array of column definitions\n * @property {TableRow[]} rows - Array of row data objects\n * @property {TableVariant} variant - Visual style variant\n * @property {TableSize} size - Size of the table cells\n * @property {boolean} selectable - Whether rows can be selected\n * @property {boolean} multiSelect - Whether multiple rows can be selected\n * @property {(string|number)[]} selectedRows - Array of selected row IDs\n * @property {TableSortState} sortState - Current sort state\n * @property {boolean} stickyHeader - Whether the header sticks on scroll\n * @property {boolean} hoverable - Whether rows highlight on hover\n * @property {boolean} loading - Whether the table is in loading state\n *\n * @fires bp-sort - Fired when a sortable column header is clicked\n * @fires bp-select - Fired when row selection changes\n * @fires bp-row-click - Fired when a row is clicked\n *\n * @slot empty - Content to show when table has no data\n * @slot loading - Content to show when table is loading\n *\n * @csspart table - The table element\n * @csspart thead - The table header section\n * @csspart tbody - The table body section\n * @csspart header-row - A header row\n * @csspart header-cell - A header cell\n * @csspart row - A data row\n * @csspart cell - A data cell\n * @csspart checkbox - Selection checkbox\n * @csspart sort-icon - Sort direction icon\n * @csspart empty-state - Empty state container\n */\n@customElement('bp-table')\nexport class BpTable extends LitElement {\n /**\n * Child components that self-register as custom elements on import.\n * Value imports prevent bundler tree-shaking of the registration side effect.\n */\n static dependencies = [BpIcon];\n\n /** Array of column definitions */\n @property({ type: Array }) declare columns: TableColumn[];\n\n /** Array of row data objects */\n @property({ type: Array }) declare rows: TableRow[];\n\n /** Visual style variant */\n @property({\n type: String,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null) => {\n const valid: TableVariant[] = ['default', 'striped', 'bordered'];\n return value && valid.includes(value as TableVariant)\n ? (value as TableVariant)\n : 'default';\n },\n },\n })\n declare variant: TableVariant;\n\n /** Size of the table cells */\n @property({\n type: String,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null) => {\n const valid: TableSize[] = ['sm', 'md', 'lg'];\n return value && valid.includes(value as TableSize)\n ? (value as TableSize)\n : 'md';\n },\n },\n })\n declare size: TableSize;\n\n /** Whether rows can be selected */\n @property({ type: Boolean, reflect: true }) declare selectable: boolean;\n\n /** Whether multiple rows can be selected */\n @property({ type: Boolean, reflect: true }) declare multiSelect: boolean;\n\n /** Array of selected row IDs */\n @property({ type: Array }) declare selectedRows: (string | number)[];\n\n /** Current sort state */\n @property({ type: Object }) declare sortState: TableSortState | null;\n\n /** Whether the header sticks on scroll */\n @property({ type: Boolean, reflect: true, attribute: 'sticky-header' })\n declare stickyHeader: boolean;\n\n /** Whether rows highlight on hover */\n @property({ converter: booleanConverter, reflect: true })\n declare hoverable: boolean;\n\n /** Whether the table is in loading state */\n @property({ type: Boolean, reflect: true }) declare loading: boolean;\n\n @state() private allSelected = false;\n\n /**\n * Properties that only affect visual styling, not rendered structure.\n * Changes to only these properties can skip a full re-render.\n */\n private static readonly VISUAL_ONLY_PROPS = new Set([\n 'hoverable',\n 'stickyHeader',\n ]);\n\n static styles = [tableStyles];\n\n constructor() {\n super();\n this.columns = [];\n this.rows = [];\n this.variant = 'default';\n this.size = 'md';\n this.selectable = false;\n this.multiSelect = false;\n this.selectedRows = [];\n this.sortState = null;\n this.stickyHeader = false;\n this.hoverable = true;\n this.loading = false;\n }\n\n protected shouldUpdate(changedProperties: PropertyValues): boolean {\n // If all changed properties are visual-only, skip the update.\n // Be conservative: return true if any non-visual property changed.\n for (const key of changedProperties.keys()) {\n if (!BpTable.VISUAL_ONLY_PROPS.has(key as string)) {\n return true;\n }\n }\n // All changes are visual-only — still need to update for CSS class changes\n return true;\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (\n changedProperties.has('selectedRows') ||\n changedProperties.has('rows')\n ) {\n this.allSelected =\n this.rows.length > 0 && this.selectedRows.length === this.rows.length;\n }\n }\n\n /**\n * Memoized sorted rows computation.\n * Only recomputes when rows or sortState references change.\n */\n private computeSortedRows = memoizeOne(\n (rows: TableRow[], sortState: TableSortState | null): TableRow[] => {\n if (!sortState || sortState.direction === 'none') {\n return rows;\n }\n\n const { column, direction } = sortState;\n return [...rows].sort((a, b) => {\n const aVal = a[column];\n const bVal = b[column];\n\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n\n let comparison = 0;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n comparison = aVal.localeCompare(bVal);\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n comparison = aVal - bVal;\n } else {\n comparison = String(aVal).localeCompare(String(bVal));\n }\n\n return direction === 'desc' ? -comparison : comparison;\n });\n }\n );\n\n /**\n * Get sorted rows based on current sort state (memoized).\n */\n private get sortedRows(): TableRow[] {\n return this.computeSortedRows(this.rows, this.sortState);\n }\n\n /**\n * Handles click on sortable column header.\n * Cycles through sort directions: asc → desc → none.\n * Manages focus on header after sort completes.\n */\n private handleHeaderClick(column: TableColumn, event: Event) {\n if (!column.sortable) return;\n\n let direction: TableSortDirection = 'asc';\n if (this.sortState?.column === column.key) {\n if (this.sortState.direction === 'asc') {\n direction = 'desc';\n } else if (this.sortState.direction === 'desc') {\n direction = 'none';\n }\n }\n\n this.sortState = { column: column.key, direction };\n this.dispatchEvent(\n new CustomEvent('bp-sort', {\n detail: { column: column.key, direction },\n bubbles: true,\n composed: true,\n })\n );\n\n // Focus management: focus header after sort completes\n this.updateComplete.then(() => {\n (event.target as HTMLElement)?.focus();\n });\n }\n\n /**\n * Handles click events on table rows.\n * Dispatches bp-row-click event and toggles selection if selectable.\n */\n private handleRowClick(row: TableRow, event: Event) {\n this.dispatchEvent(\n new CustomEvent('bp-row-click', {\n detail: { row, originalEvent: event },\n bubbles: true,\n composed: true,\n })\n );\n\n if (this.selectable) {\n this.toggleRowSelection(row);\n }\n }\n\n /**\n * Handles keyboard events on table rows.\n * Triggers selection on Enter or Space key press when selectable.\n */\n private handleRowKeyDown(row: TableRow, event: KeyboardEvent) {\n if (!this.selectable) return;\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggleRowSelection(row);\n }\n }\n\n /**\n * Toggles selection state for a row.\n * Respects multiSelect setting for single vs multiple selection.\n */\n private toggleRowSelection(row: TableRow) {\n const rowId = row.id;\n const isSelected = this.selectedRows.includes(rowId);\n\n let newSelection: (string | number)[];\n if (this.multiSelect) {\n newSelection = isSelected\n ? this.selectedRows.filter((id) => id !== rowId)\n : [...this.selectedRows, rowId];\n } else {\n newSelection = isSelected ? [] : [rowId];\n }\n\n this.selectedRows = newSelection;\n this.dispatchEvent(\n new CustomEvent('bp-select', {\n detail: { selectedRows: newSelection, row, selected: !isSelected },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n /**\n * Handles select all checkbox toggle.\n * Selects or deselects all rows based on current state.\n */\n private handleSelectAll() {\n if (this.allSelected) {\n this.selectedRows = [];\n } else {\n this.selectedRows = this.rows.map((row) => row.id);\n }\n this.dispatchEvent(\n new CustomEvent('bp-select', {\n detail: {\n selectedRows: this.selectedRows,\n selectAll: !this.allSelected,\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n /**\n * Handles checkbox click events.\n * Stops propagation only on the checkbox itself to prevent row click.\n */\n private handleCheckboxClick(event: Event, row?: TableRow) {\n // Only stop propagation on the checkbox to prevent triggering row click\n if (event.target instanceof HTMLInputElement) {\n event.stopPropagation();\n }\n if (row) {\n this.toggleRowSelection(row);\n } else {\n this.handleSelectAll();\n }\n }\n\n /** Select all rows */\n selectAll() {\n this.selectedRows = this.rows.map((row) => row.id);\n this.dispatchEvent(\n new CustomEvent('bp-select', {\n detail: { selectedRows: this.selectedRows, selectAll: true },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n /** Deselect all rows */\n deselectAll() {\n this.selectedRows = [];\n this.dispatchEvent(\n new CustomEvent('bp-select', {\n detail: { selectedRows: [], selectAll: false },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n /** Clear sort state */\n clearSort() {\n this.sortState = null;\n }\n\n /**\n * Renders the sort icon for sortable columns.\n * Shows chevron-up for ascending, chevron-down for descending, unsorted icon otherwise.\n */\n private renderSortIcon(column: TableColumn) {\n if (!column.sortable) return nothing;\n\n const isActive = this.sortState?.column === column.key;\n const direction = isActive ? this.sortState?.direction : 'none';\n\n const iconSvg =\n direction === 'asc'\n ? chevronUpSvg\n : direction === 'desc'\n ? chevronDownSvg\n : chevronUpSvg;\n\n const iconClasses = {\n 'sort-icon': true,\n 'sort-icon--active': isActive && direction !== 'none',\n 'sort-icon--inactive': direction === 'none',\n };\n\n return html`\n <span class=${classMap(iconClasses)} part=\"sort-icon\" aria-hidden=\"true\">\n <bp-icon .svg=${iconSvg} size=\"sm\"></bp-icon>\n </span>\n `;\n }\n\n /**\n * Renders the table header with column labels and sort icons.\n */\n private renderHeader() {\n return html`\n <thead part=\"thead\">\n <tr class=\"header-row\" part=\"header-row\">\n ${this.selectable && this.multiSelect\n ? html`\n <th class=\"cell cell--checkbox\" part=\"header-cell\">\n <input\n type=\"checkbox\"\n part=\"checkbox\"\n .checked=${this.allSelected}\n .indeterminate=${this.selectedRows.length > 0 &&\n !this.allSelected}\n @click=${(e: Event) => this.handleCheckboxClick(e)}\n aria-label=\"Select all rows\"\n />\n </th>\n `\n : this.selectable\n ? html`<th class=\"cell cell--checkbox\" part=\"header-cell\"></th>`\n : nothing}\n ${repeat(\n this.columns,\n (column) => column.key,\n (column) => html`\n <th\n class=\"cell header-cell ${column.sortable\n ? 'header-cell--sortable'\n : ''}\"\n part=\"header-cell\"\n style=${column.width ? `width: ${column.width}` : ''}\n @click=${(e: Event) => this.handleHeaderClick(column, e)}\n tabindex=${column.sortable ? 0 : -1}\n @keydown=${(e: KeyboardEvent) => {\n if (column.sortable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n this.handleHeaderClick(column, e);\n }\n }}\n aria-sort=${this.sortState?.column === column.key\n ? this.sortState.direction === 'asc'\n ? 'ascending'\n : this.sortState.direction === 'desc'\n ? 'descending'\n : 'none'\n : 'none'}\n >\n <span\n class=\"header-cell__content\"\n style=\"justify-content: ${column.align === 'center'\n ? 'center'\n : column.align === 'right'\n ? 'flex-end'\n : 'flex-start'}\"\n >\n <span class=\"header-cell__label\">${column.label}</span>\n ${this.renderSortIcon(column)}\n </span>\n </th>\n `\n )}\n </tr>\n </thead>\n `;\n }\n\n /**\n * Renders the table body with rows and cells.\n * Handles loading and empty states.\n */\n private renderBody() {\n const sortedRows = this.sortedRows;\n\n if (this.loading) {\n return html`\n <tbody part=\"tbody\">\n <tr>\n <td\n colspan=${this.columns.length + (this.selectable ? 1 : 0)}\n class=\"empty-state\"\n part=\"empty-state\"\n >\n <slot name=\"loading\">\n <div class=\"state-content\">Loading...</div>\n </slot>\n </td>\n </tr>\n </tbody>\n `;\n }\n\n if (sortedRows.length === 0) {\n return html`\n <tbody part=\"tbody\">\n <tr>\n <td\n colspan=${this.columns.length + (this.selectable ? 1 : 0)}\n class=\"empty-state\"\n part=\"empty-state\"\n >\n <slot name=\"empty\">\n <div class=\"state-content\">No data available</div>\n </slot>\n </td>\n </tr>\n </tbody>\n `;\n }\n\n return html`\n <tbody part=\"tbody\">\n ${repeat(\n sortedRows,\n (row) => row.id,\n (row) => {\n const isSelected = this.selectedRows.includes(row.id);\n const rowClasses = {\n row: true,\n 'row--selected': isSelected,\n 'row--hoverable': this.hoverable,\n };\n\n return html`\n <tr\n class=${classMap(rowClasses)}\n part=\"row\"\n @click=${(e: Event) => this.handleRowClick(row, e)}\n @keydown=${(e: KeyboardEvent) => this.handleRowKeyDown(row, e)}\n tabindex=${this.selectable ? 0 : -1}\n aria-selected=${ifDefined(\n this.selectable ? (isSelected ? 'true' : 'false') : undefined\n )}\n >\n ${this.selectable\n ? html`\n <td class=\"cell cell--checkbox\" part=\"cell\">\n <input\n type=\"checkbox\"\n part=\"checkbox\"\n .checked=${isSelected}\n @click=${(e: Event) =>\n this.handleCheckboxClick(e, row)}\n aria-label=\"Select row\"\n />\n </td>\n `\n : nothing}\n ${repeat(\n this.columns,\n (column) => column.key,\n (column) => {\n const value = row[column.key];\n const content = column.render\n ? column.render(value, row)\n : value;\n\n return html`\n <td\n class=\"cell\"\n part=\"cell\"\n style=\"text-align: ${column.align || 'left'}\"\n >\n ${content}\n </td>\n `;\n }\n )}\n </tr>\n `;\n }\n )}\n </tbody>\n `;\n }\n\n render() {\n const tableClasses = {\n table: true,\n [`table--${this.variant}`]: true,\n [`table--${this.size}`]: true,\n 'table--sticky-header': this.stickyHeader,\n 'table--selectable': this.selectable,\n 'table--loading': this.loading,\n };\n\n return html`\n <div class=\"table-wrapper\">\n <table\n class=${classMap(tableClasses)}\n part=\"table\"\n role=\"grid\"\n aria-busy=${this.loading}\n >\n ${this.renderHeader()} ${this.renderBody()}\n </table>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'bp-table': BpTable;\n }\n}\n"],"names":["tableStyles","css","BpTable","LitElement","memoizeOne","rows","sortState","column","direction","a","b","aVal","bVal","comparison","changedProperties","key","event","row","rowId","isSelected","newSelection","id","nothing","isActive","iconSvg","chevronUpSvg","chevronDownSvg","html","classMap","repeat","e","sortedRows","rowClasses","ifDefined","value","content","tableClasses","BpIcon","__decorateClass","property","booleanConverter","state","customElement"],"mappings":";;;;;;;;;;AAEO,MAAMA,IAAcC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
2
|
import type { IconName } from '../icon/icons/icon-name.generated.js';
|
|
3
|
-
import '../icon/icon.js';
|
|
3
|
+
import { BpIcon } from '../icon/icon.js';
|
|
4
4
|
export type TabsSize = 'sm' | 'md' | 'lg';
|
|
5
5
|
export type TabsVariant = 'default' | 'pills' | 'underline';
|
|
6
6
|
export type TabsPlacement = 'top' | 'bottom' | 'start' | 'end';
|
|
@@ -47,6 +47,11 @@ export interface TabItem {
|
|
|
47
47
|
* @csspart panel - Individual panel wrapper
|
|
48
48
|
*/
|
|
49
49
|
export declare class BpTabs extends LitElement {
|
|
50
|
+
/**
|
|
51
|
+
* Child components that self-register as custom elements on import.
|
|
52
|
+
* Value imports prevent bundler tree-shaking of the registration side effect.
|
|
53
|
+
*/
|
|
54
|
+
static dependencies: (typeof BpIcon)[];
|
|
50
55
|
/**
|
|
51
56
|
* The ID of the currently selected tab
|
|
52
57
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../source/components/tabs/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,KAAK,CAAC;AAUhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../source/components/tabs/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,KAAK,CAAC;AAUhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBACa,MAAO,SAAQ,UAAU;IACpC;;;OAGG;IACH,MAAM,CAAC,YAAY,oBAAY;IAE/B;;OAEG;IACgD,KAAK,EAAE,MAAM,CAAC;IAEjE;;OAEG;IACgC,IAAI,EAAE,OAAO,EAAE,CAAC;IAEnD;;OAEG;IACgD,IAAI,EAAE,QAAQ,CAAC;IAElE;;OAEG;IACgD,OAAO,EAAE,WAAW,CAAC;IAExE;;OAEG;IACgD,SAAS,EAAE,aAAa,CAAC;IAE5E;;OAEG;IACiD,QAAQ,EAAE,OAAO,CAAC;IAEtE;;OAEG;IACiD,MAAM,EAAE,OAAO,CAAC;IAE3D,OAAO,CAAC,YAAY,CAAuB;IAGpD,OAAO,CAAC,aAAa,CAAiB;IAEtC,MAAM,CAAC,MAAM,4BAAgB;;IAa7B,iBAAiB,IAAI,IAAI;IAKzB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQtD,OAAO,CAAC,gBAAgB,CAgBtB;IAEF,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,cAAc,CAIpB;IAEF,OAAO,CAAC,gBAAgB,CAqEtB;IAEF,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,cAAc,CAoBpB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,SAAS;IAyDjB,MAAM;CA8BP;AAED;;;;;;;;;;GAUG;AACH,qBACa,UAAW,SAAQ,UAAU;IACxC;;OAEG;IAEK,KAAK,EAAE,MAAM,CAAC;;IAOtB,iBAAiB,IAAI,IAAI;IAMzB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAStD,MAAM;CAGP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,UAAU,CAAC;KAC5B;CACF"}
|
package/dist/components/tabs.js
CHANGED
|
@@ -2,7 +2,8 @@ import { css as f, LitElement as h, nothing as c, html as d } from "lit";
|
|
|
2
2
|
import { property as l, state as m, queryAssignedElements as y, customElement as v } from "lit/decorators.js";
|
|
3
3
|
import { classMap as u } from "lit/directives/class-map.js";
|
|
4
4
|
import { repeat as x } from "lit/directives/repeat.js";
|
|
5
|
-
|
|
5
|
+
import { BpIcon as w } from "./icon.js";
|
|
6
|
+
const T = f`
|
|
6
7
|
/* Base styles */
|
|
7
8
|
:host {
|
|
8
9
|
display: block;
|
|
@@ -307,10 +308,10 @@ const w = f`
|
|
|
307
308
|
outline-offset: var(--bp-focus-offset);
|
|
308
309
|
}
|
|
309
310
|
`;
|
|
310
|
-
var
|
|
311
|
-
for (var i = s > 1 ? void 0 : s ?
|
|
311
|
+
var k = Object.defineProperty, $ = Object.getOwnPropertyDescriptor, o = (t, a, e, s) => {
|
|
312
|
+
for (var i = s > 1 ? void 0 : s ? $(a, e) : a, n = t.length - 1, b; n >= 0; n--)
|
|
312
313
|
(b = t[n]) && (i = (s ? b(a, e, i) : b(i)) || i);
|
|
313
|
-
return s && i &&
|
|
314
|
+
return s && i && k(a, e, i), i;
|
|
314
315
|
};
|
|
315
316
|
let r = class extends h {
|
|
316
317
|
constructor() {
|
|
@@ -489,7 +490,8 @@ let r = class extends h {
|
|
|
489
490
|
`;
|
|
490
491
|
}
|
|
491
492
|
};
|
|
492
|
-
r.
|
|
493
|
+
r.dependencies = [w];
|
|
494
|
+
r.styles = [T];
|
|
493
495
|
o([
|
|
494
496
|
l({ type: String, reflect: !0 })
|
|
495
497
|
], r.prototype, "value", 2);
|