@aquera/nile-elements 0.1.74-beta-1.0 → 0.1.75-beta-1.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 (192) hide show
  1. package/README.md +3 -0
  2. package/demo/index.html +117 -22
  3. package/dist/{fixture-3bfb4490.cjs.js → fixture-5b79f853.cjs.js} +2 -2
  4. package/dist/{fixture-3bfb4490.cjs.js.map → fixture-5b79f853.cjs.js.map} +1 -1
  5. package/dist/{fixture-e7023246.esm.js → fixture-90b199c4.esm.js} +1 -1
  6. package/dist/{fixture-8edec91c.esm.js → fixture-cf7bfcf5.esm.js} +1 -1
  7. package/dist/{fixture-7bfb866e.cjs.js → fixture-dbd66009.cjs.js} +2 -2
  8. package/dist/{fixture-fe6c932e.cjs.js.map → fixture-dbd66009.cjs.js.map} +1 -1
  9. package/dist/index.js +10 -5
  10. package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
  11. package/dist/nile-accordion/nile-accordian.test.esm.js +1 -1
  12. package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
  13. package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
  14. package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
  15. package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
  16. package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
  17. package/dist/nile-badge/nile-badge.test.esm.js +1 -1
  18. package/dist/nile-button/nile-button.test.cjs.js +1 -1
  19. package/dist/nile-button/nile-button.test.esm.js +1 -1
  20. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
  21. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.esm.js +1 -1
  22. package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
  23. package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
  24. package/dist/nile-card/nile-card.test.cjs.js +1 -1
  25. package/dist/nile-card/nile-card.test.esm.js +1 -1
  26. package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
  27. package/dist/nile-checkbox/nile-checkbox.test.esm.js +1 -1
  28. package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
  29. package/dist/nile-chip/nile-chip.test.esm.js +1 -1
  30. package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
  31. package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
  32. package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
  33. package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
  34. package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
  35. package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
  36. package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
  37. package/dist/nile-empty-state/nile-empty-state.test.esm.js +1 -1
  38. package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
  39. package/dist/nile-error-message/nile-error-message.test.esm.js +1 -1
  40. package/dist/nile-file-preview/nile-file-preview.test.cjs.js +1 -1
  41. package/dist/nile-file-preview/nile-file-preview.test.esm.js +1 -1
  42. package/dist/nile-file-upload/nile-file-upload.test.cjs.js +1 -1
  43. package/dist/nile-file-upload/nile-file-upload.test.esm.js +1 -1
  44. package/dist/nile-filter-chip/nile-filter-chip.test.cjs.js +1 -1
  45. package/dist/nile-filter-chip/nile-filter-chip.test.esm.js +1 -1
  46. package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
  47. package/dist/nile-form-group/nile-form-group.test.esm.js +1 -1
  48. package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
  49. package/dist/nile-form-help-text/nile-form-help-text.test.esm.js +1 -1
  50. package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
  51. package/dist/nile-hero/nile-hero.test.esm.js +1 -1
  52. package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
  53. package/dist/nile-icon/nile-icon.test.esm.js +1 -1
  54. package/dist/nile-input/nile-input.test.cjs.js +1 -1
  55. package/dist/nile-input/nile-input.test.esm.js +1 -1
  56. package/dist/nile-link/nile-link.test.cjs.js +1 -1
  57. package/dist/nile-link/nile-link.test.esm.js +1 -1
  58. package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
  59. package/dist/nile-loader/nile-loader.test.esm.js +1 -1
  60. package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
  61. package/dist/nile-popover/nile-popover.test.esm.js +1 -1
  62. package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
  63. package/dist/nile-popup/nile-popup.test.esm.js +1 -1
  64. package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
  65. package/dist/nile-progress-bar/nile-progress-bar.test.esm.js +1 -1
  66. package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
  67. package/dist/nile-radio/nile-radio.test.esm.js +1 -1
  68. package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
  69. package/dist/nile-radio-group/nile-radio-group.test.esm.js +1 -1
  70. package/dist/nile-select/nile-select.cjs.js +1 -1
  71. package/dist/nile-select/nile-select.cjs.js.map +1 -1
  72. package/dist/nile-select/nile-select.esm.js +1 -1
  73. package/dist/nile-select/nile-select.test.cjs.js +1 -1
  74. package/dist/nile-select/nile-select.test.esm.js +1 -1
  75. package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
  76. package/dist/nile-slide-toggle/nile-slide-toggle.test.esm.js +1 -1
  77. package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
  78. package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
  79. package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
  80. package/dist/nile-textarea/nile-textarea.test.esm.js +1 -1
  81. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
  82. package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
  83. package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js +1 -1
  84. package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js.map +1 -1
  85. package/dist/nile-virtual-select/nile-virtual-select.css.esm.js +4 -0
  86. package/dist/nile-virtual-select/nile-virtual-select.esm.js +2 -2
  87. package/dist/nile-virtual-select/nile-virtual-select.test.cjs.js +1 -1
  88. package/dist/nile-virtual-select/nile-virtual-select.test.esm.js +1 -1
  89. package/dist/nile-virtual-select/renderer.cjs.js +1 -1
  90. package/dist/nile-virtual-select/renderer.cjs.js.map +1 -1
  91. package/dist/nile-virtual-select/renderer.esm.js +4 -3
  92. package/dist/nile-virtual-select/temp_nile-virtual-select copy.cjs.js +2 -0
  93. package/dist/nile-virtual-select/temp_nile-virtual-select copy.cjs.js.map +1 -0
  94. package/dist/nile-virtual-select/temp_nile-virtual-select copy.esm.js +231 -0
  95. package/dist/src/internal/resizable-helper.d.ts +59 -0
  96. package/dist/src/internal/resizable-helper.js +115 -0
  97. package/dist/src/internal/resizable-helper.js.map +1 -0
  98. package/dist/src/internal/resizable-styles.d.ts +16 -0
  99. package/dist/src/internal/resizable-styles.js +144 -0
  100. package/dist/src/internal/resizable-styles.js.map +1 -0
  101. package/dist/src/internal/virtualizer-error-handler.d.ts +30 -0
  102. package/dist/src/internal/virtualizer-error-handler.js +82 -0
  103. package/dist/src/internal/virtualizer-error-handler.js.map +1 -0
  104. package/dist/src/lib/index.d.ts +7 -0
  105. package/dist/src/lib/index.js +8 -0
  106. package/dist/src/lib/index.js.map +1 -0
  107. package/dist/src/lib/virtualize.d.ts +32 -0
  108. package/dist/src/lib/virtualize.js +105 -0
  109. package/dist/src/lib/virtualize.js.map +1 -0
  110. package/dist/src/lib/virtualize.test.d.ts +7 -0
  111. package/dist/src/lib/virtualize.test.js +57 -0
  112. package/dist/src/lib/virtualize.test.js.map +1 -0
  113. package/dist/src/nile-badge/__snapshots__/nile-badge.test.snap.js +17 -0
  114. package/dist/src/nile-calendar/__snapshots__/nile-calendar.test.snap.js +310 -0
  115. package/dist/src/nile-card/__snapshots__/nile-card.test.snap.js +34 -0
  116. package/dist/src/nile-checkbox/__snapshots__/nile-checkbox.test.snap.js +31 -0
  117. package/dist/src/nile-grid/data-processor.d.ts +37 -0
  118. package/dist/src/nile-grid/data-processor.js +122 -0
  119. package/dist/src/nile-grid/data-processor.js.map +1 -0
  120. package/dist/src/nile-grid/event-handlers.d.ts +35 -0
  121. package/dist/src/nile-grid/event-handlers.js +158 -0
  122. package/dist/src/nile-grid/event-handlers.js.map +1 -0
  123. package/dist/src/nile-grid/index.d.ts +5 -0
  124. package/dist/src/nile-grid/index.js +6 -0
  125. package/dist/src/nile-grid/index.js.map +1 -0
  126. package/dist/src/nile-grid/nile-grid.css.d.ts +1 -0
  127. package/dist/src/nile-grid/nile-grid.css.js +120 -0
  128. package/dist/src/nile-grid/nile-grid.css.js.map +1 -0
  129. package/dist/src/nile-grid/nile-grid.d.ts +39 -0
  130. package/dist/src/nile-grid/nile-grid.js +182 -0
  131. package/dist/src/nile-grid/nile-grid.js.map +1 -0
  132. package/dist/src/nile-grid/renderer.d.ts +8 -0
  133. package/dist/src/nile-grid/renderer.js +78 -0
  134. package/dist/src/nile-grid/renderer.js.map +1 -0
  135. package/dist/src/nile-grid/resize-handler.d.ts +4 -0
  136. package/dist/src/nile-grid/resize-handler.js +36 -0
  137. package/dist/src/nile-grid/resize-handler.js.map +1 -0
  138. package/dist/src/nile-grid/types.d.ts +32 -0
  139. package/dist/src/nile-grid/types.js +2 -0
  140. package/dist/src/nile-grid/types.js.map +1 -0
  141. package/dist/src/nile-grid/utils.d.ts +4 -0
  142. package/dist/src/nile-grid/utils.js +32 -0
  143. package/dist/src/nile-grid/utils.js.map +1 -0
  144. package/dist/src/nile-hero/__snapshots__/nile-hero.test.snap.js +47 -0
  145. package/dist/src/nile-icon/__snapshots__/nile-icon.test.snap.js +16 -0
  146. package/dist/src/nile-input/__snapshots__/nile-input.test.snap.js +75 -0
  147. package/dist/src/nile-popover/__snapshots__/nile-popover.test.snap.js +22 -0
  148. package/dist/src/nile-select/nile-select.js +3 -2
  149. package/dist/src/nile-select/nile-select.js.map +1 -1
  150. package/dist/src/nile-table-body/virtual-scroll-helper.d.ts +9 -0
  151. package/dist/src/nile-table-body/virtual-scroll-helper.js +24 -0
  152. package/dist/src/nile-table-body/virtual-scroll-helper.js.map +1 -0
  153. package/dist/src/nile-virtual-select/nile-virtual-select.css.js +4 -0
  154. package/dist/src/nile-virtual-select/nile-virtual-select.css.js.map +1 -1
  155. package/dist/src/nile-virtual-select/nile-virtual-select.d.ts +10 -1
  156. package/dist/src/nile-virtual-select/nile-virtual-select.js +71 -9
  157. package/dist/src/nile-virtual-select/nile-virtual-select.js.map +1 -1
  158. package/dist/src/nile-virtual-select/renderer.d.ts +2 -2
  159. package/dist/src/nile-virtual-select/renderer.js +6 -5
  160. package/dist/src/nile-virtual-select/renderer.js.map +1 -1
  161. package/dist/src/nile-virtual-select/temp_nile-virtual-select copy.d.ts +273 -0
  162. package/dist/src/nile-virtual-select/temp_nile-virtual-select copy.js +1305 -0
  163. package/dist/src/nile-virtual-select/temp_nile-virtual-select copy.js.map +1 -0
  164. package/dist/src/nile-virtual-select/virtualizer-error-handler.d.ts +21 -0
  165. package/dist/src/nile-virtual-select/virtualizer-error-handler.js +56 -0
  166. package/dist/src/nile-virtual-select/virtualizer-error-handler.js.map +1 -0
  167. package/dist/src/nile-virtual-table-body/index.d.ts +2 -0
  168. package/dist/src/nile-virtual-table-body/index.js +3 -0
  169. package/dist/src/nile-virtual-table-body/index.js.map +1 -0
  170. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.css.d.ts +1 -0
  171. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.css.js +44 -0
  172. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.css.js.map +1 -0
  173. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.d.ts +50 -0
  174. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.js +135 -0
  175. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.js.map +1 -0
  176. package/dist/src/nile-virtual-table-body/renderer.d.ts +16 -0
  177. package/dist/src/nile-virtual-table-body/renderer.js +49 -0
  178. package/dist/src/nile-virtual-table-body/renderer.js.map +1 -0
  179. package/dist/tsconfig.tsbuildinfo +1 -1
  180. package/package.json +1 -1
  181. package/src/nile-select/nile-select.ts +3 -2
  182. package/src/nile-virtual-select/nile-virtual-select.css.ts +4 -0
  183. package/src/nile-virtual-select/nile-virtual-select.ts +86 -11
  184. package/src/nile-virtual-select/renderer.ts +7 -5
  185. package/src/nile-virtual-select/temp_nile-virtual-select copy.ts +1398 -0
  186. package/vscode-html-custom-data.json +246 -1
  187. package/dist/axe.min-2b379f29.cjs.js +0 -12
  188. package/dist/axe.min-2b379f29.cjs.js.map +0 -1
  189. package/dist/axe.min-c2cd8733.esm.js +0 -12
  190. package/dist/fixture-2b5b3aba.esm.js +0 -569
  191. package/dist/fixture-7bfb866e.cjs.js.map +0 -1
  192. package/dist/fixture-fe6c932e.cjs.js +0 -395
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Webcomponent nile-elements following open-wc recommendations",
4
4
  "license": "MIT",
