@table-bro/native 0.0.0-stage → 1.1.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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -2
  3. package/THIRD_PARTY_NOTICES.md +69 -0
  4. package/dist/table-bro.native.d.ts +185 -0
  5. package/dist/table-bro.native.esm.js +113 -0
  6. package/dist/table-bro.native.esm.js.map +1 -0
  7. package/dist/table-bro.native.min.css +1 -0
  8. package/dist/table-bro.native.umd.js +113 -0
  9. package/dist/table-bro.native.umd.js.map +1 -0
  10. package/package.json +62 -4
  11. package/styles/_table-bro.api.scss +3 -0
  12. package/styles/_table-bro.native.api.scss +5 -0
  13. package/styles/mixins/_text-ellipsis.scss +5 -0
  14. package/styles/skin/shared/_variables.scss +94 -0
  15. package/styles/skin/shared/mixins/_custom-properties.scss +39 -0
  16. package/styles/skin/shared/mixins/_progress-bar.scss +27 -0
  17. package/styles/skin/shared/mixins/_shared.scss +87 -0
  18. package/styles/skin/shared/mixins/_skin-colors.scss +64 -0
  19. package/styles/skin/shared/mixins/_slide-toggle.scss +5 -0
  20. package/styles/skin/shared/mixins/_sort-header.scss +11 -0
  21. package/styles/skin/shared/mixins/_toolbar.scss +61 -0
  22. package/styles/skin/shared/table-bro/_details.scss +11 -0
  23. package/styles/skin/shared/table-bro/_filter-drawer.scss +62 -0
  24. package/styles/skin/shared/table-bro/_shadows.scss +19 -0
  25. package/styles/skin/shared/table-bro/_state.scss +38 -0
  26. package/styles/skin/shared/table-bro/_table.scss +70 -0
  27. package/styles/skin/shared/table-bro/_text-ellipsis.scss +14 -0
  28. package/styles/skin/vanilla-js/native/_themes.scss +45 -0
  29. package/styles/skin/vanilla-js/native/_variables.scss +54 -0
  30. package/styles/skin/vanilla-js/native/components/bootstrap-based/_paginator.scss +50 -0
  31. package/styles/skin/vanilla-js/native/components/bootstrap-based/_toolbar.scss +99 -0
  32. package/styles/skin/vanilla-js/native/table-bro/_button.scss +16 -0
  33. package/styles/skin/vanilla-js/native/table-bro/_filter-drawer.scss +10 -0
  34. package/styles/skin/vanilla-js/native/table-bro/_progress-bar.scss +24 -0
  35. package/styles/skin/vanilla-js/native/table-bro/_table.scss +16 -0
  36. package/styles/skin/vanilla-js/native/table-bro/_toolbar-search.scss +17 -0
  37. package/styles/skin/vanilla-js/native/table-bro/_toolbar.scss +19 -0
  38. package/styles/skin/vanilla-js/shared/_bootstrap-adapter.scss +9 -0
  39. package/styles/skin/vanilla-js/shared/_skin.scss +70 -0
  40. package/styles/skin/vanilla-js/shared/components/bootstrap-based/_button.scss +9 -0
  41. package/styles/skin/vanilla-js/shared/components/material-based/_paginator.scss +62 -0
  42. package/styles/skin/vanilla-js/shared/components/material-based/_sort-header.scss +134 -0
  43. package/styles/skin/vanilla-js/shared/components/material-based/_table.scss +11 -0
  44. package/styles/skin/vanilla-js/shared/table-bro/_filter-drawer.scss +13 -0
  45. package/styles/skin/vanilla-js/shared/table-bro/_paginator.scss +5 -0
  46. package/styles/skin/vanilla-js/shared/table-bro/_toolbar-search.scss +31 -0
  47. package/styles/skin/vanilla-js/shared/table-bro/_toolbar.scss +39 -0
  48. package/styles/skin/vanilla-js/shared/vendor-extensions/material-based/_paginator.scss +12 -0
  49. package/styles/table-bro.native.scss +43 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-bro.native.esm.js","names":["escape","escape","escape","escape","escape","escape","escape","escape","escape$8","BroHTML","BroSwitchComponent","BroHTMLElement","checked","input","name","escape$7","BroToolbarComponent","divClass","nodes","escape$6","BroToolbarMainComponent","ulClass","event","events","broToolbar","wrapper","broDropdown","createElement","className","iconHTML","buttonTitle","broButton","button","buttonEl","escape$5","BroButtonComponent","ariaLabel","content","dispatchAction","escape$4","BroTextEllipsisComponent","broCellSelectors","valueEl","text","tooltipEl","escape$3","BroSortHeaderComponent","classList","control","headerContainerEl","sort","container","oldValue","value","escape$2","sharedElements","texts","ul","liClass","aClass","currentValue","maxPageIndex","item","err","dropdown","pageSizeValueEl","disable","noPrevious","noNext","previousIndex","index","startIndex","pageSize","withSwitch","defineElement","element","defineSharedElements","definedElsewhere","defined","skinPackage","escape$1","BroNativeDropdownComponent","label","select","menu","keyboard","pending","send","options","option","BroNativeProgressBarComponent","indeterminate","escape","BroTagsComponent","items","i","fitCellItems","BroNativeTagsComponent","nativeSkinConfig","closeButton","searchButton","backButton","clearButton","registerSkin","withTags"],"sources":["../../shared/js/bootstrap-based/bro-switch.ts","../../shared/js/bootstrap-based/toolbar/bro-toolbar.ts","../../shared/js/bootstrap-based/toolbar/bro-toolbar-main.ts","../../shared/js/bro-button.ts","../../shared/js/bro-text-ellipsis.ts","../../shared/js/material-based/bro-sort-header.ts","../../shared/js/material-based/paginator/bro-paginator.ts","../../shared/js/define-shared-elements.ts","../js/bro-dropdown.native.ts","../js/bro-progress-bar.native.ts","../../shared/js/bro-tags.ts","../js/bro-tags.native.ts","../js/table-bro.native.config.ts","../js/table-bro.native.ts"],"sourcesContent":["import {type BroCol, type BroConfiguredElement, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroSkinComponents, type BroView} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\n/**\n * A switch of a boolean of a cell. A change sends the action of the attribute name, as the event action that the table\n * turns into bro-action with the column and the row (event: 'action' of the column); the title of the column names\n * the switch for screen readers.\n */\nexport class BroSwitchComponent extends BroHTMLElement implements BroView, BroConfiguredElement {\n template(): string {\n this.css = this.config.components.switch?.css;\n\n this.checked = this.getAttribute('checked');\n\n const checked = (this.checked === 'true');\n\n return `\n <div ${this.css ? `class=\"${escape(this.css.div.className)}\"` : ''}>\n <input type=\"checkbox\"\n ${this.css ? `class=\"${escape(this.css.div.input.className)}\"` : ''}\n role=\"switch\"\n ${checked ? ' checked' : ''}>\n </div>`;\n }\n\n config!: BroResolvedConfig;\n /** The column of the cell, which the table sets. */\n col?: BroCol;\n\n checked!: string | null;\n\n private css: NonNullable<BroSkinComponents['switch']>['css'];\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n events() {\n const input = <HTMLInputElement>this.querySelector('input');\n const name = this.getAttribute('name');\n\n input.setAttribute('aria-label', this.col?.title ?? '');\n\n input.addEventListener('change', () => {\n if (name) {\n this.dispatchEvent(new CustomEvent('action', {detail: name}));\n }\n });\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n this.events();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n}\n","import {type BroConfiguredElement, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroSkinComponents, type BroToolbarElement, type BroView} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroToolbarComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroToolbarElement {\n template(): string {\n this.css = <NonNullable<BroSkinComponents['toolbar']['css']>>this.config.components.toolbar.css;\n\n const divClass = this.css.nav.div?.className ? `${this.css.nav.div.className} ${this.contentClassName}` : this.contentClassName;\n\n return `\n <nav class=\"${escape(this.css.nav.className)}\">\n <div class=\"${escape(divClass)}\">\n <!-- toolbar content -->\n </div>\n </nav>`;\n }\n\n config!: BroResolvedConfig;\n contentClassName: string = 'bro-toolbar-content';\n\n // The vanilla skins give the classes of their toolbar\n private css!: NonNullable<BroSkinComponents['toolbar']['css']>;\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n }\n\n appendToolbarContent(...nodes: (Node | string)[]): void {\n if (!this.firstChild) {\n this.render();\n }\n\n this.querySelector(`.${this.contentClassName}`)\n ?.append(...nodes);\n }\n}\n","import {type BroButton, type BroConfiguredElement, type BroDropdown, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroSkinComponents, type BroToolbarMain, type BroView, events} from '@table-bro/core';\n\nimport type {BroToolbarComponent} from './bro-toolbar';\n\nconst {createElement, escape} = BroHTML;\n\nexport class BroToolbarMainComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroToolbarMain {\n template(): string {\n this.css = <NonNullable<BroSkinComponents['toolbarMain']['css']>>this.config.components.toolbarMain.css;\n\n this.toolbarTitle = this.config.toolbarTitle;\n\n const ulClass = this.css.navbarCollapse.ul.className ? `${this.css.navbarCollapse.ul.className} ${this.contentClassName}` : this.contentClassName;\n\n return `\n <!--bro-toolbar-->\n <span class=\"bro-toolbar-title-space\"></span>\n <span class=\"${escape(this.css.toolbarTitle.className)}\">${escape(this.toolbarTitle)}</span>\n\n <span class=\"bro-toolbar-space\"></span>\n\n <div class=\"${escape(this.css.navbarCollapse.className)} bro-toolbar-buttons\">\n <ul class=\"${escape(ulClass)}\">\n <!-- search-button -->\n <!-- buttons -->\n </ul>\n </div>\n <!--/bro-toolbar-->`;\n }\n\n config!: BroResolvedConfig;\n\n contentClassName: string = 'bro-navbar-nav';\n toolbarTitle!: string;\n\n // The vanilla skins give the classes of their toolbar\n private css!: NonNullable<BroSkinComponents['toolbarMain']['css']>;\n private navContentEl!: HTMLElement;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n events() {\n this.addEventListener('click', (event: Event) => {\n event.preventDefault();\n });\n\n const searchLink = this.navContentEl.children[0];\n\n searchLink.addEventListener('click', () => {\n this.dispatchEvent(\n new CustomEvent(events.toolbarEvent, {\n bubbles: true,\n composed: true,\n detail: events.toolbarSearchOpenEvent\n })\n );\n });\n }\n\n render(): void {\n // The toolbar element\n const broToolbar = document.createElement(this.config.components.toolbar.selector) as BroToolbarComponent;\n\n broToolbar.setAttribute('class', 'bro-toolbar');\n\n broToolbar.config = this.config;\n\n this.appendChild(broToolbar);\n\n // The template in the toolbar element\n const wrapper: HTMLElement = document.createElement('div');\n\n wrapper.insertAdjacentHTML('afterbegin', this.template());\n\n broToolbar.appendToolbarContent(\n ...Array.from(wrapper.children)\n );\n\n // The buttons\n this.appendToolbarContent(\n this.renderSearchButton(),\n\n ...this.renderButtons()\n );\n\n this.querySelectorAll(<string>this.config.components.dropdown?.selector).forEach(broDropdown => {\n broDropdown.replaceWith(broDropdown.children[0]);\n });\n\n this.events();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n appendToolbarContent(...nodes: (Node | string)[]): void {\n if (!this.navContentEl) {\n this.navContentEl = <HTMLElement>this.querySelector(`.${this.contentClassName}`);\n }\n\n this.navContentEl\n .append(...nodes);\n }\n\n private templateToolbarButton(buttonTitle: string, iconHTML?: string, className?: string): HTMLElement {\n return createElement(`\n <li class=\"${escape(this.css.navbarCollapse.ul.li.className)}\">\n <a class=\"${escape(this.css.navbarCollapse.ul.li.a.className)}${className ? ` ${escape(className)}` : ''}\" href=\"\">\n ${iconHTML || ''}${escape(buttonTitle)}\n </a>\n </li>`);\n }\n\n private renderSearchButton(): HTMLElement {\n const broButton = document.createElement(this.config.components.button.selector) as HTMLElement & BroButton;\n\n this.config.components.toolbarMain.beforeRender?.(broButton, this.config.texts.search);\n\n const buttonTitle = broButton.getAttribute('button-title') ?? '';\n\n return this.templateToolbarButton(buttonTitle, broButton.iconHTML, 'bro-toolbar-button-search');\n }\n\n private renderButtons(): HTMLElement[] {\n return (this.config.components.toolbarMain.buttons ?? []).map((button: BroButton | BroDropdown) => {\n if (button.mode === 'navbar-dropdown') {\n const broDropdown: HTMLElement = document.createElement(<string>this.config.components.dropdown?.selector);\n\n (<BroConfiguredElement>broDropdown).config = this.config;\n\n broDropdown.setAttribute('mode', 'navbar-dropdown');\n broDropdown.setAttribute('button-title', button.buttonTitle);\n broDropdown.setAttribute('options', JSON.stringify(button.options));\n\n // The menu sends the value of its option as a toolbar action. The toolbar puts the markup of the menu in place\n // of its element (render), so the element sends its value out of the DOM, and only its own listener hears it\n broDropdown.addEventListener('value', (event: Event) => {\n this.dispatchEvent(\n new CustomEvent(events.toolbarEvent, {\n bubbles: true,\n composed: true,\n detail: (<CustomEvent>event).detail\n })\n );\n });\n\n return broDropdown;\n } else {\n const buttonEl = this.templateToolbarButton(button.buttonTitle, button.iconHTML);\n\n // A config button sends its eventType as a toolbar action, as the Material toolbar does\n buttonEl.querySelector('a')?.addEventListener('click', () => {\n this.dispatchEvent(\n new CustomEvent(events.toolbarEvent, {\n bubbles: true,\n composed: true,\n detail: (<BroButton>button).eventType\n })\n );\n });\n\n return buttonEl;\n }\n });\n }\n}\n","import {type BroButton, BroHTML, BroHTMLElement, type BroView, dispatchAction} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroButtonComponent extends BroHTMLElement implements BroView, BroButton {\n template(): string {\n this.label = this.getAttribute('label') || '';\n\n this.buttonClassName = this.getAttribute('button-class');\n\n this.buttonTitle = this.getAttribute('button-title') || '';\n this.iconHTML = this.getAttribute('icon-html') || this.iconHTML;\n this.mode = <BroButton['mode']>this.getAttribute('mode') || 'button';\n\n this.eventType = this.getAttribute('event-type') || 'action';\n\n // A button with a title takes its name from the title; a button with an icon only takes the label.\n // The title and the name are text; the icon is the markup of the skin\n const className = this.buttonClassName ? ` class=\"${escape(this.buttonClassName)}\"` : '';\n const ariaLabel = (!this.buttonTitle && this.label) ? ` aria-label=\"${escape(this.label)}\"` : '';\n const content = `${escape(this.buttonTitle)}${this.iconHTML ? `${this.buttonTitle ? '&nbsp;' : ''}${this.iconHTML}` : ''}`;\n\n if (this.mode !== 'link') {\n return `\n <button${className}\n type=\"button\"${ariaLabel}>\n ${content}\n </button>`;\n } else {\n return `\n <a${className} href=\"\"\n role=\"button\"${ariaLabel}>\n ${content}\n </a>`;\n }\n }\n\n label!: string;\n buttonClassName!: string | null;\n buttonTitle!: string;\n iconHTML!: string;\n mode: BroButton['mode'];\n\n eventType!: string;\n\n events() {\n const buttonEl = this.children[0];\n\n buttonEl.addEventListener('click', (event: Event) => {\n dispatchAction(buttonEl, this.eventType);\n\n event.preventDefault();\n });\n\n // A link in the role of a button takes Space as a button does, instead of scrolling the page; Enter clicks a link anyway\n if (this.mode === 'link') {\n buttonEl.addEventListener('keydown', (event: Event) => {\n if ((<KeyboardEvent>event).key === ' ' && !(<KeyboardEvent>event).repeat) {\n event.preventDefault();\n\n (<HTMLElement>buttonEl).click();\n }\n });\n }\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n this.events();\n }\n\n connectedCallback(): void {\n if (!this.firstChild) {\n this.render();\n }\n }\n}\n","import {type BroCellElement, broCellSelectors, type BroCol, type BroConfiguredElement, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroRow, type BroTextEllipsis, type BroView} from '@table-bro/core';\n\nconst {escape, text} = BroHTML;\n\nexport class BroTextEllipsisComponent extends BroHTMLElement implements BroView, BroCellElement, BroConfiguredElement, BroTextEllipsis {\n template(): string {\n this.containerClassName = this.getAttribute('container-class');\n this.value = this.getAttribute('value') || '';\n\n return `\n <span class=\"${broCellSelectors.ellipsisContainer}${this.containerClassName ? ` ${escape(this.containerClassName)}` : ''}\">\n <span class=\"${broCellSelectors.ellipsis}\"></span>\n </span>`;\n }\n\n row?: BroRow;\n col?: BroCol;\n // The table sets the config before the element connects\n config!: BroResolvedConfig;\n\n containerClassName!: string | null;\n tooltip!: string;\n value!: string;\n\n /** Cleanup returned by afterRender of the skin, for example the removal of a tooltip. */\n private release?: void | (() => void);\n private released: boolean = false;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n const valueEl = <Element>this.querySelector(`.${broCellSelectors.ellipsis}`);\n\n // The value is markup only for a column with html: true\n if (this.col?.html) {\n valueEl.innerHTML = this.value;\n this.tooltip = text(this.value);\n } else {\n valueEl.textContent = this.value;\n this.tooltip = this.value;\n }\n\n this.afterRender();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n if (this.released) {\n this.released = false;\n\n this.afterRender();\n }\n\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n disconnectedCallback(): void {\n // A move connects the element again in the same task; only a removed element releases the skin callback\n queueMicrotask(() => {\n if (!this.isConnected) {\n if (typeof this.release === 'function') {\n this.release();\n }\n\n this.release = undefined;\n this.released = true;\n }\n });\n }\n\n private afterRender(): void {\n const tooltipEl = this.children[0];\n\n if (this.config.components.textEllipsis.afterRender) {\n this.release = this.config.components.textEllipsis.afterRender(tooltipEl, this.tooltip);\n }\n }\n}\n","import {type BroColSort, type BroConfiguredElement, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroSortDirection, type BroSortHeader, type BroView, dispatchAction, events} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroSortHeaderComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroSortHeader {\n template(): string {\n this.arrowPosition = <BroSortHeader['arrowPosition']>this.getAttribute('arrow-position') || 'after';\n this.sortId = this.getAttribute('sort-id') || '';\n this.dataType = this.getAttribute('data-type') || '';\n this.headerTitle = this.getAttribute('header-title') || '';\n this.iconHTML = this.getAttribute('icon-html') || '';\n this.tooltip = this.getAttribute('tooltip') || '';\n\n let classList: string = '';\n\n if (this.arrowPosition === 'before') {\n classList += ' bro-sort-header-position-before';\n }\n\n // The direction is descending by default\n classList += ' bro-sort-header-descending';\n\n // A control of the column header: Enter and Space sort, as a click does. A header without a title, as of a column\n // of buttons, sorts nothing and is no control, as in the mat skin\n const control = this.headerTitle ? ' role=\"button\" tabindex=\"0\"' : '';\n\n return `\n <div class=\"bro-sort-header-container${classList}\"${control}>\n <div class=\"bro-sort-header-content\">${escape(this.headerTitle)}</div>\n <div class=\"bro-sort-header-arrow\" aria-hidden=\"true\">${this.iconHTML}</div>\n </div>`;\n }\n\n static get observedAttributes(): string[] {\n return ['tooltip'];\n }\n\n config!: BroResolvedConfig;\n\n arrowPosition!: BroSortHeader['arrowPosition'];\n headerTitle!: string;\n dataType!: string;\n iconHTML!: string;\n sortId!: string;\n tooltip!: string;\n\n private _activeSort?: BroColSort;\n private direction: BroSortDirection | '' = '';\n /** Cleanup returned by afterRender of the skin, for example the removal of a tooltip. */\n private release?: void | (() => void);\n private released: boolean = false;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n events() {\n const headerContainerEl = <HTMLElement>this.children[0];\n\n if (!this.headerTitle) {\n return;\n }\n\n headerContainerEl.addEventListener('blur', () => {\n headerContainerEl.classList.remove('bro-sort-header-recently-cleared-ascending');\n });\n\n // The header is a button for the keyboard too: Enter and Space sort it as a click does\n headerContainerEl.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n\n headerContainerEl.click();\n }\n });\n\n headerContainerEl.addEventListener('click', () => {\n if (this.direction === '') {\n this.direction = 'desc';\n\n headerContainerEl.classList.add('bro-sort-header-sorted');\n\n headerContainerEl.classList.remove('bro-sort-header-recently-cleared-ascending');\n } else if (this.direction === 'desc') {\n this.direction = 'asc';\n\n headerContainerEl.classList.remove('bro-sort-header-descending');\n } else if (this.direction === 'asc') {\n this.direction = '';\n\n headerContainerEl.classList.remove('bro-sort-header-sorted');\n headerContainerEl.classList.add('bro-sort-header-descending');\n\n headerContainerEl.classList.add('bro-sort-header-recently-cleared-ascending');\n }\n\n // The third click clears the sort, as in the mat skin: sortDirection is undefined then\n dispatchAction(this, events.filtersSortEvent, {\n sortKey: this.sortId,\n sortDirection: this.direction || undefined\n });\n });\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n this.afterRender();\n\n this.events();\n }\n\n get activeSort(): BroColSort | undefined {\n return this._activeSort;\n }\n\n /** A sort of another column resets the arrow of this header. */\n set activeSort(sort: BroColSort) {\n this._activeSort = sort;\n\n const container = this.children[0];\n\n if (this.direction !== '' && sort?.sortKey !== this.sortId && container) {\n this.direction = '';\n\n container.classList.remove('bro-sort-header-sorted');\n container.classList.add('bro-sort-header-descending');\n }\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n if (this.released) {\n this.released = false;\n\n this.afterRender();\n }\n\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n disconnectedCallback(): void {\n // A move connects the element again in the same task; only a removed element releases the skin callback\n queueMicrotask(() => {\n if (!this.isConnected) {\n if (typeof this.release === 'function') {\n this.release();\n }\n\n this.release = undefined;\n this.released = true;\n }\n });\n }\n\n /** The table gives a new tooltip when the width of the column changes: the skin callback runs again with it. */\n attributeChangedCallback(name: string, oldValue: string | null, value: string | null): void {\n if (!this.rendered || oldValue === value) {\n return;\n }\n\n this.tooltip = value || '';\n\n if (typeof this.release === 'function') {\n this.release();\n }\n\n this.release = undefined;\n\n // A header out of the document gets the callback again when it is connected\n if (this.isConnected) {\n this.afterRender();\n } else {\n this.released = true;\n }\n }\n\n private afterRender(): void {\n const container = this.children[0];\n\n this.release = this.config.components.sortHeader.afterRender?.(container, this.tooltip);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {BroConfiguredElement, BroDropdownOption, BroPaginatorElement, BroPaginatorPageEvent, BroResolvedConfig, BroTexts, BroView} from '@table-bro/core';\nimport {BroHTML, BroHTMLElement} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroPaginatorComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroPaginatorElement {\n template(): string {\n this.disabled = this.getAttribute('disabled') === 'true' || false;\n this.length = Number(this.getAttribute('length')) || 0;\n this.pageIndex = Math.max(Number(this.getAttribute('page-index')) || 0, 0);\n this.pageSize = Number(this.getAttribute('page-size'));\n // The table writes 'true' or 'false'; without the attribute the buttons are shown\n this.showFirstLastButtons = this.getAttribute('show-first-last-buttons') !== 'false';\n\n this.parsePageSizeOptions();\n\n const texts = this.texts = this.config.texts;\n\n // The vanilla skins, which have this paginator, give the classes of its list and their dropdown\n const ul = this.config.components.paginator.css?.ul;\n // No class attribute for a class the skin does not give\n const ulClass = ul?.className ? ` class=\"${escape(ul.className)}\"` : '';\n const liClass = ul?.li?.className ? ` class=\"${escape(ul.li.className)}\"` : '';\n const aClass = ul?.li?.a?.className ? `${escape(ul.li.a.className)} ` : '';\n\n this.dropdownSelector = <string>this.config.components.dropdown?.selector;\n\n return `\n <div class=\"bro-paginator-outer-container\">\n <div class=\"bro-paginator-inner-container\">\n <div class=\"bro-paginator-page-size\">\n <div class=\"bro-paginator-page-size-label\">\n ${escape(texts.itemsPerPage)}\n </div>\n\n ${this.pageSizeDropdown?.length ? '' : this.templatePageSizeValue()}\n </div>\n\n <div class=\"bro-paginator-range-actions\">\n <div class=\"bro-paginator-range-label\" aria-live=\"polite\">\n ${escape(texts.rangeLabel(this.pageIndex, this.pageSize, this.length))}\n </div>\n\n <nav aria-label=\"${escape(texts.pageNavigation)}\">\n <ul${ulClass}>\n ${this.showFirstLastButtons\n ? `\n <li${liClass}>\n <a class=\"${aClass}bro-paginator-navigation-first\" href=\"\"\n aria-label=\"${escape(texts.firstPage)}\">${escape(texts.first)}</a>\n </li>`\n : ''\n }\n\n <li${liClass}>\n <a class=\"${aClass}bro-paginator-navigation-previous\" href=\"\"\n aria-label=\"${escape(texts.previousPage)}\">${escape(texts.previous)}</a>\n </li>\n\n <li${liClass}>\n <a class=\"${aClass}bro-paginator-navigation-next\" href=\"\"\n aria-label=\"${escape(texts.nextPage)}\">${escape(texts.next)}</a>\n </li>\n\n ${this.showFirstLastButtons\n ? `\n <li${liClass}>\n <a class=\"${aClass}bro-paginator-navigation-last\" href=\"\"\n aria-label=\"${escape(texts.lastPage)}\">${escape(texts.last)}</a>\n </li>`\n : ''\n }\n </ul>\n </nav>\n </div>\n </div>\n </div>`;\n }\n\n static get observedAttributes() {\n return [\n 'page-index', 'page-size', 'length',\n 'page-size-options', 'disabled'\n ];\n }\n\n // The table sets the config, and the template reads the other values from the attributes, before the element renders\n config!: BroResolvedConfig;\n\n disabled!: boolean;\n length!: number;\n pageIndex!: number;\n pageSize!: number;\n pageSizeOptions!: number[];\n showFirstLastButtons!: boolean;\n\n private page!: BroPaginatorPageEvent;\n private eventName = 'page';\n\n // The elements of the template of the paginator, found when it renders\n private firstEl!: HTMLElement;\n private previousEl!: HTMLElement;\n private nextEl!: HTMLElement;\n private lastEl!: HTMLElement;\n\n private pageSizeEl!: HTMLElement;\n private pageSizeValueEl!: HTMLElement;\n private rangeLabelEl!: HTMLElement;\n\n private dropdownSelector!: string;\n /** The texts of the table, taken at the render: before it the attributes change nothing. */\n private texts?: BroTexts;\n private pageSizeDropdown?: BroDropdownOption[];\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n events() {\n this.previousEl = <HTMLElement>this.querySelector('.bro-paginator-navigation-previous');\n this.nextEl = <HTMLElement>this.querySelector('.bro-paginator-navigation-next');\n\n this.previousEl.addEventListener('click', (event: Event) => {\n event.preventDefault();\n\n if (!this.hasPreviousPage()) {\n return;\n }\n\n this.navigate(this.pageIndex - 1);\n });\n\n this.nextEl.addEventListener('click', (event: Event) => {\n event.preventDefault();\n\n if (!this.hasNextPage()) {\n return;\n }\n\n this.navigate(this.pageIndex + 1);\n });\n\n if (this.showFirstLastButtons) {\n this.firstEl = <HTMLElement>this.querySelector('.bro-paginator-navigation-first');\n this.lastEl = <HTMLElement>this.querySelector('.bro-paginator-navigation-last');\n\n this.firstEl.addEventListener('click', (event: Event) => {\n event.preventDefault();\n\n if (!this.hasPreviousPage()) {\n return;\n }\n\n this.navigate(0);\n });\n\n this.lastEl.addEventListener('click', (event: Event) => {\n event.preventDefault();\n\n if (!this.hasNextPage()) {\n return;\n }\n\n this.navigate(this.getNumberOfPages() - 1);\n });\n }\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n // The list gets the config of the table before it connects\n if (this.pageSizeDropdown?.length) {\n this.pageSizeEl = <HTMLElement>this.querySelector('.bro-paginator-page-size');\n\n this.renderPageSizeDropdown();\n }\n\n this.events();\n\n this.renderNavigationState();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n attributeChangedCallback(name: string, previousValue: string, currentValue: string) {\n if (!this.texts) {\n return;\n }\n\n if (name === 'page-index' || name === 'page-size' || name === 'length') {\n if (!this.rangeLabelEl) {\n this.rangeLabelEl = <HTMLElement>this.querySelector('.bro-paginator-range-label');\n }\n\n if (!this.pageSizeValueEl) {\n this.pageSizeValueEl = <HTMLElement>this.querySelector('.bro-paginator-page-size-value');\n }\n\n if (name === 'page-index') {\n this.pageIndex = +currentValue;\n }\n\n if (name === 'page-size') {\n this.pageSize = +currentValue;\n\n if (!this.pageSizeOptions.length) {\n this.pageSizeValueEl.innerText = currentValue;\n }\n }\n\n if (name === 'length') {\n this.length = +currentValue;\n }\n\n this.rangeLabelEl.textContent = this.texts.rangeLabel(this.pageIndex, this.pageSize, this.length);\n\n this.renderNavigationState();\n }\n\n if (name === 'page-size-options') {\n this.parsePageSizeOptions();\n\n this.unrenderPageSizeControls();\n\n if (!this.pageSizeEl) {\n this.pageSizeEl = <HTMLElement>this.querySelector('.bro-paginator-page-size');\n }\n\n if (this.pageSizeDropdown?.length) {\n this.renderPageSizeDropdown();\n } else {\n this.renderPageSizeValue();\n\n this.setAttribute('disabled', true.toString());\n }\n }\n\n if (name === 'disabled') {\n this.setDisabledState(currentValue === true.toString());\n }\n }\n\n /** Whether there is a previous page. */\n hasPreviousPage(): boolean {\n return this.pageIndex >= 1 && this.pageSize != 0;\n }\n\n /** Whether there is a next page. */\n hasNextPage(): boolean {\n const maxPageIndex = this.getNumberOfPages() - 1;\n\n return this.pageIndex < maxPageIndex && this.pageSize != 0;\n }\n\n /** Calculate the number of pages */\n getNumberOfPages(): number {\n if (!this.pageSize) {\n return 0;\n }\n\n return Math.ceil(this.length / this.pageSize);\n }\n\n private parsePageSizeOptions() {\n if (!this.getAttribute('page-size-options')) {\n return;\n }\n\n try {\n this.pageSizeOptions = JSON.parse(<string>this.getAttribute('page-size-options'))\n .map((item: string) => +item);\n\n this.pageSizeDropdown = this.pageSizeOptions.map(item => {\n return {\n value: item.toString(),\n title: item.toString()\n };\n });\n } catch (err) {\n this.pageSizeOptions = [];\n\n if (this.config.debug) {\n console.log(err);\n }\n }\n }\n\n private templatePageSizeValue(): string {\n return `<div class=\"bro-paginator-page-size-value\">${this.pageSize}</div>`;\n }\n\n private unrenderPageSizeControls(): void {\n const dropdown = <HTMLElement>this.querySelector(this.dropdownSelector);\n\n if (dropdown) {\n dropdown.remove();\n }\n\n const pageSizeValueEl = <HTMLElement>this.querySelector('.bro-paginator-page-size-value');\n\n if (pageSizeValueEl) {\n pageSizeValueEl.remove();\n }\n }\n\n private renderPageSizeDropdown(): void {\n const broDropdown: HTMLElement = document.createElement(this.dropdownSelector);\n\n (<BroConfiguredElement>broDropdown).config = this.config;\n broDropdown.setAttribute('mode', 'select');\n broDropdown.setAttribute('button-title', this.pageSize.toString());\n broDropdown.setAttribute('options', JSON.stringify(this.pageSizeDropdown));\n broDropdown.setAttribute('label', this.texts!.itemsPerPage);\n\n this.eventsPageSize(broDropdown);\n\n this.pageSizeEl.append(\n broDropdown\n );\n }\n\n private eventsPageSize(broDropdown: Element) {\n broDropdown.addEventListener('value', (event: Event) => {\n const value: string = (<CustomEvent>event).detail;\n\n this.changePageSize(+value);\n\n this.setAttribute('page-size', value);\n });\n }\n\n private renderPageSizeValue(): void {\n this.pageSizeEl.insertAdjacentHTML('beforeend', this.templatePageSizeValue());\n }\n\n private setDisabledState(disable: boolean) {\n this.disabled = disable;\n\n const dropdown = <HTMLElement>this.querySelector(this.dropdownSelector);\n\n if (dropdown) {\n dropdown.setAttribute('disabled', disable.toString());\n }\n\n this.renderNavigationState();\n }\n\n /**\n * Disables the buttons of a disabled paginator, First and Previous on the first page, and Next and Last on the last\n * one, as MatPaginator does.\n */\n private renderNavigationState(): void {\n const noPrevious = this.disabled || !this.hasPreviousPage();\n const noNext = this.disabled || !this.hasNextPage();\n const buttons: [HTMLElement | undefined, boolean][] = [[this.firstEl, noPrevious], [this.previousEl, noPrevious], [this.nextEl, noNext], [this.lastEl, noNext]];\n\n buttons.forEach(([button, disable]) => {\n // The class shows the state, and aria-disabled tells it to screen readers\n if (disable) {\n button?.parentElement?.classList.add('disabled');\n button?.setAttribute('aria-disabled', 'true');\n } else {\n button?.parentElement?.classList.remove('disabled');\n button?.removeAttribute('aria-disabled');\n }\n });\n }\n\n /** Navigates to a specific page index. */\n private navigate(index: number) {\n const previousIndex = this.pageIndex;\n\n if (index !== previousIndex) {\n this.pageIndex = index;\n this.setAttribute('page-index', this.pageIndex.toString());\n this.emitPageEvent(previousIndex);\n }\n }\n\n /**\n * Changes the page size so that the first item displayed on the page will still be\n * displayed using the new page size.\n *\n * For example, if the page size is 10 and on the second page (items indexed 10-19) then\n * switching so that the page size is 5 will set the third page as the current page so\n * that the 10th item will still be displayed.\n */\n changePageSize(pageSize: number) {\n // Current page needs to be updated to reflect the new page size. Navigate to the page\n // containing the previous page's first item.\n const startIndex = this.pageIndex * this.pageSize;\n const previousIndex = this.pageIndex;\n\n this.pageIndex = Math.floor(startIndex / pageSize) || 0;\n this.pageSize = pageSize;\n this.emitPageEvent(previousIndex);\n }\n\n /** Emits an event notifying that a change of the paginator's properties has been triggered. */\n private emitPageEvent(previousPageIndex: number) {\n this.page = {\n previousPageIndex,\n pageIndex: this.pageIndex,\n pageSize: this.pageSize,\n length: this.length\n };\n\n this.dispatchEvent(\n new CustomEvent(this.eventName, {\n bubbles: true,\n composed: true,\n detail: this.page\n })\n );\n }\n}\n","import {BroSwitchComponent} from './bootstrap-based/bro-switch';\nimport {BroToolbarComponent} from './bootstrap-based/toolbar/bro-toolbar';\nimport {BroToolbarMainComponent} from './bootstrap-based/toolbar/bro-toolbar-main';\nimport {BroButtonComponent} from './bro-button';\nimport {BroTextEllipsisComponent} from './bro-text-ellipsis';\nimport {BroSortHeaderComponent} from './material-based/bro-sort-header';\nimport {BroPaginatorComponent} from './material-based/paginator/bro-paginator';\n\n/** The elements that the bs and nv skins share. */\nconst sharedElements: Record<string, CustomElementConstructor> = {\n 'bro-button': BroButtonComponent,\n 'bro-paginator': BroPaginatorComponent,\n 'bro-sort-header': BroSortHeaderComponent,\n 'bro-text-ellipsis': BroTextEllipsisComponent,\n 'bro-toolbar': BroToolbarComponent,\n 'bro-toolbar-main': BroToolbarMainComponent\n};\n\n/**\n * Defines the optional element bro-switch, a boolean of a column as a switch, unless it is defined; without a DOM, as\n * in the server render, it does nothing.\n */\nexport function withSwitch(): void {\n defineElement('bro-switch', BroSwitchComponent);\n}\n\n/** Defines an element of a skin unless it is defined: a second load of the bundle of the skin finds it defined. */\nexport function defineElement(name: string, element: CustomElementConstructor): void {\n if (typeof customElements !== 'undefined' && !customElements.get(name)) {\n customElements.define(name, element);\n }\n}\n\n/**\n * Defines the shared elements of a vanilla skin. Each skin bundle carries its own copy of them, so with two bundles\n * on one page the bundle loaded first defines them and the other skin works with its classes. Two vanilla skin\n * bundles on one page are not supported, so the skin loaded second warns about it.\n */\nexport function defineSharedElements(skinPackage: string): void {\n const definedElsewhere: string[] = [];\n\n Object.entries(sharedElements).forEach(([name, element]) => {\n const defined = customElements.get(name);\n\n if (!defined) {\n customElements.define(name, element);\n } else if (defined !== element) {\n definedElsewhere.push(name);\n }\n });\n\n if (definedElsewhere.length) {\n console.warn(`${skinPackage}: ${definedElsewhere.join(', ')} are already defined by another vanilla skin bundle, `\n + 'so this skin uses its elements. Load one vanilla skin bundle per page.');\n }\n}\n","import {type BroConfiguredElement, type BroDropdown, type BroDropdownOption, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroView} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroNativeDropdownComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroDropdown {\n template(): string {\n this.buttonTitle = this.getAttribute('button-title') || '';\n this.name = this.getAttribute('name') || 'action';\n this.mode = <BroDropdown['mode']>this.getAttribute('mode') || 'dropdown';\n\n try {\n this.options = JSON.parse(<string>this.getAttribute('options'));\n } catch (err) {\n this.options = [];\n\n if (this.config.debug) {\n console.log(err);\n }\n }\n\n // The select takes the name that the element gets, such as the label of the page size, else its title, as More\n const label = this.getAttribute('label') || this.buttonTitle;\n // The titles, the values and the names of the config are text in the markup\n const ariaLabel = label ? ` aria-label=\"${escape(label)}\"` : '';\n\n if (this.mode === 'select' || this.mode === 'dropdown') {\n return `\n <select name=\"${escape(this.name)}\"${ariaLabel}>\n <option value=\"\" hidden>${escape(this.buttonTitle)}</option>\n ${this.templateDropdown(this.options)}\n </select>`;\n } else {\n // navbar-dropdown\n return `\n <li class=\"bro-nav-item bro-dropdown\">\n <select name=\"${escape(this.name)}\"${ariaLabel}>\n <option value=\"\" hidden>${escape(this.buttonTitle)}</option>\n ${this.templateDropdown(this.options)}\n </select>\n </li>`;\n }\n }\n\n static get observedAttributes() {\n return [\n 'disabled'\n ];\n }\n\n config!: BroResolvedConfig;\n\n buttonTitle!: string;\n name!: string;\n\n mode!: BroDropdown['mode'];\n options!: BroDropdownOption[];\n\n private eventName = 'value';\n\n private dropdownToggleEl!: HTMLElement;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n /**\n * The select sends its value. A menu (navbar-dropdown) shows its title again after a choice, and acts only on a choice:\n * the keys of a closed select change its value on Windows, so a value that came from the keyboard waits for Enter.\n */\n events() {\n const select = <HTMLSelectElement>this.querySelector('select');\n const menu = (this.mode === 'navbar-dropdown');\n\n let keyboard = false;\n let pending: string | null = null;\n\n this.dropdownToggleEl = select;\n this.renderDisabled();\n\n const send = (value: string) => {\n pending = null;\n\n if (menu) {\n select.selectedIndex = 0;\n }\n\n this.dispatchEvent(\n new CustomEvent(this.eventName, {\n bubbles: true,\n composed: true,\n detail: value\n })\n );\n };\n\n if (menu) {\n select.addEventListener('pointerdown', () => {\n keyboard = false;\n });\n\n select.addEventListener('keydown', (event: KeyboardEvent) => {\n keyboard = (event.key !== 'Enter');\n\n if (event.key === 'Enter' && pending !== null) {\n send(pending);\n }\n });\n\n // A value that the keyboard chose and did not confirm leaves with the focus\n select.addEventListener('blur', () => {\n if (pending !== null) {\n pending = null;\n select.selectedIndex = 0;\n }\n });\n }\n\n select.addEventListener('change', () => {\n if (menu && keyboard) {\n pending = select.value;\n } else {\n send(select.value);\n }\n });\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n this.events();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n attributeChangedCallback(name: string) {\n // Before its render the element has no select: the render takes the attribute\n if (name === 'disabled' && this.dropdownToggleEl) {\n this.renderDisabled();\n }\n }\n\n private templateDropdown(options: BroDropdownOption[]): string {\n return `\n ${options.map((option: BroDropdownOption) => {\n if ('value' in option && 'title' in option) {\n return `\n <option value=\"${escape(option.value)}\">${escape(option.title)}</option>`;\n } else if ('divider' in option) {\n return `\n <hr>`;\n } else if ('header' in option) {\n return `\n <optgroup label=\"${escape(option.header)}\"></optgroup>`;\n }\n }).join('')}`;\n }\n\n /** The select is disabled by the attribute disabled=\"true\". */\n private renderDisabled(): void {\n this.dropdownToggleEl.toggleAttribute('disabled', this.getAttribute('disabled') === 'true');\n }\n}\n","import {type BroConfiguredElement, BroHTML, BroHTMLElement, type BroProgressBar, type BroProgressMode, type BroResolvedConfig, type BroView} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroNativeProgressBarComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroProgressBar {\n template(): string {\n // The skin has no colors of the bar; the contract keeps the attribute of the table\n this.color = this.getAttribute('color') || '';\n\n this.mode = <BroProgressMode>this.getAttribute('mode') || 'indeterminate';\n\n const indeterminate = (this.mode === 'indeterminate');\n\n this.value = (indeterminate ? 100 : (this.getAttribute('value') || 0))\n .toString();\n\n return `\n <progress ${indeterminate ? '' : `value=\"${this.value}\"`}\n max=\"${indeterminate ? '' : 100}\" aria-label=\"${escape(this.config.texts.loadingProgress)}\"></progress>`;\n }\n\n static get observedAttributes() {\n return [\n 'value'\n ];\n }\n\n config!: BroResolvedConfig;\n\n color!: string;\n mode!: BroProgressMode;\n value!: string;\n\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n private valueEl!: HTMLProgressElement;\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n attributeChangedCallback(name: string, previousValue: string, currentValue: string) {\n if (this.mode === 'determinate' && name === 'value') {\n if (!this.valueEl) {\n this.valueEl = <HTMLProgressElement>this.querySelector('progress');\n }\n\n this.valueEl.value = +currentValue;\n }\n }\n}\n","import {type BroCellElement, type BroCol, type BroConfiguredElement, BroHTMLElement, type BroResolvedConfig, type BroRow, type BroView, fitCellItems} from '@table-bro/core';\n\n/**\n * The tags of a cell of the vanilla skins: the items of the field of the column in the row, each in the markup of a tag\n * of the skin.\n */\nexport abstract class BroTagsComponent extends BroHTMLElement implements BroView, BroCellElement, BroConfiguredElement {\n template(): string {\n const name = this.col?.name;\n const items = name && this.row?.[name];\n\n this.items = Array.isArray(items) && items.length ? items : [this.config?.texts.noItems ?? ''];\n\n return this.items.map(() => this.tagHTML).join('');\n }\n\n row?: BroRow;\n col?: BroCol;\n config?: BroResolvedConfig;\n\n items: string[] = [];\n\n /** Stops fitting the tags into the line when the element leaves the DOM. */\n private fitting?: AbortController;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n // A tag is markup only for a column with html: true\n Array.from(this.children).forEach((tagEl: Element, i: number) => {\n if (this.col?.html) {\n tagEl.innerHTML = this.items[i];\n } else {\n tagEl.textContent = this.items[i];\n }\n });\n }\n\n /** The empty markup of one tag of the skin, which takes the text of an item. */\n protected abstract readonly tagHTML: string;\n\n connectedCallback(): void {\n if (!this.rendered) {\n this.rendered = true;\n\n this.render();\n }\n\n // The tags that do not fit the line give way to an ellipsis\n this.fitting = new AbortController();\n fitCellItems(this, this.fitting.signal);\n }\n\n disconnectedCallback(): void {\n this.fitting?.abort();\n }\n}\n","import {BroTagsComponent} from '../../shared/js/bro-tags';\n\n/** The tags of the native skin: marks. */\nexport class BroNativeTagsComponent extends BroTagsComponent {\n protected readonly tagHTML: string = '<mark></mark>';\n}\n","import type {BroButton, BroSkinConfig} from '@table-bro/core';\n\n// The constant keeps the type of its value: an application reads its buttons and its states without checks of undefined\nexport const nativeSkinConfig = {\n css: {\n table: {\n thead: {\n tr: {\n className: 'bro-header-row',\n\n th: {\n className: 'bro-header-cell'\n }\n }\n },\n\n tbody: {\n tr: {\n className: 'bro-row',\n\n td: {\n className: 'bro-cell'\n }\n }\n }\n },\n\n shadow: {\n className: 'shadow-lg'\n }\n },\n\n components: {\n button: {\n selector: 'bro-button',\n\n iconSelector: '.bro-button-toggle',\n\n beforeRender: (element: Element, value: string) => {\n element.setAttribute('mode', 'link');\n element.setAttribute('button-title', value);\n element.setAttribute('icon-html', '<span class=\"bro-button-toggle\"></span>');\n }\n },\n dropdown: {\n selector: 'bro-nv-dropdown'\n },\n filterDrawer: {\n beforeRender: (closeButton: Element) => {\n (<Element & BroButton>closeButton).iconHTML = '&times;';\n closeButton.setAttribute('button-class', 'bro-nav-link');\n closeButton.setAttribute('mode', 'link');\n }\n },\n paginator: {\n selector: 'bro-paginator',\n\n css: {\n ul: {\n className: 'bro-pagination',\n\n li: {\n className: 'bro-page-item',\n\n a: {\n className: 'bro-page-link'\n }\n }\n }\n }\n },\n progressBar: {\n selector: 'bro-nv-progress-bar'\n },\n sortHeader: {\n selector: 'bro-sort-header',\n contentSelector: '.bro-sort-header-content',\n\n beforeRender: <(element: Element, value: string) => void>((element: Element) => {\n element.setAttribute('icon-html', '<span class=\"bro-button-icon\">&#9660;</span>');\n }),\n afterRender: (element: Element, value: string) => {\n element.setAttribute('title', value);\n }\n },\n state: {\n states: {\n loading: ['🚀', 'Loading'],\n 'no-data': ['💔', 'No data'],\n 'not-found': ['🔦', 'No records found'],\n fail: ['😕', 'Failed']\n }\n },\n switch: {\n selector: 'bro-switch',\n\n css: {\n div: {\n className: 'bro-form-check bro-form-switch',\n\n input: {\n className: 'bro-form-check-input'\n }\n }\n }\n },\n textEllipsis: {\n selector: 'bro-text-ellipsis',\n\n afterRender: (element: Element, value: string) => {\n element.setAttribute('title', value);\n }\n },\n toolbar: {\n selector: 'bro-toolbar',\n\n css: {\n nav: {\n className: 'bro-navbar bro-navbar-expand'\n }\n }\n },\n toolbarMain: {\n selector: 'bro-toolbar-main',\n\n css: {\n toolbarTitle: {\n className: 'bro-navbar-brand'\n },\n navbarCollapse: {\n className: 'bro-navbar-collapse',\n\n ul: {\n li: {\n className: 'bro-nav-item',\n\n a: {\n className: 'bro-nav-link'\n }\n }\n }\n }\n },\n\n // The value is the word of the search button, texts.search of the config\n beforeRender: (searchButton: Element, value: string) => {\n searchButton.setAttribute('button-title', value);\n }\n },\n toolbarSearch: {\n beforeRender: (backButton: Element, clearButton: Element) => {\n (<Element & BroButton>backButton).iconHTML = '&larr;';\n backButton.setAttribute('button-class', 'bro-nav-link');\n backButton.setAttribute('mode', 'link');\n\n (<Element & BroButton>clearButton).iconHTML = '&times;';\n clearButton.setAttribute('button-class', 'bro-nav-link');\n clearButton.setAttribute('mode', 'link');\n }\n }\n },\n\n // The optional elements: a table that uses one undefined names its function in the console\n elements: {\n 'bro-nv-tags': 'withTags',\n 'bro-switch': 'withSwitch'\n }\n} satisfies BroSkinConfig;\n","import {registerSkin} from '@table-bro/core';\n\nimport {defineElement, defineSharedElements} from '../../shared/js/define-shared-elements';\nimport {BroNativeDropdownComponent} from './bro-dropdown.native';\nimport {BroNativeProgressBarComponent} from './bro-progress-bar.native';\nimport {BroNativeTagsComponent} from './bro-tags.native';\nimport {nativeSkinConfig} from './table-bro.native.config';\n\n// The elements are defined only in the browser: imported without a DOM, as in the server render, the skin only\n// registers its config. The optional elements, tags and switch, come with withTags() and withSwitch()\nif (typeof customElements !== 'undefined') {\n /* Skin - Shared */\n defineSharedElements('@table-bro/native');\n\n /* Skin - Native */\n defineElement('bro-nv-dropdown', BroNativeDropdownComponent);\n defineElement('bro-nv-progress-bar', BroNativeProgressBarComponent);\n}\n\nregisterSkin('nv', nativeSkinConfig);\n\n/**\n * Defines the optional element bro-nv-tags, the items of a column as tags, unless it is defined; without a DOM, as in\n * the server render, it does nothing. A page without the call does not carry the code of the tags.\n */\nexport function withTags(): void {\n defineElement('bro-nv-tags', BroNativeTagsComponent);\n}\n\nexport * from './table-bro.native.config';\nexport {BroNativeTagsComponent} from './bro-tags.native';\nexport {BroSwitchComponent} from '../../shared/js/bootstrap-based/bro-switch';\nexport {withSwitch} from '../../shared/js/define-shared-elements';\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ .nv .bro-details_tr>td>:first-child>*>div{padding:calc(var(--bro-row-height)/2)}table-bro-filter-drawer-container.nv>.bro-filter-drawer-scrim{z-index:4;background:#00000052}table-bro-filter-drawer-container.nv>.bro-filter-drawer-card{z-index:5}table-bro-filter-drawer-container.nv>.bro-filter-drawer-header,table-bro-filter-drawer-container.nv>[slot=filters]{z-index:6}table-bro-filter-drawer-container.nv[modal]>.bro-filter-drawer-scrim{z-index:8}table-bro-filter-drawer-container.nv[modal]>.bro-filter-drawer-card{z-index:9}table-bro-filter-drawer-container.nv[modal]>.bro-filter-drawer-header,table-bro-filter-drawer-container.nv[modal]>[slot=filters]{z-index:10}table-bro-filter-drawer-container.nv>[slot=filters]>*,.nv .bro-filter-drawer-card>.bro-filter-drawer-header~*{padding:1.25rem}.nv .bro-filter-drawer-header .bro-toolbar{height:64px;display:block}.nv .bro-filter-drawer-header .bro-toolbar>nav{box-sizing:border-box;height:100%}.nv .bro-shadow{padding-right:var(--bro-shadow-size);padding-left:var(--bro-shadow-size)}.nv .bro-table-shadows{z-index:-1;width:calc(100% - var(--bro-shadow-size)*2)}.nv .bro-table-shadows .bro-row{height:var(--bro-row-height)}.nv .bro-state-container{padding-left:12px;padding-right:12px;font-size:28px;line-height:33px}.nv .bro-state-container .bro-state-icon{width:28px;height:28px;margin-right:16px;font-size:28px;line-height:33px;top:33px}.nv .bro-state-container .bro-state-icon>svg{vertical-align:top;width:28px;height:28px}.nv .bro-state-container lottie-player{height:84px}table-bro.nv{width:calc(100% - var(--bro-shadow-size)*2);min-width:var(--bro-table-min-width)}table-bro.nv table th.bro-header-cell,table-bro.nv table td.bro-cell{box-sizing:border-box;padding:0 0 0 1.25rem}table-bro.nv table th.bro-header-cell:last-child,table-bro.nv table td.bro-cell:last-child{padding-right:1.25rem}.nv .bro-table-header_container{width:100%}.nv .bro-table-header_container .bro-table-header_shadow{z-index:-1;left:var(--bro-shadow-size);height:var(--bro-header-height)}.nv .bro-table-header_container .bro-table-header{z-index:3;left:var(--bro-shadow-size);position:relative}.nv .bro-table-body_container{z-index:2;top:calc(var(--bro-shadow-size)*-1);clip-path:polygon(0 0, 100% 0, 100% 100%, calc(100% - var(--bro-shadow-size)) 100%, calc(100% - var(--bro-shadow-size)) calc(100% - max(0px, var(--bro-shadow-size) + var(--bro-corner-radius) - 56px)), var(--bro-shadow-size) calc(100% - max(0px, var(--bro-shadow-size) + var(--bro-corner-radius) - 56px)), var(--bro-shadow-size) 100%, 0 100%)}.nv .bro-table-body,.nv .bro-table-body>.bro-table{z-index:2}.nv .bro-table-body,.nv .bro-table-shadows{padding-top:var(--bro-shadow-size)}.nv .bro-table-aux{top:var(--bro-shadow-size)}.nv .bro-cell_text-ellipsis-container{line-height:1.5}table-bro.nv .bro-cell-number .bro-cell_component{width:45px}.nv bro-nv-tags{box-sizing:border-box;flex-wrap:nowrap;align-items:center;width:100%;min-width:0;display:flex;overflow:hidden}.nv bro-nv-tags>mark{flex:none}.nv bro-nv-tags>mark:first-child{flex-shrink:1;min-width:0}.nv bro-nv-tags>mark:first-child *{min-width:0}.nv bro-nv-tags>mark:first-child{text-overflow:ellipsis;overflow:hidden}.nv bro-nv-tags>.bro-cell-items-ellipsis{flex:none}.nv bro-nv-tags>.bro-cell-item-hidden{white-space:nowrap;clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.bro-paginator{display:block}.bro-paginator-outer-container{display:flex}.bro-paginator-inner-container{flex-wrap:wrap;justify-content:flex-end;align-items:center;width:100%;padding:0 8px;display:flex}.bro-paginator-page-size{align-items:baseline;margin-right:8px;display:flex}[dir=rtl] .bro-paginator-page-size{margin-left:8px;margin-right:0}.bro-paginator-page-size-label{margin:0 4px}.bro-paginator-range-label{margin:0 32px 0 24px}.bro-paginator-range-actions{align-items:center;display:flex}.bro-sort-header-container{letter-spacing:normal;cursor:pointer;outline:0;align-items:center;display:flex}.bro-sort-header-container:focus-visible{outline-offset:-2px;outline:2px solid}.bro-sort-header-arrow .bro-button-icon{vertical-align:top;line-height:1;display:inline-block}.bro-sort-header-content{text-overflow:ellipsis;white-space:nowrap;transition:width calc(var(--bro-column-width-duration)*var(--bro-duration-scale)) ease;display:block;overflow:hidden}.bro-sort-header-position-before{flex-direction:row-reverse}@keyframes _bro-sort-header-recently-cleared-ascending{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-25%)}}.bro-sort-header-arrow{opacity:0;width:16px;height:16px;transition:transform .225s cubic-bezier(.4,0,.2,1),opacity .225s cubic-bezier(.4,0,.2,1);position:relative;overflow:visible}.bro-sort-header-container:not([role=button]) .bro-sort-header-arrow{visibility:hidden}.bro-sort-header:hover .bro-sort-header-arrow{opacity:.54}.bro-sort-header .bro-sort-header-sorted .bro-sort-header-arrow{opacity:1}.bro-sort-header-descending .bro-sort-header-arrow{transform:rotate(180deg)}.bro-sort-header-recently-cleared-ascending .bro-sort-header-arrow{transition:none;animation:.225s cubic-bezier(.4,0,.2,1) forwards _bro-sort-header-recently-cleared-ascending;transform:translateY(-25%)}@media (prefers-reduced-motion:reduce){.bro-sort-header .bro-sort-header-arrow{transition-duration:0s;animation-duration:0s}}.bro-sort-header-arrow svg{fill:currentColor;width:16px;height:16px;margin:-8px 0 0 -8px;position:absolute;top:50%;left:50%;transform:translateZ(0)}.bro-sort-header-arrow,[dir=rtl] .bro-sort-header-position-before .bro-sort-header-arrow{margin:0 0 0 6px}.bro-sort-header-position-before .bro-sort-header-arrow,[dir=rtl] .bro-sort-header-arrow{margin:0 6px 0 0}.nv .bro-button-toggle{display:inline-block}.nv .bro-button-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-top-color:currentColor;border-bottom:0;margin-left:.255em;display:inline-block}.nv .bro-button-toggle:empty:after{margin-left:0}table-bro.nv table tr.bro-header-row{height:var(--bro-header-height)}table-bro.nv table tr.bro-row{height:var(--bro-row-height)}.nv .bro-paginator-outer-container{border-radius:inherit}.nv .bro-paginator-inner-container{height:56px}.nv .bro-paginator-container{top:calc(var(--bro-shadow-size)*-2);width:100%}.nv .bro-paginator-container .bro-paginator-shadow{z-index:-1;left:var(--bro-shadow-size);border-radius:0 0 var(--bro-corner-radius) var(--bro-corner-radius);height:56px}.nv .bro-paginator-container .bro-paginator{z-index:3;left:var(--bro-shadow-size);border-radius:0 0 var(--bro-corner-radius) var(--bro-corner-radius);position:relative}.nv .bro-table-toolbar_container{top:0}.nv .bro-table-toolbar_container .bro-toolbar{height:64px;display:block}.nv .bro-table-toolbar_container .bro-toolbar>nav{box-sizing:border-box;height:100%}.nv .bro-table-toolbar_container{width:100%}.nv .bro-table-toolbar_container .bro-table-toolbar_shadow{z-index:-1;left:var(--bro-shadow-size);border-radius:var(--bro-corner-radius) var(--bro-corner-radius) 0 0;height:64px}.nv .bro-table-toolbar_container .bro-toolbar{z-index:7;left:var(--bro-shadow-size);border-radius:var(--bro-corner-radius) var(--bro-corner-radius) 0 0;position:relative}.nv bro-nv-tags>mark{margin-right:.375rem}.nv{color:#212529;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.nv .bro-table{background:0 0}.nv .bro-table-header_container>table{background:#fff}.nv .bro-table-toolbar_container .bro-toolbar,.nv .bro-filter-drawer-header .bro-toolbar{background:#fff;border-bottom-color:#dee2e6}table-bro-filter-drawer-container.nv>.bro-filter-drawer-header,table-bro-filter-drawer-container.nv>[slot=filters],.nv .bro-cell-items-ellipsis{color:#212529}.nv .bro-filter-drawer-card{color:#212529;background:#fff}.nv .bro-table tr.bro-row{background:#fff}.nv .bro-table .bro-details_tr{background-color:#fff}.nv .bro-toolbar_content-search input{color:#212529;background:#fff}.nv .bro-toolbar_content-search input::placeholder{color:#212529bf}.nv .bro-paginator-outer-container{background-color:#fff}.bro-dark-theme .nv:not(.bro-light-theme),.bro-dark-theme.nv{color:#dee2e6;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}.bro-dark-theme .nv:not(.bro-light-theme) .bro-table,.bro-dark-theme.nv .bro-table{background:0 0}.bro-dark-theme .nv:not(.bro-light-theme) .bro-table-header_container>table,.bro-dark-theme.nv .bro-table-header_container>table{background:#2b3035}.bro-dark-theme .nv:not(.bro-light-theme) .bro-table-toolbar_container .bro-toolbar,.bro-dark-theme .nv:not(.bro-light-theme) .bro-filter-drawer-header .bro-toolbar,.bro-dark-theme.nv .bro-table-toolbar_container .bro-toolbar,.bro-dark-theme.nv .bro-filter-drawer-header .bro-toolbar{background:#2b3035;border-bottom-color:#495057}.bro-dark-theme table-bro-filter-drawer-container.nv:not(.bro-light-theme)>.bro-filter-drawer-header,.bro-dark-theme table-bro-filter-drawer-container.nv:not(.bro-light-theme)>[slot=filters],table-bro-filter-drawer-container.bro-dark-theme.nv>.bro-filter-drawer-header,table-bro-filter-drawer-container.bro-dark-theme.nv>[slot=filters],.bro-dark-theme .nv:not(.bro-light-theme) .bro-cell-items-ellipsis,.bro-dark-theme.nv .bro-cell-items-ellipsis{color:#dee2e6}.bro-dark-theme .nv:not(.bro-light-theme) .bro-filter-drawer-card,.bro-dark-theme.nv .bro-filter-drawer-card{color:#dee2e6;background:#2b3035}.bro-dark-theme .nv:not(.bro-light-theme) .bro-table tr.bro-row,.bro-dark-theme.nv .bro-table tr.bro-row{background:#2b3035}.bro-dark-theme .nv:not(.bro-light-theme) .bro-table .bro-details_tr,.bro-dark-theme.nv .bro-table .bro-details_tr{background-color:#2b3035}.bro-dark-theme .nv:not(.bro-light-theme) .bro-toolbar_content-search input,.bro-dark-theme.nv .bro-toolbar_content-search input{color:#dee2e6;background:#2b3035}.bro-dark-theme .nv:not(.bro-light-theme) .bro-toolbar_content-search input::placeholder,.bro-dark-theme.nv .bro-toolbar_content-search input::placeholder{color:#dee2e6bf}.bro-dark-theme .nv:not(.bro-light-theme) .bro-paginator-outer-container,.bro-dark-theme.nv .bro-paginator-outer-container{background-color:#2b3035}.bro-pagination{cursor:pointer;margin-bottom:0;margin-right:.75rem;padding-left:0;list-style:none;display:flex}.bro-page-link{color:#00e;display:block;position:relative}.bro-dark-theme .nv:not(.bro-light-theme) .bro-page-link,.nv.bro-dark-theme .bro-page-link{color:#7dafff}.bro-page-item:not(:first-child) .bro-page-link{margin-left:.5rem}.bro-page-item.disabled .bro-page-link{color:graytext;pointer-events:none}.bro-navbar{flex-wrap:wrap;justify-content:space-between;align-items:center;padding:.5rem;display:flex;position:relative}div.bro-toolbar-content{flex-wrap:inherit;justify-content:space-between;align-items:center;width:100%;display:flex}.bro-navbar-brand{white-space:nowrap;margin-right:.5rem;padding-top:.5rem;padding-bottom:.5rem;font-weight:700}ul.bro-navbar-nav{flex-direction:column;margin-bottom:0;margin-right:.75rem;padding-left:0;list-style:none;display:flex}.bro-navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.bro-navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.bro-navbar-expand .bro-navbar-nav{flex-direction:row}.bro-navbar-expand .bro-navbar-collapse{flex-basis:auto;display:flex}.bro-nav-item:not(:first-child) .bro-nav-link{margin-left:.5rem}.bro-nav-item select{width:60px;margin-left:.5rem}.bro-nav-link,.bro-nav-link:hover,.bro-nav-link:focus{color:#00e}.bro-dark-theme .nv:not(.bro-light-theme) .bro-nav-link,.nv.bro-dark-theme .bro-nav-link,.bro-dark-theme .nv:not(.bro-light-theme) .bro-nav-link:hover,.bro-dark-theme .nv:not(.bro-light-theme) .bro-nav-link:focus,.nv.bro-dark-theme .bro-nav-link:hover,.nv.bro-dark-theme .bro-nav-link:focus{color:#7dafff}.nv bro-button a{color:#00e}.bro-dark-theme .nv:not(.bro-light-theme) a,.nv.bro-dark-theme a{color:#7dafff}.nv .bro-table-header bro-nv-progress-bar progress{top:calc(var(--bro-header-height) - 10px);width:100%;height:10px;position:absolute}.nv .bro-table-aux bro-nv-progress-bar progress{z-index:2;top:calc(var(--bro-row-height) - 6px);width:100%;height:6px;position:absolute}.nv .bro-table-header bro-nv-progress-bar progress{top:calc(var(--bro-header-height) - 7px)}.nv .bro-table-aux bro-nv-progress-bar progress{top:calc(var(--bro-row-height) - 4px)}table-bro.nv table{border-color:#dee2e6}table-bro.nv table>:not(caption)>*>*{border-bottom-width:1px}.bro-dark-theme table-bro.nv:not(.bro-light-theme) table,table-bro.nv.bro-dark-theme table{border-color:#495057}.nv .bro-toolbar-content .bro-toolbar-title-space{width:2.25rem;display:inline-block}.nv .bro-toolbar-space{flex:auto}.nv .bro-toolbar-buttons{flex-grow:0}.nv .bro-navbar{border-bottom:1px solid #dee2e6}.bro-dark-theme .nv:not(.bro-light-theme) .bro-navbar,.nv.bro-dark-theme .bro-navbar{border-bottom:1px solid #495057}.nv .bro-toolbar_content-search input{font-weight:700}.nv .bro-toolbar-search .bro-nav-link{text-decoration:none}.nv .bro-toolbar-search .bro-toolbar-content>bro-button{display:flex}.nv .bro-toolbar-search .bro-toolbar-content>bro-button a{box-sizing:content-box;width:1rem;padding:.75rem}.nv .bro-toolbar-search .bro-toolbar-content>bro-button:first-child a{padding-left:.5rem}.nv .bro-toolbar-search .bro-toolbar-content>bro-button:last-child a{text-align:right;padding-right:.5rem}.nv .bro-filter-drawer-header .bro-nav-link{text-decoration:none}.nv .bro-filter-drawer-header .bro-toolbar-content>bro-button{display:flex}.nv .bro-filter-drawer-header .bro-toolbar-content>bro-button a{box-sizing:content-box;width:1rem;padding:.75rem}.nv .bro-filter-drawer-header .bro-toolbar-content>bro-button:first-child a{padding-left:.5rem}.nv .bro-filter-drawer-header .bro-toolbar-content>bro-button:last-child a{text-align:right;padding-right:.5rem}.nv .bro-filter-drawer-header .bro-filter-drawer-title{padding-left:.5rem}.bro-table-shadow-container>table-bro.nv{margin-left:calc(var(--bro-shadow-size)*-1);width:100%}:where(.nv){--bro-row-height:40px;--bro-header-height:40px;--bro-shadow-size:48px;--bro-corner-radius:12px;--bro-island-space-size:24px;--bro-table-min-width:594px;--bro-filter-drawer-width:320px;--bro-filter-drawer-corner-radius:16px;--bro-table-body-container-z-index:2;--bro-refresh-overlay-opacity:.5;--bro-refresh-overlay-opacity-dark:.5;--bro-column-width-duration:.5s;--bro-details-duration:.35s;--bro-details-easing:cubic-bezier(.37, 0, .63, 1);--bro-filter-drawer-duration:.4s;--bro-kinetic-time-constant:.28s;--bro-state-icon-duration:.5s;--bro-state-message-duration:.75s;--bro-duration-scale:1}@media (prefers-reduced-motion:reduce){:where(.nv){--bro-duration-scale:0}}
@@ -0,0 +1,113 @@
1
+ if(typeof exports!=`object`&&typeof define!=`function`&&typeof TableBro>`u`)throw Error(`@table-bro/native: load the @table-bro/core script before the skin script, the TableBro global is missing.`);(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@table-bro/core")):typeof define==`function`&&define.amd?define([`exports`,`@table-bro/core`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.TableBroNative={},e.TableBro))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let{escape:n}=t.BroHTML;var r=class extends t.BroHTMLElement{template(){this.css=this.config.components.switch?.css,this.checked=this.getAttribute(`checked`);let e=this.checked===`true`;return`
2
+ <div ${this.css?`class="${n(this.css.div.className)}"`:``}>
3
+ <input type="checkbox"
4
+ ${this.css?`class="${n(this.css.div.input.className)}"`:``}
5
+ role="switch"
6
+ ${e?` checked`:``}>
7
+ </div>`}config;col;checked;css;rendered=!1;events(){let e=this.querySelector(`input`),t=this.getAttribute(`name`);e.setAttribute(`aria-label`,this.col?.title??``),e.addEventListener(`change`,()=>{t&&this.dispatchEvent(new CustomEvent(`action`,{detail:t}))})}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.events()}connectedCallback(){this.rendered||(this.rendered=!0,this.render())}};let{escape:i}=t.BroHTML;var a=class extends t.BroHTMLElement{template(){this.css=this.config.components.toolbar.css;let e=this.css.nav.div?.className?`${this.css.nav.div.className} ${this.contentClassName}`:this.contentClassName;return`
8
+ <nav class="${i(this.css.nav.className)}">
9
+ <div class="${i(e)}">
10
+ <!-- toolbar content -->
11
+ </div>
12
+ </nav>`}config;contentClassName=`bro-toolbar-content`;css;render(){this.insertAdjacentHTML(`afterbegin`,this.template())}appendToolbarContent(...e){this.firstChild||this.render(),this.querySelector(`.${this.contentClassName}`)?.append(...e)}};let{createElement:o,escape:s}=t.BroHTML;var c=class extends t.BroHTMLElement{template(){this.css=this.config.components.toolbarMain.css,this.toolbarTitle=this.config.toolbarTitle;let e=this.css.navbarCollapse.ul.className?`${this.css.navbarCollapse.ul.className} ${this.contentClassName}`:this.contentClassName;return`
13
+ <!--bro-toolbar-->
14
+ <span class="bro-toolbar-title-space"></span>
15
+ <span class="${s(this.css.toolbarTitle.className)}">${s(this.toolbarTitle)}</span>
16
+
17
+ <span class="bro-toolbar-space"></span>
18
+
19
+ <div class="${s(this.css.navbarCollapse.className)} bro-toolbar-buttons">
20
+ <ul class="${s(e)}">
21
+ <!-- search-button -->
22
+ <!-- buttons -->
23
+ </ul>
24
+ </div>
25
+ <!--/bro-toolbar-->`}config;contentClassName=`bro-navbar-nav`;toolbarTitle;css;navContentEl;rendered=!1;events(){this.addEventListener(`click`,e=>{e.preventDefault()}),this.navContentEl.children[0].addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(t.events.toolbarEvent,{bubbles:!0,composed:!0,detail:t.events.toolbarSearchOpenEvent}))})}render(){let e=document.createElement(this.config.components.toolbar.selector);e.setAttribute(`class`,`bro-toolbar`),e.config=this.config,this.appendChild(e);let t=document.createElement(`div`);t.insertAdjacentHTML(`afterbegin`,this.template()),e.appendToolbarContent(...Array.from(t.children)),this.appendToolbarContent(this.renderSearchButton(),...this.renderButtons()),this.querySelectorAll(this.config.components.dropdown?.selector).forEach(e=>{e.replaceWith(e.children[0])}),this.events()}connectedCallback(){this.rendered||(this.rendered=!0,this.render())}appendToolbarContent(...e){this.navContentEl||=this.querySelector(`.${this.contentClassName}`),this.navContentEl.append(...e)}templateToolbarButton(e,t,n){return o(`
26
+ <li class="${s(this.css.navbarCollapse.ul.li.className)}">
27
+ <a class="${s(this.css.navbarCollapse.ul.li.a.className)}${n?` ${s(n)}`:``}" href="">
28
+ ${t||``}${s(e)}
29
+ </a>
30
+ </li>`)}renderSearchButton(){let e=document.createElement(this.config.components.button.selector);this.config.components.toolbarMain.beforeRender?.(e,this.config.texts.search);let t=e.getAttribute(`button-title`)??``;return this.templateToolbarButton(t,e.iconHTML,`bro-toolbar-button-search`)}renderButtons(){return(this.config.components.toolbarMain.buttons??[]).map(e=>{if(e.mode===`navbar-dropdown`){let n=document.createElement(this.config.components.dropdown?.selector);return n.config=this.config,n.setAttribute(`mode`,`navbar-dropdown`),n.setAttribute(`button-title`,e.buttonTitle),n.setAttribute(`options`,JSON.stringify(e.options)),n.addEventListener(`value`,e=>{this.dispatchEvent(new CustomEvent(t.events.toolbarEvent,{bubbles:!0,composed:!0,detail:e.detail}))}),n}{let n=this.templateToolbarButton(e.buttonTitle,e.iconHTML);return n.querySelector(`a`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(t.events.toolbarEvent,{bubbles:!0,composed:!0,detail:e.eventType}))}),n}})}};let{escape:l}=t.BroHTML;var u=class extends t.BroHTMLElement{template(){this.label=this.getAttribute(`label`)||``,this.buttonClassName=this.getAttribute(`button-class`),this.buttonTitle=this.getAttribute(`button-title`)||``,this.iconHTML=this.getAttribute(`icon-html`)||this.iconHTML,this.mode=this.getAttribute(`mode`)||`button`,this.eventType=this.getAttribute(`event-type`)||`action`;let e=this.buttonClassName?` class="${l(this.buttonClassName)}"`:``,t=!this.buttonTitle&&this.label?` aria-label="${l(this.label)}"`:``,n=`${l(this.buttonTitle)}${this.iconHTML?`${this.buttonTitle?`&nbsp;`:``}${this.iconHTML}`:``}`;return this.mode===`link`?`
31
+ <a${e} href=""
32
+ role="button"${t}>
33
+ ${n}
34
+ </a>`:`
35
+ <button${e}
36
+ type="button"${t}>
37
+ ${n}
38
+ </button>`}label;buttonClassName;buttonTitle;iconHTML;mode;eventType;events(){let e=this.children[0];e.addEventListener(`click`,n=>{(0,t.dispatchAction)(e,this.eventType),n.preventDefault()}),this.mode===`link`&&e.addEventListener(`keydown`,t=>{t.key===` `&&!t.repeat&&(t.preventDefault(),e.click())})}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.events()}connectedCallback(){this.firstChild||this.render()}};let{escape:d,text:f}=t.BroHTML;var p=class extends t.BroHTMLElement{template(){return this.containerClassName=this.getAttribute(`container-class`),this.value=this.getAttribute(`value`)||``,`
39
+ <span class="${t.broCellSelectors.ellipsisContainer}${this.containerClassName?` ${d(this.containerClassName)}`:``}">
40
+ <span class="${t.broCellSelectors.ellipsis}"></span>
41
+ </span>`}row;col;config;containerClassName;tooltip;value;release;released=!1;rendered=!1;render(){this.insertAdjacentHTML(`afterbegin`,this.template());let e=this.querySelector(`.${t.broCellSelectors.ellipsis}`);this.col?.html?(e.innerHTML=this.value,this.tooltip=f(this.value)):(e.textContent=this.value,this.tooltip=this.value),this.afterRender()}connectedCallback(){this.rendered?this.released&&(this.released=!1,this.afterRender()):(this.rendered=!0,this.render())}disconnectedCallback(){queueMicrotask(()=>{this.isConnected||(typeof this.release==`function`&&this.release(),this.release=void 0,this.released=!0)})}afterRender(){let e=this.children[0];this.config.components.textEllipsis.afterRender&&(this.release=this.config.components.textEllipsis.afterRender(e,this.tooltip))}};let{escape:m}=t.BroHTML;var h=class extends t.BroHTMLElement{template(){this.arrowPosition=this.getAttribute(`arrow-position`)||`after`,this.sortId=this.getAttribute(`sort-id`)||``,this.dataType=this.getAttribute(`data-type`)||``,this.headerTitle=this.getAttribute(`header-title`)||``,this.iconHTML=this.getAttribute(`icon-html`)||``,this.tooltip=this.getAttribute(`tooltip`)||``;let e=``;this.arrowPosition===`before`&&(e+=` bro-sort-header-position-before`),e+=` bro-sort-header-descending`;let t=this.headerTitle?` role="button" tabindex="0"`:``;return`
42
+ <div class="bro-sort-header-container${e}"${t}>
43
+ <div class="bro-sort-header-content">${m(this.headerTitle)}</div>
44
+ <div class="bro-sort-header-arrow" aria-hidden="true">${this.iconHTML}</div>
45
+ </div>`}static get observedAttributes(){return[`tooltip`]}config;arrowPosition;headerTitle;dataType;iconHTML;sortId;tooltip;_activeSort;direction=``;release;released=!1;rendered=!1;events(){let e=this.children[0];this.headerTitle&&(e.addEventListener(`blur`,()=>{e.classList.remove(`bro-sort-header-recently-cleared-ascending`)}),e.addEventListener(`keydown`,t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),e.click())}),e.addEventListener(`click`,()=>{this.direction===``?(this.direction=`desc`,e.classList.add(`bro-sort-header-sorted`),e.classList.remove(`bro-sort-header-recently-cleared-ascending`)):this.direction===`desc`?(this.direction=`asc`,e.classList.remove(`bro-sort-header-descending`)):this.direction===`asc`&&(this.direction=``,e.classList.remove(`bro-sort-header-sorted`),e.classList.add(`bro-sort-header-descending`),e.classList.add(`bro-sort-header-recently-cleared-ascending`)),(0,t.dispatchAction)(this,t.events.filtersSortEvent,{sortKey:this.sortId,sortDirection:this.direction||void 0})}))}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.afterRender(),this.events()}get activeSort(){return this._activeSort}set activeSort(e){this._activeSort=e;let t=this.children[0];this.direction!==``&&e?.sortKey!==this.sortId&&t&&(this.direction=``,t.classList.remove(`bro-sort-header-sorted`),t.classList.add(`bro-sort-header-descending`))}connectedCallback(){this.rendered?this.released&&(this.released=!1,this.afterRender()):(this.rendered=!0,this.render())}disconnectedCallback(){queueMicrotask(()=>{this.isConnected||(typeof this.release==`function`&&this.release(),this.release=void 0,this.released=!0)})}attributeChangedCallback(e,t,n){this.rendered&&t!==n&&(this.tooltip=n||``,typeof this.release==`function`&&this.release(),this.release=void 0,this.isConnected?this.afterRender():this.released=!0)}afterRender(){let e=this.children[0];this.release=this.config.components.sortHeader.afterRender?.(e,this.tooltip)}};
46
+ /**
47
+ * @license
48
+ * Copyright Google LLC All Rights Reserved.
49
+ *
50
+ * Use of this source code is governed by an MIT-style license that can be
51
+ * found in the LICENSE file at https://angular.dev/license
52
+ */
53
+ let{escape:g}=t.BroHTML,_={"bro-button":u,"bro-paginator":class extends t.BroHTMLElement{template(){this.disabled=this.getAttribute(`disabled`)===`true`||!1,this.length=Number(this.getAttribute(`length`))||0,this.pageIndex=Math.max(Number(this.getAttribute(`page-index`))||0,0),this.pageSize=Number(this.getAttribute(`page-size`)),this.showFirstLastButtons=this.getAttribute(`show-first-last-buttons`)!==`false`,this.parsePageSizeOptions();let e=this.texts=this.config.texts,t=this.config.components.paginator.css?.ul,n=t?.className?` class="${g(t.className)}"`:``,r=t?.li?.className?` class="${g(t.li.className)}"`:``,i=t?.li?.a?.className?`${g(t.li.a.className)} `:``;return this.dropdownSelector=this.config.components.dropdown?.selector,`
54
+ <div class="bro-paginator-outer-container">
55
+ <div class="bro-paginator-inner-container">
56
+ <div class="bro-paginator-page-size">
57
+ <div class="bro-paginator-page-size-label">
58
+ ${g(e.itemsPerPage)}
59
+ </div>
60
+
61
+ ${this.pageSizeDropdown?.length?``:this.templatePageSizeValue()}
62
+ </div>
63
+
64
+ <div class="bro-paginator-range-actions">
65
+ <div class="bro-paginator-range-label" aria-live="polite">
66
+ ${g(e.rangeLabel(this.pageIndex,this.pageSize,this.length))}
67
+ </div>
68
+
69
+ <nav aria-label="${g(e.pageNavigation)}">
70
+ <ul${n}>
71
+ ${this.showFirstLastButtons?`
72
+ <li${r}>
73
+ <a class="${i}bro-paginator-navigation-first" href=""
74
+ aria-label="${g(e.firstPage)}">${g(e.first)}</a>
75
+ </li>`:``}
76
+
77
+ <li${r}>
78
+ <a class="${i}bro-paginator-navigation-previous" href=""
79
+ aria-label="${g(e.previousPage)}">${g(e.previous)}</a>
80
+ </li>
81
+
82
+ <li${r}>
83
+ <a class="${i}bro-paginator-navigation-next" href=""
84
+ aria-label="${g(e.nextPage)}">${g(e.next)}</a>
85
+ </li>
86
+
87
+ ${this.showFirstLastButtons?`
88
+ <li${r}>
89
+ <a class="${i}bro-paginator-navigation-last" href=""
90
+ aria-label="${g(e.lastPage)}">${g(e.last)}</a>
91
+ </li>`:``}
92
+ </ul>
93
+ </nav>
94
+ </div>
95
+ </div>
96
+ </div>`}static get observedAttributes(){return[`page-index`,`page-size`,`length`,`page-size-options`,`disabled`]}config;disabled;length;pageIndex;pageSize;pageSizeOptions;showFirstLastButtons;page;eventName=`page`;firstEl;previousEl;nextEl;lastEl;pageSizeEl;pageSizeValueEl;rangeLabelEl;dropdownSelector;texts;pageSizeDropdown;rendered=!1;events(){this.previousEl=this.querySelector(`.bro-paginator-navigation-previous`),this.nextEl=this.querySelector(`.bro-paginator-navigation-next`),this.previousEl.addEventListener(`click`,e=>{e.preventDefault(),this.hasPreviousPage()&&this.navigate(this.pageIndex-1)}),this.nextEl.addEventListener(`click`,e=>{e.preventDefault(),this.hasNextPage()&&this.navigate(this.pageIndex+1)}),this.showFirstLastButtons&&(this.firstEl=this.querySelector(`.bro-paginator-navigation-first`),this.lastEl=this.querySelector(`.bro-paginator-navigation-last`),this.firstEl.addEventListener(`click`,e=>{e.preventDefault(),this.hasPreviousPage()&&this.navigate(0)}),this.lastEl.addEventListener(`click`,e=>{e.preventDefault(),this.hasNextPage()&&this.navigate(this.getNumberOfPages()-1)}))}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.pageSizeDropdown?.length&&(this.pageSizeEl=this.querySelector(`.bro-paginator-page-size`),this.renderPageSizeDropdown()),this.events(),this.renderNavigationState()}connectedCallback(){this.rendered||(this.rendered=!0,this.render())}attributeChangedCallback(e,t,n){this.texts&&((e===`page-index`||e===`page-size`||e===`length`)&&(this.rangeLabelEl||=this.querySelector(`.bro-paginator-range-label`),this.pageSizeValueEl||=this.querySelector(`.bro-paginator-page-size-value`),e===`page-index`&&(this.pageIndex=+n),e===`page-size`&&(this.pageSize=+n,this.pageSizeOptions.length||(this.pageSizeValueEl.innerText=n)),e===`length`&&(this.length=+n),this.rangeLabelEl.textContent=this.texts.rangeLabel(this.pageIndex,this.pageSize,this.length),this.renderNavigationState()),e===`page-size-options`&&(this.parsePageSizeOptions(),this.unrenderPageSizeControls(),this.pageSizeEl||=this.querySelector(`.bro-paginator-page-size`),this.pageSizeDropdown?.length?this.renderPageSizeDropdown():(this.renderPageSizeValue(),this.setAttribute(`disabled`,`true`))),e===`disabled`&&this.setDisabledState(n===`true`))}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let e=this.getNumberOfPages()-1;return this.pageIndex<e&&this.pageSize!=0}getNumberOfPages(){return this.pageSize?Math.ceil(this.length/this.pageSize):0}parsePageSizeOptions(){if(this.getAttribute(`page-size-options`))try{this.pageSizeOptions=JSON.parse(this.getAttribute(`page-size-options`)).map(e=>+e),this.pageSizeDropdown=this.pageSizeOptions.map(e=>({value:e.toString(),title:e.toString()}))}catch(e){this.pageSizeOptions=[],this.config.debug&&console.log(e)}}templatePageSizeValue(){return`<div class="bro-paginator-page-size-value">${this.pageSize}</div>`}unrenderPageSizeControls(){let e=this.querySelector(this.dropdownSelector);e&&e.remove();let t=this.querySelector(`.bro-paginator-page-size-value`);t&&t.remove()}renderPageSizeDropdown(){let e=document.createElement(this.dropdownSelector);e.config=this.config,e.setAttribute(`mode`,`select`),e.setAttribute(`button-title`,this.pageSize.toString()),e.setAttribute(`options`,JSON.stringify(this.pageSizeDropdown)),e.setAttribute(`label`,this.texts.itemsPerPage),this.eventsPageSize(e),this.pageSizeEl.append(e)}eventsPageSize(e){e.addEventListener(`value`,e=>{let t=e.detail;this.changePageSize(+t),this.setAttribute(`page-size`,t)})}renderPageSizeValue(){this.pageSizeEl.insertAdjacentHTML(`beforeend`,this.templatePageSizeValue())}setDisabledState(e){this.disabled=e;let t=this.querySelector(this.dropdownSelector);t&&t.setAttribute(`disabled`,e.toString()),this.renderNavigationState()}renderNavigationState(){let e=this.disabled||!this.hasPreviousPage(),t=this.disabled||!this.hasNextPage();[[this.firstEl,e],[this.previousEl,e],[this.nextEl,t],[this.lastEl,t]].forEach(([e,t])=>{t?(e?.parentElement?.classList.add(`disabled`),e?.setAttribute(`aria-disabled`,`true`)):(e?.parentElement?.classList.remove(`disabled`),e?.removeAttribute(`aria-disabled`))})}navigate(e){let t=this.pageIndex;e!==t&&(this.pageIndex=e,this.setAttribute(`page-index`,this.pageIndex.toString()),this.emitPageEvent(t))}changePageSize(e){let t=this.pageIndex*this.pageSize,n=this.pageIndex;this.pageIndex=Math.floor(t/e)||0,this.pageSize=e,this.emitPageEvent(n)}emitPageEvent(e){this.page={previousPageIndex:e,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length},this.dispatchEvent(new CustomEvent(this.eventName,{bubbles:!0,composed:!0,detail:this.page}))}},"bro-sort-header":h,"bro-text-ellipsis":p,"bro-toolbar":a,"bro-toolbar-main":c};function v(){y(`bro-switch`,r)}function y(e,t){typeof customElements<`u`&&!customElements.get(e)&&customElements.define(e,t)}function b(e){let t=[];Object.entries(_).forEach(([e,n])=>{let r=customElements.get(e);r?r!==n&&t.push(e):customElements.define(e,n)}),t.length&&console.warn(`${e}: ${t.join(`, `)} are already defined by another vanilla skin bundle, so this skin uses its elements. Load one vanilla skin bundle per page.`)}let{escape:x}=t.BroHTML;var S=class extends t.BroHTMLElement{template(){this.buttonTitle=this.getAttribute(`button-title`)||``,this.name=this.getAttribute(`name`)||`action`,this.mode=this.getAttribute(`mode`)||`dropdown`;try{this.options=JSON.parse(this.getAttribute(`options`))}catch(e){this.options=[],this.config.debug&&console.log(e)}let e=this.getAttribute(`label`)||this.buttonTitle,t=e?` aria-label="${x(e)}"`:``;return this.mode===`select`||this.mode===`dropdown`?`
97
+ <select name="${x(this.name)}"${t}>
98
+ <option value="" hidden>${x(this.buttonTitle)}</option>
99
+ ${this.templateDropdown(this.options)}
100
+ </select>`:`
101
+ <li class="bro-nav-item bro-dropdown">
102
+ <select name="${x(this.name)}"${t}>
103
+ <option value="" hidden>${x(this.buttonTitle)}</option>
104
+ ${this.templateDropdown(this.options)}
105
+ </select>
106
+ </li>`}static get observedAttributes(){return[`disabled`]}config;buttonTitle;name;mode;options;eventName=`value`;dropdownToggleEl;rendered=!1;events(){let e=this.querySelector(`select`),t=this.mode===`navbar-dropdown`,n=!1,r=null;this.dropdownToggleEl=e,this.renderDisabled();let i=n=>{r=null,t&&(e.selectedIndex=0),this.dispatchEvent(new CustomEvent(this.eventName,{bubbles:!0,composed:!0,detail:n}))};t&&(e.addEventListener(`pointerdown`,()=>{n=!1}),e.addEventListener(`keydown`,e=>{n=e.key!==`Enter`,e.key===`Enter`&&r!==null&&i(r)}),e.addEventListener(`blur`,()=>{r!==null&&(r=null,e.selectedIndex=0)})),e.addEventListener(`change`,()=>{t&&n?r=e.value:i(e.value)})}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.events()}connectedCallback(){this.rendered||(this.rendered=!0,this.render())}attributeChangedCallback(e){e===`disabled`&&this.dropdownToggleEl&&this.renderDisabled()}templateDropdown(e){return`
107
+ ${e.map(e=>{if(`value`in e&&`title`in e)return`
108
+ <option value="${x(e.value)}">${x(e.title)}</option>`;if(`divider`in e)return`
109
+ <hr>`;if(`header`in e)return`
110
+ <optgroup label="${x(e.header)}"></optgroup>`}).join(``)}`}renderDisabled(){this.dropdownToggleEl.toggleAttribute(`disabled`,this.getAttribute(`disabled`)===`true`)}};let{escape:C}=t.BroHTML;var w=class extends t.BroHTMLElement{template(){this.color=this.getAttribute(`color`)||``,this.mode=this.getAttribute(`mode`)||`indeterminate`;let e=this.mode===`indeterminate`;return this.value=(e?100:this.getAttribute(`value`)||0).toString(),`
111
+ <progress ${e?``:`value="${this.value}"`}
112
+ max="${e?``:100}" aria-label="${C(this.config.texts.loadingProgress)}"></progress>`}static get observedAttributes(){return[`value`]}config;color;mode;value;rendered=!1;valueEl;render(){this.insertAdjacentHTML(`afterbegin`,this.template())}connectedCallback(){this.rendered||(this.rendered=!0,this.render())}attributeChangedCallback(e,t,n){this.mode===`determinate`&&e===`value`&&(this.valueEl||=this.querySelector(`progress`),this.valueEl.value=+n)}},T=class extends t.BroHTMLElement{template(){let e=this.col?.name,t=e&&this.row?.[e];return this.items=Array.isArray(t)&&t.length?t:[this.config?.texts.noItems??``],this.items.map(()=>this.tagHTML).join(``)}row;col;config;items=[];fitting;rendered=!1;render(){this.insertAdjacentHTML(`afterbegin`,this.template()),Array.from(this.children).forEach((e,t)=>{this.col?.html?e.innerHTML=this.items[t]:e.textContent=this.items[t]})}connectedCallback(){this.rendered||(this.rendered=!0,this.render()),this.fitting=new AbortController,(0,t.fitCellItems)(this,this.fitting.signal)}disconnectedCallback(){this.fitting?.abort()}},E=class extends T{tagHTML=`<mark></mark>`};let D={css:{table:{thead:{tr:{className:`bro-header-row`,th:{className:`bro-header-cell`}}},tbody:{tr:{className:`bro-row`,td:{className:`bro-cell`}}}},shadow:{className:`shadow-lg`}},components:{button:{selector:`bro-button`,iconSelector:`.bro-button-toggle`,beforeRender:(e,t)=>{e.setAttribute(`mode`,`link`),e.setAttribute(`button-title`,t),e.setAttribute(`icon-html`,`<span class="bro-button-toggle"></span>`)}},dropdown:{selector:`bro-nv-dropdown`},filterDrawer:{beforeRender:e=>{e.iconHTML=`&times;`,e.setAttribute(`button-class`,`bro-nav-link`),e.setAttribute(`mode`,`link`)}},paginator:{selector:`bro-paginator`,css:{ul:{className:`bro-pagination`,li:{className:`bro-page-item`,a:{className:`bro-page-link`}}}}},progressBar:{selector:`bro-nv-progress-bar`},sortHeader:{selector:`bro-sort-header`,contentSelector:`.bro-sort-header-content`,beforeRender:(e=>{e.setAttribute(`icon-html`,`<span class="bro-button-icon">&#9660;</span>`)}),afterRender:(e,t)=>{e.setAttribute(`title`,t)}},state:{states:{loading:[`🚀`,`Loading`],"no-data":[`💔`,`No data`],"not-found":[`🔦`,`No records found`],fail:[`😕`,`Failed`]}},switch:{selector:`bro-switch`,css:{div:{className:`bro-form-check bro-form-switch`,input:{className:`bro-form-check-input`}}}},textEllipsis:{selector:`bro-text-ellipsis`,afterRender:(e,t)=>{e.setAttribute(`title`,t)}},toolbar:{selector:`bro-toolbar`,css:{nav:{className:`bro-navbar bro-navbar-expand`}}},toolbarMain:{selector:`bro-toolbar-main`,css:{toolbarTitle:{className:`bro-navbar-brand`},navbarCollapse:{className:`bro-navbar-collapse`,ul:{li:{className:`bro-nav-item`,a:{className:`bro-nav-link`}}}}},beforeRender:(e,t)=>{e.setAttribute(`button-title`,t)}},toolbarSearch:{beforeRender:(e,t)=>{e.iconHTML=`&larr;`,e.setAttribute(`button-class`,`bro-nav-link`),e.setAttribute(`mode`,`link`),t.iconHTML=`&times;`,t.setAttribute(`button-class`,`bro-nav-link`),t.setAttribute(`mode`,`link`)}}},elements:{"bro-nv-tags":`withTags`,"bro-switch":`withSwitch`}};typeof customElements<`u`&&(b(`@table-bro/native`),y(`bro-nv-dropdown`,S),y(`bro-nv-progress-bar`,w)),(0,t.registerSkin)(`nv`,D);function O(){y(`bro-nv-tags`,E)}e.BroNativeTagsComponent=E,e.BroSwitchComponent=r,e.nativeSkinConfig=D,e.withSwitch=v,e.withTags=O});
113
+ //# sourceMappingURL=table-bro.native.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-bro.native.umd.js","names":["BroHTML","BroHTMLElement","escape","BroHTML","BroHTMLElement","escape","BroHTML","BroHTMLElement","escape","events","BroHTML","BroHTMLElement","escape","BroHTML","BroHTMLElement","broCellSelectors","escape","BroHTML","BroHTMLElement","escape","events","BroHTML","BroHTMLElement","escape","BroHTML","BroHTMLElement","escape","BroHTML","BroHTMLElement","BroHTMLElement","factory","global","exports","escape$8","_table_bro_core","BroSwitchComponent","checked","input","name","escape$7","BroToolbarComponent","divClass","nodes","escape$6","BroToolbarMainComponent","ulClass","event","broToolbar","wrapper","broDropdown","createElement","className","iconHTML","buttonTitle","broButton","button","buttonEl","escape$5","BroButtonComponent","ariaLabel","content","escape$4","BroTextEllipsisComponent","valueEl","text","tooltipEl","escape$3","BroSortHeaderComponent","classList","control","headerContainerEl","sort","container","oldValue","value","escape$2","sharedElements","texts","ul","liClass","aClass","currentValue","maxPageIndex","item","err","dropdown","pageSizeValueEl","disable","noPrevious","noNext","previousIndex","index","startIndex","pageSize","withSwitch","defineElement","element","defineSharedElements","definedElsewhere","defined","skinPackage","escape$1","BroNativeDropdownComponent","label","select","menu","keyboard","pending","send","options","option","BroNativeProgressBarComponent","indeterminate","escape","BroTagsComponent","items","i","BroNativeTagsComponent","nativeSkinConfig","closeButton","searchButton","backButton","clearButton","withTags"],"sources":["../../shared/js/bootstrap-based/bro-switch.ts","../../shared/js/bootstrap-based/toolbar/bro-toolbar.ts","../../shared/js/bootstrap-based/toolbar/bro-toolbar-main.ts","../../shared/js/bro-button.ts","../../shared/js/bro-text-ellipsis.ts","../../shared/js/material-based/bro-sort-header.ts","../../shared/js/material-based/paginator/bro-paginator.ts","../../shared/js/define-shared-elements.ts","../js/bro-dropdown.native.ts","../js/bro-progress-bar.native.ts","../../shared/js/bro-tags.ts","../js/bro-tags.native.ts","../js/table-bro.native.config.ts","../js/table-bro.native.ts"],"sourcesContent":["import {type BroCol, type BroConfiguredElement, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroSkinComponents, type BroView} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\n/**\n * A switch of a boolean of a cell. A change sends the action of the attribute name, as the event action that the table\n * turns into bro-action with the column and the row (event: 'action' of the column); the title of the column names\n * the switch for screen readers.\n */\nexport class BroSwitchComponent extends BroHTMLElement implements BroView, BroConfiguredElement {\n template(): string {\n this.css = this.config.components.switch?.css;\n\n this.checked = this.getAttribute('checked');\n\n const checked = (this.checked === 'true');\n\n return `\n <div ${this.css ? `class=\"${escape(this.css.div.className)}\"` : ''}>\n <input type=\"checkbox\"\n ${this.css ? `class=\"${escape(this.css.div.input.className)}\"` : ''}\n role=\"switch\"\n ${checked ? ' checked' : ''}>\n </div>`;\n }\n\n config!: BroResolvedConfig;\n /** The column of the cell, which the table sets. */\n col?: BroCol;\n\n checked!: string | null;\n\n private css: NonNullable<BroSkinComponents['switch']>['css'];\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n events() {\n const input = <HTMLInputElement>this.querySelector('input');\n const name = this.getAttribute('name');\n\n input.setAttribute('aria-label', this.col?.title ?? '');\n\n input.addEventListener('change', () => {\n if (name) {\n this.dispatchEvent(new CustomEvent('action', {detail: name}));\n }\n });\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n this.events();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n}\n","import {type BroConfiguredElement, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroSkinComponents, type BroToolbarElement, type BroView} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroToolbarComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroToolbarElement {\n template(): string {\n this.css = <NonNullable<BroSkinComponents['toolbar']['css']>>this.config.components.toolbar.css;\n\n const divClass = this.css.nav.div?.className ? `${this.css.nav.div.className} ${this.contentClassName}` : this.contentClassName;\n\n return `\n <nav class=\"${escape(this.css.nav.className)}\">\n <div class=\"${escape(divClass)}\">\n <!-- toolbar content -->\n </div>\n </nav>`;\n }\n\n config!: BroResolvedConfig;\n contentClassName: string = 'bro-toolbar-content';\n\n // The vanilla skins give the classes of their toolbar\n private css!: NonNullable<BroSkinComponents['toolbar']['css']>;\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n }\n\n appendToolbarContent(...nodes: (Node | string)[]): void {\n if (!this.firstChild) {\n this.render();\n }\n\n this.querySelector(`.${this.contentClassName}`)\n ?.append(...nodes);\n }\n}\n","import {type BroButton, type BroConfiguredElement, type BroDropdown, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroSkinComponents, type BroToolbarMain, type BroView, events} from '@table-bro/core';\n\nimport type {BroToolbarComponent} from './bro-toolbar';\n\nconst {createElement, escape} = BroHTML;\n\nexport class BroToolbarMainComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroToolbarMain {\n template(): string {\n this.css = <NonNullable<BroSkinComponents['toolbarMain']['css']>>this.config.components.toolbarMain.css;\n\n this.toolbarTitle = this.config.toolbarTitle;\n\n const ulClass = this.css.navbarCollapse.ul.className ? `${this.css.navbarCollapse.ul.className} ${this.contentClassName}` : this.contentClassName;\n\n return `\n <!--bro-toolbar-->\n <span class=\"bro-toolbar-title-space\"></span>\n <span class=\"${escape(this.css.toolbarTitle.className)}\">${escape(this.toolbarTitle)}</span>\n\n <span class=\"bro-toolbar-space\"></span>\n\n <div class=\"${escape(this.css.navbarCollapse.className)} bro-toolbar-buttons\">\n <ul class=\"${escape(ulClass)}\">\n <!-- search-button -->\n <!-- buttons -->\n </ul>\n </div>\n <!--/bro-toolbar-->`;\n }\n\n config!: BroResolvedConfig;\n\n contentClassName: string = 'bro-navbar-nav';\n toolbarTitle!: string;\n\n // The vanilla skins give the classes of their toolbar\n private css!: NonNullable<BroSkinComponents['toolbarMain']['css']>;\n private navContentEl!: HTMLElement;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n events() {\n this.addEventListener('click', (event: Event) => {\n event.preventDefault();\n });\n\n const searchLink = this.navContentEl.children[0];\n\n searchLink.addEventListener('click', () => {\n this.dispatchEvent(\n new CustomEvent(events.toolbarEvent, {\n bubbles: true,\n composed: true,\n detail: events.toolbarSearchOpenEvent\n })\n );\n });\n }\n\n render(): void {\n // The toolbar element\n const broToolbar = document.createElement(this.config.components.toolbar.selector) as BroToolbarComponent;\n\n broToolbar.setAttribute('class', 'bro-toolbar');\n\n broToolbar.config = this.config;\n\n this.appendChild(broToolbar);\n\n // The template in the toolbar element\n const wrapper: HTMLElement = document.createElement('div');\n\n wrapper.insertAdjacentHTML('afterbegin', this.template());\n\n broToolbar.appendToolbarContent(\n ...Array.from(wrapper.children)\n );\n\n // The buttons\n this.appendToolbarContent(\n this.renderSearchButton(),\n\n ...this.renderButtons()\n );\n\n this.querySelectorAll(<string>this.config.components.dropdown?.selector).forEach(broDropdown => {\n broDropdown.replaceWith(broDropdown.children[0]);\n });\n\n this.events();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n appendToolbarContent(...nodes: (Node | string)[]): void {\n if (!this.navContentEl) {\n this.navContentEl = <HTMLElement>this.querySelector(`.${this.contentClassName}`);\n }\n\n this.navContentEl\n .append(...nodes);\n }\n\n private templateToolbarButton(buttonTitle: string, iconHTML?: string, className?: string): HTMLElement {\n return createElement(`\n <li class=\"${escape(this.css.navbarCollapse.ul.li.className)}\">\n <a class=\"${escape(this.css.navbarCollapse.ul.li.a.className)}${className ? ` ${escape(className)}` : ''}\" href=\"\">\n ${iconHTML || ''}${escape(buttonTitle)}\n </a>\n </li>`);\n }\n\n private renderSearchButton(): HTMLElement {\n const broButton = document.createElement(this.config.components.button.selector) as HTMLElement & BroButton;\n\n this.config.components.toolbarMain.beforeRender?.(broButton, this.config.texts.search);\n\n const buttonTitle = broButton.getAttribute('button-title') ?? '';\n\n return this.templateToolbarButton(buttonTitle, broButton.iconHTML, 'bro-toolbar-button-search');\n }\n\n private renderButtons(): HTMLElement[] {\n return (this.config.components.toolbarMain.buttons ?? []).map((button: BroButton | BroDropdown) => {\n if (button.mode === 'navbar-dropdown') {\n const broDropdown: HTMLElement = document.createElement(<string>this.config.components.dropdown?.selector);\n\n (<BroConfiguredElement>broDropdown).config = this.config;\n\n broDropdown.setAttribute('mode', 'navbar-dropdown');\n broDropdown.setAttribute('button-title', button.buttonTitle);\n broDropdown.setAttribute('options', JSON.stringify(button.options));\n\n // The menu sends the value of its option as a toolbar action. The toolbar puts the markup of the menu in place\n // of its element (render), so the element sends its value out of the DOM, and only its own listener hears it\n broDropdown.addEventListener('value', (event: Event) => {\n this.dispatchEvent(\n new CustomEvent(events.toolbarEvent, {\n bubbles: true,\n composed: true,\n detail: (<CustomEvent>event).detail\n })\n );\n });\n\n return broDropdown;\n } else {\n const buttonEl = this.templateToolbarButton(button.buttonTitle, button.iconHTML);\n\n // A config button sends its eventType as a toolbar action, as the Material toolbar does\n buttonEl.querySelector('a')?.addEventListener('click', () => {\n this.dispatchEvent(\n new CustomEvent(events.toolbarEvent, {\n bubbles: true,\n composed: true,\n detail: (<BroButton>button).eventType\n })\n );\n });\n\n return buttonEl;\n }\n });\n }\n}\n","import {type BroButton, BroHTML, BroHTMLElement, type BroView, dispatchAction} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroButtonComponent extends BroHTMLElement implements BroView, BroButton {\n template(): string {\n this.label = this.getAttribute('label') || '';\n\n this.buttonClassName = this.getAttribute('button-class');\n\n this.buttonTitle = this.getAttribute('button-title') || '';\n this.iconHTML = this.getAttribute('icon-html') || this.iconHTML;\n this.mode = <BroButton['mode']>this.getAttribute('mode') || 'button';\n\n this.eventType = this.getAttribute('event-type') || 'action';\n\n // A button with a title takes its name from the title; a button with an icon only takes the label.\n // The title and the name are text; the icon is the markup of the skin\n const className = this.buttonClassName ? ` class=\"${escape(this.buttonClassName)}\"` : '';\n const ariaLabel = (!this.buttonTitle && this.label) ? ` aria-label=\"${escape(this.label)}\"` : '';\n const content = `${escape(this.buttonTitle)}${this.iconHTML ? `${this.buttonTitle ? '&nbsp;' : ''}${this.iconHTML}` : ''}`;\n\n if (this.mode !== 'link') {\n return `\n <button${className}\n type=\"button\"${ariaLabel}>\n ${content}\n </button>`;\n } else {\n return `\n <a${className} href=\"\"\n role=\"button\"${ariaLabel}>\n ${content}\n </a>`;\n }\n }\n\n label!: string;\n buttonClassName!: string | null;\n buttonTitle!: string;\n iconHTML!: string;\n mode: BroButton['mode'];\n\n eventType!: string;\n\n events() {\n const buttonEl = this.children[0];\n\n buttonEl.addEventListener('click', (event: Event) => {\n dispatchAction(buttonEl, this.eventType);\n\n event.preventDefault();\n });\n\n // A link in the role of a button takes Space as a button does, instead of scrolling the page; Enter clicks a link anyway\n if (this.mode === 'link') {\n buttonEl.addEventListener('keydown', (event: Event) => {\n if ((<KeyboardEvent>event).key === ' ' && !(<KeyboardEvent>event).repeat) {\n event.preventDefault();\n\n (<HTMLElement>buttonEl).click();\n }\n });\n }\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n this.events();\n }\n\n connectedCallback(): void {\n if (!this.firstChild) {\n this.render();\n }\n }\n}\n","import {type BroCellElement, broCellSelectors, type BroCol, type BroConfiguredElement, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroRow, type BroTextEllipsis, type BroView} from '@table-bro/core';\n\nconst {escape, text} = BroHTML;\n\nexport class BroTextEllipsisComponent extends BroHTMLElement implements BroView, BroCellElement, BroConfiguredElement, BroTextEllipsis {\n template(): string {\n this.containerClassName = this.getAttribute('container-class');\n this.value = this.getAttribute('value') || '';\n\n return `\n <span class=\"${broCellSelectors.ellipsisContainer}${this.containerClassName ? ` ${escape(this.containerClassName)}` : ''}\">\n <span class=\"${broCellSelectors.ellipsis}\"></span>\n </span>`;\n }\n\n row?: BroRow;\n col?: BroCol;\n // The table sets the config before the element connects\n config!: BroResolvedConfig;\n\n containerClassName!: string | null;\n tooltip!: string;\n value!: string;\n\n /** Cleanup returned by afterRender of the skin, for example the removal of a tooltip. */\n private release?: void | (() => void);\n private released: boolean = false;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n const valueEl = <Element>this.querySelector(`.${broCellSelectors.ellipsis}`);\n\n // The value is markup only for a column with html: true\n if (this.col?.html) {\n valueEl.innerHTML = this.value;\n this.tooltip = text(this.value);\n } else {\n valueEl.textContent = this.value;\n this.tooltip = this.value;\n }\n\n this.afterRender();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n if (this.released) {\n this.released = false;\n\n this.afterRender();\n }\n\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n disconnectedCallback(): void {\n // A move connects the element again in the same task; only a removed element releases the skin callback\n queueMicrotask(() => {\n if (!this.isConnected) {\n if (typeof this.release === 'function') {\n this.release();\n }\n\n this.release = undefined;\n this.released = true;\n }\n });\n }\n\n private afterRender(): void {\n const tooltipEl = this.children[0];\n\n if (this.config.components.textEllipsis.afterRender) {\n this.release = this.config.components.textEllipsis.afterRender(tooltipEl, this.tooltip);\n }\n }\n}\n","import {type BroColSort, type BroConfiguredElement, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroSortDirection, type BroSortHeader, type BroView, dispatchAction, events} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroSortHeaderComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroSortHeader {\n template(): string {\n this.arrowPosition = <BroSortHeader['arrowPosition']>this.getAttribute('arrow-position') || 'after';\n this.sortId = this.getAttribute('sort-id') || '';\n this.dataType = this.getAttribute('data-type') || '';\n this.headerTitle = this.getAttribute('header-title') || '';\n this.iconHTML = this.getAttribute('icon-html') || '';\n this.tooltip = this.getAttribute('tooltip') || '';\n\n let classList: string = '';\n\n if (this.arrowPosition === 'before') {\n classList += ' bro-sort-header-position-before';\n }\n\n // The direction is descending by default\n classList += ' bro-sort-header-descending';\n\n // A control of the column header: Enter and Space sort, as a click does. A header without a title, as of a column\n // of buttons, sorts nothing and is no control, as in the mat skin\n const control = this.headerTitle ? ' role=\"button\" tabindex=\"0\"' : '';\n\n return `\n <div class=\"bro-sort-header-container${classList}\"${control}>\n <div class=\"bro-sort-header-content\">${escape(this.headerTitle)}</div>\n <div class=\"bro-sort-header-arrow\" aria-hidden=\"true\">${this.iconHTML}</div>\n </div>`;\n }\n\n static get observedAttributes(): string[] {\n return ['tooltip'];\n }\n\n config!: BroResolvedConfig;\n\n arrowPosition!: BroSortHeader['arrowPosition'];\n headerTitle!: string;\n dataType!: string;\n iconHTML!: string;\n sortId!: string;\n tooltip!: string;\n\n private _activeSort?: BroColSort;\n private direction: BroSortDirection | '' = '';\n /** Cleanup returned by afterRender of the skin, for example the removal of a tooltip. */\n private release?: void | (() => void);\n private released: boolean = false;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n events() {\n const headerContainerEl = <HTMLElement>this.children[0];\n\n if (!this.headerTitle) {\n return;\n }\n\n headerContainerEl.addEventListener('blur', () => {\n headerContainerEl.classList.remove('bro-sort-header-recently-cleared-ascending');\n });\n\n // The header is a button for the keyboard too: Enter and Space sort it as a click does\n headerContainerEl.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n\n headerContainerEl.click();\n }\n });\n\n headerContainerEl.addEventListener('click', () => {\n if (this.direction === '') {\n this.direction = 'desc';\n\n headerContainerEl.classList.add('bro-sort-header-sorted');\n\n headerContainerEl.classList.remove('bro-sort-header-recently-cleared-ascending');\n } else if (this.direction === 'desc') {\n this.direction = 'asc';\n\n headerContainerEl.classList.remove('bro-sort-header-descending');\n } else if (this.direction === 'asc') {\n this.direction = '';\n\n headerContainerEl.classList.remove('bro-sort-header-sorted');\n headerContainerEl.classList.add('bro-sort-header-descending');\n\n headerContainerEl.classList.add('bro-sort-header-recently-cleared-ascending');\n }\n\n // The third click clears the sort, as in the mat skin: sortDirection is undefined then\n dispatchAction(this, events.filtersSortEvent, {\n sortKey: this.sortId,\n sortDirection: this.direction || undefined\n });\n });\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n this.afterRender();\n\n this.events();\n }\n\n get activeSort(): BroColSort | undefined {\n return this._activeSort;\n }\n\n /** A sort of another column resets the arrow of this header. */\n set activeSort(sort: BroColSort) {\n this._activeSort = sort;\n\n const container = this.children[0];\n\n if (this.direction !== '' && sort?.sortKey !== this.sortId && container) {\n this.direction = '';\n\n container.classList.remove('bro-sort-header-sorted');\n container.classList.add('bro-sort-header-descending');\n }\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n if (this.released) {\n this.released = false;\n\n this.afterRender();\n }\n\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n disconnectedCallback(): void {\n // A move connects the element again in the same task; only a removed element releases the skin callback\n queueMicrotask(() => {\n if (!this.isConnected) {\n if (typeof this.release === 'function') {\n this.release();\n }\n\n this.release = undefined;\n this.released = true;\n }\n });\n }\n\n /** The table gives a new tooltip when the width of the column changes: the skin callback runs again with it. */\n attributeChangedCallback(name: string, oldValue: string | null, value: string | null): void {\n if (!this.rendered || oldValue === value) {\n return;\n }\n\n this.tooltip = value || '';\n\n if (typeof this.release === 'function') {\n this.release();\n }\n\n this.release = undefined;\n\n // A header out of the document gets the callback again when it is connected\n if (this.isConnected) {\n this.afterRender();\n } else {\n this.released = true;\n }\n }\n\n private afterRender(): void {\n const container = this.children[0];\n\n this.release = this.config.components.sortHeader.afterRender?.(container, this.tooltip);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {BroConfiguredElement, BroDropdownOption, BroPaginatorElement, BroPaginatorPageEvent, BroResolvedConfig, BroTexts, BroView} from '@table-bro/core';\nimport {BroHTML, BroHTMLElement} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroPaginatorComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroPaginatorElement {\n template(): string {\n this.disabled = this.getAttribute('disabled') === 'true' || false;\n this.length = Number(this.getAttribute('length')) || 0;\n this.pageIndex = Math.max(Number(this.getAttribute('page-index')) || 0, 0);\n this.pageSize = Number(this.getAttribute('page-size'));\n // The table writes 'true' or 'false'; without the attribute the buttons are shown\n this.showFirstLastButtons = this.getAttribute('show-first-last-buttons') !== 'false';\n\n this.parsePageSizeOptions();\n\n const texts = this.texts = this.config.texts;\n\n // The vanilla skins, which have this paginator, give the classes of its list and their dropdown\n const ul = this.config.components.paginator.css?.ul;\n // No class attribute for a class the skin does not give\n const ulClass = ul?.className ? ` class=\"${escape(ul.className)}\"` : '';\n const liClass = ul?.li?.className ? ` class=\"${escape(ul.li.className)}\"` : '';\n const aClass = ul?.li?.a?.className ? `${escape(ul.li.a.className)} ` : '';\n\n this.dropdownSelector = <string>this.config.components.dropdown?.selector;\n\n return `\n <div class=\"bro-paginator-outer-container\">\n <div class=\"bro-paginator-inner-container\">\n <div class=\"bro-paginator-page-size\">\n <div class=\"bro-paginator-page-size-label\">\n ${escape(texts.itemsPerPage)}\n </div>\n\n ${this.pageSizeDropdown?.length ? '' : this.templatePageSizeValue()}\n </div>\n\n <div class=\"bro-paginator-range-actions\">\n <div class=\"bro-paginator-range-label\" aria-live=\"polite\">\n ${escape(texts.rangeLabel(this.pageIndex, this.pageSize, this.length))}\n </div>\n\n <nav aria-label=\"${escape(texts.pageNavigation)}\">\n <ul${ulClass}>\n ${this.showFirstLastButtons\n ? `\n <li${liClass}>\n <a class=\"${aClass}bro-paginator-navigation-first\" href=\"\"\n aria-label=\"${escape(texts.firstPage)}\">${escape(texts.first)}</a>\n </li>`\n : ''\n }\n\n <li${liClass}>\n <a class=\"${aClass}bro-paginator-navigation-previous\" href=\"\"\n aria-label=\"${escape(texts.previousPage)}\">${escape(texts.previous)}</a>\n </li>\n\n <li${liClass}>\n <a class=\"${aClass}bro-paginator-navigation-next\" href=\"\"\n aria-label=\"${escape(texts.nextPage)}\">${escape(texts.next)}</a>\n </li>\n\n ${this.showFirstLastButtons\n ? `\n <li${liClass}>\n <a class=\"${aClass}bro-paginator-navigation-last\" href=\"\"\n aria-label=\"${escape(texts.lastPage)}\">${escape(texts.last)}</a>\n </li>`\n : ''\n }\n </ul>\n </nav>\n </div>\n </div>\n </div>`;\n }\n\n static get observedAttributes() {\n return [\n 'page-index', 'page-size', 'length',\n 'page-size-options', 'disabled'\n ];\n }\n\n // The table sets the config, and the template reads the other values from the attributes, before the element renders\n config!: BroResolvedConfig;\n\n disabled!: boolean;\n length!: number;\n pageIndex!: number;\n pageSize!: number;\n pageSizeOptions!: number[];\n showFirstLastButtons!: boolean;\n\n private page!: BroPaginatorPageEvent;\n private eventName = 'page';\n\n // The elements of the template of the paginator, found when it renders\n private firstEl!: HTMLElement;\n private previousEl!: HTMLElement;\n private nextEl!: HTMLElement;\n private lastEl!: HTMLElement;\n\n private pageSizeEl!: HTMLElement;\n private pageSizeValueEl!: HTMLElement;\n private rangeLabelEl!: HTMLElement;\n\n private dropdownSelector!: string;\n /** The texts of the table, taken at the render: before it the attributes change nothing. */\n private texts?: BroTexts;\n private pageSizeDropdown?: BroDropdownOption[];\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n events() {\n this.previousEl = <HTMLElement>this.querySelector('.bro-paginator-navigation-previous');\n this.nextEl = <HTMLElement>this.querySelector('.bro-paginator-navigation-next');\n\n this.previousEl.addEventListener('click', (event: Event) => {\n event.preventDefault();\n\n if (!this.hasPreviousPage()) {\n return;\n }\n\n this.navigate(this.pageIndex - 1);\n });\n\n this.nextEl.addEventListener('click', (event: Event) => {\n event.preventDefault();\n\n if (!this.hasNextPage()) {\n return;\n }\n\n this.navigate(this.pageIndex + 1);\n });\n\n if (this.showFirstLastButtons) {\n this.firstEl = <HTMLElement>this.querySelector('.bro-paginator-navigation-first');\n this.lastEl = <HTMLElement>this.querySelector('.bro-paginator-navigation-last');\n\n this.firstEl.addEventListener('click', (event: Event) => {\n event.preventDefault();\n\n if (!this.hasPreviousPage()) {\n return;\n }\n\n this.navigate(0);\n });\n\n this.lastEl.addEventListener('click', (event: Event) => {\n event.preventDefault();\n\n if (!this.hasNextPage()) {\n return;\n }\n\n this.navigate(this.getNumberOfPages() - 1);\n });\n }\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n // The list gets the config of the table before it connects\n if (this.pageSizeDropdown?.length) {\n this.pageSizeEl = <HTMLElement>this.querySelector('.bro-paginator-page-size');\n\n this.renderPageSizeDropdown();\n }\n\n this.events();\n\n this.renderNavigationState();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n attributeChangedCallback(name: string, previousValue: string, currentValue: string) {\n if (!this.texts) {\n return;\n }\n\n if (name === 'page-index' || name === 'page-size' || name === 'length') {\n if (!this.rangeLabelEl) {\n this.rangeLabelEl = <HTMLElement>this.querySelector('.bro-paginator-range-label');\n }\n\n if (!this.pageSizeValueEl) {\n this.pageSizeValueEl = <HTMLElement>this.querySelector('.bro-paginator-page-size-value');\n }\n\n if (name === 'page-index') {\n this.pageIndex = +currentValue;\n }\n\n if (name === 'page-size') {\n this.pageSize = +currentValue;\n\n if (!this.pageSizeOptions.length) {\n this.pageSizeValueEl.innerText = currentValue;\n }\n }\n\n if (name === 'length') {\n this.length = +currentValue;\n }\n\n this.rangeLabelEl.textContent = this.texts.rangeLabel(this.pageIndex, this.pageSize, this.length);\n\n this.renderNavigationState();\n }\n\n if (name === 'page-size-options') {\n this.parsePageSizeOptions();\n\n this.unrenderPageSizeControls();\n\n if (!this.pageSizeEl) {\n this.pageSizeEl = <HTMLElement>this.querySelector('.bro-paginator-page-size');\n }\n\n if (this.pageSizeDropdown?.length) {\n this.renderPageSizeDropdown();\n } else {\n this.renderPageSizeValue();\n\n this.setAttribute('disabled', true.toString());\n }\n }\n\n if (name === 'disabled') {\n this.setDisabledState(currentValue === true.toString());\n }\n }\n\n /** Whether there is a previous page. */\n hasPreviousPage(): boolean {\n return this.pageIndex >= 1 && this.pageSize != 0;\n }\n\n /** Whether there is a next page. */\n hasNextPage(): boolean {\n const maxPageIndex = this.getNumberOfPages() - 1;\n\n return this.pageIndex < maxPageIndex && this.pageSize != 0;\n }\n\n /** Calculate the number of pages */\n getNumberOfPages(): number {\n if (!this.pageSize) {\n return 0;\n }\n\n return Math.ceil(this.length / this.pageSize);\n }\n\n private parsePageSizeOptions() {\n if (!this.getAttribute('page-size-options')) {\n return;\n }\n\n try {\n this.pageSizeOptions = JSON.parse(<string>this.getAttribute('page-size-options'))\n .map((item: string) => +item);\n\n this.pageSizeDropdown = this.pageSizeOptions.map(item => {\n return {\n value: item.toString(),\n title: item.toString()\n };\n });\n } catch (err) {\n this.pageSizeOptions = [];\n\n if (this.config.debug) {\n console.log(err);\n }\n }\n }\n\n private templatePageSizeValue(): string {\n return `<div class=\"bro-paginator-page-size-value\">${this.pageSize}</div>`;\n }\n\n private unrenderPageSizeControls(): void {\n const dropdown = <HTMLElement>this.querySelector(this.dropdownSelector);\n\n if (dropdown) {\n dropdown.remove();\n }\n\n const pageSizeValueEl = <HTMLElement>this.querySelector('.bro-paginator-page-size-value');\n\n if (pageSizeValueEl) {\n pageSizeValueEl.remove();\n }\n }\n\n private renderPageSizeDropdown(): void {\n const broDropdown: HTMLElement = document.createElement(this.dropdownSelector);\n\n (<BroConfiguredElement>broDropdown).config = this.config;\n broDropdown.setAttribute('mode', 'select');\n broDropdown.setAttribute('button-title', this.pageSize.toString());\n broDropdown.setAttribute('options', JSON.stringify(this.pageSizeDropdown));\n broDropdown.setAttribute('label', this.texts!.itemsPerPage);\n\n this.eventsPageSize(broDropdown);\n\n this.pageSizeEl.append(\n broDropdown\n );\n }\n\n private eventsPageSize(broDropdown: Element) {\n broDropdown.addEventListener('value', (event: Event) => {\n const value: string = (<CustomEvent>event).detail;\n\n this.changePageSize(+value);\n\n this.setAttribute('page-size', value);\n });\n }\n\n private renderPageSizeValue(): void {\n this.pageSizeEl.insertAdjacentHTML('beforeend', this.templatePageSizeValue());\n }\n\n private setDisabledState(disable: boolean) {\n this.disabled = disable;\n\n const dropdown = <HTMLElement>this.querySelector(this.dropdownSelector);\n\n if (dropdown) {\n dropdown.setAttribute('disabled', disable.toString());\n }\n\n this.renderNavigationState();\n }\n\n /**\n * Disables the buttons of a disabled paginator, First and Previous on the first page, and Next and Last on the last\n * one, as MatPaginator does.\n */\n private renderNavigationState(): void {\n const noPrevious = this.disabled || !this.hasPreviousPage();\n const noNext = this.disabled || !this.hasNextPage();\n const buttons: [HTMLElement | undefined, boolean][] = [[this.firstEl, noPrevious], [this.previousEl, noPrevious], [this.nextEl, noNext], [this.lastEl, noNext]];\n\n buttons.forEach(([button, disable]) => {\n // The class shows the state, and aria-disabled tells it to screen readers\n if (disable) {\n button?.parentElement?.classList.add('disabled');\n button?.setAttribute('aria-disabled', 'true');\n } else {\n button?.parentElement?.classList.remove('disabled');\n button?.removeAttribute('aria-disabled');\n }\n });\n }\n\n /** Navigates to a specific page index. */\n private navigate(index: number) {\n const previousIndex = this.pageIndex;\n\n if (index !== previousIndex) {\n this.pageIndex = index;\n this.setAttribute('page-index', this.pageIndex.toString());\n this.emitPageEvent(previousIndex);\n }\n }\n\n /**\n * Changes the page size so that the first item displayed on the page will still be\n * displayed using the new page size.\n *\n * For example, if the page size is 10 and on the second page (items indexed 10-19) then\n * switching so that the page size is 5 will set the third page as the current page so\n * that the 10th item will still be displayed.\n */\n changePageSize(pageSize: number) {\n // Current page needs to be updated to reflect the new page size. Navigate to the page\n // containing the previous page's first item.\n const startIndex = this.pageIndex * this.pageSize;\n const previousIndex = this.pageIndex;\n\n this.pageIndex = Math.floor(startIndex / pageSize) || 0;\n this.pageSize = pageSize;\n this.emitPageEvent(previousIndex);\n }\n\n /** Emits an event notifying that a change of the paginator's properties has been triggered. */\n private emitPageEvent(previousPageIndex: number) {\n this.page = {\n previousPageIndex,\n pageIndex: this.pageIndex,\n pageSize: this.pageSize,\n length: this.length\n };\n\n this.dispatchEvent(\n new CustomEvent(this.eventName, {\n bubbles: true,\n composed: true,\n detail: this.page\n })\n );\n }\n}\n","import {BroSwitchComponent} from './bootstrap-based/bro-switch';\nimport {BroToolbarComponent} from './bootstrap-based/toolbar/bro-toolbar';\nimport {BroToolbarMainComponent} from './bootstrap-based/toolbar/bro-toolbar-main';\nimport {BroButtonComponent} from './bro-button';\nimport {BroTextEllipsisComponent} from './bro-text-ellipsis';\nimport {BroSortHeaderComponent} from './material-based/bro-sort-header';\nimport {BroPaginatorComponent} from './material-based/paginator/bro-paginator';\n\n/** The elements that the bs and nv skins share. */\nconst sharedElements: Record<string, CustomElementConstructor> = {\n 'bro-button': BroButtonComponent,\n 'bro-paginator': BroPaginatorComponent,\n 'bro-sort-header': BroSortHeaderComponent,\n 'bro-text-ellipsis': BroTextEllipsisComponent,\n 'bro-toolbar': BroToolbarComponent,\n 'bro-toolbar-main': BroToolbarMainComponent\n};\n\n/**\n * Defines the optional element bro-switch, a boolean of a column as a switch, unless it is defined; without a DOM, as\n * in the server render, it does nothing.\n */\nexport function withSwitch(): void {\n defineElement('bro-switch', BroSwitchComponent);\n}\n\n/** Defines an element of a skin unless it is defined: a second load of the bundle of the skin finds it defined. */\nexport function defineElement(name: string, element: CustomElementConstructor): void {\n if (typeof customElements !== 'undefined' && !customElements.get(name)) {\n customElements.define(name, element);\n }\n}\n\n/**\n * Defines the shared elements of a vanilla skin. Each skin bundle carries its own copy of them, so with two bundles\n * on one page the bundle loaded first defines them and the other skin works with its classes. Two vanilla skin\n * bundles on one page are not supported, so the skin loaded second warns about it.\n */\nexport function defineSharedElements(skinPackage: string): void {\n const definedElsewhere: string[] = [];\n\n Object.entries(sharedElements).forEach(([name, element]) => {\n const defined = customElements.get(name);\n\n if (!defined) {\n customElements.define(name, element);\n } else if (defined !== element) {\n definedElsewhere.push(name);\n }\n });\n\n if (definedElsewhere.length) {\n console.warn(`${skinPackage}: ${definedElsewhere.join(', ')} are already defined by another vanilla skin bundle, `\n + 'so this skin uses its elements. Load one vanilla skin bundle per page.');\n }\n}\n","import {type BroConfiguredElement, type BroDropdown, type BroDropdownOption, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroView} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroNativeDropdownComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroDropdown {\n template(): string {\n this.buttonTitle = this.getAttribute('button-title') || '';\n this.name = this.getAttribute('name') || 'action';\n this.mode = <BroDropdown['mode']>this.getAttribute('mode') || 'dropdown';\n\n try {\n this.options = JSON.parse(<string>this.getAttribute('options'));\n } catch (err) {\n this.options = [];\n\n if (this.config.debug) {\n console.log(err);\n }\n }\n\n // The select takes the name that the element gets, such as the label of the page size, else its title, as More\n const label = this.getAttribute('label') || this.buttonTitle;\n // The titles, the values and the names of the config are text in the markup\n const ariaLabel = label ? ` aria-label=\"${escape(label)}\"` : '';\n\n if (this.mode === 'select' || this.mode === 'dropdown') {\n return `\n <select name=\"${escape(this.name)}\"${ariaLabel}>\n <option value=\"\" hidden>${escape(this.buttonTitle)}</option>\n ${this.templateDropdown(this.options)}\n </select>`;\n } else {\n // navbar-dropdown\n return `\n <li class=\"bro-nav-item bro-dropdown\">\n <select name=\"${escape(this.name)}\"${ariaLabel}>\n <option value=\"\" hidden>${escape(this.buttonTitle)}</option>\n ${this.templateDropdown(this.options)}\n </select>\n </li>`;\n }\n }\n\n static get observedAttributes() {\n return [\n 'disabled'\n ];\n }\n\n config!: BroResolvedConfig;\n\n buttonTitle!: string;\n name!: string;\n\n mode!: BroDropdown['mode'];\n options!: BroDropdownOption[];\n\n private eventName = 'value';\n\n private dropdownToggleEl!: HTMLElement;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n /**\n * The select sends its value. A menu (navbar-dropdown) shows its title again after a choice, and acts only on a choice:\n * the keys of a closed select change its value on Windows, so a value that came from the keyboard waits for Enter.\n */\n events() {\n const select = <HTMLSelectElement>this.querySelector('select');\n const menu = (this.mode === 'navbar-dropdown');\n\n let keyboard = false;\n let pending: string | null = null;\n\n this.dropdownToggleEl = select;\n this.renderDisabled();\n\n const send = (value: string) => {\n pending = null;\n\n if (menu) {\n select.selectedIndex = 0;\n }\n\n this.dispatchEvent(\n new CustomEvent(this.eventName, {\n bubbles: true,\n composed: true,\n detail: value\n })\n );\n };\n\n if (menu) {\n select.addEventListener('pointerdown', () => {\n keyboard = false;\n });\n\n select.addEventListener('keydown', (event: KeyboardEvent) => {\n keyboard = (event.key !== 'Enter');\n\n if (event.key === 'Enter' && pending !== null) {\n send(pending);\n }\n });\n\n // A value that the keyboard chose and did not confirm leaves with the focus\n select.addEventListener('blur', () => {\n if (pending !== null) {\n pending = null;\n select.selectedIndex = 0;\n }\n });\n }\n\n select.addEventListener('change', () => {\n if (menu && keyboard) {\n pending = select.value;\n } else {\n send(select.value);\n }\n });\n }\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n this.events();\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n attributeChangedCallback(name: string) {\n // Before its render the element has no select: the render takes the attribute\n if (name === 'disabled' && this.dropdownToggleEl) {\n this.renderDisabled();\n }\n }\n\n private templateDropdown(options: BroDropdownOption[]): string {\n return `\n ${options.map((option: BroDropdownOption) => {\n if ('value' in option && 'title' in option) {\n return `\n <option value=\"${escape(option.value)}\">${escape(option.title)}</option>`;\n } else if ('divider' in option) {\n return `\n <hr>`;\n } else if ('header' in option) {\n return `\n <optgroup label=\"${escape(option.header)}\"></optgroup>`;\n }\n }).join('')}`;\n }\n\n /** The select is disabled by the attribute disabled=\"true\". */\n private renderDisabled(): void {\n this.dropdownToggleEl.toggleAttribute('disabled', this.getAttribute('disabled') === 'true');\n }\n}\n","import {type BroConfiguredElement, BroHTML, BroHTMLElement, type BroProgressBar, type BroProgressMode, type BroResolvedConfig, type BroView} from '@table-bro/core';\n\nconst {escape} = BroHTML;\n\nexport class BroNativeProgressBarComponent extends BroHTMLElement implements BroView, BroConfiguredElement, BroProgressBar {\n template(): string {\n // The skin has no colors of the bar; the contract keeps the attribute of the table\n this.color = this.getAttribute('color') || '';\n\n this.mode = <BroProgressMode>this.getAttribute('mode') || 'indeterminate';\n\n const indeterminate = (this.mode === 'indeterminate');\n\n this.value = (indeterminate ? 100 : (this.getAttribute('value') || 0))\n .toString();\n\n return `\n <progress ${indeterminate ? '' : `value=\"${this.value}\"`}\n max=\"${indeterminate ? '' : 100}\" aria-label=\"${escape(this.config.texts.loadingProgress)}\"></progress>`;\n }\n\n static get observedAttributes() {\n return [\n 'value'\n ];\n }\n\n config!: BroResolvedConfig;\n\n color!: string;\n mode!: BroProgressMode;\n value!: string;\n\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n private valueEl!: HTMLProgressElement;\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n }\n\n connectedCallback(): void {\n if (this.rendered) {\n return;\n }\n\n this.rendered = true;\n\n this.render();\n }\n\n attributeChangedCallback(name: string, previousValue: string, currentValue: string) {\n if (this.mode === 'determinate' && name === 'value') {\n if (!this.valueEl) {\n this.valueEl = <HTMLProgressElement>this.querySelector('progress');\n }\n\n this.valueEl.value = +currentValue;\n }\n }\n}\n","import {type BroCellElement, type BroCol, type BroConfiguredElement, BroHTMLElement, type BroResolvedConfig, type BroRow, type BroView, fitCellItems} from '@table-bro/core';\n\n/**\n * The tags of a cell of the vanilla skins: the items of the field of the column in the row, each in the markup of a tag\n * of the skin.\n */\nexport abstract class BroTagsComponent extends BroHTMLElement implements BroView, BroCellElement, BroConfiguredElement {\n template(): string {\n const name = this.col?.name;\n const items = name && this.row?.[name];\n\n this.items = Array.isArray(items) && items.length ? items : [this.config?.texts.noItems ?? ''];\n\n return this.items.map(() => this.tagHTML).join('');\n }\n\n row?: BroRow;\n col?: BroCol;\n config?: BroResolvedConfig;\n\n items: string[] = [];\n\n /** Stops fitting the tags into the line when the element leaves the DOM. */\n private fitting?: AbortController;\n /** A move in the DOM connects the element again; it keeps its markup and listeners. */\n private rendered: boolean = false;\n\n render(): void {\n this.insertAdjacentHTML('afterbegin', this.template());\n\n // A tag is markup only for a column with html: true\n Array.from(this.children).forEach((tagEl: Element, i: number) => {\n if (this.col?.html) {\n tagEl.innerHTML = this.items[i];\n } else {\n tagEl.textContent = this.items[i];\n }\n });\n }\n\n /** The empty markup of one tag of the skin, which takes the text of an item. */\n protected abstract readonly tagHTML: string;\n\n connectedCallback(): void {\n if (!this.rendered) {\n this.rendered = true;\n\n this.render();\n }\n\n // The tags that do not fit the line give way to an ellipsis\n this.fitting = new AbortController();\n fitCellItems(this, this.fitting.signal);\n }\n\n disconnectedCallback(): void {\n this.fitting?.abort();\n }\n}\n","import {BroTagsComponent} from '../../shared/js/bro-tags';\n\n/** The tags of the native skin: marks. */\nexport class BroNativeTagsComponent extends BroTagsComponent {\n protected readonly tagHTML: string = '<mark></mark>';\n}\n","import type {BroButton, BroSkinConfig} from '@table-bro/core';\n\n// The constant keeps the type of its value: an application reads its buttons and its states without checks of undefined\nexport const nativeSkinConfig = {\n css: {\n table: {\n thead: {\n tr: {\n className: 'bro-header-row',\n\n th: {\n className: 'bro-header-cell'\n }\n }\n },\n\n tbody: {\n tr: {\n className: 'bro-row',\n\n td: {\n className: 'bro-cell'\n }\n }\n }\n },\n\n shadow: {\n className: 'shadow-lg'\n }\n },\n\n components: {\n button: {\n selector: 'bro-button',\n\n iconSelector: '.bro-button-toggle',\n\n beforeRender: (element: Element, value: string) => {\n element.setAttribute('mode', 'link');\n element.setAttribute('button-title', value);\n element.setAttribute('icon-html', '<span class=\"bro-button-toggle\"></span>');\n }\n },\n dropdown: {\n selector: 'bro-nv-dropdown'\n },\n filterDrawer: {\n beforeRender: (closeButton: Element) => {\n (<Element & BroButton>closeButton).iconHTML = '&times;';\n closeButton.setAttribute('button-class', 'bro-nav-link');\n closeButton.setAttribute('mode', 'link');\n }\n },\n paginator: {\n selector: 'bro-paginator',\n\n css: {\n ul: {\n className: 'bro-pagination',\n\n li: {\n className: 'bro-page-item',\n\n a: {\n className: 'bro-page-link'\n }\n }\n }\n }\n },\n progressBar: {\n selector: 'bro-nv-progress-bar'\n },\n sortHeader: {\n selector: 'bro-sort-header',\n contentSelector: '.bro-sort-header-content',\n\n beforeRender: <(element: Element, value: string) => void>((element: Element) => {\n element.setAttribute('icon-html', '<span class=\"bro-button-icon\">&#9660;</span>');\n }),\n afterRender: (element: Element, value: string) => {\n element.setAttribute('title', value);\n }\n },\n state: {\n states: {\n loading: ['🚀', 'Loading'],\n 'no-data': ['💔', 'No data'],\n 'not-found': ['🔦', 'No records found'],\n fail: ['😕', 'Failed']\n }\n },\n switch: {\n selector: 'bro-switch',\n\n css: {\n div: {\n className: 'bro-form-check bro-form-switch',\n\n input: {\n className: 'bro-form-check-input'\n }\n }\n }\n },\n textEllipsis: {\n selector: 'bro-text-ellipsis',\n\n afterRender: (element: Element, value: string) => {\n element.setAttribute('title', value);\n }\n },\n toolbar: {\n selector: 'bro-toolbar',\n\n css: {\n nav: {\n className: 'bro-navbar bro-navbar-expand'\n }\n }\n },\n toolbarMain: {\n selector: 'bro-toolbar-main',\n\n css: {\n toolbarTitle: {\n className: 'bro-navbar-brand'\n },\n navbarCollapse: {\n className: 'bro-navbar-collapse',\n\n ul: {\n li: {\n className: 'bro-nav-item',\n\n a: {\n className: 'bro-nav-link'\n }\n }\n }\n }\n },\n\n // The value is the word of the search button, texts.search of the config\n beforeRender: (searchButton: Element, value: string) => {\n searchButton.setAttribute('button-title', value);\n }\n },\n toolbarSearch: {\n beforeRender: (backButton: Element, clearButton: Element) => {\n (<Element & BroButton>backButton).iconHTML = '&larr;';\n backButton.setAttribute('button-class', 'bro-nav-link');\n backButton.setAttribute('mode', 'link');\n\n (<Element & BroButton>clearButton).iconHTML = '&times;';\n clearButton.setAttribute('button-class', 'bro-nav-link');\n clearButton.setAttribute('mode', 'link');\n }\n }\n },\n\n // The optional elements: a table that uses one undefined names its function in the console\n elements: {\n 'bro-nv-tags': 'withTags',\n 'bro-switch': 'withSwitch'\n }\n} satisfies BroSkinConfig;\n","import {registerSkin} from '@table-bro/core';\n\nimport {defineElement, defineSharedElements} from '../../shared/js/define-shared-elements';\nimport {BroNativeDropdownComponent} from './bro-dropdown.native';\nimport {BroNativeProgressBarComponent} from './bro-progress-bar.native';\nimport {BroNativeTagsComponent} from './bro-tags.native';\nimport {nativeSkinConfig} from './table-bro.native.config';\n\n// The elements are defined only in the browser: imported without a DOM, as in the server render, the skin only\n// registers its config. The optional elements, tags and switch, come with withTags() and withSwitch()\nif (typeof customElements !== 'undefined') {\n /* Skin - Shared */\n defineSharedElements('@table-bro/native');\n\n /* Skin - Native */\n defineElement('bro-nv-dropdown', BroNativeDropdownComponent);\n defineElement('bro-nv-progress-bar', BroNativeProgressBarComponent);\n}\n\nregisterSkin('nv', nativeSkinConfig);\n\n/**\n * Defines the optional element bro-nv-tags, the items of a column as tags, unless it is defined; without a DOM, as in\n * the server render, it does nothing. A page without the call does not carry the code of the tags.\n */\nexport function withTags(): void {\n defineElement('bro-nv-tags', BroNativeTagsComponent);\n}\n\nexport * from './table-bro.native.config';\nexport {BroNativeTagsComponent} from './bro-tags.native';\nexport {BroSwitchComponent} from '../../shared/js/bootstrap-based/bro-switch';\nexport {withSwitch} from '../../shared/js/define-shared-elements';\n"],"mappings":"A,shBAEA,GAAM,CAAC,OAAAiC,GAAUjC,EAAAA,QAOjB,IAAamC,EAAb,cAAwClC,EAAAA,cAAwD,CAC9F,UAAmB,CACjB,KAAK,IAAM,KAAK,OAAO,WAAW,QAAQ,IAE1C,KAAK,QAAU,KAAK,aAAa,SAAS,EAE1C,IAAMmC,EAAW,KAAK,UAAY,OAElC,MAAO;aACE,KAAK,IAAM,UAAUlC,EAAO,KAAK,IAAI,IAAI,SAAS,EAAE,GAAK,GAAG;;iBAExD,KAAK,IAAM,UAAUA,EAAO,KAAK,IAAI,IAAI,MAAM,SAAS,EAAE,GAAK,GAAG;;iBAElEkC,EAAU,WAAa,GAAG;aAEzC,CAEA,OAEA,IAEA,QAEA,IAEA,SAA4B,GAE5B,QAAS,CACP,IAAMC,EAA0B,KAAK,cAAc,OAAO,EACpDC,EAAO,KAAK,aAAa,MAAM,EAErCD,EAAM,aAAa,aAAc,KAAK,KAAK,OAAS,EAAE,EAEtDA,EAAM,iBAAiB,aAAgB,CACjCC,GACF,KAAK,cAAc,IAAI,YAAY,SAAU,CAAC,OAAQA,CAAI,CAAC,CAAC,CAEhE,CAAC,CACH,CAEA,QAAe,CACb,KAAK,mBAAmB,aAAc,KAAK,SAAS,CAAC,EAErD,KAAK,OAAO,CACd,CAEA,mBAA0B,CACpB,KAAK,WAIT,KAAK,SAAW,GAEhB,KAAK,OAAO,EACd,CACF,EC9DA,GAAM,CAAC,OAAAC,GAAUpC,EAAAA,QAEjB,IAAaqC,EAAb,cAAyCpC,EAAAA,cAA2E,CAClH,UAAmB,CACjB,KAAK,IAAwD,KAAK,OAAO,WAAW,QAAQ,IAE5F,IAAMqC,EAAW,KAAK,IAAI,IAAI,KAAK,UAAY,GAAG,KAAK,IAAI,IAAI,IAAI,UAAU,GAAG,KAAK,mBAAqB,KAAK,iBAE/G,MAAO;oBACSpC,EAAO,KAAK,IAAI,IAAI,SAAS,EAAE;sBAC7BA,EAAOoC,CAAQ,EAAE;;;aAIrC,CAEA,OACA,iBAA2B,sBAG3B,IAEA,QAAe,CACb,KAAK,mBAAmB,aAAc,KAAK,SAAS,CAAC,CACvD,CAEA,qBAAqB,GAAGC,EAAgC,CACjD,KAAK,YACR,KAAK,OAAO,EAGd,KAAK,cAAc,IAAI,KAAK,kBAAkB,CAAC,EAC3C,OAAO,GAAGA,CAAK,CACrB,CACF,EChCA,GAAM,CAAC,gBAAe,OAAAC,GAAUrC,EAAAA,QAEhC,IAAasC,EAAb,cAA6CrC,EAAAA,cAAwE,CACnH,UAAmB,CACjB,KAAK,IAA4D,KAAK,OAAO,WAAW,YAAY,IAEpG,KAAK,aAAe,KAAK,OAAO,aAEhC,IAAMsC,EAAU,KAAK,IAAI,eAAe,GAAG,UAAY,GAAG,KAAK,IAAI,eAAe,GAAG,UAAU,GAAG,KAAK,mBAAqB,KAAK,iBAEjI,MAAO;;;uBAGYrC,EAAO,KAAK,IAAI,aAAa,SAAS,EAAE,IAAIA,EAAO,KAAK,YAAY,EAAE;;;;sBAIvEA,EAAO,KAAK,IAAI,eAAe,SAAS,EAAE;uBACzCA,EAAOqC,CAAO,EAAE;;;;;0BAMrC,CAEA,OAEA,iBAA2B,iBAC3B,aAGA,IACA,aAEA,SAA4B,GAE5B,QAAS,CACP,KAAK,iBAAiB,QAAU,GAAiB,CAC/CC,EAAM,eAAe,CACvB,CAAC,EAID,KAFwB,aAAa,SAAS,EAEpC,CAAC,iBAAiB,YAAe,CACzC,KAAK,cACH,IAAI,YAAYrC,EAAAA,OAAO,aAAc,CACnC,QAAS,GACT,SAAU,GACV,OAAQA,EAAAA,OAAO,sBACjB,CAAC,CACH,CACF,CAAC,CACH,CAEA,QAAe,CAEb,IAAMsC,EAAa,SAAS,cAAc,KAAK,OAAO,WAAW,QAAQ,QAAQ,EAEjFA,EAAW,aAAa,QAAS,aAAa,EAE9C,EAAW,OAAS,KAAK,OAEzB,KAAK,YAAYA,CAAU,EAG3B,IAAMC,EAAuB,SAAS,cAAc,KAAK,EAEzDA,EAAQ,mBAAmB,aAAc,KAAK,SAAS,CAAC,EAExDD,EAAW,qBACT,GAAG,MAAM,KAAKC,EAAQ,QAAQ,CAChC,EAGA,KAAK,qBACH,KAAK,mBAAmB,EAExB,GAAG,KAAK,cAAc,CACxB,EAEA,KAAK,iBAAyB,KAAK,OAAO,WAAW,UAAU,QAAQ,CAAC,CAAC,QAAQ,GAAe,CAC9FC,EAAY,YAAYA,EAAY,SAAS,EAAE,CACjD,CAAC,EAED,KAAK,OAAO,CACd,CAEA,mBAA0B,CACpB,KAAK,WAIT,KAAK,SAAW,GAEhB,KAAK,OAAO,EACd,CAEA,qBAAqB,GAAGP,EAAgC,CACtD,AACE,KAAK,eAA4B,KAAK,cAAc,IAAI,KAAK,kBAAkB,EAGjF,KAAK,aACF,OAAO,GAAGA,CAAK,CACpB,CAEA,sBAA8B,EAAqB,EAAmB,EAAiC,CACrG,OAAOQ,EAAc;mBACN1C,EAAO,KAAK,IAAI,eAAe,GAAG,GAAG,SAAS,EAAE;oBAC/CA,EAAO,KAAK,IAAI,eAAe,GAAG,GAAG,EAAE,SAAS,IAAI2C,EAAY,IAAI3C,EAAO2C,CAAS,IAAM,GAAG;aACpGC,GAAY,KAAK5C,EAAO6C,CAAW,EAAE;;YAEtC,CACV,CAEA,oBAA0C,CACxC,IAAMC,EAAY,SAAS,cAAc,KAAK,OAAO,WAAW,OAAO,QAAQ,EAE/E,KAAK,OAAO,WAAW,YAAY,eAAeA,EAAW,KAAK,OAAO,MAAM,MAAM,EAErF,IAAMD,EAAcC,EAAU,aAAa,cAAc,GAAK,GAE9D,OAAO,KAAK,sBAAsBD,EAAaC,EAAU,SAAU,2BAA2B,CAChG,CAEA,eAAuC,CACrC,OAAQ,KAAK,OAAO,WAAW,YAAY,SAAW,CAAC,EAAA,CAAG,IAAK,GAAoC,CACjG,GAAIC,EAAO,OAAS,kBAAmB,CACrC,IAAMN,EAA2B,SAAS,cAAsB,KAAK,OAAO,WAAW,UAAU,QAAQ,EAoBzG,MAlBA,GAAoC,OAAS,KAAK,OAElDA,EAAY,aAAa,OAAQ,iBAAiB,EAClDA,EAAY,aAAa,eAAgBM,EAAO,WAAW,EAC3DN,EAAY,aAAa,UAAW,KAAK,UAAUM,EAAO,OAAO,CAAC,EAIlEN,EAAY,iBAAiB,QAAU,GAAiB,CACtD,KAAK,cACH,IAAI,YAAYxC,EAAAA,OAAO,aAAc,CACnC,QAAS,GACT,SAAU,GACV,OAAsBqC,EAAO,MAC/B,CAAC,CACH,CACF,CAAC,EAEMG,CACT,CAAO,CACL,IAAMO,EAAW,KAAK,sBAAsBD,EAAO,YAAaA,EAAO,QAAQ,EAa/E,OAVAC,EAAS,cAAc,GAAG,CAAC,EAAE,iBAAiB,YAAe,CAC3D,KAAK,cACH,IAAI,YAAY/C,EAAAA,OAAO,aAAc,CACnC,QAAS,GACT,SAAU,GACV,OAAoB8C,EAAQ,SAC9B,CAAC,CACH,CACF,CAAC,EAEMC,CACT,CACF,CAAC,CACH,CACF,EC1KA,GAAM,CAAC,OAAAC,GAAU/C,EAAAA,QAEjB,IAAagD,EAAb,cAAwC/C,EAAAA,cAA6C,CACnF,UAAmB,CACjB,KAAK,MAAQ,KAAK,aAAa,OAAO,GAAK,GAE3C,KAAK,gBAAkB,KAAK,aAAa,cAAc,EAEvD,KAAK,YAAc,KAAK,aAAa,cAAc,GAAK,GACxD,KAAK,SAAW,KAAK,aAAa,WAAW,GAAK,KAAK,SACvD,KAAK,KAA0B,KAAK,aAAa,MAAM,GAAK,SAE5D,KAAK,UAAY,KAAK,aAAa,YAAY,GAAK,SAIpD,IAAMwC,EAAY,KAAK,gBAAkB,WAAWvC,EAAO,KAAK,eAAe,EAAE,GAAK,GAChF+C,EAAa,CAAC,KAAK,aAAe,KAAK,MAAS,gBAAgB/C,EAAO,KAAK,KAAK,EAAE,GAAK,GACxFgD,EAAU,GAAGhD,EAAO,KAAK,WAAW,IAAI,KAAK,SAAW,GAAG,KAAK,YAAc,SAAW,KAAK,KAAK,WAAa,KASpH,OAPE,KAAK,OAAS,OAOT;YACDuC,EAAU;0BACIQ,EAAU;YACxBC,EAAQ;cATP;iBACIT,EAAU;+BACIQ,EAAU;YAC7BC,EAAQ;kBASlB,CAEA,MACA,gBACA,YACA,SACA,KAEA,UAEA,QAAS,CACP,IAAMJ,EAAW,KAAK,SAAS,GAE/BA,EAAS,iBAAiB,QAAU,GAAiB,EACnD,EAAAtB,EAAA,eAAA,CAAesB,EAAU,KAAK,SAAS,EAEvCV,EAAM,eAAe,CACvB,CAAC,EAGG,KAAK,OAAS,QAChBU,EAAS,iBAAiB,UAAY,GAAiB,CACjCV,EAAO,MAAQ,KAAO,CAAiBA,EAAO,SAChEA,EAAM,eAAe,EAErBU,EAAwB,MAAM,EAElC,CAAC,CAEL,CAEA,QAAe,CACb,KAAK,mBAAmB,aAAc,KAAK,SAAS,CAAC,EAErD,KAAK,OAAO,CACd,CAEA,mBAA0B,CACnB,KAAK,YACR,KAAK,OAAO,CAEhB,CACF,EC3EA,GAAM,CAAC,OAAAK,EAAQ,QAAQhD,EAAAA,QAEvB,IAAaiD,EAAb,cAA8ChD,EAAAA,cAAyF,CACrI,UAAmB,CAIjB,MAHA,MAAK,mBAAqB,KAAK,aAAa,iBAAiB,EAC7D,KAAK,MAAQ,KAAK,aAAa,OAAO,GAAK,GAEpC;qBACUC,EAAAA,iBAAiB,oBAAoB,KAAK,mBAAqB,IAAIC,EAAO,KAAK,kBAAkB,IAAM,GAAG;uBACxGD,EAAAA,iBAAiB,SAAS;cAE/C,CAEA,IACA,IAEA,OAEA,mBACA,QACA,MAGA,QACA,SAA4B,GAE5B,SAA4B,GAE5B,QAAe,CACb,KAAK,mBAAmB,aAAc,KAAK,SAAS,CAAC,EAErD,IAAMgD,EAAmB,KAAK,cAAc,IAAIhD,EAAAA,iBAAiB,UAAU,EAGvE,KAAK,KAAK,MACZ,EAAQ,UAAY,KAAK,MACzB,KAAK,QAAUiD,EAAK,KAAK,KAAK,IAE9B,EAAQ,YAAc,KAAK,MAC3B,KAAK,QAAU,KAAK,OAGtB,KAAK,YAAY,CACnB,CAEA,mBAA0B,CACpB,KAAK,SACH,KAAK,WACP,KAAK,SAAW,GAEhB,KAAK,YAAY,IAMrB,KAAK,SAAW,GAEhB,KAAK,OAAO,EACd,CAEA,sBAA6B,CAE3B,mBAAqB,CACd,KAAK,cACJ,OAAO,KAAK,SAAY,YAC1B,KAAK,QAAQ,EAGf,KAAK,QAAU,IAAA,GACf,KAAK,SAAW,GAEpB,CAAC,CACH,CAEA,aAA4B,CAC1B,IAAMC,EAAY,KAAK,SAAS,GAE5B,KAAK,OAAO,WAAW,aAAa,cACtC,KAAK,QAAU,KAAK,OAAO,WAAW,aAAa,YAAYA,EAAW,KAAK,OAAO,EAE1F,CACF,EClFA,GAAM,CAAC,OAAAC,GAAUjD,EAAAA,QAEjB,IAAakD,EAAb,cAA4CjD,EAAAA,cAAuE,CACjH,UAAmB,CACjB,KAAK,cAAgD,KAAK,aAAa,gBAAgB,GAAK,QAC5F,KAAK,OAAS,KAAK,aAAa,SAAS,GAAK,GAC9C,KAAK,SAAW,KAAK,aAAa,WAAW,GAAK,GAClD,KAAK,YAAc,KAAK,aAAa,cAAc,GAAK,GACxD,KAAK,SAAW,KAAK,aAAa,WAAW,GAAK,GAClD,KAAK,QAAU,KAAK,aAAa,SAAS,GAAK,GAE/C,IAAIkD,EAAoB,GAEpB,KAAK,gBAAkB,WACzB,GAAa,oCAIf,GAAa,8BAIb,IAAMC,EAAU,KAAK,YAAc,8BAAgC,GAEnE,MAAO;6CACkCD,EAAU,GAAGC,EAAQ;+CACnBlD,EAAO,KAAK,WAAW,EAAE;gEACR,KAAK,SAAS;aAE5E,CAEA,WAAW,oBAA+B,CACxC,MAAO,CAAC,SAAS,CACnB,CAEA,OAEA,cACA,YACA,SACA,SACA,OACA,QAEA,YACA,UAA2C,GAE3C,QACA,SAA4B,GAE5B,SAA4B,GAE5B,QAAS,CACP,IAAMmD,EAAiC,KAAK,SAAS,GAEhD,KAAK,cAIVA,EAAkB,iBAAiB,WAAc,CAC/CA,EAAkB,UAAU,OAAO,4CAA4C,CACjF,CAAC,EAGDA,EAAkB,iBAAiB,UAAY,GAAyB,EAClExB,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACzCA,EAAM,eAAe,EAErBwB,EAAkB,MAAM,EAE5B,CAAC,EAEDA,EAAkB,iBAAiB,YAAe,CAC5C,KAAK,YAAc,IACrB,KAAK,UAAY,OAEjBA,EAAkB,UAAU,IAAI,wBAAwB,EAExDA,EAAkB,UAAU,OAAO,4CAA4C,GACtE,KAAK,YAAc,QAC5B,KAAK,UAAY,MAEjBA,EAAkB,UAAU,OAAO,4BAA4B,GACtD,KAAK,YAAc,QAC5B,KAAK,UAAY,GAEjBA,EAAkB,UAAU,OAAO,wBAAwB,EAC3DA,EAAkB,UAAU,IAAI,4BAA4B,EAE5DA,EAAkB,UAAU,IAAI,4CAA4C,IAI9E,EAAApC,EAAA,eAAA,CAAe,KAAMd,EAAAA,OAAO,iBAAkB,CAC5C,QAAS,KAAK,OACd,cAAe,KAAK,WAAa,IAAA,EACnC,CAAC,CACH,CAAC,EACH,CAEA,QAAe,CACb,KAAK,mBAAmB,aAAc,KAAK,SAAS,CAAC,EAErD,KAAK,YAAY,EAEjB,KAAK,OAAO,CACd,CAEA,IAAI,YAAqC,CACvC,OAAO,KAAK,WACd,CAGA,IAAI,WAAW,EAAkB,CAC/B,KAAK,YAAcmD,EAEnB,IAAMC,EAAY,KAAK,SAAS,GAE5B,KAAK,YAAc,IAAMD,GAAM,UAAY,KAAK,QAAUC,IAC5D,KAAK,UAAY,GAEjBA,EAAU,UAAU,OAAO,wBAAwB,EACnDA,EAAU,UAAU,IAAI,4BAA4B,EAExD,CAEA,mBAA0B,CACpB,KAAK,SACH,KAAK,WACP,KAAK,SAAW,GAEhB,KAAK,YAAY,IAMrB,KAAK,SAAW,GAEhB,KAAK,OAAO,EACd,CAEA,sBAA6B,CAE3B,mBAAqB,CACd,KAAK,cACJ,OAAO,KAAK,SAAY,YAC1B,KAAK,QAAQ,EAGf,KAAK,QAAU,IAAA,GACf,KAAK,SAAW,GAEpB,CAAC,CACH,CAGA,yBAAyB,EAAc,EAAyB,EAA4B,CACrF,KAAK,UAAYC,IAAaC,IAInC,KAAK,QAAUA,GAAS,GAEpB,OAAO,KAAK,SAAY,YAC1B,KAAK,QAAQ,EAGf,KAAK,QAAU,IAAA,GAGX,KAAK,YACP,KAAK,YAAY,EAEjB,KAAK,SAAW,GAEpB,CAEA,aAA4B,CAC1B,IAAMF,EAAY,KAAK,SAAS,GAEhC,KAAK,QAAU,KAAK,OAAO,WAAW,WAAW,cAAcA,EAAW,KAAK,OAAO,CACxF,CACF;;;;;;;;AC9KA,GAAM,CAAC,OAAAG,GAAUtD,EAAAA,QCFXuD,EAA2D,CAC/D,aAAclB,EACd,gBAAiB,cDEwBpC,EAAAA,cAA6E,CACtH,UAAmB,CACjB,KAAK,SAAW,KAAK,aAAa,UAAU,IAAM,QAAU,GAC5D,KAAK,OAAS,OAAO,KAAK,aAAa,QAAQ,CAAC,GAAK,EACrD,KAAK,UAAY,KAAK,IAAI,OAAO,KAAK,aAAa,YAAY,CAAC,GAAK,EAAG,CAAC,EACzE,KAAK,SAAW,OAAO,KAAK,aAAa,WAAW,CAAC,EAErD,KAAK,qBAAuB,KAAK,aAAa,yBAAyB,IAAM,QAE7E,KAAK,qBAAqB,EAE1B,IAAMuD,EAAQ,KAAK,MAAQ,KAAK,OAAO,MAGjCC,EAAK,KAAK,OAAO,WAAW,UAAU,KAAK,GAE3CjC,EAAUiC,GAAI,UAAY,WAAWvD,EAAOuD,EAAG,SAAS,EAAE,GAAK,GAC/DC,EAAUD,GAAI,IAAI,UAAY,WAAWvD,EAAOuD,EAAG,GAAG,SAAS,EAAE,GAAK,GACtEE,EAASF,GAAI,IAAI,GAAG,UAAY,GAAGvD,EAAOuD,EAAG,GAAG,EAAE,SAAS,EAAE,GAAK,GAIxE,MAFA,MAAK,iBAA2B,KAAK,OAAO,WAAW,UAAU,SAE1D;;;;;gBAKKvD,EAAOsD,EAAM,YAAY,EAAE;;;cAG7B,KAAK,kBAAkB,OAAS,GAAK,KAAK,sBAAsB,EAAE;;;;;gBAKhEtD,EAAOsD,EAAM,WAAW,KAAK,UAAW,KAAK,SAAU,KAAK,MAAM,CAAC,EAAE;;;+BAGtDtD,EAAOsD,EAAM,cAAc,EAAE;mBACzChC,EAAQ;kBACT,KAAK,qBACD;uBACCkC,EAAQ;gCACCC,EAAO;qCACFzD,EAAOsD,EAAM,SAAS,EAAE,IAAItD,EAAOsD,EAAM,KAAK,EAAE;yBAE/D,GACL;;uBAEME,EAAQ;gCACCC,EAAO;qCACFzD,EAAOsD,EAAM,YAAY,EAAE,IAAItD,EAAOsD,EAAM,QAAQ,EAAE;;;uBAGpEE,EAAQ;gCACCC,EAAO;qCACFzD,EAAOsD,EAAM,QAAQ,EAAE,IAAItD,EAAOsD,EAAM,IAAI,EAAE;;;kBAGjE,KAAK,qBACD;uBACCE,EAAQ;gCACCC,EAAO;qCACFzD,EAAOsD,EAAM,QAAQ,EAAE,IAAItD,EAAOsD,EAAM,IAAI,EAAE;yBAE7D,GACL;;;;;aAMf,CAEA,WAAW,oBAAqB,CAC9B,MAAO,CACL,aAAc,YAAa,SAC3B,oBAAqB,UACvB,CACF,CAGA,OAEA,SACA,OACA,UACA,SACA,gBACA,qBAEA,KACA,UAAoB,OAGpB,QACA,WACA,OACA,OAEA,WACA,gBACA,aAEA,iBAEA,MACA,iBAEA,SAA4B,GAE5B,QAAS,CACP,KAAK,WAA0B,KAAK,cAAc,oCAAoC,EACtF,KAAK,OAAsB,KAAK,cAAc,gCAAgC,EAE9E,KAAK,WAAW,iBAAiB,QAAU,GAAiB,CAC1D/B,EAAM,eAAe,EAEhB,KAAK,gBAAgB,GAI1B,KAAK,SAAS,KAAK,UAAY,CAAC,CAClC,CAAC,EAED,KAAK,OAAO,iBAAiB,QAAU,GAAiB,CACtDA,EAAM,eAAe,EAEhB,KAAK,YAAY,GAItB,KAAK,SAAS,KAAK,UAAY,CAAC,CAClC,CAAC,EAEG,KAAK,uBACP,KAAK,QAAuB,KAAK,cAAc,iCAAiC,EAChF,KAAK,OAAsB,KAAK,cAAc,gCAAgC,EAE9E,KAAK,QAAQ,iBAAiB,QAAU,GAAiB,CACvDA,EAAM,eAAe,EAEhB,KAAK,gBAAgB,GAI1B,KAAK,SAAS,CAAC,CACjB,CAAC,EAED,KAAK,OAAO,iBAAiB,QAAU,GAAiB,CACtDA,EAAM,eAAe,EAEhB,KAAK,YAAY,GAItB,KAAK,SAAS,KAAK,iBAAiB,EAAI,CAAC,CAC3C,CAAC,EAEL,CAEA,QAAe,CACb,KAAK,mBAAmB,aAAc,KAAK,SAAS,CAAC,EAGjD,KAAK,kBAAkB,SACzB,KAAK,WAA0B,KAAK,cAAc,0BAA0B,EAE5E,KAAK,uBAAuB,GAG9B,KAAK,OAAO,EAEZ,KAAK,sBAAsB,CAC7B,CAEA,mBAA0B,CACpB,KAAK,WAIT,KAAK,SAAW,GAEhB,KAAK,OAAO,EACd,CAEA,yBAAyB,EAAc,EAAuB,EAAsB,CAC7E,KAAK,SAINR,IAAS,cAAgBA,IAAS,aAAeA,IAAS,YAC5D,AACE,KAAK,eAA4B,KAAK,cAAc,4BAA4B,EAGlF,AACE,KAAK,kBAA+B,KAAK,cAAc,gCAAgC,EAGrFA,IAAS,eACX,KAAK,UAAY,CAAC2C,GAGhB3C,IAAS,cACX,KAAK,SAAW,CAAC2C,EAEZ,KAAK,gBAAgB,SACxB,KAAK,gBAAgB,UAAYA,IAIjC3C,IAAS,WACX,KAAK,OAAS,CAAC2C,GAGjB,KAAK,aAAa,YAAc,KAAK,MAAM,WAAW,KAAK,UAAW,KAAK,SAAU,KAAK,MAAM,EAEhG,KAAK,sBAAsB,GAGzB3C,IAAS,sBACX,KAAK,qBAAqB,EAE1B,KAAK,yBAAyB,EAE9B,AACE,KAAK,aAA0B,KAAK,cAAc,0BAA0B,EAG1E,KAAK,kBAAkB,OACzB,KAAK,uBAAuB,GAE5B,KAAK,oBAAoB,EAEzB,KAAK,aAAa,WAAY,MAAe,IAI7CA,IAAS,YACX,KAAK,iBAAiB2C,IAAiB,MAAe,EAE1D,CAGA,iBAA2B,CACzB,OAAO,KAAK,WAAa,GAAK,KAAK,UAAY,CACjD,CAGA,aAAuB,CACrB,IAAMC,EAAe,KAAK,iBAAiB,EAAI,EAE/C,OAAO,KAAK,UAAYA,GAAgB,KAAK,UAAY,CAC3D,CAGA,kBAA2B,CAKzB,OAJK,KAAK,SAIH,KAAK,KAAK,KAAK,OAAS,KAAK,QAAQ,EAHnC,CAIX,CAEA,sBAA+B,CAC7B,GAAK,KAAK,aAAa,mBAAmB,EAI1C,GAAI,CACF,KAAK,gBAAkB,KAAK,MAAc,KAAK,aAAa,mBAAmB,CAAC,CAAC,CAC9E,IAAK,GAAiB,CAACC,CAAI,EAE9B,KAAK,iBAAmB,KAAK,gBAAgB,IAAI,IACxC,CACL,MAAOA,EAAK,SAAS,EACrB,MAAOA,EAAK,SAAS,CACvB,EACD,CACH,OAASC,EAAK,CACZ,KAAK,gBAAkB,CAAC,EAEpB,KAAK,OAAO,OACd,QAAQ,IAAIA,CAAG,CAEnB,CACF,CAEA,uBAAwC,CACtC,MAAO,8CAA8C,KAAK,SAAS,OACrE,CAEA,0BAAyC,CACvC,IAAMC,EAAwB,KAAK,cAAc,KAAK,gBAAgB,EAElEA,GACFA,EAAS,OAAO,EAGlB,IAAMC,EAA+B,KAAK,cAAc,gCAAgC,EAEpFA,GACFA,EAAgB,OAAO,CAE3B,CAEA,wBAAuC,CACrC,IAAMrC,EAA2B,SAAS,cAAc,KAAK,gBAAgB,EAE7E,EAAoC,OAAS,KAAK,OAClDA,EAAY,aAAa,OAAQ,QAAQ,EACzCA,EAAY,aAAa,eAAgB,KAAK,SAAS,SAAS,CAAC,EACjEA,EAAY,aAAa,UAAW,KAAK,UAAU,KAAK,gBAAgB,CAAC,EACzEA,EAAY,aAAa,QAAS,KAAK,MAAO,YAAY,EAE1D,KAAK,eAAeA,CAAW,EAE/B,KAAK,WAAW,OACdA,CACF,CACF,CAEA,eAAuB,EAAsB,CAC3CA,EAAY,iBAAiB,QAAU,GAAiB,CACtD,IAAMyB,EAA8B5B,EAAO,OAE3C,KAAK,eAAe,CAAC4B,CAAK,EAE1B,KAAK,aAAa,YAAaA,CAAK,CACtC,CAAC,CACH,CAEA,qBAAoC,CAClC,KAAK,WAAW,mBAAmB,YAAa,KAAK,sBAAsB,CAAC,CAC9E,CAEA,iBAAyB,EAAkB,CACzC,KAAK,SAAWa,EAEhB,IAAMF,EAAwB,KAAK,cAAc,KAAK,gBAAgB,EAElEA,GACFA,EAAS,aAAa,WAAYE,EAAQ,SAAS,CAAC,EAGtD,KAAK,sBAAsB,CAC7B,CAMA,uBAAsC,CACpC,IAAMC,EAAa,KAAK,UAAY,CAAC,KAAK,gBAAgB,EACpDC,EAAS,KAAK,UAAY,CAAC,KAAK,YAAY,EAGlD,CAFuD,CAAC,KAAK,QAASD,CAAU,EAAG,CAAC,KAAK,WAAYA,CAAU,EAAG,CAAC,KAAK,OAAQC,CAAM,EAAG,CAAC,KAAK,OAAQA,CAAM,CAEvJ,CAAC,CAAC,SAAS,CAAClC,EAAQgC,KAAa,CAEjCA,GACFhC,GAAQ,eAAe,UAAU,IAAI,UAAU,EAC/CA,GAAQ,aAAa,gBAAiB,MAAM,IAE5CA,GAAQ,eAAe,UAAU,OAAO,UAAU,EAClDA,GAAQ,gBAAgB,eAAe,EAE3C,CAAC,CACH,CAGA,SAAiB,EAAe,CAC9B,IAAMmC,EAAgB,KAAK,UAEvBC,IAAUD,IACZ,KAAK,UAAYC,EACjB,KAAK,aAAa,aAAc,KAAK,UAAU,SAAS,CAAC,EACzD,KAAK,cAAcD,CAAa,EAEpC,CAUA,eAAe,EAAkB,CAG/B,IAAME,EAAa,KAAK,UAAY,KAAK,SACnCF,EAAgB,KAAK,UAE3B,KAAK,UAAY,KAAK,MAAME,EAAaC,CAAQ,GAAK,EACtD,KAAK,SAAWA,EAChB,KAAK,cAAcH,CAAa,CAClC,CAGA,cAAsB,EAA2B,CAC/C,KAAK,KAAO,CACV,oBACA,UAAW,KAAK,UAChB,SAAU,KAAK,SACf,OAAQ,KAAK,MACf,EAEA,KAAK,cACH,IAAI,YAAY,KAAK,UAAW,CAC9B,QAAS,GACT,SAAU,GACV,OAAQ,KAAK,IACf,CAAC,CACH,CACF,CACF,EClaE,kBAAmBvB,EACnB,oBAAqBL,EACrB,cAAetB,EACf,mBAAoBI,CACtB,EAMA,SAAgBkD,GAAmB,CACjCC,EAAc,aAAc5D,CAAkB,CAChD,CAGA,SAAgB4D,EAAc,EAAc,EAAyC,CAC/E,OAAO,eAAmB,KAAe,CAAC,eAAe,IAAIzD,CAAI,GACnE,eAAe,OAAOA,EAAM0D,CAAO,CAEvC,CAOA,SAAgBC,EAAqB,EAA2B,CAC9D,IAAMC,EAA6B,CAAC,EAEpC,OAAO,QAAQtB,CAAc,CAAC,CAAC,SAAS,CAACtC,EAAM0D,KAAa,CAC1D,IAAMG,EAAU,eAAe,IAAI7D,CAAI,EAElC6D,EAEMA,IAAYH,GACrBE,EAAiB,KAAK5D,CAAI,EAF1B,eAAe,OAAOA,EAAM0D,CAAO,CAIvC,CAAC,EAEGE,EAAiB,QACnB,QAAQ,KAAK,GAAGE,EAAY,IAAIF,EAAiB,KAAK,IAAI,EAAE,4HACgB,CAEhF,CCrDA,GAAM,CAAC,OAAAG,GAAU7E,EAAAA,QAEjB,IAAa8E,EAAb,cAAgD7E,EAAAA,cAAqE,CACnH,UAAmB,CACjB,KAAK,YAAc,KAAK,aAAa,cAAc,GAAK,GACxD,KAAK,KAAO,KAAK,aAAa,MAAM,GAAK,SACzC,KAAK,KAA4B,KAAK,aAAa,MAAM,GAAK,WAE9D,GAAI,CACF,KAAK,QAAU,KAAK,MAAc,KAAK,aAAa,SAAS,CAAC,CAChE,OAAS2D,EAAK,CACZ,KAAK,QAAU,CAAC,EAEZ,KAAK,OAAO,OACd,QAAQ,IAAIA,CAAG,CAEnB,CAGA,IAAMmB,EAAQ,KAAK,aAAa,OAAO,GAAK,KAAK,YAE3C5C,EAAY4C,EAAQ,gBAAgB7E,EAAO6E,CAAK,EAAE,GAAK,GAU3D,OARE,KAAK,OAAS,UAAY,KAAK,OAAS,WACnC;wBACW7E,EAAO,KAAK,IAAI,EAAE,GAAGiC,EAAU;oCACnBjC,EAAO,KAAK,WAAW,EAAE;YACjD,KAAK,iBAAiB,KAAK,OAAO,EAAE;mBAInC;;0BAEaA,EAAO,KAAK,IAAI,EAAE,GAAGiC,EAAU;sCACnBjC,EAAO,KAAK,WAAW,EAAE;cACjD,KAAK,iBAAiB,KAAK,OAAO,EAAE;;cAIhD,CAEA,WAAW,oBAAqB,CAC9B,MAAO,CACL,UACF,CACF,CAEA,OAEA,YACA,KAEA,KACA,QAEA,UAAoB,QAEpB,iBAEA,SAA4B,GAM5B,QAAS,CACP,IAAM8E,EAA4B,KAAK,cAAc,QAAQ,EACvDC,EAAQ,KAAK,OAAS,kBAExBC,EAAW,GACXC,EAAyB,KAE7B,KAAK,iBAAmBH,EACxB,KAAK,eAAe,EAEpB,IAAMI,EAAQ,GAAkB,CAC9B,EAAU,KAENH,IACF,EAAO,cAAgB,GAGzB,KAAK,cACH,IAAI,YAAY,KAAK,UAAW,CAC9B,QAAS,GACT,SAAU,GACV,OAAQ/B,CACV,CAAC,CACH,CACF,EAEI+B,IACFD,EAAO,iBAAiB,kBAAqB,CAC3C,EAAW,EACb,CAAC,EAEDA,EAAO,iBAAiB,UAAY,GAAyB,CAC3D,EAAY1D,EAAM,MAAQ,QAEtBA,EAAM,MAAQ,SAAW6D,IAAY,MACvCC,EAAKD,CAAO,CAEhB,CAAC,EAGDH,EAAO,iBAAiB,WAAc,CAChCG,IAAY,OACd,EAAU,KACV,EAAO,cAAgB,EAE3B,CAAC,GAGHH,EAAO,iBAAiB,aAAgB,CAClCC,GAAQC,EACV,EAAUF,EAAO,MAEjBI,EAAKJ,EAAO,KAAK,CAErB,CAAC,CACH,CAEA,QAAe,CACb,KAAK,mBAAmB,aAAc,KAAK,SAAS,CAAC,EAErD,KAAK,OAAO,CACd,CAEA,mBAA0B,CACpB,KAAK,WAIT,KAAK,SAAW,GAEhB,KAAK,OAAO,EACd,CAEA,yBAAyB,EAAc,CAEjClE,IAAS,YAAc,KAAK,kBAC9B,KAAK,eAAe,CAExB,CAEA,iBAAyB,EAAsC,CAC7D,MAAO;QACHuE,EAAQ,IAAK,GAA8B,CAC3C,GAAI,UAAWC,GAAU,UAAWA,EAClC,MAAO;8BACapF,EAAOoF,EAAO,KAAK,EAAE,IAAIpF,EAAOoF,EAAO,KAAK,EAAE,WAC7D,GAAI,YAAaA,EACtB,MAAO;kBAEF,GAAI,WAAYA,EACrB,MAAO;+BACcpF,EAAOoF,EAAO,MAAM,EAAE,cAE/C,CAAC,CAAC,CAAC,KAAK,EAAE,GACd,CAGA,gBAA+B,CAC7B,KAAK,iBAAiB,gBAAgB,WAAY,KAAK,aAAa,UAAU,IAAM,MAAM,CAC5F,CACF,ECrKA,GAAM,CAAC,UAAUnF,EAAAA,QAEjB,IAAaoF,EAAb,cAAmDnF,EAAAA,cAAwE,CACzH,UAAmB,CAEjB,KAAK,MAAQ,KAAK,aAAa,OAAO,GAAK,GAE3C,KAAK,KAAwB,KAAK,aAAa,MAAM,GAAK,gBAE1D,IAAMoF,EAAiB,KAAK,OAAS,gBAKrC,MAHA,MAAK,OAASA,EAAgB,IAAO,KAAK,aAAa,OAAO,GAAK,EAAA,CAChE,SAAS,EAEL;kBACOA,EAAgB,GAAK,UAAU,KAAK,MAAM,GAAG;eAChDA,EAAgB,GAAK,IAAI,gBAAgBC,EAAO,KAAK,OAAO,MAAM,eAAe,EAAE,cAChG,CAEA,WAAW,oBAAqB,CAC9B,MAAO,CACL,OACF,CACF,CAEA,OAEA,MACA,KACA,MAGA,SAA4B,GAC5B,QAEA,QAAe,CACb,KAAK,mBAAmB,aAAc,KAAK,SAAS,CAAC,CACvD,CAEA,mBAA0B,CACpB,KAAK,WAIT,KAAK,SAAW,GAEhB,KAAK,OAAO,EACd,CAEA,yBAAyB,EAAc,EAAuB,EAAsB,CAC9E,KAAK,OAAS,eAAiB3E,IAAS,UAC1C,AACE,KAAK,UAA+B,KAAK,cAAc,UAAU,EAGnE,KAAK,QAAQ,MAAQ,CAAC2C,EAE1B,CACF,ECtDsBiC,EAAtB,cAA+CrF,EAAAA,cAAwE,CACrH,UAAmB,CACjB,IAAMS,EAAO,KAAK,KAAK,KACjB6E,EAAQ7E,GAAQ,KAAK,MAAMA,GAIjC,MAFA,MAAK,MAAQ,MAAM,QAAQ6E,CAAK,GAAKA,EAAM,OAASA,EAAQ,CAAC,KAAK,QAAQ,MAAM,SAAW,EAAE,EAEtF,KAAK,MAAM,QAAU,KAAK,OAAO,CAAC,CAAC,KAAK,EAAE,CACnD,CAEA,IACA,IACA,OAEA,MAAkB,CAAC,EAGnB,QAEA,SAA4B,GAE5B,QAAe,CACb,KAAK,mBAAmB,aAAc,KAAK,SAAS,CAAC,EAGrD,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,SAAS,EAAgB,IAAc,CAC3D,KAAK,KAAK,KACZ,EAAM,UAAY,KAAK,MAAMC,GAE7B,EAAM,YAAc,KAAK,MAAMA,EAEnC,CAAC,CACH,CAKA,mBAA0B,CACnB,KAAK,WACR,KAAK,SAAW,GAEhB,KAAK,OAAO,GAId,KAAK,QAAU,IAAI,iBACnB,EAAAlF,EAAA,aAAA,CAAa,KAAM,KAAK,QAAQ,MAAM,CACxC,CAEA,sBAA6B,CAC3B,KAAK,SAAS,MAAM,CACtB,CACF,ECvDamF,EAAb,cAA4CH,CAAiB,CAC3D,QAAqC,eACvC,ECFA,IAAaI,EAAmB,CAC9B,IAAK,CACH,MAAO,CACL,MAAO,CACL,GAAI,CACF,UAAW,iBAEX,GAAI,CACF,UAAW,iBACb,CACF,CACF,EAEA,MAAO,CACL,GAAI,CACF,UAAW,UAEX,GAAI,CACF,UAAW,UACb,CACF,CACF,CACF,EAEA,OAAQ,CACN,UAAW,WACb,CACF,EAEA,WAAY,CACV,OAAQ,CACN,SAAU,aAEV,aAAc,qBAEd,cAAe,EAAkB,IAAkB,CACjDtB,EAAQ,aAAa,OAAQ,MAAM,EACnCA,EAAQ,aAAa,eAAgBtB,CAAK,EAC1CsB,EAAQ,aAAa,YAAa,yCAAyC,CAC7E,CACF,EACA,SAAU,CACR,SAAU,iBACZ,EACA,aAAc,CACZ,aAAe,GAAyB,CACtC,EAAmC,SAAW,UAC9CuB,EAAY,aAAa,eAAgB,cAAc,EACvDA,EAAY,aAAa,OAAQ,MAAM,CACzC,CACF,EACA,UAAW,CACT,SAAU,gBAEV,IAAK,CACH,GAAI,CACF,UAAW,iBAEX,GAAI,CACF,UAAW,gBAEX,EAAG,CACD,UAAW,eACb,CACF,CACF,CACF,CACF,EACA,YAAa,CACX,SAAU,qBACZ,EACA,WAAY,CACV,SAAU,kBACV,gBAAiB,2BAEjB,cAA2D,GAAqB,CAC9EvB,EAAQ,aAAa,YAAa,8CAA8C,CAClF,GACA,aAAc,EAAkB,IAAkB,CAChDA,EAAQ,aAAa,QAAStB,CAAK,CACrC,CACF,EACA,MAAO,CACL,OAAQ,CACN,QAAS,CAAC,KAAM,SAAS,EACzB,UAAW,CAAC,KAAM,SAAS,EAC3B,YAAa,CAAC,KAAM,kBAAkB,EACtC,KAAM,CAAC,KAAM,QAAQ,CACvB,CACF,EACA,OAAQ,CACN,SAAU,aAEV,IAAK,CACH,IAAK,CACH,UAAW,iCAEX,MAAO,CACL,UAAW,sBACb,CACF,CACF,CACF,EACA,aAAc,CACZ,SAAU,oBAEV,aAAc,EAAkB,IAAkB,CAChDsB,EAAQ,aAAa,QAAStB,CAAK,CACrC,CACF,EACA,QAAS,CACP,SAAU,cAEV,IAAK,CACH,IAAK,CACH,UAAW,8BACb,CACF,CACF,EACA,YAAa,CACX,SAAU,mBAEV,IAAK,CACH,aAAc,CACZ,UAAW,kBACb,EACA,eAAgB,CACd,UAAW,sBAEX,GAAI,CACF,GAAI,CACF,UAAW,eAEX,EAAG,CACD,UAAW,cACb,CACF,CACF,CACF,CACF,EAGA,cAAe,EAAuB,IAAkB,CACtD8C,EAAa,aAAa,eAAgB9C,CAAK,CACjD,CACF,EACA,cAAe,CACb,cAAe,EAAqB,IAAyB,CAC3D,EAAkC,SAAW,SAC7C+C,EAAW,aAAa,eAAgB,cAAc,EACtDA,EAAW,aAAa,OAAQ,MAAM,EAEtC,EAAmC,SAAW,UAC9CC,EAAY,aAAa,eAAgB,cAAc,EACvDA,EAAY,aAAa,OAAQ,MAAM,CACzC,CACF,CACF,EAGA,SAAU,CACR,cAAe,WACf,aAAc,YAChB,CACF,EC7JI,OAAO,eAAmB,MAE5BzB,EAAqB,mBAAmB,EAGxCF,EAAc,kBAAmBO,CAA0B,EAC3DP,EAAc,sBAAuBgB,CAA6B,IAGpE,EAAA7E,EAAA,aAAA,CAAa,KAAMoF,CAAgB,EAMnC,SAAgBK,GAAiB,CAC/B5B,EAAc,cAAesB,CAAsB,CACrD,C"}