@table-bro/native 1.1.0 → 1.2.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.
@@ -1 +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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"}
1
+ {"version":3,"file":"table-bro.native.esm.js","names":["escape","escape","escape","escape","escape","escape","escape","escape","tagsTexts","connectedTags","setTagsTexts","texts","tags","BroTagsComponent","BroHTMLElement","name","items","tagEl","i","item","fitCellItems","escape$8","BroHTML","BroSwitchComponent","checked","input","escape$7","BroToolbarComponent","divClass","nodes","escape$6","BroToolbarMainComponent","ulClass","event","link","events","broToolbar","wrapper","broDropdown","isPrerendered","BroDom","hidden","word","wordHTML","buttonTitle","broVisuallyHidden","className","iconHTML","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","ul","liClass","aClass","currentValue","maxPageIndex","err","dropdown","pageSizeValueEl","disable","noPrevious","noNext","previousIndex","index","startIndex","pageSize","withSwitch","defineElement","registry","element","defineSharedElements","definedElsewhere","defined","skinPackage","BroNativeTagsComponent","escape$1","BroNativeDropdownComponent","label","select","menu","keyboard","pending","send","options","option","BroNativeProgressBarComponent","indeterminate","escape","nativeSkinConfig","closeButton","searchButton","backButton","clearButton","registerSkin","withTags"],"sources":["../../shared/js/bro-tags.ts","../../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-tags.native.ts","../js/bro-dropdown.native.ts","../js/bro-progress-bar.native.ts","../js/table-bro.native.config.ts","../js/table-bro.native.ts"],"sourcesContent":["import {type BroCellElement, type BroCol, type BroConfiguredElement, BroHTMLElement, type BroResolvedConfig, type BroRow, type BroView, fitCellItems} from '@table-bro/core';\n\n/** The texts of the tags of a skin. */\nexport interface BroTagsTexts {\n /** The text of a cell of tags without items, No data by default. */\n empty: string;\n}\n\n/** The texts that the application gives the tags by withTags() and setTagsTexts() of the skin. */\nlet tagsTexts: Partial<BroTagsTexts> = {};\n/** The tags in the DOM, which a new text of a cell without items renders again. */\nconst connectedTags = new Set<BroTagsComponent>();\n\n/**\n * Sets the texts of the tags of the skin, as when the language of the page changes: the tags in the DOM take them at\n * once. They take the place of texts.noItems of the config of a table.\n * @param texts - the texts that change\n */\nexport function setTagsTexts(texts: Partial<BroTagsTexts>): void {\n tagsTexts = {...tagsTexts, ...texts};\n connectedTags.forEach(tags => tags.renderEmpty());\n}\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.empty = !(Array.isArray(items) && items.length);\n this.items = this.empty ? [this.emptyText()] : <string[]>items;\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 /** Whether the cell has no items and shows the text of an empty cell. */\n private empty: boolean = false;\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 Array.from(this.children).forEach((tagEl: Element, i: number) => this.renderTag(tagEl, this.items[i]));\n }\n\n /** Renders the text of an empty cell again, as setTagsTexts() changes it. */\n renderEmpty(): void {\n if (this.empty && this.firstElementChild) {\n this.items = [this.emptyText()];\n this.renderTag(this.firstElementChild, this.items[0]);\n }\n }\n\n /**\n * Puts an item into its tag: a tag is markup only for a column with html: true.\n * @param tagEl - the tag\n * @param item - the item\n */\n private renderTag(tagEl: Element, item: string): void {\n if (this.col?.html) {\n tagEl.innerHTML = item;\n } else {\n tagEl.textContent = item;\n }\n }\n\n /** The text of an empty cell: the one of the skin, the deprecated texts.noItems of the table, or No data. */\n private emptyText(): string {\n return tagsTexts.empty ?? this.config?.texts.noItems ?? 'No data';\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 connectedTags.add(this);\n\n if (!this.rendered) {\n this.rendered = true;\n\n this.render();\n } else {\n // The texts may have changed while the element was out of the DOM\n this.renderEmpty();\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 connectedTags.delete(this);\n this.fitting?.abort();\n }\n}\n","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, BroDom, type BroDropdown, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroSkinComponents, type BroToolbarMain, type BroView, broVisuallyHidden, events, isPrerendered} from '@table-bro/core';\n\nimport type {BroToolbarComponent} from './bro-toolbar';\n\nconst {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 // 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 // A button of the skin in the toolbar, as Back of the search, takes Space itself\n this.addEventListener('keydown', (event: KeyboardEvent) => {\n const link = (<HTMLElement>event.target).closest?.('a[role=\"button\"]');\n\n if (event.key === ' ' && !event.repeat && !event.defaultPrevented && link) {\n event.preventDefault();\n\n (<HTMLElement>link).click();\n }\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 = this.dom.createElement<BroToolbarComponent>(this.config.components.toolbar.selector);\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 = this.dom.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 // An element of a prerendered table keeps its markup until the table renders its own elements in its place\n if (isPrerendered(this)) {\n return;\n }\n\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 /** The nodes of the toolbar in the document of its element, as of a server DOM in a prerender. */\n private get dom(): BroDom {\n return new BroDom(this.ownerDocument);\n }\n\n /**\n * A link of the toolbar.\n * @param buttonTitle - the title of the link\n * @param word - the words after the title, as visually hidden text, as for Orders; none without a title\n * @param iconHTML - the icon before the title\n * @param className - a class of the link\n */\n private templateToolbarButton(buttonTitle: string, word: string, iconHTML?: string, className?: string): HTMLElement {\n // A link says what it is with visually hidden text: Lighthouse reads the text of a link, not its label. The word of\n // the role button repeats the role of the link to a screen reader, so only the text of the link keeps it\n const hidden = (word === this.config.texts.buttonRole) ? ' aria-hidden=\"true\"' : '';\n const wordHTML = (buttonTitle && word) ? `<span class=\"${escape(broVisuallyHidden)}\"${hidden}> ${escape(word)}</span>` : '';\n\n // The link acts on the table and goes nowhere: a button, as Bootstrap has a link with the classes of a button\n return this.dom.createFromHTML(`\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 role=\"button\">\n ${iconHTML || ''}${escape(buttonTitle)}${wordHTML}\n </a>\n </li>`);\n }\n\n private renderSearchButton(): HTMLElement {\n const broButton = this.dom.createElement<BroButton>(this.config.components.button.selector);\n\n this.config.components.toolbarMain.beforeRender?.(broButton, this.config.texts.search);\n\n const buttonTitle = broButton.getAttribute('button-title') ?? '';\n\n // The search says what it searches: the rows of the table that the toolbar names\n return this.templateToolbarButton(buttonTitle, this.config.texts.searchRole(this.config.toolbarTitle), 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 = this.dom.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, this.config.texts.buttonRole, 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, isPrerendered} 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 // An element of a prerendered table keeps its markup until the table renders its own elements in its place\n if (isPrerendered(this)) {\n return;\n }\n\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 // A prerender runs no scripts of the browser, as the tooltips of a skin\n if (this.config.prerender) {\n return;\n }\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 {BroDom, BroHTML, BroHTMLElement, isPrerendered} 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 // An element of a prerendered table keeps its markup until the table renders its own elements in its place\n if (isPrerendered(this)) {\n return;\n }\n\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 = new BroDom(this.ownerDocument).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 // The list takes the state of the paginator at its render, as the select of MatPaginator does\n broDropdown.setAttribute('disabled', this.disabled.toString());\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/**\n * Defines an element of a skin unless it is defined: a second load of the bundle of the skin finds it defined.\n * @param name - the tag of the element\n * @param element - the class of the element\n * @param registry - the registry of the custom elements: the one of the page by default, none without a DOM\n */\nexport function defineElement(name: string, element: CustomElementConstructor, registry: CustomElementRegistry | undefined = (typeof customElements !== 'undefined') ? customElements : undefined): void {\n if (registry && !registry.get(name)) {\n registry.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 * @param skinPackage - the package of the skin, for the warning\n * @param registry - the registry of the custom elements\n */\nexport function defineSharedElements(skinPackage: string, registry: CustomElementRegistry): void {\n const definedElsewhere: string[] = [];\n\n Object.entries(sharedElements).forEach(([name, element]) => {\n const defined = registry.get(name);\n\n if (!defined) {\n registry.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 {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 BroConfiguredElement, type BroDropdown, type BroDropdownOption, BroHTML, BroHTMLElement, type BroResolvedConfig, type BroView, isPrerendered} 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 // An element of a prerendered table keeps its markup until the table renders its own elements in its place\n if (isPrerendered(this)) {\n return;\n }\n\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, isPrerendered} 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 // An element of a prerendered table keeps its markup until the table renders its own elements in its place\n if (isPrerendered(this)) {\n return;\n }\n\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 {BroButton, BroSkinConfig} 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';\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\n // The optional elements, tags and switch, come with withTags() and withSwitch()\n defineElements: (registry: CustomElementRegistry): void => {\n defineSharedElements('@table-bro/native', registry);\n\n defineElement('bro-nv-dropdown', BroNativeDropdownComponent, registry);\n defineElement('bro-nv-progress-bar', BroNativeProgressBarComponent, registry);\n }\n} satisfies BroSkinConfig;\n","import {registerSkin} from '@table-bro/core';\n\nimport {type BroTagsTexts, setTagsTexts} from '../../shared/js/bro-tags';\nimport {defineElement} from '../../shared/js/define-shared-elements';\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, and a prerender defines them in its server DOM (defineElements). The optional elements, tags\n// and switch, come with withTags() and withSwitch()\nif (typeof customElements !== 'undefined') {\n nativeSkinConfig.defineElements(customElements);\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 * @param options - the texts of the tags, as {texts: {empty: 'No tags'}}; setTagsTexts() changes them later\n * @param options.texts - the texts of the tags\n */\nexport function withTags(options: {texts?: Partial<BroTagsTexts>} = {}): void {\n setTagsTexts(options.texts ?? {});\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 {setTagsTexts} from '../../shared/js/bro-tags';\nexport type {BroTagsTexts} from '../../shared/js/bro-tags';\nexport {withSwitch} from '../../shared/js/define-shared-elements';\n"],"mappings":"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"}
@@ -1 +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}}
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{position:relative}.bro-sort-header-container{letter-spacing:normal;cursor:pointer;align-items:center;width:fit-content;max-width:100%;display:flex;overflow:hidden}.bro-sort-header-container:after{content:"";position:absolute;inset:0}.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;margin-inline-start:auto}@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}@supports (font:-apple-system-body){.bro-nav-item select{field-sizing:content;width:auto}}.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}.nv bro-button a:has(>.bro-button-toggle){display:inline-block}@supports (font:-apple-system-body){.nv bro-button a:has(>.bro-button-toggle){overflow-x:clip}.nv bro-button a:has(>.bro-button-toggle)>.bro-button-toggle{will-change:transform}}.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)}@supports (font:-apple-system-body) or selector(::-moz-progress-bar){.nv .bro-table-header bro-nv-progress-bar progress{height:5px;margin-top:2.5px}.nv .bro-table-aux bro-nv-progress-bar progress{height:3px;margin-top:1.5px}}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}.nv .bro-nav-link{position:relative}.nv .bro-nav-link>.bro-visually-hidden{top:50%;left:50%}.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}}table-bro:where([data-bro-prerender].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){table-bro:where([data-bro-prerender].nv){--bro-duration-scale:0}}