@mintplayer/ng-bootstrap 21.22.0 → 21.23.0
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/fesm2022/mintplayer-ng-bootstrap-accordion.mjs +20 -20
- package/fesm2022/mintplayer-ng-bootstrap-accordion.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-alert.mjs +8 -8
- package/fesm2022/mintplayer-ng-bootstrap-alert.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-badge.mjs +5 -5
- package/fesm2022/mintplayer-ng-bootstrap-badge.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-breadcrumb.mjs +6 -6
- package/fesm2022/mintplayer-ng-bootstrap-breadcrumb.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-button-group.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-button-group.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-button-type.mjs +4 -4
- package/fesm2022/mintplayer-ng-bootstrap-button-type.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-calendar-month.mjs +9 -9
- package/fesm2022/mintplayer-ng-bootstrap-calendar-month.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-calendar.mjs +10 -10
- package/fesm2022/mintplayer-ng-bootstrap-calendar.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-card.mjs +8 -8
- package/fesm2022/mintplayer-ng-bootstrap-card.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-carousel.mjs +25 -25
- package/fesm2022/mintplayer-ng-bootstrap-carousel.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-close.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-close.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-code-snippet.mjs +7 -7
- package/fesm2022/mintplayer-ng-bootstrap-code-snippet.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-color-picker.mjs +58 -58
- package/fesm2022/mintplayer-ng-bootstrap-color-picker.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-container.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-container.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-context-menu.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-context-menu.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-copy.mjs +4 -4
- package/fesm2022/mintplayer-ng-bootstrap-copy.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs +20 -20
- package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-datepicker.mjs +6 -6
- package/fesm2022/mintplayer-ng-bootstrap-datepicker.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-dock.mjs +789 -1175
- package/fesm2022/mintplayer-ng-bootstrap-dock.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-dropdown-divider.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-dropdown-divider.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-dropdown-menu.mjs +10 -10
- package/fesm2022/mintplayer-ng-bootstrap-dropdown-menu.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-dropdown.mjs +15 -15
- package/fesm2022/mintplayer-ng-bootstrap-dropdown.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-enhanced-paste.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-enhanced-paste.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-enum.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-enum.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-file-upload.mjs +16 -16
- package/fesm2022/mintplayer-ng-bootstrap-file-upload.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-floating-labels.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-floating-labels.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-font-color.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-font-color.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-for.mjs +4 -4
- package/fesm2022/mintplayer-ng-bootstrap-for.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-form.mjs +11 -11
- package/fesm2022/mintplayer-ng-bootstrap-form.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-grid.mjs +26 -26
- package/fesm2022/mintplayer-ng-bootstrap-grid.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-has-overlay.mjs +4 -4
- package/fesm2022/mintplayer-ng-bootstrap-has-overlay.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-has-property.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-has-property.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-in-list.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-in-list.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-input-group.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-input-group.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-instance-of.mjs +14 -14
- package/fesm2022/mintplayer-ng-bootstrap-instance-of.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-let.mjs +4 -4
- package/fesm2022/mintplayer-ng-bootstrap-let.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-linify.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-linify.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-list-group.mjs +7 -7
- package/fesm2022/mintplayer-ng-bootstrap-list-group.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-markdown.mjs +12 -12
- package/fesm2022/mintplayer-ng-bootstrap-markdown.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-marquee.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-marquee.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-modal.mjs +24 -24
- package/fesm2022/mintplayer-ng-bootstrap-modal.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs +24 -24
- package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs +5 -5
- package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs +58 -58
- package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-navigation-lock.mjs +8 -8
- package/fesm2022/mintplayer-ng-bootstrap-navigation-lock.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-no-noscript.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-no-noscript.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs +40 -40
- package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-ordinal-number.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-ordinal-number.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs +12 -12
- package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-parallax.mjs +6 -6
- package/fesm2022/mintplayer-ng-bootstrap-parallax.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs +7 -7
- package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs +5 -5
- package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-popover.mjs +20 -20
- package/fesm2022/mintplayer-ng-bootstrap-popover.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs +30 -30
- package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs +17 -17
- package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-range.mjs +9 -9
- package/fesm2022/mintplayer-ng-bootstrap-range.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-rating.mjs +7 -7
- package/fesm2022/mintplayer-ng-bootstrap-rating.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs +25 -25
- package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs +16 -16
- package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs +14 -14
- package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs +24 -24
- package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-select.mjs +19 -19
- package/fesm2022/mintplayer-ng-bootstrap-select.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-select2.mjs +20 -20
- package/fesm2022/mintplayer-ng-bootstrap-select2.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-shell.mjs +11 -11
- package/fesm2022/mintplayer-ng-bootstrap-shell.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs +7 -7
- package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-slugify.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-slugify.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-spinner.mjs +7 -7
- package/fesm2022/mintplayer-ng-bootstrap-spinner.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-split-string.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-split-string.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-sticky-footer.mjs +6 -6
- package/fesm2022/mintplayer-ng-bootstrap-sticky-footer.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs +57 -67
- package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-table.mjs +10 -10
- package/fesm2022/mintplayer-ng-bootstrap-table.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs +8 -8
- package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-toast.mjs +24 -24
- package/fesm2022/mintplayer-ng-bootstrap-toast.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs +22 -22
- package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs +10 -10
- package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs +14 -14
- package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-trust-html.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-trust-html.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs +10 -10
- package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-uc-first.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-uc-first.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-user-agent.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-user-agent.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-viewport.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-viewport.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs +10 -10
- package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler-core.mjs +1356 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler-core.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs +3819 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs +731 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs +549 -0
- package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-bootstrap-word-count.mjs +3 -3
- package/fesm2022/mintplayer-ng-bootstrap-word-count.mjs.map +1 -1
- package/package.json +20 -6
- package/types/mintplayer-ng-bootstrap-dock.d.ts +55 -19
- package/types/mintplayer-ng-bootstrap-scheduler.d.ts +2 -2
- package/types/mintplayer-ng-bootstrap-tab-control.d.ts +7 -11
- package/types/mintplayer-ng-bootstrap-web-components-scheduler-core.d.ts +890 -0
- package/types/mintplayer-ng-bootstrap-web-components-scheduler.d.ts +354 -0
- package/types/mintplayer-ng-bootstrap-web-components-splitter.d.ts +165 -0
- package/types/mintplayer-ng-bootstrap-web-components-tab-control.d.ts +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-bootstrap-web-components-splitter.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/types/resize-operation.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/state/splitter-state.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/input/pointer-event.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/input/input-handler.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/managers/resize-manager.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/styles/splitter.styles.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/components/mp-splitter.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/src/index.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/splitter/mintplayer-ng-bootstrap-web-components-splitter.ts"],"sourcesContent":["import type { Point } from './point';\n\nexport enum ResizeState {\n Idle = 'idle',\n Resizing = 'resizing',\n}\n\nexport interface ResizeOperation {\n state: ResizeState;\n startPosition: Point;\n sizes: number[];\n indexBefore: number;\n indexAfter: number;\n dividerElement: HTMLElement | null;\n}\n","import type { Direction, ResizeOperation } from '../types';\nimport { ResizeState } from '../types';\n\nexport interface SplitterState {\n orientation: Direction;\n panelSizes: number[];\n previewSizes: number[] | null;\n resizeOperation: ResizeOperation | null;\n}\n\nexport type SplitterStateListener = (state: SplitterState) => void;\n\nexport class SplitterStateManager {\n private state: SplitterState;\n private listeners: Set<SplitterStateListener> = new Set();\n\n constructor(initialState?: Partial<SplitterState>) {\n this.state = {\n orientation: 'horizontal',\n panelSizes: [],\n previewSizes: null,\n resizeOperation: null,\n ...initialState,\n };\n }\n\n getState(): SplitterState {\n return { ...this.state };\n }\n\n subscribe(listener: SplitterStateListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notifyListeners(): void {\n const stateCopy = this.getState();\n for (const listener of this.listeners) {\n listener(stateCopy);\n }\n }\n\n setOrientation(orientation: Direction): void {\n if (this.state.orientation !== orientation) {\n this.state = { ...this.state, orientation };\n this.notifyListeners();\n }\n }\n\n setPanelSizes(sizes: number[]): void {\n this.state = { ...this.state, panelSizes: [...sizes] };\n this.notifyListeners();\n }\n\n setPreviewSizes(sizes: number[] | null): void {\n this.state = { ...this.state, previewSizes: sizes ? [...sizes] : null };\n this.notifyListeners();\n }\n\n startResize(operation: ResizeOperation): void {\n this.state = {\n ...this.state,\n resizeOperation: { ...operation },\n };\n this.notifyListeners();\n }\n\n updateResize(previewSizes: number[]): void {\n this.state = {\n ...this.state,\n previewSizes: [...previewSizes],\n };\n this.notifyListeners();\n }\n\n endResize(finalSizes: number[]): void {\n this.state = {\n ...this.state,\n panelSizes: [...finalSizes],\n previewSizes: null,\n resizeOperation: null,\n };\n this.notifyListeners();\n }\n\n cancelResize(): void {\n this.state = {\n ...this.state,\n previewSizes: null,\n resizeOperation: null,\n };\n this.notifyListeners();\n }\n\n isResizing(): boolean {\n return this.state.resizeOperation?.state === ResizeState.Resizing;\n }\n}\n","import type { Point } from '../types';\n\nexport interface NormalizedPointerEvent {\n clientX: number;\n clientY: number;\n point: Point;\n originalEvent: MouseEvent | TouchEvent;\n isTouch: boolean;\n}\n\nexport function normalizePointerEvent(\n event: MouseEvent | TouchEvent\n): NormalizedPointerEvent {\n const isTouch = 'touches' in event;\n\n let clientX: number;\n let clientY: number;\n\n if (isTouch) {\n const touch = (event as TouchEvent).touches[0] || (event as TouchEvent).changedTouches[0];\n clientX = touch.clientX;\n clientY = touch.clientY;\n } else {\n clientX = (event as MouseEvent).clientX;\n clientY = (event as MouseEvent).clientY;\n }\n\n return {\n clientX,\n clientY,\n point: { x: clientX, y: clientY },\n originalEvent: event,\n isTouch,\n };\n}\n","import type { NormalizedPointerEvent } from './pointer-event';\nimport { normalizePointerEvent } from './pointer-event';\n\nexport interface InputHandlerCallbacks {\n onResizeStart: (event: NormalizedPointerEvent, dividerIndex: number, dividerElement: HTMLElement) => void;\n onResizeMove: (event: NormalizedPointerEvent) => void;\n onResizeEnd: (event: NormalizedPointerEvent) => void;\n}\n\nexport class InputHandler {\n private isActive = false;\n private currentDividerIndex = -1;\n private currentDividerElement: HTMLElement | null = null;\n private callbacks: InputHandlerCallbacks;\n\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n private boundTouchMove: (e: TouchEvent) => void;\n private boundTouchEnd: (e: TouchEvent) => void;\n\n constructor(callbacks: InputHandlerCallbacks) {\n this.callbacks = callbacks;\n\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundMouseUp = this.handleMouseUp.bind(this);\n this.boundTouchMove = this.handleTouchMove.bind(this);\n this.boundTouchEnd = this.handleTouchEnd.bind(this);\n }\n\n attachDividerListeners(divider: HTMLElement, index: number): void {\n divider.addEventListener('mousedown', (e) => this.handleMouseDown(e, index, divider));\n divider.addEventListener('touchstart', (e) => this.handleTouchStart(e, index, divider), { passive: false });\n }\n\n private handleMouseDown(event: MouseEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n event.preventDefault();\n this.startResize(event, dividerIndex, dividerElement);\n\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n }\n\n private handleMouseMove(event: MouseEvent): void {\n if (!this.isActive) return;\n event.preventDefault();\n this.callbacks.onResizeMove(normalizePointerEvent(event));\n }\n\n private handleMouseUp(event: MouseEvent): void {\n if (!this.isActive) return;\n this.endResize(event);\n\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n }\n\n private handleTouchStart(event: TouchEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n event.preventDefault();\n this.startResize(event, dividerIndex, dividerElement);\n\n document.addEventListener('touchmove', this.boundTouchMove, { passive: false });\n document.addEventListener('touchend', this.boundTouchEnd);\n document.addEventListener('touchcancel', this.boundTouchEnd);\n }\n\n private handleTouchMove(event: TouchEvent): void {\n if (!this.isActive) return;\n event.preventDefault();\n this.callbacks.onResizeMove(normalizePointerEvent(event));\n }\n\n private handleTouchEnd(event: TouchEvent): void {\n if (!this.isActive) return;\n this.endResize(event);\n\n document.removeEventListener('touchmove', this.boundTouchMove);\n document.removeEventListener('touchend', this.boundTouchEnd);\n document.removeEventListener('touchcancel', this.boundTouchEnd);\n }\n\n private startResize(event: MouseEvent | TouchEvent, dividerIndex: number, dividerElement: HTMLElement): void {\n this.isActive = true;\n this.currentDividerIndex = dividerIndex;\n this.currentDividerElement = dividerElement;\n this.callbacks.onResizeStart(normalizePointerEvent(event), dividerIndex, dividerElement);\n }\n\n private endResize(event: MouseEvent | TouchEvent): void {\n this.callbacks.onResizeEnd(normalizePointerEvent(event));\n this.isActive = false;\n this.currentDividerIndex = -1;\n this.currentDividerElement = null;\n }\n\n dispose(): void {\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n\n document.removeEventListener('touchmove', this.boundTouchMove);\n document.removeEventListener('touchend', this.boundTouchEnd);\n document.removeEventListener('touchcancel', this.boundTouchEnd);\n\n this.isActive = false;\n this.currentDividerIndex = -1;\n this.currentDividerElement = null;\n }\n\n getIsActive(): boolean {\n return this.isActive;\n }\n}\n","import type { Direction, Point, ResizeOperation } from '../types';\nimport { ResizeState } from '../types';\n\nexport interface ResizeManagerOptions {\n minPanelSize?: number;\n}\n\nexport class ResizeManager {\n private options: Required<ResizeManagerOptions>;\n\n constructor(options: ResizeManagerOptions = {}) {\n this.options = {\n minPanelSize: options.minPanelSize ?? 50,\n };\n }\n\n computePanelSizes(\n panels: HTMLElement[],\n orientation: Direction\n ): number[] {\n return panels.map((panel) => {\n const rect = panel.getBoundingClientRect();\n return orientation === 'horizontal' ? rect.width : rect.height;\n });\n }\n\n createResizeOperation(\n startPoint: Point,\n currentSizes: number[],\n dividerIndex: number,\n dividerElement: HTMLElement\n ): ResizeOperation {\n return {\n state: ResizeState.Resizing,\n startPosition: { ...startPoint },\n sizes: [...currentSizes],\n indexBefore: dividerIndex,\n indexAfter: dividerIndex + 1,\n dividerElement,\n };\n }\n\n calculatePreviewSizes(\n operation: ResizeOperation,\n currentPoint: Point,\n orientation: Direction\n ): number[] {\n const { startPosition, sizes, indexBefore, indexAfter } = operation;\n const delta =\n orientation === 'horizontal'\n ? currentPoint.x - startPosition.x\n : currentPoint.y - startPosition.y;\n\n const newSizes = [...sizes];\n const sizeBefore = sizes[indexBefore];\n const sizeAfter = sizes[indexAfter];\n\n let newSizeBefore = sizeBefore + delta;\n let newSizeAfter = sizeAfter - delta;\n\n // Apply minimum size constraints\n if (newSizeBefore < this.options.minPanelSize) {\n const adjustment = this.options.minPanelSize - newSizeBefore;\n newSizeBefore = this.options.minPanelSize;\n newSizeAfter -= adjustment;\n }\n\n if (newSizeAfter < this.options.minPanelSize) {\n const adjustment = this.options.minPanelSize - newSizeAfter;\n newSizeAfter = this.options.minPanelSize;\n newSizeBefore -= adjustment;\n }\n\n // Final clamp\n newSizeBefore = Math.max(newSizeBefore, this.options.minPanelSize);\n newSizeAfter = Math.max(newSizeAfter, this.options.minPanelSize);\n\n newSizes[indexBefore] = newSizeBefore;\n newSizes[indexAfter] = newSizeAfter;\n\n return newSizes;\n }\n\n setMinPanelSize(size: number): void {\n this.options.minPanelSize = size;\n }\n\n getMinPanelSize(): number {\n return this.options.minPanelSize;\n }\n}\n","// AUTO-GENERATED — do not edit by hand.\n// Source: splitter.styles.scss\n// Regenerate with the codegen-wc Nx target.\n\nimport { unsafeCSS } from 'lit';\n\nexport const splitterStyles = unsafeCSS(`:host {\n display: block;\n width: 100%;\n height: 100%;\n --mp-splitter-size: 8px;\n --mp-splitter-thumb-margin: 3px;\n --mp-splitter-divider-color: #eee;\n --mp-splitter-divider-hover-color: #1389fd;\n}\n\n:host([touch-mode]) {\n --mp-splitter-thumb-margin: 20px;\n}\n\n* {\n box-sizing: border-box;\n}\n\n.splitter-container {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.splitter-container.horizontal {\n flex-direction: row;\n}\n\n.splitter-container.vertical {\n flex-direction: column;\n}\n\n.panel-wrapper {\n overflow: hidden;\n position: relative;\n}\n\n.panel-wrapper.flex-grow {\n flex: 1 1 0;\n}\n\n/* Divider base styles */\n.divider {\n flex-shrink: 0;\n transition: background-color 0.15s ease-in-out;\n z-index: 3;\n touch-action: none;\n}\n\n.divider::before {\n content: \"\";\n display: block;\n background-color: var(--mp-splitter-divider-color);\n background-position: center center;\n background-repeat: no-repeat;\n}\n\n.divider:hover::before,\n.divider.active::before {\n background-color: var(--mp-splitter-divider-hover-color);\n border-radius: calc(var(--mp-splitter-size) / 2);\n}\n\n/* Horizontal splitter styles */\n.splitter-container.horizontal > .divider {\n width: calc(var(--mp-splitter-size) + 2 * var(--mp-splitter-thumb-margin));\n height: 100%;\n cursor: col-resize;\n border-left: var(--mp-splitter-thumb-margin) solid transparent;\n border-right: var(--mp-splitter-thumb-margin) solid transparent;\n}\n\n.splitter-container.horizontal > .divider::before {\n height: 100%;\n width: var(--mp-splitter-size);\n margin: 0 auto;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==);\n}\n\n.splitter-container.horizontal > .panel-wrapper:not(:first-child) {\n margin-left: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n.splitter-container.horizontal > .panel-wrapper:not(:last-child) {\n margin-right: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n/* Vertical splitter styles */\n.splitter-container.vertical > .divider {\n width: 100%;\n height: calc(var(--mp-splitter-size) + 2 * var(--mp-splitter-thumb-margin));\n cursor: row-resize;\n border-top: var(--mp-splitter-thumb-margin) solid transparent;\n border-bottom: var(--mp-splitter-thumb-margin) solid transparent;\n}\n\n.splitter-container.vertical > .divider::before {\n height: var(--mp-splitter-size);\n width: 100%;\n margin: auto 0;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFCAMAAABl/6zIAAAABlBMVEUAAADMzMzIT8AyAAAAAXRSTlMAQObYZgAAABRJREFUeAFjYGRkwIMJSeMHlBkOABP7AEGzSuPKAAAAAElFTkSuQmCC);\n}\n\n.splitter-container.vertical > .panel-wrapper:not(:first-child) {\n margin-top: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n.splitter-container.vertical > .panel-wrapper:not(:last-child) {\n margin-bottom: calc(-1 * var(--mp-splitter-thumb-margin));\n}\n\n/* Resizing state */\n:host([resizing]) .splitter-container {\n cursor: col-resize;\n user-select: none;\n}\n\n:host([resizing]) .splitter-container.vertical {\n cursor: row-resize;\n}\n\n/* Slot content styling */\n::slotted(*) {\n width: 100%;\n height: 100%;\n}`);\nexport default splitterStyles;\n","import { LitElement, html, type TemplateResult } from 'lit';\nimport { SplitterStateManager } from '../state';\nimport { InputHandler } from '../input';\nimport { ResizeManager } from '../managers';\nimport { splitterStyles } from '../styles';\nimport type { Direction, Point } from '../types';\n\nexport interface SplitterResizeEventDetail {\n sizes: number[];\n orientation: Direction;\n}\n\nexport class MpSplitter extends LitElement {\n static override styles = [splitterStyles];\n\n static override get observedAttributes(): string[] {\n return [\n ...(super.observedAttributes ?? []),\n 'orientation',\n 'min-panel-size',\n 'touch-mode',\n ];\n }\n\n private stateManager: SplitterStateManager;\n private inputHandler: InputHandler;\n private resizeManager: ResizeManager;\n\n private container: HTMLDivElement | null = null;\n private panelWrappers: HTMLDivElement[] = [];\n private dividers: HTMLDivElement[] = [];\n private slotElement: HTMLSlotElement | null = null;\n\n private mutationObserver: MutationObserver | null = null;\n private containerResizeObserver: ResizeObserver | null = null;\n private unsubscribeState: (() => void) | null = null;\n\n constructor() {\n super();\n\n this.stateManager = new SplitterStateManager();\n this.resizeManager = new ResizeManager();\n\n this.inputHandler = new InputHandler({\n onResizeStart: this.handleResizeStart.bind(this),\n onResizeMove: this.handleResizeMove.bind(this),\n onResizeEnd: this.handleResizeEnd.bind(this),\n });\n }\n\n override render(): TemplateResult {\n return html`\n <div class=\"splitter-container\"></div>\n <slot></slot>\n `;\n }\n\n protected override firstUpdated(): void {\n this.container = this.shadowRoot!.querySelector('.splitter-container') as HTMLDivElement;\n this.container.classList.add(this.orientation);\n\n this.slotElement = this.shadowRoot!.querySelector('slot') as HTMLSlotElement;\n // Hide the default slot - we'll project content ourselves via named slots.\n this.slotElement.style.display = 'none';\n this.slotElement.addEventListener('slotchange', () => {\n this.updatePanelsFromSlot();\n });\n\n this.setupMutationObserver();\n this.subscribeToState();\n this.setupContainerResizeObserver();\n\n // Initial setup after first render\n requestAnimationFrame(() => {\n this.updatePanelsFromSlot();\n });\n }\n\n override disconnectedCallback(): void {\n this.inputHandler.dispose();\n\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n\n if (this.containerResizeObserver) {\n this.containerResizeObserver.disconnect();\n this.containerResizeObserver = null;\n }\n\n if (this.unsubscribeState) {\n this.unsubscribeState();\n this.unsubscribeState = null;\n }\n super.disconnectedCallback();\n }\n\n override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue === newValue) return;\n\n switch (name) {\n case 'orientation':\n this.stateManager.setOrientation(\n (newValue as Direction) || 'horizontal'\n );\n this.updateContainerOrientation();\n break;\n case 'min-panel-size':\n const parsedSize = newValue ? parseInt(newValue, 10) : 50;\n this.resizeManager.setMinPanelSize(!isNaN(parsedSize) ? parsedSize : 50);\n break;\n case 'touch-mode':\n // Handled by CSS via :host([touch-mode])\n break;\n }\n }\n\n // Public API\n get orientation(): Direction {\n return (this.getAttribute('orientation') as Direction) || 'horizontal';\n }\n\n set orientation(value: Direction) {\n this.setAttribute('orientation', value);\n }\n\n get minPanelSize(): number {\n const attr = this.getAttribute('min-panel-size');\n return attr ? parseInt(attr, 10) : 50;\n }\n\n set minPanelSize(value: number) {\n this.setAttribute('min-panel-size', String(value));\n }\n\n get touchMode(): boolean {\n return this.hasAttribute('touch-mode');\n }\n\n set touchMode(value: boolean) {\n if (value) {\n this.setAttribute('touch-mode', '');\n } else {\n this.removeAttribute('touch-mode');\n }\n }\n\n getPanelSizes(): number[] {\n return this.stateManager.getState().panelSizes;\n }\n\n setPanelSizes(sizes: number[]): void {\n this.applyPanelSizes(sizes);\n this.stateManager.setPanelSizes(sizes);\n }\n\n // Private methods\n private setupMutationObserver(): void {\n this.mutationObserver = new MutationObserver(() => {\n this.updatePanelsFromSlot();\n });\n\n this.mutationObserver.observe(this, {\n childList: true,\n subtree: false,\n });\n }\n\n private subscribeToState(): void {\n this.unsubscribeState = this.stateManager.subscribe((state) => {\n if (state.resizeOperation) {\n this.setAttribute('resizing', '');\n } else {\n this.removeAttribute('resizing');\n }\n });\n }\n\n private updatePanelsFromSlot(): void {\n if (!this.container) return;\n\n const children = Array.from(this.children).filter(\n (child) => child instanceof HTMLElement\n ) as HTMLElement[];\n\n if (children.length === 0) return;\n\n // Clear existing wrappers and dividers\n this.container.innerHTML = '';\n this.panelWrappers = [];\n this.dividers = [];\n\n // Create panel wrappers with slots for each child\n children.forEach((child, index) => {\n const wrapper = document.createElement('div');\n wrapper.className = 'panel-wrapper flex-grow';\n\n // Create a named slot for this child\n const namedSlot = document.createElement('slot');\n const slotName = `panel-${index}`;\n namedSlot.name = slotName;\n child.slot = slotName;\n\n wrapper.appendChild(namedSlot);\n this.panelWrappers.push(wrapper);\n this.container!.appendChild(wrapper);\n\n // Add divider between panels\n if (index < children.length - 1) {\n const divider = document.createElement('div');\n divider.className = 'divider';\n this.inputHandler.attachDividerListeners(divider, index);\n this.dividers.push(divider);\n this.container!.appendChild(divider);\n }\n });\n\n // Re-apply previously-stored sizes when the panel count still matches.\n // Two cases where this matters:\n // 1. setPanelSizes() was called before firstUpdated's raf populated\n // the wrappers (e.g., the dock schedules its own raf inside\n // renderSplit) — without this, the early call is silently dropped.\n // 2. Slot children change after a drag (e.g., layout re-render) — the\n // wrappers get recreated with `flex: 1 1 0` (equal sizes) and would\n // otherwise discard the user's drag result.\n const storedSizes = this.stateManager.getState().panelSizes;\n if (storedSizes.length > 0 && storedSizes.length === this.panelWrappers.length) {\n this.applyPanelSizes(storedSizes);\n // Consumer-supplied sizes (e.g., from the dock's renderSplit) often\n // sum to the full container size because the consumer doesn't know\n // mp-splitter's internal divider widths. Defer one raf so dividers\n // have laid out, then rescale stored sizes against the actual panel\n // space (container - dividers). Without this step ResizeObserver\n // alone can't catch the discrepancy because the container size\n // hasn't changed — only the panel/divider split inside it has.\n requestAnimationFrame(() => this.handleContainerResize());\n return;\n }\n\n // No stored sizes (or count mismatch) — pin from the measured layout\n // once the browser has run layout for the new wrappers. A nested raf\n // is needed because the wrappers were created in this very turn and\n // their getBoundingClientRect would return 0 if read synchronously.\n requestAnimationFrame(() => {\n const current = this.stateManager.getState().panelSizes;\n if (current.length === this.panelWrappers.length && current.length > 0) {\n // A consumer (e.g., the dock) called setPanelSizes() between our\n // raf scheduling and execution. Honour their values instead of\n // overwriting with measurements.\n this.applyPanelSizes(current);\n return;\n }\n this.pinSizesFromCurrentLayout();\n });\n }\n\n /**\n * Read each panel-wrapper's measured pixel size and persist it as the\n * authoritative panel size. After this runs, every wrapper carries an\n * inline `width` (or `height`) — content intrinsic size cannot leak into\n * the parent flex container, so a nested splitter's drag does not shift\n * the parent's layout.\n */\n private pinSizesFromCurrentLayout(): void {\n if (this.panelWrappers.length === 0) return;\n const sizeProperty = this.orientation === 'horizontal' ? 'width' : 'height';\n const measured = this.panelWrappers.map(\n (wrapper) => wrapper.getBoundingClientRect()[sizeProperty]\n );\n // Layout hasn't run yet for these wrappers — bail rather than write\n // 0 px sizes that would collapse every panel.\n if (measured.every((v) => v <= 0)) return;\n this.applyPanelSizes(measured);\n this.stateManager.setPanelSizes(measured);\n }\n\n private setupContainerResizeObserver(): void {\n if (!this.container || typeof ResizeObserver === 'undefined') return;\n this.containerResizeObserver = new ResizeObserver(() => {\n this.handleContainerResize();\n });\n this.containerResizeObserver.observe(this.container);\n }\n\n /**\n * When the splitter's container resizes (window resize, parent splitter\n * pinning its sizes, etc.), scale every panel-wrapper proportionally so\n * the existing ratios are preserved. Without this we'd be stuck with the\n * original pixel sizes when the surrounding viewport changes — what\n * `flex-basis: 0` gave master \"for free\".\n */\n private handleContainerResize(): void {\n if (!this.container || this.panelWrappers.length === 0) return;\n // applyPanelSizes runs continuously during a drag; its writes can fire\n // ResizeObserver via subpixel rounding. The drag math already keeps\n // panels summing to the container — don't fight it.\n if (this.stateManager.isResizing()) return;\n\n const stored = this.stateManager.getState().panelSizes;\n if (stored.length === 0 || stored.length !== this.panelWrappers.length) return;\n\n const rect = this.container.getBoundingClientRect();\n const containerSize = this.orientation === 'horizontal' ? rect.width : rect.height;\n if (containerSize <= 0) return;\n\n const dividerProperty = this.orientation === 'horizontal' ? 'width' : 'height';\n const dividerTotal = this.dividers.reduce(\n (sum, divider) => sum + divider.getBoundingClientRect()[dividerProperty],\n 0\n );\n // Adjacent panel-wrappers carry negative margins (`margin-left` /\n // `margin-right` of `-thumb-margin`) so they visually overlap the\n // divider's transparent borders. In the flex calculation those negative\n // margins reduce a divider's effective width contribution; if we ignore\n // them we under-target by 2 * (N-1) * thumb px and the container gets\n // a gap at the trailing edge.\n const startMarginProp = this.orientation === 'horizontal' ? 'marginLeft' : 'marginTop';\n const endMarginProp = this.orientation === 'horizontal' ? 'marginRight' : 'marginBottom';\n const marginTotal = this.panelWrappers.reduce((sum, wrapper) => {\n const cs = getComputedStyle(wrapper);\n return sum + parseFloat(cs[startMarginProp]) + parseFloat(cs[endMarginProp]);\n }, 0);\n const targetPanelTotal = Math.max(0, containerSize - dividerTotal - marginTotal);\n const previousPanelTotal = stored.reduce((a, b) => a + b, 0);\n if (previousPanelTotal <= 0) return;\n\n // Below 1 px we'd be amplifying our own subpixel writes. Skip.\n if (Math.abs(targetPanelTotal - previousPanelTotal) < 1) return;\n\n const scale = targetPanelTotal / previousPanelTotal;\n const newSizes = stored.map((s) => s * scale);\n this.applyPanelSizes(newSizes);\n this.stateManager.setPanelSizes(newSizes);\n }\n\n private updateContainerOrientation(): void {\n if (!this.container) return;\n\n this.container.className = `splitter-container ${this.orientation}`;\n }\n\n private handleResizeStart(\n event: { point: Point; originalEvent: MouseEvent | TouchEvent },\n dividerIndex: number,\n dividerElement: HTMLElement\n ): void {\n const sizes = this.resizeManager.computePanelSizes(\n this.panelWrappers,\n this.orientation\n );\n\n const operation = this.resizeManager.createResizeOperation(\n event.point,\n sizes,\n dividerIndex,\n dividerElement\n );\n\n this.stateManager.startResize(operation);\n dividerElement.classList.add('active');\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resize-start', {\n bubbles: true,\n detail: {\n sizes,\n orientation: this.orientation,\n },\n })\n );\n }\n\n private handleResizeMove(event: {\n point: Point;\n originalEvent: MouseEvent | TouchEvent;\n }): void {\n const state = this.stateManager.getState();\n if (!state.resizeOperation) return;\n\n const previewSizes = this.resizeManager.calculatePreviewSizes(\n state.resizeOperation,\n event.point,\n this.orientation\n );\n\n this.stateManager.updateResize(previewSizes);\n this.applyPanelSizes(previewSizes);\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resizing', {\n bubbles: true,\n detail: {\n sizes: previewSizes,\n orientation: this.orientation,\n },\n })\n );\n }\n\n private handleResizeEnd(_event: {\n point: Point;\n originalEvent: MouseEvent | TouchEvent;\n }): void {\n const state = this.stateManager.getState();\n if (!state.resizeOperation) return;\n\n const finalSizes = state.previewSizes || state.resizeOperation.sizes;\n\n if (state.resizeOperation.dividerElement) {\n state.resizeOperation.dividerElement.classList.remove('active');\n }\n\n this.stateManager.endResize(finalSizes);\n\n this.dispatchEvent(\n new CustomEvent<SplitterResizeEventDetail>('resize-end', {\n bubbles: true,\n detail: {\n sizes: finalSizes,\n orientation: this.orientation,\n },\n })\n );\n }\n\n private applyPanelSizes(sizes: number[]): void {\n const sizeProperty = this.orientation === 'horizontal' ? 'width' : 'height';\n const resetProperty =\n this.orientation === 'horizontal' ? 'height' : 'width';\n\n this.panelWrappers.forEach((wrapper, index) => {\n if (sizes[index] !== undefined) {\n wrapper.style[sizeProperty] = `${sizes[index]}px`;\n wrapper.style[resetProperty] = '';\n wrapper.classList.remove('flex-grow');\n }\n });\n }\n}\n\n// Auto-register the custom element\nif (\n typeof customElements !== 'undefined' &&\n !customElements.get('mp-splitter')\n) {\n customElements.define('mp-splitter', MpSplitter);\n}\n","// Main component export\nexport { MpSplitter } from './components';\nexport type { SplitterResizeEventDetail } from './components';\n\n// State management\nexport { SplitterStateManager } from './state';\nexport type { SplitterState, SplitterStateListener } from './state';\n\n// Types\nexport type { Direction, Point, ResizeOperation, PanelInfo } from './types';\nexport { ResizeState } from './types';\n\n// Managers\nexport { ResizeManager } from './managers';\nexport type { ResizeManagerOptions } from './managers';\n\n// Input handling\nexport { InputHandler, normalizePointerEvent } from './input';\nexport type { InputHandlerCallbacks, NormalizedPointerEvent } from './input';\n\n// Styles (for custom styling extensions)\nexport { splitterStyles } from './styles';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
import { unsafeCSS, LitElement, html, nothing, css } from 'lit';
|
|
2
|
+
|
|
3
|
+
// AUTO-GENERATED — do not edit by hand.
|
|
4
|
+
// Source: tab-control.styles.scss
|
|
5
|
+
// Regenerate with the codegen-wc Nx target.
|
|
6
|
+
const tabControlStyles = unsafeCSS(`.nav {
|
|
7
|
+
--bs-nav-link-padding-x: 1rem;
|
|
8
|
+
--bs-nav-link-padding-y: 0.5rem;
|
|
9
|
+
--bs-nav-link-font-weight: ;
|
|
10
|
+
--bs-nav-link-color: var(--bs-link-color);
|
|
11
|
+
--bs-nav-link-hover-color: var(--bs-link-hover-color);
|
|
12
|
+
--bs-nav-link-disabled-color: var(--bs-secondary-color);
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-wrap: wrap;
|
|
15
|
+
padding-left: 0;
|
|
16
|
+
margin-bottom: 0;
|
|
17
|
+
list-style: none;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.nav-link {
|
|
21
|
+
display: block;
|
|
22
|
+
padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);
|
|
23
|
+
font-size: var(--bs-nav-link-font-size);
|
|
24
|
+
font-weight: var(--bs-nav-link-font-weight);
|
|
25
|
+
color: var(--bs-nav-link-color);
|
|
26
|
+
text-decoration: none;
|
|
27
|
+
background: none;
|
|
28
|
+
border: 0;
|
|
29
|
+
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
|
|
30
|
+
}
|
|
31
|
+
@media (prefers-reduced-motion: reduce) {
|
|
32
|
+
.nav-link {
|
|
33
|
+
transition: none;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
.nav-link:hover, .nav-link:focus {
|
|
37
|
+
color: var(--bs-nav-link-hover-color);
|
|
38
|
+
}
|
|
39
|
+
.nav-link:focus-visible {
|
|
40
|
+
outline: 0;
|
|
41
|
+
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
|
|
42
|
+
}
|
|
43
|
+
.nav-link.disabled, .nav-link:disabled {
|
|
44
|
+
color: var(--bs-nav-link-disabled-color);
|
|
45
|
+
pointer-events: none;
|
|
46
|
+
cursor: default;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.nav-tabs {
|
|
50
|
+
--bs-nav-tabs-border-width: var(--bs-border-width);
|
|
51
|
+
--bs-nav-tabs-border-color: var(--bs-border-color);
|
|
52
|
+
--bs-nav-tabs-border-radius: var(--bs-border-radius);
|
|
53
|
+
--bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);
|
|
54
|
+
--bs-nav-tabs-link-active-color: var(--bs-emphasis-color);
|
|
55
|
+
--bs-nav-tabs-link-active-bg: var(--bs-body-bg);
|
|
56
|
+
--bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);
|
|
57
|
+
border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);
|
|
58
|
+
}
|
|
59
|
+
.nav-tabs .nav-link {
|
|
60
|
+
margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));
|
|
61
|
+
border: var(--bs-nav-tabs-border-width) solid transparent;
|
|
62
|
+
border-top-left-radius: var(--bs-nav-tabs-border-radius);
|
|
63
|
+
border-top-right-radius: var(--bs-nav-tabs-border-radius);
|
|
64
|
+
}
|
|
65
|
+
.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
|
|
66
|
+
isolation: isolate;
|
|
67
|
+
border-color: var(--bs-nav-tabs-link-hover-border-color);
|
|
68
|
+
}
|
|
69
|
+
.nav-tabs .nav-link.active,
|
|
70
|
+
.nav-tabs .nav-item.show .nav-link {
|
|
71
|
+
color: var(--bs-nav-tabs-link-active-color);
|
|
72
|
+
background-color: var(--bs-nav-tabs-link-active-bg);
|
|
73
|
+
border-color: var(--bs-nav-tabs-link-active-border-color);
|
|
74
|
+
}
|
|
75
|
+
.nav-tabs .dropdown-menu {
|
|
76
|
+
margin-top: calc(-1 * var(--bs-nav-tabs-border-width));
|
|
77
|
+
border-top-left-radius: 0;
|
|
78
|
+
border-top-right-radius: 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.nav-pills {
|
|
82
|
+
--bs-nav-pills-border-radius: var(--bs-border-radius);
|
|
83
|
+
--bs-nav-pills-link-active-color: #fff;
|
|
84
|
+
--bs-nav-pills-link-active-bg: #0d6efd;
|
|
85
|
+
}
|
|
86
|
+
.nav-pills .nav-link {
|
|
87
|
+
border-radius: var(--bs-nav-pills-border-radius);
|
|
88
|
+
}
|
|
89
|
+
.nav-pills .nav-link.active,
|
|
90
|
+
.nav-pills .show > .nav-link {
|
|
91
|
+
color: var(--bs-nav-pills-link-active-color);
|
|
92
|
+
background-color: var(--bs-nav-pills-link-active-bg);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.nav-underline {
|
|
96
|
+
--bs-nav-underline-gap: 1rem;
|
|
97
|
+
--bs-nav-underline-border-width: 0.125rem;
|
|
98
|
+
--bs-nav-underline-link-active-color: var(--bs-emphasis-color);
|
|
99
|
+
gap: var(--bs-nav-underline-gap);
|
|
100
|
+
}
|
|
101
|
+
.nav-underline .nav-link {
|
|
102
|
+
padding-right: 0;
|
|
103
|
+
padding-left: 0;
|
|
104
|
+
border-bottom: var(--bs-nav-underline-border-width) solid transparent;
|
|
105
|
+
}
|
|
106
|
+
.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {
|
|
107
|
+
border-bottom-color: currentcolor;
|
|
108
|
+
}
|
|
109
|
+
.nav-underline .nav-link.active,
|
|
110
|
+
.nav-underline .show > .nav-link {
|
|
111
|
+
font-weight: 700;
|
|
112
|
+
color: var(--bs-nav-underline-link-active-color);
|
|
113
|
+
border-bottom-color: currentcolor;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.nav-fill > .nav-link,
|
|
117
|
+
.nav-fill .nav-item {
|
|
118
|
+
flex: 1 1 auto;
|
|
119
|
+
text-align: center;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.nav-justified > .nav-link,
|
|
123
|
+
.nav-justified .nav-item {
|
|
124
|
+
flex-grow: 1;
|
|
125
|
+
flex-basis: 0;
|
|
126
|
+
text-align: center;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.nav-fill .nav-item .nav-link,
|
|
130
|
+
.nav-justified .nav-item .nav-link {
|
|
131
|
+
width: 100%;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.tab-content > .tab-pane {
|
|
135
|
+
display: none;
|
|
136
|
+
}
|
|
137
|
+
.tab-content > .active {
|
|
138
|
+
display: block;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
:host {
|
|
142
|
+
display: flex;
|
|
143
|
+
flex-direction: column;
|
|
144
|
+
position: relative;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.flex-nowrap {
|
|
148
|
+
flex-wrap: nowrap;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.flex-grow-1 {
|
|
152
|
+
flex-grow: 1;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.overflow-auto {
|
|
156
|
+
overflow: auto;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.overflow-x-auto {
|
|
160
|
+
overflow-x: auto;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.overflow-y-hidden {
|
|
164
|
+
overflow-y: hidden;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.text-nowrap {
|
|
168
|
+
white-space: nowrap;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.border {
|
|
172
|
+
border: var(--bs-border-width, 1px) var(--bs-border-style, solid) var(--bs-border-color, #dee2e6) !important;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.border-top {
|
|
176
|
+
border-top: var(--bs-border-width, 1px) var(--bs-border-style, solid) var(--bs-border-color, #dee2e6) !important;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.tsc {
|
|
180
|
+
max-height: 41px;
|
|
181
|
+
overflow: hidden;
|
|
182
|
+
flex-shrink: 0;
|
|
183
|
+
z-index: 1;
|
|
184
|
+
}
|
|
185
|
+
.tsc .nav.nav-tabs {
|
|
186
|
+
margin-top: 0;
|
|
187
|
+
border-bottom: 0;
|
|
188
|
+
}
|
|
189
|
+
.tsc.bottom-tabs {
|
|
190
|
+
margin-top: -1px;
|
|
191
|
+
}
|
|
192
|
+
.tsc.bottom-tabs .nav.nav-tabs {
|
|
193
|
+
border-bottom-width: 0;
|
|
194
|
+
}
|
|
195
|
+
.tsc.bottom-tabs .nav.nav-tabs .nav-link {
|
|
196
|
+
border: 1px solid transparent;
|
|
197
|
+
border-top-left-radius: 0;
|
|
198
|
+
border-top-right-radius: 0;
|
|
199
|
+
border-bottom-left-radius: 0.25rem;
|
|
200
|
+
border-bottom-right-radius: 0.25rem;
|
|
201
|
+
}
|
|
202
|
+
.tsc.bottom-tabs .nav.nav-tabs .nav-item {
|
|
203
|
+
margin-bottom: 2px;
|
|
204
|
+
margin-top: -1px;
|
|
205
|
+
}
|
|
206
|
+
.tsc.bottom-tabs .nav.nav-tabs .nav-item.show .nav-link,
|
|
207
|
+
.tsc.bottom-tabs .nav.nav-tabs .nav-link.active {
|
|
208
|
+
border-color: #fff #dee2e6 #dee2e6 #dee2e6;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.tsc .nav-link {
|
|
212
|
+
cursor: pointer;
|
|
213
|
+
background: transparent;
|
|
214
|
+
font: inherit;
|
|
215
|
+
text-align: inherit;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.tsc .nav-link.disabled {
|
|
219
|
+
cursor: not-allowed;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.tab-content {
|
|
223
|
+
margin-top: -1px;
|
|
224
|
+
}`);
|
|
225
|
+
|
|
226
|
+
const isHidden = (el) => el.hasAttribute('data-hidden') &&
|
|
227
|
+
el.getAttribute('data-hidden') !== 'false';
|
|
228
|
+
/**
|
|
229
|
+
* <mp-tab-control>
|
|
230
|
+
*
|
|
231
|
+
* Bootstrap-styled tab strip. Pages live in named `${id}-content` slots and
|
|
232
|
+
* headers in `${id}-header` slots. The shadow DOM dynamically projects only
|
|
233
|
+
* the currently-active page via `<slot name="${activeId}-content">`, so
|
|
234
|
+
* inactive panels never enter the rendered tree.
|
|
235
|
+
*
|
|
236
|
+
* Authoring (vanilla):
|
|
237
|
+
*
|
|
238
|
+
* <mp-tab-control active-tab="overview">
|
|
239
|
+
* <span slot="overview-header">Overview</span>
|
|
240
|
+
* <div slot="overview-content">Hello</div>
|
|
241
|
+
* <span slot="details-header">Details</span>
|
|
242
|
+
* <div slot="details-content">Details body</div>
|
|
243
|
+
* </mp-tab-control>
|
|
244
|
+
*
|
|
245
|
+
* To mark a tab disabled, set `data-disabled` on the `*-content` element.
|
|
246
|
+
*
|
|
247
|
+
* Active state is **controlled by the host** — the host sets `active-tab` and
|
|
248
|
+
* listens for `tab-activate` events. The Angular wrapper (`bs-tab-control`)
|
|
249
|
+
* drives this via signals.
|
|
250
|
+
*/
|
|
251
|
+
class MpTabControl extends LitElement {
|
|
252
|
+
constructor() {
|
|
253
|
+
super(...arguments);
|
|
254
|
+
this.tabs = [];
|
|
255
|
+
this.mutationObserver = null;
|
|
256
|
+
}
|
|
257
|
+
static { this.styles = [tabControlStyles]; }
|
|
258
|
+
static get observedAttributes() {
|
|
259
|
+
return [
|
|
260
|
+
...(super.observedAttributes ?? []),
|
|
261
|
+
'tabs-position',
|
|
262
|
+
'border',
|
|
263
|
+
'active-tab',
|
|
264
|
+
'select-first-tab',
|
|
265
|
+
];
|
|
266
|
+
}
|
|
267
|
+
connectedCallback() {
|
|
268
|
+
super.connectedCallback();
|
|
269
|
+
// role="tablist" lives on the inner <ul> that directly contains the tab
|
|
270
|
+
// buttons — we deliberately don't repeat it on the host.
|
|
271
|
+
this.mutationObserver = new MutationObserver(() => this.refreshTabs());
|
|
272
|
+
this.mutationObserver.observe(this, {
|
|
273
|
+
childList: true,
|
|
274
|
+
subtree: false,
|
|
275
|
+
attributes: true,
|
|
276
|
+
attributeFilter: ['slot', 'data-disabled', 'data-hidden'],
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
disconnectedCallback() {
|
|
280
|
+
this.mutationObserver?.disconnect();
|
|
281
|
+
this.mutationObserver = null;
|
|
282
|
+
super.disconnectedCallback();
|
|
283
|
+
}
|
|
284
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
285
|
+
super.attributeChangedCallback(name, oldValue, newValue);
|
|
286
|
+
if (oldValue === newValue)
|
|
287
|
+
return;
|
|
288
|
+
this.requestUpdate();
|
|
289
|
+
}
|
|
290
|
+
firstUpdated() {
|
|
291
|
+
this.refreshTabs();
|
|
292
|
+
}
|
|
293
|
+
get tabsPosition() {
|
|
294
|
+
const v = this.getAttribute('tabs-position');
|
|
295
|
+
return v === 'bottom' ? 'bottom' : 'top';
|
|
296
|
+
}
|
|
297
|
+
get border() {
|
|
298
|
+
if (!this.hasAttribute('border'))
|
|
299
|
+
return 'full';
|
|
300
|
+
const v = this.getAttribute('border');
|
|
301
|
+
if (v === 'false')
|
|
302
|
+
return 'none';
|
|
303
|
+
if (v === 'top')
|
|
304
|
+
return 'top';
|
|
305
|
+
return 'full';
|
|
306
|
+
}
|
|
307
|
+
get selectFirstTab() {
|
|
308
|
+
return this.hasAttribute('select-first-tab')
|
|
309
|
+
? this.getAttribute('select-first-tab') !== 'false'
|
|
310
|
+
: true;
|
|
311
|
+
}
|
|
312
|
+
get activeTabId() {
|
|
313
|
+
return this.getAttribute('active-tab');
|
|
314
|
+
}
|
|
315
|
+
refreshTabs() {
|
|
316
|
+
const found = new Map();
|
|
317
|
+
for (const child of Array.from(this.children)) {
|
|
318
|
+
const slot = child.getAttribute('slot');
|
|
319
|
+
if (!slot)
|
|
320
|
+
continue;
|
|
321
|
+
const m = slot.match(/^(.+)-content$/);
|
|
322
|
+
if (!m)
|
|
323
|
+
continue;
|
|
324
|
+
// `data-hidden` excludes a tab from the strip and content entirely.
|
|
325
|
+
// Used by hosts (like the dock manager) to suppress a tab visually
|
|
326
|
+
// mid-drag without churning slot projection.
|
|
327
|
+
if (isHidden(child))
|
|
328
|
+
continue;
|
|
329
|
+
const tabId = m[1];
|
|
330
|
+
const disabled = child.hasAttribute('data-disabled') &&
|
|
331
|
+
child.getAttribute('data-disabled') !== 'false';
|
|
332
|
+
// First occurrence wins on duplicate slot names.
|
|
333
|
+
if (!found.has(tabId)) {
|
|
334
|
+
found.set(tabId, { tabId, disabled });
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
this.tabs = Array.from(found.values());
|
|
338
|
+
this.requestUpdate();
|
|
339
|
+
}
|
|
340
|
+
resolvedActiveTabId() {
|
|
341
|
+
const explicit = this.activeTabId;
|
|
342
|
+
if (explicit !== null &&
|
|
343
|
+
this.tabs.some((t) => t.tabId === explicit && !t.disabled)) {
|
|
344
|
+
return explicit;
|
|
345
|
+
}
|
|
346
|
+
if (!this.selectFirstTab)
|
|
347
|
+
return null;
|
|
348
|
+
const firstEnabled = this.tabs.find((t) => !t.disabled);
|
|
349
|
+
return firstEnabled?.tabId ?? null;
|
|
350
|
+
}
|
|
351
|
+
render() {
|
|
352
|
+
const activeId = this.resolvedActiveTabId();
|
|
353
|
+
const strip = html `
|
|
354
|
+
<div class="tsc${this.tabsPosition === 'bottom' ? ' bottom-tabs' : ''}">
|
|
355
|
+
<ul
|
|
356
|
+
class="nav nav-tabs flex-nowrap overflow-x-auto overflow-y-hidden"
|
|
357
|
+
role="tablist"
|
|
358
|
+
>
|
|
359
|
+
${this.tabs.map((tab) => this.renderTabHeader(tab, activeId))}
|
|
360
|
+
</ul>
|
|
361
|
+
</div>
|
|
362
|
+
`;
|
|
363
|
+
const borderMode = this.border;
|
|
364
|
+
const borderClass = borderMode === 'none'
|
|
365
|
+
? ''
|
|
366
|
+
: borderMode === 'top'
|
|
367
|
+
? ' border-top'
|
|
368
|
+
: activeId
|
|
369
|
+
? ' border'
|
|
370
|
+
: ' border-top';
|
|
371
|
+
const content = html `
|
|
372
|
+
<div
|
|
373
|
+
class="tab-content flex-grow-1 overflow-auto${borderClass}"
|
|
374
|
+
>
|
|
375
|
+
<slot name=${activeId ? `${activeId}-content` : '__none__'}></slot>
|
|
376
|
+
</div>
|
|
377
|
+
`;
|
|
378
|
+
return html `
|
|
379
|
+
${this.tabsPosition === 'top' ? strip : nothing}
|
|
380
|
+
${content}
|
|
381
|
+
${this.tabsPosition === 'bottom' ? strip : nothing}
|
|
382
|
+
`;
|
|
383
|
+
}
|
|
384
|
+
renderTabHeader(tab, activeId) {
|
|
385
|
+
const isActive = tab.tabId === activeId;
|
|
386
|
+
return html `
|
|
387
|
+
<li class="nav-item" role="presentation">
|
|
388
|
+
<button
|
|
389
|
+
type="button"
|
|
390
|
+
class="nav-link text-nowrap${isActive ? ' active' : ''}${tab.disabled
|
|
391
|
+
? ' disabled'
|
|
392
|
+
: ''}"
|
|
393
|
+
role="tab"
|
|
394
|
+
id=${`${tab.tabId}-header-button`}
|
|
395
|
+
aria-controls=${`${tab.tabId}-panel`}
|
|
396
|
+
aria-selected=${isActive ? 'true' : 'false'}
|
|
397
|
+
?disabled=${tab.disabled}
|
|
398
|
+
tabindex=${tab.disabled ? -1 : isActive ? 0 : -1}
|
|
399
|
+
@click=${(ev) => this.activate(tab, ev)}
|
|
400
|
+
@keydown=${(ev) => this.handleKeydown(tab, ev)}
|
|
401
|
+
>
|
|
402
|
+
<slot name=${`${tab.tabId}-header`}></slot>
|
|
403
|
+
</button>
|
|
404
|
+
</li>
|
|
405
|
+
`;
|
|
406
|
+
}
|
|
407
|
+
activate(tab, ev) {
|
|
408
|
+
if (tab.disabled)
|
|
409
|
+
return;
|
|
410
|
+
ev.preventDefault();
|
|
411
|
+
this.dispatchEvent(new CustomEvent('tab-activate', {
|
|
412
|
+
detail: { tabId: tab.tabId, originalEvent: ev },
|
|
413
|
+
bubbles: true,
|
|
414
|
+
composed: true,
|
|
415
|
+
}));
|
|
416
|
+
this.setAttribute('active-tab', tab.tabId);
|
|
417
|
+
}
|
|
418
|
+
handleKeydown(tab, ev) {
|
|
419
|
+
switch (ev.key) {
|
|
420
|
+
case 'Enter':
|
|
421
|
+
case ' ':
|
|
422
|
+
this.activate(tab, ev);
|
|
423
|
+
return;
|
|
424
|
+
case 'Home':
|
|
425
|
+
case 'End': {
|
|
426
|
+
ev.preventDefault();
|
|
427
|
+
const enabled = this.tabs.filter((t) => !t.disabled);
|
|
428
|
+
if (enabled.length === 0)
|
|
429
|
+
return;
|
|
430
|
+
const target = ev.key === 'Home' ? enabled[0] : enabled[enabled.length - 1];
|
|
431
|
+
this.moveFocusAndActivate(target, ev);
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
case 'ArrowLeft':
|
|
435
|
+
case 'ArrowRight': {
|
|
436
|
+
ev.preventDefault();
|
|
437
|
+
const dir = ev.key === 'ArrowRight' ? 1 : -1;
|
|
438
|
+
const enabled = this.tabs.filter((t) => !t.disabled);
|
|
439
|
+
if (enabled.length === 0)
|
|
440
|
+
return;
|
|
441
|
+
const currentIdx = enabled.findIndex((t) => t.tabId === tab.tabId);
|
|
442
|
+
const nextIdx = (currentIdx + dir + enabled.length) % enabled.length;
|
|
443
|
+
this.moveFocusAndActivate(enabled[nextIdx], ev);
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
moveFocusAndActivate(target, ev) {
|
|
449
|
+
this.setAttribute('active-tab', target.tabId);
|
|
450
|
+
const button = this.shadowRoot?.querySelector(`button[id="${target.tabId}-header-button"]`);
|
|
451
|
+
button?.focus();
|
|
452
|
+
this.dispatchEvent(new CustomEvent('tab-activate', {
|
|
453
|
+
detail: { tabId: target.tabId, originalEvent: ev },
|
|
454
|
+
bubbles: true,
|
|
455
|
+
composed: true,
|
|
456
|
+
}));
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
if (typeof customElements !== 'undefined' &&
|
|
460
|
+
!customElements.get('mp-tab-control')) {
|
|
461
|
+
customElements.define('mp-tab-control', MpTabControl);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* <mp-tab-page>
|
|
466
|
+
*
|
|
467
|
+
* Optional convenience wrapper for vanilla consumers. Sets `slot="${tabId}-content"`
|
|
468
|
+
* on itself based on its `tab-id` attribute, so the parent `<mp-tab-control>`
|
|
469
|
+
* picks it up via named-slot projection.
|
|
470
|
+
*
|
|
471
|
+
* Also mirrors `disabled` to `data-disabled` so the tab-control can read the
|
|
472
|
+
* disabled state without inspecting child types.
|
|
473
|
+
*
|
|
474
|
+
* Use directly:
|
|
475
|
+
*
|
|
476
|
+
* <mp-tab-control>
|
|
477
|
+
* <span slot="t1-header">Tab 1</span>
|
|
478
|
+
* <mp-tab-page tab-id="t1">Content 1</mp-tab-page>
|
|
479
|
+
* </mp-tab-control>
|
|
480
|
+
*
|
|
481
|
+
* Or skip this element entirely and put the slot/data-disabled attributes
|
|
482
|
+
* directly on whatever element holds your tab content:
|
|
483
|
+
*
|
|
484
|
+
* <mp-tab-control>
|
|
485
|
+
* <span slot="t1-header">Tab 1</span>
|
|
486
|
+
* <div slot="t1-content">Content 1</div>
|
|
487
|
+
* </mp-tab-control>
|
|
488
|
+
*/
|
|
489
|
+
class MpTabPage extends LitElement {
|
|
490
|
+
static { this.styles = css `
|
|
491
|
+
:host {
|
|
492
|
+
display: block;
|
|
493
|
+
}
|
|
494
|
+
`; }
|
|
495
|
+
static get observedAttributes() {
|
|
496
|
+
return [
|
|
497
|
+
...(super.observedAttributes ?? []),
|
|
498
|
+
'tab-id',
|
|
499
|
+
'disabled',
|
|
500
|
+
];
|
|
501
|
+
}
|
|
502
|
+
connectedCallback() {
|
|
503
|
+
super.connectedCallback();
|
|
504
|
+
this.syncSlot();
|
|
505
|
+
this.syncDisabled();
|
|
506
|
+
}
|
|
507
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
508
|
+
super.attributeChangedCallback(name, oldValue, newValue);
|
|
509
|
+
if (oldValue === newValue)
|
|
510
|
+
return;
|
|
511
|
+
if (name === 'tab-id')
|
|
512
|
+
this.syncSlot();
|
|
513
|
+
if (name === 'disabled')
|
|
514
|
+
this.syncDisabled();
|
|
515
|
+
}
|
|
516
|
+
syncSlot() {
|
|
517
|
+
const tabId = this.getAttribute('tab-id');
|
|
518
|
+
if (tabId) {
|
|
519
|
+
this.setAttribute('slot', `${tabId}-content`);
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
this.removeAttribute('slot');
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
syncDisabled() {
|
|
526
|
+
if (this.hasAttribute('disabled')) {
|
|
527
|
+
this.setAttribute('data-disabled', '');
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
this.removeAttribute('data-disabled');
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
render() {
|
|
534
|
+
return html `<slot></slot>`;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
if (typeof customElements !== 'undefined' &&
|
|
538
|
+
!customElements.get('mp-tab-page')) {
|
|
539
|
+
customElements.define('mp-tab-page', MpTabPage);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// Components
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Generated bundle index. Do not edit.
|
|
546
|
+
*/
|
|
547
|
+
|
|
548
|
+
export { MpTabControl, MpTabPage, tabControlStyles };
|
|
549
|
+
//# sourceMappingURL=mintplayer-ng-bootstrap-web-components-tab-control.mjs.map
|