@nordhealth/components 5.0.0 → 5.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.
Files changed (114) hide show
  1. package/custom-elements.json +19411 -19267
  2. package/lib/Autocomplete.js +1 -1
  3. package/lib/Autocomplete.js.map +1 -1
  4. package/lib/Button.js +1 -1
  5. package/lib/Button.js.map +1 -1
  6. package/lib/Calendar.js +1 -1
  7. package/lib/Combobox.js +1 -1
  8. package/lib/Combobox.js.map +1 -1
  9. package/lib/ComboboxBase.js +1 -1
  10. package/lib/ComboboxBase.js.map +1 -1
  11. package/lib/CommandMenu.js +1 -1
  12. package/lib/CommandMenu.js.map +1 -1
  13. package/lib/DatePicker.js +1 -1
  14. package/lib/DatePicker.js.map +1 -1
  15. package/lib/DateRangePicker.js +1 -1
  16. package/lib/DateRangePicker.js.map +1 -1
  17. package/lib/Dropdown.js +1 -1
  18. package/lib/Dropdown.js.map +1 -1
  19. package/lib/DropdownSubmenu.js +1 -1
  20. package/lib/FilterAddButton.js +1 -1
  21. package/lib/FilterAddButton.js.map +1 -1
  22. package/lib/FilterDateRange.js +1 -1
  23. package/lib/FilterDateRange.js.map +1 -1
  24. package/lib/FilterDropdown.js +1 -1
  25. package/lib/FilterDropdown.js.map +1 -1
  26. package/lib/FilterField.js +1 -1
  27. package/lib/FilterField.js.map +1 -1
  28. package/lib/FilterInput.js +1 -1
  29. package/lib/FilterInput.js.map +1 -1
  30. package/lib/FilterResetButton.js +1 -1
  31. package/lib/FilterResetButton.js.map +1 -1
  32. package/lib/Item.js +1 -1
  33. package/lib/Item.js.map +1 -1
  34. package/lib/Layout.js +1 -1
  35. package/lib/Layout.js.map +1 -1
  36. package/lib/LocalizeController.js +1 -1
  37. package/lib/LocalizeController.js.map +1 -1
  38. package/lib/Message.js +1 -1
  39. package/lib/Message.js.map +1 -1
  40. package/lib/Modal.js +1 -1
  41. package/lib/Modal.js.map +1 -1
  42. package/lib/NavGroup.js +1 -1
  43. package/lib/NavGroup.js.map +1 -1
  44. package/lib/NavItem.js +1 -1
  45. package/lib/NavItem.js.map +1 -1
  46. package/lib/NavToggle-ROsuaJkW.js +2 -0
  47. package/lib/{NavToggle-BY83xpx0.js.map → NavToggle-ROsuaJkW.js.map} +1 -1
  48. package/lib/NavToggle.js +1 -1
  49. package/lib/Notification.js +1 -1
  50. package/lib/Notification.js.map +1 -1
  51. package/lib/NumberField.js +1 -1
  52. package/lib/NumberField.js.map +1 -1
  53. package/lib/OtpField.js +1 -1
  54. package/lib/OtpField.js.map +1 -1
  55. package/lib/Outline.js +1 -1
  56. package/lib/Outline.js.map +1 -1
  57. package/lib/Pagination.js +1 -1
  58. package/lib/Pagination.js.map +1 -1
  59. package/lib/Popout-B6Hirj3y.js +2 -0
  60. package/lib/{Popout-CFtFoCaA.js.map → Popout-B6Hirj3y.js.map} +1 -1
  61. package/lib/Popout.js +1 -1
  62. package/lib/Tag.js +1 -1
  63. package/lib/Tag.js.map +1 -1
  64. package/lib/Textarea.js +1 -1
  65. package/lib/Textarea.js.map +1 -1
  66. package/lib/TimePicker.js +1 -1
  67. package/lib/TimePicker.js.map +1 -1
  68. package/lib/bundle.js +9 -9
  69. package/lib/bundle.js.map +1 -1
  70. package/lib/en-us.js +1 -1
  71. package/lib/en-us.js.map +1 -1
  72. package/lib/fi-fi.js +1 -1
  73. package/lib/fi-fi.js.map +1 -1
  74. package/lib/index.js +1 -1
  75. package/lib/localization13.js +1 -1
  76. package/lib/localization13.js.map +1 -1
  77. package/lib/localization14.js +1 -1
  78. package/lib/localization14.js.map +1 -1
  79. package/lib/localization15.js +1 -1
  80. package/lib/localization15.js.map +1 -1
  81. package/lib/localization16.js +1 -1
  82. package/lib/localization16.js.map +1 -1
  83. package/lib/localization17.js +1 -1
  84. package/lib/localization17.js.map +1 -1
  85. package/lib/localization18.js +1 -1
  86. package/lib/localization18.js.map +1 -1
  87. package/lib/localization19.js +1 -1
  88. package/lib/localization19.js.map +1 -1
  89. package/lib/localization20.js +1 -1
  90. package/lib/localization20.js.map +1 -1
  91. package/lib/localization21.js +1 -1
  92. package/lib/localization21.js.map +1 -1
  93. package/lib/localization22.js +1 -1
  94. package/lib/localization22.js.map +1 -1
  95. package/lib/localization23.js +1 -1
  96. package/lib/localization23.js.map +1 -1
  97. package/lib/localization24.js +2 -0
  98. package/lib/localization24.js.map +1 -0
  99. package/lib/nav-context.js +2 -0
  100. package/lib/nav-context.js.map +1 -0
  101. package/lib/src/button/Button.d.ts +1 -0
  102. package/lib/src/dropdown/Dropdown.d.ts +3 -0
  103. package/lib/src/layout/Layout.d.ts +12 -0
  104. package/lib/src/layout/localization.d.ts +5 -0
  105. package/lib/src/localization/en-us.d.ts +4 -0
  106. package/lib/src/localization/translation.d.ts +4 -0
  107. package/lib/src/nav-group/NavGroup.d.ts +1 -0
  108. package/lib/src/nav-group/nav-context.d.ts +11 -0
  109. package/lib/src/nav-item/NavItem.d.ts +23 -0
  110. package/lib/translation.js +1 -1
  111. package/lib/translation.js.map +1 -1
  112. package/package.json +4 -4
  113. package/lib/NavToggle-BY83xpx0.js +0 -2
  114. package/lib/Popout-CFtFoCaA.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ComboboxBase.js","sources":["../../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/utils.js","../../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/index.js","../../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js","../../../node_modules/.pnpm/@tanstack+lit-virtual@3.13.30_lit@3.3.2/node_modules/@tanstack/lit-virtual/dist/esm/index.js","../src/combobox/ComboboxBase.ts"],"sourcesContent":["function memo(getDeps, fn, opts) {\n let deps = opts.initialDeps ?? [];\n let result;\n let isInitial = true;\n function memoizedFunction() {\n var _a;\n const debugEnabled = process.env.NODE_ENV !== \"production\" && !!opts.key && !!((_a = opts.debug) == null ? void 0 : _a.call(opts));\n let depTime = 0;\n if (debugEnabled) depTime = Date.now();\n const newDeps = getDeps();\n const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n let resultTime = 0;\n if (debugEnabled) resultTime = Date.now();\n result = fn(...newDeps);\n if (debugEnabled) {\n const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n const resultFpsPercentage = resultEndTime / 16;\n const pad = (str, num) => {\n str = String(str);\n while (str.length < num) {\n str = \" \" + str;\n }\n return str;\n };\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120)\n )}deg 100% 31%);`,\n opts == null ? void 0 : opts.key\n );\n }\n if ((opts == null ? void 0 : opts.onChange) && !(isInitial && opts.skipInitialOnChange)) {\n opts.onChange(result);\n }\n isInitial = false;\n return result;\n }\n memoizedFunction.updateDeps = (newDeps) => {\n deps = newDeps;\n };\n return memoizedFunction;\n}\nfunction notUndefined(value, msg) {\n if (value === void 0) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n } else {\n return value;\n }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1.01;\nconst debounce = (targetWindow, fn, ms) => {\n let timeoutId;\n return function(...args) {\n targetWindow.clearTimeout(timeoutId);\n timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n };\n};\nexport {\n approxEqual,\n debounce,\n memo,\n notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { createLazyMeasurementsView } from \"./lazy-measurements.js\";\nimport { memo, notUndefined, approxEqual, debounce } from \"./utils.js\";\nlet _isIOSResult;\nconst isIOSWebKit = () => {\n if (_isIOSResult !== void 0) return _isIOSResult;\n if (typeof navigator === \"undefined\") return _isIOSResult = false;\n if (/iP(hone|od|ad)/.test(navigator.userAgent)) return _isIOSResult = true;\n const mtp = navigator.maxTouchPoints;\n return _isIOSResult = navigator.platform === \"MacIntel\" && mtp !== void 0 && mtp > 0;\n};\nconst _resetIOSDetectionForTests = () => {\n _isIOSResult = void 0;\n};\nconst getRect = (element) => {\n const { offsetWidth, offsetHeight } = element;\n return { width: offsetWidth, height: offsetHeight };\n};\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n const start = Math.max(range.startIndex - range.overscan, 0);\n const end = Math.min(range.endIndex + range.overscan, range.count - 1);\n const len = end - start + 1;\n const arr = new Array(len);\n for (let i = 0; i < len; i++) {\n arr[i] = start + i;\n }\n return arr;\n};\nconst observeElementRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const handler = (rect) => {\n const { width, height } = rect;\n cb({ width: Math.round(width), height: Math.round(height) });\n };\n handler(getRect(element));\n if (!targetWindow.ResizeObserver) {\n return () => {\n };\n }\n const observer = new targetWindow.ResizeObserver((entries) => {\n const run = () => {\n const entry = entries[0];\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize });\n return;\n }\n }\n handler(getRect(element));\n };\n instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n observer.observe(element, { box: \"border-box\" });\n return () => {\n observer.unobserve(element);\n };\n};\nconst addEventListenerOptions = {\n passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight });\n };\n handler();\n element.addEventListener(\"resize\", handler, addEventListenerOptions);\n return () => {\n element.removeEventListener(\"resize\", handler);\n };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeOffset = (instance, cb, readOffset) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n let offset = 0;\n const fallback = registerScrollendEvent ? null : debounce(\n targetWindow,\n () => cb(offset, false),\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n offset = readOffset(element);\n fallback == null ? void 0 : fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n };\n};\nconst observeElementOffset = (instance, cb) => observeOffset(instance, cb, (el) => {\n const { horizontal, isRtl } = instance.options;\n return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;\n});\nconst observeWindowOffset = (instance, cb) => observeOffset(\n instance,\n cb,\n (win) => instance.options.horizontal ? win.scrollX : win.scrollY\n);\nconst measureElement = (element, entry, instance) => {\n if (instance.options.useCachedMeasurements) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n return instance.itemSizeCache.get(key) ?? instance.options.estimateSize(index);\n }\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n );\n return size;\n }\n }\n if (!entry) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n const cachedSize = instance.itemSizeCache.get(key);\n if (cachedSize !== void 0) {\n return cachedSize;\n }\n }\n return element[instance.options.horizontal ? \"offsetWidth\" : \"offsetHeight\"];\n};\nconst scrollWithAdjustments = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a, _b;\n (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n [instance.options.horizontal ? \"left\" : \"top\"]: offset + adjustments,\n behavior\n });\n};\nconst windowScroll = scrollWithAdjustments;\nconst elementScroll = scrollWithAdjustments;\nclass Virtualizer {\n constructor(opts) {\n this.unsubs = [];\n this.scrollElement = null;\n this.targetWindow = null;\n this.isScrolling = false;\n this.scrollState = null;\n this.measurementsCache = [];\n this._flatMeasurements = null;\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.itemSizeCacheVersion = 0;\n this.laneAssignments = /* @__PURE__ */ new Map();\n this.pendingMin = null;\n this.prevLanes = void 0;\n this.lanesChangedFlag = false;\n this.lanesSettling = false;\n this.pendingScrollAnchor = null;\n this.scrollRect = null;\n this.scrollOffset = null;\n this.scrollDirection = null;\n this.scrollAdjustments = 0;\n this._iosDeferredAdjustment = 0;\n this._iosTouching = false;\n this._iosJustTouchEnded = false;\n this._iosTouchEndTimerId = null;\n this._intendedScrollOffset = null;\n this.elementsCache = /* @__PURE__ */ new Map();\n this.now = () => {\n var _a, _b, _c;\n return ((_c = (_b = (_a = this.targetWindow) == null ? void 0 : _a.performance) == null ? void 0 : _b.now) == null ? void 0 : _c.call(_b)) ?? Date.now();\n };\n this.observer = /* @__PURE__ */ (() => {\n let _ro = null;\n const get = () => {\n if (_ro) {\n return _ro;\n }\n if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n return null;\n }\n return _ro = new this.targetWindow.ResizeObserver((entries) => {\n entries.forEach((entry) => {\n const run = () => {\n const node = entry.target;\n const index = this.indexFromElement(node);\n if (!node.isConnected) {\n this.observer.unobserve(node);\n for (const [cacheKey, cachedNode] of this.elementsCache) {\n if (cachedNode === node) {\n this.elementsCache.delete(cacheKey);\n break;\n }\n }\n return;\n }\n if (this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(\n index,\n this.options.measureElement(node, entry, this)\n );\n }\n };\n this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n });\n };\n return {\n disconnect: () => {\n var _a;\n (_a = get()) == null ? void 0 : _a.disconnect();\n _ro = null;\n },\n observe: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.observe(target, { box: \"border-box\" });\n },\n unobserve: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.unobserve(target);\n }\n };\n })();\n this.range = null;\n this.setOptions = (opts2) => {\n var _a, _b;\n const merged = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {\n },\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n gap: 0,\n indexAttribute: \"data-index\",\n initialMeasurementsCache: [],\n lanes: 1,\n anchorTo: \"start\",\n followOnAppend: false,\n scrollEndThreshold: 1,\n isScrollingResetDelay: 150,\n enabled: true,\n isRtl: false,\n useScrollendEvent: false,\n useAnimationFrameWithResizeObserver: false,\n laneAssignmentMode: \"estimate\",\n useCachedMeasurements: false\n };\n for (const key in opts2) {\n const v = opts2[key];\n if (v !== void 0) merged[key] = v;\n }\n const prevOptions = this.options;\n let anchor = null;\n let followOnAppend = null;\n let edgeKeysChanged = false;\n if (prevOptions !== void 0 && prevOptions.enabled && merged.enabled && merged.anchorTo === \"end\" && this.scrollElement !== null) {\n const prevCount = prevOptions.count;\n const nextCount = merged.count;\n const measurements = this.getMeasurements();\n const prevFirstKey = prevCount > 0 ? ((_a = measurements[0]) == null ? void 0 : _a.key) ?? prevOptions.getItemKey(0) : null;\n const prevLastKey = prevCount > 0 ? ((_b = measurements[prevCount - 1]) == null ? void 0 : _b.key) ?? prevOptions.getItemKey(prevCount - 1) : null;\n const didCountChange = nextCount !== prevCount;\n const didEdgeKeysChange = didCountChange || prevCount > 0 && nextCount > 0 && (merged.getItemKey(0) !== prevFirstKey || merged.getItemKey(nextCount - 1) !== prevLastKey);\n if (didEdgeKeysChange) {\n edgeKeysChanged = true;\n const item = prevCount > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? measurements[0] : null;\n if (item) {\n anchor = [item.key, this.getScrollOffset() - item.start];\n }\n const behavior = merged.followOnAppend === true ? \"auto\" : merged.followOnAppend || null;\n if (behavior && nextCount > prevCount && this.isAtEnd(prevOptions.scrollEndThreshold) && (prevCount === 0 || merged.getItemKey(nextCount - 1) !== prevLastKey)) {\n followOnAppend = behavior;\n }\n }\n }\n this.options = merged;\n if (edgeKeysChanged) {\n this.pendingMin = 0;\n this.itemSizeCacheVersion++;\n }\n let anchorResolved = false;\n let anchorDelta = 0;\n if (anchor && this.scrollOffset !== null) {\n const [anchorKey, anchorOffset] = anchor;\n const newMeasurements = this.getMeasurements();\n const { count, getItemKey } = this.options;\n let idx = 0;\n while (idx < count && getItemKey(idx) !== anchorKey) {\n idx++;\n }\n if (idx < count) {\n const anchorItem = newMeasurements[idx];\n if (anchorItem) {\n const newOffset = anchorItem.start + anchorOffset;\n if (newOffset !== this.scrollOffset) {\n anchorDelta = newOffset - this.scrollOffset;\n this.scrollOffset = newOffset;\n anchorResolved = true;\n }\n }\n }\n }\n if (anchorResolved || followOnAppend) {\n this.pendingScrollAnchor = [\n anchorResolved ? anchor[0] : null,\n anchorResolved ? anchor[1] : 0,\n followOnAppend,\n anchorDelta\n ];\n }\n };\n this.notify = (sync) => {\n var _a, _b;\n (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n };\n this.maybeNotify = memo(\n () => {\n this.calculateRange();\n return [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ];\n },\n (isScrolling) => {\n this.notify(isScrolling);\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n debug: () => this.options.debug,\n initialDeps: [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ]\n }\n );\n this.cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d());\n this.unsubs = [];\n this.observer.disconnect();\n if (this.rafId != null && this.targetWindow) {\n this.targetWindow.cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.scrollState = null;\n this.scrollElement = null;\n this.targetWindow = null;\n };\n this._didMount = () => {\n return () => {\n this.cleanup();\n };\n };\n this._willUpdate = () => {\n var _a;\n const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n if (this.scrollElement !== scrollElement) {\n this.cleanup();\n if (!scrollElement) {\n this.maybeNotify();\n return;\n }\n this.scrollElement = scrollElement;\n if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n } else {\n this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n }\n this.elementsCache.forEach((cached) => {\n this.observer.observe(cached);\n });\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect;\n this.maybeNotify();\n })\n );\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset, isScrolling) => {\n if (this._intendedScrollOffset !== null && Math.abs(offset - this._intendedScrollOffset) < 1.5) {\n offset = this._intendedScrollOffset;\n }\n this._intendedScrollOffset = null;\n this.scrollAdjustments = 0;\n this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? \"forward\" : \"backward\" : null;\n this.scrollOffset = offset;\n this.isScrolling = isScrolling;\n this._flushIosDeferredIfReady();\n if (this.scrollState) {\n this.scheduleScrollReconcile();\n }\n this.maybeNotify();\n })\n );\n if (\"addEventListener\" in this.scrollElement) {\n const scrollEl = this.scrollElement;\n const onTouchStart = () => {\n this._iosTouching = true;\n this._iosJustTouchEnded = false;\n if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n this._iosTouchEndTimerId = null;\n }\n };\n const onTouchEnd = () => {\n this._iosTouching = false;\n if (!isIOSWebKit() || this.targetWindow == null) {\n return;\n }\n this._iosJustTouchEnded = true;\n this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => {\n this._iosJustTouchEnded = false;\n this._iosTouchEndTimerId = null;\n this._flushIosDeferredIfReady();\n }, 150);\n };\n scrollEl.addEventListener(\n \"touchstart\",\n onTouchStart,\n addEventListenerOptions\n );\n scrollEl.addEventListener(\n \"touchend\",\n onTouchEnd,\n addEventListenerOptions\n );\n this.unsubs.push(() => {\n scrollEl.removeEventListener(\"touchstart\", onTouchStart);\n scrollEl.removeEventListener(\"touchend\", onTouchEnd);\n if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n this._iosTouchEndTimerId = null;\n }\n });\n }\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n }\n const anchor = this.pendingScrollAnchor;\n this.pendingScrollAnchor = null;\n if (anchor && this.scrollElement && this.options.enabled) {\n const [key, _offset, followOnAppend, anchorDelta] = anchor;\n if (key !== null && !followOnAppend) {\n if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n if (anchorDelta !== 0) {\n this._iosDeferredAdjustment += anchorDelta;\n }\n } else {\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n }\n }\n if (followOnAppend) {\n this.scrollToEnd({ behavior: followOnAppend });\n }\n }\n };\n this._flushIosDeferredIfReady = () => {\n if (this._iosDeferredAdjustment === 0) return;\n if (this.isScrolling) return;\n if (this._iosTouching) return;\n if (this._iosJustTouchEnded) return;\n const cur = this.getScrollOffset();\n const max = this.getMaxScrollOffset();\n if (cur < 0 || cur > max) return;\n const delta = this._iosDeferredAdjustment;\n this._iosDeferredAdjustment = 0;\n this._scrollToOffset(cur, {\n adjustments: this.scrollAdjustments += delta,\n behavior: void 0\n });\n };\n this.rafId = null;\n this.getSize = () => {\n if (!this.options.enabled) {\n this.scrollRect = null;\n return 0;\n }\n this.scrollRect = this.scrollRect ?? this.options.initialRect;\n return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n };\n this.getScrollOffset = () => {\n if (!this.options.enabled) {\n this.scrollOffset = null;\n return 0;\n }\n this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n return this.scrollOffset;\n };\n this.getFurthestMeasurement = (measurements, index) => {\n const furthestMeasurementsFound = /* @__PURE__ */ new Map();\n const furthestMeasurements = /* @__PURE__ */ new Map();\n for (let m = index - 1; m >= 0; m--) {\n const measurement = measurements[m];\n if (furthestMeasurementsFound.has(measurement.lane)) {\n continue;\n }\n const previousFurthestMeasurement = furthestMeasurements.get(\n measurement.lane\n );\n if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {\n furthestMeasurements.set(measurement.lane, measurement);\n } else if (measurement.end < previousFurthestMeasurement.end) {\n furthestMeasurementsFound.set(measurement.lane, true);\n }\n if (furthestMeasurementsFound.size === this.options.lanes) {\n break;\n }\n }\n return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {\n if (a.end === b.end) {\n return a.index - b.index;\n }\n return a.end - b.end;\n })[0] : void 0;\n };\n this.getMeasurementOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.options.enabled,\n this.options.lanes,\n this.options.laneAssignmentMode\n ],\n (count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode) => {\n const lanesChanged = this.prevLanes !== void 0 && this.prevLanes !== lanes;\n if (lanesChanged) {\n this.lanesChangedFlag = true;\n }\n this.prevLanes = lanes;\n this.pendingMin = null;\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode\n };\n },\n {\n key: false\n }\n );\n this.getMeasurements = memo(\n () => [this.getMeasurementOptions(), this.itemSizeCacheVersion],\n ({\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode\n }, _itemSizeCacheVersion) => {\n const itemSizeCache = this.itemSizeCache;\n if (!enabled) {\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n return [];\n }\n if (this.laneAssignments.size > count) {\n for (const index of this.laneAssignments.keys()) {\n if (index >= count) {\n this.laneAssignments.delete(index);\n }\n }\n }\n if (this.lanesChangedFlag) {\n this.lanesChangedFlag = false;\n this.lanesSettling = true;\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.pendingMin = null;\n }\n if (this.measurementsCache.length === 0 && !this.lanesSettling) {\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size);\n });\n }\n const min = this.lanesSettling ? 0 : this.pendingMin ?? 0;\n this.pendingMin = null;\n if (this.lanesSettling && this.measurementsCache.length === count) {\n this.lanesSettling = false;\n }\n if (lanes === 1) {\n const gap = this.options.gap;\n const need = count * 2;\n let flat = this._flatMeasurements;\n if (!flat || flat.length < need) {\n const next = new Float64Array(need);\n if (flat && min > 0) next.set(flat.subarray(0, min * 2));\n flat = next;\n this._flatMeasurements = flat;\n }\n let runningStart;\n if (min === 0) {\n runningStart = paddingStart + scrollMargin;\n } else {\n const prevIdx = min - 1;\n runningStart = flat[prevIdx * 2] + flat[prevIdx * 2 + 1] + gap;\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n flat[i * 2] = runningStart;\n flat[i * 2 + 1] = size;\n runningStart += size + gap;\n }\n const view = createLazyMeasurementsView(count, flat, getItemKey);\n this.measurementsCache = view;\n return view;\n }\n const measurements = this.measurementsCache.slice(0, min);\n const laneLastIndex = new Array(lanes).fill(\n void 0\n );\n for (let m = 0; m < min; m++) {\n const item = measurements[m];\n if (item) {\n laneLastIndex[item.lane] = m;\n }\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const cachedLane = this.laneAssignments.get(i);\n let lane;\n let start;\n const shouldCacheLane = laneAssignmentMode === \"estimate\" || itemSizeCache.has(key);\n if (cachedLane !== void 0 && this.options.lanes > 1) {\n lane = cachedLane;\n const prevIndex = laneLastIndex[lane];\n const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;\n start = prevInLane ? prevInLane.end + this.options.gap : paddingStart + scrollMargin;\n } else {\n const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);\n start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;\n lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;\n if (this.options.lanes > 1 && shouldCacheLane) {\n this.laneAssignments.set(i, lane);\n }\n }\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n const end = start + size;\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane\n };\n laneLastIndex[lane] = i;\n }\n this.measurementsCache = measurements;\n return measurements;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n debug: () => this.options.debug\n }\n );\n this.calculateRange = memo(\n () => [\n this.getMeasurements(),\n this.getSize(),\n this.getScrollOffset(),\n this.options.lanes\n ],\n (measurements, outerSize, scrollOffset, lanes) => {\n return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes,\n // Pass the typed array so binary search + forward-walk can\n // read start/end directly from Float64Array, skipping the\n // Proxy traps that materialize a full VirtualItem per probe.\n flat: lanes === 1 && this._flatMeasurements != null ? this._flatMeasurements : null\n }) : null;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualIndexes = memo(\n () => {\n let startIndex = null;\n let endIndex = null;\n const range = this.calculateRange();\n if (range) {\n startIndex = range.startIndex;\n endIndex = range.endIndex;\n }\n this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);\n return [\n this.options.rangeExtractor,\n this.options.overscan,\n this.options.count,\n startIndex,\n endIndex\n ];\n },\n (rangeExtractor, overscan, count, startIndex, endIndex) => {\n return startIndex === null || endIndex === null ? [] : rangeExtractor({\n startIndex,\n endIndex,\n overscan,\n count\n });\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n debug: () => this.options.debug\n }\n );\n this.indexFromElement = (node) => {\n const attributeName = this.options.indexAttribute;\n const indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`\n );\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this.shouldMeasureDuringScroll = (index) => {\n var _a;\n if (!this.scrollState || this.scrollState.behavior !== \"smooth\") {\n return true;\n }\n const scrollIndex = this.scrollState.index ?? ((_a = this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)) == null ? void 0 : _a.index);\n if (scrollIndex !== void 0 && this.range) {\n const bufferSize = Math.max(\n this.options.overscan,\n Math.ceil((this.range.endIndex - this.range.startIndex) / 2)\n );\n const minIndex = Math.max(0, scrollIndex - bufferSize);\n const maxIndex = Math.min(\n this.options.count - 1,\n scrollIndex + bufferSize\n );\n return index >= minIndex && index <= maxIndex;\n }\n return true;\n };\n this.measureElement = (node) => {\n if (!node) {\n this.elementsCache.forEach((cached, key2) => {\n if (!cached.isConnected) {\n this.observer.unobserve(cached);\n this.elementsCache.delete(key2);\n }\n });\n return;\n }\n const index = this.indexFromElement(node);\n const key = this.options.getItemKey(index);\n const prevNode = this.elementsCache.get(key);\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode);\n }\n this.observer.observe(node);\n this.elementsCache.set(key, node);\n }\n if ((!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(index, this.options.measureElement(node, void 0, this));\n }\n };\n this.resizeItem = (index, size) => {\n var _a, _b;\n if (index < 0 || index >= this.options.count) return;\n let cachedSize;\n let itemStart;\n let key;\n const flat = this._flatMeasurements;\n if (this.options.lanes === 1 && flat !== null) {\n key = this.options.getItemKey(index);\n itemStart = flat[index * 2];\n cachedSize = flat[index * 2 + 1];\n } else {\n const item = this.measurementsCache[index];\n if (!item) return;\n key = item.key;\n itemStart = item.start;\n cachedSize = item.size;\n }\n const itemSize = this.itemSizeCache.get(key) ?? cachedSize;\n const delta = size - itemSize;\n if (delta !== 0) {\n const wasAtEnd = this.options.anchorTo === \"end\" && ((_a = this.scrollState) == null ? void 0 : _a.behavior) !== \"smooth\" && this.getVirtualDistanceFromEnd() <= this.options.scrollEndThreshold;\n const prevTotalSize = wasAtEnd ? this.getTotalSize() : 0;\n const shouldAdjustScroll = ((_b = this.scrollState) == null ? void 0 : _b.behavior) !== \"smooth\" && (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(\n // The callback expects a VirtualItem; build one lazily only\n // when the consumer actually supplied a custom predicate.\n this.measurementsCache[index] ?? {\n index,\n key,\n start: itemStart,\n size: cachedSize,\n end: itemStart + cachedSize,\n lane: 0\n },\n delta,\n this\n ) : (\n // Default: adjust when the resize is an above-viewport item.\n // First measurement (!has(key)): always adjust — the item\n // has never been sized, so the estimate→actual delta must\n // be compensated regardless of scroll direction.\n // Re-measurement (has(key)): skip during backward scroll\n // to avoid the \"items jump while scrolling up\" cascade.\n itemStart < this.getScrollOffset() + this.scrollAdjustments && (!this.itemSizeCache.has(key) || this.scrollDirection !== \"backward\")\n ));\n if (this.pendingMin === null || index < this.pendingMin) {\n this.pendingMin = index;\n }\n this.itemSizeCache.set(key, size);\n this.itemSizeCacheVersion++;\n if (wasAtEnd) {\n this.applyScrollAdjustment(this.getTotalSize() - prevTotalSize);\n } else if (shouldAdjustScroll) {\n this.applyScrollAdjustment(delta);\n }\n this.notify(false);\n }\n };\n this.getVirtualItems = memo(\n () => [this.getVirtualIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems = [];\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k];\n const measurement = measurements[i];\n virtualItems.push(measurement);\n }\n return virtualItems;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualItemForOffset = (offset) => {\n const measurements = this.getMeasurements();\n if (measurements.length === 0) {\n return void 0;\n }\n const flat = this._flatMeasurements;\n const useFlat = this.options.lanes === 1 && flat != null;\n const idx = findNearestBinarySearch(\n 0,\n measurements.length - 1,\n useFlat ? (i) => flat[i * 2] : (i) => notUndefined(measurements[i]).start,\n offset\n );\n return notUndefined(measurements[idx]);\n };\n this.getMaxScrollOffset = () => {\n if (!this.scrollElement) return 0;\n if (\"scrollHeight\" in this.scrollElement) {\n return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight;\n } else {\n const doc = this.scrollElement.document.documentElement;\n return this.options.horizontal ? doc.scrollWidth - this.scrollElement.innerWidth : doc.scrollHeight - this.scrollElement.innerHeight;\n }\n };\n this.getVirtualDistanceFromEnd = () => {\n return Math.max(\n this.getTotalSize() - this.getSize() - this.getScrollOffset(),\n 0\n );\n };\n this.getDistanceFromEnd = () => {\n return Math.max(this.getMaxScrollOffset() - this.getScrollOffset(), 0);\n };\n this.isAtEnd = (threshold = this.options.scrollEndThreshold) => {\n return this.getDistanceFromEnd() <= threshold;\n };\n this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {\n if (!this.scrollElement) return 0;\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n align = toOffset >= scrollOffset + size ? \"end\" : \"start\";\n }\n if (align === \"center\") {\n toOffset += (itemSize - size) / 2;\n } else if (align === \"end\") {\n toOffset -= size;\n }\n const maxOffset = this.getMaxScrollOffset();\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = (index, align = \"auto\") => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n const item = this.measurementsCache[index];\n if (!item) return;\n if (align === \"auto\") {\n if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n align = \"end\";\n } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n align = \"start\";\n } else {\n return [scrollOffset, align];\n }\n }\n if (align === \"end\" && index === this.options.count - 1) {\n return [this.getMaxScrollOffset(), align];\n }\n const toOffset = align === \"end\" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;\n return [\n this.getOffsetForAlignment(toOffset, align, item.size),\n align\n ];\n };\n this.scrollToOffset = (toOffset, { align = \"start\", behavior = \"auto\" } = {}) => {\n const offset = this.getOffsetForAlignment(toOffset, align);\n const now = this.now();\n this.scrollState = {\n index: null,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollToIndex = (index, {\n align: initialAlign = \"auto\",\n behavior = \"auto\"\n } = {}) => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const offsetInfo = this.getOffsetForIndex(index, initialAlign);\n if (!offsetInfo) {\n return;\n }\n const [offset, align] = offsetInfo;\n const now = this.now();\n this.scrollState = {\n index,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollBy = (delta, { behavior = \"auto\" } = {}) => {\n const offset = this.getScrollOffset() + delta;\n const now = this.now();\n this.scrollState = {\n index: null,\n align: \"start\",\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollToEnd = ({ behavior = \"auto\" } = {}) => {\n if (this.options.count > 0) {\n this.scrollToIndex(this.options.count - 1, {\n align: \"end\",\n behavior\n });\n return;\n }\n this.scrollToOffset(Math.max(this.getTotalSize() - this.getSize(), 0), {\n behavior\n });\n };\n this.getTotalSize = () => {\n var _a;\n const measurements = this.getMeasurements();\n let end;\n if (measurements.length === 0) {\n end = this.options.paddingStart;\n } else if (this.options.lanes === 1) {\n const lastIdx = measurements.length - 1;\n const flat = this._flatMeasurements;\n if (flat != null) {\n end = flat[lastIdx * 2] + flat[lastIdx * 2 + 1];\n } else {\n end = ((_a = measurements[lastIdx]) == null ? void 0 : _a.end) ?? 0;\n }\n } else {\n const endByLane = Array(this.options.lanes).fill(null);\n let endIndex = measurements.length - 1;\n while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n const item = measurements[endIndex];\n if (endByLane[item.lane] === null) {\n endByLane[item.lane] = item.end;\n }\n endIndex--;\n }\n end = Math.max(...endByLane.filter((val) => val !== null));\n }\n return Math.max(\n end - this.options.scrollMargin + this.options.paddingEnd,\n 0\n );\n };\n this.takeSnapshot = () => {\n const snapshot = [];\n if (this.itemSizeCache.size === 0) return snapshot;\n const m = this.getMeasurements();\n for (const item of m) {\n if (item && this.itemSizeCache.has(item.key)) {\n snapshot.push({\n index: item.index,\n key: item.key,\n start: item.start,\n size: item.size,\n end: item.end,\n lane: item.lane\n });\n }\n }\n return snapshot;\n };\n this._scrollToOffset = (offset, {\n adjustments,\n behavior\n }) => {\n this._intendedScrollOffset = offset + (adjustments ?? 0);\n this.options.scrollToFn(offset, { behavior, adjustments }, this);\n };\n this.measure = () => {\n this.pendingMin = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.itemSizeCacheVersion++;\n this.notify(false);\n };\n this.setOptions(opts);\n }\n applyScrollAdjustment(delta, behavior) {\n if (delta === 0) return;\n if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n console.info(\"correction\", delta);\n }\n if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n this._iosDeferredAdjustment += delta;\n } else {\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: this.scrollAdjustments += delta,\n behavior\n });\n }\n }\n scheduleScrollReconcile() {\n if (!this.targetWindow) {\n this.scrollState = null;\n return;\n }\n if (this.rafId != null) return;\n this.rafId = this.targetWindow.requestAnimationFrame(() => {\n this.rafId = null;\n this.reconcileScroll();\n });\n }\n reconcileScroll() {\n if (!this.scrollState) return;\n const el = this.scrollElement;\n if (!el) return;\n const MAX_RECONCILE_MS = 5e3;\n if (this.now() - this.scrollState.startedAt > MAX_RECONCILE_MS) {\n this.scrollState = null;\n return;\n }\n const offsetInfo = this.scrollState.index != null ? this.getOffsetForIndex(this.scrollState.index, this.scrollState.align) : void 0;\n const targetOffset = offsetInfo ? offsetInfo[0] : this.scrollState.lastTargetOffset;\n const STABLE_FRAMES = 1;\n const targetChanged = targetOffset !== this.scrollState.lastTargetOffset;\n if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {\n this.scrollState.stableFrames++;\n if (this.scrollState.stableFrames >= STABLE_FRAMES) {\n if (this.getScrollOffset() !== targetOffset) {\n this._scrollToOffset(targetOffset, {\n adjustments: void 0,\n behavior: \"auto\"\n });\n }\n this.scrollState = null;\n return;\n }\n } else {\n this.scrollState.stableFrames = 0;\n if (targetChanged) {\n const viewport = this.getSize() || 600;\n const distance = Math.abs(targetOffset - this.getScrollOffset());\n const keepSmooth = this.scrollState.behavior === \"smooth\" && distance > viewport;\n this.scrollState.lastTargetOffset = targetOffset;\n if (!keepSmooth) {\n this.scrollState.behavior = \"auto\";\n }\n this._scrollToOffset(targetOffset, {\n adjustments: void 0,\n behavior: keepSmooth ? \"smooth\" : \"auto\"\n });\n }\n }\n this.scheduleScrollReconcile();\n }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes,\n flat\n}) {\n const lastIndex = measurements.length - 1;\n const getStart = flat ? (index) => flat[index * 2] : (index) => measurements[index].start;\n const getEnd = flat ? (index) => flat[index * 2] + flat[index * 2 + 1] : (index) => measurements[index].end;\n if (measurements.length <= lanes) {\n return {\n startIndex: 0,\n endIndex: lastIndex\n };\n }\n let startIndex = findNearestBinarySearch(0, lastIndex, getStart, scrollOffset);\n let endIndex = startIndex;\n if (lanes === 1) {\n while (endIndex < lastIndex && getEnd(endIndex) < scrollOffset + outerSize) {\n endIndex++;\n }\n } else if (lanes > 1) {\n const endPerLane = Array(lanes).fill(0);\n while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {\n const item = measurements[endIndex];\n endPerLane[item.lane] = item.end;\n endIndex++;\n }\n const startPerLane = Array(lanes).fill(scrollOffset + outerSize);\n while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n const item = measurements[startIndex];\n startPerLane[item.lane] = item.start;\n startIndex--;\n }\n startIndex = Math.max(0, startIndex - startIndex % lanes);\n endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));\n }\n return { startIndex, endIndex };\n}\nexport {\n Virtualizer,\n _resetIOSDetectionForTests,\n approxEqual,\n debounce,\n defaultKeyExtractor,\n defaultRangeExtractor,\n elementScroll,\n measureElement,\n memo,\n notUndefined,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n windowScroll\n};\n//# sourceMappingURL=index.js.map\n","function createLazyMeasurementsView(count, flat, getItemKey) {\n const cache = new Array(count);\n return new Proxy(cache, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\") {\n const c = prop.charCodeAt(0);\n if (c >= 48 && c <= 57) {\n const i = +prop;\n if (Number.isInteger(i) && i >= 0 && i < count) {\n let v = target[i];\n if (!v) {\n const s = flat[i * 2];\n v = target[i] = {\n index: i,\n key: getItemKey(i),\n start: s,\n size: flat[i * 2 + 1],\n end: s + flat[i * 2 + 1],\n lane: 0\n };\n }\n return v;\n }\n }\n if (prop === \"length\") return count;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nexport {\n createLazyMeasurementsView\n};\n//# sourceMappingURL=lazy-measurements.js.map\n","import { elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect, Virtualizer } from \"@tanstack/virtual-core\";\nclass VirtualizerControllerBase {\n constructor(host, options) {\n this.cleanup = () => {\n };\n const resolvedOptions = {\n ...options,\n onChange: (instance, sync) => {\n var _a;\n this.host.updateComplete.then(() => this.host.requestUpdate());\n (_a = options.onChange) == null ? void 0 : _a.call(options, instance, sync);\n }\n };\n this.virtualizer = new Virtualizer(resolvedOptions);\n (this.host = host).addController(this);\n }\n getVirtualizer() {\n return this.virtualizer;\n }\n hostConnected() {\n this.cleanup = this.virtualizer._didMount();\n }\n hostUpdated() {\n this.virtualizer._willUpdate();\n }\n hostDisconnected() {\n this.cleanup();\n }\n}\nclass VirtualizerController extends VirtualizerControllerBase {\n constructor(host, options) {\n super(host, {\n observeElementRect,\n observeElementOffset,\n scrollToFn: elementScroll,\n ...options\n });\n }\n}\nclass WindowVirtualizerController extends VirtualizerControllerBase {\n constructor(host, options) {\n super(host, {\n getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n ...options\n });\n }\n}\nexport {\n VirtualizerController,\n WindowVirtualizerController\n};\n//# sourceMappingURL=index.js.map\n","import type { VirtualItem } from '@tanstack/virtual-core'\nimport type { CSSResult, PropertyValues, TemplateResult } from 'lit'\nimport * as checkedIcon from '@nordhealth/icons/lib/assets/interface-checked.js'\nimport * as closeIcon from '@nordhealth/icons/lib/assets/interface-close-small.js'\nimport * as dropdownIcon from '@nordhealth/icons/lib/assets/interface-dropdown-small.js'\nimport { VirtualizerController } from '@tanstack/lit-virtual'\nimport { html, isServer, LitElement, nothing, unsafeCSS } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\n\nimport { groupBy } from '../common/collection.js'\nimport { ActiveDescendantController } from '../common/controllers/ActiveDescendantController.js'\nimport { FormDataController } from '../common/controllers/FormDataController.js'\nimport { LightDismissController } from '../common/controllers/LightDismissController.js'\nimport { ResizeController } from '../common/controllers/ResizeController.js'\nimport { StateAttributesController } from '../common/controllers/StateAttributesController.js'\nimport { observe } from '../common/decorators/observe.js'\nimport { cond } from '../common/directives/cond.js'\nimport { NordEvent } from '../common/events.js'\nimport { AutocompleteMixin } from '../common/mixins/AutocompleteMixin.js'\nimport { DraftComponentMixin } from '../common/mixins/DraftComponentMixin.js'\nimport { FieldControlMixin } from '../common/mixins/FieldControlMixin.js'\nimport { FloatingMixin } from '../common/mixins/FloatingComponentMixin.js'\nimport { InputMixin } from '../common/mixins/InputMixin.js'\nimport { SizeMixin } from '../common/mixins/SizeMixin.js'\nimport Icon from '../icon/Icon.js'\nimport { LocalizeController } from '../localization/LocalizeController.js'\nimport '../popout/Popout.js'\nimport '../spinner/Spinner.js'\n\nIcon.registerIcon(checkedIcon)\nIcon.registerIcon(closeIcon)\nIcon.registerIcon(dropdownIcon)\n\n/** Per-instance counter so light-DOM ids (`aria-activedescendant`, etc.) stay unique. */\nlet comboboxCount = 1\n\n/** Format a measured pixel size for a custom property (undefined → unset). */\nconst px = (value?: number) => (value ? `${value}px` : undefined)\n\n/**\n * A single option in a combobox.\n */\nexport interface ComboboxOption {\n /** The value submitted with the form and tracked in `value`. */\n value: string\n /** The human-readable text shown in the list and the input. */\n label: string\n /** Optional group heading used to cluster related options together. */\n group?: string\n /** When `true`, the option cannot be selected. */\n disabled?: boolean\n /** Optional rich HTML rendered instead of the plain `label` text. */\n html?: string\n /** Arbitrary data attached to the option, passed back to `renderOption`. */\n [key: string]: unknown\n}\n\n/**\n * Re-prefixes an authored, tag-scoped stylesheet for another tag name so a\n * sibling light-DOM component (e.g. `nord-autocomplete`) can reuse the exact\n * same `.n-*` rules without duplicating them. `Combobox.css` is the single\n * source of truth; this swaps the top-level `nord-combobox` selector token.\n */\nexport function retagComboboxStyles(styles: CSSResult, tag: string): CSSResult {\n // The stylesheet is imported via the lit-css transform (a `CSSResult`); reading\n // `cssText` and re-wrapping the tag-swapped text keeps the rules authored once.\n return unsafeCSS(styles.cssText.replace(/nord-combobox/g, tag))\n}\n\n/**\n * `ComboboxBase` is the (unregistered) shared base for `nord-combobox` (pick an\n * option, or several) and `nord-autocomplete` (free-text input with suggestions\n * where the typed text is the value). It owns every piece of the dropdown that\n * the two share — options, filtering, virtualization, keyboard navigation, the\n * popout, light-dismiss, ARIA wiring and rendering — and exposes a set of\n * protected hooks for the handful of behaviours that differ between a select and\n * a free-text control.\n *\n * Base UI parity: Autocomplete is the Combobox primitive with\n * `selectionMode=\"none\"` + `fillInputOnItemPress`.\n *\n * Subclasses MUST `injectLightDomStyles(this, <their stylesheet>)` in\n * `connectedCallback` (the base does not import a stylesheet, since the rules are\n * tag-scoped and each tag needs its own copy — see `retagComboboxStyles`).\n *\n * Not a registered custom element: it has no `@customElement` decorator and no\n * tag name, so the manifest config marks it `internal` and the React/Vue type\n * generators skip it.\n */\nexport default abstract class ComboboxBase extends DraftComponentMixin(\n SizeMixin(AutocompleteMixin(FieldControlMixin(InputMixin(FloatingMixin(LitElement))))),\n) {\n /** Stable, unique id base for the light-DOM ARIA wiring of this instance. */\n private comboboxId = `${this.localName || 'nord-combobox'}-${comboboxCount++}`\n\n // The built-in `<label for>` (from FieldControlMixin) must point at the real\n // focusable input, so override the mixin's default id with the input's id.\n protected override inputId = `${this.comboboxId}-input`\n\n protected inputRef = createRef<HTMLInputElement>()\n\n // Both variants widen `value` beyond the controller's `InputMixinInterface`\n // host type. The controller only reads `form`/`name`/`disabled` and the\n // `value()` option (not `host.value`), so casting the host is safe.\n private formData = new FormDataController(this as ComboboxBase & { value: string }, {\n value: () => this.formValue,\n })\n\n /**\n * Remembers value→label pairs seen from any option so a preselected value\n * that has since left the loaded options still renders its label.\n */\n protected labelCache = new Map<string, string>()\n\n protected localize = new LocalizeController<'nord-combobox'>(this)\n\n /** Re-renders when the host's forwarded ARIA labelling attributes change. */\n private ariaObserver?: MutationObserver\n\n private widthObserver?: ResizeObserver\n\n @query('nord-popout', true) private popout?: HTMLElement & {\n show: () => Promise<unknown>\n hide: (moveFocusToButton?: boolean) => Promise<unknown>\n }\n\n private dismiss = new LightDismissController(this, {\n isOpen: () => this.open,\n onDismiss: () => this.hide(),\n isDismissible: node => node !== this,\n })\n\n /**\n * Reflects the control's state to Base-UI-style `data-*` attributes\n * (`data-invalid`, `data-focused`) so consumers can style the whole control.\n * `trackFocus` keeps `data-focused` present while focus stays within the host\n * — e.g. moving between the input and the clear button.\n */\n private stateAttributes = new StateAttributesController(\n this,\n () => ({ invalid: this.invalid }),\n { trackFocus: true },\n )\n\n /**\n * The options to show in the combobox.\n */\n @property({ attribute: false }) options: ComboboxOption[] = []\n\n /**\n * Placeholder text to display within the input.\n */\n @property({ reflect: true }) placeholder?: string\n\n /**\n * Use external filtering mode. When set to `true`, the component will not\n * perform internal text-based filtering and expects the consumer to update\n * the `options` in response to the `input` event.\n */\n @property({ reflect: true, type: Boolean, attribute: 'external-filtering' }) externalFiltering = false\n\n /**\n * Shows a spinner in the control and listbox while asynchronous results are\n * loading. Pair with `external-filtering` for async search.\n */\n @property({ reflect: true, type: Boolean }) loading = false\n\n /**\n * Highlights the first option after filtering so pressing Enter selects it.\n */\n @property({ reflect: true, type: Boolean, attribute: 'auto-highlight' }) autoHighlight = false\n\n /**\n * Marks the control as invalid, applying error styling and setting\n * `aria-invalid` on the input.\n */\n @property({ reflect: true, type: Boolean }) invalid = false\n\n // The control's own invalid state for the field context: its `invalid` prop or\n // a built-in `error` (when used standalone).\n protected override get ownInvalid() {\n return this.invalid || super.ownInvalid\n }\n\n /**\n * Marks the control read-only: the value stays visible, focusable and\n * submitted with the form, but the listbox can't be opened and the value can't\n * be changed (no typing, navigation, selection or clearing). Unlike `disabled`,\n * a read-only control still participates in form submission.\n */\n @property({ reflect: true, type: Boolean }) readonly = false\n\n /**\n * Whether clicking the input opens the listbox. Defaults to `true`. Set to\n * `false` to only open on typing or a trigger (chevron) click. Focusing the\n * input (e.g. tabbing in) never opens the list on its own. Mirrors Base UI's\n * `openOnInputClick`.\n */\n @property({ reflect: true, type: Boolean, attribute: 'open-on-input-click' }) openOnInputClick = true\n\n /**\n * Message shown when no options match the query. Defaults to \"No items found.\".\n */\n @property({ reflect: true, attribute: 'no-results-text' }) noResultsText?: string\n\n /**\n * Virtualizes (windows) the option list so only the rows in view are rendered,\n * keeping very large lists (thousands of options) fast. Rows are assumed to be a\n * uniform height, which is measured from the first option. Virtualization is\n * skipped for grouped lists, whose labels and separators break that assumption —\n * grouped lists are expected to be short and curated.\n */\n @property({ reflect: true, type: Boolean }) virtualized = false\n\n /**\n * Custom renderer for the content of each option. Receives the option and\n * should return a Lit `TemplateResult` or a string. When omitted, the\n * option's `html` (if present) or `label` is rendered.\n */\n @property({ attribute: false }) renderOption?: (option: ComboboxOption) => TemplateResult | string\n\n /** The current search query in the combobox input. */\n @state() protected search = ''\n\n /**\n * Whether the user has actually typed into the input since it was last\n * opened/committed. Until they do, a single-select shows the committed\n * selection's label in the input (editable) rather than an empty filter —\n * matching Base UI, where reopening keeps the selected label visible and the\n * list unfiltered until the first keystroke. Set on typing; cleared on commit\n * and on close.\n */\n @state() protected queryDirty = false\n\n /**\n * Tracks the active (highlighted) row of the virtual-focus listbox: the focus\n * stays on the input while this roams the rows and surfaces as\n * `aria-activedescendant`. Owns the wrap / skip-disabled / move math the\n * combobox previously duplicated. The out-of-range create row (index ===\n * `filteredOptions.length`) reports as enabled (`filteredOptions[i]` is\n * `undefined`, so `!undefined?.disabled` is `true`) and maps to its create-row\n * id, matching the create-row semantics.\n */\n protected activeDescendant = new ActiveDescendantController(this, {\n count: () => this.rowCount,\n isEnabled: i => !this.filteredOptions[i]?.disabled,\n optionId: i =>\n this.createIndex !== -1 && i === this.createIndex ? this.createId : this.optionId(i),\n })\n\n /** The scroll container for the options; the virtualizer's scroll element. */\n @query('.n-listbox') private listboxEl?: HTMLElement\n\n /**\n * Containers for the `start`/`end` slot content. The control renders into the\n * light DOM, so real `<slot>` elements don't project; instead these act as\n * landing zones and the matching host children (`slot=\"start\"`/`slot=\"end\"`)\n * are relocated into them. A `ResizeController` per zone feeds the measured\n * inline size into a custom property so the input padding can clear the slot\n * (mirrors `nord-input`).\n */\n @query('.n-slot-start') private startSlot?: HTMLElement\n @query('.n-slot-end') private endSlot?: HTMLElement\n private startObserver = new ResizeController(this, () => this.startSlot as HTMLElement)\n private endObserver = new ResizeController(this, () => this.endSlot as HTMLElement)\n\n /** Re-renders when the host's `slot=\"start\"`/`slot=\"end\"` children change. */\n private slotObserver?: MutationObserver\n\n /** Set when a keyboard move should scroll the active option into view. */\n protected scrollActivePending = false\n\n /** Row-height estimate used until the uniform row height is measured once. */\n private static readonly VIRTUAL_ROW_ESTIMATE = 36\n\n /** Extra rows rendered above and below the viewport to smooth scrolling. */\n private static readonly VIRTUAL_OVERSCAN = 6\n\n /**\n * The measured uniform row height, sampled once from the first rendered row.\n * Option rows are a fixed height, so a single sample feeds `estimateSize` for\n * the whole list — far cheaper and more stable than re-measuring every row on\n * every render, which fed a `measure → onChange → re-render → measure` loop\n * that could peg the main thread.\n */\n private measuredRowSize?: number\n\n /**\n * Windows the flat option list (see `virtualized`) with TanStack Virtual: only\n * the rows in view are rendered, sized from the measured uniform row height,\n * and the active option is kept on-screen via `scrollToIndex`. Its `onChange`\n * re-renders the host on scroll/resize; `count` is kept in sync in `willUpdate`.\n */\n private virtualizer = new VirtualizerController<HTMLElement, HTMLElement>(this, {\n count: 0,\n overscan: ComboboxBase.VIRTUAL_OVERSCAN,\n estimateSize: () => this.measuredRowSize ?? ComboboxBase.VIRTUAL_ROW_ESTIMATE,\n getScrollElement: () => this.listboxEl ?? null,\n getItemKey: index => this.filteredOptions[index]?.value ?? index,\n })\n\n /**\n * Whether the user has moved the active option with the keyboard since the\n * last filter change. Used to decide if a bare Enter (no navigation) selects\n * the highlighted option — only when `autoHighlight` is set, the first option\n * becomes implicitly selectable.\n */\n protected navigated = false\n\n // ---------------------------------------------------------------------------\n // Variant hooks — overridable behaviour that distinguishes the select combobox\n // from the free-text autocomplete. Sensible defaults make the base behave as a\n // single-select combobox out of the box.\n // ---------------------------------------------------------------------------\n\n /**\n * Whether the input currently shows the transient query rather than the\n * committed selection's label. A single-select shows the query only once the\n * user starts typing (`queryDirty`); until then — including right after\n * reopening — the input keeps the selected option's label visible and\n * editable, matching Base UI. `multiple` shows the query always (the\n * selections live in chips, not the input).\n */\n protected get showsQueryInInput(): boolean {\n return this.queryDirty\n }\n\n /** The text shown in the input. Select: query while open, label when closed. */\n protected get displayValue(): string {\n // While the query is shown the input is a filter; otherwise it shows the\n // selected option's label.\n if (this.showsQueryInInput) {\n return this.search\n }\n\n if (!this.value || Array.isArray(this.value)) {\n return ''\n }\n\n return this.labelFor(this.value)\n }\n\n /** The placeholder forwarded to the inner input. */\n protected get inputPlaceholder(): string | undefined {\n return this.placeholder\n }\n\n /** The transient search text the list is filtered against. */\n protected get filterQuery(): string {\n return this.search\n }\n\n /** Whether an option is selected (drives `aria-selected` and the check icon). */\n protected isSelected(option: ComboboxOption): boolean {\n return this.values.includes(option.value)\n }\n\n /** Serialises `value` for the form. */\n protected get formValue(): string | undefined {\n const { value } = this\n\n if (Array.isArray(value)) {\n return value.length ? value.join(',') : undefined\n }\n\n return value || undefined\n }\n\n /** Whether there is any committed value (drives the clear affordance). */\n protected get hasValue(): boolean {\n return this.values.length > 0\n }\n\n /** The index of the create row, or `-1` when it isn't shown. Select-only. */\n protected get createIndex(): number {\n return -1\n }\n\n /** Whether the \"Create\" affordance should be offered for the current query. */\n protected get canCreate(): boolean {\n return false\n }\n\n /** Leading content inside the control (e.g. chips). None by default. */\n protected renderLeadingControl(): unknown {\n return nothing\n }\n\n /** The `aria-autocomplete` value for the inner input. */\n protected get ariaAutocomplete(): string {\n return 'list'\n }\n\n /** Commit the active option. Select: set value, close, restore focus. */\n protected selectOption(option: ComboboxOption): void {\n if (option.disabled) {\n return\n }\n\n // Remember the label so it survives the option leaving the result set.\n this.labelCache.set(option.value, option.label)\n\n this.value = option.value\n this.search = ''\n this.queryDirty = false\n this.commit()\n this.hide()\n // Restore focus to the input. Focus alone never opens the listbox, so no\n // guard is needed here.\n this.focus()\n }\n\n /**\n * Hook for the Enter key when the listbox is open and the create/option\n * branches have not handled it. Default: no-op (the base handles option\n * selection in `handleKeydown`). Subclasses (autocomplete) return `true` to\n * signal they fully handled Enter.\n */\n protected handleEnter(_e: KeyboardEvent): boolean {\n return false\n }\n\n /** Hook invoked when a key is pressed (before the switch). Autocomplete uses it. */\n protected onKeydown(_e: KeyboardEvent): void {}\n\n /** Hook invoked on input blur. Autocomplete reverts inline ghosts here. */\n protected onBlur(): void {}\n\n /** Hook invoked after each render (for inline-ghost selection, etc.). */\n protected afterUpdate(): void {}\n\n /** Hook invoked when the pointer hovers an option (autocomplete clears ghost state). */\n protected onOptionHover(): void {}\n\n /** Hook invoked when ArrowUp/ArrowDown moves the active option. */\n protected onMove(): void {}\n\n // ---------------------------------------------------------------------------\n\n /** Normalises `value` to an array regardless of single/multiple shape. */\n protected get values(): string[] {\n const { value } = this\n\n if (Array.isArray(value)) {\n return value\n }\n\n return value ? [value] : []\n }\n\n /** Upper bound on the label cache so long async sessions don't grow it forever. */\n private static labelCacheLimit = 500\n\n /** Records value→label pairs so labels survive options leaving the result set. */\n protected cacheLabels(options: ComboboxOption[]) {\n for (const option of options) {\n if (option.value) {\n this.labelCache.set(option.value, option.label)\n }\n }\n\n // Evict the oldest non-selected labels once over the limit (Maps iterate in\n // insertion order); never drop a label that's currently selected.\n if (this.labelCache.size <= ComboboxBase.labelCacheLimit) {\n return\n }\n\n const selected = new Set(this.values)\n for (const key of this.labelCache.keys()) {\n if (this.labelCache.size <= ComboboxBase.labelCacheLimit) {\n break\n }\n if (!selected.has(key)) {\n this.labelCache.delete(key)\n }\n }\n }\n\n /**\n * Memoised filter result. `filteredOptions` is read many times per render (and\n * per keyboard/scroll event via rowCount/activeOption/isVirtual), so the O(n)\n * filter + groupBy must not re-run on every access — that would defeat the\n * point of virtualizing a large list. Recomputed only when the options, the\n * query, or the filtering mode change; the group map is cached alongside.\n */\n private filteredCache?: {\n options: ComboboxOption[]\n query: string\n external: boolean\n result: ComboboxOption[]\n hasGroups: boolean\n groups?: Map<string | undefined, ComboboxOption[]>\n }\n\n /**\n * The options the control filters and renders from. The base uses the\n * `options` property directly; `Combobox` overrides this to merge declarative\n * `<nord-combobox-option>` children and auto-created options.\n */\n protected get resolvedOptions(): ComboboxOption[] {\n return this.options\n }\n\n protected get filtered() {\n const options = this.resolvedOptions\n const query = this.filterQuery\n const external = this.externalFiltering\n const cache = this.filteredCache\n if (cache && cache.options === options && cache.query === query && cache.external === external) {\n return cache\n }\n\n // Labels only change with the options, so re-cache only when those change.\n if (!cache || cache.options !== options) {\n this.cacheLabels(options)\n }\n\n const lower = query.toLocaleLowerCase()\n const matched = external || !query\n ? options\n : options.filter(option => option.label.toLocaleLowerCase().includes(lower))\n\n // Order by group so the flat list used for keyboard navigation (activeIndex,\n // Home/End, aria-activedescendant) matches the grouped display order — else\n // interleaved groups desync the two.\n const hasGroups = matched.some(option => option.group)\n const result = hasGroups\n ? Array.from(groupBy(matched, 'group'), ([, groupOptions]) => groupOptions).flat()\n : matched\n\n this.filteredCache = {\n options,\n query,\n external,\n result,\n hasGroups,\n groups: hasGroups ? groupBy(result, 'group') : undefined,\n }\n return this.filteredCache\n }\n\n /** The options remaining after filtering by the current query. */\n protected get filteredOptions(): ComboboxOption[] {\n return this.filtered.result\n }\n\n /** Total number of keyboard-navigable rows, including the create row. */\n protected get rowCount(): number {\n return this.filteredOptions.length + (this.canCreate ? 1 : 0)\n }\n\n /** The currently active option, used for `aria-activedescendant` and Enter. */\n protected get activeOption(): ComboboxOption | undefined {\n return this.filteredOptions[this.activeDescendant.activeIndex]\n }\n\n /**\n * Whether the option list is currently windowed. Only flat (non-grouped) lists\n * with at least one option are virtualized.\n */\n protected get isVirtual(): boolean {\n if (!this.virtualized) {\n return false\n }\n const { result, hasGroups } = this.filtered\n return result.length > 0 && !hasGroups\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n // An external label (e.g. nord-field-label) names the control by setting\n // `aria-labelledby`/`aria-label` on the host; forward it to the inner input.\n this.ariaObserver ??= new MutationObserver(() => this.requestUpdate())\n this.ariaObserver.observe(this, {\n attributes: true,\n attributeFilter: ['aria-label', 'aria-labelledby'],\n })\n\n // Mirror the control width into a custom property so the dropdown matches it\n // (like the provet combobox), tracking responsive/container resizes.\n this.widthObserver ??= new ResizeObserver(() => this.syncAnchorInlineSize())\n this.widthObserver.observe(this)\n this.syncAnchorInlineSize()\n\n // Watch for `slot=\"start\"`/`slot=\"end\"` children being added or removed so\n // they get relocated into their landing zones on the next render.\n this.slotObserver ??= new MutationObserver(() => this.requestUpdate())\n this.slotObserver.observe(this, { childList: true })\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this.ariaObserver?.disconnect()\n this.ariaObserver = undefined\n this.widthObserver?.disconnect()\n this.widthObserver = undefined\n this.slotObserver?.disconnect()\n this.slotObserver = undefined\n }\n\n /**\n * Relocates the host's `slot=\"start\"`/`slot=\"end\"` children into the matching\n * landing zone inside the control. Only direct host children are considered,\n * and a child already sitting in its zone is left untouched, so repeated\n * updates are idempotent and don't disturb focus or pointer state.\n */\n private relocateSlots() {\n if (isServer) {\n return\n }\n\n const move = (name: 'start' | 'end', target?: HTMLElement) => {\n if (!target) {\n return\n }\n for (const child of Array.from(this.children)) {\n if (child.getAttribute('slot') === name && child.parentElement !== target) {\n target.appendChild(child)\n }\n }\n }\n\n move('start', this.startSlot)\n move('end', this.endSlot)\n }\n\n /** Mirrors the host (control) width into `--_n-combobox-anchor-inline-size`. */\n protected syncAnchorInlineSize() {\n const width = this.offsetWidth\n if (width) {\n this.style.setProperty('--_n-combobox-anchor-inline-size', `${width}px`)\n }\n }\n\n // Render in the light DOM so the control participates in the document tree\n // (form labelling, Tailwind), like the other new Nord components. The UI renders\n // into a layout-transparent (`display: contents`) child wrapper rather than the\n // host itself, so declarative `<nord-combobox-option>` children can live as\n // untouched siblings instead of being wiped by this element's own render.\n protected createRenderRoot() {\n if (isServer) {\n return this\n }\n const root = document.createElement('div')\n root.className = 'n-render-root'\n this.appendChild(root)\n return root\n }\n\n /**\n * Show the listbox programmatically.\n */\n show() {\n if (this.open || this.disabled || this.readonly) {\n return\n }\n\n const notCancelled = this.dispatchEvent(new NordEvent('open', { cancelable: true }))\n\n if (notCancelled) {\n this.open = true\n }\n }\n\n /**\n * Hide the listbox programmatically.\n */\n hide() {\n if (!this.open) {\n return\n }\n\n this.open = false\n\n this.onHide()\n\n this.dispatchEvent(new NordEvent('close'))\n }\n\n /**\n * Hook for what happens to the transient query when the listbox closes.\n * Select mode discards an abandoned filter query so the next open shows the\n * full list and the selected option's label, not the stale search.\n */\n protected onHide() {\n this.search = ''\n // Reopening starts clean: the input shows the committed label again and the\n // list is unfiltered until the user types.\n this.queryDirty = false\n }\n\n /**\n * Focus the control's input.\n */\n focus(options?: FocusOptions) {\n this.inputRef.value?.focus(options)\n }\n\n @observe('open', 'updated')\n protected handleOpenChange() {\n if (this.open) {\n void this.popout?.show()\n this.resetActiveIndex()\n }\n else {\n void this.popout?.hide(false)\n }\n }\n\n /**\n * Disabling the control while the listbox is open must close it. `show()`\n * guards against opening when disabled, but nothing closes an already-open\n * popout when `disabled` flips to `true` at runtime.\n */\n @observe('disabled')\n protected handleDisabledChange() {\n if (this.disabled && this.open) {\n this.hide()\n }\n }\n\n /** Row height changes with the size variant, so re-sample it on the next render. */\n @observe('size')\n protected resetRowSample() {\n this.measuredRowSize = undefined\n }\n\n protected updated(changedProperties: PropertyValues) {\n super.updated(changedProperties)\n\n // Move any `slot=\"start\"`/`slot=\"end\"` host children into their landing\n // zones inside the control. The control is light DOM, so real `<slot>`\n // projection isn't available; relocating keeps the public API identical to\n // `nord-input` (`<nord-icon slot=\"start\">`).\n this.relocateSlots()\n\n // Variant hook (e.g. autocomplete inline-ghost selection) runs first so it\n // can reach into the freshly-rendered input.\n this.afterUpdate()\n\n // Sample the uniform row height once so the virtualizer windows from the real\n // height instead of the estimate (no-op once sampled).\n this.sampleRowSize()\n\n // Scroll the active option into view after a keyboard move (never on hover).\n if (this.scrollActivePending) {\n this.scrollActivePending = false\n this.scrollActiveIntoView()\n }\n }\n\n /** Keeps `count` in sync with the filtered list before each render. */\n protected willUpdate(changed: PropertyValues) {\n super.willUpdate(changed)\n if (this.isVirtual) {\n const v = this.virtualizer.getVirtualizer()\n const count = this.filteredOptions.length\n if (v.options.count !== count) {\n v.setOptions({ ...v.options, count })\n }\n }\n }\n\n /**\n * Keeps the active row visible after a keyboard move. Virtualized option rows\n * ask the virtualizer to scroll the index into view (the row may not be in the\n * DOM yet); the create row and plain lists defer to the browser since their\n * element is always rendered.\n */\n private scrollActiveIntoView() {\n const listbox = this.listboxEl\n if (!listbox) {\n return\n }\n\n const activeIndex = this.activeDescendant.activeIndex\n if (this.isVirtual && activeIndex >= 0 && activeIndex !== this.createIndex) {\n this.virtualizer.getVirtualizer().scrollToIndex(activeIndex, { align: 'auto' })\n return\n }\n\n listbox.querySelector('.n-option.is-active')?.scrollIntoView({ block: 'nearest' })\n }\n\n /** Keeps `open` in sync if the popout closes itself (e.g. light dismiss). */\n private handlePopoutClose(e: Event) {\n // The popout dispatches its own bubbling+composed `close`; stop it at the\n // boundary so the combobox emits exactly one canonical `close` (from `hide`).\n e.stopPropagation()\n\n if (this.open) {\n this.hide()\n }\n }\n\n /** Swallows the popout's own `open` so the combobox emits a single `open`. */\n private handlePopoutOpen(e: Event) {\n e.stopPropagation()\n }\n\n /** Re-clamps the active index so it stays within the navigable rows. */\n @observe('search')\n protected resetActiveIndex() {\n // Start with no active row (-1) so nothing looks selected until the user\n // navigates — matching Base UI, where the first ArrowDown lands on the first\n // row. Two opt-ins pre-highlight a row instead:\n // • `autoHighlight` highlights the first navigable row so a bare Enter commits it.\n // • a `creatable` create row, when it is the only actionable row (no enabled\n // option to choose), so a bare Enter creates the typed value (⏎ Kbd hint).\n if (this.autoHighlight) {\n this.activeDescendant.setActiveIndex(this.activeDescendant.nextEnabledIndex(0, 1))\n }\n else if (this.createIndex !== -1 && this.filteredOptions.every(option => option.disabled)) {\n this.activeDescendant.setActiveIndex(this.createIndex)\n }\n else {\n this.activeDescendant.reset()\n }\n this.navigated = false\n // Re-scroll to the (reset) active option so a fresh filter or reopen starts\n // at the top rather than wherever the list was previously scrolled.\n this.scrollActivePending = true\n }\n\n protected handleInput(e: Event) {\n e.stopPropagation()\n\n if (this.readonly) {\n return\n }\n\n const input = e.target as HTMLInputElement\n this.search = input.value\n // The user is now editing the filter, so the input shows the live query\n // rather than the committed label, and the list filters by it.\n this.queryDirty = true\n\n if (!this.open) {\n this.show()\n }\n\n /** Fired as the user types into the search input. */\n this.dispatchEvent(new NordEvent('input'))\n\n // Variant hook so autocomplete can commit the typed text as the live value.\n this.onInput(input)\n }\n\n /** Hook after the search query updates from typing. Autocomplete commits live. */\n protected onInput(_input: HTMLInputElement): void {}\n\n private handleBlur() {\n this.onBlur()\n }\n\n protected handleKeydown(e: KeyboardEvent) {\n // Read-only locks the value: no opening, navigating, selecting or clearing.\n if (this.readonly) {\n return\n }\n\n this.onKeydown(e)\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n if (!this.open) {\n this.show()\n return\n }\n this.move(1)\n break\n case 'ArrowUp':\n e.preventDefault()\n if (!this.open) {\n this.show()\n return\n }\n this.move(-1)\n break\n case 'End': {\n if (this.open) {\n e.preventDefault()\n if (this.activeDescendant.last()) {\n this.navigated = true\n this.scrollActivePending = true\n }\n }\n break\n }\n case 'Home': {\n if (this.open) {\n e.preventDefault()\n if (this.activeDescendant.first()) {\n this.navigated = true\n this.scrollActivePending = true\n }\n }\n break\n }\n case 'Enter':\n if (!this.open) {\n break\n }\n // Let a variant fully own Enter (autocomplete commits free text / fills).\n if (this.handleEnter(e)) {\n break\n }\n // The create row is an explicit affordance hinted with a ⏎ Kbd, so a\n // bare Enter always commits it when it is the active row.\n if (this.createIndex !== -1 && this.activeDescendant.activeIndex === this.createIndex) {\n e.preventDefault()\n this.emitCreate()\n break\n }\n // For options, a bare Enter (no navigation) only commits the highlighted\n // first row once it is implicitly selectable (navigated or autoHighlight).\n if ((this.navigated || this.autoHighlight) && this.activeOption) {\n e.preventDefault()\n this.selectOption(this.activeOption)\n }\n break\n case 'Escape':\n if (this.open) {\n e.preventDefault()\n this.hide()\n }\n break\n default:\n this.onUnhandledKeydown(e)\n break\n }\n }\n\n /** Hook for keys the base switch does not handle (Backspace chips, etc.). */\n protected onUnhandledKeydown(_e: KeyboardEvent): void {}\n\n /**\n * Fires the create affordance. Default is a no-op; the select combobox\n * overrides this to dispatch its `create` event.\n */\n protected emitCreate(): void {}\n\n private move(delta: number) {\n if (this.rowCount === 0) {\n return\n }\n\n this.onMove()\n\n // The controller does the index math: from \"no active row\" (-1, autocomplete\n // before the first navigation) ArrowDown lands on the first row and ArrowUp\n // on the last; otherwise it steps from the current row, skipping disabled\n // rows and wrapping. It returns `false` when every row is disabled (and there\n // is no create row), so we keep the listbox as-is rather than landing on an\n // unselectable row or marking it as navigated.\n if (!this.activeDescendant.move(delta)) {\n return\n }\n\n this.navigated = true\n this.scrollActivePending = true\n }\n\n protected commit() {\n this.requestUpdate()\n\n /**\n * Fired whenever the committed value is changed via user interaction.\n */\n this.dispatchEvent(new NordEvent('change'))\n }\n\n /** Resolves a value to its best-known label (current options, then cache). */\n protected labelFor(value: string): string {\n const option = this.resolvedOptions.find(o => o.value === value)\n return option?.label ?? this.labelCache.get(value) ?? value\n }\n\n render() {\n // `filteredOptions` caches value→label pairs as a side effect.\n const { result: options, hasGroups, groups } = this.filtered\n // Virtualize only flat, non-empty lists. `willUpdate` has already synced the\n // virtualizer's count, so the rendered window is current here.\n const isVirtual = this.virtualized && !hasGroups && options.length > 0\n const virtualItems = isVirtual ? this.virtualizer.getVirtualizer().getVirtualItems() : undefined\n // O(1) flat-index lookup for the grouped path (avoids indexOf per option).\n const indexByValue = hasGroups ? new Map(options.map((option, i) => [option.value, i])) : undefined\n const activeIndex = this.activeDescendant.activeIndex\n const activeOption = this.activeOption\n // Suppress aria-activedescendant when the active option is windowed out of a\n // virtualized list (e.g. after mouse-scrolling away from it), so it never\n // references a row that isn't in the DOM. The create row is always rendered.\n const activeRendered\n = !virtualItems\n || activeIndex === this.createIndex\n || virtualItems.some(item => item.index === activeIndex)\n const activeId\n = this.createIndex !== -1 && activeIndex === this.createIndex\n ? `${this.comboboxId}-create`\n : activeOption && activeRendered\n ? this.optionId(activeIndex)\n : undefined\n const listId = `${this.comboboxId}-list`\n const anchorId = `${this.comboboxId}-anchor`\n const showClear = this.showClear\n\n // Naming/description resolved by the FieldControlMixin getters (field context\n // in a field, built-in label/hint/error standalone, or host aria-* fallback).\n const ariaLabel = this.controlAriaLabel\n const ariaLabelledby = this.controlAriaLabelledby\n const ariaDescribedby = this.controlAriaDescribedby\n\n const input = html`\n <input\n ${ref(this.inputRef)}\n class=\"n-input\"\n type=\"text\"\n id=\"${this.comboboxId}-input\"\n role=\"combobox\"\n .value=${this.displayValue}\n placeholder=${ifDefined(this.inputPlaceholder)}\n ?disabled=${this.effectiveDisabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n autocomplete=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n aria-label=${ifDefined(ariaLabel)}\n aria-labelledby=${ifDefined(ariaLabelledby)}\n aria-describedby=${ifDefined(ariaDescribedby)}\n aria-autocomplete=${this.ariaAutocomplete}\n aria-haspopup=\"listbox\"\n aria-controls=${listId}\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-activedescendant=${ifDefined(this.open ? activeId : undefined)}\n aria-invalid=${ifDefined(this.controlAriaInvalid)}\n @input=${this.handleInput}\n @blur=${this.handleBlur}\n @keydown=${this.handleKeydown}\n />\n `\n\n const leading = this.renderLeadingControl()\n\n return html`\n ${this.renderLabel()}\n <div class=\"n-combobox\" id=${anchorId}>\n <div\n class=${classMap({\n 'n-control': true,\n 'is-invalid': this.effectiveInvalid,\n })}\n style=${styleMap({\n '--_n-combobox-start-inline-size': px(this.startObserver.inlineSize),\n '--_n-combobox-end-inline-size': px(this.endObserver.inlineSize),\n })}\n @click=${this.handleControlClick}\n >\n <span class=\"n-slot n-slot-start\"></span>\n\n ${leading === nothing\n ? input\n : html`<div class=\"n-tags\">${leading}${input}</div>`}\n\n <span class=\"n-slot n-slot-end\"></span>\n\n ${this.loading\n ? html`<nord-spinner class=\"n-loading\" size=\"s\"></nord-spinner>`\n : nothing}\n\n ${showClear\n ? html`\n <button\n class=\"n-clear\"\n type=\"button\"\n aria-label=${this.localize.term('clearLabel')}\n ?disabled=${this.disabled || this.readonly}\n @click=${this.handleClearClick}\n >\n <nord-icon name=\"interface-close-small\"></nord-icon>\n </button>\n ${this.showToggle\n ? html`<span class=\"n-divider\" aria-hidden=\"true\"></span>`\n : nothing}\n `\n : nothing}\n\n ${this.showToggle\n ? html`\n <button\n class=\"n-toggle\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ?disabled=${this.disabled || this.readonly}\n @click=${this.handleToggleClick}\n >\n <nord-icon name=\"interface-dropdown-small\"></nord-icon>\n </button>\n `\n : nothing}\n </div>\n\n <nord-popout\n id=\"${this.comboboxId}-popout\"\n anchor=${anchorId}\n align=${ifDefined(this.align)}\n position=${ifDefined(this.position)}\n always-floating\n @open=${this.handlePopoutOpen}\n @close=${this.handlePopoutClose}\n >\n <div\n id=${listId}\n class=\"n-listbox\"\n role=${ifDefined(this.rowCount ? 'listbox' : undefined)}\n aria-label=${ifDefined(this.rowCount ? ariaLabel : undefined)}\n aria-labelledby=${ifDefined(this.rowCount ? ariaLabelledby : undefined)}\n aria-multiselectable=${ifDefined(this.rowCount ? this.ariaMultiselectable : undefined)}\n >\n ${options.length === 0 && !this.canCreate\n ? this.renderEmpty()\n : hasGroups && groups && indexByValue\n ? Array.from(groups, ([group, groupOptions]) => this.renderGroup(group, groupOptions, indexByValue))\n : isVirtual && virtualItems\n ? this.renderVirtualOptions(options, virtualItems)\n : repeat(\n options,\n option => option.value,\n (option, i) => this.renderListOption(option, i),\n )}\n ${this.canCreate ? this.renderCreate() : nothing}\n </div>\n </nord-popout>\n </div>\n ${this.renderError()}\n ${this.isHintBelow ? this.renderHint() : nothing}\n `\n }\n\n /** Whether the clear (✕) affordance shows. Off by default (no `clearable`). */\n protected get showClear(): boolean {\n return false\n }\n\n /**\n * Whether the dropdown chevron toggle (and the divider before it) renders. On\n * by default — the combobox is a picker that opens its full list on click —\n * but hidden while `readonly`, where the value is shown but not interactive.\n * Autocomplete overrides this to `false`: like Base UI's autocomplete (which\n * renders no `Trigger`), it is a search input whose list appears on typing.\n */\n protected get showToggle(): boolean {\n return !this.readonly\n }\n\n /**\n * Drives the listbox `aria-multiselectable`. Single-select by default;\n * autocomplete overrides this to `undefined` so the attribute is omitted (it\n * has no selection model).\n */\n protected get ariaMultiselectable(): 'true' | 'false' | undefined {\n return 'false'\n }\n\n protected renderGroup(\n group: string | undefined,\n groupOptions: ComboboxOption[],\n indexByValue: Map<string, number>,\n ) {\n const groupId = `${this.comboboxId}-group-${group}`\n\n return html`\n <div role=\"group\" aria-labelledby=${cond(group, groupId)}>\n ${group\n ? html`<div class=\"n-group-label\" role=\"presentation\" id=${groupId}>${group}</div>`\n : nothing}\n ${repeat(\n groupOptions,\n option => option.value,\n option => this.renderListOption(option, indexByValue.get(option.value) ?? 0),\n )}\n </div>\n `\n }\n\n /** Resolves the content shown for a single option. */\n protected optionContent(option: ComboboxOption): TemplateResult | unknown {\n if (this.renderOption) {\n return this.renderOption(option)\n }\n\n if (option.html) {\n return unsafeHTML(option.html)\n }\n\n return option.label\n }\n\n /**\n * Samples the uniform row height once from the first rendered virtual row, then\n * re-measures the virtualizer so the window is sized from the real height rather\n * than the estimate. Runs only while the sample is missing and a laid-out row is\n * present, so it never becomes a per-render measurement loop.\n */\n private sampleRowSize() {\n if (!this.isVirtual || this.measuredRowSize !== undefined) {\n return\n }\n // Measure the inner option, not the row: the row is already given the\n // estimated height, so sampling it back would just echo the estimate. The\n // option is sized by its own content, so it yields the true uniform height.\n const row = this.listboxEl?.querySelector<HTMLElement>('.n-virtual-row .n-option')\n const size = row?.getBoundingClientRect().height\n if (size && size > 0) {\n this.measuredRowSize = size\n this.virtualizer.getVirtualizer().measure()\n }\n }\n\n /**\n * Renders only the virtual items currently in view, absolutely positioned\n * inside a full-height sizer so the scrollbar reflects the whole list. Rows take\n * a fixed height from the virtualizer (uniform rows), so no per-row measurement\n * is needed. `setSize`/`posinset` give assistive tech the true total even though\n * most rows aren't in the DOM.\n */\n private renderVirtualOptions(options: ComboboxOption[], items: VirtualItem[]) {\n const total = options.length\n const totalSize = this.virtualizer.getVirtualizer().getTotalSize()\n\n // Force each row to the virtualizer's size only once the uniform height has\n // been sampled. Before then the row keeps its natural height so the sample\n // reads the real content height rather than echoing the estimate back.\n const sized = this.measuredRowSize !== undefined\n\n return html`\n <div class=\"n-virtual-sizer\" style=\"block-size:${totalSize}px\">\n ${repeat(\n items,\n item => item.key,\n item => html`\n <div\n class=\"n-virtual-row\"\n data-index=${item.index}\n style=${sized\n ? `block-size:${item.size}px; transform: translateY(${item.start}px)`\n : `transform: translateY(${item.start}px)`}\n >\n ${this.renderListOption(options[item.index], item.index, total)}\n </div>\n `,\n )}\n </div>\n `\n }\n\n protected renderListOption(option: ComboboxOption, index: number, setSize?: number) {\n const selected = this.isSelected(option)\n\n return html`\n <div\n id=${this.optionId(index)}\n class=${classMap({\n 'n-option': true,\n 'is-active': index === this.activeDescendant.activeIndex,\n 'is-disabled': Boolean(option.disabled),\n })}\n role=\"option\"\n aria-selected=${this.optionAriaSelected(selected)}\n aria-disabled=${option.disabled ? 'true' : nothing}\n aria-setsize=${ifDefined(setSize)}\n aria-posinset=${ifDefined(setSize === undefined ? undefined : index + 1)}\n @click=${() => this.selectOption(option)}\n @mousemove=${() => this.handleOptionHover(index)}\n >\n ${this.rendersCheck\n ? html`\n <span class=\"n-option-check\">\n ${this.showCheck(selected) ? html`<nord-icon name=\"interface-checked\" size=\"s\"></nord-icon>` : nothing}\n </span>\n `\n : nothing}\n <span class=\"n-option-label\">${this.optionContent(option)}</span>\n </div>\n `\n }\n\n /** The option's `aria-selected` value. Autocomplete omits it (returns nothing). */\n protected optionAriaSelected(selected: boolean): string | typeof nothing {\n return selected ? 'true' : 'false'\n }\n\n /** Whether the selected-check icon shows. Autocomplete never shows it. */\n protected showCheck(selected: boolean): boolean {\n return selected\n }\n\n /**\n * Whether the leading check gutter is rendered. Combobox reserves it so the\n * selected tick sits on the left and every label lines up (matching the\n * filter dropdown); autocomplete has no selection, so it omits the gutter to\n * avoid indenting every suggestion.\n */\n protected get rendersCheck(): boolean {\n return true\n }\n\n /** The create row. Rendered only when `canCreate`; base returns nothing. */\n protected renderCreate(): unknown {\n return nothing\n }\n\n protected renderEmpty() {\n // Not a selectable option, and rendered outside the listbox role so an empty\n // listbox doesn't violate aria-required-children. `role=\"status\"` lets\n // assistive tech announce that the search returned nothing.\n if (this.loading) {\n return html`<div class=\"n-empty\" role=\"status\"><nord-spinner size=\"s\"></nord-spinner></div>`\n }\n\n return html`\n <div class=\"n-empty\" role=\"status\">\n ${this.noResultsText || this.localize.term('noResults')}\n </div>\n `\n }\n\n protected optionId(index: number) {\n return `${this.comboboxId}-option-${index}`\n }\n\n /** The id used for the create row (so subclasses can reference it). */\n protected get createId(): string {\n return `${this.comboboxId}-create`\n }\n\n /** Pointer hover highlights an option (without marking it as keyboard-navigated). */\n protected handleOptionHover(index: number) {\n this.onOptionHover()\n this.activeDescendant.setActiveIndex(index)\n }\n\n protected handleControlClick() {\n if (this.disabled) {\n return\n }\n\n // Clicking the control opens the list when `openOnInputClick` is set.\n // Autocomplete (`openOnInputClick = false`) therefore opens only on typing —\n // matching Base UI's `openOnInputClick={false}` — while the combobox\n // (default `true`) opens its list on click.\n if (!this.open && this.openOnInputClick) {\n this.show()\n }\n\n this.focus()\n }\n\n protected handleClearClick(e: Event) {\n e.stopPropagation()\n if (this.disabled || this.readonly) {\n return\n }\n this.clear()\n }\n\n /** Clear the current value. Overridden by clearable variants. */\n clear() {}\n\n protected handleToggleClick(e: Event) {\n e.stopPropagation()\n\n if (this.disabled || this.readonly) {\n return\n }\n\n if (this.open) {\n this.hide()\n }\n else {\n this.show()\n }\n\n this.focus()\n }\n}\n"],"names":["memo","getDeps","fn","opts","result","deps","initialDeps","isInitial","memoizedFunction","newDeps","length","some","dep","index","onChange","skipInitialOnChange","updateDeps","notUndefined","value","msg","Error","debounce","targetWindow","ms","timeoutId","args","clearTimeout","setTimeout","apply","this","_isIOSResult","isIOSWebKit","navigator","test","userAgent","mtp","maxTouchPoints","platform","getRect","element","offsetWidth","offsetHeight","width","height","defaultKeyExtractor","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","len","min","endIndex","count","arr","Array","i","observeElementRect","instance","cb","scrollElement","handler","rect","round","ResizeObserver","observer","entries","run","entry","borderBoxSize","box","inlineSize","blockSize","options","useAnimationFrameWithResizeObserver","requestAnimationFrame","observe","unobserve","addEventListenerOptions","passive","supportsScrollend","window","observeElementOffset","readOffset","registerScrollendEvent","useScrollendEvent","offset","fallback","isScrollingResetDelay","createHandler","isScrolling","endHandler","addEventListener","removeEventListener","observeOffset","el","horizontal","isRtl","scrollLeft","scrollTop","measureElement","useCachedMeasurements","indexFromElement","key","getItemKey","itemSizeCache","get","estimateSize","cachedSize","elementScroll","adjustments","behavior","_a","_b","scrollTo","call","Virtualizer","constructor","unsubs","scrollState","measurementsCache","_flatMeasurements","Map","itemSizeCacheVersion","laneAssignments","pendingMin","prevLanes","lanesChangedFlag","lanesSettling","pendingScrollAnchor","scrollRect","scrollOffset","scrollDirection","scrollAdjustments","_iosDeferredAdjustment","_iosTouching","_iosJustTouchEnded","_iosTouchEndTimerId","_intendedScrollOffset","elementsCache","now","_c","performance","Date","_ro","forEach","node","target","isConnected","shouldMeasureDuringScroll","resizeItem","cacheKey","cachedNode","delete","disconnect","setOptions","opts2","merged","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","rangeExtractor","initialRect","scrollMargin","gap","indexAttribute","initialMeasurementsCache","lanes","anchorTo","followOnAppend","scrollEndThreshold","enabled","laneAssignmentMode","v","prevOptions","anchor","edgeKeysChanged","prevCount","nextCount","measurements","getMeasurements","prevFirstKey","prevLastKey","item","getVirtualItemForOffset","getScrollOffset","isAtEnd","anchorResolved","anchorDelta","anchorKey","anchorOffset","newMeasurements","idx","anchorItem","newOffset","notify","sync","maybeNotify","calculateRange","cleanup","filter","Boolean","d","rafId","cancelAnimationFrame","_didMount","_willUpdate","getScrollElement","ownerDocument","defaultView","cached","push","abs","_flushIosDeferredIfReady","scheduleScrollReconcile","scrollEl","onTouchStart","onTouchEnd","_scrollToOffset","_offset","scrollToEnd","cur","getMaxScrollOffset","delta","getSize","getFurthestMeasurement","furthestMeasurementsFound","furthestMeasurements","m","measurement","has","lane","previousFurthestMeasurement","end","set","size","from","values","sort","a","b","getMeasurementOptions","_itemSizeCacheVersion","clear","keys","need","runningStart","flat","next","Float64Array","subarray","prevIdx","measuredSize","view","cache","Proxy","prop","receiver","c","charCodeAt","Number","isInteger","s","Reflect","createLazyMeasurementsView","slice","laneLastIndex","fill","cachedLane","shouldCacheLane","prevIndex","prevInLane","furthestMeasurement","outerSize","lastIndex","getStart","getEnd","findNearestBinarySearch","endPerLane","pos","startPerLane","getVirtualIndexes","attributeName","indexStr","getAttribute","parseInt","console","warn","scrollIndex","lastTargetOffset","bufferSize","ceil","minIndex","maxIndex","key2","prevNode","itemStart","wasAtEnd","getVirtualDistanceFromEnd","prevTotalSize","getTotalSize","shouldAdjustScroll","shouldAdjustScrollPositionOnItemSizeChange","applyScrollAdjustment","getVirtualItems","indexes","virtualItems","k","useFlat","scrollWidth","clientWidth","scrollHeight","clientHeight","doc","document","documentElement","innerWidth","innerHeight","getDistanceFromEnd","threshold","getOffsetForAlignment","toOffset","align","itemSize","maxOffset","getOffsetForIndex","scrollToOffset","startedAt","stableFrames","scrollToIndex","initialAlign","offsetInfo","scrollBy","lastIdx","endByLane","val","takeSnapshot","snapshot","scrollToFn","measure","reconcileScroll","targetOffset","targetChanged","viewport","distance","keepSmooth","low","high","getCurrentValue","middle","currentValue","VirtualizerControllerBase","host","resolvedOptions","updateComplete","then","requestUpdate","virtualizer","addController","getVirtualizer","hostConnected","hostUpdated","hostDisconnected","VirtualizerController","super","Icon","registerIcon","checkedIcon","closeIcon","dropdownIcon","comboboxCount","px","undefined","retagComboboxStyles","styles","tag","unsafeCSS","cssText","replace","ComboboxBase","DraftComponentMixin","SizeMixin","AutocompleteMixin","FieldControlMixin","InputMixin","FloatingMixin","LitElement","comboboxId","localName","inputId","inputRef","createRef","formData","FormDataController","formValue","labelCache","localize","LocalizeController","dismiss","LightDismissController","isOpen","open","onDismiss","hide","isDismissible","stateAttributes","StateAttributesController","invalid","trackFocus","externalFiltering","loading","autoHighlight","readonly","openOnInputClick","virtualized","search","queryDirty","activeDescendant","ActiveDescendantController","rowCount","isEnabled","filteredOptions","disabled","optionId","createIndex","createId","startObserver","ResizeController","startSlot","endObserver","endSlot","scrollActivePending","VIRTUAL_OVERSCAN","measuredRowSize","VIRTUAL_ROW_ESTIMATE","listboxEl","navigated","ownInvalid","showsQueryInInput","displayValue","isArray","labelFor","inputPlaceholder","placeholder","filterQuery","isSelected","option","includes","join","hasValue","canCreate","renderLeadingControl","nothing","ariaAutocomplete","selectOption","label","commit","focus","handleEnter","_e","onKeydown","onBlur","afterUpdate","onOptionHover","onMove","cacheLabels","labelCacheLimit","selected","Set","filtered","query","external","filteredCache","lower","toLocaleLowerCase","matched","hasGroups","group","groupBy","groupOptions","groups","activeOption","activeIndex","isVirtual","connectedCallback","ariaObserver","MutationObserver","attributes","attributeFilter","widthObserver","syncAnchorInlineSize","slotObserver","childList","disconnectedCallback","relocateSlots","isServer","move","name","child","children","parentElement","appendChild","style","setProperty","createRenderRoot","root","createElement","className","show","dispatchEvent","NordEvent","cancelable","onHide","handleOpenChange","popout","resetActiveIndex","handleDisabledChange","resetRowSample","updated","changedProperties","sampleRowSize","scrollActiveIntoView","willUpdate","changed","listbox","querySelector","scrollIntoView","block","handlePopoutClose","e","stopPropagation","handlePopoutOpen","setActiveIndex","nextEnabledIndex","every","reset","handleInput","input","onInput","_input","handleBlur","handleKeydown","preventDefault","last","first","emitCreate","onUnhandledKeydown","find","o","render","indexByValue","map","activeRendered","activeId","listId","anchorId","showClear","ariaLabel","controlAriaLabel","ariaLabelledby","controlAriaLabelledby","ariaDescribedby","controlAriaDescribedby","html","ref","ifDefined","effectiveDisabled","required","controlAriaInvalid","leading","renderLabel","classMap","effectiveInvalid","styleMap","handleControlClick","term","handleClearClick","showToggle","handleToggleClick","position","ariaMultiselectable","renderGroup","renderVirtualOptions","repeat","renderListOption","renderEmpty","renderCreate","renderError","isHintBelow","renderHint","groupId","cond","optionContent","renderOption","unsafeHTML","row","getBoundingClientRect","items","total","totalSize","sized","setSize","optionAriaSelected","handleOptionHover","rendersCheck","showCheck","noResultsText","__decorate","prototype","property","attribute","reflect","type","state"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
1
+ {"version":3,"file":"ComboboxBase.js","sources":["../../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/utils.js","../../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/index.js","../../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js","../../../node_modules/.pnpm/@tanstack+lit-virtual@3.13.30_lit@3.3.2/node_modules/@tanstack/lit-virtual/dist/esm/index.js","../src/combobox/ComboboxBase.ts"],"sourcesContent":["function memo(getDeps, fn, opts) {\n let deps = opts.initialDeps ?? [];\n let result;\n let isInitial = true;\n function memoizedFunction() {\n var _a;\n const debugEnabled = process.env.NODE_ENV !== \"production\" && !!opts.key && !!((_a = opts.debug) == null ? void 0 : _a.call(opts));\n let depTime = 0;\n if (debugEnabled) depTime = Date.now();\n const newDeps = getDeps();\n const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n let resultTime = 0;\n if (debugEnabled) resultTime = Date.now();\n result = fn(...newDeps);\n if (debugEnabled) {\n const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n const resultFpsPercentage = resultEndTime / 16;\n const pad = (str, num) => {\n str = String(str);\n while (str.length < num) {\n str = \" \" + str;\n }\n return str;\n };\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120)\n )}deg 100% 31%);`,\n opts == null ? void 0 : opts.key\n );\n }\n if ((opts == null ? void 0 : opts.onChange) && !(isInitial && opts.skipInitialOnChange)) {\n opts.onChange(result);\n }\n isInitial = false;\n return result;\n }\n memoizedFunction.updateDeps = (newDeps) => {\n deps = newDeps;\n };\n return memoizedFunction;\n}\nfunction notUndefined(value, msg) {\n if (value === void 0) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n } else {\n return value;\n }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1.01;\nconst debounce = (targetWindow, fn, ms) => {\n let timeoutId;\n return function(...args) {\n targetWindow.clearTimeout(timeoutId);\n timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n };\n};\nexport {\n approxEqual,\n debounce,\n memo,\n notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { createLazyMeasurementsView } from \"./lazy-measurements.js\";\nimport { memo, notUndefined, approxEqual, debounce } from \"./utils.js\";\nlet _isIOSResult;\nconst isIOSWebKit = () => {\n if (_isIOSResult !== void 0) return _isIOSResult;\n if (typeof navigator === \"undefined\") return _isIOSResult = false;\n if (/iP(hone|od|ad)/.test(navigator.userAgent)) return _isIOSResult = true;\n const mtp = navigator.maxTouchPoints;\n return _isIOSResult = navigator.platform === \"MacIntel\" && mtp !== void 0 && mtp > 0;\n};\nconst _resetIOSDetectionForTests = () => {\n _isIOSResult = void 0;\n};\nconst getRect = (element) => {\n const { offsetWidth, offsetHeight } = element;\n return { width: offsetWidth, height: offsetHeight };\n};\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n const start = Math.max(range.startIndex - range.overscan, 0);\n const end = Math.min(range.endIndex + range.overscan, range.count - 1);\n const len = end - start + 1;\n const arr = new Array(len);\n for (let i = 0; i < len; i++) {\n arr[i] = start + i;\n }\n return arr;\n};\nconst observeElementRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const handler = (rect) => {\n const { width, height } = rect;\n cb({ width: Math.round(width), height: Math.round(height) });\n };\n handler(getRect(element));\n if (!targetWindow.ResizeObserver) {\n return () => {\n };\n }\n const observer = new targetWindow.ResizeObserver((entries) => {\n const run = () => {\n const entry = entries[0];\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize });\n return;\n }\n }\n handler(getRect(element));\n };\n instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n observer.observe(element, { box: \"border-box\" });\n return () => {\n observer.unobserve(element);\n };\n};\nconst addEventListenerOptions = {\n passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight });\n };\n handler();\n element.addEventListener(\"resize\", handler, addEventListenerOptions);\n return () => {\n element.removeEventListener(\"resize\", handler);\n };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeOffset = (instance, cb, readOffset) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n let offset = 0;\n const fallback = registerScrollendEvent ? null : debounce(\n targetWindow,\n () => cb(offset, false),\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n offset = readOffset(element);\n fallback == null ? void 0 : fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n };\n};\nconst observeElementOffset = (instance, cb) => observeOffset(instance, cb, (el) => {\n const { horizontal, isRtl } = instance.options;\n return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;\n});\nconst observeWindowOffset = (instance, cb) => observeOffset(\n instance,\n cb,\n (win) => instance.options.horizontal ? win.scrollX : win.scrollY\n);\nconst measureElement = (element, entry, instance) => {\n if (instance.options.useCachedMeasurements) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n return instance.itemSizeCache.get(key) ?? instance.options.estimateSize(index);\n }\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n );\n return size;\n }\n }\n if (!entry) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n const cachedSize = instance.itemSizeCache.get(key);\n if (cachedSize !== void 0) {\n return cachedSize;\n }\n }\n return element[instance.options.horizontal ? \"offsetWidth\" : \"offsetHeight\"];\n};\nconst scrollWithAdjustments = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a, _b;\n (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n [instance.options.horizontal ? \"left\" : \"top\"]: offset + adjustments,\n behavior\n });\n};\nconst windowScroll = scrollWithAdjustments;\nconst elementScroll = scrollWithAdjustments;\nclass Virtualizer {\n constructor(opts) {\n this.unsubs = [];\n this.scrollElement = null;\n this.targetWindow = null;\n this.isScrolling = false;\n this.scrollState = null;\n this.measurementsCache = [];\n this._flatMeasurements = null;\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.itemSizeCacheVersion = 0;\n this.laneAssignments = /* @__PURE__ */ new Map();\n this.pendingMin = null;\n this.prevLanes = void 0;\n this.lanesChangedFlag = false;\n this.lanesSettling = false;\n this.pendingScrollAnchor = null;\n this.scrollRect = null;\n this.scrollOffset = null;\n this.scrollDirection = null;\n this.scrollAdjustments = 0;\n this._iosDeferredAdjustment = 0;\n this._iosTouching = false;\n this._iosJustTouchEnded = false;\n this._iosTouchEndTimerId = null;\n this._intendedScrollOffset = null;\n this.elementsCache = /* @__PURE__ */ new Map();\n this.now = () => {\n var _a, _b, _c;\n return ((_c = (_b = (_a = this.targetWindow) == null ? void 0 : _a.performance) == null ? void 0 : _b.now) == null ? void 0 : _c.call(_b)) ?? Date.now();\n };\n this.observer = /* @__PURE__ */ (() => {\n let _ro = null;\n const get = () => {\n if (_ro) {\n return _ro;\n }\n if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n return null;\n }\n return _ro = new this.targetWindow.ResizeObserver((entries) => {\n entries.forEach((entry) => {\n const run = () => {\n const node = entry.target;\n const index = this.indexFromElement(node);\n if (!node.isConnected) {\n this.observer.unobserve(node);\n for (const [cacheKey, cachedNode] of this.elementsCache) {\n if (cachedNode === node) {\n this.elementsCache.delete(cacheKey);\n break;\n }\n }\n return;\n }\n if (this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(\n index,\n this.options.measureElement(node, entry, this)\n );\n }\n };\n this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n });\n };\n return {\n disconnect: () => {\n var _a;\n (_a = get()) == null ? void 0 : _a.disconnect();\n _ro = null;\n },\n observe: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.observe(target, { box: \"border-box\" });\n },\n unobserve: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.unobserve(target);\n }\n };\n })();\n this.range = null;\n this.setOptions = (opts2) => {\n var _a, _b;\n const merged = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {\n },\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n gap: 0,\n indexAttribute: \"data-index\",\n initialMeasurementsCache: [],\n lanes: 1,\n anchorTo: \"start\",\n followOnAppend: false,\n scrollEndThreshold: 1,\n isScrollingResetDelay: 150,\n enabled: true,\n isRtl: false,\n useScrollendEvent: false,\n useAnimationFrameWithResizeObserver: false,\n laneAssignmentMode: \"estimate\",\n useCachedMeasurements: false\n };\n for (const key in opts2) {\n const v = opts2[key];\n if (v !== void 0) merged[key] = v;\n }\n const prevOptions = this.options;\n let anchor = null;\n let followOnAppend = null;\n let edgeKeysChanged = false;\n if (prevOptions !== void 0 && prevOptions.enabled && merged.enabled && merged.anchorTo === \"end\" && this.scrollElement !== null) {\n const prevCount = prevOptions.count;\n const nextCount = merged.count;\n const measurements = this.getMeasurements();\n const prevFirstKey = prevCount > 0 ? ((_a = measurements[0]) == null ? void 0 : _a.key) ?? prevOptions.getItemKey(0) : null;\n const prevLastKey = prevCount > 0 ? ((_b = measurements[prevCount - 1]) == null ? void 0 : _b.key) ?? prevOptions.getItemKey(prevCount - 1) : null;\n const didCountChange = nextCount !== prevCount;\n const didEdgeKeysChange = didCountChange || prevCount > 0 && nextCount > 0 && (merged.getItemKey(0) !== prevFirstKey || merged.getItemKey(nextCount - 1) !== prevLastKey);\n if (didEdgeKeysChange) {\n edgeKeysChanged = true;\n const item = prevCount > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? measurements[0] : null;\n if (item) {\n anchor = [item.key, this.getScrollOffset() - item.start];\n }\n const behavior = merged.followOnAppend === true ? \"auto\" : merged.followOnAppend || null;\n if (behavior && nextCount > prevCount && this.isAtEnd(prevOptions.scrollEndThreshold) && (prevCount === 0 || merged.getItemKey(nextCount - 1) !== prevLastKey)) {\n followOnAppend = behavior;\n }\n }\n }\n this.options = merged;\n if (edgeKeysChanged) {\n this.pendingMin = 0;\n this.itemSizeCacheVersion++;\n }\n let anchorResolved = false;\n let anchorDelta = 0;\n if (anchor && this.scrollOffset !== null) {\n const [anchorKey, anchorOffset] = anchor;\n const newMeasurements = this.getMeasurements();\n const { count, getItemKey } = this.options;\n let idx = 0;\n while (idx < count && getItemKey(idx) !== anchorKey) {\n idx++;\n }\n if (idx < count) {\n const anchorItem = newMeasurements[idx];\n if (anchorItem) {\n const newOffset = anchorItem.start + anchorOffset;\n if (newOffset !== this.scrollOffset) {\n anchorDelta = newOffset - this.scrollOffset;\n this.scrollOffset = newOffset;\n anchorResolved = true;\n }\n }\n }\n }\n if (anchorResolved || followOnAppend) {\n this.pendingScrollAnchor = [\n anchorResolved ? anchor[0] : null,\n anchorResolved ? anchor[1] : 0,\n followOnAppend,\n anchorDelta\n ];\n }\n };\n this.notify = (sync) => {\n var _a, _b;\n (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n };\n this.maybeNotify = memo(\n () => {\n this.calculateRange();\n return [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ];\n },\n (isScrolling) => {\n this.notify(isScrolling);\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n debug: () => this.options.debug,\n initialDeps: [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ]\n }\n );\n this.cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d());\n this.unsubs = [];\n this.observer.disconnect();\n if (this.rafId != null && this.targetWindow) {\n this.targetWindow.cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.scrollState = null;\n this.scrollElement = null;\n this.targetWindow = null;\n };\n this._didMount = () => {\n return () => {\n this.cleanup();\n };\n };\n this._willUpdate = () => {\n var _a;\n const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n if (this.scrollElement !== scrollElement) {\n this.cleanup();\n if (!scrollElement) {\n this.maybeNotify();\n return;\n }\n this.scrollElement = scrollElement;\n if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n } else {\n this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n }\n this.elementsCache.forEach((cached) => {\n this.observer.observe(cached);\n });\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect;\n this.maybeNotify();\n })\n );\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset, isScrolling) => {\n if (this._intendedScrollOffset !== null && Math.abs(offset - this._intendedScrollOffset) < 1.5) {\n offset = this._intendedScrollOffset;\n }\n this._intendedScrollOffset = null;\n this.scrollAdjustments = 0;\n this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? \"forward\" : \"backward\" : null;\n this.scrollOffset = offset;\n this.isScrolling = isScrolling;\n this._flushIosDeferredIfReady();\n if (this.scrollState) {\n this.scheduleScrollReconcile();\n }\n this.maybeNotify();\n })\n );\n if (\"addEventListener\" in this.scrollElement) {\n const scrollEl = this.scrollElement;\n const onTouchStart = () => {\n this._iosTouching = true;\n this._iosJustTouchEnded = false;\n if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n this._iosTouchEndTimerId = null;\n }\n };\n const onTouchEnd = () => {\n this._iosTouching = false;\n if (!isIOSWebKit() || this.targetWindow == null) {\n return;\n }\n this._iosJustTouchEnded = true;\n this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => {\n this._iosJustTouchEnded = false;\n this._iosTouchEndTimerId = null;\n this._flushIosDeferredIfReady();\n }, 150);\n };\n scrollEl.addEventListener(\n \"touchstart\",\n onTouchStart,\n addEventListenerOptions\n );\n scrollEl.addEventListener(\n \"touchend\",\n onTouchEnd,\n addEventListenerOptions\n );\n this.unsubs.push(() => {\n scrollEl.removeEventListener(\"touchstart\", onTouchStart);\n scrollEl.removeEventListener(\"touchend\", onTouchEnd);\n if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n this._iosTouchEndTimerId = null;\n }\n });\n }\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n }\n const anchor = this.pendingScrollAnchor;\n this.pendingScrollAnchor = null;\n if (anchor && this.scrollElement && this.options.enabled) {\n const [key, _offset, followOnAppend, anchorDelta] = anchor;\n if (key !== null && !followOnAppend) {\n if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n if (anchorDelta !== 0) {\n this._iosDeferredAdjustment += anchorDelta;\n }\n } else {\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n }\n }\n if (followOnAppend) {\n this.scrollToEnd({ behavior: followOnAppend });\n }\n }\n };\n this._flushIosDeferredIfReady = () => {\n if (this._iosDeferredAdjustment === 0) return;\n if (this.isScrolling) return;\n if (this._iosTouching) return;\n if (this._iosJustTouchEnded) return;\n const cur = this.getScrollOffset();\n const max = this.getMaxScrollOffset();\n if (cur < 0 || cur > max) return;\n const delta = this._iosDeferredAdjustment;\n this._iosDeferredAdjustment = 0;\n this._scrollToOffset(cur, {\n adjustments: this.scrollAdjustments += delta,\n behavior: void 0\n });\n };\n this.rafId = null;\n this.getSize = () => {\n if (!this.options.enabled) {\n this.scrollRect = null;\n return 0;\n }\n this.scrollRect = this.scrollRect ?? this.options.initialRect;\n return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n };\n this.getScrollOffset = () => {\n if (!this.options.enabled) {\n this.scrollOffset = null;\n return 0;\n }\n this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n return this.scrollOffset;\n };\n this.getFurthestMeasurement = (measurements, index) => {\n const furthestMeasurementsFound = /* @__PURE__ */ new Map();\n const furthestMeasurements = /* @__PURE__ */ new Map();\n for (let m = index - 1; m >= 0; m--) {\n const measurement = measurements[m];\n if (furthestMeasurementsFound.has(measurement.lane)) {\n continue;\n }\n const previousFurthestMeasurement = furthestMeasurements.get(\n measurement.lane\n );\n if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {\n furthestMeasurements.set(measurement.lane, measurement);\n } else if (measurement.end < previousFurthestMeasurement.end) {\n furthestMeasurementsFound.set(measurement.lane, true);\n }\n if (furthestMeasurementsFound.size === this.options.lanes) {\n break;\n }\n }\n return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {\n if (a.end === b.end) {\n return a.index - b.index;\n }\n return a.end - b.end;\n })[0] : void 0;\n };\n this.getMeasurementOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.options.enabled,\n this.options.lanes,\n this.options.laneAssignmentMode\n ],\n (count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode) => {\n const lanesChanged = this.prevLanes !== void 0 && this.prevLanes !== lanes;\n if (lanesChanged) {\n this.lanesChangedFlag = true;\n }\n this.prevLanes = lanes;\n this.pendingMin = null;\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode\n };\n },\n {\n key: false\n }\n );\n this.getMeasurements = memo(\n () => [this.getMeasurementOptions(), this.itemSizeCacheVersion],\n ({\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode\n }, _itemSizeCacheVersion) => {\n const itemSizeCache = this.itemSizeCache;\n if (!enabled) {\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n return [];\n }\n if (this.laneAssignments.size > count) {\n for (const index of this.laneAssignments.keys()) {\n if (index >= count) {\n this.laneAssignments.delete(index);\n }\n }\n }\n if (this.lanesChangedFlag) {\n this.lanesChangedFlag = false;\n this.lanesSettling = true;\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.pendingMin = null;\n }\n if (this.measurementsCache.length === 0 && !this.lanesSettling) {\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size);\n });\n }\n const min = this.lanesSettling ? 0 : this.pendingMin ?? 0;\n this.pendingMin = null;\n if (this.lanesSettling && this.measurementsCache.length === count) {\n this.lanesSettling = false;\n }\n if (lanes === 1) {\n const gap = this.options.gap;\n const need = count * 2;\n let flat = this._flatMeasurements;\n if (!flat || flat.length < need) {\n const next = new Float64Array(need);\n if (flat && min > 0) next.set(flat.subarray(0, min * 2));\n flat = next;\n this._flatMeasurements = flat;\n }\n let runningStart;\n if (min === 0) {\n runningStart = paddingStart + scrollMargin;\n } else {\n const prevIdx = min - 1;\n runningStart = flat[prevIdx * 2] + flat[prevIdx * 2 + 1] + gap;\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n flat[i * 2] = runningStart;\n flat[i * 2 + 1] = size;\n runningStart += size + gap;\n }\n const view = createLazyMeasurementsView(count, flat, getItemKey);\n this.measurementsCache = view;\n return view;\n }\n const measurements = this.measurementsCache.slice(0, min);\n const laneLastIndex = new Array(lanes).fill(\n void 0\n );\n for (let m = 0; m < min; m++) {\n const item = measurements[m];\n if (item) {\n laneLastIndex[item.lane] = m;\n }\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const cachedLane = this.laneAssignments.get(i);\n let lane;\n let start;\n const shouldCacheLane = laneAssignmentMode === \"estimate\" || itemSizeCache.has(key);\n if (cachedLane !== void 0 && this.options.lanes > 1) {\n lane = cachedLane;\n const prevIndex = laneLastIndex[lane];\n const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;\n start = prevInLane ? prevInLane.end + this.options.gap : paddingStart + scrollMargin;\n } else {\n const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);\n start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;\n lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;\n if (this.options.lanes > 1 && shouldCacheLane) {\n this.laneAssignments.set(i, lane);\n }\n }\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n const end = start + size;\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane\n };\n laneLastIndex[lane] = i;\n }\n this.measurementsCache = measurements;\n return measurements;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n debug: () => this.options.debug\n }\n );\n this.calculateRange = memo(\n () => [\n this.getMeasurements(),\n this.getSize(),\n this.getScrollOffset(),\n this.options.lanes\n ],\n (measurements, outerSize, scrollOffset, lanes) => {\n return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes,\n // Pass the typed array so binary search + forward-walk can\n // read start/end directly from Float64Array, skipping the\n // Proxy traps that materialize a full VirtualItem per probe.\n flat: lanes === 1 && this._flatMeasurements != null ? this._flatMeasurements : null\n }) : null;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualIndexes = memo(\n () => {\n let startIndex = null;\n let endIndex = null;\n const range = this.calculateRange();\n if (range) {\n startIndex = range.startIndex;\n endIndex = range.endIndex;\n }\n this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);\n return [\n this.options.rangeExtractor,\n this.options.overscan,\n this.options.count,\n startIndex,\n endIndex\n ];\n },\n (rangeExtractor, overscan, count, startIndex, endIndex) => {\n return startIndex === null || endIndex === null ? [] : rangeExtractor({\n startIndex,\n endIndex,\n overscan,\n count\n });\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n debug: () => this.options.debug\n }\n );\n this.indexFromElement = (node) => {\n const attributeName = this.options.indexAttribute;\n const indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`\n );\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this.shouldMeasureDuringScroll = (index) => {\n var _a;\n if (!this.scrollState || this.scrollState.behavior !== \"smooth\") {\n return true;\n }\n const scrollIndex = this.scrollState.index ?? ((_a = this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)) == null ? void 0 : _a.index);\n if (scrollIndex !== void 0 && this.range) {\n const bufferSize = Math.max(\n this.options.overscan,\n Math.ceil((this.range.endIndex - this.range.startIndex) / 2)\n );\n const minIndex = Math.max(0, scrollIndex - bufferSize);\n const maxIndex = Math.min(\n this.options.count - 1,\n scrollIndex + bufferSize\n );\n return index >= minIndex && index <= maxIndex;\n }\n return true;\n };\n this.measureElement = (node) => {\n if (!node) {\n this.elementsCache.forEach((cached, key2) => {\n if (!cached.isConnected) {\n this.observer.unobserve(cached);\n this.elementsCache.delete(key2);\n }\n });\n return;\n }\n const index = this.indexFromElement(node);\n const key = this.options.getItemKey(index);\n const prevNode = this.elementsCache.get(key);\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode);\n }\n this.observer.observe(node);\n this.elementsCache.set(key, node);\n }\n if ((!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(index, this.options.measureElement(node, void 0, this));\n }\n };\n this.resizeItem = (index, size) => {\n var _a, _b;\n if (index < 0 || index >= this.options.count) return;\n let cachedSize;\n let itemStart;\n let key;\n const flat = this._flatMeasurements;\n if (this.options.lanes === 1 && flat !== null) {\n key = this.options.getItemKey(index);\n itemStart = flat[index * 2];\n cachedSize = flat[index * 2 + 1];\n } else {\n const item = this.measurementsCache[index];\n if (!item) return;\n key = item.key;\n itemStart = item.start;\n cachedSize = item.size;\n }\n const itemSize = this.itemSizeCache.get(key) ?? cachedSize;\n const delta = size - itemSize;\n if (delta !== 0) {\n const wasAtEnd = this.options.anchorTo === \"end\" && ((_a = this.scrollState) == null ? void 0 : _a.behavior) !== \"smooth\" && this.getVirtualDistanceFromEnd() <= this.options.scrollEndThreshold;\n const prevTotalSize = wasAtEnd ? this.getTotalSize() : 0;\n const shouldAdjustScroll = ((_b = this.scrollState) == null ? void 0 : _b.behavior) !== \"smooth\" && (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(\n // The callback expects a VirtualItem; build one lazily only\n // when the consumer actually supplied a custom predicate.\n this.measurementsCache[index] ?? {\n index,\n key,\n start: itemStart,\n size: cachedSize,\n end: itemStart + cachedSize,\n lane: 0\n },\n delta,\n this\n ) : (\n // Default: adjust when the resize is an above-viewport item.\n // First measurement (!has(key)): always adjust — the item\n // has never been sized, so the estimate→actual delta must\n // be compensated regardless of scroll direction.\n // Re-measurement (has(key)): skip during backward scroll\n // to avoid the \"items jump while scrolling up\" cascade.\n itemStart < this.getScrollOffset() + this.scrollAdjustments && (!this.itemSizeCache.has(key) || this.scrollDirection !== \"backward\")\n ));\n if (this.pendingMin === null || index < this.pendingMin) {\n this.pendingMin = index;\n }\n this.itemSizeCache.set(key, size);\n this.itemSizeCacheVersion++;\n if (wasAtEnd) {\n this.applyScrollAdjustment(this.getTotalSize() - prevTotalSize);\n } else if (shouldAdjustScroll) {\n this.applyScrollAdjustment(delta);\n }\n this.notify(false);\n }\n };\n this.getVirtualItems = memo(\n () => [this.getVirtualIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems = [];\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k];\n const measurement = measurements[i];\n virtualItems.push(measurement);\n }\n return virtualItems;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualItemForOffset = (offset) => {\n const measurements = this.getMeasurements();\n if (measurements.length === 0) {\n return void 0;\n }\n const flat = this._flatMeasurements;\n const useFlat = this.options.lanes === 1 && flat != null;\n const idx = findNearestBinarySearch(\n 0,\n measurements.length - 1,\n useFlat ? (i) => flat[i * 2] : (i) => notUndefined(measurements[i]).start,\n offset\n );\n return notUndefined(measurements[idx]);\n };\n this.getMaxScrollOffset = () => {\n if (!this.scrollElement) return 0;\n if (\"scrollHeight\" in this.scrollElement) {\n return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight;\n } else {\n const doc = this.scrollElement.document.documentElement;\n return this.options.horizontal ? doc.scrollWidth - this.scrollElement.innerWidth : doc.scrollHeight - this.scrollElement.innerHeight;\n }\n };\n this.getVirtualDistanceFromEnd = () => {\n return Math.max(\n this.getTotalSize() - this.getSize() - this.getScrollOffset(),\n 0\n );\n };\n this.getDistanceFromEnd = () => {\n return Math.max(this.getMaxScrollOffset() - this.getScrollOffset(), 0);\n };\n this.isAtEnd = (threshold = this.options.scrollEndThreshold) => {\n return this.getDistanceFromEnd() <= threshold;\n };\n this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {\n if (!this.scrollElement) return 0;\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n align = toOffset >= scrollOffset + size ? \"end\" : \"start\";\n }\n if (align === \"center\") {\n toOffset += (itemSize - size) / 2;\n } else if (align === \"end\") {\n toOffset -= size;\n }\n const maxOffset = this.getMaxScrollOffset();\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = (index, align = \"auto\") => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n const item = this.measurementsCache[index];\n if (!item) return;\n if (align === \"auto\") {\n if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n align = \"end\";\n } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n align = \"start\";\n } else {\n return [scrollOffset, align];\n }\n }\n if (align === \"end\" && index === this.options.count - 1) {\n return [this.getMaxScrollOffset(), align];\n }\n const toOffset = align === \"end\" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;\n return [\n this.getOffsetForAlignment(toOffset, align, item.size),\n align\n ];\n };\n this.scrollToOffset = (toOffset, { align = \"start\", behavior = \"auto\" } = {}) => {\n const offset = this.getOffsetForAlignment(toOffset, align);\n const now = this.now();\n this.scrollState = {\n index: null,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollToIndex = (index, {\n align: initialAlign = \"auto\",\n behavior = \"auto\"\n } = {}) => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const offsetInfo = this.getOffsetForIndex(index, initialAlign);\n if (!offsetInfo) {\n return;\n }\n const [offset, align] = offsetInfo;\n const now = this.now();\n this.scrollState = {\n index,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollBy = (delta, { behavior = \"auto\" } = {}) => {\n const offset = this.getScrollOffset() + delta;\n const now = this.now();\n this.scrollState = {\n index: null,\n align: \"start\",\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollToEnd = ({ behavior = \"auto\" } = {}) => {\n if (this.options.count > 0) {\n this.scrollToIndex(this.options.count - 1, {\n align: \"end\",\n behavior\n });\n return;\n }\n this.scrollToOffset(Math.max(this.getTotalSize() - this.getSize(), 0), {\n behavior\n });\n };\n this.getTotalSize = () => {\n var _a;\n const measurements = this.getMeasurements();\n let end;\n if (measurements.length === 0) {\n end = this.options.paddingStart;\n } else if (this.options.lanes === 1) {\n const lastIdx = measurements.length - 1;\n const flat = this._flatMeasurements;\n if (flat != null) {\n end = flat[lastIdx * 2] + flat[lastIdx * 2 + 1];\n } else {\n end = ((_a = measurements[lastIdx]) == null ? void 0 : _a.end) ?? 0;\n }\n } else {\n const endByLane = Array(this.options.lanes).fill(null);\n let endIndex = measurements.length - 1;\n while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n const item = measurements[endIndex];\n if (endByLane[item.lane] === null) {\n endByLane[item.lane] = item.end;\n }\n endIndex--;\n }\n end = Math.max(...endByLane.filter((val) => val !== null));\n }\n return Math.max(\n end - this.options.scrollMargin + this.options.paddingEnd,\n 0\n );\n };\n this.takeSnapshot = () => {\n const snapshot = [];\n if (this.itemSizeCache.size === 0) return snapshot;\n const m = this.getMeasurements();\n for (const item of m) {\n if (item && this.itemSizeCache.has(item.key)) {\n snapshot.push({\n index: item.index,\n key: item.key,\n start: item.start,\n size: item.size,\n end: item.end,\n lane: item.lane\n });\n }\n }\n return snapshot;\n };\n this._scrollToOffset = (offset, {\n adjustments,\n behavior\n }) => {\n this._intendedScrollOffset = offset + (adjustments ?? 0);\n this.options.scrollToFn(offset, { behavior, adjustments }, this);\n };\n this.measure = () => {\n this.pendingMin = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.itemSizeCacheVersion++;\n this.notify(false);\n };\n this.setOptions(opts);\n }\n applyScrollAdjustment(delta, behavior) {\n if (delta === 0) return;\n if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n console.info(\"correction\", delta);\n }\n if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n this._iosDeferredAdjustment += delta;\n } else {\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: this.scrollAdjustments += delta,\n behavior\n });\n }\n }\n scheduleScrollReconcile() {\n if (!this.targetWindow) {\n this.scrollState = null;\n return;\n }\n if (this.rafId != null) return;\n this.rafId = this.targetWindow.requestAnimationFrame(() => {\n this.rafId = null;\n this.reconcileScroll();\n });\n }\n reconcileScroll() {\n if (!this.scrollState) return;\n const el = this.scrollElement;\n if (!el) return;\n const MAX_RECONCILE_MS = 5e3;\n if (this.now() - this.scrollState.startedAt > MAX_RECONCILE_MS) {\n this.scrollState = null;\n return;\n }\n const offsetInfo = this.scrollState.index != null ? this.getOffsetForIndex(this.scrollState.index, this.scrollState.align) : void 0;\n const targetOffset = offsetInfo ? offsetInfo[0] : this.scrollState.lastTargetOffset;\n const STABLE_FRAMES = 1;\n const targetChanged = targetOffset !== this.scrollState.lastTargetOffset;\n if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {\n this.scrollState.stableFrames++;\n if (this.scrollState.stableFrames >= STABLE_FRAMES) {\n if (this.getScrollOffset() !== targetOffset) {\n this._scrollToOffset(targetOffset, {\n adjustments: void 0,\n behavior: \"auto\"\n });\n }\n this.scrollState = null;\n return;\n }\n } else {\n this.scrollState.stableFrames = 0;\n if (targetChanged) {\n const viewport = this.getSize() || 600;\n const distance = Math.abs(targetOffset - this.getScrollOffset());\n const keepSmooth = this.scrollState.behavior === \"smooth\" && distance > viewport;\n this.scrollState.lastTargetOffset = targetOffset;\n if (!keepSmooth) {\n this.scrollState.behavior = \"auto\";\n }\n this._scrollToOffset(targetOffset, {\n adjustments: void 0,\n behavior: keepSmooth ? \"smooth\" : \"auto\"\n });\n }\n }\n this.scheduleScrollReconcile();\n }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes,\n flat\n}) {\n const lastIndex = measurements.length - 1;\n const getStart = flat ? (index) => flat[index * 2] : (index) => measurements[index].start;\n const getEnd = flat ? (index) => flat[index * 2] + flat[index * 2 + 1] : (index) => measurements[index].end;\n if (measurements.length <= lanes) {\n return {\n startIndex: 0,\n endIndex: lastIndex\n };\n }\n let startIndex = findNearestBinarySearch(0, lastIndex, getStart, scrollOffset);\n let endIndex = startIndex;\n if (lanes === 1) {\n while (endIndex < lastIndex && getEnd(endIndex) < scrollOffset + outerSize) {\n endIndex++;\n }\n } else if (lanes > 1) {\n const endPerLane = Array(lanes).fill(0);\n while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {\n const item = measurements[endIndex];\n endPerLane[item.lane] = item.end;\n endIndex++;\n }\n const startPerLane = Array(lanes).fill(scrollOffset + outerSize);\n while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n const item = measurements[startIndex];\n startPerLane[item.lane] = item.start;\n startIndex--;\n }\n startIndex = Math.max(0, startIndex - startIndex % lanes);\n endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));\n }\n return { startIndex, endIndex };\n}\nexport {\n Virtualizer,\n _resetIOSDetectionForTests,\n approxEqual,\n debounce,\n defaultKeyExtractor,\n defaultRangeExtractor,\n elementScroll,\n measureElement,\n memo,\n notUndefined,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n windowScroll\n};\n//# sourceMappingURL=index.js.map\n","function createLazyMeasurementsView(count, flat, getItemKey) {\n const cache = new Array(count);\n return new Proxy(cache, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\") {\n const c = prop.charCodeAt(0);\n if (c >= 48 && c <= 57) {\n const i = +prop;\n if (Number.isInteger(i) && i >= 0 && i < count) {\n let v = target[i];\n if (!v) {\n const s = flat[i * 2];\n v = target[i] = {\n index: i,\n key: getItemKey(i),\n start: s,\n size: flat[i * 2 + 1],\n end: s + flat[i * 2 + 1],\n lane: 0\n };\n }\n return v;\n }\n }\n if (prop === \"length\") return count;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nexport {\n createLazyMeasurementsView\n};\n//# sourceMappingURL=lazy-measurements.js.map\n","import { elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect, Virtualizer } from \"@tanstack/virtual-core\";\nclass VirtualizerControllerBase {\n constructor(host, options) {\n this.cleanup = () => {\n };\n const resolvedOptions = {\n ...options,\n onChange: (instance, sync) => {\n var _a;\n this.host.updateComplete.then(() => this.host.requestUpdate());\n (_a = options.onChange) == null ? void 0 : _a.call(options, instance, sync);\n }\n };\n this.virtualizer = new Virtualizer(resolvedOptions);\n (this.host = host).addController(this);\n }\n getVirtualizer() {\n return this.virtualizer;\n }\n hostConnected() {\n this.cleanup = this.virtualizer._didMount();\n }\n hostUpdated() {\n this.virtualizer._willUpdate();\n }\n hostDisconnected() {\n this.cleanup();\n }\n}\nclass VirtualizerController extends VirtualizerControllerBase {\n constructor(host, options) {\n super(host, {\n observeElementRect,\n observeElementOffset,\n scrollToFn: elementScroll,\n ...options\n });\n }\n}\nclass WindowVirtualizerController extends VirtualizerControllerBase {\n constructor(host, options) {\n super(host, {\n getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n ...options\n });\n }\n}\nexport {\n VirtualizerController,\n WindowVirtualizerController\n};\n//# sourceMappingURL=index.js.map\n","import type { VirtualItem } from '@tanstack/virtual-core'\nimport type { CSSResult, PropertyValues, TemplateResult } from 'lit'\nimport * as checkedIcon from '@nordhealth/icons/lib/assets/interface-checked.js'\nimport * as closeIcon from '@nordhealth/icons/lib/assets/interface-close-small.js'\nimport * as dropdownIcon from '@nordhealth/icons/lib/assets/interface-dropdown-small.js'\nimport { VirtualizerController } from '@tanstack/lit-virtual'\nimport { html, isServer, LitElement, nothing, unsafeCSS } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\n\nimport { groupBy } from '../common/collection.js'\nimport { ActiveDescendantController } from '../common/controllers/ActiveDescendantController.js'\nimport { FormDataController } from '../common/controllers/FormDataController.js'\nimport { LightDismissController } from '../common/controllers/LightDismissController.js'\nimport { ResizeController } from '../common/controllers/ResizeController.js'\nimport { StateAttributesController } from '../common/controllers/StateAttributesController.js'\nimport { observe } from '../common/decorators/observe.js'\nimport { cond } from '../common/directives/cond.js'\nimport { NordEvent } from '../common/events.js'\nimport { AutocompleteMixin } from '../common/mixins/AutocompleteMixin.js'\nimport { DraftComponentMixin } from '../common/mixins/DraftComponentMixin.js'\nimport { FieldControlMixin } from '../common/mixins/FieldControlMixin.js'\nimport { FloatingMixin } from '../common/mixins/FloatingComponentMixin.js'\nimport { InputMixin } from '../common/mixins/InputMixin.js'\nimport { SizeMixin } from '../common/mixins/SizeMixin.js'\nimport Icon from '../icon/Icon.js'\nimport { LocalizeController } from '../localization/LocalizeController.js'\nimport '../popout/Popout.js'\nimport '../spinner/Spinner.js'\n\nIcon.registerIcon(checkedIcon)\nIcon.registerIcon(closeIcon)\nIcon.registerIcon(dropdownIcon)\n\n/** Per-instance counter so light-DOM ids (`aria-activedescendant`, etc.) stay unique. */\nlet comboboxCount = 1\n\n/** Format a measured pixel size for a custom property (undefined → unset). */\nconst px = (value?: number) => (value ? `${value}px` : undefined)\n\n/**\n * A single option in a combobox.\n */\nexport interface ComboboxOption {\n /** The value submitted with the form and tracked in `value`. */\n value: string\n /** The human-readable text shown in the list and the input. */\n label: string\n /** Optional group heading used to cluster related options together. */\n group?: string\n /** When `true`, the option cannot be selected. */\n disabled?: boolean\n /** Optional rich HTML rendered instead of the plain `label` text. */\n html?: string\n /** Arbitrary data attached to the option, passed back to `renderOption`. */\n [key: string]: unknown\n}\n\n/**\n * Re-prefixes an authored, tag-scoped stylesheet for another tag name so a\n * sibling light-DOM component (e.g. `nord-autocomplete`) can reuse the exact\n * same `.n-*` rules without duplicating them. `Combobox.css` is the single\n * source of truth; this swaps the top-level `nord-combobox` selector token.\n */\nexport function retagComboboxStyles(styles: CSSResult, tag: string): CSSResult {\n // The stylesheet is imported via the lit-css transform (a `CSSResult`); reading\n // `cssText` and re-wrapping the tag-swapped text keeps the rules authored once.\n return unsafeCSS(styles.cssText.replace(/nord-combobox/g, tag))\n}\n\n/**\n * `ComboboxBase` is the (unregistered) shared base for `nord-combobox` (pick an\n * option, or several) and `nord-autocomplete` (free-text input with suggestions\n * where the typed text is the value). It owns every piece of the dropdown that\n * the two share — options, filtering, virtualization, keyboard navigation, the\n * popout, light-dismiss, ARIA wiring and rendering — and exposes a set of\n * protected hooks for the handful of behaviours that differ between a select and\n * a free-text control.\n *\n * Base UI parity: Autocomplete is the Combobox primitive with\n * `selectionMode=\"none\"` + `fillInputOnItemPress`.\n *\n * Subclasses MUST `injectLightDomStyles(this, <their stylesheet>)` in\n * `connectedCallback` (the base does not import a stylesheet, since the rules are\n * tag-scoped and each tag needs its own copy — see `retagComboboxStyles`).\n *\n * Not a registered custom element: it has no `@customElement` decorator and no\n * tag name, so the manifest config marks it `internal` and the React/Vue type\n * generators skip it.\n */\nexport default abstract class ComboboxBase extends DraftComponentMixin(\n SizeMixin(AutocompleteMixin(FieldControlMixin(InputMixin(FloatingMixin(LitElement))))),\n) {\n /** Stable, unique id base for the light-DOM ARIA wiring of this instance. */\n private comboboxId = `${this.localName || 'nord-combobox'}-${comboboxCount++}`\n\n // The built-in `<label for>` (from FieldControlMixin) must point at the real\n // focusable input, so override the mixin's default id with the input's id.\n protected override inputId = `${this.comboboxId}-input`\n\n protected inputRef = createRef<HTMLInputElement>()\n\n // Both variants widen `value` beyond the controller's `InputMixinInterface`\n // host type. The controller only reads `form`/`name`/`disabled` and the\n // `value()` option (not `host.value`), so casting the host is safe.\n private formData = new FormDataController(this as ComboboxBase & { value: string }, {\n value: () => this.formValue,\n })\n\n /**\n * Remembers value→label pairs seen from any option so a preselected value\n * that has since left the loaded options still renders its label.\n */\n protected labelCache = new Map<string, string>()\n\n protected localize = new LocalizeController<'nord-combobox'>(this)\n\n /** Re-renders when the host's forwarded ARIA labelling attributes change. */\n private ariaObserver?: MutationObserver\n\n private widthObserver?: ResizeObserver\n\n @query('nord-popout', true) private popout?: HTMLElement & {\n show: () => Promise<unknown>\n hide: (moveFocusToButton?: boolean) => Promise<unknown>\n }\n\n private dismiss = new LightDismissController(this, {\n isOpen: () => this.open,\n onDismiss: () => this.hide(),\n isDismissible: node => node !== this,\n })\n\n /**\n * Reflects the control's state to Base-UI-style `data-*` attributes\n * (`data-invalid`, `data-focused`) so consumers can style the whole control.\n * `trackFocus` keeps `data-focused` present while focus stays within the host\n * — e.g. moving between the input and the clear button.\n */\n private stateAttributes = new StateAttributesController(\n this,\n () => ({ invalid: this.invalid }),\n { trackFocus: true },\n )\n\n /**\n * The options to show in the combobox.\n */\n @property({ attribute: false }) options: ComboboxOption[] = []\n\n /**\n * Placeholder text to display within the input.\n */\n @property({ reflect: true }) placeholder?: string\n\n /**\n * Use external filtering mode. When set to `true`, the component will not\n * perform internal text-based filtering and expects the consumer to update\n * the `options` in response to the `input` event.\n */\n @property({ reflect: true, type: Boolean, attribute: 'external-filtering' }) externalFiltering = false\n\n /**\n * Shows a spinner in the control and listbox while asynchronous results are\n * loading. Pair with `external-filtering` for async search.\n */\n @property({ reflect: true, type: Boolean }) loading = false\n\n /**\n * Highlights the first option after filtering so pressing Enter selects it.\n */\n @property({ reflect: true, type: Boolean, attribute: 'auto-highlight' }) autoHighlight = false\n\n /**\n * Marks the control as invalid, applying error styling and setting\n * `aria-invalid` on the input.\n */\n @property({ reflect: true, type: Boolean }) invalid = false\n\n // The control's own invalid state for the field context: its `invalid` prop or\n // a built-in `error` (when used standalone).\n protected override get ownInvalid() {\n return this.invalid || super.ownInvalid\n }\n\n /**\n * Marks the control read-only: the value stays visible, focusable and\n * submitted with the form, but the listbox can't be opened and the value can't\n * be changed (no typing, navigation, selection or clearing). Unlike `disabled`,\n * a read-only control still participates in form submission.\n */\n @property({ reflect: true, type: Boolean }) readonly = false\n\n /**\n * Whether clicking the input opens the listbox. Defaults to `true`. Set to\n * `false` to only open on typing or a trigger (chevron) click. Focusing the\n * input (e.g. tabbing in) never opens the list on its own. Mirrors Base UI's\n * `openOnInputClick`.\n */\n @property({ reflect: true, type: Boolean, attribute: 'open-on-input-click' }) openOnInputClick = true\n\n /**\n * Message shown when no options match the query. Defaults to \"No items found.\".\n */\n @property({ reflect: true, attribute: 'no-results-text' }) noResultsText?: string\n\n /**\n * Virtualizes (windows) the option list so only the rows in view are rendered,\n * keeping very large lists (thousands of options) fast. Rows are assumed to be a\n * uniform height, which is measured from the first option. Virtualization is\n * skipped for grouped lists, whose labels and separators break that assumption —\n * grouped lists are expected to be short and curated.\n */\n @property({ reflect: true, type: Boolean }) virtualized = false\n\n /**\n * Custom renderer for the content of each option. Receives the option and\n * should return a Lit `TemplateResult` or a string. When omitted, the\n * option's `html` (if present) or `label` is rendered.\n */\n @property({ attribute: false }) renderOption?: (option: ComboboxOption) => TemplateResult | string\n\n /** The current search query in the combobox input. */\n @state() protected search = ''\n\n /**\n * Whether the user has actually typed into the input since it was last\n * opened/committed. Until they do, a single-select shows the committed\n * selection's label in the input (editable) rather than an empty filter —\n * matching Base UI, where reopening keeps the selected label visible and the\n * list unfiltered until the first keystroke. Set on typing; cleared on commit\n * and on close.\n */\n @state() protected queryDirty = false\n\n /**\n * Tracks the active (highlighted) row of the virtual-focus listbox: the focus\n * stays on the input while this roams the rows and surfaces as\n * `aria-activedescendant`. Owns the wrap / skip-disabled / move math the\n * combobox previously duplicated. The out-of-range create row (index ===\n * `filteredOptions.length`) reports as enabled (`filteredOptions[i]` is\n * `undefined`, so `!undefined?.disabled` is `true`) and maps to its create-row\n * id, matching the create-row semantics.\n */\n protected activeDescendant = new ActiveDescendantController(this, {\n count: () => this.rowCount,\n isEnabled: i => !this.filteredOptions[i]?.disabled,\n optionId: i =>\n this.createIndex !== -1 && i === this.createIndex ? this.createId : this.optionId(i),\n })\n\n /** The scroll container for the options; the virtualizer's scroll element. */\n @query('.n-listbox') private listboxEl?: HTMLElement\n\n /**\n * Containers for the `start`/`end` slot content. The control renders into the\n * light DOM, so real `<slot>` elements don't project; instead these act as\n * landing zones and the matching host children (`slot=\"start\"`/`slot=\"end\"`)\n * are relocated into them. A `ResizeController` per zone feeds the measured\n * inline size into a custom property so the input padding can clear the slot\n * (mirrors `nord-input`).\n */\n @query('.n-slot-start') private startSlot?: HTMLElement\n @query('.n-slot-end') private endSlot?: HTMLElement\n private startObserver = new ResizeController(this, () => this.startSlot as HTMLElement)\n private endObserver = new ResizeController(this, () => this.endSlot as HTMLElement)\n\n /** Re-renders when the host's `slot=\"start\"`/`slot=\"end\"` children change. */\n private slotObserver?: MutationObserver\n\n /** Set when a keyboard move should scroll the active option into view. */\n protected scrollActivePending = false\n\n /** Row-height estimate used until the uniform row height is measured once. */\n private static readonly VIRTUAL_ROW_ESTIMATE = 36\n\n /** Extra rows rendered above and below the viewport to smooth scrolling. */\n private static readonly VIRTUAL_OVERSCAN = 6\n\n /**\n * The measured uniform row height, sampled once from the first rendered row.\n * Option rows are a fixed height, so a single sample feeds `estimateSize` for\n * the whole list — far cheaper and more stable than re-measuring every row on\n * every render, which fed a `measure → onChange → re-render → measure` loop\n * that could peg the main thread.\n */\n private measuredRowSize?: number\n\n /**\n * Windows the flat option list (see `virtualized`) with TanStack Virtual: only\n * the rows in view are rendered, sized from the measured uniform row height,\n * and the active option is kept on-screen via `scrollToIndex`. Its `onChange`\n * re-renders the host on scroll/resize; `count` is kept in sync in `willUpdate`.\n */\n private virtualizer = new VirtualizerController<HTMLElement, HTMLElement>(this, {\n count: 0,\n overscan: ComboboxBase.VIRTUAL_OVERSCAN,\n estimateSize: () => this.measuredRowSize ?? ComboboxBase.VIRTUAL_ROW_ESTIMATE,\n getScrollElement: () => this.listboxEl ?? null,\n getItemKey: index => this.filteredOptions[index]?.value ?? index,\n })\n\n /**\n * Whether the user has moved the active option with the keyboard since the\n * last filter change. Used to decide if a bare Enter (no navigation) selects\n * the highlighted option — only when `autoHighlight` is set, the first option\n * becomes implicitly selectable.\n */\n protected navigated = false\n\n // ---------------------------------------------------------------------------\n // Variant hooks — overridable behaviour that distinguishes the select combobox\n // from the free-text autocomplete. Sensible defaults make the base behave as a\n // single-select combobox out of the box.\n // ---------------------------------------------------------------------------\n\n /**\n * Whether the input currently shows the transient query rather than the\n * committed selection's label. A single-select shows the query only once the\n * user starts typing (`queryDirty`); until then — including right after\n * reopening — the input keeps the selected option's label visible and\n * editable, matching Base UI. `multiple` shows the query always (the\n * selections live in chips, not the input).\n */\n protected get showsQueryInInput(): boolean {\n return this.queryDirty\n }\n\n /** The text shown in the input. Select: query while open, label when closed. */\n protected get displayValue(): string {\n // While the query is shown the input is a filter; otherwise it shows the\n // selected option's label.\n if (this.showsQueryInInput) {\n return this.search\n }\n\n if (!this.value || Array.isArray(this.value)) {\n return ''\n }\n\n return this.labelFor(this.value)\n }\n\n /** The placeholder forwarded to the inner input. */\n protected get inputPlaceholder(): string | undefined {\n return this.placeholder\n }\n\n /** The transient search text the list is filtered against. */\n protected get filterQuery(): string {\n return this.search\n }\n\n /** Whether an option is selected (drives `aria-selected` and the check icon). */\n protected isSelected(option: ComboboxOption): boolean {\n return this.values.includes(option.value)\n }\n\n /** Serialises `value` for the form. */\n protected get formValue(): string | undefined {\n const { value } = this\n\n if (Array.isArray(value)) {\n return value.length ? value.join(',') : undefined\n }\n\n return value || undefined\n }\n\n /** Whether there is any committed value (drives the clear affordance). */\n protected get hasValue(): boolean {\n return this.values.length > 0\n }\n\n /** The index of the create row, or `-1` when it isn't shown. Select-only. */\n protected get createIndex(): number {\n return -1\n }\n\n /** Whether the \"Create\" affordance should be offered for the current query. */\n protected get canCreate(): boolean {\n return false\n }\n\n /** Leading content inside the control (e.g. chips). None by default. */\n protected renderLeadingControl(): unknown {\n return nothing\n }\n\n /** The `aria-autocomplete` value for the inner input. */\n protected get ariaAutocomplete(): string {\n return 'list'\n }\n\n /** Commit the active option. Select: set value, close, restore focus. */\n protected selectOption(option: ComboboxOption): void {\n if (option.disabled) {\n return\n }\n\n // Remember the label so it survives the option leaving the result set.\n this.labelCache.set(option.value, option.label)\n\n this.value = option.value\n this.search = ''\n this.queryDirty = false\n this.commit()\n this.hide()\n // Restore focus to the input. Focus alone never opens the listbox, so no\n // guard is needed here.\n this.focus()\n }\n\n /**\n * Hook for the Enter key when the listbox is open and the create/option\n * branches have not handled it. Default: no-op (the base handles option\n * selection in `handleKeydown`). Subclasses (autocomplete) return `true` to\n * signal they fully handled Enter.\n */\n protected handleEnter(_e: KeyboardEvent): boolean {\n return false\n }\n\n /** Hook invoked when a key is pressed (before the switch). Autocomplete uses it. */\n protected onKeydown(_e: KeyboardEvent): void {}\n\n /** Hook invoked on input blur. Autocomplete reverts inline ghosts here. */\n protected onBlur(): void {}\n\n /** Hook invoked after each render (for inline-ghost selection, etc.). */\n protected afterUpdate(): void {}\n\n /** Hook invoked when the pointer hovers an option (autocomplete clears ghost state). */\n protected onOptionHover(): void {}\n\n /** Hook invoked when ArrowUp/ArrowDown moves the active option. */\n protected onMove(): void {}\n\n // ---------------------------------------------------------------------------\n\n /** Normalises `value` to an array regardless of single/multiple shape. */\n protected get values(): string[] {\n const { value } = this\n\n if (Array.isArray(value)) {\n return value\n }\n\n return value ? [value] : []\n }\n\n /** Upper bound on the label cache so long async sessions don't grow it forever. */\n private static labelCacheLimit = 500\n\n /** Records value→label pairs so labels survive options leaving the result set. */\n protected cacheLabels(options: ComboboxOption[]) {\n for (const option of options) {\n if (option.value) {\n this.labelCache.set(option.value, option.label)\n }\n }\n\n // Evict the oldest non-selected labels once over the limit (Maps iterate in\n // insertion order); never drop a label that's currently selected.\n if (this.labelCache.size <= ComboboxBase.labelCacheLimit) {\n return\n }\n\n const selected = new Set(this.values)\n for (const key of this.labelCache.keys()) {\n if (this.labelCache.size <= ComboboxBase.labelCacheLimit) {\n break\n }\n if (!selected.has(key)) {\n this.labelCache.delete(key)\n }\n }\n }\n\n /**\n * Memoised filter result. `filteredOptions` is read many times per render (and\n * per keyboard/scroll event via rowCount/activeOption/isVirtual), so the O(n)\n * filter + groupBy must not re-run on every access — that would defeat the\n * point of virtualizing a large list. Recomputed only when the options, the\n * query, or the filtering mode change; the group map is cached alongside.\n */\n private filteredCache?: {\n options: ComboboxOption[]\n query: string\n external: boolean\n result: ComboboxOption[]\n hasGroups: boolean\n groups?: Map<string | undefined, ComboboxOption[]>\n }\n\n /**\n * The options the control filters and renders from. The base uses the\n * `options` property directly; `Combobox` overrides this to merge declarative\n * `<nord-combobox-option>` children and auto-created options.\n */\n protected get resolvedOptions(): ComboboxOption[] {\n return this.options\n }\n\n protected get filtered() {\n const options = this.resolvedOptions\n const query = this.filterQuery\n const external = this.externalFiltering\n const cache = this.filteredCache\n if (cache && cache.options === options && cache.query === query && cache.external === external) {\n return cache\n }\n\n // Labels only change with the options, so re-cache only when those change.\n if (!cache || cache.options !== options) {\n this.cacheLabels(options)\n }\n\n const lower = query.toLocaleLowerCase()\n const matched = external || !query\n ? options\n : options.filter(option => option.label.toLocaleLowerCase().includes(lower))\n\n // Order by group so the flat list used for keyboard navigation (activeIndex,\n // Home/End, aria-activedescendant) matches the grouped display order — else\n // interleaved groups desync the two.\n const hasGroups = matched.some(option => option.group)\n const result = hasGroups\n ? Array.from(groupBy(matched, 'group'), ([, groupOptions]) => groupOptions).flat()\n : matched\n\n this.filteredCache = {\n options,\n query,\n external,\n result,\n hasGroups,\n groups: hasGroups ? groupBy(result, 'group') : undefined,\n }\n return this.filteredCache\n }\n\n /** The options remaining after filtering by the current query. */\n protected get filteredOptions(): ComboboxOption[] {\n return this.filtered.result\n }\n\n /** Total number of keyboard-navigable rows, including the create row. */\n protected get rowCount(): number {\n return this.filteredOptions.length + (this.canCreate ? 1 : 0)\n }\n\n /** The currently active option, used for `aria-activedescendant` and Enter. */\n protected get activeOption(): ComboboxOption | undefined {\n return this.filteredOptions[this.activeDescendant.activeIndex]\n }\n\n /**\n * Whether the option list is currently windowed. Only flat (non-grouped) lists\n * with at least one option are virtualized.\n */\n protected get isVirtual(): boolean {\n if (!this.virtualized) {\n return false\n }\n const { result, hasGroups } = this.filtered\n return result.length > 0 && !hasGroups\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n // An external label (e.g. nord-field-label) names the control by setting\n // `aria-labelledby`/`aria-label` on the host; forward it to the inner input.\n this.ariaObserver ??= new MutationObserver(() => this.requestUpdate())\n this.ariaObserver.observe(this, {\n attributes: true,\n attributeFilter: ['aria-label', 'aria-labelledby'],\n })\n\n // Mirror the control width into a custom property so the dropdown matches it\n // (like the provet combobox), tracking responsive/container resizes.\n this.widthObserver ??= new ResizeObserver(() => this.syncAnchorInlineSize())\n this.widthObserver.observe(this)\n this.syncAnchorInlineSize()\n\n // Watch for `slot=\"start\"`/`slot=\"end\"` children being added or removed so\n // they get relocated into their landing zones on the next render.\n this.slotObserver ??= new MutationObserver(() => this.requestUpdate())\n this.slotObserver.observe(this, { childList: true })\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this.ariaObserver?.disconnect()\n this.ariaObserver = undefined\n this.widthObserver?.disconnect()\n this.widthObserver = undefined\n this.slotObserver?.disconnect()\n this.slotObserver = undefined\n }\n\n /**\n * Relocates the host's `slot=\"start\"`/`slot=\"end\"` children into the matching\n * landing zone inside the control. Only direct host children are considered,\n * and a child already sitting in its zone is left untouched, so repeated\n * updates are idempotent and don't disturb focus or pointer state.\n */\n private relocateSlots() {\n if (isServer) {\n return\n }\n\n const move = (name: 'start' | 'end', target?: HTMLElement) => {\n if (!target) {\n return\n }\n for (const child of Array.from(this.children)) {\n if (child.getAttribute('slot') === name && child.parentElement !== target) {\n target.appendChild(child)\n }\n }\n }\n\n move('start', this.startSlot)\n move('end', this.endSlot)\n }\n\n /** Mirrors the host (control) width into `--_n-combobox-anchor-inline-size`. */\n protected syncAnchorInlineSize() {\n const width = this.offsetWidth\n if (width) {\n this.style.setProperty('--_n-combobox-anchor-inline-size', `${width}px`)\n }\n }\n\n // Render in the light DOM so the control participates in the document tree\n // (form labelling, Tailwind), like the other new Nord components. The UI renders\n // into a layout-transparent (`display: contents`) child wrapper rather than the\n // host itself, so declarative `<nord-combobox-option>` children can live as\n // untouched siblings instead of being wiped by this element's own render.\n protected createRenderRoot() {\n if (isServer) {\n return this\n }\n const root = document.createElement('div')\n root.className = 'n-render-root'\n this.appendChild(root)\n return root\n }\n\n /**\n * Show the listbox programmatically.\n */\n show() {\n if (this.open || this.disabled || this.readonly) {\n return\n }\n\n const notCancelled = this.dispatchEvent(new NordEvent('open', { cancelable: true }))\n\n if (notCancelled) {\n this.open = true\n }\n }\n\n /**\n * Hide the listbox programmatically.\n */\n hide() {\n if (!this.open) {\n return\n }\n\n this.open = false\n\n this.onHide()\n\n this.dispatchEvent(new NordEvent('close'))\n }\n\n /**\n * Hook for what happens to the transient query when the listbox closes.\n * Select mode discards an abandoned filter query so the next open shows the\n * full list and the selected option's label, not the stale search.\n */\n protected onHide() {\n this.search = ''\n // Reopening starts clean: the input shows the committed label again and the\n // list is unfiltered until the user types.\n this.queryDirty = false\n }\n\n /**\n * Focus the control's input.\n */\n focus(options?: FocusOptions) {\n this.inputRef.value?.focus(options)\n }\n\n @observe('open', 'updated')\n protected handleOpenChange() {\n if (this.open) {\n void this.popout?.show()\n this.resetActiveIndex()\n }\n else {\n void this.popout?.hide(false)\n }\n }\n\n /**\n * Disabling the control while the listbox is open must close it. `show()`\n * guards against opening when disabled, but nothing closes an already-open\n * popout when `disabled` flips to `true` at runtime.\n */\n @observe('disabled')\n protected handleDisabledChange() {\n if (this.disabled && this.open) {\n this.hide()\n }\n }\n\n /** Row height changes with the size variant, so re-sample it on the next render. */\n @observe('size')\n protected resetRowSample() {\n this.measuredRowSize = undefined\n }\n\n protected updated(changedProperties: PropertyValues) {\n super.updated(changedProperties)\n\n // Move any `slot=\"start\"`/`slot=\"end\"` host children into their landing\n // zones inside the control. The control is light DOM, so real `<slot>`\n // projection isn't available; relocating keeps the public API identical to\n // `nord-input` (`<nord-icon slot=\"start\">`).\n this.relocateSlots()\n\n // Variant hook (e.g. autocomplete inline-ghost selection) runs first so it\n // can reach into the freshly-rendered input.\n this.afterUpdate()\n\n // Sample the uniform row height once so the virtualizer windows from the real\n // height instead of the estimate (no-op once sampled).\n this.sampleRowSize()\n\n // Scroll the active option into view after a keyboard move (never on hover).\n if (this.scrollActivePending) {\n this.scrollActivePending = false\n this.scrollActiveIntoView()\n }\n }\n\n /** Keeps `count` in sync with the filtered list before each render. */\n protected willUpdate(changed: PropertyValues) {\n super.willUpdate(changed)\n if (this.isVirtual) {\n const v = this.virtualizer.getVirtualizer()\n const count = this.filteredOptions.length\n if (v.options.count !== count) {\n v.setOptions({ ...v.options, count })\n }\n }\n }\n\n /**\n * Keeps the active row visible after a keyboard move. Virtualized option rows\n * ask the virtualizer to scroll the index into view (the row may not be in the\n * DOM yet); the create row and plain lists defer to the browser since their\n * element is always rendered.\n */\n private scrollActiveIntoView() {\n const listbox = this.listboxEl\n if (!listbox) {\n return\n }\n\n const activeIndex = this.activeDescendant.activeIndex\n if (this.isVirtual && activeIndex >= 0 && activeIndex !== this.createIndex) {\n this.virtualizer.getVirtualizer().scrollToIndex(activeIndex, { align: 'auto' })\n return\n }\n\n listbox.querySelector('.n-option.is-active')?.scrollIntoView({ block: 'nearest' })\n }\n\n /** Keeps `open` in sync if the popout closes itself (e.g. light dismiss). */\n private handlePopoutClose(e: Event) {\n // The popout dispatches its own bubbling+composed `close`; stop it at the\n // boundary so the combobox emits exactly one canonical `close` (from `hide`).\n e.stopPropagation()\n\n if (this.open) {\n this.hide()\n }\n }\n\n /** Swallows the popout's own `open` so the combobox emits a single `open`. */\n private handlePopoutOpen(e: Event) {\n e.stopPropagation()\n }\n\n /** Re-clamps the active index so it stays within the navigable rows. */\n @observe('search')\n protected resetActiveIndex() {\n // Start with no active row (-1) so nothing looks selected until the user\n // navigates — matching Base UI, where the first ArrowDown lands on the first\n // row. Two opt-ins pre-highlight a row instead:\n // • `autoHighlight` highlights the first navigable row so a bare Enter commits it.\n // • a `creatable` create row, when it is the only actionable row (no enabled\n // option to choose), so a bare Enter creates the typed value (⏎ Kbd hint).\n if (this.autoHighlight) {\n this.activeDescendant.setActiveIndex(this.activeDescendant.nextEnabledIndex(0, 1))\n }\n else if (this.createIndex !== -1 && this.filteredOptions.every(option => option.disabled)) {\n this.activeDescendant.setActiveIndex(this.createIndex)\n }\n else {\n this.activeDescendant.reset()\n }\n this.navigated = false\n // Re-scroll to the (reset) active option so a fresh filter or reopen starts\n // at the top rather than wherever the list was previously scrolled.\n this.scrollActivePending = true\n }\n\n protected handleInput(e: Event) {\n e.stopPropagation()\n\n if (this.readonly) {\n return\n }\n\n const input = e.target as HTMLInputElement\n this.search = input.value\n // The user is now editing the filter, so the input shows the live query\n // rather than the committed label, and the list filters by it.\n this.queryDirty = true\n\n if (!this.open) {\n this.show()\n }\n\n /** Fired as the user types into the search input. */\n this.dispatchEvent(new NordEvent('input'))\n\n // Variant hook so autocomplete can commit the typed text as the live value.\n this.onInput(input)\n }\n\n /** Hook after the search query updates from typing. Autocomplete commits live. */\n protected onInput(_input: HTMLInputElement): void {}\n\n private handleBlur() {\n this.onBlur()\n }\n\n protected handleKeydown(e: KeyboardEvent) {\n // Read-only locks the value: no opening, navigating, selecting or clearing.\n if (this.readonly) {\n return\n }\n\n this.onKeydown(e)\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n if (!this.open) {\n this.show()\n return\n }\n this.move(1)\n break\n case 'ArrowUp':\n e.preventDefault()\n if (!this.open) {\n this.show()\n return\n }\n this.move(-1)\n break\n case 'End': {\n if (this.open) {\n e.preventDefault()\n if (this.activeDescendant.last()) {\n this.navigated = true\n this.scrollActivePending = true\n }\n }\n break\n }\n case 'Home': {\n if (this.open) {\n e.preventDefault()\n if (this.activeDescendant.first()) {\n this.navigated = true\n this.scrollActivePending = true\n }\n }\n break\n }\n case 'Enter':\n if (!this.open) {\n break\n }\n // Let a variant fully own Enter (autocomplete commits free text / fills).\n if (this.handleEnter(e)) {\n break\n }\n // The create row is an explicit affordance hinted with a ⏎ Kbd, so a\n // bare Enter always commits it when it is the active row.\n if (this.createIndex !== -1 && this.activeDescendant.activeIndex === this.createIndex) {\n e.preventDefault()\n this.emitCreate()\n break\n }\n // For options, a bare Enter (no navigation) only commits the highlighted\n // first row once it is implicitly selectable (navigated or autoHighlight).\n if ((this.navigated || this.autoHighlight) && this.activeOption) {\n e.preventDefault()\n this.selectOption(this.activeOption)\n }\n break\n case 'Escape':\n if (this.open) {\n e.preventDefault()\n this.hide()\n }\n break\n default:\n this.onUnhandledKeydown(e)\n break\n }\n }\n\n /** Hook for keys the base switch does not handle (Backspace chips, etc.). */\n protected onUnhandledKeydown(_e: KeyboardEvent): void {}\n\n /**\n * Fires the create affordance. Default is a no-op; the select combobox\n * overrides this to dispatch its `create` event.\n */\n protected emitCreate(): void {}\n\n private move(delta: number) {\n if (this.rowCount === 0) {\n return\n }\n\n this.onMove()\n\n // The controller does the index math: from \"no active row\" (-1, autocomplete\n // before the first navigation) ArrowDown lands on the first row and ArrowUp\n // on the last; otherwise it steps from the current row, skipping disabled\n // rows and wrapping. It returns `false` when every row is disabled (and there\n // is no create row), so we keep the listbox as-is rather than landing on an\n // unselectable row or marking it as navigated.\n if (!this.activeDescendant.move(delta)) {\n return\n }\n\n this.navigated = true\n this.scrollActivePending = true\n }\n\n protected commit() {\n this.requestUpdate()\n\n /**\n * Fired whenever the committed value is changed via user interaction.\n */\n this.dispatchEvent(new NordEvent('change'))\n }\n\n /** Resolves a value to its best-known label (current options, then cache). */\n protected labelFor(value: string): string {\n const option = this.resolvedOptions.find(o => o.value === value)\n return option?.label ?? this.labelCache.get(value) ?? value\n }\n\n render() {\n // `filteredOptions` caches value→label pairs as a side effect.\n const { result: options, hasGroups, groups } = this.filtered\n // Virtualize only flat, non-empty lists. `willUpdate` has already synced the\n // virtualizer's count, so the rendered window is current here.\n const isVirtual = this.virtualized && !hasGroups && options.length > 0\n const virtualItems = isVirtual ? this.virtualizer.getVirtualizer().getVirtualItems() : undefined\n // O(1) flat-index lookup for the grouped path (avoids indexOf per option).\n const indexByValue = hasGroups ? new Map(options.map((option, i) => [option.value, i])) : undefined\n const activeIndex = this.activeDescendant.activeIndex\n const activeOption = this.activeOption\n // Suppress aria-activedescendant when the active option is windowed out of a\n // virtualized list (e.g. after mouse-scrolling away from it), so it never\n // references a row that isn't in the DOM. The create row is always rendered.\n const activeRendered\n = !virtualItems\n || activeIndex === this.createIndex\n || virtualItems.some(item => item.index === activeIndex)\n const activeId\n = this.createIndex !== -1 && activeIndex === this.createIndex\n ? `${this.comboboxId}-create`\n : activeOption && activeRendered\n ? this.optionId(activeIndex)\n : undefined\n const listId = `${this.comboboxId}-list`\n const anchorId = `${this.comboboxId}-anchor`\n const showClear = this.showClear\n\n // Naming/description resolved by the FieldControlMixin getters (field context\n // in a field, built-in label/hint/error standalone, or host aria-* fallback).\n const ariaLabel = this.controlAriaLabel\n const ariaLabelledby = this.controlAriaLabelledby\n const ariaDescribedby = this.controlAriaDescribedby\n\n const input = html`\n <input\n ${ref(this.inputRef)}\n class=\"n-input\"\n type=\"text\"\n id=\"${this.comboboxId}-input\"\n role=\"combobox\"\n .value=${this.displayValue}\n placeholder=${ifDefined(this.inputPlaceholder)}\n ?disabled=${this.effectiveDisabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n autocomplete=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n aria-label=${ifDefined(ariaLabel)}\n aria-labelledby=${ifDefined(ariaLabelledby)}\n aria-describedby=${ifDefined(ariaDescribedby)}\n aria-autocomplete=${this.ariaAutocomplete}\n aria-haspopup=\"listbox\"\n aria-controls=${listId}\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-activedescendant=${ifDefined(this.open ? activeId : undefined)}\n aria-invalid=${ifDefined(this.controlAriaInvalid)}\n @input=${this.handleInput}\n @blur=${this.handleBlur}\n @keydown=${this.handleKeydown}\n />\n `\n\n const leading = this.renderLeadingControl()\n\n return html`\n ${this.renderLabel()}\n <div class=\"n-combobox\" id=${anchorId}>\n <div\n class=${classMap({\n 'n-control': true,\n 'is-invalid': this.effectiveInvalid,\n })}\n style=${styleMap({\n '--_n-combobox-start-inline-size': px(this.startObserver.inlineSize),\n '--_n-combobox-end-inline-size': px(this.endObserver.inlineSize),\n })}\n @click=${this.handleControlClick}\n >\n <span class=\"n-slot n-slot-start\"></span>\n\n ${leading === nothing\n ? input\n : html`<div class=\"n-tags\">${leading}${input}</div>`}\n\n <span class=\"n-slot n-slot-end\"></span>\n\n ${this.loading\n ? html`<nord-spinner class=\"n-loading\" size=\"s\"></nord-spinner>`\n : nothing}\n\n ${showClear\n ? html`\n <button\n class=\"n-clear\"\n type=\"button\"\n aria-label=${this.localize.term('clearLabel')}\n ?disabled=${this.disabled || this.readonly}\n @click=${this.handleClearClick}\n >\n <nord-icon name=\"interface-close-small\"></nord-icon>\n </button>\n ${this.showToggle\n ? html`<span class=\"n-divider\" aria-hidden=\"true\"></span>`\n : nothing}\n `\n : nothing}\n\n ${this.showToggle\n ? html`\n <button\n class=\"n-toggle\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ?disabled=${this.disabled || this.readonly}\n @click=${this.handleToggleClick}\n >\n <nord-icon name=\"interface-dropdown-small\"></nord-icon>\n </button>\n `\n : nothing}\n </div>\n\n <nord-popout\n id=\"${this.comboboxId}-popout\"\n anchor=${anchorId}\n align=${ifDefined(this.align)}\n position=${ifDefined(this.position)}\n always-floating\n @open=${this.handlePopoutOpen}\n @close=${this.handlePopoutClose}\n >\n <div\n id=${listId}\n class=\"n-listbox\"\n role=${ifDefined(this.rowCount ? 'listbox' : undefined)}\n aria-label=${ifDefined(this.rowCount ? ariaLabel : undefined)}\n aria-labelledby=${ifDefined(this.rowCount ? ariaLabelledby : undefined)}\n aria-multiselectable=${ifDefined(this.rowCount ? this.ariaMultiselectable : undefined)}\n >\n ${options.length === 0 && !this.canCreate\n ? this.renderEmpty()\n : hasGroups && groups && indexByValue\n ? Array.from(groups, ([group, groupOptions]) => this.renderGroup(group, groupOptions, indexByValue))\n : isVirtual && virtualItems\n ? this.renderVirtualOptions(options, virtualItems)\n : repeat(\n options,\n option => option.value,\n (option, i) => this.renderListOption(option, i),\n )}\n ${this.canCreate ? this.renderCreate() : nothing}\n </div>\n </nord-popout>\n </div>\n ${this.renderError()}\n ${this.isHintBelow ? this.renderHint() : nothing}\n `\n }\n\n /** Whether the clear (✕) affordance shows. Off by default (no `clearable`). */\n protected get showClear(): boolean {\n return false\n }\n\n /**\n * Whether the dropdown chevron toggle (and the divider before it) renders. On\n * by default — the combobox is a picker that opens its full list on click —\n * but hidden while `readonly`, where the value is shown but not interactive.\n * Autocomplete overrides this to `false`: like Base UI's autocomplete (which\n * renders no `Trigger`), it is a search input whose list appears on typing.\n */\n protected get showToggle(): boolean {\n return !this.readonly\n }\n\n /**\n * Drives the listbox `aria-multiselectable`. Single-select by default;\n * autocomplete overrides this to `undefined` so the attribute is omitted (it\n * has no selection model).\n */\n protected get ariaMultiselectable(): 'true' | 'false' | undefined {\n return 'false'\n }\n\n protected renderGroup(\n group: string | undefined,\n groupOptions: ComboboxOption[],\n indexByValue: Map<string, number>,\n ) {\n const groupId = `${this.comboboxId}-group-${group}`\n\n return html`\n <div role=\"group\" aria-labelledby=${cond(group, groupId)}>\n ${group\n ? html`<div class=\"n-group-label\" role=\"presentation\" id=${groupId}>${group}</div>`\n : nothing}\n ${repeat(\n groupOptions,\n option => option.value,\n option => this.renderListOption(option, indexByValue.get(option.value) ?? 0),\n )}\n </div>\n `\n }\n\n /** Resolves the content shown for a single option. */\n protected optionContent(option: ComboboxOption): TemplateResult | unknown {\n if (this.renderOption) {\n return this.renderOption(option)\n }\n\n if (option.html) {\n return unsafeHTML(option.html)\n }\n\n return option.label\n }\n\n /**\n * Samples the uniform row height once from the first rendered virtual row, then\n * re-measures the virtualizer so the window is sized from the real height rather\n * than the estimate. Runs only while the sample is missing and a laid-out row is\n * present, so it never becomes a per-render measurement loop.\n */\n private sampleRowSize() {\n if (!this.isVirtual || this.measuredRowSize !== undefined) {\n return\n }\n // Measure the inner option, not the row: the row is already given the\n // estimated height, so sampling it back would just echo the estimate. The\n // option is sized by its own content, so it yields the true uniform height.\n const row = this.listboxEl?.querySelector<HTMLElement>('.n-virtual-row .n-option')\n const size = row?.getBoundingClientRect().height\n if (size && size > 0) {\n this.measuredRowSize = size\n this.virtualizer.getVirtualizer().measure()\n }\n }\n\n /**\n * Renders only the virtual items currently in view, absolutely positioned\n * inside a full-height sizer so the scrollbar reflects the whole list. Rows take\n * a fixed height from the virtualizer (uniform rows), so no per-row measurement\n * is needed. `setSize`/`posinset` give assistive tech the true total even though\n * most rows aren't in the DOM.\n */\n private renderVirtualOptions(options: ComboboxOption[], items: VirtualItem[]) {\n const total = options.length\n const totalSize = this.virtualizer.getVirtualizer().getTotalSize()\n\n // Force each row to the virtualizer's size only once the uniform height has\n // been sampled. Before then the row keeps its natural height so the sample\n // reads the real content height rather than echoing the estimate back.\n const sized = this.measuredRowSize !== undefined\n\n return html`\n <div class=\"n-virtual-sizer\" style=\"block-size:${totalSize}px\">\n ${repeat(\n items,\n item => item.key,\n item => html`\n <div\n class=\"n-virtual-row\"\n data-index=${item.index}\n style=${sized\n ? `block-size:${item.size}px; transform: translateY(${item.start}px)`\n : `transform: translateY(${item.start}px)`}\n >\n ${this.renderListOption(options[item.index], item.index, total)}\n </div>\n `,\n )}\n </div>\n `\n }\n\n protected renderListOption(option: ComboboxOption, index: number, setSize?: number) {\n const selected = this.isSelected(option)\n\n return html`\n <div\n id=${this.optionId(index)}\n class=${classMap({\n 'n-option': true,\n 'is-active': index === this.activeDescendant.activeIndex,\n 'is-disabled': Boolean(option.disabled),\n })}\n role=\"option\"\n aria-selected=${this.optionAriaSelected(selected)}\n aria-disabled=${option.disabled ? 'true' : nothing}\n aria-setsize=${ifDefined(setSize)}\n aria-posinset=${ifDefined(setSize === undefined ? undefined : index + 1)}\n @click=${() => this.selectOption(option)}\n @mousemove=${() => this.handleOptionHover(index)}\n >\n ${this.rendersCheck\n ? html`\n <span class=\"n-option-check\">\n ${this.showCheck(selected) ? html`<nord-icon name=\"interface-checked\" size=\"s\"></nord-icon>` : nothing}\n </span>\n `\n : nothing}\n <span class=\"n-option-label\">${this.optionContent(option)}</span>\n </div>\n `\n }\n\n /** The option's `aria-selected` value. Autocomplete omits it (returns nothing). */\n protected optionAriaSelected(selected: boolean): string | typeof nothing {\n return selected ? 'true' : 'false'\n }\n\n /** Whether the selected-check icon shows. Autocomplete never shows it. */\n protected showCheck(selected: boolean): boolean {\n return selected\n }\n\n /**\n * Whether the leading check gutter is rendered. Combobox reserves it so the\n * selected tick sits on the left and every label lines up (matching the\n * filter dropdown); autocomplete has no selection, so it omits the gutter to\n * avoid indenting every suggestion.\n */\n protected get rendersCheck(): boolean {\n return true\n }\n\n /** The create row. Rendered only when `canCreate`; base returns nothing. */\n protected renderCreate(): unknown {\n return nothing\n }\n\n protected renderEmpty() {\n // Not a selectable option, and rendered outside the listbox role so an empty\n // listbox doesn't violate aria-required-children. `role=\"status\"` lets\n // assistive tech announce that the search returned nothing.\n if (this.loading) {\n return html`<div class=\"n-empty\" role=\"status\"><nord-spinner size=\"s\"></nord-spinner></div>`\n }\n\n return html`\n <div class=\"n-empty\" role=\"status\">\n ${this.noResultsText || this.localize.term('noResults')}\n </div>\n `\n }\n\n protected optionId(index: number) {\n return `${this.comboboxId}-option-${index}`\n }\n\n /** The id used for the create row (so subclasses can reference it). */\n protected get createId(): string {\n return `${this.comboboxId}-create`\n }\n\n /** Pointer hover highlights an option (without marking it as keyboard-navigated). */\n protected handleOptionHover(index: number) {\n this.onOptionHover()\n this.activeDescendant.setActiveIndex(index)\n }\n\n protected handleControlClick() {\n if (this.disabled) {\n return\n }\n\n // Clicking the control opens the list when `openOnInputClick` is set.\n // Autocomplete (`openOnInputClick = false`) therefore opens only on typing —\n // matching Base UI's `openOnInputClick={false}` — while the combobox\n // (default `true`) opens its list on click.\n if (!this.open && this.openOnInputClick) {\n this.show()\n }\n\n this.focus()\n }\n\n protected handleClearClick(e: Event) {\n e.stopPropagation()\n if (this.disabled || this.readonly) {\n return\n }\n this.clear()\n }\n\n /** Clear the current value. Overridden by clearable variants. */\n clear() {}\n\n protected handleToggleClick(e: Event) {\n e.stopPropagation()\n\n if (this.disabled || this.readonly) {\n return\n }\n\n if (this.open) {\n this.hide()\n }\n else {\n this.show()\n }\n\n this.focus()\n }\n}\n"],"names":["memo","getDeps","fn","opts","result","deps","initialDeps","isInitial","memoizedFunction","newDeps","length","some","dep","index","onChange","skipInitialOnChange","updateDeps","notUndefined","value","msg","Error","debounce","targetWindow","ms","timeoutId","args","clearTimeout","setTimeout","apply","this","_isIOSResult","isIOSWebKit","navigator","test","userAgent","mtp","maxTouchPoints","platform","getRect","element","offsetWidth","offsetHeight","width","height","defaultKeyExtractor","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","len","min","endIndex","count","arr","Array","i","observeElementRect","instance","cb","scrollElement","handler","rect","round","ResizeObserver","observer","entries","run","entry","borderBoxSize","box","inlineSize","blockSize","options","useAnimationFrameWithResizeObserver","requestAnimationFrame","observe","unobserve","addEventListenerOptions","passive","supportsScrollend","window","observeElementOffset","readOffset","registerScrollendEvent","useScrollendEvent","offset","fallback","isScrollingResetDelay","createHandler","isScrolling","endHandler","addEventListener","removeEventListener","observeOffset","el","horizontal","isRtl","scrollLeft","scrollTop","measureElement","useCachedMeasurements","indexFromElement","key","getItemKey","itemSizeCache","get","estimateSize","cachedSize","elementScroll","adjustments","behavior","_a","_b","scrollTo","call","Virtualizer","constructor","unsubs","scrollState","measurementsCache","_flatMeasurements","Map","itemSizeCacheVersion","laneAssignments","pendingMin","prevLanes","lanesChangedFlag","lanesSettling","pendingScrollAnchor","scrollRect","scrollOffset","scrollDirection","scrollAdjustments","_iosDeferredAdjustment","_iosTouching","_iosJustTouchEnded","_iosTouchEndTimerId","_intendedScrollOffset","elementsCache","now","_c","performance","Date","_ro","forEach","node","target","isConnected","shouldMeasureDuringScroll","resizeItem","cacheKey","cachedNode","delete","disconnect","setOptions","opts2","merged","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","rangeExtractor","initialRect","scrollMargin","gap","indexAttribute","initialMeasurementsCache","lanes","anchorTo","followOnAppend","scrollEndThreshold","enabled","laneAssignmentMode","v","prevOptions","anchor","edgeKeysChanged","prevCount","nextCount","measurements","getMeasurements","prevFirstKey","prevLastKey","item","getVirtualItemForOffset","getScrollOffset","isAtEnd","anchorResolved","anchorDelta","anchorKey","anchorOffset","newMeasurements","idx","anchorItem","newOffset","notify","sync","maybeNotify","calculateRange","cleanup","filter","Boolean","d","rafId","cancelAnimationFrame","_didMount","_willUpdate","getScrollElement","ownerDocument","defaultView","cached","push","abs","_flushIosDeferredIfReady","scheduleScrollReconcile","scrollEl","onTouchStart","onTouchEnd","_scrollToOffset","_offset","scrollToEnd","cur","getMaxScrollOffset","delta","getSize","getFurthestMeasurement","furthestMeasurementsFound","furthestMeasurements","m","measurement","has","lane","previousFurthestMeasurement","end","set","size","from","values","sort","a","b","getMeasurementOptions","_itemSizeCacheVersion","clear","keys","need","runningStart","flat","next","Float64Array","subarray","prevIdx","measuredSize","view","cache","Proxy","prop","receiver","c","charCodeAt","Number","isInteger","s","Reflect","createLazyMeasurementsView","slice","laneLastIndex","fill","cachedLane","shouldCacheLane","prevIndex","prevInLane","furthestMeasurement","outerSize","lastIndex","getStart","getEnd","findNearestBinarySearch","endPerLane","pos","startPerLane","getVirtualIndexes","attributeName","indexStr","getAttribute","parseInt","console","warn","scrollIndex","lastTargetOffset","bufferSize","ceil","minIndex","maxIndex","key2","prevNode","itemStart","wasAtEnd","getVirtualDistanceFromEnd","prevTotalSize","getTotalSize","shouldAdjustScroll","shouldAdjustScrollPositionOnItemSizeChange","applyScrollAdjustment","getVirtualItems","indexes","virtualItems","k","useFlat","scrollWidth","clientWidth","scrollHeight","clientHeight","doc","document","documentElement","innerWidth","innerHeight","getDistanceFromEnd","threshold","getOffsetForAlignment","toOffset","align","itemSize","maxOffset","getOffsetForIndex","scrollToOffset","startedAt","stableFrames","scrollToIndex","initialAlign","offsetInfo","scrollBy","lastIdx","endByLane","val","takeSnapshot","snapshot","scrollToFn","measure","reconcileScroll","targetOffset","targetChanged","viewport","distance","keepSmooth","low","high","getCurrentValue","middle","currentValue","VirtualizerControllerBase","host","resolvedOptions","updateComplete","then","requestUpdate","virtualizer","addController","getVirtualizer","hostConnected","hostUpdated","hostDisconnected","VirtualizerController","super","Icon","registerIcon","checkedIcon","closeIcon","dropdownIcon","comboboxCount","px","undefined","retagComboboxStyles","styles","tag","unsafeCSS","cssText","replace","ComboboxBase","DraftComponentMixin","SizeMixin","AutocompleteMixin","FieldControlMixin","InputMixin","FloatingMixin","LitElement","comboboxId","localName","inputId","inputRef","createRef","formData","FormDataController","formValue","labelCache","localize","LocalizeController","dismiss","LightDismissController","isOpen","open","onDismiss","hide","isDismissible","stateAttributes","StateAttributesController","invalid","trackFocus","externalFiltering","loading","autoHighlight","readonly","openOnInputClick","virtualized","search","queryDirty","activeDescendant","ActiveDescendantController","rowCount","isEnabled","filteredOptions","disabled","optionId","createIndex","createId","startObserver","ResizeController","startSlot","endObserver","endSlot","scrollActivePending","VIRTUAL_OVERSCAN","measuredRowSize","VIRTUAL_ROW_ESTIMATE","listboxEl","navigated","ownInvalid","showsQueryInInput","displayValue","isArray","labelFor","inputPlaceholder","placeholder","filterQuery","isSelected","option","includes","join","hasValue","canCreate","renderLeadingControl","nothing","ariaAutocomplete","selectOption","label","commit","focus","handleEnter","_e","onKeydown","onBlur","afterUpdate","onOptionHover","onMove","cacheLabels","labelCacheLimit","selected","Set","filtered","query","external","filteredCache","lower","toLocaleLowerCase","matched","hasGroups","group","groupBy","groupOptions","groups","activeOption","activeIndex","isVirtual","connectedCallback","ariaObserver","MutationObserver","attributes","attributeFilter","widthObserver","syncAnchorInlineSize","slotObserver","childList","disconnectedCallback","relocateSlots","isServer","move","name","child","children","parentElement","appendChild","style","setProperty","createRenderRoot","root","createElement","className","show","dispatchEvent","NordEvent","cancelable","onHide","handleOpenChange","popout","resetActiveIndex","handleDisabledChange","resetRowSample","updated","changedProperties","sampleRowSize","scrollActiveIntoView","willUpdate","changed","listbox","querySelector","scrollIntoView","block","handlePopoutClose","e","stopPropagation","handlePopoutOpen","setActiveIndex","nextEnabledIndex","every","reset","handleInput","input","onInput","_input","handleBlur","handleKeydown","preventDefault","last","first","emitCreate","onUnhandledKeydown","find","o","render","indexByValue","map","activeRendered","activeId","listId","anchorId","showClear","ariaLabel","controlAriaLabel","ariaLabelledby","controlAriaLabelledby","ariaDescribedby","controlAriaDescribedby","html","ref","ifDefined","effectiveDisabled","required","controlAriaInvalid","leading","renderLabel","classMap","effectiveInvalid","styleMap","handleControlClick","term","handleClearClick","showToggle","handleToggleClick","position","ariaMultiselectable","renderGroup","renderVirtualOptions","repeat","renderListOption","renderEmpty","renderCreate","renderError","isHintBelow","renderHint","groupId","cond","optionContent","renderOption","unsafeHTML","row","getBoundingClientRect","items","total","totalSize","sized","setSize","optionAriaSelected","handleOptionHover","rendersCheck","showCheck","noResultsText","__decorate","prototype","property","attribute","reflect","type","state"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}