@aceshooting/lyra-ui 21.0.0 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +6 -3
  3. package/custom-elements.json +1 -1
  4. package/dist/ai/runtime.js +1 -1
  5. package/dist/ai/types.d.ts +13 -5
  6. package/dist/cli/lyra-rename-ledger.mjs +1 -0
  7. package/dist/cli/migrate-wa.mjs +33 -13
  8. package/dist/cli/migration-contract.json +1 -1
  9. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +5 -3
  10. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +3 -2
  11. package/dist/components/agent-tools/tool-call-block/tool-call-block.class.d.ts +15 -3
  12. package/dist/components/agent-tools/tool-call-block/tool-call-block.class.js +3 -3
  13. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +24 -8
  14. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +3 -3
  15. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +4 -0
  16. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.d.ts +9 -5
  17. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +2 -2
  18. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.styles.js +1 -1
  19. package/dist/components/agent-tools/tool-status.js +2 -2
  20. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +8 -0
  21. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +3 -2
  22. package/dist/components/agent-tools/tool-timeline/tool-timeline.styles.js +1 -1
  23. package/dist/components/agent-tools/trace-tree/span.d.ts +2 -2
  24. package/dist/components/charts/chart/box-plot.class.d.ts +3 -1
  25. package/dist/components/charts/chart/box-plot.class.js +9 -9
  26. package/dist/components/charts/chart/chart-bidi.d.ts +109 -0
  27. package/dist/components/charts/chart/chart-bidi.js +1 -0
  28. package/dist/components/charts/chart/chart.class.d.ts +17 -2
  29. package/dist/components/charts/chart/chart.class.js +10 -8
  30. package/dist/components/charts/chart/histogram.class.js +1 -1
  31. package/dist/components/charts/chart/lite-chart.class.d.ts +24 -5
  32. package/dist/components/charts/chart/lite-chart.class.js +9 -9
  33. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  34. package/dist/components/conversation/code-block/shiki-dark-theme.d.ts +2 -2
  35. package/dist/components/conversation/code-block/shiki-dark-theme.js +1 -1
  36. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts +18 -2
  37. package/dist/components/conversation/conversation-item/conversation-item.class.js +3 -3
  38. package/dist/components/conversation/conversation-item/conversation-item.styles.js +1 -1
  39. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  40. package/dist/components/conversation/markdown/markdown-core.class.d.ts +3 -1
  41. package/dist/components/conversation/markdown/markdown.class.d.ts +3 -1
  42. package/dist/components/conversation/message-actions/message-actions.class.d.ts +7 -2
  43. package/dist/components/conversation/message-actions/message-actions.class.js +2 -2
  44. package/dist/components/conversation/message-parts/message-parts.class.d.ts +6 -2
  45. package/dist/components/conversation/message-parts/message-parts.class.js +5 -3
  46. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +3 -2
  47. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  48. package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +1 -5
  49. package/dist/components/conversation/streaming-text/streaming-text-base.class.js +2 -2
  50. package/dist/components/conversation/streaming-text/streaming-text-core.class.d.ts +7 -1
  51. package/dist/components/conversation/streaming-text/streaming-text-core.class.js +3 -4
  52. package/dist/components/conversation/streaming-text/streaming-text.class.d.ts +7 -1
  53. package/dist/components/conversation/streaming-text/streaming-text.class.js +3 -4
  54. package/dist/components/conversation/thread-list/thread-list.class.d.ts +13 -2
  55. package/dist/components/conversation/thread-list/thread-list.class.js +3 -3
  56. package/dist/components/data/data-grid/data-grid.class.js +1 -1
  57. package/dist/components/data/document-library/document-library.class.js +2 -0
  58. package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -1
  59. package/dist/components/data/flow-minimap/flow-minimap.class.js +1 -1
  60. package/dist/components/data/flow-node/flow-node.class.d.ts +6 -2
  61. package/dist/components/data/flow-node/flow-node.class.js +6 -2
  62. package/dist/components/data/flow-node/flow-node.styles.js +1 -1
  63. package/dist/components/data/gauge/gauge.styles.js +1 -1
  64. package/dist/components/data/heatmap/heatmap.class.d.ts +3 -0
  65. package/dist/components/data/heatmap/heatmap.class.js +2 -2
  66. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  67. package/dist/components/data/sparkline/sparkline.class.d.ts +5 -3
  68. package/dist/components/data/stat/stat.class.d.ts +4 -3
  69. package/dist/components/data/table/table.class.d.ts +32 -5
  70. package/dist/components/data/table/table.class.js +3 -2
  71. package/dist/components/forms/button/button.class.d.ts +7 -1
  72. package/dist/components/forms/button/button.styles.js +1 -1
  73. package/dist/components/forms/date-picker/date-input.styles.js +1 -1
  74. package/dist/components/forms/input/input.styles.js +1 -1
  75. package/dist/components/forms/rubric-form/rubric-form.class.js +1 -0
  76. package/dist/components/layout/app-rail/app-rail.class.d.ts +50 -11
  77. package/dist/components/layout/app-rail/app-rail.class.js +2 -2
  78. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  79. package/dist/components/layout/menu/menu.class.d.ts +6 -5
  80. package/dist/components/layout/split-panel/split-panel.class.d.ts +2 -1
  81. package/dist/components/media/flag/language-map.d.ts +8 -0
  82. package/dist/components/media/flag/language-map.js +1 -1
  83. package/dist/components/media/map/map-loader.d.ts +7 -1
  84. package/dist/components/media/map/map.class.d.ts +111 -5
  85. package/dist/components/media/map/map.class.js +3 -3
  86. package/dist/components/media/media-card/media-card.class.d.ts +18 -5
  87. package/dist/components/media/media-card/media-card.class.js +1 -1
  88. package/dist/components/overlays/overlay/popover.class.d.ts +20 -0
  89. package/dist/components/overlays/overlay/popover.class.js +2 -2
  90. package/dist/components/retrieval/graph/graph.class.d.ts +3 -3
  91. package/dist/components/retrieval/graph/graph.class.js +1 -1
  92. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +5 -3
  93. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +3 -2
  94. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +3 -3
  95. package/dist/components/retrieval/mind-map/mind-map.class.js +1 -1
  96. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +4 -1
  97. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +5 -1
  98. package/dist/components/retrieval/source-picker/source-picker.class.d.ts +4 -1
  99. package/dist/components/retrieval/source-picker/source-picker.class.js +5 -1
  100. package/dist/components/utility/icon/icon.class.d.ts +9 -3
  101. package/dist/components/utility/icon/icon.class.js +1 -1
  102. package/dist/components/utility/mutation-observer/mutation-observer.class.d.ts +14 -8
  103. package/dist/components/utility/mutation-observer/mutation-observer.class.js +1 -1
  104. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +6 -1
  105. package/dist/components/viewers/document-viewer/document-viewer.class.js +7 -1
  106. package/dist/components/viewers/document-viewer/registry.d.ts +12 -3
  107. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts +13 -5
  108. package/dist/components/viewers/geojson-view/geojson-view.class.js +1 -1
  109. package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +3 -2
  110. package/dist/custom-elements-jsx.d.ts +1 -1
  111. package/dist/events.d.ts +644 -1242
  112. package/dist/internal/anchored-overlay-runtime.d.ts +2 -2
  113. package/dist/internal/cell-range.d.ts +0 -6
  114. package/dist/internal/cell-range.js +1 -1
  115. package/dist/internal/css-token-length.d.ts +7 -0
  116. package/dist/internal/css-token-length.js +1 -0
  117. package/dist/internal/default-strings.generated.d.ts +1 -1
  118. package/dist/internal/default-strings.generated.js +1 -1
  119. package/dist/internal/deferred-focus-return.d.ts +7 -4
  120. package/dist/internal/deferred-focus-return.js +1 -1
  121. package/dist/internal/dev-mode-attribute-warning.d.ts +35 -0
  122. package/dist/internal/dev-mode-attribute-warning.js +1 -1
  123. package/dist/internal/localization-runtime.js +1 -1
  124. package/dist/internal/localization-types.d.ts +1 -1
  125. package/dist/internal/localization.js +2 -2
  126. package/dist/internal/package-metadata.d.ts +1 -1
  127. package/dist/internal/package-metadata.js +1 -1
  128. package/dist/internal/papaparse-loader.d.ts +1 -1
  129. package/dist/internal/papaparse-loader.js +1 -1
  130. package/dist/internal/positioner.d.ts +10 -0
  131. package/dist/internal/positioner.js +1 -1
  132. package/dist/internal/shared-unions.d.ts +2 -1
  133. package/dist/internal/slotted-overlay-controller.d.ts +20 -0
  134. package/dist/internal/slotted-overlay-controller.js +1 -0
  135. package/dist/internal/text-quote.d.ts +1 -1
  136. package/dist/internal/text-quote.js +1 -1
  137. package/dist/internal/theme-observation.d.ts +4 -0
  138. package/dist/internal/theme-observation.js +1 -0
  139. package/dist/internal/theme-watcher.js +1 -1
  140. package/dist/localization.d.ts +6 -1
  141. package/dist/localization.js +1 -1
  142. package/dist/lyra.d.ts +1 -1
  143. package/dist/lyra.js +1 -1
  144. package/dist/svelte.d.ts +1 -1
  145. package/dist/testing/lyra-tag-event-map.js +1 -1
  146. package/dist/translations/ar/agent-tools.js +1 -1
  147. package/dist/translations/cs/agent-tools.js +1 -1
  148. package/dist/translations/da/agent-tools.js +1 -1
  149. package/dist/translations/de/agent-tools.js +1 -1
  150. package/dist/translations/de-CH/agent-tools.js +1 -1
  151. package/dist/translations/es/agent-tools.js +1 -1
  152. package/dist/translations/fa/agent-tools.js +1 -1
  153. package/dist/translations/fi/agent-tools.js +1 -1
  154. package/dist/translations/fr/agent-tools.js +1 -1
  155. package/dist/translations/he/agent-tools.js +1 -1
  156. package/dist/translations/hi/agent-tools.js +1 -1
  157. package/dist/translations/hr/agent-tools.js +1 -1
  158. package/dist/translations/hu/agent-tools.js +1 -1
  159. package/dist/translations/id/agent-tools.js +1 -1
  160. package/dist/translations/it/agent-tools.js +1 -1
  161. package/dist/translations/ja/agent-tools.js +1 -1
  162. package/dist/translations/kk/agent-tools.js +1 -1
  163. package/dist/translations/ko/agent-tools.js +1 -1
  164. package/dist/translations/nb/agent-tools.js +1 -1
  165. package/dist/translations/nl/agent-tools.js +1 -1
  166. package/dist/translations/nn/agent-tools.js +1 -1
  167. package/dist/translations/pl/agent-tools.js +1 -1
  168. package/dist/translations/pt-BR/agent-tools.js +1 -1
  169. package/dist/translations/pt-PT/agent-tools.js +1 -1
  170. package/dist/translations/pt-PT/charts.js +1 -1
  171. package/dist/translations/pt-PT/conversation.js +1 -1
  172. package/dist/translations/pt-PT/data.js +1 -1
  173. package/dist/translations/pt-PT/forms.js +1 -1
  174. package/dist/translations/pt-PT/layout.js +1 -1
  175. package/dist/translations/pt-PT/media.js +1 -1
  176. package/dist/translations/pt-PT/retrieval.js +1 -1
  177. package/dist/translations/pt-PT/shared.js +1 -1
  178. package/dist/translations/pt-PT/utility.js +1 -1
  179. package/dist/translations/pt-PT/viewers.js +2 -2
  180. package/dist/translations/ro/agent-tools.js +1 -1
  181. package/dist/translations/ru/agent-tools.js +1 -1
  182. package/dist/translations/sl/agent-tools.js +1 -1
  183. package/dist/translations/sv/agent-tools.js +1 -1
  184. package/dist/translations/tr/agent-tools.js +1 -1
  185. package/dist/translations/uk/agent-tools.js +1 -1
  186. package/dist/translations/zh-CN/agent-tools.js +1 -1
  187. package/dist/translations/zh-TW/agent-tools.js +1 -1
  188. package/dist/utilities/index.d.ts +1 -1
  189. package/dist/utilities/index.js +1 -1
  190. package/dist/utilities/localization.d.ts +28 -10
  191. package/dist/vue.d.ts +1 -1
  192. package/llms/components/lr-accordion-item.md +2 -344
  193. package/llms/components/lr-accordion.md +2 -344
  194. package/llms/components/lr-app-rail-group.md +2 -721
  195. package/llms/components/lr-app-rail-item.md +2 -721
  196. package/llms/components/lr-app-rail.md +29 -4
  197. package/llms/components/lr-bar-chart.md +2 -87
  198. package/llms/components/lr-box-plot.md +1 -1
  199. package/llms/components/lr-breadcrumb-item.md +2 -67
  200. package/llms/components/lr-bubble-chart.md +2 -87
  201. package/llms/components/lr-button.md +7 -0
  202. package/llms/components/lr-chart.md +4 -5
  203. package/llms/components/lr-chip-group.md +2 -272
  204. package/llms/components/lr-conversation-item.md +20 -2
  205. package/llms/components/lr-date-input.md +2 -457
  206. package/llms/components/lr-date-picker.md +6 -2
  207. package/llms/components/lr-document-library.md +3 -3
  208. package/llms/components/lr-document-viewer.md +14 -5
  209. package/llms/components/lr-doughnut-chart.md +2 -87
  210. package/llms/components/lr-dropdown-item.md +2 -306
  211. package/llms/components/lr-dropdown.md +6 -0
  212. package/llms/components/lr-flag.md +9 -1
  213. package/llms/components/lr-flow-node.md +4 -1
  214. package/llms/components/lr-geojson-view.md +3 -90
  215. package/llms/components/lr-geojson-viewer.md +13 -5
  216. package/llms/components/lr-icon-button.md +4 -1
  217. package/llms/components/lr-icon.md +14 -6
  218. package/llms/components/lr-input.md +9 -2
  219. package/llms/components/lr-lite-chart.md +17 -9
  220. package/llms/components/lr-map.md +87 -2
  221. package/llms/components/lr-markdown-core.md +5 -4
  222. package/llms/components/lr-markdown.md +4 -2
  223. package/llms/components/lr-media-card.md +10 -5
  224. package/llms/components/lr-menu-item.md +2 -306
  225. package/llms/components/lr-menu.md +9 -6
  226. package/llms/components/lr-menubar-item.md +2 -125
  227. package/llms/components/lr-message-actions.md +4 -1
  228. package/llms/components/lr-message-parts.md +14 -5
  229. package/llms/components/lr-mutation-observer.md +12 -6
  230. package/llms/components/lr-navigation-menu-item.md +2 -237
  231. package/llms/components/lr-number-input.md +4 -0
  232. package/llms/components/lr-option.md +2 -712
  233. package/llms/components/lr-pie-chart.md +2 -87
  234. package/llms/components/lr-polar-area-chart.md +2 -87
  235. package/llms/components/lr-popover.md +10 -0
  236. package/llms/components/lr-prompt-input.md +5 -1
  237. package/llms/components/lr-radar-chart.md +2 -87
  238. package/llms/components/lr-reorder-item.md +2 -157
  239. package/llms/components/lr-result-field.md +2 -117
  240. package/llms/components/lr-retrieval-results.md +3 -1
  241. package/llms/components/lr-rubric-form.md +3 -2
  242. package/llms/components/lr-scatter-chart.md +2 -87
  243. package/llms/components/lr-selection-toolbar.md +4 -2
  244. package/llms/components/lr-source-card.md +2 -186
  245. package/llms/components/lr-source-picker.md +3 -1
  246. package/llms/components/lr-sparkline.md +9 -4
  247. package/llms/components/lr-split-panel.md +5 -3
  248. package/llms/components/lr-stat.md +4 -3
  249. package/llms/components/lr-streaming-text-core.md +7 -5
  250. package/llms/components/lr-streaming-text.md +9 -6
  251. package/llms/components/lr-swatch-picker.md +130 -0
  252. package/llms/components/lr-tag.md +2 -177
  253. package/llms/components/lr-thread-list.md +27 -4
  254. package/llms/components/lr-timeline-item.md +2 -120
  255. package/llms/components/lr-toast-item.md +2 -223
  256. package/llms/components/lr-tool-call-block.md +12 -3
  257. package/llms/components/lr-tool-call-chip.md +12 -6
  258. package/llms/components/lr-tool-param-form.md +3 -2
  259. package/llms/components/lr-tool-result-dialog.md +7 -3
  260. package/llms/components/lr-tool-result-view.md +4 -3
  261. package/llms/components/lr-tool-timeline.md +12 -5
  262. package/llms/components/lr-tree-item.md +2 -354
  263. package/llms/index.md +22 -4
  264. package/llms/migration.md +75 -1
  265. package/llms/peers.md +1 -1
  266. package/llms/shared.md +86 -39
  267. package/llms-full.txt +739 -163
  268. package/package.json +6 -6
  269. package/registrations.json +1 -1
  270. package/vscode-css-data.json +1 -1
  271. package/vscode-html-data.json +1 -1
  272. package/web-types.json +1 -1
