@aquera/nile-elements 1.7.0 → 1.7.2

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 (84) hide show
  1. package/README.md +6 -0
  2. package/demo/index.js +1 -1
  3. package/dist/index.cjs.js +1 -1
  4. package/dist/index.esm.js +1 -1
  5. package/dist/index.js +1401 -424
  6. package/dist/nile-combobox/index.cjs.js +2 -0
  7. package/dist/nile-combobox/index.cjs.js.map +1 -0
  8. package/dist/nile-combobox/index.esm.js +1 -0
  9. package/dist/nile-combobox/nile-combobox.cjs.js +2 -0
  10. package/dist/nile-combobox/nile-combobox.cjs.js.map +1 -0
  11. package/dist/nile-combobox/nile-combobox.css.cjs.js +2 -0
  12. package/dist/nile-combobox/nile-combobox.css.cjs.js.map +1 -0
  13. package/dist/nile-combobox/nile-combobox.css.esm.js +642 -0
  14. package/dist/nile-combobox/nile-combobox.esm.js +233 -0
  15. package/dist/nile-combobox/portal-manager.cjs.js +2 -0
  16. package/dist/nile-combobox/portal-manager.cjs.js.map +1 -0
  17. package/dist/nile-combobox/portal-manager.esm.js +1 -0
  18. package/dist/nile-combobox/renderer.cjs.js +2 -0
  19. package/dist/nile-combobox/renderer.cjs.js.map +1 -0
  20. package/dist/nile-combobox/renderer.esm.js +105 -0
  21. package/dist/nile-combobox/search-manager.cjs.js +2 -0
  22. package/dist/nile-combobox/search-manager.cjs.js.map +1 -0
  23. package/dist/nile-combobox/search-manager.esm.js +1 -0
  24. package/dist/nile-combobox/selection-manager.cjs.js +2 -0
  25. package/dist/nile-combobox/selection-manager.cjs.js.map +1 -0
  26. package/dist/nile-combobox/selection-manager.esm.js +1 -0
  27. package/dist/nile-combobox/types.cjs.js +2 -0
  28. package/dist/nile-combobox/types.cjs.js.map +1 -0
  29. package/dist/nile-combobox/types.esm.js +1 -0
  30. package/dist/nile-nav-tab/nile-nav-tab.cjs.js +1 -1
  31. package/dist/nile-nav-tab/nile-nav-tab.cjs.js.map +1 -1
  32. package/dist/nile-nav-tab/nile-nav-tab.esm.js +1 -1
  33. package/dist/nile-popover/nile-popover.cjs.js.map +1 -1
  34. package/dist/src/index.d.ts +1 -0
  35. package/dist/src/index.js +1 -0
  36. package/dist/src/index.js.map +1 -1
  37. package/dist/src/nile-combobox/index.d.ts +1 -0
  38. package/dist/src/nile-combobox/index.js +2 -0
  39. package/dist/src/nile-combobox/index.js.map +1 -0
  40. package/dist/src/nile-combobox/nile-combobox.css.d.ts +9 -0
  41. package/dist/src/nile-combobox/nile-combobox.css.js +651 -0
  42. package/dist/src/nile-combobox/nile-combobox.css.js.map +1 -0
  43. package/dist/src/nile-combobox/nile-combobox.d.ts +287 -0
  44. package/dist/src/nile-combobox/nile-combobox.js +1602 -0
  45. package/dist/src/nile-combobox/nile-combobox.js.map +1 -0
  46. package/dist/src/nile-combobox/nile-combobox.test.d.ts +1 -0
  47. package/dist/src/nile-combobox/nile-combobox.test.js +551 -0
  48. package/dist/src/nile-combobox/nile-combobox.test.js.map +1 -0
  49. package/dist/src/nile-combobox/portal-manager.d.ts +26 -0
  50. package/dist/src/nile-combobox/portal-manager.js +218 -0
  51. package/dist/src/nile-combobox/portal-manager.js.map +1 -0
  52. package/dist/src/nile-combobox/renderer.d.ts +20 -0
  53. package/dist/src/nile-combobox/renderer.js +210 -0
  54. package/dist/src/nile-combobox/renderer.js.map +1 -0
  55. package/dist/src/nile-combobox/search-manager.d.ts +15 -0
  56. package/dist/src/nile-combobox/search-manager.js +41 -0
  57. package/dist/src/nile-combobox/search-manager.js.map +1 -0
  58. package/dist/src/nile-combobox/selection-manager.d.ts +12 -0
  59. package/dist/src/nile-combobox/selection-manager.js +44 -0
  60. package/dist/src/nile-combobox/selection-manager.js.map +1 -0
  61. package/dist/src/nile-combobox/types.d.ts +23 -0
  62. package/dist/src/nile-combobox/types.js +8 -0
  63. package/dist/src/nile-combobox/types.js.map +1 -0
  64. package/dist/src/nile-nav-tab/nile-nav-tab.js +1 -1
  65. package/dist/src/nile-nav-tab/nile-nav-tab.js.map +1 -1
  66. package/dist/src/version.js +1 -1
  67. package/dist/src/version.js.map +1 -1
  68. package/dist/tsconfig.tsbuildinfo +1 -1
  69. package/package.json +6 -2
  70. package/rollup.config.js +4 -1
  71. package/src/index.ts +1 -0
  72. package/src/nile-combobox/index.ts +1 -0
  73. package/src/nile-combobox/nile-combobox.css.ts +653 -0
  74. package/src/nile-combobox/nile-combobox.test.ts +704 -0
  75. package/src/nile-combobox/nile-combobox.ts +1663 -0
  76. package/src/nile-combobox/portal-manager.ts +263 -0
  77. package/src/nile-combobox/renderer.ts +349 -0
  78. package/src/nile-combobox/search-manager.ts +53 -0
  79. package/src/nile-combobox/selection-manager.ts +57 -0
  80. package/src/nile-combobox/types.ts +27 -0
  81. package/src/nile-nav-tab/nile-nav-tab.ts +1 -1
  82. package/vscode-html-custom-data.json +306 -4
  83. package/web-dev-server.config.mjs +9 -0
  84. package/web-test-runner.config.mjs +11 -0
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Copyright Aquera Inc 2025
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { html } from 'lit';
8
+ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
9
+ import { classMap } from 'lit/directives/class-map.js';
10
+ import { repeat } from 'lit/directives/repeat.js';
11
+ export class ComboboxRenderer {
12
+ static renderVirtualizedOptions(virtualItems, totalSize, data, value, multiple, getDisplayText, getItemValue, isLoading, allowHtmlLabel, measureElement, getItemDescription, getItemPrefix, getItemSuffix, enableDescription) {
13
+ const offsetTop = virtualItems.length > 0 ? virtualItems[0].start : 0;
14
+ return html `
15
+ <div
16
+ part="select-options"
17
+ class="combobox__options ${isLoading ? 'loading' : ''}"
18
+ >
19
+ <div style="position:relative;height:${totalSize}px;width:100%;">
20
+ <div style="position:absolute;top:0;left:0;width:100%;transform:translateY(${offsetTop}px);">
21
+ ${repeat(virtualItems, (vItem) => vItem.key, (vItem) => {
22
+ const item = data[vItem.index];
23
+ return ComboboxRenderer.renderMeasuredItem(item, vItem.index, value, multiple, getDisplayText, getItemValue, allowHtmlLabel, measureElement, getItemDescription, getItemPrefix, getItemSuffix, enableDescription);
24
+ })}
25
+ </div>
26
+ </div>
27
+ </div>
28
+ `;
29
+ }
30
+ static renderPlainOptions(data, value, multiple, getDisplayText, getItemValue, showNoResults, noResultsMessage, isLoading, onScroll, allowHtmlLabel, getItemDescription, getItemPrefix, getItemSuffix, enableDescription, noResultsSubtitle) {
31
+ if (showNoResults && !isLoading && data.length === 0) {
32
+ return ComboboxRenderer.renderNoResults(noResultsMessage, noResultsSubtitle);
33
+ }
34
+ return html `
35
+ <div
36
+ part="select-options"
37
+ class="combobox__options ${isLoading ? 'loading' : ''}"
38
+ >
39
+ <div class="combobox__options-plain" @scroll=${onScroll}>
40
+ ${data.map((item) => ComboboxRenderer.renderItem(item, value, multiple, getDisplayText, getItemValue, allowHtmlLabel, getItemDescription, getItemPrefix, getItemSuffix, enableDescription))}
41
+ </div>
42
+ </div>
43
+ `;
44
+ }
45
+ static renderNoResults(noResultsMessage, noResultsSubtitle) {
46
+ return html `
47
+ <div part="select-options" class="combobox__options">
48
+ <div part="no-results" class="combobox__no-results">
49
+ <div part="no-results-title" class="combobox__no-results-title">
50
+ ${noResultsMessage || 'No result found'}
51
+ </div>
52
+ ${noResultsSubtitle
53
+ ? html `<div part="no-results-subtitle" class="combobox__no-results-subtitle">${noResultsSubtitle}</div>`
54
+ : ''}
55
+ </div>
56
+ </div>
57
+ `;
58
+ }
59
+ static renderNoData(noDataMessage) {
60
+ return html `
61
+ <div part="select-options" class="combobox__options">
62
+ <div part="no-data" class="combobox__no-results">
63
+ <div part="no-data-title" class="combobox__no-results-title">
64
+ ${noDataMessage || 'No data available'}
65
+ </div>
66
+ </div>
67
+ </div>
68
+ `;
69
+ }
70
+ static renderMeasuredItem(item, index, value, multiple, getDisplayText, getItemValue, allowHtmlLabel, measureElement, getItemDescription, getItemPrefix, getItemSuffix, enableDescription) {
71
+ if (!item)
72
+ return html ``;
73
+ const optionValue = getItemValue(item);
74
+ const displayText = getDisplayText(item);
75
+ const isDisabled = item?.disabled || false;
76
+ const className = item?.className;
77
+ const description = getItemDescription ? getItemDescription(item) : (item?.description ?? '');
78
+ const prefix = getItemPrefix ? getItemPrefix(item) : (item?.prefix ?? '');
79
+ const suffix = getItemSuffix ? getItemSuffix(item) : (item?.suffix ?? '');
80
+ let isSelected = false;
81
+ if (multiple) {
82
+ isSelected = Array.isArray(value) && value.some(v => String(v) === String(optionValue));
83
+ }
84
+ else {
85
+ isSelected = String(Array.isArray(value) ? value[0] : value) === String(optionValue);
86
+ }
87
+ return html `
88
+ <nile-option
89
+ data-index=${index}
90
+ value=${optionValue}
91
+ .selected=${isSelected}
92
+ .disabled=${isDisabled}
93
+ .showCheckbox=${multiple}
94
+ class=${classMap({
95
+ option: enableDescription ?? false,
96
+ [className ?? '']: !!className,
97
+ })}
98
+ .description=${description}
99
+ .isDescriptionEnabled=${enableDescription}
100
+ >
101
+ ${unsafeHTML(prefix)}
102
+ ${allowHtmlLabel ? unsafeHTML(displayText) : displayText}
103
+ ${unsafeHTML(suffix)}
104
+ </nile-option>
105
+ `;
106
+ }
107
+ static renderItem(item, value, multiple, getDisplayText, getItemValue, allowHtmlLabel, getItemDescription, getItemPrefix, getItemSuffix, enableDescription) {
108
+ if (!item)
109
+ return html ``;
110
+ const optionValue = getItemValue(item);
111
+ const displayText = getDisplayText(item);
112
+ const isDisabled = item?.disabled || false;
113
+ const className = item?.className;
114
+ const description = getItemDescription ? getItemDescription(item) : (item?.description ?? '');
115
+ const prefix = getItemPrefix ? getItemPrefix(item) : (item?.prefix ?? '');
116
+ const suffix = getItemSuffix ? getItemSuffix(item) : (item?.suffix ?? '');
117
+ let isSelected = false;
118
+ if (multiple) {
119
+ isSelected = Array.isArray(value) && value.some(v => String(v) === String(optionValue));
120
+ }
121
+ else {
122
+ isSelected = String(Array.isArray(value) ? value[0] : value) === String(optionValue);
123
+ }
124
+ return html `
125
+ <nile-option
126
+ value=${optionValue}
127
+ .selected=${isSelected}
128
+ .disabled=${isDisabled}
129
+ .showCheckbox=${multiple}
130
+ class=${classMap({
131
+ option: enableDescription ?? false,
132
+ [className ?? '']: !!className,
133
+ })}
134
+ .description=${description}
135
+ .isDescriptionEnabled=${enableDescription}
136
+ >
137
+ ${unsafeHTML(prefix)}
138
+ ${allowHtmlLabel ? unsafeHTML(displayText) : displayText}
139
+ ${unsafeHTML(suffix)}
140
+ </nile-option>
141
+ `;
142
+ }
143
+ static renderVirtualizedGrid(virtualItems, totalSize, data, value, multiple, gridColumns, getDisplayText, getItemValue, isLoading, allowHtmlLabel, getItemDescription, getItemPrefix, getItemSuffix, gridColumnWidth) {
144
+ const offsetTop = virtualItems.length > 0 ? virtualItems[0].start : 0;
145
+ const colTemplate = gridColumnWidth
146
+ ? `repeat(${gridColumns}, ${gridColumnWidth}px)`
147
+ : `repeat(${gridColumns}, 1fr)`;
148
+ return html `
149
+ <div
150
+ part="select-options"
151
+ class="combobox__options ${isLoading ? 'loading' : ''}"
152
+ >
153
+ <div style="position:relative;height:${totalSize}px;width:${gridColumnWidth ? 'max-content' : '100%'};min-width:100%;">
154
+ <div style="position:absolute;top:0;left:0;width:${gridColumnWidth ? 'max-content' : '100%'};min-width:100%;transform:translateY(${offsetTop}px);">
155
+ ${repeat(virtualItems, (vItem) => vItem.key, (vItem) => {
156
+ const rowStart = vItem.index * gridColumns;
157
+ const rowItems = data.slice(rowStart, rowStart + gridColumns);
158
+ return html `
159
+ <div class="combobox__grid-row" style="display:grid;grid-template-columns:${colTemplate};gap:4px;">
160
+ ${rowItems.map((item) => ComboboxRenderer.renderItem(item, value, multiple, getDisplayText, getItemValue, allowHtmlLabel, getItemDescription, getItemPrefix, getItemSuffix))}
161
+ </div>
162
+ `;
163
+ })}
164
+ </div>
165
+ </div>
166
+ </div>
167
+ `;
168
+ }
169
+ static renderHorizontalGrid(virtualItems, totalSize, data, value, multiple, gridRows, gridColumnWidth, getDisplayText, getItemValue, isLoading, allowHtmlLabel, getItemDescription, getItemPrefix, getItemSuffix) {
170
+ const offsetLeft = virtualItems.length > 0 ? virtualItems[0].start : 0;
171
+ const rowHeight = 38;
172
+ return html `
173
+ <div
174
+ part="select-options"
175
+ class="combobox__options combobox__options--horizontal ${isLoading ? 'loading' : ''}"
176
+ >
177
+ <div style="position:relative;width:${totalSize}px;height:${rowHeight * gridRows}px;">
178
+ <div style="position:absolute;top:0;left:0;height:100%;display:flex;transform:translateX(${offsetLeft}px);">
179
+ ${repeat(virtualItems, (vCol) => vCol.key, (vCol) => {
180
+ const colStart = vCol.index * gridRows;
181
+ const colItems = data.slice(colStart, colStart + gridRows);
182
+ return html `
183
+ <div class="combobox__grid-col" style="width:${gridColumnWidth}px;flex-shrink:0;display:flex;flex-direction:column;">
184
+ ${colItems.map((item) => ComboboxRenderer.renderItem(item, value, multiple, getDisplayText, getItemValue, allowHtmlLabel, getItemDescription, getItemPrefix, getItemSuffix))}
185
+ </div>
186
+ `;
187
+ })}
188
+ </div>
189
+ </div>
190
+ </div>
191
+ `;
192
+ }
193
+ static renderAddCustomOption(searchValue, multiple) {
194
+ return html `
195
+ <nile-option
196
+ value=${searchValue}
197
+ class="combobox__add-option"
198
+ .showCheckbox=${multiple}
199
+ >
200
+ + Add "${searchValue}"
201
+ </nile-option>
202
+ `;
203
+ }
204
+ static shouldUseVirtualizer(data, gridColumns = 1) {
205
+ if (gridColumns > 1)
206
+ return true;
207
+ return data.length >= 5;
208
+ }
209
+ }
210
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/nile-combobox/renderer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright Aquera Inc 2025\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html, type TemplateResult } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport type { VirtualItem } from '@tanstack/virtual-core';\n\nexport class ComboboxRenderer {\n\n static renderVirtualizedOptions(\n virtualItems: VirtualItem[],\n totalSize: number,\n data: any[],\n value: string | string[],\n multiple: boolean,\n getDisplayText: (item: any) => string,\n getItemValue: (item: any) => string,\n isLoading: boolean,\n allowHtmlLabel: boolean,\n measureElement: (el: Element | null) => void,\n getItemDescription?: (item: any) => string,\n getItemPrefix?: (item: any) => string,\n getItemSuffix?: (item: any) => string,\n enableDescription?: boolean,\n ): TemplateResult {\n const offsetTop = virtualItems.length > 0 ? virtualItems[0].start : 0;\n\n return html`\n <div\n part=\"select-options\"\n class=\"combobox__options ${isLoading ? 'loading' : ''}\"\n >\n <div style=\"position:relative;height:${totalSize}px;width:100%;\">\n <div style=\"position:absolute;top:0;left:0;width:100%;transform:translateY(${offsetTop}px);\">\n ${repeat(\n virtualItems,\n (vItem) => vItem.key,\n (vItem) => {\n const item = data[vItem.index];\n return ComboboxRenderer.renderMeasuredItem(\n item, vItem.index, value, multiple, getDisplayText, getItemValue,\n allowHtmlLabel, measureElement, getItemDescription, getItemPrefix,\n getItemSuffix, enableDescription,\n );\n },\n )}\n </div>\n </div>\n </div>\n `;\n }\n\n static renderPlainOptions(\n data: any[],\n value: string | string[],\n multiple: boolean,\n getDisplayText: (item: any) => string,\n getItemValue: (item: any) => string,\n showNoResults: boolean,\n noResultsMessage: string,\n isLoading: boolean,\n onScroll: (e: Event) => void,\n allowHtmlLabel: boolean,\n getItemDescription?: (item: any) => string,\n getItemPrefix?: (item: any) => string,\n getItemSuffix?: (item: any) => string,\n enableDescription?: boolean,\n noResultsSubtitle?: string,\n ): TemplateResult {\n if (showNoResults && !isLoading && data.length === 0) {\n return ComboboxRenderer.renderNoResults(noResultsMessage, noResultsSubtitle);\n }\n\n return html`\n <div\n part=\"select-options\"\n class=\"combobox__options ${isLoading ? 'loading' : ''}\"\n >\n <div class=\"combobox__options-plain\" @scroll=${onScroll}>\n ${data.map((item: any) =>\n ComboboxRenderer.renderItem(\n item, value, multiple, getDisplayText, getItemValue,\n allowHtmlLabel, getItemDescription, getItemPrefix,\n getItemSuffix, enableDescription,\n ),\n )}\n </div>\n </div>\n `;\n }\n\n static renderNoResults(noResultsMessage: string, noResultsSubtitle?: string): TemplateResult {\n return html`\n <div part=\"select-options\" class=\"combobox__options\">\n <div part=\"no-results\" class=\"combobox__no-results\">\n <div part=\"no-results-title\" class=\"combobox__no-results-title\">\n ${noResultsMessage || 'No result found'}\n </div>\n ${noResultsSubtitle\n ? html`<div part=\"no-results-subtitle\" class=\"combobox__no-results-subtitle\">${noResultsSubtitle}</div>`\n : ''}\n </div>\n </div>\n `;\n }\n\n static renderNoData(noDataMessage: string): TemplateResult {\n return html`\n <div part=\"select-options\" class=\"combobox__options\">\n <div part=\"no-data\" class=\"combobox__no-results\">\n <div part=\"no-data-title\" class=\"combobox__no-results-title\">\n ${noDataMessage || 'No data available'}\n </div>\n </div>\n </div>\n `;\n }\n\n private static renderMeasuredItem(\n item: any,\n index: number,\n value: string | string[],\n multiple: boolean,\n getDisplayText: (item: any) => string,\n getItemValue: (item: any) => string,\n allowHtmlLabel: boolean,\n measureElement: (el: Element | null) => void,\n getItemDescription?: (item: any) => string,\n getItemPrefix?: (item: any) => string,\n getItemSuffix?: (item: any) => string,\n enableDescription?: boolean,\n ): TemplateResult {\n if (!item) return html``;\n\n const optionValue = getItemValue(item);\n const displayText = getDisplayText(item);\n const isDisabled = item?.disabled || false;\n const className = item?.className;\n const description = getItemDescription ? getItemDescription(item) : (item?.description ?? '');\n const prefix = getItemPrefix ? getItemPrefix(item) : (item?.prefix ?? '');\n const suffix = getItemSuffix ? getItemSuffix(item) : (item?.suffix ?? '');\n\n let isSelected = false;\n if (multiple) {\n isSelected = Array.isArray(value) && value.some(v => String(v) === String(optionValue));\n } else {\n isSelected = String(Array.isArray(value) ? value[0] : value) === String(optionValue);\n }\n\n return html`\n <nile-option\n data-index=${index}\n value=${optionValue}\n .selected=${isSelected}\n .disabled=${isDisabled}\n .showCheckbox=${multiple}\n class=${classMap({\n option: enableDescription ?? false,\n [className ?? '']: !!className,\n })}\n .description=${description}\n .isDescriptionEnabled=${enableDescription}\n >\n ${unsafeHTML(prefix)}\n ${allowHtmlLabel ? unsafeHTML(displayText) : displayText}\n ${unsafeHTML(suffix)}\n </nile-option>\n `;\n }\n\n static renderItem(\n item: any,\n value: string | string[],\n multiple: boolean,\n getDisplayText: (item: any) => string,\n getItemValue: (item: any) => string,\n allowHtmlLabel: boolean,\n getItemDescription?: (item: any) => string,\n getItemPrefix?: (item: any) => string,\n getItemSuffix?: (item: any) => string,\n enableDescription?: boolean,\n ): TemplateResult {\n if (!item) return html``;\n\n const optionValue = getItemValue(item);\n const displayText = getDisplayText(item);\n const isDisabled = item?.disabled || false;\n const className = item?.className;\n const description = getItemDescription ? getItemDescription(item) : (item?.description ?? '');\n const prefix = getItemPrefix ? getItemPrefix(item) : (item?.prefix ?? '');\n const suffix = getItemSuffix ? getItemSuffix(item) : (item?.suffix ?? '');\n\n let isSelected = false;\n if (multiple) {\n isSelected = Array.isArray(value) && value.some(v => String(v) === String(optionValue));\n } else {\n isSelected = String(Array.isArray(value) ? value[0] : value) === String(optionValue);\n }\n\n return html`\n <nile-option\n value=${optionValue}\n .selected=${isSelected}\n .disabled=${isDisabled}\n .showCheckbox=${multiple}\n class=${classMap({\n option: enableDescription ?? false,\n [className ?? '']: !!className,\n })}\n .description=${description}\n .isDescriptionEnabled=${enableDescription}\n >\n ${unsafeHTML(prefix)}\n ${allowHtmlLabel ? unsafeHTML(displayText) : displayText}\n ${unsafeHTML(suffix)}\n </nile-option>\n `;\n }\n\n static renderVirtualizedGrid(\n virtualItems: VirtualItem[],\n totalSize: number,\n data: any[],\n value: string | string[],\n multiple: boolean,\n gridColumns: number,\n getDisplayText: (item: any) => string,\n getItemValue: (item: any) => string,\n isLoading: boolean,\n allowHtmlLabel: boolean,\n getItemDescription?: (item: any) => string,\n getItemPrefix?: (item: any) => string,\n getItemSuffix?: (item: any) => string,\n gridColumnWidth?: number,\n ): TemplateResult {\n const offsetTop = virtualItems.length > 0 ? virtualItems[0].start : 0;\n const colTemplate = gridColumnWidth\n ? `repeat(${gridColumns}, ${gridColumnWidth}px)`\n : `repeat(${gridColumns}, 1fr)`;\n\n return html`\n <div\n part=\"select-options\"\n class=\"combobox__options ${isLoading ? 'loading' : ''}\"\n >\n <div style=\"position:relative;height:${totalSize}px;width:${gridColumnWidth ? 'max-content' : '100%'};min-width:100%;\">\n <div style=\"position:absolute;top:0;left:0;width:${gridColumnWidth ? 'max-content' : '100%'};min-width:100%;transform:translateY(${offsetTop}px);\">\n ${repeat(\n virtualItems,\n (vItem) => vItem.key,\n (vItem) => {\n const rowStart = vItem.index * gridColumns;\n const rowItems = data.slice(rowStart, rowStart + gridColumns);\n return html`\n <div class=\"combobox__grid-row\" style=\"display:grid;grid-template-columns:${colTemplate};gap:4px;\">\n ${rowItems.map((item: any) =>\n ComboboxRenderer.renderItem(\n item, value, multiple, getDisplayText, getItemValue,\n allowHtmlLabel, getItemDescription, getItemPrefix,\n getItemSuffix,\n ),\n )}\n </div>\n `;\n },\n )}\n </div>\n </div>\n </div>\n `;\n }\n\n static renderHorizontalGrid(\n virtualItems: VirtualItem[],\n totalSize: number,\n data: any[],\n value: string | string[],\n multiple: boolean,\n gridRows: number,\n gridColumnWidth: number,\n getDisplayText: (item: any) => string,\n getItemValue: (item: any) => string,\n isLoading: boolean,\n allowHtmlLabel: boolean,\n getItemDescription?: (item: any) => string,\n getItemPrefix?: (item: any) => string,\n getItemSuffix?: (item: any) => string,\n ): TemplateResult {\n const offsetLeft = virtualItems.length > 0 ? virtualItems[0].start : 0;\n const rowHeight = 38;\n\n return html`\n <div\n part=\"select-options\"\n class=\"combobox__options combobox__options--horizontal ${isLoading ? 'loading' : ''}\"\n >\n <div style=\"position:relative;width:${totalSize}px;height:${rowHeight * gridRows}px;\">\n <div style=\"position:absolute;top:0;left:0;height:100%;display:flex;transform:translateX(${offsetLeft}px);\">\n ${repeat(\n virtualItems,\n (vCol) => vCol.key,\n (vCol) => {\n const colStart = vCol.index * gridRows;\n const colItems = data.slice(colStart, colStart + gridRows);\n return html`\n <div class=\"combobox__grid-col\" style=\"width:${gridColumnWidth}px;flex-shrink:0;display:flex;flex-direction:column;\">\n ${colItems.map((item: any) =>\n ComboboxRenderer.renderItem(\n item, value, multiple, getDisplayText, getItemValue,\n allowHtmlLabel, getItemDescription, getItemPrefix,\n getItemSuffix,\n ),\n )}\n </div>\n `;\n },\n )}\n </div>\n </div>\n </div>\n `;\n }\n\n static renderAddCustomOption(\n searchValue: string,\n multiple: boolean,\n ): TemplateResult {\n return html`\n <nile-option\n value=${searchValue}\n class=\"combobox__add-option\"\n .showCheckbox=${multiple}\n >\n + Add \"${searchValue}\"\n </nile-option>\n `;\n }\n\n static shouldUseVirtualizer(data: any[], gridColumns = 1): boolean {\n if (gridColumns > 1) return true;\n return data.length >= 5;\n }\n}\n"]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Copyright Aquera Inc 2025
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ export declare class ComboboxSearchManager {
8
+ private debounceTimer;
9
+ filter(searchValue: string, originalItems: any[], getSearchText: (item: any) => string): {
10
+ filteredItems: any[];
11
+ showNoResults: boolean;
12
+ };
13
+ debounceSearch(callback: (query: string) => void, query: string, debounceMs: number): void;
14
+ cancelDebounce(): void;
15
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Copyright Aquera Inc 2025
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ export class ComboboxSearchManager {
8
+ constructor() {
9
+ this.debounceTimer = null;
10
+ }
11
+ filter(searchValue, originalItems, getSearchText) {
12
+ if (!originalItems || originalItems.length === 0) {
13
+ return { filteredItems: [], showNoResults: true };
14
+ }
15
+ if (!searchValue || searchValue.trim() === '') {
16
+ return { filteredItems: [...originalItems], showNoResults: false };
17
+ }
18
+ const needle = searchValue.toLowerCase();
19
+ const filteredItems = originalItems.filter((item) => {
20
+ const text = getSearchText(item);
21
+ return text.toLowerCase().includes(needle);
22
+ });
23
+ return { filteredItems, showNoResults: filteredItems.length === 0 };
24
+ }
25
+ debounceSearch(callback, query, debounceMs) {
26
+ if (this.debounceTimer) {
27
+ clearTimeout(this.debounceTimer);
28
+ }
29
+ this.debounceTimer = setTimeout(() => {
30
+ callback(query);
31
+ this.debounceTimer = null;
32
+ }, debounceMs);
33
+ }
34
+ cancelDebounce() {
35
+ if (this.debounceTimer) {
36
+ clearTimeout(this.debounceTimer);
37
+ this.debounceTimer = null;
38
+ }
39
+ }
40
+ }
41
+ //# sourceMappingURL=search-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-manager.js","sourceRoot":"","sources":["../../../src/nile-combobox/search-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,OAAO,qBAAqB;IAAlC;QACU,kBAAa,GAAyC,IAAI,CAAC;IA4CrE,CAAC;IA1CC,MAAM,CACJ,WAAmB,EACnB,aAAoB,EACpB,aAAoC;QAEpC,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,OAAO,EAAE,aAAa,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QACrE,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE;YACvD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,cAAc,CACZ,QAAiC,EACjC,KAAa,EACb,UAAkB;QAElB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC;IAED,cAAc;QACZ,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * Copyright Aquera Inc 2025\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nexport class ComboboxSearchManager {\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n filter(\n searchValue: string,\n originalItems: any[],\n getSearchText: (item: any) => string,\n ): { filteredItems: any[]; showNoResults: boolean } {\n if (!originalItems || originalItems.length === 0) {\n return { filteredItems: [], showNoResults: true };\n }\n\n if (!searchValue || searchValue.trim() === '') {\n return { filteredItems: [...originalItems], showNoResults: false };\n }\n\n const needle = searchValue.toLowerCase();\n const filteredItems = originalItems.filter((item: any) => {\n const text = getSearchText(item);\n return text.toLowerCase().includes(needle);\n });\n\n return { filteredItems, showNoResults: filteredItems.length === 0 };\n }\n\n debounceSearch(\n callback: (query: string) => void,\n query: string,\n debounceMs: number,\n ): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n callback(query);\n this.debounceTimer = null;\n }, debounceMs);\n }\n\n cancelDebounce(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright Aquera Inc 2025
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import type { ComboboxOption } from './types.js';
8
+ export declare class ComboboxSelectionManager {
9
+ static createOptionsFromValues(value: string | string[], data: any[], getDisplayText: (item: any) => string, getItemValue?: (item: any) => string): ComboboxOption[];
10
+ static toggleMultiValue(currentValues: string[], optionValue: string): string[];
11
+ static removeValue(currentValues: string[], removeValue: string): string[];
12
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Copyright Aquera Inc 2025
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ export class ComboboxSelectionManager {
8
+ static createOptionsFromValues(value, data, getDisplayText, getItemValue) {
9
+ if (!value || (Array.isArray(value) && value.length === 0)) {
10
+ return [];
11
+ }
12
+ const values = Array.isArray(value) ? value : [value];
13
+ const valueFn = getItemValue || ((item) => item?.value ?? item);
14
+ return values.map(valueItem => {
15
+ const item = data.find((d) => {
16
+ const iv = valueFn(d);
17
+ return String(iv) === String(valueItem);
18
+ });
19
+ const displayText = item ? getDisplayText(item) : valueItem;
20
+ return {
21
+ value: valueItem,
22
+ selected: true,
23
+ getTextLabel: () => {
24
+ if (typeof displayText === 'string' && /<[^>]+>/.test(displayText)) {
25
+ const div = document.createElement('div');
26
+ div.innerHTML = displayText;
27
+ return div.textContent || div.innerText || '';
28
+ }
29
+ return displayText;
30
+ },
31
+ };
32
+ });
33
+ }
34
+ static toggleMultiValue(currentValues, optionValue) {
35
+ if (currentValues.includes(optionValue)) {
36
+ return currentValues.filter(v => v !== optionValue);
37
+ }
38
+ return [...currentValues, optionValue];
39
+ }
40
+ static removeValue(currentValues, removeValue) {
41
+ return currentValues.filter(v => v !== removeValue);
42
+ }
43
+ }
44
+ //# sourceMappingURL=selection-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-manager.js","sourceRoot":"","sources":["../../../src/nile-combobox/selection-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,OAAO,wBAAwB;IACnC,MAAM,CAAC,uBAAuB,CAC5B,KAAwB,EACxB,IAAW,EACX,cAAqC,EACrC,YAAoC;QAEpC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,YAAY,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;QAErE,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE;gBAChC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACtB,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE5D,OAAO;gBACL,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,GAAG,EAAE;oBACjB,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;wBACnE,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;wBAC1C,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC;wBAC5B,OAAO,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;oBAChD,CAAC;oBACD,OAAO,WAAW,CAAC;gBACrB,CAAC;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,aAAuB,EAAE,WAAmB;QAClE,IAAI,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,GAAG,aAAa,EAAE,WAAW,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,aAAuB,EAAE,WAAmB;QAC7D,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;IACtD,CAAC;CACF","sourcesContent":["/**\n * Copyright Aquera Inc 2025\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport type { ComboboxOption } from './types.js';\n\nexport class ComboboxSelectionManager {\n static createOptionsFromValues(\n value: string | string[],\n data: any[],\n getDisplayText: (item: any) => string,\n getItemValue?: (item: any) => string\n ): ComboboxOption[] {\n if (!value || (Array.isArray(value) && value.length === 0)) {\n return [];\n }\n\n const values = Array.isArray(value) ? value : [value];\n const valueFn = getItemValue || ((item: any) => item?.value ?? item);\n\n return values.map(valueItem => {\n const item = data.find((d: any) => {\n const iv = valueFn(d);\n return String(iv) === String(valueItem);\n });\n\n const displayText = item ? getDisplayText(item) : valueItem;\n\n return {\n value: valueItem,\n selected: true,\n getTextLabel: () => {\n if (typeof displayText === 'string' && /<[^>]+>/.test(displayText)) {\n const div = document.createElement('div');\n div.innerHTML = displayText;\n return div.textContent || div.innerText || '';\n }\n return displayText;\n },\n };\n });\n }\n\n static toggleMultiValue(currentValues: string[], optionValue: string): string[] {\n if (currentValues.includes(optionValue)) {\n return currentValues.filter(v => v !== optionValue);\n }\n return [...currentValues, optionValue];\n }\n\n static removeValue(currentValues: string[], removeValue: string): string[] {\n return currentValues.filter(v => v !== removeValue);\n }\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Copyright Aquera Inc 2025
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ export type NileRemoveEvent = CustomEvent<Record<PropertyKey, never>>;
8
+ export interface ComboboxOption {
9
+ value: string;
10
+ selected: boolean;
11
+ getTextLabel: () => string;
12
+ }
13
+ export interface ComboboxRenderItemConfig {
14
+ getDisplayText: (item: any) => string;
15
+ getValue?: (item: any) => string;
16
+ getSearchText?: (item: any) => string;
17
+ getDescription?: (item: any) => string;
18
+ getPrefix?: (item: any) => string;
19
+ getSuffix?: (item: any) => string;
20
+ }
21
+ export type ComboboxTagLayout = 'single-line' | 'wrap' | 'fixed-height';
22
+ export type ComboboxSize = 'small' | 'medium' | 'large';
23
+ export type ComboboxPlacement = 'top' | 'bottom';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Copyright Aquera Inc 2025
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/nile-combobox/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG","sourcesContent":["/**\n * Copyright Aquera Inc 2025\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nexport type NileRemoveEvent = CustomEvent<Record<PropertyKey, never>>;\n\nexport interface ComboboxOption {\n value: string;\n selected: boolean;\n getTextLabel: () => string;\n}\n\nexport interface ComboboxRenderItemConfig {\n getDisplayText: (item: any) => string;\n getValue?: (item: any) => string;\n getSearchText?: (item: any) => string;\n getDescription?: (item: any) => string;\n getPrefix?: (item: any) => string;\n getSuffix?: (item: any) => string;\n}\n\nexport type ComboboxTagLayout = 'single-line' | 'wrap' | 'fixed-height';\nexport type ComboboxSize = 'small' | 'medium' | 'large';\nexport type ComboboxPlacement = 'top' | 'bottom';\n"]}
@@ -131,7 +131,7 @@ let NileNavTab = class NileNavTab extends NileElement {
131
131
  @click=${this.handleTabClick}
132
132
  >
133
133
  <slot name="prefix" @slotchange=${this.updateAccessibleName}></slot>
134
- <slot @slotchange=${this.updateAccessibleName}></slot>
134
+ <span part="name"><slot @slotchange=${this.updateAccessibleName}></slot></span>
135
135
  <slot name="suffix" @slotchange=${this.updateAccessibleName}></slot>
136
136
 
137
137
  ${this.closable
@@ -1 +1 @@
1
- {"version":3,"file":"nile-nav-tab.js","sourceRoot":"","sources":["../../../src/nile-nav-tab/nile-nav-tab.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright Aquera Inc 2023\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport type { CSSResultGroup } from 'lit';\n\nimport { styles } from './nile-nav-tab.css';\nimport '../nile-icon-button/nile-icon-button';\nimport { MouseKey } from '../internal/enum';\nimport { watch } from '../internal/watch';\nimport NileElement from '../internal/nile-element';\nimport '../nile-link/nile-link';\nlet id = 0;\n\n@customElement('nile-nav-tab')\nexport class NileNavTab extends NileElement {\n static styles: CSSResultGroup = styles;\n\n private readonly attrId = ++id;\n private readonly componentId = `nile-nav-tab-${this.attrId}`;\n\n @query('.nav-tab') navTab!: HTMLElement;\n\n /** The name of the tab panel this tab is associated with. */\n @property({ reflect: true }) panel = '';\n\n /** Draws the tab in an active state. */\n @property({ type: Boolean, reflect: true }) active = false;\n\n /** Makes the tab closable and shows a close button. */\n @property({ type: Boolean }) closable = false;\n\n /** Disables the tab and prevents selection. */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n @property({ type: Boolean, reflect: true }) centered = false;\n\n @property({ type: String, reflect: true }) link?: string;\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'tab');\n this.syncA11yState();\n }\n\n firstUpdated() {\n this.syncA11yState();\n this.updateAccessibleName();\n }\n\n updated() {\n this.syncA11yState();\n this.updateAccessibleName();\n }\n\n private syncA11yState() {\n this.id = this.id || this.componentId;\n this.tabIndex = this.disabled ? -1 : this.active ? 0 : -1;\n\n this.setAttribute('aria-selected', this.active ? 'true' : 'false');\n this.setAttribute('aria-disabled', this.disabled ? 'true' : 'false');\n\n if (this.disabled) {\n this.setAttribute('aria-hidden', 'true');\n } else {\n this.removeAttribute('aria-hidden');\n }\n }\n\n /**\n * Give the host element the accessible name, since nile-link is hidden\n * from the accessibility tree.\n * Author `aria-label` (without `data-auto-aria-label`) is never overwritten so icon-only tabs can keep explicit names.\n * Auto-derived names set `data-auto-aria-label=\"true\"` so slot/text updates can refresh them.\n */\n private updateAccessibleName() {\n const userDefinedAriaLabel =\n this.hasAttribute('aria-label') && this.getAttribute('data-auto-aria-label') !== 'true';\n\n if (userDefinedAriaLabel) {\n return;\n }\n\n const label = (this.textContent || '').replace(/\\s+/g, ' ').trim();\n\n if (label) {\n this.setAttribute('aria-label', label);\n this.setAttribute('data-auto-aria-label', 'true');\n } else {\n this.removeAttribute('aria-label');\n this.removeAttribute('data-auto-aria-label');\n }\n }\n\n private handleCloseClick(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n this.emit('nile-close');\n }\n\n private handleTabClick(event: MouseEvent) {\n if (this.disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n const isModifiedClick =\n Object.values(MouseKey).some(key => event[key as keyof MouseEvent]) ||\n event.button !== 0;\n\n if (isModifiedClick) {\n return;\n }\n\n event.preventDefault();\n }\n\n @watch('active')\n handleActiveChange() {\n this.syncA11yState();\n }\n\n @watch('disabled')\n handleDisabledChange() {\n this.syncA11yState();\n }\n\n focus(options?: FocusOptions) {\n super.focus(options);\n }\n\n blur() {\n super.blur();\n }\n\n render() {\n this.id = this.id || this.componentId;\n\n return html`\n <li part=\"base tab\" class=\"nav-tab-container\" role=\"presentation\">\n <nile-link\n class=${classMap({\n 'nav-tab': true,\n 'tab--centered': this.centered,\n 'nav-tab--active': this.active,\n 'nav-tab--closable': this.closable,\n 'nav-tab--disabled': this.disabled\n })}\n tabindex=\"-1\"\n role=\"none\"\n href=${this.link || nothing}\n aria-hidden=\"true\"\n exportparts=\"\n base:link,\n prefix:link-prefix,\n label:link-label,\n suffix:link-suffix\n \"\n @click=${this.handleTabClick}\n >\n <slot name=\"prefix\" @slotchange=${this.updateAccessibleName}></slot>\n <slot @slotchange=${this.updateAccessibleName}></slot>\n <slot name=\"suffix\" @slotchange=${this.updateAccessibleName}></slot>\n\n ${this.closable\n ? html`\n <nile-icon-button\n part=\"close-button\"\n exportparts=\"base:close-button__base\"\n name=\"var(--nile-icon-close, var(--ng-icon-x-close))\"\n library=\"system\"\n label=\"close\"\n class=\"nav-tab__close-button\"\n ?disabled=${this.disabled}\n @click=${this.handleCloseClick}\n tabindex=\"-1\"\n ></nile-icon-button>\n `\n : nothing}\n </nile-link>\n </li>\n `;\n }\n}\n\nexport default NileNavTab;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-nav-tab': NileNavTab;\n }\n}"]}
1
+ {"version":3,"file":"nile-nav-tab.js","sourceRoot":"","sources":["../../../src/nile-nav-tab/nile-nav-tab.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright Aquera Inc 2023\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport type { CSSResultGroup } from 'lit';\n\nimport { styles } from './nile-nav-tab.css';\nimport '../nile-icon-button/nile-icon-button';\nimport { MouseKey } from '../internal/enum';\nimport { watch } from '../internal/watch';\nimport NileElement from '../internal/nile-element';\nimport '../nile-link/nile-link';\nlet id = 0;\n\n@customElement('nile-nav-tab')\nexport class NileNavTab extends NileElement {\n static styles: CSSResultGroup = styles;\n\n private readonly attrId = ++id;\n private readonly componentId = `nile-nav-tab-${this.attrId}`;\n\n @query('.nav-tab') navTab!: HTMLElement;\n\n /** The name of the tab panel this tab is associated with. */\n @property({ reflect: true }) panel = '';\n\n /** Draws the tab in an active state. */\n @property({ type: Boolean, reflect: true }) active = false;\n\n /** Makes the tab closable and shows a close button. */\n @property({ type: Boolean }) closable = false;\n\n /** Disables the tab and prevents selection. */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n @property({ type: Boolean, reflect: true }) centered = false;\n\n @property({ type: String, reflect: true }) link?: string;\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'tab');\n this.syncA11yState();\n }\n\n firstUpdated() {\n this.syncA11yState();\n this.updateAccessibleName();\n }\n\n updated() {\n this.syncA11yState();\n this.updateAccessibleName();\n }\n\n private syncA11yState() {\n this.id = this.id || this.componentId;\n this.tabIndex = this.disabled ? -1 : this.active ? 0 : -1;\n\n this.setAttribute('aria-selected', this.active ? 'true' : 'false');\n this.setAttribute('aria-disabled', this.disabled ? 'true' : 'false');\n\n if (this.disabled) {\n this.setAttribute('aria-hidden', 'true');\n } else {\n this.removeAttribute('aria-hidden');\n }\n }\n\n /**\n * Give the host element the accessible name, since nile-link is hidden\n * from the accessibility tree.\n * Author `aria-label` (without `data-auto-aria-label`) is never overwritten so icon-only tabs can keep explicit names.\n * Auto-derived names set `data-auto-aria-label=\"true\"` so slot/text updates can refresh them.\n */\n private updateAccessibleName() {\n const userDefinedAriaLabel =\n this.hasAttribute('aria-label') && this.getAttribute('data-auto-aria-label') !== 'true';\n\n if (userDefinedAriaLabel) {\n return;\n }\n\n const label = (this.textContent || '').replace(/\\s+/g, ' ').trim();\n\n if (label) {\n this.setAttribute('aria-label', label);\n this.setAttribute('data-auto-aria-label', 'true');\n } else {\n this.removeAttribute('aria-label');\n this.removeAttribute('data-auto-aria-label');\n }\n }\n\n private handleCloseClick(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n this.emit('nile-close');\n }\n\n private handleTabClick(event: MouseEvent) {\n if (this.disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n const isModifiedClick =\n Object.values(MouseKey).some(key => event[key as keyof MouseEvent]) ||\n event.button !== 0;\n\n if (isModifiedClick) {\n return;\n }\n\n event.preventDefault();\n }\n\n @watch('active')\n handleActiveChange() {\n this.syncA11yState();\n }\n\n @watch('disabled')\n handleDisabledChange() {\n this.syncA11yState();\n }\n\n focus(options?: FocusOptions) {\n super.focus(options);\n }\n\n blur() {\n super.blur();\n }\n\n render() {\n this.id = this.id || this.componentId;\n\n return html`\n <li part=\"base tab\" class=\"nav-tab-container\" role=\"presentation\">\n <nile-link\n class=${classMap({\n 'nav-tab': true,\n 'tab--centered': this.centered,\n 'nav-tab--active': this.active,\n 'nav-tab--closable': this.closable,\n 'nav-tab--disabled': this.disabled\n })}\n tabindex=\"-1\"\n role=\"none\"\n href=${this.link || nothing}\n aria-hidden=\"true\"\n exportparts=\"\n base:link,\n prefix:link-prefix,\n label:link-label,\n suffix:link-suffix\n \"\n @click=${this.handleTabClick}\n >\n <slot name=\"prefix\" @slotchange=${this.updateAccessibleName}></slot>\n <span part=\"name\"><slot @slotchange=${this.updateAccessibleName}></slot></span>\n <slot name=\"suffix\" @slotchange=${this.updateAccessibleName}></slot>\n\n ${this.closable\n ? html`\n <nile-icon-button\n part=\"close-button\"\n exportparts=\"base:close-button__base\"\n name=\"var(--nile-icon-close, var(--ng-icon-x-close))\"\n library=\"system\"\n label=\"close\"\n class=\"nav-tab__close-button\"\n ?disabled=${this.disabled}\n @click=${this.handleCloseClick}\n tabindex=\"-1\"\n ></nile-icon-button>\n `\n : nothing}\n </nile-link>\n </li>\n `;\n }\n}\n\nexport default NileNavTab;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-nav-tab': NileNavTab;\n }\n}"]}
@@ -1,5 +1,5 @@
1
1
  // Version utility - placeholders will be replaced during build
2
- export const NILE_ELEMENTS_VERSION = '1.7.0';
2
+ export const NILE_ELEMENTS_VERSION = '1.7.2';
3
3
  export const NILE_VERSION = '1.2.4';
4
4
  // Set global versions for runtime access
5
5
  if (typeof window !== 'undefined') {
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,yCAAyC;AACzC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,mBAAmB,GAAG,qBAAqB,CAAC;IAC3D,MAAc,CAAC,WAAW,GAAG,YAAY,CAAC;IAC3C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;AACzE,CAAC","sourcesContent":["// Version utility - placeholders will be replaced during build\nexport const NILE_ELEMENTS_VERSION = '1.7.0';\nexport const NILE_VERSION = '1.2.4';\n\n// Set global versions for runtime access\nif (typeof window !== 'undefined') {\n (window as any).nileElementsVersion = NILE_ELEMENTS_VERSION;\n (window as any).nileVersion = NILE_VERSION;\n window.process = window.process || { env: { NODE_ENV: 'production' } };\n}\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,yCAAyC;AACzC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,mBAAmB,GAAG,qBAAqB,CAAC;IAC3D,MAAc,CAAC,WAAW,GAAG,YAAY,CAAC;IAC3C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;AACzE,CAAC","sourcesContent":["// Version utility - placeholders will be replaced during build\nexport const NILE_ELEMENTS_VERSION = '1.7.2';\nexport const NILE_VERSION = '1.2.4';\n\n// Set global versions for runtime access\nif (typeof window !== 'undefined') {\n (window as any).nileElementsVersion = NILE_ELEMENTS_VERSION;\n (window as any).nileVersion = NILE_VERSION;\n window.process = window.process || { env: { NODE_ENV: 'production' } };\n}\n"]}