@cas-smartdesign/virtual-list 6.3.1 → 7.0.1

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.
@@ -19,7 +19,7 @@ export interface IDataRequestEvent {
19
19
  export interface ISelectionEvent {
20
20
  index: number;
21
21
  selected: boolean;
22
- hasModifier: boolean;
22
+ originalEvent: Event;
23
23
  }
24
24
  export interface CustomEventMap extends HTMLElementEventMap {
25
25
  "data-request": CustomEvent<IDataRequestEvent>;
@@ -77,11 +77,11 @@ class T {
77
77
  }
78
78
  }
79
79
  const S = ":host{display:block;position:relative;contain:layout}:host(:focus){outline:none}:host(:focus-visible) ::slotted([focused]){box-shadow:0 0 0 1px #1467ba inset}.container{width:100%}.container>::slotted(*){width:100%;position:absolute;box-sizing:border-box}.container>::slotted(:not([last])){border-bottom:1px solid #d9d9d9}";
80
- var y = Object.defineProperty, v = Object.getOwnPropertyDescriptor, l = (h, e, t, i) => {
81
- for (var n = i > 1 ? void 0 : i ? v(e, t) : e, s = h.length - 1, a; s >= 0; s--)
80
+ var v = Object.defineProperty, A = Object.getOwnPropertyDescriptor, l = (h, e, t, i) => {
81
+ for (var n = i > 1 ? void 0 : i ? A(e, t) : e, s = h.length - 1, a; s >= 0; s--)
82
82
  (a = h[s]) && (n = (i ? a(e, t, n) : a(n)) || n);
83
- return i && n && y(e, t, n), n;
84
- }, A = /* @__PURE__ */ ((h) => (h.TriggerOnly = "trigger-only", h.Single = "single", h.Multi = "multi", h))(A || {});
83
+ return i && n && v(e, t, n), n;
84
+ }, y = /* @__PURE__ */ ((h) => (h.TriggerOnly = "trigger-only", h.Single = "single", h.Multi = "multi", h))(y || {});
85
85
  let L = 0;
86
86
  var r;
87
87
  const o = (r = class extends p {
@@ -102,7 +102,7 @@ const o = (r = class extends p {
102
102
  this.focusIndex > 0 ? this.focusIndex-- : this.finalSizeIsKnown && (this.focusIndex = this.itemCount - 1);
103
103
  break;
104
104
  case "Enter":
105
- this.handleSelection(this.focusIndex, e.metaKey || e.ctrlKey);
105
+ this.handleSelection(this.focusIndex, e);
106
106
  break;
107
107
  case "End":
108
108
  this.focusIndex = this.itemCount - 1;
@@ -316,7 +316,7 @@ const o = (r = class extends p {
316
316
  dispatchSelectionEvent(e, t, i) {
317
317
  this.dispatchEvent(
318
318
  new CustomEvent("selection", {
319
- detail: { index: e, selected: t, hasModifier: i }
319
+ detail: { index: e, selected: t, originalEvent: i }
320
320
  })
321
321
  );
322
322
  }
@@ -324,13 +324,7 @@ const o = (r = class extends p {
324
324
  const t = e.composedPath().find((i) => i.hasAttribute && i.hasAttribute("item-index"));
325
325
  if (t) {
326
326
  const i = parseInt(t.getAttribute("item-index"));
327
- if (Number.isInteger(i)) {
328
- if (e.button == 0 || e.button == 1) {
329
- const n = e.type == "auxclick" && e.button == 1 || e.metaKey || e.ctrlKey;
330
- this.handleSelection(i, n);
331
- }
332
- this.focusIndex = i;
333
- }
327
+ Number.isInteger(i) && ((e.button == 0 || e.button == 1) && this.handleSelection(i, e), this.focusIndex = i);
334
328
  }
335
329
  }
336
330
  }, r.ID = "sd-virtual-list", r.ensureDefined = () => {
@@ -364,7 +358,7 @@ let D = o;
364
358
  D.ensureDefined();
365
359
  export {
366
360
  T as ListDataProvider,
367
- A as SelectionType,
361
+ y as SelectionType,
368
362
  D as default
369
363
  };
370
364
  //# sourceMappingURL=virtual-list.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"virtual-list.mjs","sources":["../list-util.ts","../data-provider.ts","../virtual-list.ts"],"sourcesContent":["export type ScrollToAlignment = \"auto\" | \"center\" | \"start\" | \"end\";\n\nexport interface IListUtil {\n getOffsetForIndexAndAlignment(\n index: number,\n alignment: ScrollToAlignment,\n scrollOffset: number,\n itemHeight: number,\n height: number,\n itemCount: number,\n ): number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n debounce(func: (...args: any) => void): () => void;\n}\n\nclass ListUtil implements IListUtil {\n public getOffsetForIndexAndAlignment(\n index: number,\n alignment: ScrollToAlignment,\n scrollOffset: number,\n itemHeight: number,\n height: number,\n itemCount: number,\n ): number {\n const lastItemOffset = Math.max(0, itemCount * itemHeight);\n const maxOffset = Math.min(lastItemOffset, index * itemHeight);\n const minOffset = Math.max(0, index * itemHeight - height + itemHeight);\n\n switch (alignment) {\n case \"start\":\n return maxOffset;\n case \"end\":\n return minOffset;\n case \"center\": {\n const middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2);\n if (middleOffset < Math.ceil(height / 2)) {\n return 0;\n } else if (middleOffset > lastItemOffset + Math.floor(height / 2)) {\n return lastItemOffset;\n } else {\n return middleOffset;\n }\n }\n case \"auto\":\n default:\n if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {\n return scrollOffset;\n } else if (scrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public debounce(func: (...args: any) => void): (...args: unknown[]) => void {\n let timer: number;\n return (...args: unknown[]) => {\n if (timer) {\n window.cancelAnimationFrame(timer);\n }\n timer = window.requestAnimationFrame(() => {\n func(...args);\n timer = null;\n });\n };\n }\n}\n\nexport default new ListUtil();\n","import VirtualList from \"./virtual-list\";\n\nexport class ListDataProvider {\n public onDataRequest: (page: number) => void;\n\n private _finalSizeIsKnown = false;\n private _itemCache: unknown[] = [];\n private _lastRequestedFirstIndex = 0;\n private _lastRequestedLastIndex = 0;\n private _lastLoadedIndex = 0;\n private _list: VirtualList;\n private _itemCount: number;\n private _pendingDataRequest: boolean;\n\n constructor(\n public pageSize: number = 100,\n public preloadedItemsCount: number = 5,\n ) {\n this.itemCount = pageSize; // configure initial load\n }\n\n public get currentPage(): number {\n if (this.items.length == 0 && this.finalSizeIsKnown) {\n return 0; // Otherwise empty cache means we haven't fetched anything\n }\n // With pageSize 100\n // 0 => -1\n // 1 100 => 0\n // 101 200 => 1\n return Math.floor((this.items.length - 1) / this.pageSize);\n }\n\n public get finalSizeIsKnown(): boolean {\n return this._finalSizeIsKnown;\n }\n\n public set finalSizeIsKnown(value: boolean) {\n this._finalSizeIsKnown = value;\n if (value) {\n this.itemCount = this._itemCache.length;\n }\n if (this._list) {\n this._list.finalSizeIsKnown = value;\n }\n }\n\n private get itemCount(): number {\n return this._itemCount;\n }\n\n private set itemCount(count: number) {\n this._itemCount = count;\n if (this._list) {\n this._list.itemCount = count;\n }\n }\n\n public get items(): unknown[] {\n return this._itemCache;\n }\n\n public set items(items: unknown[]) {\n this._itemCache = items;\n this.onItemsChange();\n }\n\n public addItems(items: unknown[]): void {\n this._itemCache = this._itemCache.concat(items);\n this.onItemsChange();\n }\n\n public connectList(list: VirtualList): void {\n if (this._list) {\n this._list.removeEventListener(\"data-request\", this.handleListDataRequest);\n }\n this._list = list;\n list.itemCount = this.itemCount;\n list.addEventListener(\"data-request\", this.handleListDataRequest);\n list.finalSizeIsKnown = this._finalSizeIsKnown;\n }\n\n private onItemsChange(): void {\n this._pendingDataRequest = false;\n this._lastLoadedIndex = this._itemCache.length - 1;\n if (this.finalSizeIsKnown) {\n this.itemCount = this._itemCache.length;\n } else if (this._lastLoadedIndex > this.itemCount) {\n this.itemCount = this._lastLoadedIndex;\n }\n if (this._list) {\n this._list.items = this._itemCache.slice(this._lastRequestedFirstIndex, this._lastRequestedLastIndex + 1);\n }\n }\n\n private handleListDataRequest = (event: CustomEvent) => {\n const { startIndex, stopIndex } = event.detail;\n this._lastRequestedFirstIndex = startIndex;\n this._lastRequestedLastIndex = stopIndex;\n this._list.items = this._itemCache.slice(startIndex, stopIndex + 1);\n\n if (!this.finalSizeIsKnown && this._lastLoadedIndex < stopIndex + this.preloadedItemsCount) {\n this.requestData();\n }\n };\n\n private requestData(): void {\n if (this._pendingDataRequest) {\n return;\n }\n if (this.onDataRequest) {\n this._pendingDataRequest = true;\n this.onDataRequest(this.currentPage + 1);\n this._lastLoadedIndex += this.pageSize - 1;\n if (this._lastLoadedIndex > this.itemCount) {\n this.itemCount = this._lastLoadedIndex;\n }\n } else {\n throw Error(\n \"The final size is not yet known and the list would require item data from index \" +\n this._lastRequestedFirstIndex +\n \". to \" +\n this._lastRequestedLastIndex +\n \". which is not possible to load without a configured onDataRequest\",\n );\n }\n }\n}\n","import { LitElement, TemplateResult, html, unsafeCSS, PropertyValues, css } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport ListUtil, { ScrollToAlignment } from \"./list-util\";\nimport ListItem, { generator } from \"@cas-smartdesign/list-item\";\nexport { ListDataProvider } from \"./data-provider\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [VirtualList.ID]: VirtualList;\n }\n}\n\nimport style from \"./style.scss?inline\";\n\nexport type ItemGenerator = (data: unknown, index: number) => HTMLElement;\nexport enum SelectionType {\n TriggerOnly = \"trigger-only\",\n Single = \"single\",\n Multi = \"multi\",\n}\n\ninterface ItemRenderData {\n index: number;\n top: number;\n physicalIndex: number;\n dataHash: string;\n data?: unknown;\n}\n\nlet idCounter = 0;\n\nexport interface IDataRequestEvent {\n startIndex: number;\n stopIndex: number;\n}\n\nexport interface ISelectionEvent {\n index: number;\n selected: boolean;\n hasModifier: boolean;\n}\n\nexport interface CustomEventMap extends HTMLElementEventMap {\n \"data-request\": CustomEvent<IDataRequestEvent>;\n selection: CustomEvent<ISelectionEvent>;\n}\n\nexport default interface VirtualList {\n addEventListener<K extends keyof CustomEventMap>(\n event: K,\n listener: ((this: this, ev: CustomEventMap[K]) => unknown) | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n addEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n removeEventListener<K extends keyof CustomEventMap>(\n type: K,\n listener: (this: this, ev: CustomEventMap[K]) => unknown,\n options?: boolean | EventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ): void;\n dispatchEvent<EventType extends CustomEventMap[keyof CustomEventMap]>(event: EventType): boolean;\n}\n\nexport default class VirtualList extends LitElement {\n public static readonly ID = \"sd-virtual-list\";\n public static ensureDefined = (): void => {\n ListItem.ensureDefined();\n if (!customElements.get(VirtualList.ID)) {\n customElements.define(VirtualList.ID, VirtualList);\n }\n };\n\n @property({ type: Number, attribute: \"item-height\", reflect: true })\n public itemHeight: number;\n @property({ type: Number })\n public itemCount: number;\n @property({ type: Array, attribute: false })\n public items: unknown[] = [];\n @property({ type: String, attribute: \"selection-type\", reflect: true, noAccessor: true })\n public selectionType: SelectionType = SelectionType.TriggerOnly;\n @property({ type: String, attribute: true, reflect: true })\n public id: string = VirtualList.ID + \"_\" + idCounter++;\n\n // aria attributes\n @property({ type: String, reflect: true })\n public role = \"listbox\";\n\n public itemGenerator: ItemGenerator = generator;\n public finalSizeIsKnown: boolean;\n\n private _lastKnownScrollTop = 0;\n private _lastRenderedScrollTop = 0;\n\n private _itemsRenderData: ItemRenderData[] = [];\n private _elementCache: Map<string, HTMLElement> = new Map();\n\n private _firstVisibleIndex: number;\n private _lastVisibleIndex: number;\n private _visibleItemsNum = 0;\n\n private _selectedIndices: number[] = [];\n private _focusIndex = -1;\n private _resizeObserver: ResizeObserver;\n private _lastKnownHeight = 0;\n private _increaseWidthOnNextRenderIfNeeded: boolean;\n private _reachedMaxWidth: boolean;\n\n public get focusTarget(): boolean {\n return this.hasAttribute(\"focus-target\");\n }\n\n public set focusTarget(value: boolean) {\n this.toggleAttribute(\"focus-target\", value);\n }\n\n @property({ type: Number, attribute: \"focus-index\", reflect: true })\n public get focusIndex(): number {\n return this._focusIndex;\n }\n\n public set focusIndex(index: number) {\n if (index >= -1 && index < this.itemCount) {\n const oldValue = this._focusIndex;\n this._focusIndex = index;\n if (index <= this._firstVisibleIndex || this._lastVisibleIndex <= index) {\n this.scrollToItem(index);\n }\n if (oldValue != index) {\n if (index == -1) {\n this.removeAttribute(\"aria-activedescendant\");\n }\n this.requestUpdate(\"focusIndex\", oldValue);\n }\n }\n }\n\n @property({ type: Array, attribute: false })\n public get selectedIndices(): number[] {\n return this._selectedIndices;\n }\n\n public set selectedIndices(selectedIndices: number[]) {\n if (selectedIndices) {\n // Parse to primitive numbers as the virtual-list uses numbers and not objects for the indexOf(item-index) checks.\n this._selectedIndices = selectedIndices.map((index) => Number(index));\n } else {\n this._selectedIndices = [];\n }\n this.requestUpdate(\"selectedIndices\");\n }\n\n public scrollToItem(index: number, alignment: ScrollToAlignment = \"auto\"): void {\n this.scrollTop = ListUtil.getOffsetForIndexAndAlignment(\n this.normalizeIndex(index),\n alignment,\n this.scrollTop,\n this.itemHeight,\n this.height,\n this.itemCount,\n );\n // The render might have already been scheduled, but the onScroll event is dispatched later.\n // We need to update the _lastKnownScrollTop manually to ensure an up-to-date value is used even for the next render.\n this._lastKnownScrollTop = this.scrollTop;\n }\n\n public getListItem(index: number): HTMLElement {\n if (!this.shadowRoot || index < this._firstVisibleIndex || this._lastVisibleIndex < index) {\n return null;\n }\n return this.querySelector(`[item-index=\"${index}\"]`);\n }\n\n constructor() {\n super();\n this._resizeObserver = new ResizeObserver(() => {\n if (this._lastKnownHeight !== this.offsetHeight) {\n this._lastKnownHeight = this.offsetHeight;\n this.requestUpdate();\n }\n });\n }\n\n public connectedCallback(): void {\n super.connectedCallback();\n\n this._resizeObserver.observe(this);\n // these are needed because when reattaching the list to the DOM\n // then the scroll position is reset but no scroll event is called\n // so the list shows the items at incorrect position\n if (this.scrollTop !== this._lastKnownScrollTop) {\n this.scrollTop = this._lastKnownScrollTop;\n this.requestUpdate();\n }\n }\n\n public disconnectedCallback(): void {\n super.disconnectedCallback();\n this._resizeObserver.disconnect();\n }\n\n public firstUpdated(_changedProperties: PropertyValues): void {\n super.firstUpdated(_changedProperties);\n\n this.addEventListener(\"scroll\", this.onScroll);\n this.addEventListener(\"keydown\", this.handleKeyDown);\n this.addEventListener(\"click\", this.handleClick);\n this.addEventListener(\"mousedown\", (event) => {\n if (event.button == 1) {\n event.preventDefault();\n }\n });\n this.addEventListener(\"auxclick\", this.handleClick);\n this.addEventListener(\"focus\", () => {\n if (this.matches(\":focus-visible\")) {\n if (this.focusIndex == -1) {\n if (this.selectedIndices) {\n this.focusIndex = this.selectedIndices[0];\n }\n if (this.focusIndex == -1 && this.itemCount > 0) {\n this.focusIndex = 0;\n }\n } else {\n this.updateFocusedItemAttributes();\n }\n }\n });\n this.addEventListener(\"blur\", () => {\n if (this.focusIndex != -1) {\n this.updateFocusedItemAttributes();\n }\n });\n if (this.selectedIndices.length > 0) {\n this.scrollToItem(this.selectedIndices[0], \"center\");\n }\n }\n\n private updateFocusedItemAttributes() {\n const focusedElement = this.getListItem(this.focusIndex);\n if (focusedElement) {\n if (this.focusTarget || document.activeElement == this) {\n focusedElement.setAttribute(\"focused\", \"\");\n this.setAttribute(\"aria-activedescendant\", focusedElement.id);\n } else {\n focusedElement.removeAttribute(\"focused\");\n this.removeAttribute(\"aria-activedescendant\");\n }\n }\n }\n\n static get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n public render(): TemplateResult {\n this.updateItemsRenderData();\n return html`\n <div class=\"container\" style=\"height: ${this.itemCount * this.itemHeight}px\">\n <slot name=\"items\"></slot>\n </div>\n `;\n }\n\n public updated(_changedProperties: PropertyValues): void {\n super.updated(_changedProperties);\n this._lastRenderedScrollTop = this._lastKnownScrollTop;\n this.updateItems();\n\n if (\n (this._increaseWidthOnNextRenderIfNeeded || this._reachedMaxWidth) && //\n this._firstVisibleIndex < this._lastVisibleIndex\n ) {\n if (!this.querySelector(\"[item-index]\")) {\n // If ShadyDOM is in use, then it needs a delay, because dom mutations are not applied immediately.\n const observer = new MutationObserver(() => {\n this.adjustWidthIfNeeded();\n observer.disconnect();\n });\n observer.observe(this);\n } else {\n this.adjustWidthIfNeeded();\n }\n }\n }\n\n private adjustWidthIfNeeded() {\n if (this._increaseWidthOnNextRenderIfNeeded) {\n this._increaseWidthOnNextRenderIfNeeded = false;\n window.requestAnimationFrame(() => {\n const remainingWidth = Number.parseInt(getComputedStyle(this).maxWidth) - this.offsetWidth;\n if (remainingWidth == 0) {\n this._reachedMaxWidth = true;\n this.enableLineClampOnItemsIfNeeded();\n } else {\n this._reachedMaxWidth = false;\n const missingWidths = [...this.querySelectorAll(\"[item-index]\")].map((item) => {\n if (item instanceof ListItem) {\n item.enableLineClamp = false;\n const missingWidthForTexts = item.missingWidthForTexts;\n if (missingWidthForTexts > remainingWidth) {\n item.enableLineClamp = true;\n }\n return missingWidthForTexts;\n }\n });\n const additionalWidth = Math.max(...missingWidths);\n if (additionalWidth > 0) {\n this.style.width = `${this.offsetWidth + additionalWidth}px`;\n }\n }\n });\n } else if (this._reachedMaxWidth) {\n this.enableLineClampOnItemsIfNeeded();\n }\n }\n\n private enableLineClampOnItemsIfNeeded() {\n this.querySelectorAll(\"[item-index]\").forEach((item) => {\n if (item instanceof ListItem) {\n item.enableLineClamp = item.enableLineClamp || item.missingWidthForTexts > 0;\n }\n });\n }\n\n /**\n * Searches for list-items where there is a need for an additional width (ellipsis maybe shown) and increases the width of the list,\n * therefore all the content is visible without tooltips. As it can be an expensive task to retrieve the required details, calling\n * this function has an effect only on the very next render. Note that it only works if the virtual-list works with sd-list-item elements.\n * If the maximum width is reached, line clamp is enabled on list items as a last resort approach to show the content if possible.\n */\n public increaseWidthOnNextRenderIfNeeded(): void {\n this._increaseWidthOnNextRenderIfNeeded = true;\n }\n\n private updateItems() {\n const unusedItems: Element[] = [...this.querySelectorAll(\"[item-index]\")];\n const renderedItems: Map<string, HTMLElement> = new Map();\n\n const newItemsFragment = document.createDocumentFragment();\n for (const renderData of this._itemsRenderData) {\n const itemElement = this.renderItem(renderData);\n if (!itemElement.parentElement) {\n newItemsFragment.appendChild(itemElement);\n }\n renderedItems.set(renderData.dataHash, itemElement);\n const index = unusedItems.indexOf(itemElement);\n if (index !== -1) {\n unusedItems.splice(index, 1);\n }\n }\n this.appendChild(newItemsFragment);\n\n for (const unusedItemElement of unusedItems) {\n if (unusedItemElement instanceof ListItem) {\n unusedItemElement.enableLineClamp = false;\n }\n this.removeChild(unusedItemElement);\n }\n\n renderedItems.forEach((itemElement, dataHash) => {\n this._elementCache.set(dataHash, itemElement);\n });\n }\n\n private renderItem({ index, top, dataHash, data }: ItemRenderData): HTMLElement {\n let element: HTMLElement;\n if (data) {\n if (this._elementCache.has(dataHash)) {\n element = this._elementCache.get(dataHash);\n this._elementCache.delete(dataHash); // Allow to be rendered twice\n } else {\n element = this.itemGenerator(data, index);\n element.setAttribute(\"slot\", \"items\");\n // Do not add to cache yet, because the same item might need to be rendered twice\n }\n } else {\n element = document.createElement(\"div\");\n element.setAttribute(\"placeholder-item\", \"\");\n element.setAttribute(\"slot\", \"items\");\n }\n Object.assign(element.style, {\n transform: `translateY(${top}px)`,\n height: `${this.itemHeight}px`,\n });\n element.setAttribute(\"item-index\", index.toString());\n element.setAttribute(\"aria-setsize\", String(this.finalSizeIsKnown ? this.itemCount : -1));\n element.setAttribute(\"aria-posinset\", String(index + 1));\n if (!element.id || element.id.startsWith(this.id + \"_item_\")) {\n element.id = this.id + \"_item_\" + index;\n }\n if (this.itemCount - 1 == index) {\n element.setAttribute(\"last\", \"\");\n } else {\n element.removeAttribute(\"last\");\n }\n\n this.updateSelectedAttribute(index, element);\n this.updateFocusedAttribute(index, element);\n\n return element;\n }\n\n private onScroll = () => {\n this._lastKnownScrollTop = this.scrollTop;\n const delta = this._lastRenderedScrollTop - this._lastKnownScrollTop;\n if (Math.abs(delta) >= this.itemHeight) {\n this._lastRenderedScrollTop = this._lastKnownScrollTop;\n this.requestUpdate();\n }\n };\n\n private updateFocusedAttribute(index: number, itemElement: HTMLElement) {\n if (this.focusIndex == index && (this.focusTarget || document.activeElement == this)) {\n itemElement.setAttribute(\"focused\", \"\");\n this.setAttribute(\"aria-activedescendant\", itemElement.id);\n } else {\n itemElement.removeAttribute(\"focused\");\n }\n }\n\n private updateSelectedAttribute(index: number, itemElement: HTMLElement) {\n const selected = this.selectedIndices.indexOf(index) !== -1;\n if (selected) {\n itemElement.setAttribute(\"selected\", \"\");\n } else {\n itemElement.removeAttribute(\"selected\");\n }\n itemElement.setAttribute(\"aria-selected\", String(selected));\n }\n\n private updateItemsRenderData(): void {\n this._itemsRenderData = [];\n this._visibleItemsNum = Math.min(Math.ceil(this.height / this.itemHeight), this.itemCount);\n\n if (this._visibleItemsNum > 0) {\n this._firstVisibleIndex = this.normalizeIndex(Math.floor(this._lastKnownScrollTop / this.itemHeight));\n this._lastVisibleIndex = this.normalizeIndex(this._firstVisibleIndex + this._visibleItemsNum);\n\n const firstRenderedIndex = this.normalizeIndex(this._firstVisibleIndex - 2);\n const lastRenderedIndex = this.normalizeIndex(this._lastVisibleIndex + 2);\n\n // May update value of this.items, which could trigger another render if not called from a lifecycle callback where it is ignored\n this.requestData(firstRenderedIndex, lastRenderedIndex);\n\n for (let i = firstRenderedIndex; i <= lastRenderedIndex; i++) {\n const physicalIndex = i - firstRenderedIndex;\n const itemData = this.items[physicalIndex];\n let dataHash;\n if (itemData) {\n dataHash = JSON.stringify(itemData);\n } else {\n dataHash = `placeholder-${physicalIndex}`;\n }\n this._itemsRenderData.push({\n index: i,\n top: this.itemHeight * i,\n physicalIndex,\n dataHash,\n data: itemData,\n });\n }\n } else {\n this._firstVisibleIndex = 0;\n this._lastVisibleIndex = 0;\n }\n }\n\n private normalizeIndex(index: number): number {\n return Math.max(0, Math.min(index, this.itemCount - 1));\n }\n\n private get height(): number {\n return this.offsetHeight;\n }\n\n private requestData(firstRenderedIndex: number, lastRenderedIndex: number): void {\n if (!Number.isNaN(firstRenderedIndex) && !Number.isNaN(lastRenderedIndex)) {\n this.dispatchEvent(\n new CustomEvent<IDataRequestEvent>(\"data-request\", {\n detail: {\n startIndex: firstRenderedIndex,\n stopIndex: lastRenderedIndex,\n },\n }),\n );\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n let shouldPrevent = true;\n switch (event.key) {\n case \"Down\":\n case \"ArrowDown\":\n this.focusIndex = (this.focusIndex + 1) % this.itemCount;\n break;\n case \"Up\":\n case \"ArrowUp\":\n if (this.focusIndex > 0) {\n this.focusIndex--;\n } else if (this.finalSizeIsKnown) {\n this.focusIndex = this.itemCount - 1;\n }\n break;\n case \"Enter\":\n this.handleSelection(this.focusIndex, event.metaKey || event.ctrlKey);\n break;\n case \"End\":\n this.focusIndex = this.itemCount - 1;\n break;\n case \"PageDown\":\n this.focusIndex = this.normalizeIndex(this.focusIndex + this._visibleItemsNum - 1);\n break;\n case \"Home\":\n this.focusIndex = 0;\n break;\n case \"PageUp\":\n this.focusIndex = this.normalizeIndex(this.focusIndex - this._visibleItemsNum + 1);\n break;\n default:\n shouldPrevent = false;\n break;\n }\n if (shouldPrevent) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n private handleSelection(index: number, hasModifier: boolean): void {\n if (index < 0 || this.itemCount <= index) {\n return;\n }\n const element = this.getListItem(index);\n if (element.getAttribute(\"aria-disabled\") == \"true\" || element.hasAttribute(\"disabled\")) {\n return;\n }\n let hasBeenSelected = true;\n if (this.selectionType !== SelectionType.TriggerOnly) {\n const existingIndex = this.selectedIndices.indexOf(index);\n hasBeenSelected = existingIndex == -1;\n if (hasBeenSelected) {\n if (this.selectionType === SelectionType.Single) {\n this.selectedIndices = [index];\n } else {\n this.selectedIndices.push(index);\n }\n } else {\n this.selectedIndices.splice(existingIndex, 1);\n }\n this.requestUpdate(\"selectedIndices\"); // altering inside of an array does not retrigger an update\n }\n this.focusIndex = index;\n this.dispatchSelectionEvent(index, hasBeenSelected, hasModifier);\n }\n\n private dispatchSelectionEvent(index: number, selected: boolean, hasModifier: boolean): void {\n this.dispatchEvent(\n new CustomEvent<ISelectionEvent>(\"selection\", {\n detail: { index, selected, hasModifier },\n }),\n );\n }\n\n private handleClick(event: MouseEvent): void {\n const clickedElement = event\n .composedPath()\n .find((target: HTMLElement) => target.hasAttribute && target.hasAttribute(\"item-index\")) as HTMLElement;\n if (clickedElement) {\n const index = parseInt(clickedElement.getAttribute(\"item-index\"));\n if (Number.isInteger(index)) {\n if (event.button == 0 || event.button == 1) {\n const hasModifier =\n (event.type == \"auxclick\" && event.button == 1) || event.metaKey || event.ctrlKey;\n this.handleSelection(index, hasModifier);\n }\n this.focusIndex = index;\n }\n }\n }\n}\n\nVirtualList.ensureDefined();\n"],"names":["ListUtil","index","alignment","scrollOffset","itemHeight","height","itemCount","lastItemOffset","maxOffset","minOffset","middleOffset","func","timer","args","ListUtil$1","ListDataProvider","pageSize","preloadedItemsCount","event","startIndex","stopIndex","value","count","items","list","SelectionType","idCounter","_VirtualList","_a","LitElement","generator","delta","shouldPrevent","oldValue","selectedIndices","_changedProperties","focusedElement","css","unsafeCSS","style","html","observer","remainingWidth","missingWidths","item","ListItem","missingWidthForTexts","additionalWidth","unusedItems","renderedItems","newItemsFragment","renderData","itemElement","unusedItemElement","dataHash","top","data","element","selected","firstRenderedIndex","lastRenderedIndex","physicalIndex","itemData","hasModifier","hasBeenSelected","existingIndex","clickedElement","target","__decorateClass","property","VirtualList"],"mappings":";;;AAeA,MAAMA,EAA8B;AAAA,EACzB,8BACHC,GACAC,GACAC,GACAC,GACAC,GACAC,GACM;AACN,UAAMC,IAAiB,KAAK,IAAI,GAAGD,IAAYF,CAAU,GACnDI,IAAY,KAAK,IAAID,GAAgBN,IAAQG,CAAU,GACvDK,IAAY,KAAK,IAAI,GAAGR,IAAQG,IAAaC,IAASD,CAAU;AAEtE,YAAQF,GAAA;AAAA,MACJ,KAAK;AACD,eAAOM;AAAA,MACX,KAAK;AACD,eAAOC;AAAA,MACX,KAAK,UAAU;AACX,cAAMC,IAAe,KAAK,MAAMD,KAAaD,IAAYC,KAAa,CAAC;AACvE,eAAIC,IAAe,KAAK,KAAKL,IAAS,CAAC,IAC5B,IACAK,IAAeH,IAAiB,KAAK,MAAMF,IAAS,CAAC,IACrDE,IAEAG;AAAA,MAEf;AAAA,MACA,KAAK;AAAA,MACL;AACI,eAAIP,KAAgBM,KAAaN,KAAgBK,IACtCL,IACAA,IAAeM,IACfA,IAEAD;AAAA,IACX;AAAA,EAEZ;AAAA;AAAA,EAGO,SAASG,GAA4D;AACxE,QAAIC;AACJ,WAAO,IAAIC,MAAoB;AAC3B,MAAID,KACA,OAAO,qBAAqBA,CAAK,GAErCA,IAAQ,OAAO,sBAAsB,MAAM;AACvC,QAAAD,EAAK,GAAGE,CAAI,GACZD,IAAQ;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;AAEA,MAAAE,IAAe,IAAId,EAAA;ACpEZ,MAAMe,EAAiB;AAAA,EAY1B,YACWC,IAAmB,KACnBC,IAA8B,GACvC;AAFS,SAAA,WAAAD,GACA,KAAA,sBAAAC,GAXX,KAAQ,oBAAoB,IAC5B,KAAQ,aAAwB,CAAA,GAChC,KAAQ,2BAA2B,GACnC,KAAQ,0BAA0B,GAClC,KAAQ,mBAAmB,GAqF3B,KAAQ,wBAAwB,CAACC,MAAuB;AACpD,YAAM,EAAE,YAAAC,GAAY,WAAAC,EAAA,IAAcF,EAAM;AACxC,WAAK,2BAA2BC,GAChC,KAAK,0BAA0BC,GAC/B,KAAK,MAAM,QAAQ,KAAK,WAAW,MAAMD,GAAYC,IAAY,CAAC,GAE9D,CAAC,KAAK,oBAAoB,KAAK,mBAAmBA,IAAY,KAAK,uBACnE,KAAK,YAAA;AAAA,IAEb,GArFI,KAAK,YAAYJ;AAAA,EACrB;AAAA,EAEA,IAAW,cAAsB;AAC7B,WAAI,KAAK,MAAM,UAAU,KAAK,KAAK,mBACxB,IAMJ,KAAK,OAAO,KAAK,MAAM,SAAS,KAAK,KAAK,QAAQ;AAAA,EAC7D;AAAA,EAEA,IAAW,mBAA4B;AACnC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,iBAAiBK,GAAgB;AACxC,SAAK,oBAAoBA,GACrBA,MACA,KAAK,YAAY,KAAK,WAAW,SAEjC,KAAK,UACL,KAAK,MAAM,mBAAmBA;AAAA,EAEtC;AAAA,EAEA,IAAY,YAAoB;AAC5B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAY,UAAUC,GAAe;AACjC,SAAK,aAAaA,GACd,KAAK,UACL,KAAK,MAAM,YAAYA;AAAA,EAE/B;AAAA,EAEA,IAAW,QAAmB;AAC1B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,MAAMC,GAAkB;AAC/B,SAAK,aAAaA,GAClB,KAAK,cAAA;AAAA,EACT;AAAA,EAEO,SAASA,GAAwB;AACpC,SAAK,aAAa,KAAK,WAAW,OAAOA,CAAK,GAC9C,KAAK,cAAA;AAAA,EACT;AAAA,EAEO,YAAYC,GAAyB;AACxC,IAAI,KAAK,SACL,KAAK,MAAM,oBAAoB,gBAAgB,KAAK,qBAAqB,GAE7E,KAAK,QAAQA,GACbA,EAAK,YAAY,KAAK,WACtBA,EAAK,iBAAiB,gBAAgB,KAAK,qBAAqB,GAChEA,EAAK,mBAAmB,KAAK;AAAA,EACjC;AAAA,EAEQ,gBAAsB;AAC1B,SAAK,sBAAsB,IAC3B,KAAK,mBAAmB,KAAK,WAAW,SAAS,GAC7C,KAAK,mBACL,KAAK,YAAY,KAAK,WAAW,SAC1B,KAAK,mBAAmB,KAAK,cACpC,KAAK,YAAY,KAAK,mBAEtB,KAAK,UACL,KAAK,MAAM,QAAQ,KAAK,WAAW,MAAM,KAAK,0BAA0B,KAAK,0BAA0B,CAAC;AAAA,EAEhH;AAAA,EAaQ,cAAoB;AACxB,QAAI,MAAK;AAGT,UAAI,KAAK;AACL,aAAK,sBAAsB,IAC3B,KAAK,cAAc,KAAK,cAAc,CAAC,GACvC,KAAK,oBAAoB,KAAK,WAAW,GACrC,KAAK,mBAAmB,KAAK,cAC7B,KAAK,YAAY,KAAK;AAAA;AAG1B,cAAM;AAAA,UACF,qFACI,KAAK,2BACL,UACA,KAAK,0BACL;AAAA,QAAA;AAAA,EAGhB;AACJ;;;;;;GC/GYC,sBAAAA,OACRA,EAAA,cAAc,gBACdA,EAAA,SAAS,UACTA,EAAA,QAAQ,SAHAA,IAAAA,KAAA,CAAA,CAAA;AAcZ,IAAIC,IAAY;;AA0ChB,MAAqBC,KAArBC,IAAA,cAAyCC,EAAW;AAAA,EA6GhD,cAAc;AACV,UAAA,GAhGJ,KAAO,QAAmB,CAAA,GAE1B,KAAO,gBAA+B,gBAEtC,KAAO,KAAaD,EAAY,KAAK,MAAMF,KAI3C,KAAO,OAAO,WAEd,KAAO,gBAA+BI,GAGtC,KAAQ,sBAAsB,GAC9B,KAAQ,yBAAyB,GAEjC,KAAQ,mBAAqC,CAAA,GAC7C,KAAQ,oCAA8C,IAAA,GAItD,KAAQ,mBAAmB,GAE3B,KAAQ,mBAA6B,CAAA,GACrC,KAAQ,cAAc,IAEtB,KAAQ,mBAAmB,GA6S3B,KAAQ,WAAW,MAAM;AACrB,WAAK,sBAAsB,KAAK;AAChC,YAAMC,IAAQ,KAAK,yBAAyB,KAAK;AACjD,MAAI,KAAK,IAAIA,CAAK,KAAK,KAAK,eACxB,KAAK,yBAAyB,KAAK,qBACnC,KAAK,cAAA;AAAA,IAEb,GA+EA,KAAQ,gBAAgB,CAACb,MAAyB;AAC9C,UAAIc,IAAgB;AACpB,cAAQd,EAAM,KAAA;AAAA,QACV,KAAK;AAAA,QACL,KAAK;AACD,eAAK,cAAc,KAAK,aAAa,KAAK,KAAK;AAC/C;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AACD,UAAI,KAAK,aAAa,IAClB,KAAK,eACE,KAAK,qBACZ,KAAK,aAAa,KAAK,YAAY;AAEvC;AAAA,QACJ,KAAK;AACD,eAAK,gBAAgB,KAAK,YAAYA,EAAM,WAAWA,EAAM,OAAO;AACpE;AAAA,QACJ,KAAK;AACD,eAAK,aAAa,KAAK,YAAY;AACnC;AAAA,QACJ,KAAK;AACD,eAAK,aAAa,KAAK,eAAe,KAAK,aAAa,KAAK,mBAAmB,CAAC;AACjF;AAAA,QACJ,KAAK;AACD,eAAK,aAAa;AAClB;AAAA,QACJ,KAAK;AACD,eAAK,aAAa,KAAK,eAAe,KAAK,aAAa,KAAK,mBAAmB,CAAC;AACjF;AAAA,QACJ;AACI,UAAAc,IAAgB;AAChB;AAAA,MAAA;AAER,MAAIA,MACAd,EAAM,eAAA,GACNA,EAAM,gBAAA;AAAA,IAEd,GAlWI,KAAK,kBAAkB,IAAI,eAAe,MAAM;AAC5C,MAAI,KAAK,qBAAqB,KAAK,iBAC/B,KAAK,mBAAmB,KAAK,cAC7B,KAAK,cAAA;AAAA,IAEb,CAAC;AAAA,EACL;AAAA,EAzEA,IAAW,cAAuB;AAC9B,WAAO,KAAK,aAAa,cAAc;AAAA,EAC3C;AAAA,EAEA,IAAW,YAAYG,GAAgB;AACnC,SAAK,gBAAgB,gBAAgBA,CAAK;AAAA,EAC9C;AAAA,EAGA,IAAW,aAAqB;AAC5B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,WAAWpB,GAAe;AACjC,QAAIA,KAAS,MAAMA,IAAQ,KAAK,WAAW;AACvC,YAAMgC,IAAW,KAAK;AACtB,WAAK,cAAchC,IACfA,KAAS,KAAK,sBAAsB,KAAK,qBAAqBA,MAC9D,KAAK,aAAaA,CAAK,GAEvBgC,KAAYhC,MACRA,KAAS,MACT,KAAK,gBAAgB,uBAAuB,GAEhD,KAAK,cAAc,cAAcgC,CAAQ;AAAA,IAEjD;AAAA,EACJ;AAAA,EAGA,IAAW,kBAA4B;AACnC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,gBAAgBC,GAA2B;AAClD,IAAIA,IAEA,KAAK,mBAAmBA,EAAgB,IAAI,CAACjC,MAAU,OAAOA,CAAK,CAAC,IAEpE,KAAK,mBAAmB,CAAA,GAE5B,KAAK,cAAc,iBAAiB;AAAA,EACxC;AAAA,EAEO,aAAaA,GAAeC,IAA+B,QAAc;AAC5E,SAAK,YAAYF,EAAS;AAAA,MACtB,KAAK,eAAeC,CAAK;AAAA,MACzBC;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA,GAIT,KAAK,sBAAsB,KAAK;AAAA,EACpC;AAAA,EAEO,YAAYD,GAA4B;AAC3C,WAAI,CAAC,KAAK,cAAcA,IAAQ,KAAK,sBAAsB,KAAK,oBAAoBA,IACzE,OAEJ,KAAK,cAAc,gBAAgBA,CAAK,IAAI;AAAA,EACvD;AAAA,EAYO,oBAA0B;AAC7B,UAAM,kBAAA,GAEN,KAAK,gBAAgB,QAAQ,IAAI,GAI7B,KAAK,cAAc,KAAK,wBACxB,KAAK,YAAY,KAAK,qBACtB,KAAK,cAAA;AAAA,EAEb;AAAA,EAEO,uBAA6B;AAChC,UAAM,qBAAA,GACN,KAAK,gBAAgB,WAAA;AAAA,EACzB;AAAA,EAEO,aAAakC,GAA0C;AAC1D,UAAM,aAAaA,CAAkB,GAErC,KAAK,iBAAiB,UAAU,KAAK,QAAQ,GAC7C,KAAK,iBAAiB,WAAW,KAAK,aAAa,GACnD,KAAK,iBAAiB,SAAS,KAAK,WAAW,GAC/C,KAAK,iBAAiB,aAAa,CAACjB,MAAU;AAC1C,MAAIA,EAAM,UAAU,KAChBA,EAAM,eAAA;AAAA,IAEd,CAAC,GACD,KAAK,iBAAiB,YAAY,KAAK,WAAW,GAClD,KAAK,iBAAiB,SAAS,MAAM;AACjC,MAAI,KAAK,QAAQ,gBAAgB,MACzB,KAAK,cAAc,MACf,KAAK,oBACL,KAAK,aAAa,KAAK,gBAAgB,CAAC,IAExC,KAAK,cAAc,MAAM,KAAK,YAAY,MAC1C,KAAK,aAAa,MAGtB,KAAK,4BAAA;AAAA,IAGjB,CAAC,GACD,KAAK,iBAAiB,QAAQ,MAAM;AAChC,MAAI,KAAK,cAAc,MACnB,KAAK,4BAAA;AAAA,IAEb,CAAC,GACG,KAAK,gBAAgB,SAAS,KAC9B,KAAK,aAAa,KAAK,gBAAgB,CAAC,GAAG,QAAQ;AAAA,EAE3D;AAAA,EAEQ,8BAA8B;AAClC,UAAMkB,IAAiB,KAAK,YAAY,KAAK,UAAU;AACvD,IAAIA,MACI,KAAK,eAAe,SAAS,iBAAiB,QAC9CA,EAAe,aAAa,WAAW,EAAE,GACzC,KAAK,aAAa,yBAAyBA,EAAe,EAAE,MAE5DA,EAAe,gBAAgB,SAAS,GACxC,KAAK,gBAAgB,uBAAuB;AAAA,EAGxD;AAAA,EAEA,WAAW,SAAS;AAChB,WAAO;AAAA,MACHC;AAAA,kBACMC,EAAUC,CAAK,CAAC;AAAA;AAAA,IAAA;AAAA,EAG9B;AAAA,EACO,SAAyB;AAC5B,gBAAK,sBAAA,GACEC;AAAA,oDACqC,KAAK,YAAY,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA,EAIhF;AAAA,EAEO,QAAQL,GAA0C;AAKrD,QAJA,MAAM,QAAQA,CAAkB,GAChC,KAAK,yBAAyB,KAAK,qBACnC,KAAK,YAAA,IAGA,KAAK,sCAAsC,KAAK;AAAA,IACjD,KAAK,qBAAqB,KAAK;AAE/B,UAAK,KAAK,cAAc,cAAc;AAQlC,aAAK,oBAAA;AAAA,WARgC;AAErC,cAAMM,IAAW,IAAI,iBAAiB,MAAM;AACxC,eAAK,oBAAA,GACLA,EAAS,WAAA;AAAA,QACb,CAAC;AACD,QAAAA,EAAS,QAAQ,IAAI;AAAA,MACzB;AAAA,EAIR;AAAA,EAEQ,sBAAsB;AAC1B,IAAI,KAAK,sCACL,KAAK,qCAAqC,IAC1C,OAAO,sBAAsB,MAAM;AAC/B,YAAMC,IAAiB,OAAO,SAAS,iBAAiB,IAAI,EAAE,QAAQ,IAAI,KAAK;AAC/E,UAAIA,KAAkB;AAClB,aAAK,mBAAmB,IACxB,KAAK,+BAAA;AAAA,WACF;AACH,aAAK,mBAAmB;AACxB,cAAMC,IAAgB,CAAC,GAAG,KAAK,iBAAiB,cAAc,CAAC,EAAE,IAAI,CAACC,MAAS;AAC3E,cAAIA,aAAgBC,GAAU;AAC1B,YAAAD,EAAK,kBAAkB;AACvB,kBAAME,IAAuBF,EAAK;AAClC,mBAAIE,IAAuBJ,MACvBE,EAAK,kBAAkB,KAEpBE;AAAA,UACX;AAAA,QACJ,CAAC,GACKC,IAAkB,KAAK,IAAI,GAAGJ,CAAa;AACjD,QAAII,IAAkB,MAClB,KAAK,MAAM,QAAQ,GAAG,KAAK,cAAcA,CAAe;AAAA,MAEhE;AAAA,IACJ,CAAC,KACM,KAAK,oBACZ,KAAK,+BAAA;AAAA,EAEb;AAAA,EAEQ,iCAAiC;AACrC,SAAK,iBAAiB,cAAc,EAAE,QAAQ,CAACH,MAAS;AACpD,MAAIA,aAAgBC,MAChBD,EAAK,kBAAkBA,EAAK,mBAAmBA,EAAK,uBAAuB;AAAA,IAEnF,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,oCAA0C;AAC7C,SAAK,qCAAqC;AAAA,EAC9C;AAAA,EAEQ,cAAc;AAClB,UAAMI,IAAyB,CAAC,GAAG,KAAK,iBAAiB,cAAc,CAAC,GAClEC,wBAA8C,IAAA,GAE9CC,IAAmB,SAAS,uBAAA;AAClC,eAAWC,KAAc,KAAK,kBAAkB;AAC5C,YAAMC,IAAc,KAAK,WAAWD,CAAU;AAC9C,MAAKC,EAAY,iBACbF,EAAiB,YAAYE,CAAW,GAE5CH,EAAc,IAAIE,EAAW,UAAUC,CAAW;AAClD,YAAMnD,IAAQ+C,EAAY,QAAQI,CAAW;AAC7C,MAAInD,MAAU,MACV+C,EAAY,OAAO/C,GAAO,CAAC;AAAA,IAEnC;AACA,SAAK,YAAYiD,CAAgB;AAEjC,eAAWG,KAAqBL;AAC5B,MAAIK,aAA6BR,MAC7BQ,EAAkB,kBAAkB,KAExC,KAAK,YAAYA,CAAiB;AAGtC,IAAAJ,EAAc,QAAQ,CAACG,GAAaE,MAAa;AAC7C,WAAK,cAAc,IAAIA,GAAUF,CAAW;AAAA,IAChD,CAAC;AAAA,EACL;AAAA,EAEQ,WAAW,EAAE,OAAAnD,GAAO,KAAAsD,GAAK,UAAAD,GAAU,MAAAE,KAAqC;AAC5E,QAAIC;AACJ,WAAID,IACI,KAAK,cAAc,IAAIF,CAAQ,KAC/BG,IAAU,KAAK,cAAc,IAAIH,CAAQ,GACzC,KAAK,cAAc,OAAOA,CAAQ,MAElCG,IAAU,KAAK,cAAcD,GAAMvD,CAAK,GACxCwD,EAAQ,aAAa,QAAQ,OAAO,MAIxCA,IAAU,SAAS,cAAc,KAAK,GACtCA,EAAQ,aAAa,oBAAoB,EAAE,GAC3CA,EAAQ,aAAa,QAAQ,OAAO,IAExC,OAAO,OAAOA,EAAQ,OAAO;AAAA,MACzB,WAAW,cAAcF,CAAG;AAAA,MAC5B,QAAQ,GAAG,KAAK,UAAU;AAAA,IAAA,CAC7B,GACDE,EAAQ,aAAa,cAAcxD,EAAM,SAAA,CAAU,GACnDwD,EAAQ,aAAa,gBAAgB,OAAO,KAAK,mBAAmB,KAAK,YAAY,EAAE,CAAC,GACxFA,EAAQ,aAAa,iBAAiB,OAAOxD,IAAQ,CAAC,CAAC,IACnD,CAACwD,EAAQ,MAAMA,EAAQ,GAAG,WAAW,KAAK,KAAK,QAAQ,OACvDA,EAAQ,KAAK,KAAK,KAAK,WAAWxD,IAElC,KAAK,YAAY,KAAKA,IACtBwD,EAAQ,aAAa,QAAQ,EAAE,IAE/BA,EAAQ,gBAAgB,MAAM,GAGlC,KAAK,wBAAwBxD,GAAOwD,CAAO,GAC3C,KAAK,uBAAuBxD,GAAOwD,CAAO,GAEnCA;AAAA,EACX;AAAA,EAWQ,uBAAuBxD,GAAemD,GAA0B;AACpE,IAAI,KAAK,cAAcnD,MAAU,KAAK,eAAe,SAAS,iBAAiB,SAC3EmD,EAAY,aAAa,WAAW,EAAE,GACtC,KAAK,aAAa,yBAAyBA,EAAY,EAAE,KAEzDA,EAAY,gBAAgB,SAAS;AAAA,EAE7C;AAAA,EAEQ,wBAAwBnD,GAAemD,GAA0B;AACrE,UAAMM,IAAW,KAAK,gBAAgB,QAAQzD,CAAK,MAAM;AACzD,IAAIyD,IACAN,EAAY,aAAa,YAAY,EAAE,IAEvCA,EAAY,gBAAgB,UAAU,GAE1CA,EAAY,aAAa,iBAAiB,OAAOM,CAAQ,CAAC;AAAA,EAC9D;AAAA,EAEQ,wBAA8B;AAIlC,QAHA,KAAK,mBAAmB,CAAA,GACxB,KAAK,mBAAmB,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK,UAAU,GAAG,KAAK,SAAS,GAErF,KAAK,mBAAmB,GAAG;AAC3B,WAAK,qBAAqB,KAAK,eAAe,KAAK,MAAM,KAAK,sBAAsB,KAAK,UAAU,CAAC,GACpG,KAAK,oBAAoB,KAAK,eAAe,KAAK,qBAAqB,KAAK,gBAAgB;AAE5F,YAAMC,IAAqB,KAAK,eAAe,KAAK,qBAAqB,CAAC,GACpEC,IAAoB,KAAK,eAAe,KAAK,oBAAoB,CAAC;AAGxE,WAAK,YAAYD,GAAoBC,CAAiB;AAEtD,eAAS,IAAID,GAAoB,KAAKC,GAAmB,KAAK;AAC1D,cAAMC,IAAgB,IAAIF,GACpBG,IAAW,KAAK,MAAMD,CAAa;AACzC,YAAIP;AACJ,QAAIQ,IACAR,IAAW,KAAK,UAAUQ,CAAQ,IAElCR,IAAW,eAAeO,CAAa,IAE3C,KAAK,iBAAiB,KAAK;AAAA,UACvB,OAAO;AAAA,UACP,KAAK,KAAK,aAAa;AAAA,UACvB,eAAAA;AAAA,UACA,UAAAP;AAAA,UACA,MAAMQ;AAAA,QAAA,CACT;AAAA,MACL;AAAA,IACJ;AACI,WAAK,qBAAqB,GAC1B,KAAK,oBAAoB;AAAA,EAEjC;AAAA,EAEQ,eAAe7D,GAAuB;AAC1C,WAAO,KAAK,IAAI,GAAG,KAAK,IAAIA,GAAO,KAAK,YAAY,CAAC,CAAC;AAAA,EAC1D;AAAA,EAEA,IAAY,SAAiB;AACzB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,YAAY0D,GAA4BC,GAAiC;AAC7E,IAAI,CAAC,OAAO,MAAMD,CAAkB,KAAK,CAAC,OAAO,MAAMC,CAAiB,KACpE,KAAK;AAAA,MACD,IAAI,YAA+B,gBAAgB;AAAA,QAC/C,QAAQ;AAAA,UACJ,YAAYD;AAAA,UACZ,WAAWC;AAAA,QAAA;AAAA,MACf,CACH;AAAA,IAAA;AAAA,EAGb;AAAA,EA0CQ,gBAAgB3D,GAAe8D,GAA4B;AAC/D,QAAI9D,IAAQ,KAAK,KAAK,aAAaA;AAC/B;AAEJ,UAAMwD,IAAU,KAAK,YAAYxD,CAAK;AACtC,QAAIwD,EAAQ,aAAa,eAAe,KAAK,UAAUA,EAAQ,aAAa,UAAU;AAClF;AAEJ,QAAIO,IAAkB;AACtB,QAAI,KAAK,kBAAkB,gBAA2B;AAClD,YAAMC,IAAgB,KAAK,gBAAgB,QAAQhE,CAAK;AACxD,MAAA+D,IAAkBC,KAAiB,IAC/BD,IACI,KAAK,kBAAkB,WACvB,KAAK,kBAAkB,CAAC/D,CAAK,IAE7B,KAAK,gBAAgB,KAAKA,CAAK,IAGnC,KAAK,gBAAgB,OAAOgE,GAAe,CAAC,GAEhD,KAAK,cAAc,iBAAiB;AAAA,IACxC;AACA,SAAK,aAAahE,GAClB,KAAK,uBAAuBA,GAAO+D,GAAiBD,CAAW;AAAA,EACnE;AAAA,EAEQ,uBAAuB9D,GAAeyD,GAAmBK,GAA4B;AACzF,SAAK;AAAA,MACD,IAAI,YAA6B,aAAa;AAAA,QAC1C,QAAQ,EAAE,OAAA9D,GAAO,UAAAyD,GAAU,aAAAK,EAAA;AAAA,MAAY,CAC1C;AAAA,IAAA;AAAA,EAET;AAAA,EAEQ,YAAY7C,GAAyB;AACzC,UAAMgD,IAAiBhD,EAClB,aAAA,EACA,KAAK,CAACiD,MAAwBA,EAAO,gBAAgBA,EAAO,aAAa,YAAY,CAAC;AAC3F,QAAID,GAAgB;AAChB,YAAMjE,IAAQ,SAASiE,EAAe,aAAa,YAAY,CAAC;AAChE,UAAI,OAAO,UAAUjE,CAAK,GAAG;AACzB,YAAIiB,EAAM,UAAU,KAAKA,EAAM,UAAU,GAAG;AACxC,gBAAM6C,IACD7C,EAAM,QAAQ,cAAcA,EAAM,UAAU,KAAMA,EAAM,WAAWA,EAAM;AAC9E,eAAK,gBAAgBjB,GAAO8D,CAAW;AAAA,QAC3C;AACA,aAAK,aAAa9D;AAAA,MACtB;AAAA,IACJ;AAAA,EACJ;AACJ,GArgBI2B,EAAuB,KAAK,mBAC5BA,EAAc,gBAAgB,MAAY;AACtC,EAAAiB,EAAS,cAAA,GACJ,eAAe,IAAIjB,EAAY,EAAE,KAClC,eAAe,OAAOA,EAAY,IAAIA,CAAW;AAEzD,GAPJA;AAUWwC,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,QAAQ,WAAW,eAAe,SAAS,IAAM;AAAA,GATlD1C,EAUV,WAAA,cAAA,CAAA;AAEAyC,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAXT1C,EAYV,WAAA,aAAA,CAAA;AAEAyC,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,OAAO,WAAW,IAAO;AAAA,GAb1B1C,EAcV,WAAA,SAAA,CAAA;AAEAyC,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,QAAQ,WAAW,kBAAkB,SAAS,IAAM,YAAY,GAAA,CAAM;AAAA,GAfvE1C,EAgBV,WAAA,iBAAA,CAAA;AAEAyC,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,QAAQ,WAAW,IAAM,SAAS,IAAM;AAAA,GAjBzC1C,EAkBV,WAAA,MAAA,CAAA;AAIAyC,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GArBxB1C,EAsBV,WAAA,QAAA,CAAA;AA+BIyC,EAAA;AAAA,EADVC,EAAS,EAAE,MAAM,QAAQ,WAAW,eAAe,SAAS,IAAM;AAAA,GApDlD1C,EAqDN,WAAA,cAAA,CAAA;AAqBAyC,EAAA;AAAA,EADVC,EAAS,EAAE,MAAM,OAAO,WAAW,IAAO;AAAA,GAzE1B1C,EA0EN,WAAA,mBAAA,CAAA;AA1Ef,IAAqB2C,IAArB3C;AAwgBA2C,EAAY,cAAA;"}
1
+ {"version":3,"file":"virtual-list.mjs","sources":["../list-util.ts","../data-provider.ts","../virtual-list.ts"],"sourcesContent":["export type ScrollToAlignment = \"auto\" | \"center\" | \"start\" | \"end\";\n\nexport interface IListUtil {\n getOffsetForIndexAndAlignment(\n index: number,\n alignment: ScrollToAlignment,\n scrollOffset: number,\n itemHeight: number,\n height: number,\n itemCount: number,\n ): number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n debounce(func: (...args: any) => void): () => void;\n}\n\nclass ListUtil implements IListUtil {\n public getOffsetForIndexAndAlignment(\n index: number,\n alignment: ScrollToAlignment,\n scrollOffset: number,\n itemHeight: number,\n height: number,\n itemCount: number,\n ): number {\n const lastItemOffset = Math.max(0, itemCount * itemHeight);\n const maxOffset = Math.min(lastItemOffset, index * itemHeight);\n const minOffset = Math.max(0, index * itemHeight - height + itemHeight);\n\n switch (alignment) {\n case \"start\":\n return maxOffset;\n case \"end\":\n return minOffset;\n case \"center\": {\n const middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2);\n if (middleOffset < Math.ceil(height / 2)) {\n return 0;\n } else if (middleOffset > lastItemOffset + Math.floor(height / 2)) {\n return lastItemOffset;\n } else {\n return middleOffset;\n }\n }\n case \"auto\":\n default:\n if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {\n return scrollOffset;\n } else if (scrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public debounce(func: (...args: any) => void): (...args: unknown[]) => void {\n let timer: number;\n return (...args: unknown[]) => {\n if (timer) {\n window.cancelAnimationFrame(timer);\n }\n timer = window.requestAnimationFrame(() => {\n func(...args);\n timer = null;\n });\n };\n }\n}\n\nexport default new ListUtil();\n","import VirtualList from \"./virtual-list\";\n\nexport class ListDataProvider {\n public onDataRequest: (page: number) => void;\n\n private _finalSizeIsKnown = false;\n private _itemCache: unknown[] = [];\n private _lastRequestedFirstIndex = 0;\n private _lastRequestedLastIndex = 0;\n private _lastLoadedIndex = 0;\n private _list: VirtualList;\n private _itemCount: number;\n private _pendingDataRequest: boolean;\n\n constructor(\n public pageSize: number = 100,\n public preloadedItemsCount: number = 5,\n ) {\n this.itemCount = pageSize; // configure initial load\n }\n\n public get currentPage(): number {\n if (this.items.length == 0 && this.finalSizeIsKnown) {\n return 0; // Otherwise empty cache means we haven't fetched anything\n }\n // With pageSize 100\n // 0 => -1\n // 1 100 => 0\n // 101 200 => 1\n return Math.floor((this.items.length - 1) / this.pageSize);\n }\n\n public get finalSizeIsKnown(): boolean {\n return this._finalSizeIsKnown;\n }\n\n public set finalSizeIsKnown(value: boolean) {\n this._finalSizeIsKnown = value;\n if (value) {\n this.itemCount = this._itemCache.length;\n }\n if (this._list) {\n this._list.finalSizeIsKnown = value;\n }\n }\n\n private get itemCount(): number {\n return this._itemCount;\n }\n\n private set itemCount(count: number) {\n this._itemCount = count;\n if (this._list) {\n this._list.itemCount = count;\n }\n }\n\n public get items(): unknown[] {\n return this._itemCache;\n }\n\n public set items(items: unknown[]) {\n this._itemCache = items;\n this.onItemsChange();\n }\n\n public addItems(items: unknown[]): void {\n this._itemCache = this._itemCache.concat(items);\n this.onItemsChange();\n }\n\n public connectList(list: VirtualList): void {\n if (this._list) {\n this._list.removeEventListener(\"data-request\", this.handleListDataRequest);\n }\n this._list = list;\n list.itemCount = this.itemCount;\n list.addEventListener(\"data-request\", this.handleListDataRequest);\n list.finalSizeIsKnown = this._finalSizeIsKnown;\n }\n\n private onItemsChange(): void {\n this._pendingDataRequest = false;\n this._lastLoadedIndex = this._itemCache.length - 1;\n if (this.finalSizeIsKnown) {\n this.itemCount = this._itemCache.length;\n } else if (this._lastLoadedIndex > this.itemCount) {\n this.itemCount = this._lastLoadedIndex;\n }\n if (this._list) {\n this._list.items = this._itemCache.slice(this._lastRequestedFirstIndex, this._lastRequestedLastIndex + 1);\n }\n }\n\n private handleListDataRequest = (event: CustomEvent) => {\n const { startIndex, stopIndex } = event.detail;\n this._lastRequestedFirstIndex = startIndex;\n this._lastRequestedLastIndex = stopIndex;\n this._list.items = this._itemCache.slice(startIndex, stopIndex + 1);\n\n if (!this.finalSizeIsKnown && this._lastLoadedIndex < stopIndex + this.preloadedItemsCount) {\n this.requestData();\n }\n };\n\n private requestData(): void {\n if (this._pendingDataRequest) {\n return;\n }\n if (this.onDataRequest) {\n this._pendingDataRequest = true;\n this.onDataRequest(this.currentPage + 1);\n this._lastLoadedIndex += this.pageSize - 1;\n if (this._lastLoadedIndex > this.itemCount) {\n this.itemCount = this._lastLoadedIndex;\n }\n } else {\n throw Error(\n \"The final size is not yet known and the list would require item data from index \" +\n this._lastRequestedFirstIndex +\n \". to \" +\n this._lastRequestedLastIndex +\n \". which is not possible to load without a configured onDataRequest\",\n );\n }\n }\n}\n","import { LitElement, TemplateResult, html, unsafeCSS, PropertyValues, css } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport ListUtil, { ScrollToAlignment } from \"./list-util\";\nimport ListItem, { generator } from \"@cas-smartdesign/list-item\";\nexport { ListDataProvider } from \"./data-provider\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [VirtualList.ID]: VirtualList;\n }\n}\n\nimport style from \"./style.scss?inline\";\n\nexport type ItemGenerator = (data: unknown, index: number) => HTMLElement;\nexport enum SelectionType {\n TriggerOnly = \"trigger-only\",\n Single = \"single\",\n Multi = \"multi\",\n}\n\ninterface ItemRenderData {\n index: number;\n top: number;\n physicalIndex: number;\n dataHash: string;\n data?: unknown;\n}\n\nlet idCounter = 0;\n\nexport interface IDataRequestEvent {\n startIndex: number;\n stopIndex: number;\n}\n\nexport interface ISelectionEvent {\n index: number;\n selected: boolean;\n originalEvent: Event;\n}\n\nexport interface CustomEventMap extends HTMLElementEventMap {\n \"data-request\": CustomEvent<IDataRequestEvent>;\n selection: CustomEvent<ISelectionEvent>;\n}\n\nexport default interface VirtualList {\n addEventListener<K extends keyof CustomEventMap>(\n event: K,\n listener: ((this: this, ev: CustomEventMap[K]) => unknown) | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n addEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n removeEventListener<K extends keyof CustomEventMap>(\n type: K,\n listener: (this: this, ev: CustomEventMap[K]) => unknown,\n options?: boolean | EventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ): void;\n dispatchEvent<EventType extends CustomEventMap[keyof CustomEventMap]>(event: EventType): boolean;\n}\n\nexport default class VirtualList extends LitElement {\n public static readonly ID = \"sd-virtual-list\";\n public static ensureDefined = (): void => {\n ListItem.ensureDefined();\n if (!customElements.get(VirtualList.ID)) {\n customElements.define(VirtualList.ID, VirtualList);\n }\n };\n\n @property({ type: Number, attribute: \"item-height\", reflect: true })\n public itemHeight: number;\n @property({ type: Number })\n public itemCount: number;\n @property({ type: Array, attribute: false })\n public items: unknown[] = [];\n @property({ type: String, attribute: \"selection-type\", reflect: true, noAccessor: true })\n public selectionType: SelectionType = SelectionType.TriggerOnly;\n @property({ type: String, attribute: true, reflect: true })\n public id: string = VirtualList.ID + \"_\" + idCounter++;\n\n // aria attributes\n @property({ type: String, reflect: true })\n public role = \"listbox\";\n\n public itemGenerator: ItemGenerator = generator;\n public finalSizeIsKnown: boolean;\n\n private _lastKnownScrollTop = 0;\n private _lastRenderedScrollTop = 0;\n\n private _itemsRenderData: ItemRenderData[] = [];\n private _elementCache: Map<string, HTMLElement> = new Map();\n\n private _firstVisibleIndex: number;\n private _lastVisibleIndex: number;\n private _visibleItemsNum = 0;\n\n private _selectedIndices: number[] = [];\n private _focusIndex = -1;\n private _resizeObserver: ResizeObserver;\n private _lastKnownHeight = 0;\n private _increaseWidthOnNextRenderIfNeeded: boolean;\n private _reachedMaxWidth: boolean;\n\n public get focusTarget(): boolean {\n return this.hasAttribute(\"focus-target\");\n }\n\n public set focusTarget(value: boolean) {\n this.toggleAttribute(\"focus-target\", value);\n }\n\n @property({ type: Number, attribute: \"focus-index\", reflect: true })\n public get focusIndex(): number {\n return this._focusIndex;\n }\n\n public set focusIndex(index: number) {\n if (index >= -1 && index < this.itemCount) {\n const oldValue = this._focusIndex;\n this._focusIndex = index;\n if (index <= this._firstVisibleIndex || this._lastVisibleIndex <= index) {\n this.scrollToItem(index);\n }\n if (oldValue != index) {\n if (index == -1) {\n this.removeAttribute(\"aria-activedescendant\");\n }\n this.requestUpdate(\"focusIndex\", oldValue);\n }\n }\n }\n\n @property({ type: Array, attribute: false })\n public get selectedIndices(): number[] {\n return this._selectedIndices;\n }\n\n public set selectedIndices(selectedIndices: number[]) {\n if (selectedIndices) {\n // Parse to primitive numbers as the virtual-list uses numbers and not objects for the indexOf(item-index) checks.\n this._selectedIndices = selectedIndices.map((index) => Number(index));\n } else {\n this._selectedIndices = [];\n }\n this.requestUpdate(\"selectedIndices\");\n }\n\n public scrollToItem(index: number, alignment: ScrollToAlignment = \"auto\"): void {\n this.scrollTop = ListUtil.getOffsetForIndexAndAlignment(\n this.normalizeIndex(index),\n alignment,\n this.scrollTop,\n this.itemHeight,\n this.height,\n this.itemCount,\n );\n // The render might have already been scheduled, but the onScroll event is dispatched later.\n // We need to update the _lastKnownScrollTop manually to ensure an up-to-date value is used even for the next render.\n this._lastKnownScrollTop = this.scrollTop;\n }\n\n public getListItem(index: number): HTMLElement {\n if (!this.shadowRoot || index < this._firstVisibleIndex || this._lastVisibleIndex < index) {\n return null;\n }\n return this.querySelector(`[item-index=\"${index}\"]`);\n }\n\n constructor() {\n super();\n this._resizeObserver = new ResizeObserver(() => {\n if (this._lastKnownHeight !== this.offsetHeight) {\n this._lastKnownHeight = this.offsetHeight;\n this.requestUpdate();\n }\n });\n }\n\n public connectedCallback(): void {\n super.connectedCallback();\n\n this._resizeObserver.observe(this);\n // these are needed because when reattaching the list to the DOM\n // then the scroll position is reset but no scroll event is called\n // so the list shows the items at incorrect position\n if (this.scrollTop !== this._lastKnownScrollTop) {\n this.scrollTop = this._lastKnownScrollTop;\n this.requestUpdate();\n }\n }\n\n public disconnectedCallback(): void {\n super.disconnectedCallback();\n this._resizeObserver.disconnect();\n }\n\n public firstUpdated(_changedProperties: PropertyValues): void {\n super.firstUpdated(_changedProperties);\n\n this.addEventListener(\"scroll\", this.onScroll);\n this.addEventListener(\"keydown\", this.handleKeyDown);\n this.addEventListener(\"click\", this.handleClick);\n this.addEventListener(\"mousedown\", (event) => {\n if (event.button == 1) {\n event.preventDefault();\n }\n });\n this.addEventListener(\"auxclick\", this.handleClick);\n this.addEventListener(\"focus\", () => {\n if (this.matches(\":focus-visible\")) {\n if (this.focusIndex == -1) {\n if (this.selectedIndices) {\n this.focusIndex = this.selectedIndices[0];\n }\n if (this.focusIndex == -1 && this.itemCount > 0) {\n this.focusIndex = 0;\n }\n } else {\n this.updateFocusedItemAttributes();\n }\n }\n });\n this.addEventListener(\"blur\", () => {\n if (this.focusIndex != -1) {\n this.updateFocusedItemAttributes();\n }\n });\n if (this.selectedIndices.length > 0) {\n this.scrollToItem(this.selectedIndices[0], \"center\");\n }\n }\n\n private updateFocusedItemAttributes() {\n const focusedElement = this.getListItem(this.focusIndex);\n if (focusedElement) {\n if (this.focusTarget || document.activeElement == this) {\n focusedElement.setAttribute(\"focused\", \"\");\n this.setAttribute(\"aria-activedescendant\", focusedElement.id);\n } else {\n focusedElement.removeAttribute(\"focused\");\n this.removeAttribute(\"aria-activedescendant\");\n }\n }\n }\n\n static get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n public render(): TemplateResult {\n this.updateItemsRenderData();\n return html`\n <div class=\"container\" style=\"height: ${this.itemCount * this.itemHeight}px\">\n <slot name=\"items\"></slot>\n </div>\n `;\n }\n\n public updated(_changedProperties: PropertyValues): void {\n super.updated(_changedProperties);\n this._lastRenderedScrollTop = this._lastKnownScrollTop;\n this.updateItems();\n\n if (\n (this._increaseWidthOnNextRenderIfNeeded || this._reachedMaxWidth) && //\n this._firstVisibleIndex < this._lastVisibleIndex\n ) {\n if (!this.querySelector(\"[item-index]\")) {\n // If ShadyDOM is in use, then it needs a delay, because dom mutations are not applied immediately.\n const observer = new MutationObserver(() => {\n this.adjustWidthIfNeeded();\n observer.disconnect();\n });\n observer.observe(this);\n } else {\n this.adjustWidthIfNeeded();\n }\n }\n }\n\n private adjustWidthIfNeeded() {\n if (this._increaseWidthOnNextRenderIfNeeded) {\n this._increaseWidthOnNextRenderIfNeeded = false;\n window.requestAnimationFrame(() => {\n const remainingWidth = Number.parseInt(getComputedStyle(this).maxWidth) - this.offsetWidth;\n if (remainingWidth == 0) {\n this._reachedMaxWidth = true;\n this.enableLineClampOnItemsIfNeeded();\n } else {\n this._reachedMaxWidth = false;\n const missingWidths = [...this.querySelectorAll(\"[item-index]\")].map((item) => {\n if (item instanceof ListItem) {\n item.enableLineClamp = false;\n const missingWidthForTexts = item.missingWidthForTexts;\n if (missingWidthForTexts > remainingWidth) {\n item.enableLineClamp = true;\n }\n return missingWidthForTexts;\n }\n });\n const additionalWidth = Math.max(...missingWidths);\n if (additionalWidth > 0) {\n this.style.width = `${this.offsetWidth + additionalWidth}px`;\n }\n }\n });\n } else if (this._reachedMaxWidth) {\n this.enableLineClampOnItemsIfNeeded();\n }\n }\n\n private enableLineClampOnItemsIfNeeded() {\n this.querySelectorAll(\"[item-index]\").forEach((item) => {\n if (item instanceof ListItem) {\n item.enableLineClamp = item.enableLineClamp || item.missingWidthForTexts > 0;\n }\n });\n }\n\n /**\n * Searches for list-items where there is a need for an additional width (ellipsis maybe shown) and increases the width of the list,\n * therefore all the content is visible without tooltips. As it can be an expensive task to retrieve the required details, calling\n * this function has an effect only on the very next render. Note that it only works if the virtual-list works with sd-list-item elements.\n * If the maximum width is reached, line clamp is enabled on list items as a last resort approach to show the content if possible.\n */\n public increaseWidthOnNextRenderIfNeeded(): void {\n this._increaseWidthOnNextRenderIfNeeded = true;\n }\n\n private updateItems() {\n const unusedItems: Element[] = [...this.querySelectorAll(\"[item-index]\")];\n const renderedItems: Map<string, HTMLElement> = new Map();\n\n const newItemsFragment = document.createDocumentFragment();\n for (const renderData of this._itemsRenderData) {\n const itemElement = this.renderItem(renderData);\n if (!itemElement.parentElement) {\n newItemsFragment.appendChild(itemElement);\n }\n renderedItems.set(renderData.dataHash, itemElement);\n const index = unusedItems.indexOf(itemElement);\n if (index !== -1) {\n unusedItems.splice(index, 1);\n }\n }\n this.appendChild(newItemsFragment);\n\n for (const unusedItemElement of unusedItems) {\n if (unusedItemElement instanceof ListItem) {\n unusedItemElement.enableLineClamp = false;\n }\n this.removeChild(unusedItemElement);\n }\n\n renderedItems.forEach((itemElement, dataHash) => {\n this._elementCache.set(dataHash, itemElement);\n });\n }\n\n private renderItem({ index, top, dataHash, data }: ItemRenderData): HTMLElement {\n let element: HTMLElement;\n if (data) {\n if (this._elementCache.has(dataHash)) {\n element = this._elementCache.get(dataHash);\n this._elementCache.delete(dataHash); // Allow to be rendered twice\n } else {\n element = this.itemGenerator(data, index);\n element.setAttribute(\"slot\", \"items\");\n // Do not add to cache yet, because the same item might need to be rendered twice\n }\n } else {\n element = document.createElement(\"div\");\n element.setAttribute(\"placeholder-item\", \"\");\n element.setAttribute(\"slot\", \"items\");\n }\n Object.assign(element.style, {\n transform: `translateY(${top}px)`,\n height: `${this.itemHeight}px`,\n });\n element.setAttribute(\"item-index\", index.toString());\n element.setAttribute(\"aria-setsize\", String(this.finalSizeIsKnown ? this.itemCount : -1));\n element.setAttribute(\"aria-posinset\", String(index + 1));\n if (!element.id || element.id.startsWith(this.id + \"_item_\")) {\n element.id = this.id + \"_item_\" + index;\n }\n if (this.itemCount - 1 == index) {\n element.setAttribute(\"last\", \"\");\n } else {\n element.removeAttribute(\"last\");\n }\n\n this.updateSelectedAttribute(index, element);\n this.updateFocusedAttribute(index, element);\n\n return element;\n }\n\n private onScroll = () => {\n this._lastKnownScrollTop = this.scrollTop;\n const delta = this._lastRenderedScrollTop - this._lastKnownScrollTop;\n if (Math.abs(delta) >= this.itemHeight) {\n this._lastRenderedScrollTop = this._lastKnownScrollTop;\n this.requestUpdate();\n }\n };\n\n private updateFocusedAttribute(index: number, itemElement: HTMLElement) {\n if (this.focusIndex == index && (this.focusTarget || document.activeElement == this)) {\n itemElement.setAttribute(\"focused\", \"\");\n this.setAttribute(\"aria-activedescendant\", itemElement.id);\n } else {\n itemElement.removeAttribute(\"focused\");\n }\n }\n\n private updateSelectedAttribute(index: number, itemElement: HTMLElement) {\n const selected = this.selectedIndices.indexOf(index) !== -1;\n if (selected) {\n itemElement.setAttribute(\"selected\", \"\");\n } else {\n itemElement.removeAttribute(\"selected\");\n }\n itemElement.setAttribute(\"aria-selected\", String(selected));\n }\n\n private updateItemsRenderData(): void {\n this._itemsRenderData = [];\n this._visibleItemsNum = Math.min(Math.ceil(this.height / this.itemHeight), this.itemCount);\n\n if (this._visibleItemsNum > 0) {\n this._firstVisibleIndex = this.normalizeIndex(Math.floor(this._lastKnownScrollTop / this.itemHeight));\n this._lastVisibleIndex = this.normalizeIndex(this._firstVisibleIndex + this._visibleItemsNum);\n\n const firstRenderedIndex = this.normalizeIndex(this._firstVisibleIndex - 2);\n const lastRenderedIndex = this.normalizeIndex(this._lastVisibleIndex + 2);\n\n // May update value of this.items, which could trigger another render if not called from a lifecycle callback where it is ignored\n this.requestData(firstRenderedIndex, lastRenderedIndex);\n\n for (let i = firstRenderedIndex; i <= lastRenderedIndex; i++) {\n const physicalIndex = i - firstRenderedIndex;\n const itemData = this.items[physicalIndex];\n let dataHash;\n if (itemData) {\n dataHash = JSON.stringify(itemData);\n } else {\n dataHash = `placeholder-${physicalIndex}`;\n }\n this._itemsRenderData.push({\n index: i,\n top: this.itemHeight * i,\n physicalIndex,\n dataHash,\n data: itemData,\n });\n }\n } else {\n this._firstVisibleIndex = 0;\n this._lastVisibleIndex = 0;\n }\n }\n\n private normalizeIndex(index: number): number {\n return Math.max(0, Math.min(index, this.itemCount - 1));\n }\n\n private get height(): number {\n return this.offsetHeight;\n }\n\n private requestData(firstRenderedIndex: number, lastRenderedIndex: number): void {\n if (!Number.isNaN(firstRenderedIndex) && !Number.isNaN(lastRenderedIndex)) {\n this.dispatchEvent(\n new CustomEvent<IDataRequestEvent>(\"data-request\", {\n detail: {\n startIndex: firstRenderedIndex,\n stopIndex: lastRenderedIndex,\n },\n }),\n );\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n let shouldPrevent = true;\n switch (event.key) {\n case \"Down\":\n case \"ArrowDown\":\n this.focusIndex = (this.focusIndex + 1) % this.itemCount;\n break;\n case \"Up\":\n case \"ArrowUp\":\n if (this.focusIndex > 0) {\n this.focusIndex--;\n } else if (this.finalSizeIsKnown) {\n this.focusIndex = this.itemCount - 1;\n }\n break;\n case \"Enter\":\n this.handleSelection(this.focusIndex, event);\n break;\n case \"End\":\n this.focusIndex = this.itemCount - 1;\n break;\n case \"PageDown\":\n this.focusIndex = this.normalizeIndex(this.focusIndex + this._visibleItemsNum - 1);\n break;\n case \"Home\":\n this.focusIndex = 0;\n break;\n case \"PageUp\":\n this.focusIndex = this.normalizeIndex(this.focusIndex - this._visibleItemsNum + 1);\n break;\n default:\n shouldPrevent = false;\n break;\n }\n if (shouldPrevent) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n private handleSelection(index: number, event: Event): void {\n if (index < 0 || this.itemCount <= index) {\n return;\n }\n const element = this.getListItem(index);\n if (element.getAttribute(\"aria-disabled\") == \"true\" || element.hasAttribute(\"disabled\")) {\n return;\n }\n let hasBeenSelected = true;\n if (this.selectionType !== SelectionType.TriggerOnly) {\n const existingIndex = this.selectedIndices.indexOf(index);\n hasBeenSelected = existingIndex == -1;\n if (hasBeenSelected) {\n if (this.selectionType === SelectionType.Single) {\n this.selectedIndices = [index];\n } else {\n this.selectedIndices.push(index);\n }\n } else {\n this.selectedIndices.splice(existingIndex, 1);\n }\n this.requestUpdate(\"selectedIndices\"); // altering inside of an array does not retrigger an update\n }\n this.focusIndex = index;\n this.dispatchSelectionEvent(index, hasBeenSelected, event);\n }\n\n private dispatchSelectionEvent(index: number, selected: boolean, originalEvent: Event): void {\n this.dispatchEvent(\n new CustomEvent<ISelectionEvent>(\"selection\", {\n detail: { index, selected, originalEvent },\n }),\n );\n }\n\n private handleClick(event: MouseEvent): void {\n const clickedElement = event\n .composedPath()\n .find((target: HTMLElement) => target.hasAttribute && target.hasAttribute(\"item-index\")) as HTMLElement;\n if (clickedElement) {\n const index = parseInt(clickedElement.getAttribute(\"item-index\"));\n if (Number.isInteger(index)) {\n if (event.button == 0 || event.button == 1) {\n this.handleSelection(index, event);\n }\n this.focusIndex = index;\n }\n }\n }\n}\n\nVirtualList.ensureDefined();\n"],"names":["ListUtil","index","alignment","scrollOffset","itemHeight","height","itemCount","lastItemOffset","maxOffset","minOffset","middleOffset","func","timer","args","ListUtil$1","ListDataProvider","pageSize","preloadedItemsCount","event","startIndex","stopIndex","value","count","items","list","SelectionType","idCounter","_VirtualList","_a","LitElement","generator","delta","shouldPrevent","oldValue","selectedIndices","_changedProperties","focusedElement","css","unsafeCSS","style","html","observer","remainingWidth","missingWidths","item","ListItem","missingWidthForTexts","additionalWidth","unusedItems","renderedItems","newItemsFragment","renderData","itemElement","unusedItemElement","dataHash","top","data","element","selected","firstRenderedIndex","lastRenderedIndex","physicalIndex","itemData","hasBeenSelected","existingIndex","originalEvent","clickedElement","target","__decorateClass","property","VirtualList"],"mappings":"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"}
@@ -7,52 +7,57 @@
7
7
  "@eslint/js@9.34.0": {
8
8
  "licenses": "MIT",
9
9
  "repository": "https://github.com/eslint/eslint",
10
- "licenseUrl": "https://github.com/eslint/eslint/raw/HEAD/LICENSE"
10
+ "licenseUrl": "https://unpkg.com/@eslint/js@9.34.0/LICENSE"
11
11
  },
12
12
  "@rollup/plugin-node-resolve@16.0.1": {
13
13
  "licenses": "MIT",
14
14
  "repository": "https://github.com/rollup/plugins",
15
- "licenseUrl": "https://github.com/rollup/plugins/raw/HEAD/LICENSE"
15
+ "licenseUrl": "https://unpkg.com/@rollup/plugin-node-resolve@16.0.1/LICENSE"
16
+ },
17
+ "@types/d3-color@3.1.3": {
18
+ "licenses": "MIT",
19
+ "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped",
20
+ "licenseUrl": "https://unpkg.com/@types/d3-color@3.1.3/LICENSE"
16
21
  },
17
22
  "@types/node@24.3.0": {
18
23
  "licenses": "MIT",
19
24
  "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped",
20
- "licenseUrl": "https://github.com/DefinitelyTyped/DefinitelyTyped/raw/HEAD/LICENSE"
25
+ "licenseUrl": "https://unpkg.com/@types/node@24.3.0/LICENSE"
21
26
  },
22
27
  "@types/postcss-prefix-selector@1.16.3": {
23
28
  "licenses": "MIT",
24
29
  "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped",
25
- "licenseUrl": "https://github.com/DefinitelyTyped/DefinitelyTyped/raw/HEAD/LICENSE"
30
+ "licenseUrl": "https://unpkg.com/@types/postcss-prefix-selector@1.16.3/LICENSE"
26
31
  },
27
32
  "@typescript-eslint/eslint-plugin@8.41.0": {
28
33
  "licenses": "MIT",
29
34
  "repository": "https://github.com/typescript-eslint/typescript-eslint",
30
- "licenseUrl": "https://github.com/typescript-eslint/typescript-eslint/raw/HEAD/LICENSE"
35
+ "licenseUrl": "https://unpkg.com/@typescript-eslint/eslint-plugin@8.41.0/LICENSE"
31
36
  },
32
37
  "@typescript-eslint/parser@8.41.0": {
33
38
  "licenses": "MIT",
34
39
  "repository": "https://github.com/typescript-eslint/typescript-eslint",
35
- "licenseUrl": "https://github.com/typescript-eslint/typescript-eslint/raw/HEAD/LICENSE"
40
+ "licenseUrl": "https://unpkg.com/@typescript-eslint/parser@8.41.0/LICENSE"
36
41
  },
37
42
  "@vitest/coverage-v8@3.2.4": {
38
43
  "licenses": "MIT",
39
44
  "repository": "https://github.com/vitest-dev/vitest",
40
- "licenseUrl": "https://github.com/vitest-dev/vitest/raw/HEAD/LICENSE"
45
+ "licenseUrl": "https://unpkg.com/@vitest/coverage-v8@3.2.4/LICENSE"
41
46
  },
42
47
  "@vitest/ui@3.2.4": {
43
48
  "licenses": "MIT",
44
49
  "repository": "https://github.com/vitest-dev/vitest",
45
- "licenseUrl": "https://github.com/vitest-dev/vitest/raw/HEAD/LICENSE"
50
+ "licenseUrl": "https://unpkg.com/@vitest/ui@3.2.4/LICENSE"
46
51
  },
47
52
  "axe-core@4.10.3": {
48
53
  "licenses": "MPL-2.0",
49
54
  "repository": "https://github.com/dequelabs/axe-core",
50
- "licenseUrl": "https://github.com/dequelabs/axe-core/raw/HEAD/LICENSE"
55
+ "licenseUrl": "https://unpkg.com/axe-core@4.10.3/LICENSE"
51
56
  },
52
57
  "cypress-axe@1.7.0": {
53
58
  "licenses": "MIT",
54
59
  "repository": "https://github.com/component-driven/cypress-axe",
55
- "licenseUrl": "https://github.com/component-driven/cypress-axe/raw/HEAD/License.md"
60
+ "licenseUrl": "https://unpkg.com/cypress-axe@1.7.0/License.md"
56
61
  },
57
62
  "cypress@15.0.0": {
58
63
  "licenses": "MIT",
@@ -62,146 +67,146 @@
62
67
  "d3-color@3.1.0": {
63
68
  "licenses": "ISC",
64
69
  "repository": "https://github.com/d3/d3-color",
65
- "licenseUrl": "https://github.com/d3/d3-color/raw/HEAD/LICENSE"
70
+ "licenseUrl": "https://unpkg.com/d3-color@3.1.0/LICENSE"
66
71
  },
67
72
  "esbuild@0.25.9": {
68
73
  "licenses": "MIT",
69
74
  "repository": "https://github.com/evanw/esbuild",
70
- "licenseUrl": "https://github.com/evanw/esbuild/raw/HEAD/LICENSE.md"
75
+ "licenseUrl": "https://unpkg.com/esbuild@0.25.9/LICENSE.md"
71
76
  },
72
77
  "eslint-config-google@0.14.0": {
73
78
  "licenses": "Apache-2.0",
74
79
  "repository": "https://github.com/google/eslint-config-google",
75
- "licenseUrl": "https://github.com/google/eslint-config-google/raw/HEAD/LICENSE"
80
+ "licenseUrl": "https://unpkg.com/eslint-config-google@0.14.0/LICENSE"
76
81
  },
77
82
  "eslint-config-prettier@10.1.8": {
78
83
  "licenses": "MIT",
79
84
  "repository": "https://github.com/prettier/eslint-config-prettier",
80
- "licenseUrl": "https://github.com/prettier/eslint-config-prettier/raw/HEAD/LICENSE"
85
+ "licenseUrl": "https://unpkg.com/eslint-config-prettier@10.1.8/LICENSE"
81
86
  },
82
87
  "eslint@9.34.0": {
83
88
  "licenses": "MIT",
84
89
  "repository": "https://github.com/eslint/eslint",
85
- "licenseUrl": "https://github.com/eslint/eslint/raw/HEAD/LICENSE"
90
+ "licenseUrl": "https://unpkg.com/eslint@9.34.0/LICENSE"
86
91
  },
87
92
  "github-markdown-css@5.8.1": {
88
93
  "licenses": "MIT",
89
94
  "repository": "https://github.com/sindresorhus/github-markdown-css",
90
- "licenseUrl": "https://github.com/sindresorhus/github-markdown-css/raw/HEAD/license"
95
+ "licenseUrl": "https://unpkg.com/github-markdown-css@5.8.1/license"
91
96
  },
92
97
  "highlight.js@11.11.1": {
93
98
  "licenses": "BSD-3-Clause",
94
99
  "repository": "https://github.com/highlightjs/highlight.js",
95
- "licenseUrl": "https://github.com/highlightjs/highlight.js/raw/HEAD/LICENSE"
100
+ "licenseUrl": "https://unpkg.com/highlight.js@11.11.1/LICENSE"
96
101
  },
97
102
  "junit-report-builder@5.1.1": {
98
103
  "licenses": "MIT",
99
104
  "repository": "https://github.com/davidparsson/junit-report-builder",
100
- "licenseUrl": "https://github.com/davidparsson/junit-report-builder/raw/HEAD/LICENSE"
105
+ "licenseUrl": "https://unpkg.com/junit-report-builder@5.1.1/LICENSE"
101
106
  },
102
107
  "lint-staged@16.1.5": {
103
108
  "licenses": "MIT",
104
109
  "repository": "https://github.com/lint-staged/lint-staged",
105
- "licenseUrl": "https://github.com/lint-staged/lint-staged/raw/HEAD/LICENSE"
110
+ "licenseUrl": "https://unpkg.com/lint-staged@16.1.5/LICENSE"
106
111
  },
107
112
  "lit-html@3.3.1": {
108
113
  "licenses": "BSD-3-Clause",
109
114
  "repository": "https://github.com/lit/lit",
110
- "licenseUrl": "https://github.com/lit/lit/raw/HEAD/LICENSE"
115
+ "licenseUrl": "https://unpkg.com/lit-html@3.3.1/LICENSE"
111
116
  },
112
117
  "lit@3.3.1": {
113
118
  "licenses": "BSD-3-Clause",
114
119
  "repository": "https://github.com/lit/lit",
115
- "licenseUrl": "https://github.com/lit/lit/raw/HEAD/LICENSE"
120
+ "licenseUrl": "https://unpkg.com/lit@3.3.1/LICENSE"
116
121
  },
117
122
  "marked@16.2.1": {
118
123
  "licenses": "MIT",
119
124
  "repository": "https://github.com/markedjs/marked",
120
- "licenseUrl": "https://github.com/markedjs/marked/raw/HEAD/LICENSE.md"
125
+ "licenseUrl": "https://unpkg.com/marked@16.2.1/LICENSE.md"
121
126
  },
122
127
  "postcss-prefix-selector@2.1.1": {
123
128
  "licenses": "MIT",
124
129
  "repository": "https://github.com/RadValentin/postcss-prefix-selector",
125
- "licenseUrl": "https://github.com/RadValentin/postcss-prefix-selector/raw/HEAD/LICENSE"
130
+ "licenseUrl": "https://unpkg.com/postcss-prefix-selector@2.1.1/LICENSE"
126
131
  },
127
132
  "postcss@8.5.6": {
128
133
  "licenses": "MIT",
129
134
  "repository": "https://github.com/postcss/postcss",
130
- "licenseUrl": "https://github.com/postcss/postcss/raw/HEAD/LICENSE"
135
+ "licenseUrl": "https://unpkg.com/postcss@8.5.6/LICENSE"
131
136
  },
132
137
  "prettier@3.6.2": {
133
138
  "licenses": "MIT",
134
139
  "repository": "https://github.com/prettier/prettier",
135
- "licenseUrl": "https://github.com/prettier/prettier/raw/HEAD/LICENSE"
140
+ "licenseUrl": "https://unpkg.com/prettier@3.6.2/LICENSE"
136
141
  },
137
142
  "resolve-pkg@2.0.0": {
138
143
  "licenses": "MIT",
139
144
  "repository": "https://github.com/sindresorhus/resolve-pkg",
140
- "licenseUrl": "https://github.com/sindresorhus/resolve-pkg/raw/HEAD/license"
145
+ "licenseUrl": "https://unpkg.com/resolve-pkg@2.0.0/license"
141
146
  },
142
147
  "sass@1.91.0": {
143
148
  "licenses": "MIT",
144
149
  "repository": "https://github.com/sass/dart-sass",
145
- "licenseUrl": "https://github.com/sass/dart-sass/raw/HEAD/LICENSE"
150
+ "licenseUrl": "https://unpkg.com/sass@1.91.0/LICENSE"
146
151
  },
147
152
  "stylelint-config-recommended-scss@16.0.0": {
148
153
  "licenses": "MIT",
149
154
  "repository": "https://github.com/stylelint-scss/stylelint-config-recommended-scss",
150
- "licenseUrl": "https://github.com/stylelint-scss/stylelint-config-recommended-scss/raw/HEAD/LICENSE"
155
+ "licenseUrl": "https://unpkg.com/stylelint-config-recommended-scss@16.0.0/LICENSE"
151
156
  },
152
157
  "stylelint-config-standard@39.0.0": {
153
158
  "licenses": "MIT",
154
159
  "repository": "https://github.com/stylelint/stylelint-config-standard",
155
- "licenseUrl": "https://github.com/stylelint/stylelint-config-standard/raw/HEAD/LICENSE"
160
+ "licenseUrl": "https://unpkg.com/stylelint-config-standard@39.0.0/LICENSE"
156
161
  },
157
162
  "stylelint-scss@6.12.1": {
158
163
  "licenses": "MIT",
159
164
  "repository": "https://github.com/stylelint-scss/stylelint-scss",
160
- "licenseUrl": "https://github.com/stylelint-scss/stylelint-scss/raw/HEAD/LICENSE"
165
+ "licenseUrl": "https://unpkg.com/stylelint-scss@6.12.1/LICENSE"
161
166
  },
162
167
  "stylelint@16.23.1": {
163
168
  "licenses": "MIT",
164
169
  "repository": "https://github.com/stylelint/stylelint",
165
- "licenseUrl": "https://github.com/stylelint/stylelint/raw/HEAD/LICENSE"
170
+ "licenseUrl": "https://unpkg.com/stylelint@16.23.1/LICENSE"
166
171
  },
167
172
  "tsup@8.5.0": {
168
173
  "licenses": "MIT",
169
174
  "repository": "https://github.com/egoist/tsup",
170
- "licenseUrl": "https://github.com/egoist/tsup/raw/HEAD/LICENSE"
175
+ "licenseUrl": "https://unpkg.com/tsup@8.5.0/LICENSE"
171
176
  },
172
177
  "turbo@2.5.6": {
173
178
  "licenses": "MIT",
174
179
  "repository": "https://github.com/vercel/turborepo",
175
- "licenseUrl": "https://github.com/vercel/turborepo/raw/HEAD/LICENSE"
180
+ "licenseUrl": "https://unpkg.com/turbo@2.5.6/LICENSE"
176
181
  },
177
182
  "typescript-eslint@8.41.0": {
178
183
  "licenses": "MIT",
179
184
  "repository": "https://github.com/typescript-eslint/typescript-eslint",
180
- "licenseUrl": "https://github.com/typescript-eslint/typescript-eslint/raw/HEAD/LICENSE"
185
+ "licenseUrl": "https://unpkg.com/typescript-eslint@8.41.0/LICENSE"
181
186
  },
182
187
  "typescript@5.9.2": {
183
188
  "licenses": "Apache-2.0",
184
189
  "repository": "https://github.com/microsoft/TypeScript",
185
- "licenseUrl": "https://github.com/microsoft/TypeScript/raw/HEAD/LICENSE.txt"
190
+ "licenseUrl": "https://unpkg.com/typescript@5.9.2/LICENSE.txt"
186
191
  },
187
192
  "vite-tsconfig-paths@5.1.4": {
188
193
  "licenses": "MIT",
189
194
  "repository": "https://github.com/aleclarson/vite-tsconfig-paths",
190
- "licenseUrl": "https://github.com/aleclarson/vite-tsconfig-paths/raw/HEAD/LICENSE"
195
+ "licenseUrl": "https://unpkg.com/vite-tsconfig-paths@5.1.4/LICENSE"
191
196
  },
192
197
  "vite@7.1.3": {
193
198
  "licenses": "MIT",
194
199
  "repository": "https://github.com/vitejs/vite",
195
- "licenseUrl": "https://github.com/vitejs/vite/raw/HEAD/LICENSE.md"
200
+ "licenseUrl": "https://unpkg.com/vite@7.1.3/LICENSE.md"
196
201
  },
197
202
  "vitest@3.2.4": {
198
203
  "licenses": "MIT",
199
204
  "repository": "https://github.com/vitest-dev/vitest",
200
- "licenseUrl": "https://github.com/vitest-dev/vitest/raw/HEAD/LICENSE.md"
205
+ "licenseUrl": "https://unpkg.com/vitest@3.2.4/LICENSE.md"
201
206
  },
202
207
  "yargs@18.0.0": {
203
208
  "licenses": "MIT",
204
209
  "repository": "https://github.com/yargs/yargs",
205
- "licenseUrl": "https://github.com/yargs/yargs/raw/HEAD/LICENSE"
210
+ "licenseUrl": "https://unpkg.com/yargs@18.0.0/LICENSE"
206
211
  }
207
212
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cas-smartdesign/virtual-list",
3
- "version": "6.3.1",
3
+ "version": "7.0.1",
4
4
  "description": "A virtualized list element with SmartDesign look and feel.",
5
5
  "main": "dist/virtual-list-with-externals.js",
6
6
  "module": "dist/virtual-list.mjs",
@@ -8,12 +8,12 @@
8
8
  "types": "dist/virtual-list.d.ts",
9
9
  "dependencies": {
10
10
  "lit": "^3.3.1",
11
- "@cas-smartdesign/list-item": "^7.4.3"
11
+ "@cas-smartdesign/list-item": "^7.4.4"
12
12
  },
13
13
  "devDependencies": {
14
- "@cas-smartdesign/license-generator": "^1.8.0",
15
- "@cas-smartdesign/element-utils": "^1.2.0",
16
- "@cas-smartdesign/element-preview": "^0.3.0"
14
+ "@cas-smartdesign/element-preview": "^0.3.1",
15
+ "@cas-smartdesign/element-utils": "^1.2.1",
16
+ "@cas-smartdesign/license-generator": "^1.8.1"
17
17
  },
18
18
  "files": [
19
19
  "dist",