@table-bro/native 0.0.0-stage → 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.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +100 -2
  3. package/THIRD_PARTY_NOTICES.md +69 -0
  4. package/dist/table-bro.native.d.ts +213 -0
  5. package/dist/table-bro.native.esm.js +114 -0
  6. package/dist/table-bro.native.esm.js.map +1 -0
  7. package/dist/table-bro.native.min.css +1 -0
  8. package/dist/table-bro.native.umd.js +114 -0
  9. package/dist/table-bro.native.umd.js.map +1 -0
  10. package/package.json +75 -4
  11. package/styles/_table-bro.api.scss +3 -0
  12. package/styles/_table-bro.native.api.scss +5 -0
  13. package/styles/mixins/_text-ellipsis.scss +5 -0
  14. package/styles/mixins/_visually-hidden.scss +14 -0
  15. package/styles/skin/shared/_variables.scss +94 -0
  16. package/styles/skin/shared/mixins/_custom-properties.scss +39 -0
  17. package/styles/skin/shared/mixins/_progress-bar.scss +27 -0
  18. package/styles/skin/shared/mixins/_shared.scss +79 -0
  19. package/styles/skin/shared/mixins/_skin-colors.scss +64 -0
  20. package/styles/skin/shared/mixins/_slide-toggle.scss +5 -0
  21. package/styles/skin/shared/mixins/_sort-header.scss +11 -0
  22. package/styles/skin/shared/mixins/_toolbar.scss +61 -0
  23. package/styles/skin/shared/table-bro/_details.scss +11 -0
  24. package/styles/skin/shared/table-bro/_filter-drawer.scss +62 -0
  25. package/styles/skin/shared/table-bro/_shadows.scss +19 -0
  26. package/styles/skin/shared/table-bro/_state.scss +38 -0
  27. package/styles/skin/shared/table-bro/_table.scss +70 -0
  28. package/styles/skin/shared/table-bro/_text-ellipsis.scss +14 -0
  29. package/styles/skin/vanilla-js/native/_themes.scss +45 -0
  30. package/styles/skin/vanilla-js/native/_variables.scss +54 -0
  31. package/styles/skin/vanilla-js/native/components/bootstrap-based/_paginator.scss +50 -0
  32. package/styles/skin/vanilla-js/native/components/bootstrap-based/_toolbar.scss +107 -0
  33. package/styles/skin/vanilla-js/native/table-bro/_button.scss +36 -0
  34. package/styles/skin/vanilla-js/native/table-bro/_filter-drawer.scss +10 -0
  35. package/styles/skin/vanilla-js/native/table-bro/_progress-bar.scss +45 -0
  36. package/styles/skin/vanilla-js/native/table-bro/_table.scss +16 -0
  37. package/styles/skin/vanilla-js/native/table-bro/_toolbar-search.scss +17 -0
  38. package/styles/skin/vanilla-js/native/table-bro/_toolbar.scss +31 -0
  39. package/styles/skin/vanilla-js/shared/_bootstrap-adapter.scss +9 -0
  40. package/styles/skin/vanilla-js/shared/_skin.scss +76 -0
  41. package/styles/skin/vanilla-js/shared/components/bootstrap-based/_button.scss +9 -0
  42. package/styles/skin/vanilla-js/shared/components/material-based/_paginator.scss +62 -0
  43. package/styles/skin/vanilla-js/shared/components/material-based/_sort-header.scss +149 -0
  44. package/styles/skin/vanilla-js/shared/components/material-based/_table.scss +11 -0
  45. package/styles/skin/vanilla-js/shared/table-bro/_filter-drawer.scss +13 -0
  46. package/styles/skin/vanilla-js/shared/table-bro/_paginator.scss +5 -0
  47. package/styles/skin/vanilla-js/shared/table-bro/_toolbar-search.scss +31 -0
  48. package/styles/skin/vanilla-js/shared/table-bro/_toolbar.scss +39 -0
  49. package/styles/skin/vanilla-js/shared/vendor-extensions/material-based/_paginator.scss +12 -0
  50. package/styles/table-bro.native.scss +43 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Table, Bro
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,101 @@
1
- # Temporary Holding Version
1
+ # @table-bro/native
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ The native skin of [Table, Bro](https://table-bro.com): data tables on the native controls of the browser, without a
4
+ UI library. The skin is `nv`.
5
+
6
+ ## With an AI coding agent
7
+
8
+ The skin `nv` gives a table made by the agent plain HTML elements and no UI library, for any framework. Tell your AI
9
+ assistant to use Table, Bro, or add its MCP server to Claude Code, Cursor or Codex: the agent installs the packages,
10
+ generates the table, its setup and its cells from one request, and checks the result.
11
+
12
+ ```sh
13
+ claude mcp add --scope project table-bro -- npx -y @table-bro/mcp@1.2.0
14
+ ```
15
+
16
+ The setup for Cursor, Codex and VS Code is in the README of
17
+ [`@table-bro/mcp`](https://github.com/table-bro/table-bro/tree/main/packages/mcp) and on [MCP
18
+ server](https://table-bro.com/docs/ai/mcp-server). Docs: [Getting started](https://table-bro.com/docs/getting-started),
19
+ [Docs](https://table-bro.com/docs).
20
+
21
+ ## Install
22
+
23
+ ```sh
24
+ npm install @table-bro/core @table-bro/native
25
+ ```
26
+
27
+ ## Use
28
+
29
+ Link the CSS of the core and of the skin, each from its package:
30
+
31
+ ```html
32
+ <link rel="stylesheet" href="node_modules/@table-bro/core/dist/table-bro.min.css">
33
+ <link rel="stylesheet" href="node_modules/@table-bro/native/dist/table-bro.native.min.css">
34
+ ```
35
+
36
+ Import the core and the skin once, before the tables. The import registers the skin:
37
+
38
+ ```ts
39
+ import '@table-bro/core';
40
+ import '@table-bro/native';
41
+
42
+ const table = document.createElement('table-bro');
43
+
44
+ table.configure({
45
+ cols: [
46
+ {title: 'Description', name: 'description'},
47
+ {title: 'Price', name: 'price', dataType: 'number', className: 'bro-col_text-right'}
48
+ ],
49
+ rows: [{description: 'Modern Cotton Chair', price: 1}],
50
+ conf: {skin: 'nv'}
51
+ });
52
+
53
+ document.body.append(table);
54
+ ```
55
+
56
+ Without a bundler, load the UMD build after the core: it puts the skin on the `TableBroNative` global.
57
+
58
+ ```html
59
+ <script src="https://cdn.jsdelivr.net/npm/@table-bro/core@1.2.0/dist/table-bro.umd.js"></script>
60
+ <script src="https://cdn.jsdelivr.net/npm/@table-bro/native@1.2.0/dist/table-bro.native.umd.js"></script>
61
+ ```
62
+
63
+ Load one vanilla skin per page: `@table-bro/native` and `@table-bro/bootstrap` share elements, and the skin loaded
64
+ second warns about it.
65
+
66
+ ## Elements for cells
67
+
68
+ The elements of the cells are optional: a page carries their code only when it defines them. After the import of the
69
+ skin, `withTags()` defines `bro-nv-tags` and `withSwitch()` defines `bro-switch`:
70
+
71
+ ```ts
72
+ import {withSwitch, withTags} from '@table-bro/native';
73
+
74
+ withTags();
75
+ withSwitch();
76
+ ```
77
+
78
+ Or define an element itself: `customElements.define('bro-nv-tags', BroNativeTagsComponent)`. The UMD build carries the code of both
79
+ and has the same functions on its global, as `TableBroNative.withTags()`. A table that uses an element that is not defined
80
+ names its function in the console.
81
+
82
+ A cell of tags without items shows No data: `withTags({texts: {empty: 'No tags'}})` gives the text of the
83
+ application, and `setTagsTexts({empty})` changes it at any time, as when the language of the page changes; the tags on
84
+ the page take it at once. Since 1.2.0; the deprecated `texts.noItems` of a config still works below them.
85
+
86
+ | Element | Value |
87
+ | --- | --- |
88
+ | `bro-nv-tags` | An array of strings in `row[col.name]`; the tags that do not fit become an ellipsis |
89
+ | `bro-switch` | A boolean from the attribute `checked`: `attrs: {checked: (_col, row) => row.done}`. With the attribute `name` and `event: 'action'` a change sends the action `name` with the column and the row; the title of the column names the switch |
90
+
91
+ ## Settings
92
+
93
+ `nativeSkinConfig` is the config of the skin. `config.components` and `config.css` of a table change any of its values
94
+ or functions, at any depth, for that table. The sizes and timings are CSS variables of the table: see the README of
95
+ `@table-bro/core`.
96
+
97
+ The skin has a light and a dark theme, as the README of `@table-bro/core` describes.
98
+
99
+ ## License
100
+
101
+ MIT
@@ -0,0 +1,69 @@
1
+ # Third-party notices
2
+
3
+ Table, Bro is MIT-licensed (LICENSE). Parts of it come from or are built with the code of other projects, under their
4
+ licenses below.
5
+
6
+ ## Angular Components (Angular Material)
7
+
8
+ Ported from Angular Material and carrying its license header:
9
+
10
+ - `packages/skins/shared/js/material-based/paginator/bro-paginator.ts`: the paginator of the vanilla skins, a port of
11
+ `MatPaginator`;
12
+ - `packages/skins/shared/styles/vanilla-js/shared/components/material-based/_paginator.scss` and `_sort-header.scss`:
13
+ the styles of the paginator and of the sort header of the vanilla skins.
14
+
15
+ The CSS of the skin `mat` (`table-bro.material.min.css`) is built with the Sass of `@angular/material`, and the CSS of
16
+ the vanilla skins contains the styles above. Minified CSS keeps no comments, so this file carries the notice for it.
17
+
18
+ ```
19
+ The MIT License
20
+
21
+ Copyright (c) 2026 Google LLC.
22
+
23
+ Permission is hereby granted, free of charge, to any person obtaining a copy
24
+ of this software and associated documentation files (the "Software"), to deal
25
+ in the Software without restriction, including without limitation the rights
26
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
27
+ copies of the Software, and to permit persons to whom the Software is
28
+ furnished to do so, subject to the following conditions:
29
+
30
+ The above copyright notice and this permission notice shall be included in
31
+ all copies or substantial portions of the Software.
32
+
33
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
39
+ THE SOFTWARE.
40
+ ```
41
+
42
+ ## Bootstrap
43
+
44
+ The CSS of the skin `bs` (`table-bro.bootstrap.min.css`) and of the shared elements of the vanilla skins is built with
45
+ the Sass functions, variables and mixins of Bootstrap 5.
46
+
47
+ ```
48
+ The MIT License (MIT)
49
+
50
+ Copyright (c) 2011-2025 The Bootstrap Authors
51
+
52
+ Permission is hereby granted, free of charge, to any person obtaining a copy
53
+ of this software and associated documentation files (the "Software"), to deal
54
+ in the Software without restriction, including without limitation the rights
55
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
56
+ copies of the Software, and to permit persons to whom the Software is
57
+ furnished to do so, subject to the following conditions:
58
+
59
+ The above copyright notice and this permission notice shall be included in
60
+ all copies or substantial portions of the Software.
61
+
62
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
63
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
65
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
66
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
67
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
68
+ THE SOFTWARE.
69
+ ```
@@ -0,0 +1,213 @@
1
+ import { BroCellElement, BroCol, BroConfiguredElement, BroHTMLElement, BroResolvedConfig, BroRow, BroView } from "@table-bro/core";
2
+ //#region ../shared/js/bro-tags.d.ts
3
+ /** The texts of the tags of a skin. */
4
+ interface BroTagsTexts {
5
+ /** The text of a cell of tags without items, No data by default. */
6
+ empty: string;
7
+ }
8
+ /**
9
+ * 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
10
+ * once. They take the place of texts.noItems of the config of a table.
11
+ * @param texts - the texts that change
12
+ */
13
+ export declare function setTagsTexts(texts: Partial<BroTagsTexts>): void;
14
+ /**
15
+ * 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
16
+ * of the skin.
17
+ */
18
+ declare abstract class BroTagsComponent extends BroHTMLElement implements BroView, BroCellElement, BroConfiguredElement {
19
+ template(): string;
20
+ row?: BroRow;
21
+ col?: BroCol;
22
+ config?: BroResolvedConfig;
23
+ items: string[];
24
+ /** Whether the cell has no items and shows the text of an empty cell. */
25
+ private empty;
26
+ /** Stops fitting the tags into the line when the element leaves the DOM. */
27
+ private fitting?;
28
+ /** A move in the DOM connects the element again; it keeps its markup and listeners. */
29
+ private rendered;
30
+ render(): void;
31
+ /** Renders the text of an empty cell again, as setTagsTexts() changes it. */
32
+ renderEmpty(): void;
33
+ /**
34
+ * Puts an item into its tag: a tag is markup only for a column with html: true.
35
+ * @param tagEl - the tag
36
+ * @param item - the item
37
+ */
38
+ private renderTag;
39
+ /** The text of an empty cell: the one of the skin, the deprecated texts.noItems of the table, or No data. */
40
+ private emptyText;
41
+ /** The empty markup of one tag of the skin, which takes the text of an item. */
42
+ protected abstract readonly tagHTML: string;
43
+ connectedCallback(): void;
44
+ disconnectedCallback(): void;
45
+ }
46
+ //#endregion
47
+ //#region js/table-bro.native.config.d.ts
48
+ export declare const nativeSkinConfig: {
49
+ css: {
50
+ table: {
51
+ thead: {
52
+ tr: {
53
+ className: string;
54
+ th: {
55
+ className: string;
56
+ };
57
+ };
58
+ };
59
+ tbody: {
60
+ tr: {
61
+ className: string;
62
+ td: {
63
+ className: string;
64
+ };
65
+ };
66
+ };
67
+ };
68
+ shadow: {
69
+ className: string;
70
+ };
71
+ };
72
+ components: {
73
+ button: {
74
+ selector: string;
75
+ iconSelector: string;
76
+ beforeRender: (element: Element, value: string) => void;
77
+ };
78
+ dropdown: {
79
+ selector: string;
80
+ };
81
+ filterDrawer: {
82
+ beforeRender: (closeButton: Element) => void;
83
+ };
84
+ paginator: {
85
+ selector: string;
86
+ css: {
87
+ ul: {
88
+ className: string;
89
+ li: {
90
+ className: string;
91
+ a: {
92
+ className: string;
93
+ };
94
+ };
95
+ };
96
+ };
97
+ };
98
+ progressBar: {
99
+ selector: string;
100
+ };
101
+ sortHeader: {
102
+ selector: string;
103
+ contentSelector: string;
104
+ beforeRender: (element: Element, value: string) => void;
105
+ afterRender: (element: Element, value: string) => void;
106
+ };
107
+ state: {
108
+ states: {
109
+ loading: [string, string];
110
+ 'no-data': [string, string];
111
+ 'not-found': [string, string];
112
+ fail: [string, string];
113
+ };
114
+ };
115
+ switch: {
116
+ selector: string;
117
+ css: {
118
+ div: {
119
+ className: string;
120
+ input: {
121
+ className: string;
122
+ };
123
+ };
124
+ };
125
+ };
126
+ textEllipsis: {
127
+ selector: string;
128
+ afterRender: (element: Element, value: string) => void;
129
+ };
130
+ toolbar: {
131
+ selector: string;
132
+ css: {
133
+ nav: {
134
+ className: string;
135
+ };
136
+ };
137
+ };
138
+ toolbarMain: {
139
+ selector: string;
140
+ css: {
141
+ toolbarTitle: {
142
+ className: string;
143
+ };
144
+ navbarCollapse: {
145
+ className: string;
146
+ ul: {
147
+ li: {
148
+ className: string;
149
+ a: {
150
+ className: string;
151
+ };
152
+ };
153
+ };
154
+ };
155
+ };
156
+ beforeRender: (searchButton: Element, value: string) => void;
157
+ };
158
+ toolbarSearch: {
159
+ beforeRender: (backButton: Element, clearButton: Element) => void;
160
+ };
161
+ };
162
+ elements: {
163
+ 'bro-nv-tags': string;
164
+ 'bro-switch': string;
165
+ };
166
+ defineElements: (registry: CustomElementRegistry) => void;
167
+ };
168
+ //#endregion
169
+ //#region js/bro-tags.native.d.ts
170
+ /** The tags of the native skin: marks. */
171
+ export declare class BroNativeTagsComponent extends BroTagsComponent {
172
+ protected readonly tagHTML: string;
173
+ }
174
+ //#endregion
175
+ //#region ../shared/js/bootstrap-based/bro-switch.d.ts
176
+ /**
177
+ * A switch of a boolean of a cell. A change sends the action of the attribute name, as the event action that the table
178
+ * turns into bro-action with the column and the row (event: 'action' of the column); the title of the column names
179
+ * the switch for screen readers.
180
+ */
181
+ export declare class BroSwitchComponent extends BroHTMLElement implements BroView, BroConfiguredElement {
182
+ template(): string;
183
+ config: BroResolvedConfig;
184
+ /** The column of the cell, which the table sets. */
185
+ col?: BroCol;
186
+ checked: string | null;
187
+ private css;
188
+ /** A move in the DOM connects the element again; it keeps its markup and listeners. */
189
+ private rendered;
190
+ events(): void;
191
+ render(): void;
192
+ connectedCallback(): void;
193
+ }
194
+ //#endregion
195
+ //#region ../shared/js/define-shared-elements.d.ts
196
+ /**
197
+ * Defines the optional element bro-switch, a boolean of a column as a switch, unless it is defined; without a DOM, as
198
+ * in the server render, it does nothing.
199
+ */
200
+ export declare function withSwitch(): void;
201
+ //#endregion
202
+ //#region js/table-bro.native.d.ts
203
+ /**
204
+ * Defines the optional element bro-nv-tags, the items of a column as tags, unless it is defined; without a DOM, as in
205
+ * the server render, it does nothing. A page without the call does not carry the code of the tags.
206
+ * @param options - the texts of the tags, as {texts: {empty: 'No tags'}}; setTagsTexts() changes them later
207
+ * @param options.texts - the texts of the tags
208
+ */
209
+ export declare function withTags(options?: {
210
+ texts?: Partial<BroTagsTexts>;
211
+ }): void;
212
+ //#endregion
213
+ export type { BroTagsTexts };
@@ -0,0 +1,114 @@
1
+ import{BroDom as e,BroHTML as t,BroHTMLElement as n,broCellSelectors as r,broVisuallyHidden as i,dispatchAction as a,events as o,fitCellItems as s,isPrerendered as c,registerSkin as l}from"@table-bro/core";let u={};const d=/* @__PURE__ */ new Set;function f(e){u={...u,...e},d.forEach(e=>e.renderEmpty())}var p=class extends n{template(){let e=this.col?.name,t=e&&this.row?.[e];return this.empty=!(Array.isArray(t)&&t.length),this.items=this.empty?[this.emptyText()]:t,this.items.map(()=>this.tagHTML).join(``)}row;col;config;items=[];empty=!1;fitting;rendered=!1;render(){this.insertAdjacentHTML(`afterbegin`,this.template()),Array.from(this.children).forEach((e,t)=>this.renderTag(e,this.items[t]))}renderEmpty(){this.empty&&this.firstElementChild&&(this.items=[this.emptyText()],this.renderTag(this.firstElementChild,this.items[0]))}renderTag(e,t){this.col?.html?e.innerHTML=t:e.textContent=t}emptyText(){return u.empty??this.config?.texts.noItems??`No data`}connectedCallback(){d.add(this),this.rendered?this.renderEmpty():(this.rendered=!0,this.render()),this.fitting=new AbortController,s(this,this.fitting.signal)}disconnectedCallback(){d.delete(this),this.fitting?.abort()}};const{escape:m}=t;var h=class extends n{template(){this.css=this.config.components.switch?.css,this.checked=this.getAttribute(`checked`);let e=this.checked===`true`;return`
2
+ <div ${this.css?`class="${m(this.css.div.className)}"`:``}>
3
+ <input type="checkbox"
4
+ ${this.css?`class="${m(this.css.div.input.className)}"`:``}
5
+ role="switch"
6
+ ${e?` checked`:``}>
7
+ </div>`}config;col;checked;css;rendered=!1;events(){let e=this.querySelector(`input`),t=this.getAttribute(`name`);e.setAttribute(`aria-label`,this.col?.title??``),e.addEventListener(`change`,()=>{t&&this.dispatchEvent(new CustomEvent(`action`,{detail:t}))})}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.events()}connectedCallback(){this.rendered||(this.rendered=!0,this.render())}};const{escape:g}=t;var _=class extends n{template(){this.css=this.config.components.toolbar.css;let e=this.css.nav.div?.className?`${this.css.nav.div.className} ${this.contentClassName}`:this.contentClassName;return`
8
+ <nav class="${g(this.css.nav.className)}">
9
+ <div class="${g(e)}">
10
+ <!-- toolbar content -->
11
+ </div>
12
+ </nav>`}config;contentClassName=`bro-toolbar-content`;css;render(){this.insertAdjacentHTML(`afterbegin`,this.template())}appendToolbarContent(...e){this.firstChild||this.render(),this.querySelector(`.${this.contentClassName}`)?.append(...e)}};const{escape:v}=t;var y=class extends n{template(){this.css=this.config.components.toolbarMain.css,this.toolbarTitle=this.config.toolbarTitle;let e=this.css.navbarCollapse.ul.className?`${this.css.navbarCollapse.ul.className} ${this.contentClassName}`:this.contentClassName;return`
13
+ <!--bro-toolbar-->
14
+ <span class="bro-toolbar-title-space"></span>
15
+ <span class="${v(this.css.toolbarTitle.className)}">${v(this.toolbarTitle)}</span>
16
+
17
+ <span class="bro-toolbar-space"></span>
18
+
19
+ <div class="${v(this.css.navbarCollapse.className)} bro-toolbar-buttons">
20
+ <ul class="${v(e)}">
21
+ <!-- search-button -->
22
+ <!-- buttons -->
23
+ </ul>
24
+ </div>
25
+ <!--/bro-toolbar-->`}config;contentClassName=`bro-navbar-nav`;toolbarTitle;css;navContentEl;rendered=!1;events(){this.addEventListener(`click`,e=>{e.preventDefault()}),this.addEventListener(`keydown`,e=>{let t=e.target.closest?.(`a[role="button"]`);e.key===` `&&!e.repeat&&!e.defaultPrevented&&t&&(e.preventDefault(),t.click())}),this.navContentEl.children[0].addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(o.toolbarEvent,{bubbles:!0,composed:!0,detail:o.toolbarSearchOpenEvent}))})}render(){let e=this.dom.createElement(this.config.components.toolbar.selector);e.setAttribute(`class`,`bro-toolbar`),e.config=this.config,this.appendChild(e);let t=this.dom.createElement(`div`);t.insertAdjacentHTML(`afterbegin`,this.template()),e.appendToolbarContent(...Array.from(t.children)),this.appendToolbarContent(this.renderSearchButton(),...this.renderButtons()),this.querySelectorAll(this.config.components.dropdown?.selector).forEach(e=>{e.replaceWith(e.children[0])}),this.events()}connectedCallback(){c(this)||this.rendered||(this.rendered=!0,this.render())}appendToolbarContent(...e){this.navContentEl||=this.querySelector(`.${this.contentClassName}`),this.navContentEl.append(...e)}get dom(){return new e(this.ownerDocument)}templateToolbarButton(e,t,n,r){let a=t===this.config.texts.buttonRole?` aria-hidden="true"`:``,o=e&&t?`<span class="${v(i)}"${a}> ${v(t)}</span>`:``;return this.dom.createFromHTML(`
26
+ <li class="${v(this.css.navbarCollapse.ul.li.className)}">
27
+ <a class="${v(this.css.navbarCollapse.ul.li.a.className)}${r?` ${v(r)}`:``}" href=""
28
+ role="button">
29
+ ${n||``}${v(e)}${o}
30
+ </a>
31
+ </li>`)}renderSearchButton(){let e=this.dom.createElement(this.config.components.button.selector);this.config.components.toolbarMain.beforeRender?.(e,this.config.texts.search);let t=e.getAttribute(`button-title`)??``;return this.templateToolbarButton(t,this.config.texts.searchRole(this.config.toolbarTitle),e.iconHTML,`bro-toolbar-button-search`)}renderButtons(){return(this.config.components.toolbarMain.buttons??[]).map(e=>{if(e.mode===`navbar-dropdown`){let t=this.dom.createElement(this.config.components.dropdown?.selector);return t.config=this.config,t.setAttribute(`mode`,`navbar-dropdown`),t.setAttribute(`button-title`,e.buttonTitle),t.setAttribute(`options`,JSON.stringify(e.options)),t.addEventListener(`value`,e=>{this.dispatchEvent(new CustomEvent(o.toolbarEvent,{bubbles:!0,composed:!0,detail:e.detail}))}),t}{let t=this.templateToolbarButton(e.buttonTitle,this.config.texts.buttonRole,e.iconHTML);return t.querySelector(`a`)?.addEventListener(`click`,()=>{this.dispatchEvent(new CustomEvent(o.toolbarEvent,{bubbles:!0,composed:!0,detail:e.eventType}))}),t}})}};const{escape:b}=t;var x=class extends n{template(){this.label=this.getAttribute(`label`)||``,this.buttonClassName=this.getAttribute(`button-class`),this.buttonTitle=this.getAttribute(`button-title`)||``,this.iconHTML=this.getAttribute(`icon-html`)||this.iconHTML,this.mode=this.getAttribute(`mode`)||`button`,this.eventType=this.getAttribute(`event-type`)||`action`;let e=this.buttonClassName?` class="${b(this.buttonClassName)}"`:``,t=!this.buttonTitle&&this.label?` aria-label="${b(this.label)}"`:``,n=`${b(this.buttonTitle)}${this.iconHTML?`${this.buttonTitle?`&nbsp;`:``}${this.iconHTML}`:``}`;return this.mode===`link`?`
32
+ <a${e} href=""
33
+ role="button"${t}>
34
+ ${n}
35
+ </a>`:`
36
+ <button${e}
37
+ type="button"${t}>
38
+ ${n}
39
+ </button>`}label;buttonClassName;buttonTitle;iconHTML;mode;eventType;events(){let e=this.children[0];e.addEventListener(`click`,t=>{a(e,this.eventType),t.preventDefault()}),this.mode===`link`&&e.addEventListener(`keydown`,t=>{t.key===` `&&!t.repeat&&(t.preventDefault(),e.click())})}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.events()}connectedCallback(){this.firstChild||this.render()}};const{escape:S,text:C}=t;var w=class extends n{template(){return this.containerClassName=this.getAttribute(`container-class`),this.value=this.getAttribute(`value`)||``,`
40
+ <span class="${r.ellipsisContainer}${this.containerClassName?` ${S(this.containerClassName)}`:``}">
41
+ <span class="${r.ellipsis}"></span>
42
+ </span>`}row;col;config;containerClassName;tooltip;value;release;released=!1;rendered=!1;render(){this.insertAdjacentHTML(`afterbegin`,this.template());let e=this.querySelector(`.${r.ellipsis}`);this.col?.html?(e.innerHTML=this.value,this.tooltip=C(this.value)):(e.textContent=this.value,this.tooltip=this.value),this.afterRender()}connectedCallback(){this.rendered?this.released&&(this.released=!1,this.afterRender()):(this.rendered=!0,this.render())}disconnectedCallback(){queueMicrotask(()=>{this.isConnected||(typeof this.release==`function`&&this.release(),this.release=void 0,this.released=!0)})}afterRender(){let e=this.children[0];this.config.components.textEllipsis.afterRender&&(this.release=this.config.components.textEllipsis.afterRender(e,this.tooltip))}};const{escape:T}=t;var E=class extends n{template(){this.arrowPosition=this.getAttribute(`arrow-position`)||`after`,this.sortId=this.getAttribute(`sort-id`)||``,this.dataType=this.getAttribute(`data-type`)||``,this.headerTitle=this.getAttribute(`header-title`)||``,this.iconHTML=this.getAttribute(`icon-html`)||``,this.tooltip=this.getAttribute(`tooltip`)||``;let e=``;this.arrowPosition===`before`&&(e+=` bro-sort-header-position-before`),e+=` bro-sort-header-descending`;let t=this.headerTitle?` role="button" tabindex="0"`:``;return`
43
+ <div class="bro-sort-header-container${e}"${t}>
44
+ <div class="bro-sort-header-content">${T(this.headerTitle)}</div>
45
+ <div class="bro-sort-header-arrow" aria-hidden="true">${this.iconHTML}</div>
46
+ </div>`}static get observedAttributes(){return[`tooltip`]}config;arrowPosition;headerTitle;dataType;iconHTML;sortId;tooltip;_activeSort;direction=``;release;released=!1;rendered=!1;events(){let e=this.children[0];this.headerTitle&&(e.addEventListener(`blur`,()=>{e.classList.remove(`bro-sort-header-recently-cleared-ascending`)}),e.addEventListener(`keydown`,t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),e.click())}),e.addEventListener(`click`,()=>{this.direction===``?(this.direction=`desc`,e.classList.add(`bro-sort-header-sorted`),e.classList.remove(`bro-sort-header-recently-cleared-ascending`)):this.direction===`desc`?(this.direction=`asc`,e.classList.remove(`bro-sort-header-descending`)):this.direction===`asc`&&(this.direction=``,e.classList.remove(`bro-sort-header-sorted`),e.classList.add(`bro-sort-header-descending`),e.classList.add(`bro-sort-header-recently-cleared-ascending`)),a(this,o.filtersSortEvent,{sortKey:this.sortId,sortDirection:this.direction||void 0})}))}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.afterRender(),this.events()}get activeSort(){return this._activeSort}set activeSort(e){this._activeSort=e;let t=this.children[0];this.direction!==``&&e?.sortKey!==this.sortId&&t&&(this.direction=``,t.classList.remove(`bro-sort-header-sorted`),t.classList.add(`bro-sort-header-descending`))}connectedCallback(){c(this)||(this.rendered?this.released&&(this.released=!1,this.afterRender()):(this.rendered=!0,this.render()))}disconnectedCallback(){queueMicrotask(()=>{this.isConnected||(typeof this.release==`function`&&this.release(),this.release=void 0,this.released=!0)})}attributeChangedCallback(e,t,n){this.rendered&&t!==n&&(this.tooltip=n||``,typeof this.release==`function`&&this.release(),this.release=void 0,this.isConnected?this.afterRender():this.released=!0)}afterRender(){let e=this.children[0];this.config.prerender||(this.release=this.config.components.sortHeader.afterRender?.(e,this.tooltip))}};
47
+ /**
48
+ * @license
49
+ * Copyright Google LLC All Rights Reserved.
50
+ *
51
+ * Use of this source code is governed by an MIT-style license that can be
52
+ * found in the LICENSE file at https://angular.dev/license
53
+ */
54
+ const{escape:D}=t,O={"bro-button":x,"bro-paginator":class extends n{template(){this.disabled=this.getAttribute(`disabled`)===`true`||!1,this.length=Number(this.getAttribute(`length`))||0,this.pageIndex=Math.max(Number(this.getAttribute(`page-index`))||0,0),this.pageSize=Number(this.getAttribute(`page-size`)),this.showFirstLastButtons=this.getAttribute(`show-first-last-buttons`)!==`false`,this.parsePageSizeOptions();let e=this.texts=this.config.texts,t=this.config.components.paginator.css?.ul,n=t?.className?` class="${D(t.className)}"`:``,r=t?.li?.className?` class="${D(t.li.className)}"`:``,i=t?.li?.a?.className?`${D(t.li.a.className)} `:``;return this.dropdownSelector=this.config.components.dropdown?.selector,`
55
+ <div class="bro-paginator-outer-container">
56
+ <div class="bro-paginator-inner-container">
57
+ <div class="bro-paginator-page-size">
58
+ <div class="bro-paginator-page-size-label">
59
+ ${D(e.itemsPerPage)}
60
+ </div>
61
+
62
+ ${this.pageSizeDropdown?.length?``:this.templatePageSizeValue()}
63
+ </div>
64
+
65
+ <div class="bro-paginator-range-actions">
66
+ <div class="bro-paginator-range-label" aria-live="polite">
67
+ ${D(e.rangeLabel(this.pageIndex,this.pageSize,this.length))}
68
+ </div>
69
+
70
+ <nav aria-label="${D(e.pageNavigation)}">
71
+ <ul${n}>
72
+ ${this.showFirstLastButtons?`
73
+ <li${r}>
74
+ <a class="${i}bro-paginator-navigation-first" href=""
75
+ aria-label="${D(e.firstPage)}">${D(e.first)}</a>
76
+ </li>`:``}
77
+
78
+ <li${r}>
79
+ <a class="${i}bro-paginator-navigation-previous" href=""
80
+ aria-label="${D(e.previousPage)}">${D(e.previous)}</a>
81
+ </li>
82
+
83
+ <li${r}>
84
+ <a class="${i}bro-paginator-navigation-next" href=""
85
+ aria-label="${D(e.nextPage)}">${D(e.next)}</a>
86
+ </li>
87
+
88
+ ${this.showFirstLastButtons?`
89
+ <li${r}>
90
+ <a class="${i}bro-paginator-navigation-last" href=""
91
+ aria-label="${D(e.lastPage)}">${D(e.last)}</a>
92
+ </li>`:``}
93
+ </ul>
94
+ </nav>
95
+ </div>
96
+ </div>
97
+ </div>`}static get observedAttributes(){return[`page-index`,`page-size`,`length`,`page-size-options`,`disabled`]}config;disabled;length;pageIndex;pageSize;pageSizeOptions;showFirstLastButtons;page;eventName=`page`;firstEl;previousEl;nextEl;lastEl;pageSizeEl;pageSizeValueEl;rangeLabelEl;dropdownSelector;texts;pageSizeDropdown;rendered=!1;events(){this.previousEl=this.querySelector(`.bro-paginator-navigation-previous`),this.nextEl=this.querySelector(`.bro-paginator-navigation-next`),this.previousEl.addEventListener(`click`,e=>{e.preventDefault(),this.hasPreviousPage()&&this.navigate(this.pageIndex-1)}),this.nextEl.addEventListener(`click`,e=>{e.preventDefault(),this.hasNextPage()&&this.navigate(this.pageIndex+1)}),this.showFirstLastButtons&&(this.firstEl=this.querySelector(`.bro-paginator-navigation-first`),this.lastEl=this.querySelector(`.bro-paginator-navigation-last`),this.firstEl.addEventListener(`click`,e=>{e.preventDefault(),this.hasPreviousPage()&&this.navigate(0)}),this.lastEl.addEventListener(`click`,e=>{e.preventDefault(),this.hasNextPage()&&this.navigate(this.getNumberOfPages()-1)}))}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.pageSizeDropdown?.length&&(this.pageSizeEl=this.querySelector(`.bro-paginator-page-size`),this.renderPageSizeDropdown()),this.events(),this.renderNavigationState()}connectedCallback(){c(this)||this.rendered||(this.rendered=!0,this.render())}attributeChangedCallback(e,t,n){this.texts&&((e===`page-index`||e===`page-size`||e===`length`)&&(this.rangeLabelEl||=this.querySelector(`.bro-paginator-range-label`),this.pageSizeValueEl||=this.querySelector(`.bro-paginator-page-size-value`),e===`page-index`&&(this.pageIndex=+n),e===`page-size`&&(this.pageSize=+n,this.pageSizeOptions.length||(this.pageSizeValueEl.innerText=n)),e===`length`&&(this.length=+n),this.rangeLabelEl.textContent=this.texts.rangeLabel(this.pageIndex,this.pageSize,this.length),this.renderNavigationState()),e===`page-size-options`&&(this.parsePageSizeOptions(),this.unrenderPageSizeControls(),this.pageSizeEl||=this.querySelector(`.bro-paginator-page-size`),this.pageSizeDropdown?.length?this.renderPageSizeDropdown():(this.renderPageSizeValue(),this.setAttribute(`disabled`,`true`))),e===`disabled`&&this.setDisabledState(n===`true`))}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let e=this.getNumberOfPages()-1;return this.pageIndex<e&&this.pageSize!=0}getNumberOfPages(){return this.pageSize?Math.ceil(this.length/this.pageSize):0}parsePageSizeOptions(){if(this.getAttribute(`page-size-options`))try{this.pageSizeOptions=JSON.parse(this.getAttribute(`page-size-options`)).map(e=>+e),this.pageSizeDropdown=this.pageSizeOptions.map(e=>({value:e.toString(),title:e.toString()}))}catch(e){this.pageSizeOptions=[],this.config.debug&&console.log(e)}}templatePageSizeValue(){return`<div class="bro-paginator-page-size-value">${this.pageSize}</div>`}unrenderPageSizeControls(){let e=this.querySelector(this.dropdownSelector);e&&e.remove();let t=this.querySelector(`.bro-paginator-page-size-value`);t&&t.remove()}renderPageSizeDropdown(){let t=new e(this.ownerDocument).createElement(this.dropdownSelector);t.config=this.config,t.setAttribute(`mode`,`select`),t.setAttribute(`button-title`,this.pageSize.toString()),t.setAttribute(`options`,JSON.stringify(this.pageSizeDropdown)),t.setAttribute(`label`,this.texts.itemsPerPage),t.setAttribute(`disabled`,this.disabled.toString()),this.eventsPageSize(t),this.pageSizeEl.append(t)}eventsPageSize(e){e.addEventListener(`value`,e=>{let t=e.detail;this.changePageSize(+t),this.setAttribute(`page-size`,t)})}renderPageSizeValue(){this.pageSizeEl.insertAdjacentHTML(`beforeend`,this.templatePageSizeValue())}setDisabledState(e){this.disabled=e;let t=this.querySelector(this.dropdownSelector);t&&t.setAttribute(`disabled`,e.toString()),this.renderNavigationState()}renderNavigationState(){let e=this.disabled||!this.hasPreviousPage(),t=this.disabled||!this.hasNextPage();[[this.firstEl,e],[this.previousEl,e],[this.nextEl,t],[this.lastEl,t]].forEach(([e,t])=>{t?(e?.parentElement?.classList.add(`disabled`),e?.setAttribute(`aria-disabled`,`true`)):(e?.parentElement?.classList.remove(`disabled`),e?.removeAttribute(`aria-disabled`))})}navigate(e){let t=this.pageIndex;e!==t&&(this.pageIndex=e,this.setAttribute(`page-index`,this.pageIndex.toString()),this.emitPageEvent(t))}changePageSize(e){let t=this.pageIndex*this.pageSize,n=this.pageIndex;this.pageIndex=Math.floor(t/e)||0,this.pageSize=e,this.emitPageEvent(n)}emitPageEvent(e){this.page={previousPageIndex:e,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length},this.dispatchEvent(new CustomEvent(this.eventName,{bubbles:!0,composed:!0,detail:this.page}))}},"bro-sort-header":E,"bro-text-ellipsis":w,"bro-toolbar":_,"bro-toolbar-main":y};function k(){A(`bro-switch`,h)}function A(e,t,n=typeof customElements<`u`?customElements:void 0){n&&!n.get(e)&&n.define(e,t)}function j(e,t){let n=[];Object.entries(O).forEach(([e,r])=>{let i=t.get(e);i?i!==r&&n.push(e):t.define(e,r)}),n.length&&console.warn(`${e}: ${n.join(`, `)} are already defined by another vanilla skin bundle, so this skin uses its elements. Load one vanilla skin bundle per page.`)}var M=class extends p{tagHTML=`<mark></mark>`};const{escape:N}=t;var P=class extends n{template(){this.buttonTitle=this.getAttribute(`button-title`)||``,this.name=this.getAttribute(`name`)||`action`,this.mode=this.getAttribute(`mode`)||`dropdown`;try{this.options=JSON.parse(this.getAttribute(`options`))}catch(e){this.options=[],this.config.debug&&console.log(e)}let e=this.getAttribute(`label`)||this.buttonTitle,t=e?` aria-label="${N(e)}"`:``;return this.mode===`select`||this.mode===`dropdown`?`
98
+ <select name="${N(this.name)}"${t}>
99
+ <option value="" hidden>${N(this.buttonTitle)}</option>
100
+ ${this.templateDropdown(this.options)}
101
+ </select>`:`
102
+ <li class="bro-nav-item bro-dropdown">
103
+ <select name="${N(this.name)}"${t}>
104
+ <option value="" hidden>${N(this.buttonTitle)}</option>
105
+ ${this.templateDropdown(this.options)}
106
+ </select>
107
+ </li>`}static get observedAttributes(){return[`disabled`]}config;buttonTitle;name;mode;options;eventName=`value`;dropdownToggleEl;rendered=!1;events(){let e=this.querySelector(`select`),t=this.mode===`navbar-dropdown`,n=!1,r=null;this.dropdownToggleEl=e,this.renderDisabled();let i=n=>{r=null,t&&(e.selectedIndex=0),this.dispatchEvent(new CustomEvent(this.eventName,{bubbles:!0,composed:!0,detail:n}))};t&&(e.addEventListener(`pointerdown`,()=>{n=!1}),e.addEventListener(`keydown`,e=>{n=e.key!==`Enter`,e.key===`Enter`&&r!==null&&i(r)}),e.addEventListener(`blur`,()=>{r!==null&&(r=null,e.selectedIndex=0)})),e.addEventListener(`change`,()=>{t&&n?r=e.value:i(e.value)})}render(){this.insertAdjacentHTML(`afterbegin`,this.template()),this.events()}connectedCallback(){c(this)||this.rendered||(this.rendered=!0,this.render())}attributeChangedCallback(e){e===`disabled`&&this.dropdownToggleEl&&this.renderDisabled()}templateDropdown(e){return`
108
+ ${e.map(e=>{if(`value`in e&&`title`in e)return`
109
+ <option value="${N(e.value)}">${N(e.title)}</option>`;if(`divider`in e)return`
110
+ <hr>`;if(`header`in e)return`
111
+ <optgroup label="${N(e.header)}"></optgroup>`}).join(``)}`}renderDisabled(){this.dropdownToggleEl.toggleAttribute(`disabled`,this.getAttribute(`disabled`)===`true`)}};const{escape:F}=t;var I=class extends n{template(){this.color=this.getAttribute(`color`)||``,this.mode=this.getAttribute(`mode`)||`indeterminate`;let e=this.mode===`indeterminate`;return this.value=(e?100:this.getAttribute(`value`)||0).toString(),`
112
+ <progress ${e?``:`value="${this.value}"`}
113
+ max="${e?``:100}" aria-label="${F(this.config.texts.loadingProgress)}"></progress>`}static get observedAttributes(){return[`value`]}config;color;mode;value;rendered=!1;valueEl;render(){this.insertAdjacentHTML(`afterbegin`,this.template())}connectedCallback(){c(this)||this.rendered||(this.rendered=!0,this.render())}attributeChangedCallback(e,t,n){this.mode===`determinate`&&e===`value`&&(this.valueEl||=this.querySelector(`progress`),this.valueEl.value=+n)}};const L={css:{table:{thead:{tr:{className:`bro-header-row`,th:{className:`bro-header-cell`}}},tbody:{tr:{className:`bro-row`,td:{className:`bro-cell`}}}},shadow:{className:`shadow-lg`}},components:{button:{selector:`bro-button`,iconSelector:`.bro-button-toggle`,beforeRender:(e,t)=>{e.setAttribute(`mode`,`link`),e.setAttribute(`button-title`,t),e.setAttribute(`icon-html`,`<span class="bro-button-toggle"></span>`)}},dropdown:{selector:`bro-nv-dropdown`},filterDrawer:{beforeRender:e=>{e.iconHTML=`&times;`,e.setAttribute(`button-class`,`bro-nav-link`),e.setAttribute(`mode`,`link`)}},paginator:{selector:`bro-paginator`,css:{ul:{className:`bro-pagination`,li:{className:`bro-page-item`,a:{className:`bro-page-link`}}}}},progressBar:{selector:`bro-nv-progress-bar`},sortHeader:{selector:`bro-sort-header`,contentSelector:`.bro-sort-header-content`,beforeRender:(e=>{e.setAttribute(`icon-html`,`<span class="bro-button-icon">&#9660;</span>`)}),afterRender:(e,t)=>{e.setAttribute(`title`,t)}},state:{states:{loading:[`🚀`,`Loading`],"no-data":[`💔`,`No data`],"not-found":[`🔦`,`No records found`],fail:[`😕`,`Failed`]}},switch:{selector:`bro-switch`,css:{div:{className:`bro-form-check bro-form-switch`,input:{className:`bro-form-check-input`}}}},textEllipsis:{selector:`bro-text-ellipsis`,afterRender:(e,t)=>{e.setAttribute(`title`,t)}},toolbar:{selector:`bro-toolbar`,css:{nav:{className:`bro-navbar bro-navbar-expand`}}},toolbarMain:{selector:`bro-toolbar-main`,css:{toolbarTitle:{className:`bro-navbar-brand`},navbarCollapse:{className:`bro-navbar-collapse`,ul:{li:{className:`bro-nav-item`,a:{className:`bro-nav-link`}}}}},beforeRender:(e,t)=>{e.setAttribute(`button-title`,t)}},toolbarSearch:{beforeRender:(e,t)=>{e.iconHTML=`&larr;`,e.setAttribute(`button-class`,`bro-nav-link`),e.setAttribute(`mode`,`link`),t.iconHTML=`&times;`,t.setAttribute(`button-class`,`bro-nav-link`),t.setAttribute(`mode`,`link`)}}},elements:{"bro-nv-tags":`withTags`,"bro-switch":`withSwitch`},defineElements:e=>{j(`@table-bro/native`,e),A(`bro-nv-dropdown`,P,e),A(`bro-nv-progress-bar`,I,e)}};typeof customElements<`u`&&L.defineElements(customElements),l(`nv`,L);function R(e={}){f(e.texts??{}),A(`bro-nv-tags`,M)}export{M as BroNativeTagsComponent,h as BroSwitchComponent,L as nativeSkinConfig,f as setTagsTexts,k as withSwitch,R as withTags};
114
+ //# sourceMappingURL=table-bro.native.esm.js.map