5
5
  "author": "nile-elements",
6
- "version": "0.1.74-beta-1.0",
6
+ "version": "0.1.75-beta-1.2",
7
7
  "main": "dist/src/index.js",
8
8
  "type": "module",
9
9
  "module": "dist/src/index.js",
@@ -944,8 +944,9 @@ export class NileSelect extends NileElement implements NileFormControl{
944
944
  const allOptions = this.getAllOptions();
945
945
  const value = Array.isArray(this.value) ? this.value : [this.value];
946
946
 
947
- // Select only the options that match the new value
948
- this.setSelectedOptions(allOptions.filter(el => value.includes(el.value)));
947
+ if(!this.enableVirtualScroll) {
948
+ this.setSelectedOptions(allOptions.filter(el => value.includes(el.value)));
949
+ }
949
950
  }
950
951
 
951
952
  @watch('open', { waitUntilFirstUpdate: true })
@@ -32,6 +32,10 @@ export const styles = css`
32
32
  flex-direction: column;
33
33
  }
34
34
 
35
+ .virtualized div[virtualizer-sizer] {
36
+ display: none !important;
37
+ }
38
+
35
39
  .virtualized:not(:has(lit-virtualizer)) nile-option {
36
40
  flex-shrink: 0;
37
41
  }
@@ -29,7 +29,7 @@ import { HasSlotController } from '../internal/slot';
29
29
  import { waitForEvent } from '../internal/event';
30
30
  import { watch } from '../internal/watch';
31
31
  import NileElement from '../internal/nile-element';
32
- import type { CSSResultGroup, TemplateResult } from 'lit';
32
+ import type { CSSResultGroup, PropertyValues, TemplateResult } from 'lit';
33
33
  import type { NileFormControl } from '../internal/nile-element';
34
34
  import type NileOption from '../nile-option/nile-option';
35
35
  import type NilePopup from '../nile-popup/nile-popup';
@@ -73,6 +73,10 @@ import { VirtualSelectRenderer } from './renderer.js';
73
73
  * @event nile-hide - Emitted when the select's menu closes.
74
74
  * @event nile-after-hide - Emitted after the select's menu closes and all animations are complete.
75
75
  * @event nile-invalid - Emitted when the form control has been checked for validity and its constraints aren't satisfied.
76
+ * @event nile-search - Emitted when the user types in the search input. The event payload includes the search query for backend search functionality.
77
+ * @event nile-scroll - Emitted when the user scrolls within the virtualized container. The event payload includes scroll position information.
78
+ * @event nile-scroll-start - Emitted when the user starts scrolling within the virtualized container.
79
+ * @event nile-scroll-end - Emitted when the user stops scrolling and reaches the bottom of the virtualized container (debounced).
76
80
  *
77
81
  * @csspart form-control - The form control that wraps the label, input, and help text.
78
82
  * @csspart form-control-label - The label's wrapper.
@@ -111,6 +115,9 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
111
115
  @state() displayLabel = '';
112
116
  @state() selectedOptions: VirtualOption[] = [];
113
117
  @state() oldValue: string | string[] = '';
118
+
119
+ private scrollTimeout: number | undefined;
120
+ private scrolling = false;
114
121
 
115
122
  /** The name of the select, submitted as a name/value pair with form data. */
116
123
  @property() name = '';
@@ -265,6 +272,17 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
265
272
 
266
273
  disconnectedCallback() {
267
274
  this.removeOpenListeners();
275
+ // Clear any pending scroll timeout to prevent memory leaks
276
+ if (this.scrollTimeout) {
277
+ clearTimeout(this.scrollTimeout);
278
+ this.scrollTimeout = undefined;
279
+ }
280
+ }
281
+
282
+ protected updated(changedProperties: PropertyValues): void {
283
+ if(changedProperties.has('value')) {
284
+ this.selectionChanged();
285
+ }
268
286
  }
269
287
 
270
288
  private initializeComponent(): void {
@@ -307,18 +325,21 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
307
325
  this.handleDocumentFocusIn = this.handleDocumentFocusIn.bind(this);
308
326
  this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this);
309
327
  this.handleDocumentMouseDown = this.handleDocumentMouseDown.bind(this);
328
+ this.handleWindowError = this.handleWindowError.bind(this);
310
329
  }
311
330
 
312
331
  private addOpenListeners(): void {
313
332
  document.addEventListener('focusin', this.handleDocumentFocusIn);
314
333
  document.addEventListener('keydown', this.handleDocumentKeyDown);
315
334
  document.addEventListener('mousedown', this.handleDocumentMouseDown);
335
+ window.addEventListener('error', this.handleWindowError);
316
336
  }
317
337
 
318
338
  private removeOpenListeners(): void {
319
339
  document.removeEventListener('focusin', this.handleDocumentFocusIn);
320
340
  document.removeEventListener('keydown', this.handleDocumentKeyDown);
321
341
  document.removeEventListener('mousedown', this.handleDocumentMouseDown);
342
+ window.removeEventListener('error', this.handleWindowError);
322
343
  }
323
344
 
324
345
  private handleFocus(): void {
@@ -405,6 +426,14 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
405
426
  }
406
427
  };
407
428
 
429
+ private handleWindowError = (event: ErrorEvent): void => {
430
+ const errorMessage = event.error?.message || event.message || '';
431
+ if (errorMessage.includes('Cannot read properties of null (reading \'insertBefore\')')) {
432
+ event.preventDefault();
433
+ return;
434
+ }
435
+ };
436
+
408
437
  private handleFooterClick(event: MouseEvent): void {
409
438
  event.stopPropagation();
410
439
  event.preventDefault();
@@ -628,12 +657,58 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
628
657
 
629
658
  handleSearchChange(e: any): void {
630
659
  this.searchValue = e.detail.value;
660
+
661
+ this.emit('nile-search', {
662
+ query: this.searchValue,
663
+ name: this.name
664
+ });
665
+
631
666
  if (!this.disableLocalSearch) {
632
667
  this.filterVirtualOptions(this.searchValue);
633
668
  this.resetScrollPosition();
634
669
  }
635
670
  }
636
671
 
672
+ handleScroll(e: Event): void {
673
+ if(this.showSelected) {
674
+ return;
675
+ }
676
+
677
+ const target = e.target as HTMLElement;
678
+
679
+ this.emit('nile-scroll', {
680
+ scrollTop: target.scrollTop,
681
+ scrollLeft: target.scrollLeft,
682
+ name: this.name
683
+ });
684
+
685
+ if (!this.scrolling) {
686
+ this.scrolling = true;
687
+ this.emit('nile-scroll-start', {
688
+ scrollTop: target.scrollTop,
689
+ scrollLeft: target.scrollLeft,
690
+ name: this.name
691
+ });
692
+ }
693
+
694
+ clearTimeout(this.scrollTimeout);
695
+ this.scrollTimeout = window.setTimeout(() => {
696
+ if (this.scrolling) {
697
+ this.scrolling = false;
698
+ }
699
+ }, 300);
700
+
701
+ const isAtBottom = Math.ceil(target.scrollTop) >= Math.floor(target.scrollHeight - target.offsetHeight);
702
+ if (isAtBottom) {
703
+ this.emit('nile-scroll-end', {
704
+ scrollTop: target.scrollTop,
705
+ scrollLeft: target.scrollLeft,
706
+ name: this.name,
707
+ isAtBottom: true
708
+ });
709
+ }
710
+ }
711
+
637
712
  filterVirtualOptions(searchValue: string): void {
638
713
  const result = VirtualSelectSearchManager.filterVirtualOptions(
639
714
  searchValue,
@@ -670,18 +745,17 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
670
745
 
671
746
  @watch('data', { waitUntilFirstUpdate: true })
672
747
  handleDataChange(): void {
748
+ if (this.data.length > 0 && this.open && !this.showSelected) {
749
+ this.originalOptionItems = [...this.data];
750
+ }
751
+
673
752
  this.selectionChanged();
674
- // Show no results message when data is empty and not loading
675
753
  if (!this.optionsLoading && this.data.length === 0) {
676
754
  this.showNoResults = true;
677
755
  } else if (this.data.length > 0) {
678
756
  this.showNoResults = false;
679
757
  }
680
758
  this.requestUpdate();
681
-
682
- if (this.open) {
683
- this.resetScrollPosition();
684
- }
685
759
  }
686
760
 
687
761
  @watch('renderItemConfig', { waitUntilFirstUpdate: true })
@@ -745,7 +819,7 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
745
819
  }
746
820
 
747
821
  private initializeOriginalItems(): void {
748
- if (this.originalOptionItems.length === 0 && this.data.length > 0) {
822
+ if (this.data.length > 0) {
749
823
  this.originalOptionItems = [...this.data];
750
824
  }
751
825
  }
@@ -1197,7 +1271,8 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
1197
1271
  this.renderItemConfig?.getValue,
1198
1272
  this.showNoResults,
1199
1273
  this.noResultsMessage,
1200
- this.optionsLoading
1274
+ this.optionsLoading,
1275
+ this.handleScroll.bind(this)
1201
1276
  );
1202
1277
  }
1203
1278
 
@@ -1272,16 +1347,16 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
1272
1347
 
1273
1348
  private resetScrollPosition(): void {
1274
1349
  this.updateComplete.then(() => {
1275
- if (this.virtualizedContainer) {
1350
+ if (this.virtualizedContainer && this.virtualizedContainer.isConnected) {
1276
1351
  this.virtualizedContainer.scrollTop = 0;
1277
1352
 
1278
1353
  const listbox = this.shadowRoot?.querySelector('.select__listbox') as HTMLElement;
1279
- if (listbox) {
1354
+ if (listbox && listbox.isConnected) {
1280
1355
  listbox.scrollTop = 0;
1281
1356
  }
1282
1357
 
1283
1358
  const virtualizer = this.virtualizedContainer.querySelector('lit-virtualizer') as HTMLElement;
1284
- if (virtualizer) {
1359
+ if (virtualizer && virtualizer.isConnected) {
1285
1360
  virtualizer.scrollTop = 0;
1286
1361
  }
1287
1362
  }
@@ -21,7 +21,8 @@ export class VirtualSelectRenderer {
21
21
  getItemValue?: (item: any) => string,
22
22
  showNoResults?: boolean,
23
23
  noResultsMessage?: string,
24
- optionsLoading?: boolean
24
+ optionsLoading?: boolean,
25
+ onScroll?: (e: Event) => void
25
26
  ): TemplateResult {
26
27
  return html`