@@ -1 +1 @@
1
- import{TEXT_QUOTE_CONTEXT_CHARS}from"../components/viewers/document-viewer/anchors.js";import{getSegmenter,resolveIntlLocale}from"./intl-cache.js";const SOFT_HYPHEN="­",WHITESPACE_CHAR_RE=/\s/u,NORMALIZATION_SPECIAL_CHAR_RE=/[\s­]/u,TEXT_QUOTE_LIMITS=Object.freeze({maxCorpusCodeUnits:1e6,maxNodes:2e4,maxTraversalNodes:2e4,maxNodeCodeUnits:1e6,maxNormalizationWorkCodeUnits:2e6,maxQueryCodeUnits:4096,maxMatches:1e4,maxSearchWorkCodeUnits:4e6,maxCacheEntries:64}),TEXT_QUOTE_TRAVERSAL_ALLOWANCE_MAX=4096;function resolvedLimits(overrides){const boundedInteger=(value,hardMaximum)=>Number.isFinite(value)?Math.min(hardMaximum,Math.max(0,Math.floor(value))):hardMaximum;return{maxCorpusCodeUnits:boundedInteger(overrides?.maxCorpusCodeUnits,TEXT_QUOTE_LIMITS.maxCorpusCodeUnits),maxNodes:boundedInteger(overrides?.maxNodes,TEXT_QUOTE_LIMITS.maxNodes),maxTraversalNodes:boundedInteger(overrides?.maxTraversalNodes??TEXT_QUOTE_LIMITS.maxTraversalNodes,TEXT_QUOTE_LIMITS.maxTraversalNodes+TEXT_QUOTE_TRAVERSAL_ALLOWANCE_MAX),maxNodeCodeUnits:boundedInteger(overrides?.maxNodeCodeUnits,TEXT_QUOTE_LIMITS.maxNodeCodeUnits),maxNormalizationWorkCodeUnits:boundedInteger(overrides?.maxNormalizationWorkCodeUnits,TEXT_QUOTE_LIMITS.maxNormalizationWorkCodeUnits),maxQueryCodeUnits:boundedInteger(overrides?.maxQueryCodeUnits,TEXT_QUOTE_LIMITS.maxQueryCodeUnits),maxMatches:boundedInteger(overrides?.maxMatches,TEXT_QUOTE_LIMITS.maxMatches),maxSearchWorkCodeUnits:boundedInteger(overrides?.maxSearchWorkCodeUnits,TEXT_QUOTE_LIMITS.maxSearchWorkCodeUnits),maxCacheEntries:boundedInteger(overrides?.maxCacheEntries,TEXT_QUOTE_LIMITS.maxCacheEntries)}}function normalizeQuoteText(s){return collapseWhitespaceAndSoftHyphen(s.normalize("NFC")).trim()}function collapseWhitespaceAndSoftHyphen(s){let out="",lastWasSpace=!1;for(const ch of s)if(ch!==SOFT_HYPHEN)if(WHITESPACE_CHAR_RE.test(ch)){if(lastWasSpace)continue;lastWasSpace=!0,out+=" "}else lastWasSpace=!1,out+=ch;return out}const scopeRoots=new WeakMap;function trackScopeRoot(scope,root,includesRootPrefix=!1,includesRootSuffix=!1,traversalLimit=TEXT_QUOTE_LIMITS.maxTraversalNodes){const first=scope.segments[0]?.node,last=scope.segments.at(-1)?.node;if(!first||!last)return scope;let node=includesRootPrefix?nextNodeWithin(root,root,!0):first;const textInterval=[],textValues=[];let segmentIndex=0,traversed=0,reachedLast=!1,unexpectedItemText=!1;for(;node&&traversed++<traversalLimit;){if(node.nodeType===Node.TEXT_NODE){const text=node;if(textInterval.push(text),textValues.push(text.data),text===scope.segments[segmentIndex]?.node?segmentIndex++:includesRootPrefix||(unexpectedItemText=!0),node===last&&(reachedLast=!0,!includesRootSuffix))break}const descend=!includesRootPrefix||node.nodeType!==Node.ELEMENT_NODE||!SKIP_TAGS.has(node.tagName);node=nextNodeWithin(root,node,descend)}return scopeRoots.set(scope,{root,traversalLimit,textInterval,valid:reachedLast&&segmentIndex===scope.segments.length&&!unexpectedItemText&&(!includesRootSuffix||node===null),textValues,includesRootPrefix,includesRootSuffix}),scope}const MARK_RE=/\p{Mark}/u;function hangulSyllableType(character){const codePoint=character.codePointAt(0);return codePoint===void 0?null:codePoint>=4352&&codePoint<=4447||codePoint>=43360&&codePoint<=43388?"L":codePoint>=4448&&codePoint<=4519||codePoint>=55216&&codePoint<=55238?"V":codePoint>=4520&&codePoint<=4607||codePoint>=55243&&codePoint<=55291?"T":codePoint<44032||codePoint>55203?null:(codePoint-44032)%28===0?"LV":"LVT"}function continuesHangulSyllable(previous,next){const previousType=hangulSyllableType(previous),nextType=hangulSyllableType(next);return previousType==="L"?nextType==="L"||nextType==="V"||nextType==="LV"||nextType==="LVT":previousType==="LV"||previousType==="V"?nextType==="V"||nextType==="T":(previousType==="LVT"||previousType==="T")&&nextType==="T"}function lastCodePoint(value){if(value.length===0)return;const last=value.charCodeAt(value.length-1),start=last>=56320&&last<=57343&&value.length>1&&value.charCodeAt(value.length-2)>=55296&&value.charCodeAt(value.length-2)<=56319?value.length-2:value.length-1;return value.slice(start)}function firstVisibleCodePoint(value){for(const character of value)if(character!==SOFT_HYPHEN)return WHITESPACE_CHAR_RE.test(character)?" ":character}function continuesPreviousGrapheme(previousCharacter,firstCharacter){if(firstCharacter===void 0)return!1;const composesAcrossBoundary=previousCharacter!==void 0&&`${previousCharacter}${firstCharacter}`.normalize("NFC")!==`${previousCharacter.normalize("NFC")}${firstCharacter.normalize("NFC")}`;return MARK_RE.test(firstCharacter)||firstCharacter==="️"||firstCharacter==="‍"||previousCharacter==="‍"||previousCharacter!==void 0&&continuesHangulSyllable(previousCharacter,firstCharacter)||composesAcrossBoundary}function*normalizationClusters(value){if(typeof Intl.Segmenter=="function"){for(const{segment,index}of segmenterFor().segment(value))yield{text:segment,rawStart:index,rawEnd:index+segment.length};return}let cluster="",rawStart=0,rawEnd=0,joinsNext=!1,previousCharacter="";for(const char of value)!(cluster!==""&&(MARK_RE.test(char)||char==="️"||joinsNext||continuesHangulSyllable(previousCharacter,char)))&&cluster&&(yield{text:cluster,rawStart,rawEnd},cluster="",rawStart=rawEnd),cluster+=char,rawEnd+=char.length,joinsNext=char==="‍",previousCharacter=char;cluster&&(yield{text:cluster,rawStart,rawEnd})}function normalizeScopeGlobally(scope){if(scope.text.normalize("NFC")===scope.text)return scope;const expansions=[],chunks=[];let mappedStart=0;for(const cluster of normalizationClusters(scope.text)){const mapped=cluster.text.normalize("NFC"),mappedEnd=mappedStart+mapped.length;mapped!==cluster.text&&expansions.push(cluster.rawStart,cluster.rawEnd,mappedStart,mappedEnd),chunks.push(mapped),mappedStart=mappedEnd}const mapping={text:chunks.join(""),expansions:Uint32Array.from(expansions)};return scope.text=mapping.text,scope.globalNormalization=mapping,scope}function normalizeSegment(raw,maxOutputCodeUnits,maxWorkCodeUnits,initialLastWasSpace=!1){const inspectedLength=Math.min(raw.length,maxWorkCodeUnits),inspected=raw.slice(0,inspectedLength),nfc=inspected.normalize("NFC"),chunks=[];let chunk="",normalizedLength=0;const rawOffsetRuns=[],rawClusterRuns=[];let currentDelta=0,lastWasSpace=initialLastWasSpace,outputTruncated=!1;if(nfc===inspected&&!NORMALIZATION_SPECIAL_CHAR_RE.test(inspected)){const retainedLength=Math.min(inspected.length,maxOutputCodeUnits),terminalRuns=retainedLength<inspected.length?new Uint32Array([retainedLength,inspected.length]):new Uint32Array;return{text:inspected.slice(0,retainedLength),rawOffsetRuns:terminalRuns,rawClusterRuns:new Uint32Array,workCodeUnits:inspectedLength,truncated:retainedLength<inspected.length||inspectedLength<raw.length,lastWasSpace:inspected.length===0?initialLastWasSpace:!1}}const appendUnit=(ch,rawIndex)=>{if(ch===SOFT_HYPHEN)return!0;if(WHITESPACE_CHAR_RE.test(ch)){if(lastWasSpace)return!0;if(lastWasSpace=!0,normalizedLength>=maxOutputCodeUnits)return!1;const delta=rawIndex-normalizedLength;delta!==currentDelta&&(rawOffsetRuns.push(normalizedLength,rawIndex),currentDelta=delta),chunk+=" ",normalizedLength++}else{if(lastWasSpace=!1,normalizedLength>=maxOutputCodeUnits)return!1;const delta=rawIndex-normalizedLength;delta!==currentDelta&&(rawOffsetRuns.push(normalizedLength,rawIndex),currentDelta=delta),chunk+=ch,normalizedLength++}return chunk.length>=4096&&(chunks.push(chunk),chunk=""),!0};if(nfc===inspected){for(let rawIndex=0;rawIndex<inspected.length;rawIndex++)if(!appendUnit(inspected[rawIndex],rawIndex)){outputTruncated=!0;break}}else for(const cluster of normalizationClusters(inspected)){const normalizedCluster=cluster.text.normalize("NFC");if(normalizedCluster===cluster.text){for(let local=0;local<cluster.text.length;local++)if(!appendUnit(cluster.text[local],cluster.rawStart+local)){outputTruncated=!0;break}if(outputTruncated)break;continue}const normalizedVisible=collapseWhitespaceAndSoftHyphen(normalizedCluster);if(!normalizedVisible)continue;if(normalizedLength+normalizedVisible.length>maxOutputCodeUnits){outputTruncated=!0;break}const normalizedStart=normalizedLength;chunk+=normalizedVisible,normalizedLength+=normalizedVisible.length,lastWasSpace=normalizedVisible.endsWith(" "),rawClusterRuns.push(normalizedStart,normalizedLength,cluster.rawStart,cluster.rawEnd),chunk.length>=4096&&(chunks.push(chunk),chunk="")}return inspectedLength-normalizedLength!==currentDelta&&rawOffsetRuns.push(normalizedLength,inspectedLength),{text:chunks.join("")+chunk,rawOffsetRuns:Uint32Array.from(rawOffsetRuns),rawClusterRuns:Uint32Array.from(rawClusterRuns),workCodeUnits:inspectedLength,truncated:outputTruncated||inspectedLength<raw.length,lastWasSpace}}const SKIP_TAGS=new Set(["SCRIPT","STYLE","TEMPLATE","NOSCRIPT"]);function nextNodeWithin(root,node,descend){if(descend&&node.firstChild)return node.firstChild;let current=node;for(;current&&current!==root;){if(current.nextSibling)return current.nextSibling;current=current.parentNode}return null}function scopeFromElement(root,limitOverrides){const limits=resolvedLimits(limitOverrides),segments=[],textChunks=[];let textLength=0,textNodesVisited=0,traversalNodesVisited=0,workCodeUnits=0,lastWasSpace=!1,truncated=!1,node=root.firstChild;for(;node;){if(traversalNodesVisited>=limits.maxTraversalNodes){truncated=!0;break}traversalNodesVisited++;const skipChildren=node.nodeType===Node.ELEMENT_NODE&&SKIP_TAGS.has(node.tagName),next=nextNodeWithin(root,node,!skipChildren);if(node.nodeType!==Node.TEXT_NODE){node=next;continue}if(textNodesVisited>=limits.maxNodes){truncated=!0;break}textNodesVisited++;const textNode=node,workRemaining=Math.max(0,limits.maxNormalizationWorkCodeUnits-workCodeUnits);if(workRemaining===0){truncated=!0;break}const nodeWork=Math.min(limits.maxNodeCodeUnits,workRemaining),{text:segText,rawOffsetRuns,rawClusterRuns,workCodeUnits:used,truncated:segmentTruncated,lastWasSpace:nextLastWasSpace}=normalizeSegment(textNode.data,Math.max(0,limits.maxCorpusCodeUnits-textLength),nodeWork,lastWasSpace);if(workCodeUnits+=used,lastWasSpace=nextLastWasSpace,segText.length===0){if(segmentTruncated){truncated=!0;break}node=next;continue}if(segments.push({node:textNode,normalizedStart:textLength,normalizedLength:segText.length,rawOffsetRuns,rawClusterRuns,rawLength:textNode.data.length,rawText:textNode.data,parentNode:textNode.parentNode,previousSibling:textNode.previousSibling,nextSibling:textNode.nextSibling}),textChunks.push(segText),textLength+=segText.length,segmentTruncated){truncated=!0;break}if(textLength===limits.maxCorpusCodeUnits){truncated=next!==null;break}node=next}const scope=normalizeScopeGlobally({text:textChunks.join(""),segments,truncated});return trackScopeRoot(scope,root,!0,!scope.truncated,limits.maxTraversalNodes)}function firstTextNode(element,traversalRemaining){let inspected=0,child=element.firstChild;for(;child&&inspected<traversalRemaining;){if(inspected++,child.nodeType===Node.TEXT_NODE)return{node:child,inspected,truncated:!1};child=child.nextSibling}return{node:null,inspected,truncated:child!==null}}function scopeFromItems(items,limitOverrides){const limits=resolvedLimits(limitOverrides),segments=[],textChunks=[];let textLength=0,workCodeUnits=0,traversalNodesVisited=0,lastWasSpace=!1,truncated=!1;for(let itemIndex=0;itemIndex<items.length;itemIndex++){if(itemIndex>=limits.maxNodes){truncated=!0;break}const item=items[itemIndex],located=item.node?{node:item.node,inspected:1,truncated:!1}:firstTextNode(item.element,Math.max(0,limits.maxTraversalNodes-traversalNodesVisited));if(traversalNodesVisited+=located.inspected,located.truncated||traversalNodesVisited>limits.maxTraversalNodes){truncated=!0;break}const node=located.node;if(!node){if(item.text!==""){truncated=!0;break}continue}if(item.node&&item.node.parentElement!==item.element){truncated=!0;break}if(item.text!==node.data){truncated=!0;break}const workRemaining=Math.max(0,limits.maxNormalizationWorkCodeUnits-workCodeUnits);if(workRemaining===0){truncated=!0;break}const previousCharacter=lastCodePoint(textChunks.at(-1)??""),rawFirstCharacter=firstVisibleCodePoint(item.text),reservesSyntheticJoin=item.joinBefore!==!1&&textLength>0&&!lastWasSpace&&rawFirstCharacter!==" "&&!continuesPreviousGrapheme(previousCharacter,rawFirstCharacter),{text:segText,rawOffsetRuns,rawClusterRuns,workCodeUnits:used,truncated:segmentTruncated,lastWasSpace:nextLastWasSpace}=normalizeSegment(item.text,Math.max(0,limits.maxCorpusCodeUnits-textLength-(reservesSyntheticJoin?1:0)),Math.min(limits.maxNodeCodeUnits,workRemaining),lastWasSpace);workCodeUnits+=used;const firstCharacter=segText[Symbol.iterator]().next().value,continuesPreviousCluster=continuesPreviousGrapheme(previousCharacter,firstCharacter),needsSyntheticJoin=textLength>0&&item.joinBefore!==!1&&!lastWasSpace&&!segText.startsWith(" ")&&!continuesPreviousCluster;if(lastWasSpace=nextLastWasSpace,segText.length===0){if(segmentTruncated){truncated=!0;break}continue}if(needsSyntheticJoin){if(textLength>=limits.maxCorpusCodeUnits){truncated=!0;break}textChunks.push(" "),textLength++}if(segments.push({node,normalizedStart:textLength,normalizedLength:segText.length,rawOffsetRuns,rawClusterRuns,rawLength:node.data.length,rawText:node.data,parentNode:node.parentNode,previousSibling:node.previousSibling,nextSibling:node.nextSibling}),textChunks.push(segText),textLength+=segText.length,segmentTruncated){truncated=!0;break}if(textLength===limits.maxCorpusCodeUnits){truncated=itemIndex+1<items.length;break}}const scope=normalizeScopeGlobally({text:textChunks.join(""),segments,truncated}),commonRoot=commonAncestorOfSegments(segments);return commonRoot?trackScopeRoot(scope,commonRoot):(segments.length>0&&(scope.truncated=!0,scopeRoots.set(scope,{root:segments[0].node,textInterval:[],textValues:[],valid:!1,includesRootPrefix:!1,includesRootSuffix:!1,traversalLimit:TEXT_QUOTE_LIMITS.maxTraversalNodes})),scope)}function commonAncestorOfSegments(segments){const first=segments[0]?.node,last=segments.at(-1)?.node;if(!first||!last)return null;const ancestors=new Set;let cursor=first,visited=0;for(;cursor&&visited++<TEXT_QUOTE_LIMITS.maxTraversalNodes;)ancestors.add(cursor),cursor=cursor.parentNode;if(cursor)return null;for(cursor=last,visited=0;cursor&&!ancestors.has(cursor)&&visited++<TEXT_QUOTE_LIMITS.maxTraversalNodes;)cursor=cursor.parentNode;return cursor&&ancestors.has(cursor)?cursor:null}function caseFold(value,locale){let lowered;return locale?lowered=value.toLocaleLowerCase(resolveIntlLocale(locale)):lowered=value.toLowerCase(),lowered.replaceAll("ς","σ")}function segmenterFor(locale){try{return getSegmenter(locale,{granularity:"grapheme"})}catch(error){if(error instanceof RangeError)return getSegmenter(void 0,{granularity:"grapheme"});throw error}}function*caseMappingSegments(value,locale){if(typeof Intl.Segmenter=="function"){for(const{segment,index}of segmenterFor(locale).segment(value))yield{text:segment,rawStart:index,rawEnd:index+segment.length};return}let rawStart=0;for(const text of value)yield{text,rawStart,rawEnd:rawStart+text.length},rawStart+=text.length}function foldText(value,locale){const text=caseFold(value,locale);if(text.length===value.length)return{text,expansions:new Uint32Array};let expansions=new Uint32Array(Math.min(64,Math.max(1,value.length))*4),expansionCount=0;const appendExpansion=(rawStart,rawEnd,foldedStart2,foldedEnd)=>{if(expansionCount*4===expansions.length){const nextCapacity=Math.min(value.length,Math.max(1,(expansions.length>>2)*2)),next=new Uint32Array(nextCapacity*4);next.set(expansions),expansions=next}const offset=expansionCount*4;expansions[offset]=rawStart,expansions[offset+1]=rawEnd,expansions[offset+2]=foldedStart2,expansions[offset+3]=foldedEnd,expansionCount++};let foldedStart=0;for(const segment of caseMappingSegments(value,locale)){const isolatedLength=caseFold(segment.text,locale).length,foldedEnd=segment.rawEnd===value.length?text.length:Math.min(text.length,foldedStart+isolatedLength);foldedEnd-foldedStart!==segment.rawEnd-segment.rawStart&&appendExpansion(segment.rawStart,segment.rawEnd,foldedStart,foldedEnd),foldedStart=foldedEnd}return{text,expansions:expansions.slice(0,expansionCount*4)}}function rawStartForFoldedOffset(folded,foldedOffset){let lo=0,hi=(folded.expansions.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;folded.expansions[mid*4+2]<=foldedOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return foldedOffset;const offset=found*4,rawStart=folded.expansions[offset],rawEnd=folded.expansions[offset+1],foldedEnd=folded.expansions[offset+3];return foldedOffset<foldedEnd?rawStart:foldedOffset-(foldedEnd-rawEnd)}function rawEndForFoldedOffset(folded,foldedOffset){let lo=0,hi=(folded.expansions.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;folded.expansions[mid*4+2]<foldedOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return foldedOffset;const offset=found*4,rawEnd=folded.expansions[offset+1],foldedEnd=folded.expansions[offset+3];return foldedOffset<=foldedEnd?rawEnd:foldedOffset-(foldedEnd-rawEnd)}class PackedTextQuoteMatches{constructor(packedOffsets,matchCountExact,scanComplete){this.packedOffsets=packedOffsets,this.matchCountExact=matchCountExact,this.scanComplete=scanComplete}get length(){return this.packedOffsets.length>>1}at(index){if(!(!Number.isInteger(index)||index<0||index>=this.length))return{start:this.packedOffsets[index*2],end:this.packedOffsets[index*2+1]}}*[Symbol.iterator](){for(let index=0;index<this.length;index++)yield this.at(index)}}function emptyMatches(matchCountExact,scanComplete=matchCountExact){return new PackedTextQuoteMatches(new Uint32Array,matchCountExact,scanComplete)}function emptyTextQuoteMatches(){return emptyMatches(!0,!0)}function scanOccurrences(haystack,needle,foldedHaystack,maxMatches,scopeTruncated){const packed=new Uint32Array(maxMatches*2);let count=0,scanComplete=!0,from=0;for(;;){const index=haystack.indexOf(needle,from);if(index===-1)break;if(count>=maxMatches){scanComplete=!1;break}foldedHaystack?(packed[count*2]=rawStartForFoldedOffset(foldedHaystack,index),packed[count*2+1]=rawEndForFoldedOffset(foldedHaystack,index+needle.length)):(packed[count*2]=index,packed[count*2+1]=index+needle.length),count++,from=index+1}return new PackedTextQuoteMatches(packed.slice(0,count*2),scanComplete&&!scopeTruncated,scanComplete)}function foldedStartForRawOffset(folded,rawOffset){let lo=0,hi=(folded.expansions.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;folded.expansions[mid*4]<=rawOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return rawOffset;const offset=found*4,rawEnd=folded.expansions[offset+1],foldedStart=folded.expansions[offset+2],foldedEnd=folded.expansions[offset+3];return rawOffset<rawEnd?foldedStart:rawOffset+(foldedEnd-rawEnd)}function foldedEndForRawOffset(folded,rawOffset){let lo=0,hi=(folded.expansions.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;folded.expansions[mid*4]<rawOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return rawOffset;const offset=found*4,rawEnd=folded.expansions[offset+1],foldedEnd=folded.expansions[offset+3];return rawOffset<=rawEnd?foldedEnd:rawOffset+(foldedEnd-rawEnd)}function rawOffsetAt(segment,normalizedOffset){const runs=segment.rawOffsetRuns;let lo=0,hi=(runs.length>>1)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;runs[mid*2]<=normalizedOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return normalizedOffset;const normalizedStart=runs[found*2];return runs[found*2+1]+normalizedOffset-normalizedStart}function clusterAtNormalizedOffset(segment,normalizedOffset){const runs=segment.rawClusterRuns??new Uint32Array;let lo=0,hi=(runs.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;runs[mid*4]<=normalizedOffset?(found=mid,lo=mid+1):hi=mid-1}return found<0||normalizedOffset>=runs[found*4+1]?null:{normalizedStart:runs[found*4],normalizedEnd:runs[found*4+1],rawStart:runs[found*4+2],rawEnd:runs[found*4+3]}}function clusterAtRawOffset(segment,rawOffset){const runs=segment.rawClusterRuns??new Uint32Array;let lo=0,hi=(runs.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;runs[mid*4+2]<=rawOffset?(found=mid,lo=mid+1):hi=mid-1}return found<0||rawOffset>=runs[found*4+3]?null:{normalizedStart:runs[found*4],normalizedEnd:runs[found*4+1],rawStart:runs[found*4+2],rawEnd:runs[found*4+3]}}function normalizedOffsetAtOrAfterRaw(segment,rawOffset){let lo=0,hi=segment.normalizedLength;for(;lo<hi;){const mid=lo+hi>>1;rawOffsetAt(segment,mid)<rawOffset?lo=mid+1:hi=mid}return lo}function normalizedBoundaryAtRaw(segment,rawOffset,endBoundary){const cluster=clusterAtRawOffset(segment,rawOffset);return cluster?rawOffset===cluster.rawStart?cluster.normalizedStart:endBoundary?cluster.normalizedEnd:cluster.normalizedStart:normalizedOffsetAtOrAfterRaw(segment,rawOffset)}function segmentIndexAt(scope,normalizedOffset){let lo=0,hi=scope.segments.length-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;scope.segments[mid].normalizedStart<=normalizedOffset?(found=mid,lo=mid+1):hi=mid-1}return found}function segmentIsFresh(segment){return!(segment.rawLength!==void 0&&segment.node.data.length!==segment.rawLength||segment.rawText!==void 0&&segment.node.data!==segment.rawText||segment.parentNode!==void 0&&segment.node.parentNode!==segment.parentNode||segment.previousSibling!==void 0&&segment.node.previousSibling!==segment.previousSibling||segment.nextSibling!==void 0&&segment.node.nextSibling!==segment.nextSibling)}function scopeStructureIsFresh(scope){const tracked=scopeRoots.get(scope);if(tracked&&!tracked.valid)return!1;for(const segment of scope.segments)if(!segmentIsFresh(segment))return!1;if(!tracked)return!0;const first=tracked.textInterval[0],last=tracked.textInterval.at(-1);if(!first||!last||!tracked.root.contains(first)||!tracked.root.contains(last))return!1;let node=tracked.includesRootPrefix?nextNodeWithin(tracked.root,tracked.root,!0):first,textIndex=0,traversed=0;for(;node&&traversed++<tracked.traversalLimit;){if(node.nodeType===Node.TEXT_NODE){if(node!==tracked.textInterval[textIndex]||node.data!==tracked.textValues[textIndex])return!1;if(textIndex++,!tracked.includesRootSuffix&&node===last)break}const descend=!tracked.includesRootPrefix||node.nodeType!==Node.ELEMENT_NODE||!SKIP_TAGS.has(node.tagName);node=nextNodeWithin(tracked.root,node,descend)}return(tracked.includesRootSuffix?node===null:node===last)&&textIndex===tracked.textInterval.length}function sourceStartForScopeOffset(scope,offset){return scope.globalNormalization?rawStartForFoldedOffset(scope.globalNormalization,offset):offset}function sourceEndForScopeOffset(scope,offset){return scope.globalNormalization?rawEndForFoldedOffset(scope.globalNormalization,offset):offset}function scopeStartForSourceOffset(scope,offset){return scope.globalNormalization?foldedStartForRawOffset(scope.globalNormalization,offset):offset}function scopeEndForSourceOffset(scope,offset){return scope.globalNormalization?foldedEndForRawOffset(scope.globalNormalization,offset):offset}function locate(scope,normalizedOffset,endCharacter){if(!Number.isInteger(normalizedOffset)||normalizedOffset<0||normalizedOffset>=scope.text.length)return null;const sourceOffset=endCharacter?sourceEndForScopeOffset(scope,normalizedOffset+1)-1:sourceStartForScopeOffset(scope,normalizedOffset),found=segmentIndexAt(scope,sourceOffset);if(found===-1)return null;const segment=scope.segments[found],local=sourceOffset-segment.normalizedStart;if(local<0||local>=segment.normalizedLength)return null;const cluster=clusterAtNormalizedOffset(segment,local),offset=cluster?endCharacter?cluster.rawEnd-1:cluster.rawStart:rawOffsetAt(segment,local),rawLength=segment.rawLength??segment.node.data.length;return offset>=0&&offset<rawLength?{node:segment.node,offset}:null}function rangeFromOffsets(scope,start,end,validateScope=!0){if(!Number.isInteger(start)||!Number.isInteger(end)||start<0||end<=start||end>scope.text.length)return null;const sourceStart=sourceStartForScopeOffset(scope,start),sourceEnd=sourceEndForScopeOffset(scope,end),startSegment=segmentIndexAt(scope,sourceStart),endSegment=segmentIndexAt(scope,sourceEnd-1);if(startSegment<0||endSegment<startSegment||endSegment-startSegment+1>TEXT_QUOTE_LIMITS.maxNodes||validateScope&&!scopeStructureIsFresh(scope))return null;const startPos=locate(scope,start,!1),endPos=locate(scope,end-1,!0);if(!startPos||!endPos||startPos.node.ownerDocument!==endPos.node.ownerDocument)return null;try{const range=startPos.node.ownerDocument.createRange();return range.setStart(startPos.node,startPos.offset),range.setEnd(endPos.node,endPos.offset+1),range.collapsed?null:range}catch{return null}}class TextQuoteIndex{constructor(scope,locale,limitOverrides){this.locale=locale,this.occurrenceCache=new Map,this._scanCount=0,this._scope=scope,this.limits=resolvedLimits(limitOverrides)}get scope(){return this._scope}rebindScope(scope){return scope.text!==this._scope.text||scope.truncated!==this._scope.truncated?!1:(this._scope=scope,!0)}get scanCount(){return this._scanCount}createWorkBudget(maxCodeUnits=this.limits.maxSearchWorkCodeUnits){return{remainingCodeUnits:Number.isFinite(maxCodeUnits)?Math.min(this.limits.maxSearchWorkCodeUnits,Math.max(0,Math.floor(maxCodeUnits))):this.limits.maxSearchWorkCodeUnits}}consumeWork(budget,amount){return!Number.isFinite(budget.remainingCodeUnits)||budget.remainingCodeUnits<amount?!1:(budget.remainingCodeUnits-=amount,!0)}boundedQuery(value){if(value===void 0)return;if(value.length>this.limits.maxQueryCodeUnits)return null;const normalized=normalizeQuoteText(value);return normalized.length<=this.limits.maxQueryCodeUnits?normalized:null}foldedFor(budget){return this.foldedScope?this.foldedScope:this.consumeWork(budget,this.scope.text.length)?(this.foldedScope=foldText(this.scope.text,this.locale),this.foldedScope):null}cache(key,matches){if(this.limits.maxCacheEntries!==0){if(this.occurrenceCache.size>=this.limits.maxCacheEntries){const oldest=this.occurrenceCache.keys().next().value;oldest!==void 0&&this.occurrenceCache.delete(oldest)}this.occurrenceCache.set(key,matches)}}occurrences(needle,caseInsensitive,budget){const searchableNeedle=caseInsensitive?caseFold(needle,this.locale):needle;if(searchableNeedle.length>this.limits.maxQueryCodeUnits)return emptyMatches(!1,!1);const folded=caseInsensitive?this.foldedFor(budget)??void 0:void 0;if(caseInsensitive&&!folded)return emptyMatches(!1,!1);const haystack=folded?.text??this.scope.text,key=`${caseInsensitive?"i":"s"}:${searchableNeedle}`,cached=this.occurrenceCache.get(key);if(cached)return cached;if(searchableNeedle.length===0)return emptyMatches(!this.scope.truncated,!0);if(searchableNeedle.length>haystack.length){const result2=emptyMatches(!this.scope.truncated,!0);return this.cache(key,result2),result2}if(!this.consumeWork(budget,haystack.length))return emptyMatches(!1,!1);this._scanCount++;const result=scanOccurrences(haystack,searchableNeedle,folded,this.limits.maxMatches,this.scope.truncated);return this.cache(key,result),result}search(query,budget=this.createWorkBudget()){const needle=this.boundedQuery(query);return needle===null?emptyMatches(!1,!1):needle?this.occurrences(needle,!0,budget):emptyMatches(!0,!0)}resolve(anchor,budget=this.createWorkBudget()){const quote=this.boundedQuery(anchor.quote),prefix=this.boundedQuery(anchor.prefix),suffix=this.boundedQuery(anchor.suffix);if(!quote||prefix===null||suffix===null)return null;let candidates=this.occurrences(quote,!1,budget);candidates.length===0&&candidates.scanComplete&&(candidates=this.occurrences(quote,!0,budget));const first=candidates.at(0);if(!first||!prefix&&!suffix)return first??null;if(!candidates.matchCountExact)return null;const foldedScope=this.foldedFor(budget);if(!foldedScope)return null;const foldedPrefix=prefix?caseFold(prefix,this.locale):void 0,foldedSuffix=suffix?caseFold(suffix,this.locale):void 0;let best=first,bestScore=-1;for(const candidate of candidates){const contextWork=(foldedPrefix?.length??0)+(foldedSuffix?.length??0);if(!this.consumeWork(budget,contextWork))return null;let score=0;const foldedStart=foldedStartForRawOffset(foldedScope,candidate.start),foldedEnd=foldedEndForRawOffset(foldedScope,candidate.end);if(foldedPrefix){let beforeEnd=foldedStart;for(;beforeEnd>0&&WHITESPACE_CHAR_RE.test(foldedScope.text[beforeEnd-1]);){if(!this.consumeWork(budget,1))return null;beforeEnd--}foldedScope.text.endsWith(foldedPrefix,beforeEnd)&&score++}if(foldedSuffix){let afterStart=foldedEnd;for(;afterStart<foldedScope.text.length&&WHITESPACE_CHAR_RE.test(foldedScope.text[afterStart]);){if(!this.consumeWork(budget,1))return null;afterStart++}foldedScope.text.startsWith(foldedSuffix,afterStart)&&score++}score>bestScore&&(bestScore=score,best=candidate)}return best}}function createTextQuoteIndex(scope,locale,limitOverrides){return new TextQuoteIndex(scope,locale,limitOverrides)}function resolveTextQuote(scope,anchor,locale){const match=createTextQuoteIndex(scope,locale).resolve(anchor);return match?rangeFromOffsets(scope,match.start,match.end):null}function findTextQuoteMatches(scope,query,locale,limitOverrides){return createTextQuoteIndex(scope,locale,limitOverrides).search(query)}function rangeFromTextQuoteMatch(scope,match){if(!match||typeof match!="object")return null;try{return rangeFromOffsets(scope,match.start,match.end)}catch{return null}}function rangesFromTextQuoteMatches(scope,matches){let inputLength;try{inputLength=matches.length}catch{return[]}if(!Number.isInteger(inputLength)||inputLength<0)return[];const count=Math.min(inputLength,TEXT_QUOTE_LIMITS.maxMatches),offsets=new Float64Array(count*2),present=new Uint8Array(count);for(let index=0;index<count;index++)try{const match=matches[index];if(!match||typeof match!="object")continue;offsets[index*2]=match.start,offsets[index*2+1]=match.end,present[index]=1}catch{}const ranges=Array(count).fill(null);try{if(!scopeStructureIsFresh(scope))return ranges;for(let index=0;index<count;index++)present[index]!==0&&(ranges[index]=rangeFromOffsets(scope,offsets[index*2],offsets[index*2+1],!1))}catch{ranges.fill(null)}return ranges}function findTextQuoteRanges(scope,query,locale){const ranges=[],matches=findTextQuoteMatches(scope,query,locale);try{if(!scopeStructureIsFresh(scope))return ranges}catch{return ranges}for(let index=0;index<matches.length;index++){const range=rangeFromOffsets(scope,matches.packedOffsets[index*2],matches.packedOffsets[index*2+1],!1);range&&ranges.push(range)}return ranges}function resolveBoundaryTextNode(container,offset,scope){if(container.nodeType===Node.TEXT_NODE)return{node:container,offset};const child=container.childNodes[offset];if(!child)return null;let traversalRemaining=TEXT_QUOTE_LIMITS.maxTraversalNodes;for(const segment of scope.segments){let cursor=segment.node;for(;cursor&&traversalRemaining>0;){if(traversalRemaining--,cursor===child)return{node:segment.node,offset:0};if(cursor===container)break;cursor=cursor.parentNode}if(traversalRemaining===0)return null}return null}function findRangeStartInScope(scope,range){const boundary=resolveBoundaryTextNode(range.startContainer,range.startOffset,scope);if(!boundary)return null;const segment=scope.segments.find(s=>s.node===boundary.node);if(!segment||boundary.offset<0||boundary.offset>boundary.node.data.length)return null;const local=normalizedBoundaryAtRaw(segment,boundary.offset,!1);return scopeStartForSourceOffset(scope,segment.normalizedStart+local)}function resolveEndBoundaryTextNode(container,offset,scope){if(container.nodeType===Node.TEXT_NODE)return{node:container,offset};const child=container.childNodes[offset-1];if(!child)return null;let traversalRemaining=TEXT_QUOTE_LIMITS.maxTraversalNodes;for(let index=scope.segments.length-1;index>=0;index--){const segment=scope.segments[index];let cursor=segment.node;for(;cursor&&traversalRemaining>0;){if(traversalRemaining--,cursor===child)return{node:segment.node,offset:segment.node.data.length};if(cursor===container)break;cursor=cursor.parentNode}if(traversalRemaining===0)return null}return null}function findRangeEndInScope(scope,range){const boundary=resolveEndBoundaryTextNode(range.endContainer,range.endOffset,scope);if(!boundary)return null;const segment=scope.segments.find(s=>s.node===boundary.node);if(!segment||boundary.offset<0||boundary.offset>boundary.node.data.length)return null;const local=normalizedBoundaryAtRaw(segment,boundary.offset,!0);return scopeEndForSourceOffset(scope,segment.normalizedStart+local)}function boundedRangeText(range,maxCodeUnits){if(maxCodeUnits<=0)return"";if(range.startContainer===range.endContainer&&range.startContainer.nodeType===Node.TEXT_NODE)return range.startContainer.data.slice(range.startOffset,Math.min(range.endOffset,range.startOffset+maxCodeUnits));const root=range.commonAncestorContainer;let node=root.nodeType===Node.TEXT_NODE?root:root.firstChild,visited=0,text="";for(;node&&visited<TEXT_QUOTE_LIMITS.maxTraversalNodes&&text.length<maxCodeUnits;){visited++;const next=node===root?null:nextNodeWithin(root,node,!0);if(node.nodeType===Node.TEXT_NODE){let included=!1;try{included=range.intersectsNode(node)}catch{return text}if(included){const value=node.data,start=node===range.startContainer?range.startOffset:0,end=node===range.endContainer?range.endOffset:value.length;text+=value.slice(start,Math.min(end,start+maxCodeUnits-text.length))}}node=next}return text}function boundedSelectionText(range,maxCodeUnits=TEXT_QUOTE_LIMITS.maxQueryCodeUnits){const bounded=Number.isFinite(maxCodeUnits)?Math.min(TEXT_QUOTE_LIMITS.maxQueryCodeUnits,Math.max(0,Math.floor(maxCodeUnits))):TEXT_QUOTE_LIMITS.maxQueryCodeUnits;return normalizeQuoteText(boundedRangeText(range,bounded))}const TEXT_SELECTION_RECT_LIMIT=1e3;function boundedSelectionRects(range,maxRects=TEXT_SELECTION_RECT_LIMIT){const bounded=Number.isFinite(maxRects)?Math.min(TEXT_SELECTION_RECT_LIMIT,Math.max(0,Math.floor(maxRects))):TEXT_SELECTION_RECT_LIMIT,output=[];for(const rect of range.getClientRects()){if(output.length>=bounded)break;const finite=value=>Number.isFinite(value)?value:0;output.push(Object.freeze({x:finite(rect.x),y:finite(rect.y),width:finite(rect.width),height:finite(rect.height),top:finite(rect.top),right:finite(rect.right),bottom:finite(rect.bottom),left:finite(rect.left)}))}return Object.freeze(output)}function buildQuoteAnchor(range,scope){const startOffset=findRangeStartInScope(scope,range),endOffset=findRangeEndInScope(scope,range),mappedQuote=startOffset!=null&&endOffset!=null&&endOffset>startOffset?scope.text.slice(startOffset,Math.min(endOffset,startOffset+TEXT_QUOTE_LIMITS.maxQueryCodeUnits)):"",fallbackText=mappedQuote?"":boundedRangeText(range,TEXT_QUOTE_LIMITS.maxQueryCodeUnits),quote=normalizeQuoteText((mappedQuote||fallbackText).slice(0,TEXT_QUOTE_LIMITS.maxQueryCodeUnits));let prefix,suffix;return startOffset!=null&&(prefix=scope.text.slice(Math.max(0,startOffset-TEXT_QUOTE_CONTEXT_CHARS),startOffset).trim()||void 0),endOffset!=null&&(suffix=scope.text.slice(endOffset,endOffset+TEXT_QUOTE_CONTEXT_CHARS).trim()||void 0),{kind:"text-quote",quote,...prefix?{prefix}:{},...suffix?{suffix}:{}}}export{TEXT_QUOTE_LIMITS,TEXT_QUOTE_TRAVERSAL_ALLOWANCE_MAX,TEXT_SELECTION_RECT_LIMIT,TextQuoteIndex,boundedSelectionRects,boundedSelectionText,buildQuoteAnchor,createTextQuoteIndex,emptyTextQuoteMatches,findTextQuoteMatches,findTextQuoteRanges,normalizeQuoteText,rangeFromTextQuoteMatch,rangesFromTextQuoteMatches,resolveTextQuote,scopeFromElement,scopeFromItems};
1
+ import{TEXT_QUOTE_CONTEXT_CHARS}from"../components/viewers/document-viewer/anchors.js";import{getSegmenter,resolveIntlLocale}from"./intl-cache.js";const SOFT_HYPHEN="­",WHITESPACE_CHAR_RE=/\s/u,NORMALIZATION_SPECIAL_CHAR_RE=/[\s­]/u,TEXT_QUOTE_LIMITS=Object.freeze({maxCorpusCodeUnits:1e6,maxNodes:2e4,maxTraversalNodes:2e4,maxNodeCodeUnits:1e6,maxNormalizationWorkCodeUnits:2e6,maxQueryCodeUnits:4096,maxMatches:1e4,maxSearchWorkCodeUnits:4e6,maxCacheEntries:64}),TEXT_QUOTE_TRAVERSAL_ALLOWANCE_MAX=4096;function resolvedLimits(overrides){const boundedInteger=(value,hardMaximum)=>Number.isFinite(value)?Math.min(hardMaximum,Math.max(0,Math.floor(value))):hardMaximum;return{maxCorpusCodeUnits:boundedInteger(overrides?.maxCorpusCodeUnits,TEXT_QUOTE_LIMITS.maxCorpusCodeUnits),maxNodes:boundedInteger(overrides?.maxNodes,TEXT_QUOTE_LIMITS.maxNodes),maxTraversalNodes:boundedInteger(overrides?.maxTraversalNodes??TEXT_QUOTE_LIMITS.maxTraversalNodes,TEXT_QUOTE_LIMITS.maxTraversalNodes+TEXT_QUOTE_TRAVERSAL_ALLOWANCE_MAX),maxNodeCodeUnits:boundedInteger(overrides?.maxNodeCodeUnits,TEXT_QUOTE_LIMITS.maxNodeCodeUnits),maxNormalizationWorkCodeUnits:boundedInteger(overrides?.maxNormalizationWorkCodeUnits,TEXT_QUOTE_LIMITS.maxNormalizationWorkCodeUnits),maxQueryCodeUnits:boundedInteger(overrides?.maxQueryCodeUnits,TEXT_QUOTE_LIMITS.maxQueryCodeUnits),maxMatches:boundedInteger(overrides?.maxMatches,TEXT_QUOTE_LIMITS.maxMatches),maxSearchWorkCodeUnits:boundedInteger(overrides?.maxSearchWorkCodeUnits,TEXT_QUOTE_LIMITS.maxSearchWorkCodeUnits),maxCacheEntries:boundedInteger(overrides?.maxCacheEntries,TEXT_QUOTE_LIMITS.maxCacheEntries)}}function normalizeQuoteText(s){return collapseWhitespaceAndSoftHyphen(s.normalize("NFC")).trim()}function collapseWhitespaceAndSoftHyphen(s){let out="",lastWasSpace=!1;for(const ch of s)if(ch!==SOFT_HYPHEN)if(WHITESPACE_CHAR_RE.test(ch)){if(lastWasSpace)continue;lastWasSpace=!0,out+=" "}else lastWasSpace=!1,out+=ch;return out}const scopeRoots=new WeakMap;function trackScopeRoot(scope,root,includesRootPrefix=!1,includesRootSuffix=!1,traversalLimit=TEXT_QUOTE_LIMITS.maxTraversalNodes){const first=scope.segments[0]?.node,last=scope.segments.at(-1)?.node;if(!first||!last)return scope;let node=includesRootPrefix?nextNodeWithin(root,root,!0):first;const textInterval=[],textValues=[];let segmentIndex=0,traversed=0,reachedLast=!1,unexpectedItemText=!1;for(;node&&traversed++<traversalLimit;){if(node.nodeType===Node.TEXT_NODE){const text=node;if(textInterval.push(text),textValues.push(text.data),text===scope.segments[segmentIndex]?.node?segmentIndex++:includesRootPrefix||(unexpectedItemText=!0),node===last&&(reachedLast=!0,!includesRootSuffix))break}const descend=!includesRootPrefix||node.nodeType!==Node.ELEMENT_NODE||!SKIP_TAGS.has(node.tagName);node=nextNodeWithin(root,node,descend)}return scopeRoots.set(scope,{root,traversalLimit,textInterval,valid:reachedLast&&segmentIndex===scope.segments.length&&!unexpectedItemText&&(!includesRootSuffix||node===null),textValues,includesRootPrefix,includesRootSuffix}),scope}const MARK_RE=/\p{Mark}/u;function hangulSyllableType(character){const codePoint=character.codePointAt(0);return codePoint===void 0?null:codePoint>=4352&&codePoint<=4447||codePoint>=43360&&codePoint<=43388?"L":codePoint>=4448&&codePoint<=4519||codePoint>=55216&&codePoint<=55238?"V":codePoint>=4520&&codePoint<=4607||codePoint>=55243&&codePoint<=55291?"T":codePoint<44032||codePoint>55203?null:(codePoint-44032)%28===0?"LV":"LVT"}function continuesHangulSyllable(previous,next){const previousType=hangulSyllableType(previous),nextType=hangulSyllableType(next);return previousType==="L"?nextType==="L"||nextType==="V"||nextType==="LV"||nextType==="LVT":previousType==="LV"||previousType==="V"?nextType==="V"||nextType==="T":(previousType==="LVT"||previousType==="T")&&nextType==="T"}function lastCodePoint(value){if(value.length===0)return;const last=value.charCodeAt(value.length-1),start=last>=56320&&last<=57343&&value.length>1&&value.charCodeAt(value.length-2)>=55296&&value.charCodeAt(value.length-2)<=56319?value.length-2:value.length-1;return value.slice(start)}function firstVisibleCodePoint(value){for(const character of value)if(character!==SOFT_HYPHEN)return WHITESPACE_CHAR_RE.test(character)?" ":character}function continuesPreviousGrapheme(previousCharacter,firstCharacter){if(firstCharacter===void 0)return!1;const composesAcrossBoundary=previousCharacter!==void 0&&`${previousCharacter}${firstCharacter}`.normalize("NFC")!==`${previousCharacter.normalize("NFC")}${firstCharacter.normalize("NFC")}`;return MARK_RE.test(firstCharacter)||firstCharacter==="️"||firstCharacter==="‍"||previousCharacter==="‍"||previousCharacter!==void 0&&continuesHangulSyllable(previousCharacter,firstCharacter)||composesAcrossBoundary}function*normalizationClusters(value){if(typeof Intl.Segmenter=="function"){for(const{segment,index}of segmenterFor().segment(value))yield{text:segment,rawStart:index,rawEnd:index+segment.length};return}let cluster="",rawStart=0,rawEnd=0,joinsNext=!1,previousCharacter="";for(const char of value)!(cluster!==""&&(MARK_RE.test(char)||char==="️"||joinsNext||continuesHangulSyllable(previousCharacter,char)))&&cluster&&(yield{text:cluster,rawStart,rawEnd},cluster="",rawStart=rawEnd),cluster+=char,rawEnd+=char.length,joinsNext=char==="‍",previousCharacter=char;cluster&&(yield{text:cluster,rawStart,rawEnd})}function normalizeScopeGlobally(scope){if(scope.text.normalize("NFC")===scope.text)return scope;const expansions=[],chunks=[];let mappedStart=0;for(const cluster of normalizationClusters(scope.text)){const mapped=cluster.text.normalize("NFC"),mappedEnd=mappedStart+mapped.length;mapped!==cluster.text&&expansions.push(cluster.rawStart,cluster.rawEnd,mappedStart,mappedEnd),chunks.push(mapped),mappedStart=mappedEnd}const mapping={text:chunks.join(""),expansions:Uint32Array.from(expansions)};return scope.text=mapping.text,scope.globalNormalization=mapping,scope}function normalizeSegment(raw,maxOutputCodeUnits,maxWorkCodeUnits,initialLastWasSpace=!1){const inspectedLength=Math.min(raw.length,maxWorkCodeUnits),inspected=raw.slice(0,inspectedLength),nfc=inspected.normalize("NFC"),chunks=[];let chunk="",normalizedLength=0;const rawOffsetRuns=[],rawClusterRuns=[];let currentDelta=0,lastWasSpace=initialLastWasSpace,outputTruncated=!1;if(nfc===inspected&&!NORMALIZATION_SPECIAL_CHAR_RE.test(inspected)){const retainedLength=Math.min(inspected.length,maxOutputCodeUnits),terminalRuns=retainedLength<inspected.length?new Uint32Array([retainedLength,inspected.length]):new Uint32Array;return{text:inspected.slice(0,retainedLength),rawOffsetRuns:terminalRuns,rawClusterRuns:new Uint32Array,workCodeUnits:inspectedLength,truncated:retainedLength<inspected.length||inspectedLength<raw.length,lastWasSpace:inspected.length===0?initialLastWasSpace:!1}}const appendUnit=(ch,rawIndex)=>{if(ch===SOFT_HYPHEN)return!0;if(WHITESPACE_CHAR_RE.test(ch)){if(lastWasSpace)return!0;if(lastWasSpace=!0,normalizedLength>=maxOutputCodeUnits)return!1;const delta=rawIndex-normalizedLength;delta!==currentDelta&&(rawOffsetRuns.push(normalizedLength,rawIndex),currentDelta=delta),chunk+=" ",normalizedLength++}else{if(lastWasSpace=!1,normalizedLength>=maxOutputCodeUnits)return!1;const delta=rawIndex-normalizedLength;delta!==currentDelta&&(rawOffsetRuns.push(normalizedLength,rawIndex),currentDelta=delta),chunk+=ch,normalizedLength++}return chunk.length>=4096&&(chunks.push(chunk),chunk=""),!0};if(nfc===inspected){for(let rawIndex=0;rawIndex<inspected.length;rawIndex++)if(!appendUnit(inspected[rawIndex],rawIndex)){outputTruncated=!0;break}}else for(const cluster of normalizationClusters(inspected)){const normalizedCluster=cluster.text.normalize("NFC");if(normalizedCluster===cluster.text){for(let local=0;local<cluster.text.length;local++)if(!appendUnit(cluster.text[local],cluster.rawStart+local)){outputTruncated=!0;break}if(outputTruncated)break;continue}const normalizedVisible=collapseWhitespaceAndSoftHyphen(normalizedCluster);if(!normalizedVisible)continue;if(normalizedLength+normalizedVisible.length>maxOutputCodeUnits){outputTruncated=!0;break}const normalizedStart=normalizedLength;chunk+=normalizedVisible,normalizedLength+=normalizedVisible.length,lastWasSpace=normalizedVisible.endsWith(" "),rawClusterRuns.push(normalizedStart,normalizedLength,cluster.rawStart,cluster.rawEnd),chunk.length>=4096&&(chunks.push(chunk),chunk="")}return inspectedLength-normalizedLength!==currentDelta&&rawOffsetRuns.push(normalizedLength,inspectedLength),{text:chunks.join("")+chunk,rawOffsetRuns:Uint32Array.from(rawOffsetRuns),rawClusterRuns:Uint32Array.from(rawClusterRuns),workCodeUnits:inspectedLength,truncated:outputTruncated||inspectedLength<raw.length,lastWasSpace}}const SKIP_TAGS=new Set(["SCRIPT","STYLE","TEMPLATE","NOSCRIPT"]);function nextNodeWithin(root,node,descend){if(descend&&node.firstChild)return node.firstChild;let current=node;for(;current&&current!==root;){if(current.nextSibling)return current.nextSibling;current=current.parentNode}return null}function scopeFromElement(root,limitOverrides){const limits=resolvedLimits(limitOverrides),segments=[],textChunks=[];let textLength=0,textNodesVisited=0,traversalNodesVisited=0,workCodeUnits=0,lastWasSpace=!1,truncated=!1,node=root.firstChild;for(;node;){if(traversalNodesVisited>=limits.maxTraversalNodes){truncated=!0;break}traversalNodesVisited++;const skipChildren=node.nodeType===Node.ELEMENT_NODE&&SKIP_TAGS.has(node.tagName),next=nextNodeWithin(root,node,!skipChildren);if(node.nodeType!==Node.TEXT_NODE){node=next;continue}if(textNodesVisited>=limits.maxNodes){truncated=!0;break}textNodesVisited++;const textNode=node,workRemaining=Math.max(0,limits.maxNormalizationWorkCodeUnits-workCodeUnits);if(workRemaining===0){truncated=!0;break}const nodeWork=Math.min(limits.maxNodeCodeUnits,workRemaining),{text:segText,rawOffsetRuns,rawClusterRuns,workCodeUnits:used,truncated:segmentTruncated,lastWasSpace:nextLastWasSpace}=normalizeSegment(textNode.data,Math.max(0,limits.maxCorpusCodeUnits-textLength),nodeWork,lastWasSpace);if(workCodeUnits+=used,lastWasSpace=nextLastWasSpace,segText.length===0){if(segmentTruncated){truncated=!0;break}node=next;continue}if(segments.push({node:textNode,normalizedStart:textLength,normalizedLength:segText.length,rawOffsetRuns,rawClusterRuns,rawLength:textNode.data.length,rawText:textNode.data,parentNode:textNode.parentNode,previousSibling:textNode.previousSibling,nextSibling:textNode.nextSibling}),textChunks.push(segText),textLength+=segText.length,segmentTruncated){truncated=!0;break}if(textLength===limits.maxCorpusCodeUnits){truncated=next!==null;break}node=next}const scope=normalizeScopeGlobally({text:textChunks.join(""),segments,truncated});return trackScopeRoot(scope,root,!0,!scope.truncated,limits.maxTraversalNodes)}function firstTextNode(element,traversalRemaining){let inspected=0,child=element.firstChild;for(;child&&inspected<traversalRemaining;){if(inspected++,child.nodeType===Node.TEXT_NODE)return{node:child,inspected,truncated:!1};child=child.nextSibling}return{node:null,inspected,truncated:child!==null}}function scopeFromItems(items,limitOverrides){const limits=resolvedLimits(limitOverrides),segments=[],textChunks=[];let textLength=0,workCodeUnits=0,traversalNodesVisited=0,lastWasSpace=!1,truncated=!1;for(let itemIndex=0;itemIndex<items.length;itemIndex++){if(itemIndex>=limits.maxNodes){truncated=!0;break}const item=items[itemIndex],located=item.node?{node:item.node,inspected:1,truncated:!1}:firstTextNode(item.element,Math.max(0,limits.maxTraversalNodes-traversalNodesVisited));if(traversalNodesVisited+=located.inspected,located.truncated||traversalNodesVisited>limits.maxTraversalNodes){truncated=!0;break}const node=located.node;if(!node){if(item.text!==""){truncated=!0;break}continue}if(item.node&&item.node.parentElement!==item.element){truncated=!0;break}if(item.text!==node.data){truncated=!0;break}const workRemaining=Math.max(0,limits.maxNormalizationWorkCodeUnits-workCodeUnits);if(workRemaining===0){truncated=!0;break}const previousCharacter=lastCodePoint(textChunks.at(-1)??""),rawFirstCharacter=firstVisibleCodePoint(item.text),reservesSyntheticJoin=item.joinBefore!==!1&&textLength>0&&!lastWasSpace&&rawFirstCharacter!==" "&&!continuesPreviousGrapheme(previousCharacter,rawFirstCharacter),{text:segText,rawOffsetRuns,rawClusterRuns,workCodeUnits:used,truncated:segmentTruncated,lastWasSpace:nextLastWasSpace}=normalizeSegment(item.text,Math.max(0,limits.maxCorpusCodeUnits-textLength-(reservesSyntheticJoin?1:0)),Math.min(limits.maxNodeCodeUnits,workRemaining),lastWasSpace);workCodeUnits+=used;const firstCharacter=segText[Symbol.iterator]().next().value,continuesPreviousCluster=continuesPreviousGrapheme(previousCharacter,firstCharacter),needsSyntheticJoin=textLength>0&&item.joinBefore!==!1&&!lastWasSpace&&!segText.startsWith(" ")&&!continuesPreviousCluster;if(lastWasSpace=nextLastWasSpace,segText.length===0){if(segmentTruncated){truncated=!0;break}continue}if(needsSyntheticJoin){if(textLength>=limits.maxCorpusCodeUnits){truncated=!0;break}textChunks.push(" "),textLength++}if(segments.push({node,normalizedStart:textLength,normalizedLength:segText.length,rawOffsetRuns,rawClusterRuns,rawLength:node.data.length,rawText:node.data,parentNode:node.parentNode,previousSibling:node.previousSibling,nextSibling:node.nextSibling}),textChunks.push(segText),textLength+=segText.length,segmentTruncated){truncated=!0;break}if(textLength===limits.maxCorpusCodeUnits){truncated=itemIndex+1<items.length;break}}const scope=normalizeScopeGlobally({text:textChunks.join(""),segments,truncated}),commonRoot=commonAncestorOfSegments(segments);return commonRoot?trackScopeRoot(scope,commonRoot):(segments.length>0&&(scope.truncated=!0,scopeRoots.set(scope,{root:segments[0].node,textInterval:[],textValues:[],valid:!1,includesRootPrefix:!1,includesRootSuffix:!1,traversalLimit:TEXT_QUOTE_LIMITS.maxTraversalNodes})),scope)}function commonAncestorOfSegments(segments){const first=segments[0]?.node,last=segments.at(-1)?.node;if(!first||!last)return null;const ancestors=new Set;let cursor=first,visited=0;for(;cursor&&visited++<TEXT_QUOTE_LIMITS.maxTraversalNodes;)ancestors.add(cursor),cursor=cursor.parentNode;if(cursor)return null;for(cursor=last,visited=0;cursor&&!ancestors.has(cursor)&&visited++<TEXT_QUOTE_LIMITS.maxTraversalNodes;)cursor=cursor.parentNode;return cursor&&ancestors.has(cursor)?cursor:null}function caseFold(value,locale){let lowered;return locale?lowered=value.toLocaleLowerCase(resolveIntlLocale(locale)):lowered=value.toLowerCase(),lowered.replaceAll("ς","σ")}function segmenterFor(locale){try{return getSegmenter(locale,{granularity:"grapheme"})}catch(error){if(error instanceof RangeError)return getSegmenter(void 0,{granularity:"grapheme"});throw error}}function*caseMappingSegments(value,locale){if(typeof Intl.Segmenter=="function"){for(const{segment,index}of segmenterFor(locale).segment(value))yield{text:segment,rawStart:index,rawEnd:index+segment.length};return}let rawStart=0;for(const text of value)yield{text,rawStart,rawEnd:rawStart+text.length},rawStart+=text.length}function foldText(value,locale){const text=caseFold(value,locale);if(text.length===value.length)return{text,expansions:new Uint32Array};let expansions=new Uint32Array(Math.min(64,Math.max(1,value.length))*4),expansionCount=0;const appendExpansion=(rawStart,rawEnd,foldedStart2,foldedEnd)=>{if(expansionCount*4===expansions.length){const nextCapacity=Math.min(value.length,Math.max(1,(expansions.length>>2)*2)),next=new Uint32Array(nextCapacity*4);next.set(expansions),expansions=next}const offset=expansionCount*4;expansions[offset]=rawStart,expansions[offset+1]=rawEnd,expansions[offset+2]=foldedStart2,expansions[offset+3]=foldedEnd,expansionCount++};let foldedStart=0;for(const segment of caseMappingSegments(value,locale)){const isolatedLength=caseFold(segment.text,locale).length,foldedEnd=segment.rawEnd===value.length?text.length:Math.min(text.length,foldedStart+isolatedLength);foldedEnd-foldedStart!==segment.rawEnd-segment.rawStart&&appendExpansion(segment.rawStart,segment.rawEnd,foldedStart,foldedEnd),foldedStart=foldedEnd}return{text,expansions:expansions.slice(0,expansionCount*4)}}function rawStartForFoldedOffset(folded,foldedOffset){let lo=0,hi=(folded.expansions.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;folded.expansions[mid*4+2]<=foldedOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return foldedOffset;const offset=found*4,rawStart=folded.expansions[offset],rawEnd=folded.expansions[offset+1],foldedEnd=folded.expansions[offset+3];return foldedOffset<foldedEnd?rawStart:foldedOffset-(foldedEnd-rawEnd)}function rawEndForFoldedOffset(folded,foldedOffset){let lo=0,hi=(folded.expansions.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;folded.expansions[mid*4+2]<foldedOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return foldedOffset;const offset=found*4,rawEnd=folded.expansions[offset+1],foldedEnd=folded.expansions[offset+3];return foldedOffset<=foldedEnd?rawEnd:foldedOffset-(foldedEnd-rawEnd)}class PackedTextQuoteMatches{constructor(packedOffsets,matchCountExact,scanComplete){this.packedOffsets=packedOffsets,this.matchCountExact=matchCountExact,this.scanComplete=scanComplete}get length(){return this.packedOffsets.length>>1}at(index){if(!(!Number.isInteger(index)||index<0||index>=this.length))return{start:this.packedOffsets[index*2],end:this.packedOffsets[index*2+1]}}*[Symbol.iterator](){for(let index=0;index<this.length;index++)yield this.at(index)}}function emptyMatches(matchCountExact,scanComplete=matchCountExact){return new PackedTextQuoteMatches(new Uint32Array,matchCountExact,scanComplete)}function emptyTextQuoteMatches(){return emptyMatches(!0,!0)}function scanOccurrences(haystack,needle,foldedHaystack,maxMatches,scopeTruncated){const packed=new Uint32Array(maxMatches*2);let count=0,scanComplete=!0,from=0;for(;;){const index=haystack.indexOf(needle,from);if(index===-1)break;if(count>=maxMatches){scanComplete=!1;break}foldedHaystack?(packed[count*2]=rawStartForFoldedOffset(foldedHaystack,index),packed[count*2+1]=rawEndForFoldedOffset(foldedHaystack,index+needle.length)):(packed[count*2]=index,packed[count*2+1]=index+needle.length),count++,from=index+1}return new PackedTextQuoteMatches(packed.slice(0,count*2),scanComplete&&!scopeTruncated,scanComplete)}function foldedStartForRawOffset(folded,rawOffset){let lo=0,hi=(folded.expansions.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;folded.expansions[mid*4]<=rawOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return rawOffset;const offset=found*4,rawEnd=folded.expansions[offset+1],foldedStart=folded.expansions[offset+2],foldedEnd=folded.expansions[offset+3];return rawOffset<rawEnd?foldedStart:rawOffset+(foldedEnd-rawEnd)}function foldedEndForRawOffset(folded,rawOffset){let lo=0,hi=(folded.expansions.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;folded.expansions[mid*4]<rawOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return rawOffset;const offset=found*4,rawEnd=folded.expansions[offset+1],foldedEnd=folded.expansions[offset+3];return rawOffset<=rawEnd?foldedEnd:rawOffset+(foldedEnd-rawEnd)}function rawOffsetAt(segment,normalizedOffset){const runs=segment.rawOffsetRuns;let lo=0,hi=(runs.length>>1)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;runs[mid*2]<=normalizedOffset?(found=mid,lo=mid+1):hi=mid-1}if(found<0)return normalizedOffset;const normalizedStart=runs[found*2];return runs[found*2+1]+normalizedOffset-normalizedStart}function clusterAtNormalizedOffset(segment,normalizedOffset){const runs=segment.rawClusterRuns??new Uint32Array;let lo=0,hi=(runs.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;runs[mid*4]<=normalizedOffset?(found=mid,lo=mid+1):hi=mid-1}return found<0||normalizedOffset>=runs[found*4+1]?null:{normalizedStart:runs[found*4],normalizedEnd:runs[found*4+1],rawStart:runs[found*4+2],rawEnd:runs[found*4+3]}}function clusterAtRawOffset(segment,rawOffset){const runs=segment.rawClusterRuns??new Uint32Array;let lo=0,hi=(runs.length>>2)-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;runs[mid*4+2]<=rawOffset?(found=mid,lo=mid+1):hi=mid-1}return found<0||rawOffset>=runs[found*4+3]?null:{normalizedStart:runs[found*4],normalizedEnd:runs[found*4+1],rawStart:runs[found*4+2],rawEnd:runs[found*4+3]}}function normalizedOffsetAtOrAfterRaw(segment,rawOffset){let lo=0,hi=segment.normalizedLength;for(;lo<hi;){const mid=lo+hi>>1;rawOffsetAt(segment,mid)<rawOffset?lo=mid+1:hi=mid}return lo}function normalizedBoundaryAtRaw(segment,rawOffset,endBoundary){const cluster=clusterAtRawOffset(segment,rawOffset);return cluster?rawOffset===cluster.rawStart?cluster.normalizedStart:endBoundary?cluster.normalizedEnd:cluster.normalizedStart:normalizedOffsetAtOrAfterRaw(segment,rawOffset)}function segmentIndexAt(scope,normalizedOffset){let lo=0,hi=scope.segments.length-1,found=-1;for(;lo<=hi;){const mid=lo+hi>>1;scope.segments[mid].normalizedStart<=normalizedOffset?(found=mid,lo=mid+1):hi=mid-1}return found}function segmentIsFresh(segment){return!(segment.rawLength!==void 0&&segment.node.data.length!==segment.rawLength||segment.rawText!==void 0&&segment.node.data!==segment.rawText||segment.parentNode!==void 0&&segment.node.parentNode!==segment.parentNode||segment.previousSibling!==void 0&&segment.node.previousSibling!==segment.previousSibling||segment.nextSibling!==void 0&&segment.node.nextSibling!==segment.nextSibling)}function scopeStructureIsFresh(scope){const tracked=scopeRoots.get(scope);if(tracked&&!tracked.valid)return!1;for(const segment of scope.segments)if(!segmentIsFresh(segment))return!1;if(!tracked)return!0;const first=tracked.textInterval[0],last=tracked.textInterval.at(-1);if(!first||!last||!tracked.root.contains(first)||!tracked.root.contains(last))return!1;let node=tracked.includesRootPrefix?nextNodeWithin(tracked.root,tracked.root,!0):first,textIndex=0,traversed=0;for(;node&&traversed++<tracked.traversalLimit;){if(node.nodeType===Node.TEXT_NODE){if(node!==tracked.textInterval[textIndex]||node.data!==tracked.textValues[textIndex])return!1;if(textIndex++,!tracked.includesRootSuffix&&node===last)break}const descend=!tracked.includesRootPrefix||node.nodeType!==Node.ELEMENT_NODE||!SKIP_TAGS.has(node.tagName);node=nextNodeWithin(tracked.root,node,descend)}return(tracked.includesRootSuffix?node===null:node===last)&&textIndex===tracked.textInterval.length}function sourceStartForScopeOffset(scope,offset){return scope.globalNormalization?rawStartForFoldedOffset(scope.globalNormalization,offset):offset}function sourceEndForScopeOffset(scope,offset){return scope.globalNormalization?rawEndForFoldedOffset(scope.globalNormalization,offset):offset}function scopeStartForSourceOffset(scope,offset){return scope.globalNormalization?foldedStartForRawOffset(scope.globalNormalization,offset):offset}function scopeEndForSourceOffset(scope,offset){return scope.globalNormalization?foldedEndForRawOffset(scope.globalNormalization,offset):offset}function locate(scope,normalizedOffset,endCharacter){if(!Number.isInteger(normalizedOffset)||normalizedOffset<0||normalizedOffset>=scope.text.length)return null;const sourceOffset=endCharacter?sourceEndForScopeOffset(scope,normalizedOffset+1)-1:sourceStartForScopeOffset(scope,normalizedOffset),found=segmentIndexAt(scope,sourceOffset);if(found===-1)return null;const segment=scope.segments[found],local=sourceOffset-segment.normalizedStart;if(local<0||local>=segment.normalizedLength)return null;const cluster=clusterAtNormalizedOffset(segment,local),offset=cluster?endCharacter?cluster.rawEnd-1:cluster.rawStart:rawOffsetAt(segment,local),rawLength=segment.rawLength??segment.node.data.length;return offset>=0&&offset<rawLength?{node:segment.node,offset}:null}function rangeFromOffsets(scope,start,end,validateScope=!0){if(!Number.isInteger(start)||!Number.isInteger(end)||start<0||end<=start||end>scope.text.length)return null;const sourceStart=sourceStartForScopeOffset(scope,start),sourceEnd=sourceEndForScopeOffset(scope,end),startSegment=segmentIndexAt(scope,sourceStart),endSegment=segmentIndexAt(scope,sourceEnd-1);if(startSegment<0||endSegment<startSegment||endSegment-startSegment+1>TEXT_QUOTE_LIMITS.maxNodes||validateScope&&!scopeStructureIsFresh(scope))return null;const startPos=locate(scope,start,!1),endPos=locate(scope,end-1,!0);if(!startPos||!endPos||startPos.node.ownerDocument!==endPos.node.ownerDocument)return null;try{const range=startPos.node.ownerDocument.createRange();return range.setStart(startPos.node,startPos.offset),range.setEnd(endPos.node,endPos.offset+1),range.collapsed?null:range}catch{return null}}class TextQuoteIndex{constructor(scope,locale,limitOverrides){this.locale=locale,this.occurrenceCache=new Map,this._scanCount=0,this._scope=scope,this.limits=resolvedLimits(limitOverrides)}get scope(){return this._scope}rebindScope(scope){return scope.text!==this._scope.text||scope.truncated!==this._scope.truncated?!1:(this._scope=scope,!0)}get scanCount(){return this._scanCount}createWorkBudget(maxCodeUnits=this.limits.maxSearchWorkCodeUnits){return{remainingCodeUnits:Number.isFinite(maxCodeUnits)?Math.min(this.limits.maxSearchWorkCodeUnits,Math.max(0,Math.floor(maxCodeUnits))):this.limits.maxSearchWorkCodeUnits}}consumeWork(budget,amount){return!Number.isFinite(budget.remainingCodeUnits)||budget.remainingCodeUnits<amount?!1:(budget.remainingCodeUnits-=amount,!0)}boundedQuery(value){if(value===void 0)return;if(value.length>this.limits.maxQueryCodeUnits)return null;const normalized=normalizeQuoteText(value);return normalized.length<=this.limits.maxQueryCodeUnits?normalized:null}foldedFor(budget){return this.foldedScope?this.foldedScope:this.consumeWork(budget,this.scope.text.length)?(this.foldedScope=foldText(this.scope.text,this.locale),this.foldedScope):null}cache(key,matches){if(this.limits.maxCacheEntries!==0){if(this.occurrenceCache.size>=this.limits.maxCacheEntries){const oldest=this.occurrenceCache.keys().next().value;oldest!==void 0&&this.occurrenceCache.delete(oldest)}this.occurrenceCache.set(key,matches)}}occurrences(needle,caseInsensitive,budget){const searchableNeedle=caseInsensitive?caseFold(needle,this.locale):needle;if(searchableNeedle.length>this.limits.maxQueryCodeUnits)return emptyMatches(!1,!1);const folded=caseInsensitive?this.foldedFor(budget)??void 0:void 0;if(caseInsensitive&&!folded)return emptyMatches(!1,!1);const haystack=folded?.text??this.scope.text,key=`${caseInsensitive?"i":"s"}:${searchableNeedle}`,cached=this.occurrenceCache.get(key);if(cached)return cached;if(searchableNeedle.length===0)return emptyMatches(!this.scope.truncated,!0);if(searchableNeedle.length>haystack.length){const result2=emptyMatches(!this.scope.truncated,!0);return this.cache(key,result2),result2}if(!this.consumeWork(budget,haystack.length))return emptyMatches(!1,!1);this._scanCount++;const result=scanOccurrences(haystack,searchableNeedle,folded,this.limits.maxMatches,this.scope.truncated);return this.cache(key,result),result}search(query,budget=this.createWorkBudget()){const needle=this.boundedQuery(query);return needle===null?emptyMatches(!1,!1):needle?this.occurrences(needle,!0,budget):emptyMatches(!0,!0)}resolve(anchor,budget=this.createWorkBudget()){const quote=this.boundedQuery(anchor.quote),prefix=this.boundedQuery(anchor.prefix),suffix=this.boundedQuery(anchor.suffix);if(!quote||prefix===null||suffix===null)return null;let candidates=this.occurrences(quote,!1,budget);candidates.length===0&&candidates.scanComplete&&(candidates=this.occurrences(quote,!0,budget));const first=candidates.at(0);if(!first||!prefix&&!suffix)return first??null;if(!candidates.matchCountExact)return null;const foldedScope=this.foldedFor(budget);if(!foldedScope)return null;const foldedPrefix=prefix?caseFold(prefix,this.locale):void 0,foldedSuffix=suffix?caseFold(suffix,this.locale):void 0;let best=first,bestScore=-1;for(const candidate of candidates){const contextWork=(foldedPrefix?.length??0)+(foldedSuffix?.length??0);if(!this.consumeWork(budget,contextWork))return null;let score=0;const foldedStart=foldedStartForRawOffset(foldedScope,candidate.start),foldedEnd=foldedEndForRawOffset(foldedScope,candidate.end);if(foldedPrefix){let beforeEnd=foldedStart;for(;beforeEnd>0&&WHITESPACE_CHAR_RE.test(foldedScope.text[beforeEnd-1]);){if(!this.consumeWork(budget,1))return null;beforeEnd--}foldedScope.text.endsWith(foldedPrefix,beforeEnd)&&score++}if(foldedSuffix){let afterStart=foldedEnd;for(;afterStart<foldedScope.text.length&&WHITESPACE_CHAR_RE.test(foldedScope.text[afterStart]);){if(!this.consumeWork(budget,1))return null;afterStart++}foldedScope.text.startsWith(foldedSuffix,afterStart)&&score++}score>bestScore&&(bestScore=score,best=candidate)}return best}}function createTextQuoteIndex(scope,locale,limitOverrides){return new TextQuoteIndex(scope,locale,limitOverrides)}function resolveTextQuote(scope,anchor,locale){const match=createTextQuoteIndex(scope,locale).resolve(anchor);return match?rangeFromOffsets(scope,match.start,match.end):null}function findTextQuoteMatches(scope,query,locale,limitOverrides){return createTextQuoteIndex(scope,locale,limitOverrides).search(query)}function rangeFromTextQuoteMatch(scope,match){if(!match||typeof match!="object")return null;try{return rangeFromOffsets(scope,match.start,match.end)}catch{return null}}function rangesFromTextQuoteMatches(scope,matches){let inputLength;try{inputLength=matches.length}catch{return[]}if(!Number.isInteger(inputLength)||inputLength<0)return[];const count=Math.min(inputLength,TEXT_QUOTE_LIMITS.maxMatches),offsets=new Float64Array(count*2),present=new Uint8Array(count);for(let index=0;index<count;index++)try{const match=matches[index];if(!match||typeof match!="object")continue;offsets[index*2]=match.start,offsets[index*2+1]=match.end,present[index]=1}catch{}const ranges=Array(count).fill(null);try{if(!scopeStructureIsFresh(scope))return ranges;for(let index=0;index<count;index++)present[index]!==0&&(ranges[index]=rangeFromOffsets(scope,offsets[index*2],offsets[index*2+1],!1))}catch{ranges.fill(null)}return ranges}function resolveBoundaryTextNode(container,offset,scope){if(container.nodeType===Node.TEXT_NODE)return{node:container,offset};const child=container.childNodes[offset];if(!child)return null;let traversalRemaining=TEXT_QUOTE_LIMITS.maxTraversalNodes;for(const segment of scope.segments){let cursor=segment.node;for(;cursor&&traversalRemaining>0;){if(traversalRemaining--,cursor===child)return{node:segment.node,offset:0};if(cursor===container)break;cursor=cursor.parentNode}if(traversalRemaining===0)return null}return null}function findRangeStartInScope(scope,range){const boundary=resolveBoundaryTextNode(range.startContainer,range.startOffset,scope);if(!boundary)return null;const segment=scope.segments.find(s=>s.node===boundary.node);if(!segment||boundary.offset<0||boundary.offset>boundary.node.data.length)return null;const local=normalizedBoundaryAtRaw(segment,boundary.offset,!1);return scopeStartForSourceOffset(scope,segment.normalizedStart+local)}function resolveEndBoundaryTextNode(container,offset,scope){if(container.nodeType===Node.TEXT_NODE)return{node:container,offset};const child=container.childNodes[offset-1];if(!child)return null;let traversalRemaining=TEXT_QUOTE_LIMITS.maxTraversalNodes;for(let index=scope.segments.length-1;index>=0;index--){const segment=scope.segments[index];let cursor=segment.node;for(;cursor&&traversalRemaining>0;){if(traversalRemaining--,cursor===child)return{node:segment.node,offset:segment.node.data.length};if(cursor===container)break;cursor=cursor.parentNode}if(traversalRemaining===0)return null}return null}function findRangeEndInScope(scope,range){const boundary=resolveEndBoundaryTextNode(range.endContainer,range.endOffset,scope);if(!boundary)return null;const segment=scope.segments.find(s=>s.node===boundary.node);if(!segment||boundary.offset<0||boundary.offset>boundary.node.data.length)return null;const local=normalizedBoundaryAtRaw(segment,boundary.offset,!0);return scopeEndForSourceOffset(scope,segment.normalizedStart+local)}function boundedRangeText(range,maxCodeUnits){if(maxCodeUnits<=0)return"";if(range.startContainer===range.endContainer&&range.startContainer.nodeType===Node.TEXT_NODE)return range.startContainer.data.slice(range.startOffset,Math.min(range.endOffset,range.startOffset+maxCodeUnits));const root=range.commonAncestorContainer;let node=root.nodeType===Node.TEXT_NODE?root:root.firstChild,visited=0,text="";for(;node&&visited<TEXT_QUOTE_LIMITS.maxTraversalNodes&&text.length<maxCodeUnits;){visited++;const next=node===root?null:nextNodeWithin(root,node,!0);if(node.nodeType===Node.TEXT_NODE){let included=!1;try{included=range.intersectsNode(node)}catch{return text}if(included){const value=node.data,start=node===range.startContainer?range.startOffset:0,end=node===range.endContainer?range.endOffset:value.length;text+=value.slice(start,Math.min(end,start+maxCodeUnits-text.length))}}node=next}return text}function boundedSelectionText(range,maxCodeUnits=TEXT_QUOTE_LIMITS.maxQueryCodeUnits){const bounded=Number.isFinite(maxCodeUnits)?Math.min(TEXT_QUOTE_LIMITS.maxQueryCodeUnits,Math.max(0,Math.floor(maxCodeUnits))):TEXT_QUOTE_LIMITS.maxQueryCodeUnits;return normalizeQuoteText(boundedRangeText(range,bounded))}const TEXT_SELECTION_RECT_LIMIT=1e3;function boundedSelectionRects(range,maxRects=TEXT_SELECTION_RECT_LIMIT){const bounded=Number.isFinite(maxRects)?Math.min(TEXT_SELECTION_RECT_LIMIT,Math.max(0,Math.floor(maxRects))):TEXT_SELECTION_RECT_LIMIT,output=[];for(const rect of range.getClientRects()){if(output.length>=bounded)break;const finite=value=>Number.isFinite(value)?value:0;output.push(Object.freeze({x:finite(rect.x),y:finite(rect.y),width:finite(rect.width),height:finite(rect.height),top:finite(rect.top),right:finite(rect.right),bottom:finite(rect.bottom),left:finite(rect.left)}))}return Object.freeze(output)}function buildQuoteAnchor(range,scope){const startOffset=findRangeStartInScope(scope,range),endOffset=findRangeEndInScope(scope,range),mappedQuote=startOffset!=null&&endOffset!=null&&endOffset>startOffset?scope.text.slice(startOffset,Math.min(endOffset,startOffset+TEXT_QUOTE_LIMITS.maxQueryCodeUnits)):"",fallbackText=mappedQuote?"":boundedRangeText(range,TEXT_QUOTE_LIMITS.maxQueryCodeUnits),quote=normalizeQuoteText((mappedQuote||fallbackText).slice(0,TEXT_QUOTE_LIMITS.maxQueryCodeUnits));let prefix,suffix;return startOffset!=null&&(prefix=scope.text.slice(Math.max(0,startOffset-TEXT_QUOTE_CONTEXT_CHARS),startOffset).trim()||void 0),endOffset!=null&&(suffix=scope.text.slice(endOffset,endOffset+TEXT_QUOTE_CONTEXT_CHARS).trim()||void 0),{kind:"text-quote",quote,...prefix?{prefix}:{},...suffix?{suffix}:{}}}export{TEXT_QUOTE_LIMITS,TEXT_QUOTE_TRAVERSAL_ALLOWANCE_MAX,TEXT_SELECTION_RECT_LIMIT,TextQuoteIndex,boundedSelectionRects,boundedSelectionText,buildQuoteAnchor,createTextQuoteIndex,emptyTextQuoteMatches,findTextQuoteMatches,normalizeQuoteText,rangeFromTextQuoteMatch,rangesFromTextQuoteMatches,resolveTextQuote,scopeFromElement,scopeFromItems};
@@ -0,0 +1,4 @@
1
+ /** Attributes that can change inherited theme inputs without replacing a stylesheet. */
2
+ export declare const THEME_ATTRIBUTES:readonly['class','style','data-lr-theme','data-lr-mode','data-lr-look','data-lr-surface','data-lr-density','data-lr-accent','data-lr-theme-scope','data-theme','data-color-scheme'];
3
+ /** Inherited custom properties follow a distributed node's slot and a shadow root's host. */
4
+ export declare function flattenedThemeParent(element:Element):Element|null;
@@ -0,0 +1 @@
1
+ const THEME_ATTRIBUTES=["class","style","data-lr-theme","data-lr-mode","data-lr-look","data-lr-surface","data-lr-density","data-lr-accent","data-lr-theme-scope","data-theme","data-color-scheme"];function flattenedThemeParent(element){if(element.assignedSlot)return element.assignedSlot;if(element.parentElement)return element.parentElement;const root=element.getRootNode();return root.nodeType===11&&"host"in root?root.host:null}export{THEME_ATTRIBUTES,flattenedThemeParent};
@@ -1 +1 @@
1
- const THEME_HUB_KEY=Symbol.for("@aceshooting/lyra-ui.theme-invalidation.v1"),fallbackHubs=new WeakMap,ELEMENT_NODE=1,DOCUMENT_NODE=9,DOCUMENT_FRAGMENT_NODE=11;function realmFor(root){return(root?root.nodeType===DOCUMENT_NODE?root:root.ownerDocument:typeof document>"u"?void 0:document)?.defaultView}function createHub(realm){return{schemaVersion:1,subscribers:new Set,patches:[],installed:!1,realm}}function hubFor(realm){const scope=realm,existing=scope[THEME_HUB_KEY];if(existing&&typeof existing=="object"&&existing.schemaVersion===1&&existing.subscribers instanceof Set&&Array.isArray(existing.patches)&&existing.realm===realm)return existing;const hub=createHub(realm);try{return Object.defineProperty(scope,THEME_HUB_KEY,{configurable:!1,enumerable:!1,writable:!1,value:hub}),hub}catch{const fallback=fallbackHubs.get(realm);return fallback||(fallbackHubs.set(realm,hub),hub)}}function notifyHub(hub,mutationSubject){for(const subscriber of[...hub.subscribers])subscriber(mutationSubject)}function findPropertyOwner(start,key){let current=start;for(;current;){if(Object.prototype.hasOwnProperty.call(current,key))return current;current=Object.getPrototypeOf(current)}}function patchMethod(hub,target,key,asyncResult=!1){const original=Object.getOwnPropertyDescriptor(target,key);if(!original||typeof original.value!="function")return;const originalMethod=original.value,installedValue=function(...args){const mutationSubject=this,result=Reflect.apply(originalMethod,this,args);return asyncResult&&result&&typeof result.then=="function"?Promise.resolve(result).then(()=>notifyHub(hub,mutationSubject),()=>{}):notifyHub(hub,mutationSubject),result};try{Object.defineProperty(target,key,{...original,value:installedValue}),hub.patches.push({target,key,original,installedValue})}catch{}}function patchAdoptedStyleSheets(hub,prototype){if(!prototype)return;const target=findPropertyOwner(prototype,"adoptedStyleSheets");if(!target)return;const original=Object.getOwnPropertyDescriptor(target,"adoptedStyleSheets");if(!original?.set)return;const originalSetter=original.set,installedSetter=function(value){Reflect.apply(originalSetter,this,[value]),notifyHub(hub,this)};try{Object.defineProperty(target,"adoptedStyleSheets",{...original,set:installedSetter}),hub.patches.push({target,key:"adoptedStyleSheets",original,installedSetter})}catch{}}function patchSetter(hub,prototype,key){if(!prototype)return;const target=findPropertyOwner(prototype,key);if(!target)return;const original=Object.getOwnPropertyDescriptor(target,key);if(!original?.set)return;const originalSetter=original.set,installedSetter=function(value){Reflect.apply(originalSetter,this,[value]),notifyHub(hub,this)};try{Object.defineProperty(target,key,{...original,set:installedSetter}),hub.patches.push({target,key,original,installedSetter})}catch{}}function installRealmInstrumentation(hub){if(hub.installed)return;hub.installed=!0;const sheetPrototype=hub.realm.CSSStyleSheet?.prototype;if(sheetPrototype){for(const method of["insertRule","deleteRule","replaceSync","addRule","removeRule"])patchMethod(hub,sheetPrototype,method);patchMethod(hub,sheetPrototype,"replace",!0),patchSetter(hub,sheetPrototype,"disabled")}const groupingPrototype=hub.realm.CSSGroupingRule?.prototype;groupingPrototype&&(patchMethod(hub,groupingPrototype,"insertRule"),patchMethod(hub,groupingPrototype,"deleteRule"));const declarationPrototype=hub.realm.CSSStyleDeclaration?.prototype;declarationPrototype&&(patchMethod(hub,declarationPrototype,"setProperty"),patchMethod(hub,declarationPrototype,"removeProperty"),patchSetter(hub,declarationPrototype,"cssText"));const mediaListPrototype=hub.realm.MediaList?.prototype;mediaListPrototype&&(patchMethod(hub,mediaListPrototype,"appendMedium"),patchMethod(hub,mediaListPrototype,"deleteMedium"),patchSetter(hub,mediaListPrototype,"mediaText")),patchAdoptedStyleSheets(hub,hub.realm.Document?.prototype),patchAdoptedStyleSheets(hub,hub.realm.ShadowRoot?.prototype)}function uninstallRealmInstrumentation(hub){if(hub.installed){for(const patch of hub.patches.reverse()){const current=Object.getOwnPropertyDescriptor(patch.target,patch.key);if(patch.installedValue?current?.value===patch.installedValue:current?.set===patch.installedSetter)try{Object.defineProperty(patch.target,patch.key,patch.original)}catch{}}hub.patches=[],hub.installed=!1}}function subscribeRealm(realm,subscriber){const hub=hubFor(realm);hub.subscribers.size===0&&installRealmInstrumentation(hub),hub.subscribers.add(subscriber);let active=!0;return()=>{active&&(active=!1,hub.subscribers.delete(subscriber),hub.subscribers.size===0&&uninstallRealmInstrumentation(hub))}}function invalidateLyraTheme(root){const realm=realmFor(root);realm&&notifyHub(hubFor(realm))}function isStyleCarrier(node){return node.nodeType===ELEMENT_NODE&&(node.localName==="style"||node.localName==="link")}function containsStyleCarrier(node){return isStyleCarrier(node)?!0:node.nodeType===ELEMENT_NODE&&!!node.querySelector("style, link")}function flattenedParentElement(element){if(element.assignedSlot)return element.assignedSlot;if(element.parentElement)return element.parentElement;const root=element.getRootNode();return root.nodeType===DOCUMENT_FRAGMENT_NODE&&"host"in root?root.host:null}function isComposedAncestor(candidate,descendant){let current=descendant;const seen=new Set;for(;current;){if(seen.has(current))return!1;if(seen.add(current),current===candidate)return!0;current=flattenedParentElement(current)}return!1}function observationRoots(host){const roots=new Set([host.ownerDocument]);let current=host;const seen=new Set;for(;current&&!seen.has(current);){seen.add(current),current===host&&current.shadowRoot&&roots.add(current.shadowRoot);const root=current.getRootNode();root.nodeType===DOCUMENT_FRAGMENT_NODE&&"host"in root&&roots.add(root),current=flattenedParentElement(current)}return[...roots]}function sheetsForRoot(root){const sheets=new Set;if(root.nodeType===DOCUMENT_NODE)for(const sheet of Array.from(root.styleSheets))sheets.add(sheet);else for(const node of Array.from(root.querySelectorAll("style, link"))){const sheet=node.sheet;sheet&&sheets.add(sheet)}for(const sheet of root.adoptedStyleSheets??[])sheets.add(sheet);return[...sheets]}function collectMediaQueries(rules,output){for(const rule of Array.from(rules)){if("media"in rule){const mediaText=rule.media?.mediaText?.trim();mediaText&&output.add(mediaText)}if("cssRules"in rule)try{collectMediaQueries(rule.cssRules,output)}catch{}}}function isInlineDeclarationOnComposedAncestry(declaration,host){let current=host;const seen=new Set;for(;current;){if(seen.has(current))return!1;if(seen.add(current),"style"in current&&current.style===declaration)return!0;current=flattenedParentElement(current)}return!1}function rulesContainMediaList(rules,target){for(const rule of Array.from(rules)){if("media"in rule&&rule.media===target)return!0;if("cssRules"in rule)try{if(rulesContainMediaList(rule.cssRules,target))return!0}catch{}}return!1}class ThemeWatcher{constructor(host,onChange){this.host=host,this.onChange=onChange,this.mediaQueries=new Map,this.roots=[],this.queued=!1,this.mediaQueriesDirty=!1,this.generation=0,this.onMutations=records=>{let relevant=!1,stylesheet=!1;for(const record of records){if(record.type==="attributes"){const target=record.target;isStyleCarrier(target)?(relevant=!0,stylesheet=!0):isComposedAncestor(target,this.host)&&(relevant=!0);continue}if(record.type==="characterData"){record.target.parentElement?.closest("style")&&(relevant=!0,stylesheet=!0);continue}(isStyleCarrier(record.target)||[...record.addedNodes,...record.removedNodes].some(containsStyleCarrier))&&(relevant=!0,stylesheet=!0)}relevant&&this.queueChange(stylesheet)},this.onStylesheetLoad=event=>{event.target&&"nodeType"in event.target&&isStyleCarrier(event.target)&&event.target.localName==="link"&&this.queueChange(!0)},this.onStylesheetMutation=mutationSubject=>{if(this.queued&&this.mediaQueriesDirty)return;const Declaration=this.realm?.CSSStyleDeclaration;if(Declaration&&mutationSubject instanceof Declaration&&mutationSubject.parentRule===null){!this.queued&&isInlineDeclarationOnComposedAncestry(mutationSubject,this.host)&&this.queueChange(!1);return}mutationSubject!==void 0&&!this.mutationCanAffectHost(mutationSubject)||this.queueChange(!0)},this.onMediaQueryChange=()=>{this.queueChange(!1)},host.addController(this)}hostConnected(){this.teardown(),this.generation+=1;const realm=this.host.ownerDocument.defaultView;if(realm){this.realm=realm,this.roots=observationRoots(this.host),this.unsubscribeRealm=subscribeRealm(realm,this.onStylesheetMutation),this.installObserver();for(const root of this.roots)root.addEventListener("load",this.onStylesheetLoad,!0);this.refreshMediaQueries()}}hostDisconnected(){this.generation+=1,this.teardown()}teardown(){for(const root of this.roots)root.removeEventListener("load",this.onStylesheetLoad,!0);this.unsubscribeRealm?.(),this.unsubscribeRealm=void 0,this.observer?.disconnect(),this.observer=void 0;for(const query of this.mediaQueries.values())query.removeEventListener("change",this.onMediaQueryChange);this.mediaQueries.clear(),this.roots=[],this.realm=void 0,this.queued=!1,this.mediaQueriesDirty=!1}installObserver(){const Observer=this.realm?.MutationObserver;if(Observer){this.observer=new Observer(this.onMutations);for(const root of this.roots){const target=root.nodeType===DOCUMENT_NODE?root.documentElement:root;target&&this.observer.observe(target,{attributes:!0,attributeFilter:["class","style","data-lr-theme","data-theme","data-color-scheme","media","href","rel","disabled"],childList:!0,characterData:!0,subtree:!0})}}}mutationCanAffectHost(subject){const realm=this.realm;if(!realm)return!1;if(realm.Document&&subject instanceof realm.Document||realm.ShadowRoot&&subject instanceof realm.ShadowRoot)return this.roots.includes(subject);const relevantSheets=new Set(this.roots.flatMap(root=>sheetsForRoot(root)));if(realm.CSSStyleDeclaration&&subject instanceof realm.CSSStyleDeclaration){if(isInlineDeclarationOnComposedAncestry(subject,this.host))return!0;const sheet=subject.parentRule?.parentStyleSheet;return!!(sheet&&relevantSheets.has(sheet))}if(realm.CSSStyleSheet&&subject instanceof realm.CSSStyleSheet)return relevantSheets.has(subject);const CSSRuleCtor=realm.CSSRule;if(CSSRuleCtor&&subject instanceof CSSRuleCtor)return!!(subject.parentStyleSheet&&relevantSheets.has(subject.parentStyleSheet));if(realm.MediaList&&subject instanceof realm.MediaList){for(const sheet of relevantSheets){if(sheet.media===subject)return!0;try{if(rulesContainMediaList(sheet.cssRules,subject))return!0}catch{}}return!1}return!0}refreshMediaQueries(){const realm=this.realm;if(!realm?.matchMedia)return;const queries=new Set(["(prefers-color-scheme: dark)","(prefers-contrast: more)","(forced-colors: active)"]);for(const root of this.roots)for(const sheet of sheetsForRoot(root)){const owner=sheet.ownerNode;if(owner?.nodeType===ELEMENT_NODE){const media=owner.getAttribute("media")?.trim();media&&queries.add(media)}try{collectMediaQueries(sheet.cssRules,queries)}catch{}}for(const[text,query]of this.mediaQueries)queries.has(text)||(query.removeEventListener("change",this.onMediaQueryChange),this.mediaQueries.delete(text));for(const text of queries){if(this.mediaQueries.has(text))continue;const query=realm.matchMedia(text);query.addEventListener("change",this.onMediaQueryChange),this.mediaQueries.set(text,query)}}queueChange(refreshMediaQueries){if(this.mediaQueriesDirty||=refreshMediaQueries,this.queued)return;this.queued=!0;const generation=this.generation;queueMicrotask(()=>{generation===this.generation&&(this.queued=!1,this.mediaQueriesDirty&&(this.mediaQueriesDirty=!1,this.refreshMediaQueries()),this.host.isConnected&&this.onChange())})}}export{ThemeWatcher,invalidateLyraTheme};
1
+ import{flattenedThemeParent,THEME_ATTRIBUTES}from"./theme-observation.js";const THEME_HUB_KEY=Symbol.for("@aceshooting/lyra-ui.theme-invalidation.v1"),fallbackHubs=new WeakMap,ELEMENT_NODE=1,DOCUMENT_NODE=9,DOCUMENT_FRAGMENT_NODE=11;function realmFor(root){return(root?root.nodeType===DOCUMENT_NODE?root:root.ownerDocument:typeof document>"u"?void 0:document)?.defaultView}function createHub(realm){return{schemaVersion:1,subscribers:new Set,patches:[],installed:!1,realm}}function hubFor(realm){const scope=realm,existing=scope[THEME_HUB_KEY];if(existing&&typeof existing=="object"&&existing.schemaVersion===1&&existing.subscribers instanceof Set&&Array.isArray(existing.patches)&&existing.realm===realm)return existing;const hub=createHub(realm);try{return Object.defineProperty(scope,THEME_HUB_KEY,{configurable:!1,enumerable:!1,writable:!1,value:hub}),hub}catch{const fallback=fallbackHubs.get(realm);return fallback||(fallbackHubs.set(realm,hub),hub)}}function notifyHub(hub,mutationSubject){for(const subscriber of[...hub.subscribers])subscriber(mutationSubject)}function findPropertyOwner(start,key){let current=start;for(;current;){if(Object.prototype.hasOwnProperty.call(current,key))return current;current=Object.getPrototypeOf(current)}}function patchMethod(hub,target,key,asyncResult=!1){const original=Object.getOwnPropertyDescriptor(target,key);if(!original||typeof original.value!="function")return;const originalMethod=original.value,installedValue=function(...args){const mutationSubject=this,result=Reflect.apply(originalMethod,this,args);return asyncResult&&result&&typeof result.then=="function"?Promise.resolve(result).then(()=>notifyHub(hub,mutationSubject),()=>{}):notifyHub(hub,mutationSubject),result};try{Object.defineProperty(target,key,{...original,value:installedValue}),hub.patches.push({target,key,original,installedValue})}catch{}}function patchAdoptedStyleSheets(hub,prototype){if(!prototype)return;const target=findPropertyOwner(prototype,"adoptedStyleSheets");if(!target)return;const original=Object.getOwnPropertyDescriptor(target,"adoptedStyleSheets");if(!original?.set)return;const originalSetter=original.set,installedSetter=function(value){Reflect.apply(originalSetter,this,[value]),notifyHub(hub,this)};try{Object.defineProperty(target,"adoptedStyleSheets",{...original,set:installedSetter}),hub.patches.push({target,key:"adoptedStyleSheets",original,installedSetter})}catch{}}function patchSetter(hub,prototype,key){if(!prototype)return;const target=findPropertyOwner(prototype,key);if(!target)return;const original=Object.getOwnPropertyDescriptor(target,key);if(!original?.set)return;const originalSetter=original.set,installedSetter=function(value){Reflect.apply(originalSetter,this,[value]),notifyHub(hub,this)};try{Object.defineProperty(target,key,{...original,set:installedSetter}),hub.patches.push({target,key,original,installedSetter})}catch{}}function installRealmInstrumentation(hub){if(hub.installed)return;hub.installed=!0;const sheetPrototype=hub.realm.CSSStyleSheet?.prototype;if(sheetPrototype){for(const method of["insertRule","deleteRule","replaceSync","addRule","removeRule"])patchMethod(hub,sheetPrototype,method);patchMethod(hub,sheetPrototype,"replace",!0),patchSetter(hub,sheetPrototype,"disabled")}const groupingPrototype=hub.realm.CSSGroupingRule?.prototype;groupingPrototype&&(patchMethod(hub,groupingPrototype,"insertRule"),patchMethod(hub,groupingPrototype,"deleteRule"));const declarationPrototype=hub.realm.CSSStyleDeclaration?.prototype;declarationPrototype&&(patchMethod(hub,declarationPrototype,"setProperty"),patchMethod(hub,declarationPrototype,"removeProperty"),patchSetter(hub,declarationPrototype,"cssText"));const mediaListPrototype=hub.realm.MediaList?.prototype;mediaListPrototype&&(patchMethod(hub,mediaListPrototype,"appendMedium"),patchMethod(hub,mediaListPrototype,"deleteMedium"),patchSetter(hub,mediaListPrototype,"mediaText")),patchAdoptedStyleSheets(hub,hub.realm.Document?.prototype),patchAdoptedStyleSheets(hub,hub.realm.ShadowRoot?.prototype)}function uninstallRealmInstrumentation(hub){if(hub.installed){for(const patch of hub.patches.reverse()){const current=Object.getOwnPropertyDescriptor(patch.target,patch.key);if(patch.installedValue?current?.value===patch.installedValue:current?.set===patch.installedSetter)try{Object.defineProperty(patch.target,patch.key,patch.original)}catch{}}hub.patches=[],hub.installed=!1}}function subscribeRealm(realm,subscriber){const hub=hubFor(realm);hub.subscribers.size===0&&installRealmInstrumentation(hub),hub.subscribers.add(subscriber);let active=!0;return()=>{active&&(active=!1,hub.subscribers.delete(subscriber),hub.subscribers.size===0&&uninstallRealmInstrumentation(hub))}}function invalidateLyraTheme(root){const realm=realmFor(root);realm&&notifyHub(hubFor(realm))}function isStyleCarrier(node){return node.nodeType===ELEMENT_NODE&&(node.localName==="style"||node.localName==="link")}function containsStyleCarrier(node){return isStyleCarrier(node)?!0:node.nodeType===ELEMENT_NODE&&!!node.querySelector("style, link")}function isComposedAncestor(candidate,descendant){let current=descendant;const seen=new Set;for(;current;){if(seen.has(current))return!1;if(seen.add(current),current===candidate)return!0;current=flattenedThemeParent(current)}return!1}function observationRoots(host){const roots=new Set([host.ownerDocument]);let current=host;const seen=new Set;for(;current&&!seen.has(current);){seen.add(current),current===host&&current.shadowRoot&&roots.add(current.shadowRoot);const root=current.getRootNode();root.nodeType===DOCUMENT_FRAGMENT_NODE&&"host"in root&&roots.add(root),current=flattenedThemeParent(current)}return[...roots]}function sheetsForRoot(root){const sheets=new Set;if(root.nodeType===DOCUMENT_NODE)for(const sheet of Array.from(root.styleSheets))sheets.add(sheet);else for(const node of Array.from(root.querySelectorAll("style, link"))){const sheet=node.sheet;sheet&&sheets.add(sheet)}for(const sheet of root.adoptedStyleSheets??[])sheets.add(sheet);return[...sheets]}function collectMediaQueries(rules,output){for(const rule of Array.from(rules)){if("media"in rule){const mediaText=rule.media?.mediaText?.trim();mediaText&&output.add(mediaText)}if("cssRules"in rule)try{collectMediaQueries(rule.cssRules,output)}catch{}}}function isInlineDeclarationOnComposedAncestry(declaration,host){let current=host;const seen=new Set;for(;current;){if(seen.has(current))return!1;if(seen.add(current),"style"in current&&current.style===declaration)return!0;current=flattenedThemeParent(current)}return!1}function rulesContainMediaList(rules,target){for(const rule of Array.from(rules)){if("media"in rule&&rule.media===target)return!0;if("cssRules"in rule)try{if(rulesContainMediaList(rule.cssRules,target))return!0}catch{}}return!1}class ThemeWatcher{constructor(host,onChange){this.host=host,this.onChange=onChange,this.mediaQueries=new Map,this.roots=[],this.queued=!1,this.mediaQueriesDirty=!1,this.generation=0,this.onMutations=records=>{let relevant=!1,stylesheet=!1;for(const record of records){if(record.type==="attributes"){const target=record.target;isStyleCarrier(target)?(relevant=!0,stylesheet=!0):isComposedAncestor(target,this.host)&&(relevant=!0);continue}if(record.type==="characterData"){record.target.parentElement?.closest("style")&&(relevant=!0,stylesheet=!0);continue}(isStyleCarrier(record.target)||[...record.addedNodes,...record.removedNodes].some(containsStyleCarrier))&&(relevant=!0,stylesheet=!0)}relevant&&this.queueChange(stylesheet)},this.onStylesheetLoad=event=>{event.target&&"nodeType"in event.target&&isStyleCarrier(event.target)&&event.target.localName==="link"&&this.queueChange(!0)},this.onStylesheetMutation=mutationSubject=>{if(this.queued&&this.mediaQueriesDirty)return;const Declaration=this.realm?.CSSStyleDeclaration;if(Declaration&&mutationSubject instanceof Declaration&&mutationSubject.parentRule===null){!this.queued&&isInlineDeclarationOnComposedAncestry(mutationSubject,this.host)&&this.queueChange(!1);return}mutationSubject!==void 0&&!this.mutationCanAffectHost(mutationSubject)||this.queueChange(!0)},this.onMediaQueryChange=()=>{this.queueChange(!1)},host.addController(this)}hostConnected(){this.teardown(),this.generation+=1;const realm=this.host.ownerDocument.defaultView;if(realm){this.realm=realm,this.roots=observationRoots(this.host),this.unsubscribeRealm=subscribeRealm(realm,this.onStylesheetMutation),this.installObserver();for(const root of this.roots)root.addEventListener("load",this.onStylesheetLoad,!0);this.refreshMediaQueries()}}hostDisconnected(){this.generation+=1,this.teardown()}teardown(){for(const root of this.roots)root.removeEventListener("load",this.onStylesheetLoad,!0);this.unsubscribeRealm?.(),this.unsubscribeRealm=void 0,this.observer?.disconnect(),this.observer=void 0;for(const query of this.mediaQueries.values())query.removeEventListener("change",this.onMediaQueryChange);this.mediaQueries.clear(),this.roots=[],this.realm=void 0,this.queued=!1,this.mediaQueriesDirty=!1}installObserver(){const Observer=this.realm?.MutationObserver;if(Observer){this.observer=new Observer(this.onMutations);for(const root of this.roots){const target=root.nodeType===DOCUMENT_NODE?root.documentElement:root;target&&this.observer.observe(target,{attributes:!0,attributeFilter:[...THEME_ATTRIBUTES,"media","href","rel","disabled"],childList:!0,characterData:!0,subtree:!0})}}}mutationCanAffectHost(subject){const realm=this.realm;if(!realm)return!1;if(realm.Document&&subject instanceof realm.Document||realm.ShadowRoot&&subject instanceof realm.ShadowRoot)return this.roots.includes(subject);const relevantSheets=new Set(this.roots.flatMap(root=>sheetsForRoot(root)));if(realm.CSSStyleDeclaration&&subject instanceof realm.CSSStyleDeclaration){if(isInlineDeclarationOnComposedAncestry(subject,this.host))return!0;const sheet=subject.parentRule?.parentStyleSheet;return!!(sheet&&relevantSheets.has(sheet))}if(realm.CSSStyleSheet&&subject instanceof realm.CSSStyleSheet)return relevantSheets.has(subject);const CSSRuleCtor=realm.CSSRule;if(CSSRuleCtor&&subject instanceof CSSRuleCtor)return!!(subject.parentStyleSheet&&relevantSheets.has(subject.parentStyleSheet));if(realm.MediaList&&subject instanceof realm.MediaList){for(const sheet of relevantSheets){if(sheet.media===subject)return!0;try{if(rulesContainMediaList(sheet.cssRules,subject))return!0}catch{}}return!1}return!0}refreshMediaQueries(){const realm=this.realm;if(!realm?.matchMedia)return;const queries=new Set(["(prefers-color-scheme: dark)","(prefers-contrast: more)","(forced-colors: active)"]);for(const root of this.roots)for(const sheet of sheetsForRoot(root)){const owner=sheet.ownerNode;if(owner?.nodeType===ELEMENT_NODE){const media=owner.getAttribute("media")?.trim();media&&queries.add(media)}try{collectMediaQueries(sheet.cssRules,queries)}catch{}}for(const[text,query]of this.mediaQueries)queries.has(text)||(query.removeEventListener("change",this.onMediaQueryChange),this.mediaQueries.delete(text));for(const text of queries){if(this.mediaQueries.has(text))continue;const query=realm.matchMedia(text);query.addEventListener("change",this.onMediaQueryChange),this.mediaQueries.set(text,query)}}queueChange(refreshMediaQueries){if(this.mediaQueriesDirty||=refreshMediaQueries,this.queued)return;this.queued=!0;const generation=this.generation;queueMicrotask(()=>{generation===this.generation&&(this.queued=!1,this.mediaQueriesDirty&&(this.mediaQueriesDirty=!1,this.refreshMediaQueries()),this.host.isConnected&&this.onChange())})}}export{ThemeWatcher,invalidateLyraTheme};
@@ -5,5 +5,10 @@
5
5
  * the component graph exposed by the package root. Locale tags share one canonical public BCP-47
6
6
  * spelling across registration, active selection and enumeration (`PT_BR` becomes `pt-BR`), while
7
7
  * catalogs are retained as bounded immutable snapshots rather than caller-owned objects.
8
+ *
9
+ * It also carries the active-locale subscription (`subscribeLyraLocale()`), the opt-in `lang`/`dir`
10
+ * bridge (`bridgeLyraLocale()`) and the scoped resolver (`resolveLyraScopedString()`). These are the
11
+ * very same bindings the deprecated `@aceshooting/lyra-ui/utilities/localization.js` entry exports,
12
+ * so moving an import here is a specifier rename and nothing else.
8
13
  */
9
- export{getLyraLocale,getLyraLocaleDirection,getRegisteredLyraLocaleKeys,getRegisteredLyraLocales,registerLyraLocale,resolveLyraDirection,resolveLyraLocale,resolveLyraString,setLyraLocale,subscribeLyraLocaleRegistry,LYRA_DEFAULT_STRINGS,}from'./internal/localization.js';export type{LyraLocaleDirection,LyraLocaleMeta,LyraLocaleStrings,LyraMessage,LyraMessageKey,LyraPluralCategory,LyraPluralMessage,}from'./internal/localization.js';
14
+ export{getLyraLocale,getLyraLocaleDirection,getRegisteredLyraLocaleKeys,getRegisteredLyraLocales,registerLyraLocale,resolveLyraDirection,resolveLyraLocale,resolveLyraString,setLyraLocale,subscribeLyraLocaleRegistry,LYRA_DEFAULT_STRINGS,}from'./internal/localization.js';export type{LyraLocaleDirection,LyraLocaleMeta,LyraLocaleStrings,LyraMessage,LyraMessageKey,LyraPluralCategory,LyraPluralMessage,}from'./internal/localization.js';export{subscribeLyraLocale}from'./internal/localization-runtime.js';export{bridgeLyraLocale,resolveLyraScopedString}from'./utilities/localization.js';export type{LyraLocaleBridgeCleanup,LyraLocaleBridgeOptions,}from'./utilities/localization.js';
@@ -1 +1 @@
1
- import{getLyraLocale,getLyraLocaleDirection,getRegisteredLyraLocaleKeys,getRegisteredLyraLocales,registerLyraLocale,resolveLyraDirection,resolveLyraLocale,resolveLyraString,setLyraLocale,subscribeLyraLocaleRegistry,LYRA_DEFAULT_STRINGS}from"./internal/localization.js";export{LYRA_DEFAULT_STRINGS,getLyraLocale,getLyraLocaleDirection,getRegisteredLyraLocaleKeys,getRegisteredLyraLocales,registerLyraLocale,resolveLyraDirection,resolveLyraLocale,resolveLyraString,setLyraLocale,subscribeLyraLocaleRegistry};
1
+ import{getLyraLocale,getLyraLocaleDirection,getRegisteredLyraLocaleKeys,getRegisteredLyraLocales,registerLyraLocale,resolveLyraDirection,resolveLyraLocale,resolveLyraString,setLyraLocale,subscribeLyraLocaleRegistry,LYRA_DEFAULT_STRINGS}from"./internal/localization.js";import{subscribeLyraLocale}from"./internal/localization-runtime.js";import{bridgeLyraLocale,resolveLyraScopedString}from"./utilities/localization.js";export{LYRA_DEFAULT_STRINGS,bridgeLyraLocale,getLyraLocale,getLyraLocaleDirection,getRegisteredLyraLocaleKeys,getRegisteredLyraLocales,registerLyraLocale,resolveLyraDirection,resolveLyraLocale,resolveLyraScopedString,resolveLyraString,setLyraLocale,subscribeLyraLocale,subscribeLyraLocaleRegistry};