27
28
  <div part="select-options" class="select__options ${
@@ -37,6 +38,7 @@ export class VirtualSelectRenderer {
37
38
  <div
38
39
  class="virtualized"
39
40
  part="virtualized"
41
+ @scroll=${onScroll}
40
42
  >
41
43
  ${VirtualSelectRenderer.shouldUseVirtualizer(data)
42
44
  ? html`
@@ -70,8 +72,8 @@ export class VirtualSelectRenderer {
70
72
 
71
73
  const optionValue = valueFn(item);
72
74
  const displayText = displayTextFn(item);
73
- const isDisabled = item.disabled || false;
74
- const className = item.className;
75
+ const isDisabled = item?.disabled || false;
76
+ const className = item?.className;
75
77
 
76
78
  let isSelected = false;
77
79
  if (multiple) {
@@ -95,9 +97,9 @@ export class VirtualSelectRenderer {
95
97
 
96
98
  /**
97
99
  * Determines whether to use virtualizer based on dataset size
98
- * For small datasets (less than 50 items), use regular rendering for better sizing
100
+ * For small datasets (less than 5 items), use regular rendering for better sizing
99
101
  */
100
102
  private static shouldUseVirtualizer(data: any[]): boolean {
101
- return data.length >= 50;
103
+ return data.length >= 5;
102
104
  }
103
105
  }