@aceshooting/lyra-ui 29.0.2 → 29.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 (521) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +19 -26
  3. package/design-tokens.json +1 -1
  4. package/dist/cli/migrate-wa.mjs +2 -0
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +5 -3
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +4 -3
  7. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +1 -1
  8. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +21 -5
  9. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +14 -11
  10. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +1 -1
  11. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  12. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +34 -7
  13. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +25 -11
  14. package/dist/components/agent-tools/eval-result/eval-result-source.js +1 -0
  15. package/dist/components/agent-tools/eval-result/eval-result.class.d.ts +31 -11
  16. package/dist/components/agent-tools/eval-result/eval-result.class.js +29 -15
  17. package/dist/components/agent-tools/eval-result/eval-result.styles.js +1 -1
  18. package/dist/components/agent-tools/eval-result/eval-run-result.d.ts +10 -0
  19. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +26 -5
  20. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +16 -6
  21. package/dist/components/agent-tools/span-waterfall/span-waterfall.d.ts +1 -1
  22. package/dist/components/agent-tools/span-waterfall/span-waterfall.js +1 -1
  23. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -1
  24. package/dist/components/agent-tools/task-list/task-list.class.d.ts +29 -6
  25. package/dist/components/agent-tools/task-list/task-list.class.js +13 -7
  26. package/dist/components/agent-tools/task-list/task-list.d.ts +1 -1
  27. package/dist/components/agent-tools/task-list/task-list.js +1 -1
  28. package/dist/components/agent-tools/task-list/task-list.styles.js +1 -1
  29. package/dist/components/agent-tools/terminal/terminal.class.d.ts +9 -5
  30. package/dist/components/agent-tools/terminal/terminal.class.js +8 -8
  31. package/dist/components/agent-tools/test-results/test-results.class.d.ts +16 -4
  32. package/dist/components/agent-tools/test-results/test-results.class.js +15 -6
  33. package/dist/components/agent-tools/test-results/test-results.d.ts +1 -0
  34. package/dist/components/agent-tools/test-results/test-results.js +1 -1
  35. package/dist/components/agent-tools/test-results/test-results.styles.js +1 -1
  36. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +7 -4
  37. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +2 -1
  38. package/dist/components/agent-tools/trace-tree/span-projection.js +1 -0
  39. package/dist/components/agent-tools/trace-tree/span-shared.d.ts +29 -0
  40. package/dist/components/agent-tools/trace-tree/span-shared.js +1 -0
  41. package/dist/components/agent-tools/trace-tree/span.d.ts +5 -35
  42. package/dist/components/agent-tools/trace-tree/span.js +1 -1
  43. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts +27 -5
  44. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +19 -9
  45. package/dist/components/agent-tools/trace-tree/trace-tree.d.ts +1 -1
  46. package/dist/components/agent-tools/trace-tree/trace-tree.js +1 -1
  47. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -1
  48. package/dist/components/charts/chart/bar-chart.class.d.ts +5 -1
  49. package/dist/components/charts/chart/box-plot.class.d.ts +2 -2
  50. package/dist/components/charts/chart/box-plot.class.js +3 -3
  51. package/dist/components/charts/chart/bubble-chart.class.d.ts +5 -1
  52. package/dist/components/charts/chart/chart-prepared-data.d.ts +9 -0
  53. package/dist/components/charts/chart/chart-prepared-data.js +1 -0
  54. package/dist/components/charts/chart/chart-spatial-data.js +2 -0
  55. package/dist/components/charts/chart/chart-sync.js +1 -1
  56. package/dist/components/charts/chart/chart-table-sampling.js +1 -1
  57. package/dist/components/charts/chart/chart.class.d.ts +56 -6
  58. package/dist/components/charts/chart/chart.class.js +18 -8
  59. package/dist/components/charts/chart/chart.styles.js +1 -1
  60. package/dist/components/charts/chart/doughnut-chart.class.d.ts +5 -1
  61. package/dist/components/charts/chart/histogram-buckets.d.ts +1 -1
  62. package/dist/components/charts/chart/histogram-buckets.js +1 -1
  63. package/dist/components/charts/chart/histogram.class.d.ts +19 -4
  64. package/dist/components/charts/chart/histogram.class.js +1 -1
  65. package/dist/components/charts/chart/line-chart.class.d.ts +5 -1
  66. package/dist/components/charts/chart/lite-chart.class.d.ts +51 -11
  67. package/dist/components/charts/chart/lite-chart.class.js +33 -27
  68. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  69. package/dist/components/charts/chart/pie-chart.class.d.ts +5 -1
  70. package/dist/components/charts/chart/polar-area-chart.class.d.ts +5 -1
  71. package/dist/components/charts/chart/radar-chart.class.d.ts +5 -1
  72. package/dist/components/charts/chart/scatter-chart.class.d.ts +5 -1
  73. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +6 -3
  74. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +6 -5
  75. package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +1 -1
  76. package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +8 -0
  77. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  78. package/dist/components/conversation/code-block/code-block-base.class.d.ts +5 -3
  79. package/dist/components/conversation/code-block/code-block-base.class.js +1 -1
  80. package/dist/components/conversation/code-block/code-block-core.class.d.ts +4 -1
  81. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  82. package/dist/components/conversation/code-block/code-block-shared.d.ts +6 -4
  83. package/dist/components/conversation/code-block/code-block-shared.js +3 -2
  84. package/dist/components/conversation/code-block/code-block.class.d.ts +11 -4
  85. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  86. package/dist/components/conversation/code-block/code-block.d.ts +1 -1
  87. package/dist/components/conversation/code-block/code-block.styles.js +1 -1
  88. package/dist/components/conversation/code-block/shiki-types.d.ts +2 -0
  89. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  90. package/dist/components/conversation/markdown/markdown-base.class.d.ts +6 -4
  91. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  92. package/dist/components/conversation/markdown/markdown-code-header.d.ts +2 -2
  93. package/dist/components/conversation/markdown/markdown-code-header.js +1 -1
  94. package/dist/components/conversation/markdown/markdown-core.class.d.ts +8 -3
  95. package/dist/components/conversation/markdown/markdown-progressive.js +2 -2
  96. package/dist/components/conversation/markdown/markdown-shared.d.ts +5 -10
  97. package/dist/components/conversation/markdown/markdown-shared.js +5 -5
  98. package/dist/components/conversation/markdown/markdown-streaming-tail.js +1 -1
  99. package/dist/components/conversation/markdown/markdown.class.d.ts +17 -10
  100. package/dist/components/conversation/markdown/markdown.class.js +1 -1
  101. package/dist/components/conversation/markdown/markdown.styles.js +1 -1
  102. package/dist/components/conversation/model-select/model-select.class.d.ts +4 -3
  103. package/dist/components/conversation/model-select/model-select.class.js +3 -2
  104. package/dist/components/conversation/model-select/model-select.styles.js +1 -1
  105. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts +2 -1
  106. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +2 -1
  107. package/dist/components/conversation/model-settings-panel/model-settings-panel.styles.js +1 -1
  108. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +3 -2
  109. package/dist/components/conversation/prompt-input/prompt-input.class.js +2 -1
  110. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
  111. package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +10 -2
  112. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +15 -6
  113. package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -1
  114. package/dist/components/conversation/realtime-session/realtime-session.class.d.ts +3 -1
  115. package/dist/components/conversation/realtime-session/realtime-session.class.js +2 -1
  116. package/dist/components/conversation/realtime-session/realtime-session.styles.js +1 -1
  117. package/dist/components/conversation/streaming-text/markdown-detection.d.ts +2 -0
  118. package/dist/components/conversation/streaming-text/markdown-detection.js +4 -1
  119. package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +6 -2
  120. package/dist/components/conversation/streaming-text/streaming-text-base.class.js +3 -3
  121. package/dist/components/conversation/streaming-text/streaming-text-core.class.js +1 -1
  122. package/dist/components/conversation/streaming-text/streaming-text.class.js +1 -0
  123. package/dist/components/conversation/thread-list/thread-list.class.d.ts +34 -4
  124. package/dist/components/conversation/thread-list/thread-list.class.js +22 -15
  125. package/dist/components/conversation/thread-list/thread-list.d.ts +1 -1
  126. package/dist/components/conversation/thread-list/thread-list.js +1 -1
  127. package/dist/components/conversation/thread-list/thread-list.styles.js +1 -1
  128. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +6 -2
  129. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +3 -2
  130. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +1 -1
  131. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +3 -2
  132. package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -2
  133. package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
  134. package/dist/components/data/calendar/calendar.class.d.ts +5 -2
  135. package/dist/components/data/calendar/calendar.class.js +1 -1
  136. package/dist/components/data/data-grid/data-grid-processing.js +2 -2
  137. package/dist/components/data/data-grid/data-grid.class.d.ts +22 -8
  138. package/dist/components/data/data-grid/data-grid.class.js +20 -19
  139. package/dist/components/data/data-grid/data-grid.styles.js +1 -1
  140. package/dist/components/data/document-library/document-library.class.d.ts +31 -4
  141. package/dist/components/data/document-library/document-library.class.js +25 -12
  142. package/dist/components/data/document-library/document-library.styles.js +1 -1
  143. package/dist/components/data/file-tree/file-tree.class.d.ts +30 -6
  144. package/dist/components/data/file-tree/file-tree.class.js +4 -3
  145. package/dist/components/data/file-tree/file-tree.d.ts +1 -0
  146. package/dist/components/data/file-tree/file-tree.js +1 -1
  147. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +31 -6
  148. package/dist/components/data/flow-canvas/flow-canvas.class.js +40 -19
  149. package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
  150. package/dist/components/data/flow-canvas/flow-model.js +1 -1
  151. package/dist/components/data/flow-canvas/flow-source.js +1 -0
  152. package/dist/components/data/flow-canvas/flow-types.d.ts +4 -2
  153. package/dist/components/data/flow-canvas/flow-viewport-index.js +1 -0
  154. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +9 -3
  155. package/dist/components/data/flow-minimap/flow-minimap.class.js +11 -2
  156. package/dist/components/data/flow-minimap/flow-minimap.styles.js +1 -1
  157. package/dist/components/data/funnel/funnel.class.d.ts +7 -3
  158. package/dist/components/data/funnel/funnel.class.js +2 -2
  159. package/dist/components/data/heatmap/calendar-grid.d.ts +1 -1
  160. package/dist/components/data/heatmap/calendar-grid.js +1 -1
  161. package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -1
  162. package/dist/components/data/heatmap/heatmap-limits.d.ts +1 -1
  163. package/dist/components/data/heatmap/heatmap-matrix-source-controller.js +1 -0
  164. package/dist/components/data/heatmap/heatmap-matrix-source.d.ts +5 -0
  165. package/dist/components/data/heatmap/heatmap-matrix-source.js +1 -0
  166. package/dist/components/data/heatmap/heatmap-scale.d.ts +0 -16
  167. package/dist/components/data/heatmap/heatmap-scale.js +1 -1
  168. package/dist/components/data/heatmap/heatmap.class.d.ts +40 -11
  169. package/dist/components/data/heatmap/heatmap.class.js +26 -6
  170. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  171. package/dist/components/data/pagination/pagination.class.js +1 -1
  172. package/dist/components/data/sequence-strip/sequence-strip-item.d.ts +17 -0
  173. package/dist/components/data/sequence-strip/sequence-strip-source-controller.js +1 -0
  174. package/dist/components/data/sequence-strip/sequence-strip-source.d.ts +5 -0
  175. package/dist/components/data/sequence-strip/sequence-strip-source.js +1 -0
  176. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +24 -19
  177. package/dist/components/data/sequence-strip/sequence-strip.class.js +23 -4
  178. package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
  179. package/dist/components/data/sparkline/sparkline.class.d.ts +17 -4
  180. package/dist/components/data/sparkline/sparkline.class.js +3 -3
  181. package/dist/components/data/sparkline/sparkline.styles.js +1 -1
  182. package/dist/components/data/table/table.class.d.ts +14 -10
  183. package/dist/components/data/table/table.class.js +17 -16
  184. package/dist/components/data/timeline/timeline.class.d.ts +5 -2
  185. package/dist/components/data/timeline/timeline.class.js +1 -1
  186. package/dist/components/data/tree/tree-item.class.js +1 -1
  187. package/dist/components/data/tree/tree-owner-controller.js +1 -1
  188. package/dist/components/data/tree/tree.class.d.ts +28 -6
  189. package/dist/components/data/tree/tree.class.js +3 -3
  190. package/dist/components/data/tree/tree.d.ts +1 -0
  191. package/dist/components/data/tree/tree.js +1 -1
  192. package/dist/components/data/word-cloud/word-cloud.class.d.ts +17 -7
  193. package/dist/components/data/word-cloud/word-cloud.class.js +6 -4
  194. package/dist/components/data/word-cloud/word-cloud.styles.js +1 -1
  195. package/dist/components/forms/catalog-picker-base.d.ts +1 -1
  196. package/dist/components/forms/catalog-picker-base.js +6 -6
  197. package/dist/components/forms/catalog-picker-base.styles.js +1 -1
  198. package/dist/components/forms/combobox/combobox.class.d.ts +7 -3
  199. package/dist/components/forms/combobox/combobox.class.js +1 -1
  200. package/dist/components/forms/combobox/option.class.d.ts +4 -2
  201. package/dist/components/forms/combobox/option.class.js +2 -2
  202. package/dist/components/forms/country-picker/country-picker.class.d.ts +3 -1
  203. package/dist/components/forms/country-picker/country-picker.class.js +1 -1
  204. package/dist/components/forms/currency-picker/currency-picker.class.d.ts +2 -0
  205. package/dist/components/forms/currency-picker/currency-picker.class.js +1 -1
  206. package/dist/components/forms/currency-picker/currency-presentation.js +1 -1
  207. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +6 -2
  208. package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -2
  209. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +1 -1
  210. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +8 -2
  211. package/dist/components/forms/locale-picker/locale-picker.class.js +5 -4
  212. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  213. package/dist/components/forms/select/select.class.d.ts +11 -3
  214. package/dist/components/forms/select/select.class.js +4 -4
  215. package/dist/components/forms/time-zone-picker/time-zone-picker.class.d.ts +2 -0
  216. package/dist/components/forms/time-zone-picker/time-zone-picker.class.js +1 -1
  217. package/dist/components/forms/token-input/token-input.class.d.ts +6 -1
  218. package/dist/components/forms/token-input/token-input.class.js +15 -13
  219. package/dist/components/forms/unit-picker/unit-picker.class.d.ts +2 -0
  220. package/dist/components/forms/unit-picker/unit-picker.class.js +1 -1
  221. package/dist/components/layout/app-rail/app-rail.class.d.ts +1 -1
  222. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  223. package/dist/components/layout/command-palette/command-palette.class.d.ts +5 -2
  224. package/dist/components/layout/command-palette/command-palette.class.js +2 -1
  225. package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
  226. package/dist/components/layout/menu/menu-item.class.d.ts +2 -2
  227. package/dist/components/layout/menu/menu-item.class.js +2 -2
  228. package/dist/components/layout/menu/menu.class.d.ts +1 -1
  229. package/dist/components/layout/menu/menu.class.js +1 -1
  230. package/dist/components/layout/menubar/menubar.class.d.ts +1 -1
  231. package/dist/components/layout/menubar/menubar.class.js +1 -1
  232. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +2 -2
  233. package/dist/components/layout/reorder-list/reorder-item.class.js +2 -2
  234. package/dist/components/layout/reorder-list/reorder-list.class.d.ts +1 -1
  235. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  236. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +13 -9
  237. package/dist/components/layout/virtual-list/virtual-list.class.js +21 -17
  238. package/dist/components/media/av-player/av-cue-index.js +1 -0
  239. package/dist/components/media/av-player/av-cue-source.d.ts +13 -0
  240. package/dist/components/media/av-player/av-cue-source.js +1 -0
  241. package/dist/components/media/av-player/av-metadata.d.ts +2 -2
  242. package/dist/components/media/av-player/av-metadata.js +1 -1
  243. package/dist/components/media/av-player/av-player-cue-source-controller.js +1 -0
  244. package/dist/components/media/av-player/av-player.class.d.ts +34 -12
  245. package/dist/components/media/av-player/av-player.class.js +15 -10
  246. package/dist/components/media/flag/flag.class.js +1 -1
  247. package/dist/components/media/flag/language-map.js +1 -1
  248. package/dist/components/media/lightbox/lightbox-source.js +1 -0
  249. package/dist/components/media/lightbox/lightbox-types.d.ts +15 -0
  250. package/dist/components/media/lightbox/lightbox.class.d.ts +22 -21
  251. package/dist/components/media/lightbox/lightbox.class.js +6 -4
  252. package/dist/components/media/lightbox/lightbox.styles.js +1 -1
  253. package/dist/components/media/map/map-geojson-diff.d.ts +6 -6
  254. package/dist/components/media/map/map-geojson-diff.js +1 -1
  255. package/dist/components/media/map/map-loader.d.ts +5 -1
  256. package/dist/components/media/map/map.class.d.ts +24 -6
  257. package/dist/components/media/map/map.class.js +2 -2
  258. package/dist/components/media/map/map.styles.js +1 -1
  259. package/dist/components/media/video-playlist/video-playlist.class.d.ts +2 -1
  260. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  261. package/dist/components/overlays/chip/chip.class.d.ts +1 -1
  262. package/dist/components/overlays/chip/chip.class.js +1 -1
  263. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +30 -8
  264. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +22 -8
  265. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -1
  266. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  267. package/dist/components/retrieval/graph/graph-source-composition.js +1 -0
  268. package/dist/components/retrieval/graph/graph-source-controller.js +1 -0
  269. package/dist/components/retrieval/graph/graph-spatial-controller.js +2 -2
  270. package/dist/components/retrieval/graph/graph-spatial-model.js +1 -0
  271. package/dist/components/retrieval/graph/graph-spatial.js +1 -1
  272. package/dist/components/retrieval/graph/graph.class.d.ts +31 -6
  273. package/dist/components/retrieval/graph/graph.class.js +26 -5
  274. package/dist/components/retrieval/graph/graph.d.ts +1 -1
  275. package/dist/components/retrieval/graph/graph.js +1 -1
  276. package/dist/components/retrieval/graph/graph.styles.js +1 -1
  277. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +33 -4
  278. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +27 -17
  279. package/dist/components/retrieval/ingestion-queue/ingestion-queue.d.ts +1 -1
  280. package/dist/components/retrieval/ingestion-queue/ingestion-queue.js +1 -1
  281. package/dist/components/retrieval/ingestion-queue/ingestion-queue.styles.js +1 -1
  282. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +27 -4
  283. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +29 -14
  284. package/dist/components/retrieval/knowledge-base/knowledge-base.styles.js +1 -1
  285. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +17 -3
  286. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +15 -10
  287. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +1 -1
  288. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +24 -5
  289. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +17 -10
  290. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.d.ts +1 -1
  291. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.js +1 -1
  292. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
  293. package/dist/components/retrieval/mind-map/mind-map-layout.js +1 -1
  294. package/dist/components/retrieval/mind-map/mind-map-model.js +1 -0
  295. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +27 -4
  296. package/dist/components/retrieval/mind-map/mind-map.class.js +11 -7
  297. package/dist/components/retrieval/mind-map/mind-map.d.ts +1 -0
  298. package/dist/components/retrieval/mind-map/mind-map.js +1 -1
  299. package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
  300. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +24 -2
  301. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +17 -3
  302. package/dist/components/retrieval/neighbor-list/neighbor-list.d.ts +1 -1
  303. package/dist/components/retrieval/neighbor-list/neighbor-list.js +1 -1
  304. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +1 -1
  305. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +8 -4
  306. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +11 -7
  307. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.styles.js +1 -1
  308. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.d.ts +12 -6
  309. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +30 -17
  310. package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -1
  311. package/dist/components/retrieval/retrieval-results/retrieval-results-model.js +1 -0
  312. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +46 -5
  313. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +31 -9
  314. package/dist/components/retrieval/retrieval-results/retrieval-results.d.ts +1 -1
  315. package/dist/components/retrieval/retrieval-results/retrieval-results.js +1 -1
  316. package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +1 -1
  317. package/dist/components/utility/diff-view/diff-view.class.d.ts +16 -8
  318. package/dist/components/utility/diff-view/diff-view.class.js +3 -2
  319. package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
  320. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +31 -3
  321. package/dist/components/utility/json-viewer/json-viewer.class.js +13 -4
  322. package/dist/components/utility/json-viewer/json-viewer.d.ts +1 -0
  323. package/dist/components/utility/json-viewer/json-viewer.js +1 -1
  324. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  325. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +6 -4
  326. package/dist/components/utility/mention-popover/mention-popover.class.js +6 -5
  327. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +34 -7
  328. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +9 -7
  329. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +28 -4
  330. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +12 -11
  331. package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +3 -1
  332. package/dist/components/viewers/geojson-view/geojson-viewer.class.js +17 -16
  333. package/dist/components/viewers/geojson-view/geojson-viewer.d.ts +1 -1
  334. package/dist/components/viewers/geojson-view/geojson-viewer.js +1 -1
  335. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +31 -5
  336. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +11 -8
  337. package/dist/components/viewers/table-viewer-shared.js +19 -3
  338. package/dist/components/viewers/viewer-search-limits.js +1 -1
  339. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +35 -3
  340. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +20 -5
  341. package/dist/components/viewers/xml-viewer/xml-viewer.d.ts +1 -1
  342. package/dist/components/viewers/xml-viewer/xml-viewer.js +1 -1
  343. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
  344. package/dist/countries.js +1 -1
  345. package/dist/data-sources.d.ts +34 -0
  346. package/dist/data-sources.js +1 -0
  347. package/dist/events.d.ts +51 -7
  348. package/dist/framework-types.d.ts +1 -1
  349. package/dist/internal/accessibility-visibility.d.ts +4 -2
  350. package/dist/internal/accessibility-visibility.js +1 -1
  351. package/dist/internal/accessible-text-controller.js +1 -1
  352. package/dist/internal/anchor-target.js +2 -2
  353. package/dist/internal/catalog-picker.d.ts +1 -7
  354. package/dist/internal/catalog-picker.js +1 -1
  355. package/dist/internal/collection-snapshot.js +1 -1
  356. package/dist/internal/default-strings/agent-tools.generated.js +1 -1
  357. package/dist/internal/default-strings/charts.generated.js +1 -1
  358. package/dist/internal/default-strings/conversation.generated.js +1 -1
  359. package/dist/internal/default-strings/data.generated.js +1 -1
  360. package/dist/internal/default-strings/forms.generated.js +1 -1
  361. package/dist/internal/default-strings/layout.generated.js +1 -1
  362. package/dist/internal/default-strings/media.generated.js +1 -1
  363. package/dist/internal/default-strings/retrieval.generated.js +1 -1
  364. package/dist/internal/default-strings/shared.generated.js +1 -1
  365. package/dist/internal/default-strings/utility.generated.js +1 -1
  366. package/dist/internal/delimited-data.js +1 -1
  367. package/dist/internal/fixed-containing-block.js +1 -1
  368. package/dist/internal/flow-scene-envelope.js +1 -0
  369. package/dist/internal/graph-scene-controller.js +1 -0
  370. package/dist/internal/hierarchy-source-controller.js +1 -0
  371. package/dist/internal/hierarchy-source-view.js +29 -0
  372. package/dist/internal/hierarchy-source-view.styles.js +1 -0
  373. package/dist/internal/inherited-attribute-hub.d.ts +6 -0
  374. package/dist/internal/inherited-attribute-hub.js +1 -1
  375. package/dist/internal/intl-cache.js +1 -1
  376. package/dist/internal/keyed-index.js +1 -0
  377. package/dist/internal/localization-types.d.ts +1 -1
  378. package/dist/internal/localization.js +2 -2
  379. package/dist/internal/lyra-element.d.ts +2 -2
  380. package/dist/internal/lyra-element.js +3 -2
  381. package/dist/internal/native-modal-context.js +1 -1
  382. package/dist/internal/option-selection.js +1 -1
  383. package/dist/internal/package-metadata.js +1 -1
  384. package/dist/internal/positioner.js +1 -1
  385. package/dist/internal/resource-loader.d.ts +2 -0
  386. package/dist/internal/resource-loader.js +1 -1
  387. package/dist/internal/scoped-definitions.generated.js +1 -1
  388. package/dist/internal/search-haystack.js +1 -0
  389. package/dist/internal/selection-catalog.d.ts +5 -0
  390. package/dist/internal/selection-catalog.js +1 -1
  391. package/dist/internal/shiki-language-sources.js +1 -0
  392. package/dist/internal/source-page-controller.js +1 -0
  393. package/dist/internal/source-page-scope.js +1 -0
  394. package/dist/internal/source-request-controller.js +1 -0
  395. package/dist/internal/source-window-controller.js +1 -0
  396. package/dist/internal/spatial-source-controller.js +1 -0
  397. package/dist/internal/text-quote.d.ts +2 -6
  398. package/dist/internal/text-quote.js +1 -1
  399. package/dist/internal/theme-watcher.js +1 -1
  400. package/dist/internal/virtual-list-composition.js +1 -0
  401. package/dist/lyra.d.ts +1 -1
  402. package/dist/lyra.js +1 -1
  403. package/dist/testing/interaction-drivers.js +1 -1
  404. package/dist/testing/lyra-tag-event-map.js +1 -1
  405. package/dist/units.js +1 -1
  406. package/dist/utilities/data-preparation.d.ts +56 -0
  407. package/dist/utilities/data-preparation.js +1 -0
  408. package/dist/utilities/data-spatial.d.ts +26 -0
  409. package/dist/utilities/data-spatial.js +1 -0
  410. package/dist/utilities/index.d.ts +1 -1
  411. package/dist/utilities/index.js +1 -1
  412. package/llms/components/lr-activity-feed.md +7 -2
  413. package/llms/components/lr-agent-trace.md +49 -9
  414. package/llms/components/lr-agent-workspace.md +15 -8
  415. package/llms/components/lr-av-player.md +180 -10
  416. package/llms/components/lr-bar-chart.md +1 -1
  417. package/llms/components/lr-box-plot.md +8 -0
  418. package/llms/components/lr-bubble-chart.md +1 -1
  419. package/llms/components/lr-calendar.md +26 -3
  420. package/llms/components/lr-chart.md +310 -23
  421. package/llms/components/lr-chat-viewport.md +6 -0
  422. package/llms/components/lr-code-block-core.md +12 -7
  423. package/llms/components/lr-code-block.md +23 -9
  424. package/llms/components/lr-combobox.md +27 -15
  425. package/llms/components/lr-command-palette.md +16 -3
  426. package/llms/components/lr-country-picker.md +23 -6
  427. package/llms/components/lr-csv-viewer.md +95 -12
  428. package/llms/components/lr-currency-picker.md +23 -3
  429. package/llms/components/lr-data-grid.md +24 -6
  430. package/llms/components/lr-dataset-viewer.md +92 -11
  431. package/llms/components/lr-dialog.md +1 -1
  432. package/llms/components/lr-diff-view.md +19 -6
  433. package/llms/components/lr-document-library.md +60 -5
  434. package/llms/components/lr-doughnut-chart.md +1 -1
  435. package/llms/components/lr-embedding-explorer.md +89 -9
  436. package/llms/components/lr-emoji-picker.md +7 -2
  437. package/llms/components/lr-eval-dataset.md +56 -7
  438. package/llms/components/lr-eval-result.md +89 -4
  439. package/llms/components/lr-export-button.md +1 -1
  440. package/llms/components/lr-file-tree.md +60 -6
  441. package/llms/components/lr-flag.md +5 -2
  442. package/llms/components/lr-flow-canvas.md +152 -14
  443. package/llms/components/lr-flow-minimap.md +32 -4
  444. package/llms/components/lr-funnel.md +14 -0
  445. package/llms/components/lr-geojson-viewer.md +27 -10
  446. package/llms/components/lr-graph.md +43 -7
  447. package/llms/components/lr-heatmap.md +161 -5
  448. package/llms/components/lr-histogram.md +55 -9
  449. package/llms/components/lr-ingestion-queue.md +54 -3
  450. package/llms/components/lr-json-viewer.md +87 -7
  451. package/llms/components/lr-knowledge-base-admin.md +60 -4
  452. package/llms/components/lr-knowledge-base.md +121 -9
  453. package/llms/components/lr-knowledge-graph-explorer.md +106 -11
  454. package/llms/components/lr-lightbox.md +42 -6
  455. package/llms/components/lr-line-chart.md +28 -5
  456. package/llms/components/lr-lite-chart.md +96 -31
  457. package/llms/components/lr-locale-picker.md +6 -4
  458. package/llms/components/lr-map.md +67 -8
  459. package/llms/components/lr-markdown-core.md +10 -5
  460. package/llms/components/lr-markdown.md +23 -6
  461. package/llms/components/lr-mention-popover.md +11 -6
  462. package/llms/components/lr-mind-map.md +91 -10
  463. package/llms/components/lr-model-select.md +8 -4
  464. package/llms/components/lr-model-settings-panel.md +10 -2
  465. package/llms/components/lr-navigation-menu.md +1 -1
  466. package/llms/components/lr-neighbor-list.md +69 -2
  467. package/llms/components/lr-pie-chart.md +1 -1
  468. package/llms/components/lr-polar-area-chart.md +1 -1
  469. package/llms/components/lr-prompt-input.md +9 -2
  470. package/llms/components/lr-prompt-queue.md +11 -3
  471. package/llms/components/lr-radar-chart.md +1 -1
  472. package/llms/components/lr-rag-eval-dashboard.md +9 -2
  473. package/llms/components/lr-realtime-session.md +6 -2
  474. package/llms/components/lr-reorder-list.md +4 -0
  475. package/llms/components/lr-retrieval-compare.md +9 -4
  476. package/llms/components/lr-retrieval-results.md +104 -6
  477. package/llms/components/lr-scatter-chart.md +1 -1
  478. package/llms/components/lr-select.md +20 -10
  479. package/llms/components/lr-sequence-strip.md +92 -2
  480. package/llms/components/lr-span-waterfall.md +78 -8
  481. package/llms/components/lr-sparkline.md +42 -11
  482. package/llms/components/lr-spreadsheet-viewer.md +109 -14
  483. package/llms/components/lr-streaming-text-core.md +4 -2
  484. package/llms/components/lr-streaming-text.md +5 -1
  485. package/llms/components/lr-table.md +96 -115
  486. package/llms/components/lr-task-list.md +93 -9
  487. package/llms/components/lr-terminal.md +9 -0
  488. package/llms/components/lr-test-results.md +77 -3
  489. package/llms/components/lr-thread-list.md +86 -1
  490. package/llms/components/lr-time-zone-picker.md +8 -3
  491. package/llms/components/lr-timeline.md +5 -0
  492. package/llms/components/lr-token-input.md +7 -2
  493. package/llms/components/lr-tool-timeline.md +13 -4
  494. package/llms/components/lr-trace-tree.md +96 -10
  495. package/llms/components/lr-transcript-feed.md +9 -2
  496. package/llms/components/lr-tree.md +87 -15
  497. package/llms/components/lr-unit-picker.md +8 -3
  498. package/llms/components/lr-video-playlist.md +2 -0
  499. package/llms/components/lr-virtual-list.md +17 -8
  500. package/llms/components/lr-voice-picker.md +8 -3
  501. package/llms/components/lr-word-cloud.md +128 -12
  502. package/llms/components/lr-xml-viewer.md +106 -9
  503. package/llms/index.md +1 -1
  504. package/llms/peers.md +1 -1
  505. package/llms/shared/events-and-types.md +725 -264
  506. package/llms/shared/forms-and-accessibility.md +3 -17
  507. package/llms/shared/imports-and-registration.md +3 -17
  508. package/llms/shared/localization-and-rtl.md +0 -2
  509. package/llms/shared/styles-and-tokens.md +27 -36
  510. package/llms/shared/testing-and-utilities.md +4 -5
  511. package/llms/shared.md +770 -349
  512. package/llms.txt +1 -2
  513. package/locales.json +139 -139
  514. package/package.json +13 -4
  515. package/registrations.json +1 -1
  516. package/skills/compose-lyra-interfaces/SKILL.md +6 -8
  517. package/skills/lyra-ui/SKILL.md +20 -51
  518. package/skills/lyra-ui/commands/review.md +16 -33
  519. package/skills/lyra-ui/commands/update.md +6 -5
  520. package/skills/lyra-ui/online-api.md +15 -0
  521. package/skills/lyra-ui/reporting.md +2 -1
@@ -1,11 +1,25 @@
1
- import{__decorate}from"tslib";import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{HostDescriptionController}from"../../../internal/aria-controls.js";import{tag}from"../../../internal/prefix.js";import{TextViewerTarget}from"../../../internal/text-viewer-target.js";import{isAbortError,isResourceLimitError,LyraResourceLimitError,LyraUserFacingError,readResponseText,resolveOwnerFetchTarget}from"../../../internal/resource-loader.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{hostAriaLabel,srOnly}from"../../../internal/a11y.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{setMapCanvasReadyCallback}from"../../../internal/map-canvas-ready.js";import{loadMaplibre}from"../../media/map/map-loader.js";import{styles}from"./geojson-view.styles.js";import{ViewerAnnouncementController}from"../viewer-announcements.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_documentPreviewEmpty}from"../../../internal/default-strings/shared.generated.js";import{LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeDocument,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_geojsonViewFeatureCount,LYRA_DEFAULT_geojsonViewInvalid,LYRA_DEFAULT_geojsonViewLabel,LYRA_DEFAULT_geojsonViewMissingMapLibrary,LYRA_DEFAULT_loadingDocument}from"../../../internal/default-strings/viewers.generated.js";const GEOMETRY_TYPES=new Set(["Point","LineString","Polygon","MultiPoint","MultiLineString","MultiPolygon","GeometryCollection"]),MAX_GEOJSON_POSITIONS=1e4,MAX_GEOJSON_NODES=5e4,MAX_GEOJSON_DEPTH=64,MAX_GEOJSON_TEXT_UNITS=2*1024*1024,MAX_GEOJSON_SERIALIZED_UNITS=4*1024*1024,GEOJSON_BASE_MAP_STYLE={version:8,sources:{},layers:[]};function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function assertGeoJsonGraphWithinLimits(root){const tasks=[{value:root,depth:0}],seen=new WeakSet;let graphUnits=0,textUnits=0;const accountGraphUnit=()=>{if(graphUnits++,graphUnits+tasks.length>MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.")},accountText=value=>{if(textUnits+=value.length,textUnits>MAX_GEOJSON_TEXT_UNITS)throw new LyraResourceLimitError("The GeoJSON contains too much text.")};for(;tasks.length>0;){const task=tasks.pop();if(task.depth>MAX_GEOJSON_DEPTH)throw new LyraResourceLimitError("The GeoJSON nesting is too deep.");accountGraphUnit();const value=task.value;if(typeof value=="string"){accountText(value);continue}if(!(value===null||typeof value=="boolean")){if(typeof value=="number"){if(!Number.isFinite(value))throw new Error("invalid JSON number");continue}if(typeof value!="object")throw new Error("invalid JSON value");if(seen.has(value))throw new Error("cyclic JSON graph");if(seen.add(value),Array.isArray(value)){if(graphUnits+tasks.length+value.length>MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.");for(let index=value.length-1;index>=0;index--)tasks.push({value:value[index],depth:task.depth+1});continue}for(const key in value)Object.hasOwn(value,key)&&(accountGraphUnit(),accountText(key),tasks.push({value:value[key],depth:task.depth+1}))}}}function analyzeGeoJson(value){if(assertGeoJsonGraphWithinLimits(value),!isRecord(value))throw new Error("not a GeoJSON object");const root=value,tasks=[{kind:"geo",value,depth:0,mode:"any"}];let processedNodes=0,positionCount=0,bounds=null;const pushTask=task=>{if(task.depth>MAX_GEOJSON_DEPTH)throw new LyraResourceLimitError("The GeoJSON nesting is too deep.");if(processedNodes+tasks.length>=MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.");tasks.push(task)},pushArray=(items,kind,depth)=>{if(processedNodes+tasks.length+items.length>MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.");for(let index=items.length-1;index>=0;index--)pushTask({kind,value:items[index],depth})},requireArray=(candidate,minimum=0)=>{if(!Array.isArray(candidate)||candidate.length<minimum)throw new Error("invalid GeoJSON coordinates");return candidate};for(;tasks.length>0;){const task=tasks.pop();if(processedNodes++,processedNodes>MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.");if(task.depth>MAX_GEOJSON_DEPTH)throw new LyraResourceLimitError("The GeoJSON nesting is too deep.");if(task.kind==="position"){const position=requireArray(task.value,2);if(!position.every(coordinate=>typeof coordinate=="number"&&Number.isFinite(coordinate)))throw new Error("invalid GeoJSON position");const[lng,lat]=position;if(lng<-180||lng>180||lat<-90||lat>90)throw new Error("invalid GeoJSON position");if(positionCount++,positionCount>MAX_GEOJSON_POSITIONS)throw new LyraResourceLimitError("The GeoJSON contains too many positions.");const shiftedLng=lng<0?lng+360:lng;bounds?(bounds.minLng=Math.min(bounds.minLng,lng),bounds.maxLng=Math.max(bounds.maxLng,lng),bounds.minShiftedLng=Math.min(bounds.minShiftedLng,shiftedLng),bounds.maxShiftedLng=Math.max(bounds.maxShiftedLng,shiftedLng),bounds.minLat=Math.min(bounds.minLat,lat),bounds.maxLat=Math.max(bounds.maxLat,lat)):bounds={minLng:lng,maxLng:lng,minShiftedLng:shiftedLng,maxShiftedLng:shiftedLng,minLat:lat,maxLat:lat};continue}if(task.kind==="positions"||task.kind==="line"||task.kind==="ring"){const minimum=task.kind==="ring"?4:task.kind==="line"?2:0,positions=requireArray(task.value,minimum);if(task.kind==="ring"){const first=positions[0],last=positions[positions.length-1];if(!Array.isArray(first)||!Array.isArray(last)||first.length!==last.length||first.some((item,index)=>item!==last[index]))throw new Error("GeoJSON polygon rings must be closed")}pushArray(positions,"position",task.depth+1);continue}if(task.kind==="polygon"||task.kind==="multi-line"){const parts=requireArray(task.value);pushArray(parts,task.kind==="polygon"?"ring":"line",task.depth+1);continue}if(task.kind==="multi-polygon"){pushArray(requireArray(task.value),"polygon",task.depth+1);continue}if(task.kind!=="geo")throw new Error("invalid GeoJSON coordinate structure");if(!isRecord(task.value)||typeof task.value.type!="string")throw new Error("invalid GeoJSON member");const member=task.value,type=member.type;if(task.mode==="feature"&&type!=="Feature")throw new Error("FeatureCollection contains a non-Feature");if(task.mode==="geometry"&&!GEOMETRY_TYPES.has(type))throw new Error("invalid GeoJSON geometry");if(type==="Feature"){if(task.mode==="geometry"||!Object.hasOwn(member,"geometry")||!Object.hasOwn(member,"properties"))throw new Error("invalid GeoJSON Feature");if(member.properties!==null&&!isRecord(member.properties))throw new Error("invalid GeoJSON Feature properties");member.geometry!==null&&pushTask({kind:"geo",value:member.geometry,depth:task.depth+1,mode:"geometry"});continue}if(type==="FeatureCollection"){if(task.mode!=="any"||!Array.isArray(member.features))throw new Error("invalid GeoJSON FeatureCollection");for(let index=member.features.length-1;index>=0;index--)pushTask({kind:"geo",value:member.features[index],depth:task.depth+1,mode:"feature"});continue}if(!GEOMETRY_TYPES.has(type))throw new Error("invalid GeoJSON type");if(type==="GeometryCollection"){if(!Array.isArray(member.geometries))throw new Error("invalid GeoJSON GeometryCollection");for(let index=member.geometries.length-1;index>=0;index--)pushTask({kind:"geo",value:member.geometries[index],depth:task.depth+1,mode:"geometry"});continue}if(!Object.hasOwn(member,"coordinates"))throw new Error("GeoJSON geometry has no coordinates");pushTask({kind:{Point:"position",LineString:"line",Polygon:"polygon",MultiPoint:"positions",MultiLineString:"multi-line",MultiPolygon:"multi-polygon"}[type],value:member.coordinates,depth:task.depth+1})}const count=root.type==="FeatureCollection"&&Array.isArray(root.features)?root.features.length:1,metadata=JSON.stringify(root,null,2);if(metadata.length>MAX_GEOJSON_SERIALIZED_UNITS)throw new LyraResourceLimitError("The serialized GeoJSON is too large.");return{value:root,metadata,featureCount:count,bounds}}const FIT_PADDING=24,MAX_FIT_ZOOM=18;function crossesAntimeridian(bounds){return bounds.maxShiftedLng-bounds.minShiftedLng<bounds.maxLng-bounds.minLng-1e-9}function fitBboxToView(bounds){const crosses=crossesAntimeridian(bounds);let centerLng=crosses?(bounds.minShiftedLng+bounds.maxShiftedLng)/2:(bounds.minLng+bounds.maxLng)/2;centerLng>180&&(centerLng-=360);const center=[centerLng,(bounds.minLat+bounds.maxLat)/2],lngSpan=Math.max(crosses?bounds.maxShiftedLng-bounds.minShiftedLng:bounds.maxLng-bounds.minLng,1e-4),latSpan=Math.max(bounds.maxLat-bounds.minLat,1e-4),span=Math.max(lngSpan,latSpan*2)*1.4,zoom=Math.max(0,Math.min(MAX_FIT_ZOOM,Math.floor(Math.log2(360/span))));return{center,zoom}}class LyraGeoJsonViewerBase extends LyraElement{}class LyraGeoJsonViewer extends TextViewerTarget(LyraGeoJsonViewerBase){constructor(){super(...arguments),this.hostDescription=new HostDescriptionController(this,()=>this.mapReady?this.mapCanvas:this.renderRoot.querySelector('[part="base"][role="region"]')),this.src="",this.name="",this.maxHeight="",this.loadState={kind:"idle"},this.mapReady=!1,this.mapCanvas=null,this.pendingFitBounds=null,this.generation=0,this.lastLoadSrc="",this.registeredMap=null,this.announcements=new ViewerAnnouncementController(this),this.forceMissingMaplibreForTesting=!1}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeDocument:LYRA_DEFAULT_documentPreviewTypeDocument,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,geojsonViewFeatureCount:LYRA_DEFAULT_geojsonViewFeatureCount,geojsonViewInvalid:LYRA_DEFAULT_geojsonViewInvalid,geojsonViewLabel:LYRA_DEFAULT_geojsonViewLabel,geojsonViewMissingMapLibrary:LYRA_DEFAULT_geojsonViewMissingMapLibrary,loadingDocument:LYRA_DEFAULT_loadingDocument}}static{this.styles=[LyraElement.styles,styles,srOnly]}textContentRoot(){return this.renderRoot.querySelector('[part="base"]')}stopChildEvent(event){event.stopPropagation()}onMapCanvasReady(map,canvas){if(!this.isConnected||map!==this.registeredMap||this.shadowRoot?.querySelector(tag("map"))!==map||this.loadState.kind!=="loaded"||!this.loadState.peerAvailable||this.src!==this.lastLoadSrc)return;this.mapReady=!0,this.mapCanvas=canvas;const base=this.shadowRoot?.querySelector('[part="base"]');base?.removeAttribute("role"),base?.removeAttribute("aria-label"),this.hostDescription.refresh()}syncMapCanvasReadyCallback(){const next=this.shadowRoot?.querySelector(tag("map"));next!==this.registeredMap&&(this.registeredMap&&setMapCanvasReadyCallback(this.registeredMap,null),this.registeredMap=next,next&&setMapCanvasReadyCallback(next,canvas=>this.onMapCanvasReady(next,canvas)))}connectedCallback(){super.connectedCallback(),this.announcements.connect(),this.hasUpdated&&this.src.trim()&&this.src===this.lastLoadSrc&&this.scheduleAfterUpdate(()=>{this.load()})}disconnectedCallback(){this.generation++,this.registeredMap&&setMapCanvasReadyCallback(this.registeredMap,null),this.registeredMap=null,this.loadState={kind:"idle"},this.mapReady=!1,this.mapCanvas=null,this.announcements.disconnect(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.hostDescription.adopted(),this.announcements.adopted()}updated(changed){if(super.updated(changed),this.loadState.kind==="loaded"){const peerAvailable=this.loadState.peerAvailable;this.announcements.transition("load",peerAvailable?"loaded":"error",peerAvailable?this.featureCountStatus(this.loadState.featureCount):this.localize("geojsonViewMissingMapLibrary"),peerAvailable?"polite":"assertive")}else this.announcements.transition("load",this.loadState.kind,this.loadState.kind==="error"?this.loadState.message:this.localize("loadingDocument"));this.syncMapCanvasReadyCallback(),this.fitLoadedData(),changed.has("src")&&this.scheduleAfterUpdate(()=>{this.load()})}fitLoadedData(){const bounds=this.pendingFitBounds,map=this.registeredMap;if(!bounds||!map||this.loadState.kind!=="loaded")return;this.pendingFitBounds=null;const crosses=crossesAntimeridian(bounds),west=crosses?bounds.minShiftedLng:bounds.minLng,east=crosses?bounds.maxShiftedLng:bounds.maxLng,fit=()=>{map.fitBounds([[west,bounds.minLat],[east,bounds.maxLat]],{padding:FIT_PADDING,maxZoom:MAX_FIT_ZOOM,animate:!1})};typeof map.fitBounds=="function"?fit():customElements.whenDefined(map.localName).then(fit)}async load(){const generation=++this.generation,signal=this.beginAbortableLoad();if(this.lastLoadSrc=this.src,this.mapReady=!1,this.mapCanvas=null,!this.src){this.loadState={kind:"idle"};return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){this.failWithLocalizedMessage(this.localize("documentPreviewUrlNotAllowed"));return}this.loadState={kind:"loading"};try{const response=await fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0);if(!this.isConnected||generation!==this.generation)return;if(!response.ok)throw new Error(`${response.status} ${response.statusText}`);const text=await readResponseText(response);if(!this.isConnected||generation!==this.generation)return;const parsed=JSON.parse(text),analysis=analyzeGeoJson(parsed),{center,zoom}=analysis.bounds?fitBboxToView(analysis.bounds):{center:[0,0],zoom:1};this.pendingFitBounds=analysis.bounds??null;const maplibre=this.forceMissingMaplibreForTesting?null:await loadMaplibre();if(!this.isConnected||generation!==this.generation)return;this.loadState={kind:"loaded",value:analysis.value,metadata:analysis.metadata,featureCount:analysis.featureCount,center,zoom,peerAvailable:maplibre!==null},maplibre||this.emit("lr-render-error",{error:new LyraUserFacingError(this.localize("geojsonViewMissingMapLibrary"))})}catch(error){if(isAbortError(error)||!this.isConnected||generation!==this.generation)return;this.loadState={kind:"error",message:this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"geojsonViewInvalid")},this.emit("lr-render-error",{error})}}failWithLocalizedMessage(message){const error=new LyraUserFacingError(message);this.loadState={kind:"error",message},this.emit("lr-render-error",{error})}get effectiveLabel(){return hostAriaLabel(this)??(this.name?.trim()?this.name:this.localize("geojsonViewLabel"))}featureCountStatus(featureCount){return this.localize("geojsonViewFeatureCount",void 0,{count:getNumberFormat(this.effectiveLocale).format(featureCount),pluralCount:featureCount})}renderBody(){switch(this.loadState.kind){case"loaded":{const{value,metadata,featureCount,center,zoom,peerAvailable}=this.loadState,statusText=this.featureCountStatus(featureCount);return peerAvailable?html`
1
+ import{__decorate}from"tslib";import{guard}from"lit/directives/guard.js";import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{HostDescriptionController}from"../../../internal/aria-controls.js";import{tag}from"../../../internal/prefix.js";import{TextViewerTarget}from"../../../internal/text-viewer-target.js";import{isAbortError,isResourceLimitError,LyraResourceLimitError,LyraUserFacingError,readResponseText,resolveOwnerFetchTarget}from"../../../internal/resource-loader.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{hostAriaLabel,srOnly}from"../../../internal/a11y.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{setMapCanvasReadyCallback}from"../../../internal/map-canvas-ready.js";import{loadMaplibre}from"../../media/map/map-loader.js";import{styles}from"./geojson-view.styles.js";import{ViewerAnnouncementController}from"../viewer-announcements.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_documentPreviewEmpty}from"../../../internal/default-strings/shared.generated.js";import{LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeDocument,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_geojsonViewFeatureCount,LYRA_DEFAULT_geojsonViewInvalid,LYRA_DEFAULT_geojsonViewLabel,LYRA_DEFAULT_geojsonViewMissingMapLibrary,LYRA_DEFAULT_loadingDocument}from"../../../internal/default-strings/viewers.generated.js";const GEOMETRY_TYPES=new Set(["Point","LineString","Polygon","MultiPoint","MultiLineString","MultiPolygon","GeometryCollection"]),MAX_GEOJSON_POSITIONS=1e4,MAX_GEOJSON_NODES=5e4,MAX_GEOJSON_DEPTH=64,MAX_GEOJSON_TEXT_UNITS=2*1024*1024,MAX_GEOJSON_SERIALIZED_UNITS=4*1024*1024,GEOJSON_BASE_MAP_STYLE={version:8,sources:{},layers:[]};function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function assertGeoJsonSerializedSize(root){let units=0;const stringUnits=text=>{let length=2;for(let index=0;index<text.length;index++){const code=text.charCodeAt(index);code>=55296&&code<=56319&&text.charCodeAt(index+1)>=56320&&text.charCodeAt(index+1)<=57343?(length+=2,index++):length+=code>=55296&&code<=57343?6:code<32?[8,9,10,12,13].includes(code)?2:6:code===34||code===92?2:1}return length},tasks=[{value:root,depth:0}];for(;tasks.length;){const{value,depth}=tasks.pop();if(value===null)units+=4;else if(typeof value=="string")units+=stringUnits(value);else if(typeof value!="object")units+=String(value).length;else{const entries=Array.isArray(value)?value.map(entry=>[void 0,entry]):Object.entries(value);units+=2,entries.length&&(units+=entries.length*(2*(depth+1)+2)+2*depth);for(const[key,entry]of entries)key!==void 0&&(units+=stringUnits(key)+2),tasks.push({value:entry,depth:depth+1})}if(units>MAX_GEOJSON_SERIALIZED_UNITS)throw new LyraResourceLimitError("The serialized GeoJSON is too large.")}}function assertGeoJsonGraphWithinLimits(root){const tasks=[{value:root,depth:0}],seen=new WeakSet;let graphUnits=0,textUnits=0;const accountGraphUnit=()=>{if(graphUnits++,graphUnits+tasks.length>MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.")},accountText=value=>{if(textUnits+=value.length,textUnits>MAX_GEOJSON_TEXT_UNITS)throw new LyraResourceLimitError("The GeoJSON contains too much text.")};for(;tasks.length>0;){const task=tasks.pop();if(task.depth>MAX_GEOJSON_DEPTH)throw new LyraResourceLimitError("The GeoJSON nesting is too deep.");accountGraphUnit();const value=task.value;if(typeof value=="string"){accountText(value);continue}if(!(value===null||typeof value=="boolean")){if(typeof value=="number"){if(!Number.isFinite(value))throw new Error("invalid JSON number");continue}if(typeof value!="object")throw new Error("invalid JSON value");if(seen.has(value))throw new Error("cyclic JSON graph");if(seen.add(value),Array.isArray(value)){if(graphUnits+tasks.length+value.length>MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.");for(let index=value.length-1;index>=0;index--)tasks.push({value:value[index],depth:task.depth+1});continue}for(const key in value)Object.hasOwn(value,key)&&(accountGraphUnit(),accountText(key),tasks.push({value:value[key],depth:task.depth+1}))}}}function analyzeGeoJson(value){if(assertGeoJsonGraphWithinLimits(value),!isRecord(value))throw new Error("not a GeoJSON object");const root=value,tasks=[{kind:"geo",value,depth:0,mode:"any"}];let processedNodes=0,positionCount=0,bounds=null;const pushTask=task=>{if(task.depth>MAX_GEOJSON_DEPTH)throw new LyraResourceLimitError("The GeoJSON nesting is too deep.");if(processedNodes+tasks.length>=MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.");tasks.push(task)},pushArray=(items,kind,depth)=>{if(processedNodes+tasks.length+items.length>MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.");for(let index=items.length-1;index>=0;index--)pushTask({kind,value:items[index],depth})},requireArray=(candidate,minimum=0)=>{if(!Array.isArray(candidate)||candidate.length<minimum)throw new Error("invalid GeoJSON coordinates");return candidate};for(;tasks.length>0;){const task=tasks.pop();if(processedNodes++,processedNodes>MAX_GEOJSON_NODES)throw new LyraResourceLimitError("The GeoJSON contains too many nested values.");if(task.depth>MAX_GEOJSON_DEPTH)throw new LyraResourceLimitError("The GeoJSON nesting is too deep.");if(task.kind==="position"){const position=requireArray(task.value,2);if(!position.every(coordinate=>typeof coordinate=="number"&&Number.isFinite(coordinate)))throw new Error("invalid GeoJSON position");const[lng,lat]=position;if(lng<-180||lng>180||lat<-90||lat>90)throw new Error("invalid GeoJSON position");if(positionCount++,positionCount>MAX_GEOJSON_POSITIONS)throw new LyraResourceLimitError("The GeoJSON contains too many positions.");const shiftedLng=lng<0?lng+360:lng;bounds?(bounds.minLng=Math.min(bounds.minLng,lng),bounds.maxLng=Math.max(bounds.maxLng,lng),bounds.minShiftedLng=Math.min(bounds.minShiftedLng,shiftedLng),bounds.maxShiftedLng=Math.max(bounds.maxShiftedLng,shiftedLng),bounds.minLat=Math.min(bounds.minLat,lat),bounds.maxLat=Math.max(bounds.maxLat,lat)):bounds={minLng:lng,maxLng:lng,minShiftedLng:shiftedLng,maxShiftedLng:shiftedLng,minLat:lat,maxLat:lat};continue}if(task.kind==="positions"||task.kind==="line"||task.kind==="ring"){const minimum=task.kind==="ring"?4:task.kind==="line"?2:0,positions=requireArray(task.value,minimum);if(task.kind==="ring"){const first=positions[0],last=positions[positions.length-1];if(!Array.isArray(first)||!Array.isArray(last)||first.length!==last.length||first.some((item,index)=>item!==last[index]))throw new Error("GeoJSON polygon rings must be closed")}pushArray(positions,"position",task.depth+1);continue}if(task.kind==="polygon"||task.kind==="multi-line"){const parts=requireArray(task.value);pushArray(parts,task.kind==="polygon"?"ring":"line",task.depth+1);continue}if(task.kind==="multi-polygon"){pushArray(requireArray(task.value),"polygon",task.depth+1);continue}if(task.kind!=="geo")throw new Error("invalid GeoJSON coordinate structure");if(!isRecord(task.value)||typeof task.value.type!="string")throw new Error("invalid GeoJSON member");const member=task.value,type=member.type;if(task.mode==="feature"&&type!=="Feature")throw new Error("FeatureCollection contains a non-Feature");if(task.mode==="geometry"&&!GEOMETRY_TYPES.has(type))throw new Error("invalid GeoJSON geometry");if(type==="Feature"){if(task.mode==="geometry"||!Object.hasOwn(member,"geometry")||!Object.hasOwn(member,"properties"))throw new Error("invalid GeoJSON Feature");if(member.properties!==null&&!isRecord(member.properties))throw new Error("invalid GeoJSON Feature properties");member.geometry!==null&&pushTask({kind:"geo",value:member.geometry,depth:task.depth+1,mode:"geometry"});continue}if(type==="FeatureCollection"){if(task.mode!=="any"||!Array.isArray(member.features))throw new Error("invalid GeoJSON FeatureCollection");for(let index=member.features.length-1;index>=0;index--)pushTask({kind:"geo",value:member.features[index],depth:task.depth+1,mode:"feature"});continue}if(!GEOMETRY_TYPES.has(type))throw new Error("invalid GeoJSON type");if(type==="GeometryCollection"){if(!Array.isArray(member.geometries))throw new Error("invalid GeoJSON GeometryCollection");for(let index=member.geometries.length-1;index>=0;index--)pushTask({kind:"geo",value:member.geometries[index],depth:task.depth+1,mode:"geometry"});continue}if(!Object.hasOwn(member,"coordinates"))throw new Error("GeoJSON geometry has no coordinates");pushTask({kind:{Point:"position",LineString:"line",Polygon:"polygon",MultiPoint:"positions",MultiLineString:"multi-line",MultiPolygon:"multi-polygon"}[type],value:member.coordinates,depth:task.depth+1})}const count=root.type==="FeatureCollection"&&Array.isArray(root.features)?root.features.length:1;assertGeoJsonSerializedSize(root);const metadata=JSON.stringify(root,null,2);if(metadata.length>MAX_GEOJSON_SERIALIZED_UNITS)throw new LyraResourceLimitError("The serialized GeoJSON is too large.");return{value:root,metadata,featureCount:count,bounds}}const FIT_PADDING=24,MAX_FIT_ZOOM=18;function crossesAntimeridian(bounds){return bounds.maxShiftedLng-bounds.minShiftedLng<bounds.maxLng-bounds.minLng-1e-9}function fitBboxToView(bounds){const crosses=crossesAntimeridian(bounds);let centerLng=crosses?(bounds.minShiftedLng+bounds.maxShiftedLng)/2:(bounds.minLng+bounds.maxLng)/2;centerLng>180&&(centerLng-=360);const center=[centerLng,(bounds.minLat+bounds.maxLat)/2],lngSpan=Math.max(crosses?bounds.maxShiftedLng-bounds.minShiftedLng:bounds.maxLng-bounds.minLng,1e-4),latSpan=Math.max(bounds.maxLat-bounds.minLat,1e-4),span=Math.max(lngSpan,latSpan*2)*1.4,zoom=Math.max(0,Math.min(MAX_FIT_ZOOM,Math.floor(Math.log2(360/span))));return{center,zoom}}class LyraGeoJsonViewerBase extends LyraElement{}class LyraGeoJsonViewer extends TextViewerTarget(LyraGeoJsonViewerBase){constructor(){super(...arguments),this.hostDescription=new HostDescriptionController(this,()=>this.mapReady?this.mapCanvas:this.renderRoot.querySelector('[part="base"][role="region"]')),this.src="",this.name="",this.maxHeight="",this.loadState={kind:"idle"},this.mapReady=!1,this.mapCanvas=null,this.pendingFitBounds=null,this.generation=0,this.lastLoadSrc="",this.registeredMap=null,this.announcements=new ViewerAnnouncementController(this),this.forceMissingMaplibreForTesting=!1}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeDocument:LYRA_DEFAULT_documentPreviewTypeDocument,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,geojsonViewFeatureCount:LYRA_DEFAULT_geojsonViewFeatureCount,geojsonViewInvalid:LYRA_DEFAULT_geojsonViewInvalid,geojsonViewLabel:LYRA_DEFAULT_geojsonViewLabel,geojsonViewMissingMapLibrary:LYRA_DEFAULT_geojsonViewMissingMapLibrary,loadingDocument:LYRA_DEFAULT_loadingDocument}}static{this.styles=[LyraElement.styles,styles,srOnly]}textContentRoot(){return this.renderRoot.querySelector('[part="base"]')}stopChildEvent(event){event.stopPropagation()}onMapCanvasReady(map,canvas){if(!this.isConnected||map!==this.registeredMap||this.shadowRoot?.querySelector(tag("map"))!==map||this.loadState.kind!=="loaded"||!this.loadState.peerAvailable||this.src!==this.lastLoadSrc)return;this.mapReady=!0,this.mapCanvas=canvas;const base=this.shadowRoot?.querySelector('[part="base"]');base?.removeAttribute("role"),base?.removeAttribute("aria-label"),this.hostDescription.refresh()}syncMapCanvasReadyCallback(){const next=this.shadowRoot?.querySelector(tag("map"));next!==this.registeredMap&&(this.registeredMap&&setMapCanvasReadyCallback(this.registeredMap,null),this.registeredMap=next,next&&setMapCanvasReadyCallback(next,canvas=>this.onMapCanvasReady(next,canvas)))}connectedCallback(){super.connectedCallback(),this.announcements.connect(),this.hasUpdated&&this.src.trim()&&this.src===this.lastLoadSrc&&this.loadState.kind!=="loaded"&&this.scheduleAfterUpdate(()=>{this.load()})}disconnectedCallback(){this.generation++,this.registeredMap&&setMapCanvasReadyCallback(this.registeredMap,null),this.registeredMap=null,this.loadState.kind!=="loaded"&&(this.loadState={kind:"idle"}),this.mapReady=!1,this.mapCanvas=null,this.announcements.disconnect(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.hostDescription.adopted(),this.announcements.adopted()}updated(changed){if(super.updated(changed),this.loadState.kind==="loaded"){const peerAvailable=this.loadState.peerAvailable;this.announcements.transition("load",peerAvailable?"loaded":"error",peerAvailable?this.featureCountStatus(this.loadState.featureCount):this.localize("geojsonViewMissingMapLibrary"),peerAvailable?"polite":"assertive")}else this.announcements.transition("load",this.loadState.kind,this.loadState.kind==="error"?this.loadState.message:this.localize("loadingDocument"));this.syncMapCanvasReadyCallback(),this.fitLoadedData(),changed.has("src")&&this.scheduleAfterUpdate(()=>{this.load()})}fitLoadedData(){const bounds=this.pendingFitBounds,map=this.registeredMap;if(!bounds||!map||this.loadState.kind!=="loaded")return;this.pendingFitBounds=null;const crosses=crossesAntimeridian(bounds),west=crosses?bounds.minShiftedLng:bounds.minLng,east=crosses?bounds.maxShiftedLng:bounds.maxLng,fit=()=>{map.fitBounds([[west,bounds.minLat],[east,bounds.maxLat]],{padding:FIT_PADDING,maxZoom:MAX_FIT_ZOOM,animate:!1})};typeof map.fitBounds=="function"?fit():customElements.whenDefined(map.localName).then(fit)}async load(){const generation=++this.generation,signal=this.beginAbortableLoad();if(this.lastLoadSrc=this.src,this.mapReady=!1,this.mapCanvas=null,!this.src){this.loadState={kind:"idle"};return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){this.failWithLocalizedMessage(this.localize("documentPreviewUrlNotAllowed"));return}this.loadState={kind:"loading"};try{const response=await fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0);if(!this.isConnected||generation!==this.generation)return;if(!response.ok)throw new Error(`${response.status} ${response.statusText}`);const text=await readResponseText(response,MAX_GEOJSON_SERIALIZED_UNITS);if(!this.isConnected||generation!==this.generation)return;const parsed=JSON.parse(text),analysis=analyzeGeoJson(parsed),{center,zoom}=analysis.bounds?fitBboxToView(analysis.bounds):{center:[0,0],zoom:1};this.pendingFitBounds=analysis.bounds??null;const maplibre=this.forceMissingMaplibreForTesting?null:await loadMaplibre();if(!this.isConnected||generation!==this.generation||!maplibre&&(await import("../../utility/json-viewer/json-viewer.js"),!this.isConnected||generation!==this.generation))return;this.loadState={kind:"loaded",value:analysis.value,metadata:analysis.metadata,featureCount:analysis.featureCount,center,zoom,peerAvailable:maplibre!==null,dataLayers:Object.freeze([{sourceId:"lr-geojson",geojson:analysis.value}])},maplibre||this.emit("lr-render-error",{error:new LyraUserFacingError(this.localize("geojsonViewMissingMapLibrary"))})}catch(error){if(isAbortError(error)||!this.isConnected||generation!==this.generation)return;this.loadState={kind:"error",message:this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"geojsonViewInvalid")},this.emit("lr-render-error",{error})}}failWithLocalizedMessage(message){const error=new LyraUserFacingError(message);this.loadState={kind:"error",message},this.emit("lr-render-error",{error})}get effectiveLabel(){return hostAriaLabel(this)??(this.name?.trim()?this.name:this.localize("geojsonViewLabel"))}featureCountStatus(featureCount){return this.localize("geojsonViewFeatureCount",void 0,{count:getNumberFormat(this.effectiveLocale).format(featureCount),pluralCount:featureCount})}renderBody(){switch(this.loadState.kind){case"loaded":{const{value,metadata,featureCount,center,zoom,peerAvailable}=this.loadState,statusText=this.featureCountStatus(featureCount);if(!peerAvailable)return html`
2
+ <p part="missing-library">
3
+ ${this.localize("geojsonViewMissingMapLibrary")}
4
+ </p>
5
+ <pre part="metadata">${metadata}</pre>
6
+ <lr-json-viewer
7
+ .data=${value}
8
+ expand-depth="2"
9
+ @lr-copy=${this.stopChildEvent}
10
+ @lr-search-change=${this.stopChildEvent}
11
+ @lr-error=${this.stopChildEvent}
12
+ @lr-copy-error=${this.stopChildEvent}
13
+ ></lr-json-viewer>
14
+ `;const dataLayers=this.loadState.dataLayers??=Object.freeze([{sourceId:"lr-geojson",geojson:value}]);return html`
2
15
  <div part="status">${statusText}</div>
3
16
  <pre part="metadata">${metadata}</pre>
4
17
  <lr-map
18
+ engine="maplibre"
5
19
  .center=${center}
6
20
  .zoom=${zoom}
7
21
  .mapStyle=${GEOJSON_BASE_MAP_STYLE}
8
- .dataLayers=${[{sourceId:"lr-geojson",geojson:value}]}
22
+ .dataLayers=${guard([dataLayers],()=>dataLayers)}
9
23
  label=${this.effectiveLabel}
10
24
  @lr-map-load=${this.stopChildEvent}
11
25
  @lr-map-click=${this.stopChildEvent}
@@ -14,20 +28,7 @@ import{__decorate}from"tslib";import{html,nothing}from"lit";import{property,stat
14
28
  @lr-map-legend-toggle-request=${this.stopChildEvent}
15
29
  @lr-map-legend-panel-toggle-request=${this.stopChildEvent}
16
30
  ></lr-map>
17
- `:html`
18
- <p part="missing-library">
19
- ${this.localize("geojsonViewMissingMapLibrary")}
20
- </p>
21
- <pre part="metadata">${metadata}</pre>
22
- <lr-json-viewer
23
- .data=${value}
24
- expand-depth="2"
25
- @lr-copy=${this.stopChildEvent}
26
- @lr-search-change=${this.stopChildEvent}
27
- @lr-error=${this.stopChildEvent}
28
- @lr-copy-error=${this.stopChildEvent}
29
- ></lr-json-viewer>
30
- `}case"loading":return html`<div part="spinner">
31
+ `}case"loading":return html`<div part="spinner">
31
32
  <lr-skeleton shape="rect" .announce=${!1}></lr-skeleton>
32
33
  <span class="sr-only">${this.localize("loadingDocument")}</span>
33
34
  </div>`;case"error":return html`<div part="error">${this.loadState.message}</div>`;default:return html`<p>
@@ -1,2 +1,2 @@
1
1
  /** @deprecated Import @aceshooting/lyra-ui/components/lr-geojson-viewer.js to register this component. */
2
- export*from'./geojson-viewer.class.js';import'../../media/map/map.js';import'../../utility/json-viewer/json-viewer.js';import'../../overlays/skeleton/skeleton.js';
2
+ export*from'./geojson-viewer.class.js';import'../../media/map/map.js';export type{}from'../../utility/json-viewer/json-viewer.js';import'../../overlays/skeleton/skeleton.js';
@@ -1 +1 @@
1
- export*from"./geojson-viewer.class.js";import{LyraGeoJsonViewer}from"./geojson-viewer.class.js";import{defineElement}from"../../../internal/prefix.js";import{registerDocumentRenderer}from"../document-viewer/registry.js";import"../../media/map/map.js";import"../../utility/json-viewer/json-viewer.js";import"../../overlays/skeleton/skeleton.js";defineElement("geojson-viewer",LyraGeoJsonViewer),registerDocumentRenderer("application/geo+json",{matches:file=>file.name.toLowerCase().endsWith(".geojson"),render:file=>{const el=document.createElement("lr-geojson-viewer");return el.src=file.src,el.name=file.name,el.anchor=file.anchor??null,el.highlights=file.highlights??[],el},capabilities:{anchors:["text-quote","fragment"],search:!0,textSelect:!0}});
1
+ export*from"./geojson-viewer.class.js";import{LyraGeoJsonViewer}from"./geojson-viewer.class.js";import{defineElement}from"../../../internal/prefix.js";import{registerDocumentRenderer}from"../document-viewer/registry.js";import"../../media/map/map.js";import"../../overlays/skeleton/skeleton.js";defineElement("geojson-viewer",LyraGeoJsonViewer),registerDocumentRenderer("application/geo+json",{matches:file=>file.name.toLowerCase().endsWith(".geojson"),render:file=>{const el=document.createElement("lr-geojson-viewer");return el.src=file.src,el.name=file.name,el.anchor=file.anchor??null,el.highlights=file.highlights??[],el},capabilities:{anchors:["text-quote","fragment"],search:!0,textSelect:!0}});
@@ -1,4 +1,8 @@
1
- import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import{type LyraAnchorTargetEventMap}from'../../../internal/anchor-target.js';import type{LyraAnchor,LyraAnchorKind}from'../document-viewer/anchors.js';import type{LyraSearchChangeDetail}from'../../../internal/text-viewer-target.js';export interface LyraSpreadsheetViewerEventMap extends Omit<LyraAnchorTargetEventMap,'lr-text-select'>{'lr-render-error':CustomEvent<{error:unknown;}>;
1
+ import type{LyraWorkbookSource}from'../../../data-sources.js';export type{LyraTabularColumn,LyraSourceCell,LyraTabularHit,LyraTabularReadRequest,LyraSourceSearchRequest,LyraSourceSearchResult,LyraWorkbookHit}from'../../../data-sources.js';
2
+ /** Host-owned indexed or rectangular source for this viewer. */
3
+ export type SpreadsheetViewerSource=LyraWorkbookSource;import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import{type LyraAnchorTargetEventMap}from'../../../internal/anchor-target.js';import type{LyraAnchor,LyraAnchorKind}from'../document-viewer/anchors.js';import type{LyraSearchChangeDetail}from'../../../internal/text-viewer-target.js';
4
+ /** Parsed scalar-cell workbook accepted without loading a parser peer. */
5
+ export interface SpreadsheetViewerWorkbook{sheets:{name:string;rows:unknown[][];}[];}export interface LyraSpreadsheetViewerEventMap extends Omit<LyraAnchorTargetEventMap,'lr-text-select'>{'lr-render-error':CustomEvent<{error:unknown;}>;
2
6
  /** Fired whenever the search query, match count, or active match index changes, from
3
7
  * `search()`/`searchNext()`/`searchPrevious()`/`clearSearch()`. */
4
8
  'lr-search-change':CustomEvent<LyraSearchChangeDetail>;}declare class LyraSpreadsheetViewerBase extends LyraElement<LyraSpreadsheetViewerEventMap>{}declare const LyraSpreadsheetViewer_base:Omit<typeof LyraSpreadsheetViewerBase,'prototype'> &(new(...args:ConstructorParameters<typeof LyraSpreadsheetViewerBase>)=>InstanceType<typeof LyraSpreadsheetViewerBase> &import("../../../lyra.js").LyraAnchorTarget&import("../../../internal/anchor-target.js").DocumentAnchorTargetHooks&{renderAnchorLiveRegion():unknown;});
@@ -18,10 +22,16 @@ import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from
18
22
  * substring match over every sheet's stringified cell values (the same stringification `cell()`
19
23
  * already renders), ordered sheet then row then column, switching tabs as navigation crosses sheets.
20
24
  * Cells render through their number formats; dates and General numbers use the effective locale.
21
- * Each sheet's used range is limited to 10,000 rows and 1,000 columns before it is expanded; a
25
+ * By default, each sheet's used range is limited to 10,000 rows and 1,000 columns before it is expanded; a
22
26
  * workbook additionally retains at most 256 sheets and 1,000,000 aggregate cells. Internal tab and
23
27
  * virtual-list lifecycle events stay contained inside the viewer.
24
28
  *
29
+ * Row and column ceilings default to 10,000 and 1,000; maxRows/maxColumns can raise them to
30
+ * 100,000 and 10,000. maxBytes defaults to 25 MiB and is bounded at 250 MiB. The 1,000,000-cell
31
+ * ceiling remains independent. The owned `workbook` input bypasses fetch and peer parsing; undefined
32
+ * restores src. Header and body columns are windowed together, and anchors reveal hidden columns.
33
+ * Remote parsing yields between admission/materialization passes; parsing itself remains synchronous.
34
+ *
25
35
  * @customElement lr-spreadsheet-viewer
26
36
  * @event lr-render-error - Fired when fetching or parsing fails.
27
37
  * @event lr-highlight-activate - A `highlights` cell was clicked, or activated via Enter/Space
@@ -57,18 +67,34 @@ import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from
57
67
  * @cssprop [--lr-spreadsheet-viewer-max-height=none] - Maximum block size of `[part="body"]`
58
68
  * before it scrolls internally. The `maxHeight` property sets this token inline on
59
69
  * `[part="base"]`.
70
+ * @csspart search-status - Notice when a data source has no global search capability.
60
71
  * @status stable
61
72
  * @since 4.0.0
62
73
  */
63
- export declare class LyraSpreadsheetViewer extends LyraSpreadsheetViewer_base{static styles:import("lit").CSSResultGroup[];
74
+ export declare class LyraSpreadsheetViewer extends LyraSpreadsheetViewer_base{static styles:import("lit").CSSResultGroup[];protected static readonly identityCollectionObjectProperties:readonly string[];private _dataSource?;
75
+ /** Optional host-owned full logical source. Takes precedence over legacy inputs; undefined restores
76
+ * them. Reassign, including the same source, or call requestUpdate() after source mutation.
77
+ * Source rows use fixed live --lr-size-3rem geometry; legacy row sizing is unchanged.
78
+ * Column labels are separate from body rows; body row zero appears at display row two.
79
+ * Global search requires the source search capability. */
80
+ get dataSource():SpreadsheetViewerSource|undefined;set dataSource(value:SpreadsheetViewerSource|undefined);requestUpdate(...args:Parameters<LyraElement['requestUpdate']>):void;
64
81
  /** URL to fetch and parse. */
65
82
  src:string;
83
+ /** Maximum admitted rows; defaults to 10,000 and can be raised to 100,000. */
84
+ maxRows:number;
85
+ /** Maximum admitted columns; defaults to 1,000 and can be raised to 10,000. */
86
+ maxColumns:number;
87
+ /** Maximum source bytes; defaults to 25 MiB and can be raised to 250 MiB. */
88
+ maxBytes:number;private get effectiveMaxRows();private get effectiveMaxColumns();private get effectiveMaxBytes();private inputError;private inputSource?;private inputLimits;private get currentInputLimits();private _workbook;
89
+ /** Owned parsed workbook of scalar-cell grids. Takes precedence over src; undefined restores fetching.
90
+ * At most 256 sheets and 1,000,000 aggregate cells are accepted. Invalid input reports lr-render-error. */
91
+ get workbook():SpreadsheetViewerWorkbook|undefined;set workbook(value:SpreadsheetViewerWorkbook|undefined);private snapshotWorkbook;
66
92
  /** Source filename or display name, used as the viewer's accessible name. */
67
93
  name:string;
68
94
  /** A CSS `max-height`; invalid values are ignored. */
69
95
  maxHeight:string;
70
96
  /** Anchor kinds this viewer resolves via `scrollToAnchor()`. */
71
- readonly anchorKinds:readonly LyraAnchorKind[];private fetchState;private activeSheetIndex;private activeRowSheet;private generation;private loadLibrary;private readonly table;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private load;private renderCell;private renderRow;private readonly virtualListKeyFunction;private renderSheet;private renderLoaded;private onTabsChange;private jumpToCell;protected applyAnchor(anchor:LyraAnchor):Promise<boolean>;private scrollColumnIntoView;
97
+ readonly anchorKinds:readonly LyraAnchorKind[];private fetchState;private activeSheetIndex;private activeRowSheet;private generation;private loadLibrary;private readonly table;private readonly provider;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private load;private renderCell;private renderRow;private readonly virtualListKeyFunction;private renderSheet;private renderLoaded;private onTabsChange;private jumpToCell;protected applyAnchor(anchor:LyraAnchor):Promise<boolean>;private scrollColumnIntoView;
72
98
  /** Case-insensitive substring search over every sheet's raw-grid cells (the same stringification
73
99
  * `cell()` renders), ordered sheet then row then column -- each sheet's header row is included,
74
100
  * the same raw-grid convention `cell-range` anchors use. An empty/whitespace-only query behaves
@@ -83,4 +109,4 @@ searchNext():Promise<boolean>;
83
109
  searchPrevious():Promise<boolean>;
84
110
  /** Clears the query, matches, and active index, and resets `lr-search-change` to a
85
111
  * 0-match/no-active-index state. */
86
- clearSearch():void;private stopInternalEvent;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-spreadsheet-viewer':LyraSpreadsheetViewer;}}export{};
112
+ clearSearch():void;private stopInternalEvent;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-spreadsheet-viewer':LyraSpreadsheetViewer;}}
@@ -1,11 +1,13 @@
1
- import{__decorate}from"tslib";import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{guard}from"lit/directives/guard.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{tag}from"../../../internal/prefix.js";import{srOnly}from"../../../internal/a11y.js";import{assertTableDimensions,DEFAULT_MAX_TABLE_ROWS,isAbortError,isResourceLimitError,LyraResourceLimitError,LyraUserFacingError,readResponseArrayBuffer,resolveOwnerFetchTarget}from"../../../internal/resource-loader.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{TableViewerController}from"../table-viewer-shared.js";import{delimitedColumnCount}from"../../../internal/delimited-data.js";import{DocumentAnchorTarget}from"../../../internal/anchor-target.js";import{parseCellRange}from"../../../internal/cell-range.js";import{loadSheetJsCached}from"./spreadsheet-loader.js";import{styles}from"./spreadsheet-viewer.styles.js";import{assertXlsxArchiveWithinLimits}from"./xlsx-resource-guard.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{viewerSemanticLabel,viewerSemanticRole}from"../viewer-semantic-owner.js";import{renderViewerLoading,viewerLoadingStyles}from"../viewer-loading.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_collapse,LYRA_DEFAULT_copy,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_documentPreviewEmpty,LYRA_DEFAULT_highlightWithLabel,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_noData,LYRA_DEFAULT_open,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_viewerSearchActiveMatch,LYRA_DEFAULT_viewerSearchMatchCount,LYRA_DEFAULT_viewerSearchNoMatches}from"../../../internal/default-strings/shared.generated.js";import{LYRA_DEFAULT_cellHighlightWithLabel,LYRA_DEFAULT_documentPreviewFailedToLoad,LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeDocument,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_loadingDocument,LYRA_DEFAULT_spreadsheetViewerLabel,LYRA_DEFAULT_spreadsheetViewerUnavailable}from"../../../internal/default-strings/viewers.generated.js";const MAX_SPREADSHEET_SHEETS=256,MAX_SPREADSHEET_CELLS=1e6;function cell(value,locale){if(value==null)return"";if(value instanceof Date){const dated=value.getUTCFullYear()>=1900,seconds=value.getUTCSeconds()>0,timed=!dated||seconds||value.getUTCHours()+value.getUTCMinutes()>0;return getDateTimeFormat(locale,{timeZone:"UTC",dateStyle:dated?"medium":void 0,timeStyle:timed?seconds?"medium":"short":void 0}).format(value)}return typeof value=="number"?getNumberFormat(locale,{useGrouping:!1}).format(value):String(value)}class LyraSpreadsheetViewerBase extends LyraElement{}class LyraSpreadsheetViewer extends DocumentAnchorTarget(LyraSpreadsheetViewerBase){constructor(){super(...arguments),this.src="",this.name="",this.maxHeight="",this.anchorKinds=["cell-range"],this.fetchState={kind:"idle"},this.activeSheetIndex=0,this.activeRowSheet=0,this.generation=0,this.loadLibrary=loadSheetJsCached,this.table=new TableViewerController(this,{emitSearch:detail=>this.emit("lr-search-change",detail),emitActivate:highlightId=>this.emit("lr-highlight-activate",{highlightId}),localize:(key,fallback,values)=>this.localize(key,fallback,values),locale:()=>this.effectiveLocale,schedule:(callback,key)=>this.scheduleAfterUpdate(callback,key),load:()=>this.load(),research:query=>this.search(query),jump:match=>this.jumpToCell(match.sheetIndex,match.row,match.col),teardown:()=>{this.generation++,this.fetchState={kind:"idle"},this.table.activeRowKey="",this.activeSheetIndex=0}}),this.virtualListKeyFunction=(_item,bodyIndex)=>bodyIndex,this.onTabsChange=e=>{e.stopPropagation();const match=/^sheet-(\d+)$/.exec(e.detail.name);match&&(this.activeSheetIndex=Number(match[1]))},this.stopInternalEvent=event=>{event.stopPropagation()}}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,cellHighlightWithLabel:LYRA_DEFAULT_cellHighlightWithLabel,collapse:LYRA_DEFAULT_collapse,copy:LYRA_DEFAULT_copy,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewFailedToLoad:LYRA_DEFAULT_documentPreviewFailedToLoad,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeDocument:LYRA_DEFAULT_documentPreviewTypeDocument,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,highlightWithLabel:LYRA_DEFAULT_highlightWithLabel,loading:LYRA_DEFAULT_loading,loadingDocument:LYRA_DEFAULT_loadingDocument,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,noData:LYRA_DEFAULT_noData,open:LYRA_DEFAULT_open,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,spreadsheetViewerLabel:LYRA_DEFAULT_spreadsheetViewerLabel,spreadsheetViewerUnavailable:LYRA_DEFAULT_spreadsheetViewerUnavailable,viewerSearchActiveMatch:LYRA_DEFAULT_viewerSearchActiveMatch,viewerSearchMatchCount:LYRA_DEFAULT_viewerSearchMatchCount,viewerSearchNoMatches:LYRA_DEFAULT_viewerSearchNoMatches}}static{this.styles=[LyraElement.styles,styles,viewerLoadingStyles,srOnly]}connectedCallback(){super.connectedCallback(),this.table.connected()}disconnectedCallback(){this.table.disconnecting(),super.disconnectedCallback(),this.table.disconnected()}adoptedCallback(){super.adoptedCallback(),this.table.adopted()}willUpdate(changed){super.willUpdate(changed),this.table.willUpdate(changed,this.highlights,this.activeHighlightId,!0),changed.has("src")&&(this.activeSheetIndex=0)}updated(changed){super.updated(changed),this.table.updated(changed,this.fetchState)}async load(){this.table.lastLoadSrc=this.src;const generation=++this.generation,signal=this.beginAbortableLoad();if(!this.src){this.fetchState={kind:"idle"};return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){const error=new LyraUserFacingError(this.localize("documentPreviewUrlNotAllowed"));this.fetchState={kind:"error",message:error.message},this.emit("lr-render-error",{error});return}this.fetchState={kind:"loading"};try{const response=await fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0);if(!this.isConnected||generation!==this.generation)return;if(!response.ok)throw new Error(`${response.status} ${response.statusText}`);const library=await this.loadLibrary();if(!this.isConnected||generation!==this.generation)return;if(!library){const error=new LyraUserFacingError(this.localize("spreadsheetViewerUnavailable"));this.fetchState={kind:"error",message:error.message},this.emit("lr-render-error",{error});return}const source=await readResponseArrayBuffer(response);if(!this.isConnected||generation!==this.generation||(await assertXlsxArchiveWithinLimits(source,void 0,void 0,{signal}),!this.isConnected||generation!==this.generation))return;const workbook=library.read(source,{type:"array",cellDates:!0,cellNF:!0,sheetRows:DEFAULT_MAX_TABLE_ROWS+1});if(!this.isConnected||generation!==this.generation)return;const sheetNames=workbook.SheetNames;if(!Array.isArray(sheetNames)||!sheetNames.every(name=>typeof name=="string"))throw new Error("The xlsx peer returned a malformed workbook.");if(sheetNames.length>MAX_SPREADSHEET_SHEETS)throw new LyraResourceLimitError("The spreadsheet contains too many sheets.");const sheets=[];let totalCells=0;for(const name of sheetNames){const sheet=workbook.Sheets[name]??{},range=parseCellRange(String(sheet["!ref"]??"A1"));if(!range)throw new Error("The xlsx peer returned a malformed workbook.");const rowCount=range.endRow-range.startRow+1,columnCount=range.endCol-range.startCol+1;if(assertTableDimensions(rowCount,columnCount),totalCells+=rowCount*columnCount,totalCells>MAX_SPREADSHEET_CELLS)throw new LyraResourceLimitError("The spreadsheet contains too many expanded cells.");for(const value of Object.values(sheet)){const formatted=value;formatted.t==="n"&&formatted.z!==void 0&&formatted.z!=="General"&&typeof formatted.w=="string"&&(formatted.t="s",formatted.v=formatted.w)}const rows=library.utils.sheet_to_json(sheet,{header:1,UTC:!0});sheets.push({name,rows,body:rows.slice(1),columns:delimitedColumnCount(rows)})}this.isConnected&&generation===this.generation&&(this.fetchState={kind:"loaded",sheets},this.table.search.query&&await this.search(this.table.search.query))}catch(error){if(isAbortError(error)||!this.isConnected||generation!==this.generation)return;this.fetchState={kind:"error",message:this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"documentPreviewFailedToLoad")},this.emit("lr-render-error",{error})}}renderCell(value,colIndex,rowHighlights,role){return this.table.renderCell(cell(value,this.effectiveLocale),colIndex,rowHighlights,role,"cell","--_lr-spreadsheet-viewer-highlight-color",this.activeHighlightId)}renderRow(row,count,part,rawRow,sheetName){const rowHighlights=this.table.highlightsForRow(rawRow,sheetName),header=part==="header-row";return html`<div
1
+ import{__decorate}from"tslib";import{finiteCount}from"../../../internal/numbers.js";import{snapshotViewerRows,ownTableValue}from"../../../internal/delimited-data.js";import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{guard}from"lit/directives/guard.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{tag}from"../../../internal/prefix.js";import{srOnly}from"../../../internal/a11y.js";import{assertTableDimensions,isAbortError,isResourceLimitError,LyraResourceLimitError,LyraUserFacingError,readResponseArrayBuffer,resolveOwnerFetchTarget,yieldViewerTask}from"../../../internal/resource-loader.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{TABLE_VIEWER_SOURCE_MESSAGE_KEYS,TableViewerSourceController,TableViewerController}from"../table-viewer-shared.js";import{delimitedColumnCount}from"../../../internal/delimited-data.js";import{DocumentAnchorTarget}from"../../../internal/anchor-target.js";import{parseCellRange}from"../../../internal/cell-range.js";import{loadSheetJsCached}from"./spreadsheet-loader.js";import{styles}from"./spreadsheet-viewer.styles.js";import{assertXlsxArchiveWithinLimits}from"./xlsx-resource-guard.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{viewerSemanticLabel,viewerSemanticRole}from"../viewer-semantic-owner.js";import{renderViewerLoading,viewerLoadingStyles}from"../viewer-loading.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_collapse,LYRA_DEFAULT_copy,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_documentPreviewEmpty,LYRA_DEFAULT_highlightWithLabel,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_noData,LYRA_DEFAULT_open,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_sourceSearchUnavailable,LYRA_DEFAULT_viewerSearchActiveMatch,LYRA_DEFAULT_viewerSearchMatchCount,LYRA_DEFAULT_viewerSearchNoMatches}from"../../../internal/default-strings/shared.generated.js";import{LYRA_DEFAULT_cellHighlightWithLabel,LYRA_DEFAULT_documentPreviewFailedToLoad,LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeDocument,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_loadingDocument,LYRA_DEFAULT_spreadsheetViewerLabel,LYRA_DEFAULT_spreadsheetViewerUnavailable}from"../../../internal/default-strings/viewers.generated.js";const MAX_SPREADSHEET_SHEETS=256,MAX_SPREADSHEET_CELLS=1e6;function cell(value,locale){if(value==null)return"";if(value instanceof Date){const dated=value.getUTCFullYear()>=1900,seconds=value.getUTCSeconds()>0,timed=!dated||seconds||value.getUTCHours()+value.getUTCMinutes()>0;return getDateTimeFormat(locale,{timeZone:"UTC",dateStyle:dated?"medium":void 0,timeStyle:timed?seconds?"medium":"short":void 0}).format(value)}return typeof value=="number"?getNumberFormat(locale,{useGrouping:!1}).format(value):String(value)}class LyraSpreadsheetViewerBase extends LyraElement{}class LyraSpreadsheetViewer extends DocumentAnchorTarget(LyraSpreadsheetViewerBase){constructor(){super(...arguments),this.src="",this.maxRows=1e4,this.maxColumns=1e3,this.maxBytes=26214400,this.inputLimits="",this.name="",this.maxHeight="",this.anchorKinds=["cell-range"],this.fetchState={kind:"idle"},this.activeSheetIndex=0,this.activeRowSheet=0,this.generation=0,this.loadLibrary=loadSheetJsCached,this.table=new TableViewerController(this,{repaint:()=>super.requestUpdate(),emitSearch:detail=>this.emit("lr-search-change",detail),emitActivate:highlightId=>this.emit("lr-highlight-activate",{highlightId}),localize:(key,fallback,values)=>this.localize(key,fallback,values),locale:()=>this.effectiveLocale,schedule:(callback,key)=>this.scheduleAfterUpdate(callback,key),load:()=>this.load(),research:query=>this.search(query),jump:match=>this.jumpToCell(match.sheetIndex,match.row,match.col),teardown:()=>{this.generation++,this.fetchState={kind:"idle"},this.table.activeRowKey="",this.activeSheetIndex=0}}),this.provider=new TableViewerSourceController(this,this.table,{source:()=>this.dataSource,cancelAnchor:()=>this.cancelPendingAnchor(),workbook:!0,renderSheetTabs:(names,active,select)=>html`<lr-tab-group part="tabs" .active=${`source-${active}`}
2
+ @lr-tab-show=${event=>{event.stopPropagation(),select(Number(event.detail.name.slice(7)))}}>${names.map((name,index)=>html`<lr-tab panel=${`source-${index}`}>${name}</lr-tab><lr-tab-panel name=${`source-${index}`}></lr-tab-panel>`)}</lr-tab-group>`,header:()=>!0,columnLimit:()=>this.effectiveMaxColumns,locale:()=>this.effectiveLocale,localize:key=>this.localize(TABLE_VIEWER_SOURCE_MESSAGE_KEYS[key]),repaint:()=>super.requestUpdate(),error:error=>{this.hasUpdated&&this.table.announcements.announceAssertive(this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"documentPreviewFailedToLoad")),this.emit("lr-render-error",{error})},emitSearch:detail=>this.emit("lr-search-change",detail),format:value=>cell(value,this.effectiveLocale),label:()=>this.name||this.localize("spreadsheetViewerLabel"),colorVar:"--_lr-spreadsheet-viewer-highlight-color",headerPart:"cell",activeHighlight:()=>this.activeHighlightId}),this.virtualListKeyFunction=(_item,bodyIndex)=>bodyIndex,this.onTabsChange=e=>{e.stopPropagation();const match=/^sheet-(\d+)$/.exec(e.detail.name);match&&(this.activeSheetIndex=Number(match[1]))},this.stopInternalEvent=event=>{event.stopPropagation()}}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,cellHighlightWithLabel:LYRA_DEFAULT_cellHighlightWithLabel,collapse:LYRA_DEFAULT_collapse,copy:LYRA_DEFAULT_copy,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewFailedToLoad:LYRA_DEFAULT_documentPreviewFailedToLoad,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeDocument:LYRA_DEFAULT_documentPreviewTypeDocument,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,highlightWithLabel:LYRA_DEFAULT_highlightWithLabel,loading:LYRA_DEFAULT_loading,loadingDocument:LYRA_DEFAULT_loadingDocument,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,noData:LYRA_DEFAULT_noData,open:LYRA_DEFAULT_open,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,sourceSearchUnavailable:LYRA_DEFAULT_sourceSearchUnavailable,spreadsheetViewerLabel:LYRA_DEFAULT_spreadsheetViewerLabel,spreadsheetViewerUnavailable:LYRA_DEFAULT_spreadsheetViewerUnavailable,viewerSearchActiveMatch:LYRA_DEFAULT_viewerSearchActiveMatch,viewerSearchMatchCount:LYRA_DEFAULT_viewerSearchMatchCount,viewerSearchNoMatches:LYRA_DEFAULT_viewerSearchNoMatches}}static{this.styles=[LyraElement.styles,styles,viewerLoadingStyles,srOnly]}static{this.identityCollectionObjectProperties=Object.freeze(["dataSource"])}get dataSource(){return this._dataSource}set dataSource(value){const previous=this._dataSource;this._dataSource=value,this.provider?.refresh(),this.generation++,this.beginAbortableLoad(),this.requestUpdate("dataSource",previous)}requestUpdate(...args){args[0]===void 0&&this._dataSource!==void 0&&this.provider?.refresh(),super.requestUpdate(...args)}get effectiveMaxRows(){return Math.max(1,finiteCount(this.maxRows,1e4,1e5))}get effectiveMaxColumns(){return Math.max(1,finiteCount(this.maxColumns,1e3,1e4))}get effectiveMaxBytes(){return Math.max(1,finiteCount(this.maxBytes,26214400,262144e3))}get currentInputLimits(){return`${this.effectiveMaxRows}:${this.effectiveMaxColumns}:${this.effectiveMaxBytes}`}get workbook(){return this._workbook}set workbook(value){const limits=this.currentInputLimits;if(limits===this.inputLimits&&(value===this._workbook||value!==void 0&&value===this.inputSource?.deref()))return;const previous=this._workbook;this.inputLimits=limits,this.inputSource=void 0,this.inputError=void 0;try{this._workbook=value===void 0?void 0:this.snapshotWorkbook(value),value!==void 0&&(this.inputSource=new WeakRef(value))}catch(error){this._workbook={sheets:[]},this.inputError=error}this.requestUpdate("workbook",previous)}snapshotWorkbook(value){const source=ownTableValue(value,"sheets");if(!Array.isArray(source))throw new TypeError("Invalid workbook sheets.");if(source.length>MAX_SPREADSHEET_SHEETS)throw new LyraResourceLimitError;const budget={cells:0,bytes:0},encoder=new TextEncoder,sheets=[];for(let index=0;index<source.length;index++){const sheet=ownTableValue(source,String(index)),name=ownTableValue(sheet,"name");if(typeof name!="string")throw new TypeError("Invalid sheet name.");if(name.length>this.effectiveMaxBytes-budget.bytes)throw new LyraResourceLimitError;if(budget.bytes+=encoder.encode(name).byteLength,budget.bytes>this.effectiveMaxBytes)throw new LyraResourceLimitError;const rows=snapshotViewerRows(ownTableValue(sheet,"rows"),this.effectiveMaxRows,this.effectiveMaxColumns,this.effectiveMaxBytes,budget);sheets.push(Object.freeze({name,rows}))}return Object.freeze({sheets:Object.freeze(sheets)})}connectedCallback(){super.connectedCallback(),this.table.connected()}disconnectedCallback(){this.table.disconnecting(),super.disconnectedCallback(),this.table.disconnected()}adoptedCallback(){super.adoptedCallback(),this.provider.adopted(),this.table.adopted()}willUpdate(changed){this.provider.update(),super.willUpdate(changed),this.table.willUpdate(changed,this.highlights,this.activeHighlightId,!0),changed.has("src")&&(this.activeSheetIndex=0)}updated(changed){super.updated(changed),this.table.updated(changed,this.fetchState)}async load(){if(this.dataSource!==void 0)return;this.table.lastLoadSrc=this.src;const generation=++this.generation,signal=this.beginAbortableLoad();if(this._workbook!==void 0){try{if(this.inputError)throw this.inputError;this.inputLimits!==this.currentInputLimits&&(this._workbook=this.snapshotWorkbook(this._workbook),this.inputLimits=this.currentInputLimits);const workbook=this._workbook;this.fetchState={kind:"loaded",sheets:workbook.sheets.map(sheet=>({...sheet,body:sheet.rows.slice(1),columns:delimitedColumnCount(sheet.rows)}))}}catch(error){this.fetchState={kind:"error",message:this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"documentPreviewFailedToLoad")},this.emit("lr-render-error",{error})}return}if(!this.src){this.fetchState={kind:"idle"};return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){const error=new LyraUserFacingError(this.localize("documentPreviewUrlNotAllowed"));this.fetchState={kind:"error",message:error.message},this.emit("lr-render-error",{error});return}this.fetchState={kind:"loading"};try{const response=await fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0);if(!this.isConnected||generation!==this.generation)return;if(!response.ok)throw new Error(`${response.status} ${response.statusText}`);const library=await this.loadLibrary();if(!this.isConnected||generation!==this.generation)return;if(!library){const error=new LyraUserFacingError(this.localize("spreadsheetViewerUnavailable"));this.fetchState={kind:"error",message:error.message},this.emit("lr-render-error",{error});return}const source=await readResponseArrayBuffer(response,this.effectiveMaxBytes);if(!this.isConnected||generation!==this.generation||(await assertXlsxArchiveWithinLimits(source,void 0,void 0,{signal,maxRows:this.effectiveMaxRows}),await yieldViewerTask(this.ownerDocument.defaultView,()=>this.isConnected&&generation===this.generation),!this.isConnected||generation!==this.generation))return;const workbook=library.read(source,{type:"array",cellDates:!0,cellNF:!0,sheetRows:this.effectiveMaxRows+1});if(!this.isConnected||generation!==this.generation)return;const sheetNames=workbook.SheetNames;if(!Array.isArray(sheetNames)||!sheetNames.every(name=>typeof name=="string"))throw new Error("The xlsx peer returned a malformed workbook.");if(sheetNames.length>MAX_SPREADSHEET_SHEETS)throw new LyraResourceLimitError("The spreadsheet contains too many sheets.");const sheets=[];let totalCells=0;for(const name of sheetNames){await yieldViewerTask(this.ownerDocument.defaultView,()=>this.isConnected&&generation===this.generation);const sheet=workbook.Sheets[name]??{},range=parseCellRange(String(sheet["!ref"]??"A1"));if(!range)throw new Error("The xlsx peer returned a malformed workbook.");const rowCount=range.endRow-range.startRow+1,columnCount=range.endCol-range.startCol+1;if(assertTableDimensions(rowCount,columnCount,this.effectiveMaxRows,this.effectiveMaxColumns),totalCells+=rowCount*columnCount,totalCells>MAX_SPREADSHEET_CELLS)throw new LyraResourceLimitError("The spreadsheet contains too many expanded cells.");for(const value of Object.values(sheet)){const formatted=value;formatted.t==="n"&&formatted.z!==void 0&&formatted.z!=="General"&&typeof formatted.w=="string"&&(formatted.t="s",formatted.v=formatted.w)}const rows=library.utils.sheet_to_json(sheet,{header:1,UTC:!0});sheets.push({name,rows,body:rows.slice(1),columns:delimitedColumnCount(rows)})}this.isConnected&&generation===this.generation&&(this.fetchState={kind:"loaded",sheets},this.table.search.query&&await this.search(this.table.search.query))}catch(error){if(isAbortError(error)||!this.isConnected||generation!==this.generation)return;this.fetchState={kind:"error",message:this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"documentPreviewFailedToLoad")},this.emit("lr-render-error",{error})}}renderCell(value,colIndex,rowHighlights,role){return this.table.renderCell(cell(value,this.effectiveLocale),colIndex,rowHighlights,role,"cell","--_lr-spreadsheet-viewer-highlight-color",this.activeHighlightId)}renderRow(row,count,part,rawRow,sheetName){const window=this.table.columnWindow(sheetName,count),rowHighlights=this.table.highlightsForRow(rawRow,sheetName),header=part==="header-row";return html`<div
2
3
  part=${part}
3
4
  role=${header?"row":"presentation"}
4
5
  aria-rowindex=${header?"1":nothing}
5
- style=${`grid-template-columns:repeat(${count},minmax(var(--lr-size-8rem),1fr))`}
6
- >${Array.from({length:count},(_unused,index)=>this.renderCell(row[index],index,rowHighlights,header?"columnheader":"cell"))}</div
6
+ style=${window.style}
7
+ >${guard([row,window.columns,rowHighlights,this.activeHighlightId,this.effectiveLocale,this.strings,this.localize("highlightWithLabel"),this.localize("cellHighlightWithLabel")],()=>window.columns.map(index=>this.renderCell(row[index],index,rowHighlights,header?"columnheader":"cell")))}</div
7
8
  >`}renderSheet(sheet,index){const header=sheet.rows[0];if(!header)return html`<p class="empty-note">${this.localize("noData")}</p>`;const count=sheet.columns;return html`<div
8
9
  part="sheet"
10
+ @scroll=${event=>this.table.scrollColumns(sheet.name,event.currentTarget)}
9
11
  data-sheet-index=${index}
10
12
  role="table"
11
13
  aria-label=${sheet.name}
@@ -16,8 +18,9 @@ import{__decorate}from"tslib";import{html,nothing}from"lit";import{property,stat
16
18
  part="rows"
17
19
  exportparts="data-row:data-row, cell:cell, cell-highlight:cell-highlight, cell-highlight-action:cell-highlight-action"
18
20
  data-sheet-index=${index}
19
- .items=${guard([sheet.body],()=>sheet.body)}
20
- .renderItem=${(row,bodyIndex)=>this.renderRow(row,count,"data-row",bodyIndex+2,sheet.name)}
21
+ .items=${guard([sheet.body],()=>sheet.body.length<=1e4?sheet.body:nothing)}
22
+ .source=${this.table.indexedSource(sheet.body)}
23
+ .renderItem=${this.table.rowRenderer(sheet,[this.table.columnWindow(sheet.name,count).columns,this.activeHighlightId,this.strings],(row,bodyIndex)=>this.renderRow(row,count,"data-row",bodyIndex+2,sheet.name))}
21
24
  .keyFunction=${this.virtualListKeyFunction}
22
25
  .activeItemId=${index===this.activeRowSheet?this.table.activeRowKey:""}
23
26
  item-role="row"
@@ -35,13 +38,13 @@ import{__decorate}from"tslib";import{html,nothing}from"lit";import{property,stat
35
38
  >${sheets.map((sheet,index)=>html`<lr-tab panel=${`sheet-${index}`}>${sheet.name}</lr-tab>`)}${sheets.map((sheet,index)=>html`<lr-tab-panel name=${`sheet-${index}`}
36
39
  >${index===this.activeSheetIndex?this.renderSheet(sheet,index):nothing}</lr-tab-panel
37
40
  >`)}</lr-tab-group
38
- >`:html`<p class="empty-note">${this.localize("noData")}</p>`}async jumpToCell(sheetIndex,rawRow,col){const loadedState=this.fetchState;if(loadedState.kind!=="loaded")return!1;const{sheets}=loadedState;if(sheetIndex<0||sheetIndex>=sheets.length)return!1;const sheet=sheets[sheetIndex];if(rawRow<1||rawRow>sheet.rows.length||col<0||col>=sheet.columns)return!1;const bodyIndex=rawRow-2;return this.activeSheetIndex=sheetIndex,await this.updateComplete,bodyIndex<0?this.table.revealCell(this.renderRoot.querySelector(`[part="sheet"][data-sheet-index="${sheetIndex}"] [part="header-row"]`)?.querySelectorAll('[part~="cell"]')[col]):(this.activeRowSheet=sheetIndex,this.table.setActiveRow(bodyIndex),await this.updateComplete,await this.scrollColumnIntoView(sheetIndex,col),this.fetchState===loadedState)}async applyAnchor(anchor){if(anchor.kind!=="cell-range"||this.fetchState.kind!=="loaded")return!1;const parsed=parseCellRange(anchor.range);if(!parsed)return!1;const sheetName=anchor.sheet??parsed.sheet,sheetIndex=sheetName?this.fetchState.sheets.findIndex(s=>s.name===sheetName):this.activeSheetIndex;return sheetIndex<0?!1:this.jumpToCell(sheetIndex,parsed.startRow+1,parsed.startCol)}async scrollColumnIntoView(sheetIndex,col){await this.table.scrollColumnIntoView(this.renderRoot,`${tag("virtual-list")}[data-sheet-index="${sheetIndex}"]`,col)}async search(query){return this.table.runSearch(query,this.fetchState.kind==="loaded",visit=>{if(this.fetchState.kind!=="loaded")return;const{sheets}=this.fetchState;for(let sheetIndex=0;sheetIndex<sheets.length;sheetIndex++){const sheet=sheets[sheetIndex];for(let r=0;r<sheet.rows.length;r++){const row=sheet.rows[r];for(let c=0;c<row.length;c++)if(!visit(cell(row[c],this.effectiveLocale),{sheetIndex,row:r+1,col:c}))return}}})}async searchNext(){return this.table.step(1)}async searchPrevious(){return this.table.step(-1)}clearSearch(){this.table.clearSearch()}render(){const body=this.fetchState.kind==="loaded"?this.renderLoaded(this.fetchState.sheets):this.fetchState.kind==="loading"?renderViewerLoading(this.localize("loadingDocument")):this.fetchState.kind==="error"?html`<div part="error">${this.fetchState.message}</div>`:html`<p class="empty-note">${this.localize("documentPreviewEmpty",void 0,{type:this.localize("documentPreviewTypeDocument")})}</p>`,maxHeight=sanitizeCssLength(this.maxHeight);return html`<div
41
+ >`:html`<p class="empty-note">${this.localize("noData")}</p>`}async jumpToCell(sheetIndex,rawRow,col){const loadedState=this.fetchState;if(loadedState.kind!=="loaded")return!1;const ownerDocument=this.ownerDocument,isCurrent=()=>this.isConnected&&this.ownerDocument===ownerDocument&&this.fetchState===loadedState,{sheets}=loadedState;if(sheetIndex<0||sheetIndex>=sheets.length)return!1;const sheet=sheets[sheetIndex];if(rawRow<1||rawRow>sheet.rows.length||col<0||col>=sheet.columns)return!1;const bodyIndex=rawRow-2;return this.activeSheetIndex=sheetIndex,await this.updateComplete,!isCurrent()||(await this.table.showColumn(sheet.name,col,this.renderRoot.querySelector(`[part="sheet"][data-sheet-index="${sheetIndex}"]`)),!isCurrent())?!1:bodyIndex<0?this.table.revealCell(this.renderRoot.querySelector(`[part="sheet"][data-sheet-index="${sheetIndex}"] [part="header-row"]`)?.querySelector(`[aria-colindex="${col+1}"]`)):(this.activeRowSheet=sheetIndex,this.table.setActiveRow(bodyIndex),await this.updateComplete,!isCurrent()||(await this.scrollColumnIntoView(sheetIndex,col),!isCurrent())?!1:isCurrent())}async applyAnchor(anchor){if(this.dataSource!==void 0)return this.provider.revealAnchor(anchor);if(anchor.kind!=="cell-range"||this.fetchState.kind!=="loaded")return!1;const parsed=parseCellRange(anchor.range);if(!parsed)return!1;const sheetName=anchor.sheet??parsed.sheet,sheetIndex=sheetName?this.fetchState.sheets.findIndex(s=>s.name===sheetName):this.activeSheetIndex;return sheetIndex<0?!1:this.jumpToCell(sheetIndex,parsed.startRow+1,parsed.startCol)}async scrollColumnIntoView(sheetIndex,col){await this.table.scrollColumnIntoView(this.renderRoot,`${tag("virtual-list")}[data-sheet-index="${sheetIndex}"]`,col)}async search(query){return this.dataSource!==void 0?this.provider.search(query):this.table.runSearch(query,this.fetchState.kind==="loaded",visit=>{if(this.fetchState.kind!=="loaded")return;const{sheets}=this.fetchState;for(let sheetIndex=0;sheetIndex<sheets.length;sheetIndex++){const sheet=sheets[sheetIndex];for(let r=0;r<sheet.rows.length;r++){const row=sheet.rows[r];for(let c=0;c<row.length;c++)if(!visit(cell(row[c],this.effectiveLocale),{sheetIndex,row:r+1,col:c}))return}}},this.fetchState)}async searchNext(){return this.dataSource!==void 0?this.provider.step(1):this.table.step(1)}async searchPrevious(){return this.dataSource!==void 0?this.provider.step(-1):this.table.step(-1)}clearSearch(){if(this.dataSource!==void 0){this.provider.clearSearch();return}this.table.clearSearch()}render(){const body=this.dataSource!==void 0?this.provider.render():this.fetchState.kind==="loaded"?this.renderLoaded(this.fetchState.sheets):this.fetchState.kind==="loading"?renderViewerLoading(this.localize("loadingDocument")):this.fetchState.kind==="error"?html`<div part="error">${this.fetchState.message}</div>`:html`<p class="empty-note">${this.localize("documentPreviewEmpty",void 0,{type:this.localize("documentPreviewTypeDocument")})}</p>`,maxHeight=sanitizeCssLength(this.maxHeight);return html`<div
39
42
  part="base"
40
43
  role=${viewerSemanticRole(this,"region")??nothing}
41
44
  style=${maxHeight?styleMap({"--lr-spreadsheet-viewer-max-height":maxHeight}):nothing}
42
45
  aria-label=${viewerSemanticLabel(this,this.name||this.localize("spreadsheetViewerLabel"))??nothing}
43
- aria-busy=${this.fetchState.kind==="loading"?"true":"false"}
46
+ aria-busy=${(this.dataSource!==void 0?this.provider.busy:this.fetchState.kind==="loading")?"true":"false"}
44
47
  >
45
48
  <div part="body">${body}</div>
46
49
  ${this.renderAnchorLiveRegion()}
47
- </div>`}}__decorate([property()],LyraSpreadsheetViewer.prototype,"src",void 0),__decorate([property()],LyraSpreadsheetViewer.prototype,"name",void 0),__decorate([property({attribute:"max-height"})],LyraSpreadsheetViewer.prototype,"maxHeight",void 0),__decorate([state()],LyraSpreadsheetViewer.prototype,"fetchState",void 0),__decorate([state()],LyraSpreadsheetViewer.prototype,"activeSheetIndex",void 0),__decorate([state()],LyraSpreadsheetViewer.prototype,"activeRowSheet",void 0);export{LyraSpreadsheetViewer};
50
+ </div>`}}__decorate([property({attribute:!1,noAccessor:!0,hasChanged:()=>!0})],LyraSpreadsheetViewer.prototype,"dataSource",null),__decorate([property()],LyraSpreadsheetViewer.prototype,"src",void 0),__decorate([property({type:Number,attribute:"max-rows"})],LyraSpreadsheetViewer.prototype,"maxRows",void 0),__decorate([property({type:Number,attribute:"max-columns"})],LyraSpreadsheetViewer.prototype,"maxColumns",void 0),__decorate([property({type:Number,attribute:"max-bytes"})],LyraSpreadsheetViewer.prototype,"maxBytes",void 0),__decorate([property({attribute:!1,noAccessor:!0})],LyraSpreadsheetViewer.prototype,"workbook",null),__decorate([property()],LyraSpreadsheetViewer.prototype,"name",void 0),__decorate([property({attribute:"max-height"})],LyraSpreadsheetViewer.prototype,"maxHeight",void 0),__decorate([state()],LyraSpreadsheetViewer.prototype,"fetchState",void 0),__decorate([state()],LyraSpreadsheetViewer.prototype,"activeSheetIndex",void 0),__decorate([state()],LyraSpreadsheetViewer.prototype,"activeRowSheet",void 0);export{LyraSpreadsheetViewer};
@@ -1,8 +1,9 @@
1
- import{html}from"lit";import{parseCellRange}from"../../internal/cell-range.js";import{prioritizedHighlightCandidates}from"../../internal/anchor-target.js";import{prefersReducedMotion}from"../../internal/motion.js";import{OwnerAnimationFrameWaiter}from"../../internal/owner-animation-frame.js";import{ViewerSearchState}from"../../internal/viewer-search.js";import{DeferredTeardown}from"./document-viewer/deferred-teardown.js";import{ViewerAnnouncementController}from"./viewer-announcements.js";import{boundedViewerSearchQuery,ViewerSearchWorkBudget}from"./viewer-search-limits.js";const MAX_TABLE_SEARCH_MATCHES=1e3;function collectTableSearchMatches(query,locale,enabled,scan){const bounded=boundedViewerSearchQuery(query,locale),matches=[];let exact=bounded.accepted;if(bounded.accepted&&bounded.needle&&enabled){const budget=new ViewerSearchWorkBudget;scan((text,match)=>{if(budget.includes(text,bounded.needle,locale)){if(matches.length===MAX_TABLE_SEARCH_MATCHES)return exact=!1,!1;matches.push(match)}return budget.complete?!0:(exact=!1,!1)})}return{matches,exact}}function tableHighlightsForRow(highlights,rawRow,sheet){return highlights.filter(entry=>(sheet===void 0||entry.sheet===void 0||entry.sheet===sheet)&&rawRow-1>=entry.parsed.startRow&&rawRow-1<=entry.parsed.endRow)}function tableHighlightsForColumn(highlights,col){return highlights.filter(entry=>col>=entry.parsed.startCol&&col<=entry.parsed.endCol)}class TableViewerScrollController{constructor(host){this.host=host,this.generation=0,this.frames=new OwnerAnimationFrameWaiter(host)}cancel(){this.generation++,this.frames.cancel()}async scrollColumnIntoView(list,col){this.frames.cancel();const generation=++this.generation,ownerDocument=this.host.ownerDocument,isCurrent=()=>generation===this.generation&&this.host.ownerDocument===ownerDocument&&list?.isConnected===!0;if(list?.updateComplete&&await list.updateComplete,!list||!isCurrent()||!await this.frames.wait()||!isCurrent())return;const row=list.shadowRoot?.querySelector('[part="row"][aria-current="true"]');this.reveal(row?.querySelectorAll('[part~="cell"]')[col])}reveal(target){target?.scrollIntoView({behavior:prefersReducedMotion(this.host)?"auto":"smooth",block:"nearest",inline:"nearest"})}}class TableViewerController{constructor(host,hooks){this.host=host,this.hooks=hooks,this.highlights=[],this.activeRowKey="",this.lastLoadSrc="",this.lastLocale="",this.pendingResetEvent=!1,this.search=new ViewerSearchState(()=>[],detail=>hooks.emitSearch(detail),()=>host.requestUpdate()),this.announcements=new ViewerAnnouncementController(host),this.scroll=new TableViewerScrollController(host),this.detached=new DeferredTeardown(()=>{hooks.teardown(),this.scroll.cancel()})}connected(){this.announcements.connect(),!this.detached.cancel()&&this.host.hasUpdated&&this.host.src&&this.host.src===this.lastLoadSrc&&this.hooks.schedule(()=>{this.hooks.load()})}disconnecting(){this.announcements.disconnect()}disconnected(){this.detached.schedule()}adopted(){this.detached.flush(),this.scroll.cancel(),this.announcements.adopted()}willUpdate(changed,highlights,activeHighlightId,sheets){changed.has("src")&&(this.pendingResetEvent||=this.search.dirty,this.search.reset(),this.activeRowKey=""),(changed.has("highlights")||changed.has("activeHighlightId"))&&(this.highlights=prioritizedHighlightCandidates(highlights,activeHighlightId).flatMap(highlight=>{if(highlight.anchor.kind!=="cell-range"||!sheets&&highlight.anchor.sheet)return[];const parsed=parseCellRange(highlight.anchor.range);return parsed?[sheets?{highlight,parsed,sheet:highlight.anchor.sheet??parsed.sheet}:{highlight,parsed}]:[]}))}updated(changed,state){this.announcements.transition("load",state.kind,state.kind==="error"?state.message:this.hooks.localize("loadingDocument")),changed.has("src")&&this.hooks.schedule(()=>{this.hooks.load()}),changed.has("src")&&this.pendingResetEvent&&(this.pendingResetEvent=!1,this.search.emit());const locale=this.hooks.locale();locale!==this.lastLocale&&(this.lastLocale=locale,this.search.query&&this.hooks.schedule(()=>{this.hooks.research(this.search.query)},"search"))}setActiveRow(key){this.activeRowKey=key,this.host.requestUpdate()}highlightsForRow(rawRow,sheet){return tableHighlightsForRow(this.highlights,rawRow,sheet)}renderCell(text,colIndex,rowHighlights,role,part,colorVar,activeHighlightId){const colHighlights=tableHighlightsForColumn(rowHighlights,colIndex);if(!colHighlights.length)return html`<div part=${part} role=${role}>${text}</div>`;const active=colHighlights.find(entry=>entry.highlight.id===activeHighlightId),primary=active??colHighlights[0],accessibleLabel=primary.highlight.label?this.hooks.localize("cellHighlightWithLabel",void 0,{value:text,label:primary.highlight.label}):this.hooks.localize("highlightWithLabel",void 0,{label:text});return html`<div
1
+ import{SourceRequestController,sourceCount,sourceRevision}from"../../internal/source-request-controller.js";import{LyraResourceLimitError,isResourceLimitError}from"../../internal/resource-loader.js";import{ThemeWatcher}from"../../internal/theme-watcher.js";import{tag}from"../../internal/prefix.js";import{resolveCssTokenLength}from"../../internal/css-token-length.js";import{html,nothing}from"lit";import{parseCellRange}from"../../internal/cell-range.js";import{prioritizedHighlightCandidates}from"../../internal/anchor-target.js";import{prefersReducedMotion}from"../../internal/motion.js";import{OwnerAnimationFrameWaiter}from"../../internal/owner-animation-frame.js";import{ViewerSearchState}from"../../internal/viewer-search.js";import{DeferredTeardown}from"./document-viewer/deferred-teardown.js";import{ViewerAnnouncementController}from"./viewer-announcements.js";import{boundedViewerSearchQuery,ViewerSearchWorkBudget}from"./viewer-search-limits.js";const MAX_TABLE_SEARCH_MATCHES=1e3;function collectTableSearchMatches(query,locale,enabled,scan){const bounded=boundedViewerSearchQuery(query,locale),matches=[];let exact=bounded.accepted;if(bounded.accepted&&bounded.needle&&enabled){const budget=new ViewerSearchWorkBudget;scan((text,match)=>{if(budget.includes(text,bounded.needle,locale)){if(matches.length===MAX_TABLE_SEARCH_MATCHES)return exact=!1,!1;matches.push(match)}return budget.complete?!0:(exact=!1,!1)})}return{matches,exact}}function tableHighlightsForRow(highlights,rawRow,sheet){return highlights.length?highlights.filter(entry=>(sheet===void 0||entry.sheet===void 0||entry.sheet===sheet)&&rawRow-1>=entry.parsed.startRow&&rawRow-1<=entry.parsed.endRow):highlights}function tableHighlightsForColumn(highlights,col){return highlights.length?highlights.filter(entry=>col>=entry.parsed.startCol&&col<=entry.parsed.endCol):highlights}class TableViewerScrollController{constructor(host){this.host=host,this.generation=0,this.frames=new OwnerAnimationFrameWaiter(host)}cancel(){this.generation++,this.frames.cancel()}async scrollColumnIntoView(list,col){this.frames.cancel();const generation=++this.generation,ownerDocument=this.host.ownerDocument,isCurrent=()=>generation===this.generation&&this.host.ownerDocument===ownerDocument&&list?.isConnected===!0;if(list?.updateComplete&&await list.updateComplete,!list||!isCurrent()||!await this.frames.wait()||!isCurrent())return;const row=list.shadowRoot?.querySelector('[part="row"][aria-current="true"]');this.reveal(row?.querySelector(`[aria-colindex="${col+1}"]`))}reveal(target){target?.scrollIntoView({behavior:prefersReducedMotion(this.host)?"auto":"smooth",block:"nearest",inline:"nearest"})}}class TableViewerController{indexedSource(rows){if(rows.length<=1e4)return;let source=this.sources.get(rows);return source||(source=Object.freeze({count:rows.length,itemAt:index=>rows[index],keyAt:index=>index,indexOfKey:key=>typeof key=="number"?key:-1}),this.sources.set(rows,source)),source}constructor(host,hooks){this.host=host,this.hooks=hooks,this.highlights=[],this.activeRowKey="",this.lastLoadSrc="",this.sources=new WeakMap,this.rowHighlights=new Map,this.columnHighlights=new WeakMap,this.windows=new Map,this.renderers=new Map,this.pageOffset=0,this.onPageScroll=()=>{if(!this.hooks.pageScroll?.())return;const rect=this.host.getBoundingClientRect(),rtl=this.host.ownerDocument.defaultView?.getComputedStyle(this.host).direction==="rtl",offset=Math.max(0,rtl?rect.right-(this.pageView?.innerWidth??0):-rect.left);this.pageOffset=offset,this.geometryWidth=void 0,this.forcedPageOffset=void 0,this.hooks.repaint()},this.lastLocale="",this.pendingResetEvent=!1,this.search=new ViewerSearchState(()=>[],detail=>hooks.emitSearch(detail),()=>hooks.repaint()),this.announcements=new ViewerAnnouncementController(host),this.scroll=new TableViewerScrollController(host),this.detached=new DeferredTeardown(()=>{hooks.teardown(),this.scroll.cancel()})}connected(){this.announcements.connect();const Resize=this.host.ownerDocument.defaultView?.ResizeObserver;Resize&&!this.resize&&(this.resize=new Resize(()=>{this.geometryWidth=void 0,this.hooks.repaint()}),this.resize.observe(this.host)),this.hooks.pageScroll&&!this.pageView&&(this.pageView=this.host.ownerDocument.defaultView??void 0,this.pageView?.addEventListener("scroll",this.onPageScroll,{passive:!0}),this.pageView?.addEventListener("resize",this.onPageScroll,{passive:!0})),!this.detached.cancel()&&this.host.hasUpdated&&this.hooks.schedule(()=>{this.hooks.load()})}disconnecting(){this.announcements.disconnect(),this.resize?.disconnect(),this.resize=void 0,this.pageView?.removeEventListener("scroll",this.onPageScroll),this.pageView?.removeEventListener("resize",this.onPageScroll),this.pageView=void 0}disconnected(){this.detached.schedule()}adopted(){this.detached.flush(),this.disconnecting(),this.host.isConnected&&this.connected(),this.scroll.cancel(),this.announcements.adopted()}willUpdate(changed,highlights,activeHighlightId,sheets){this.geometryWidth=void 0,(changed.has("scrollMode")||changed.has("fetchState"))&&(this.forcedPageOffset=void 0),changed.has("activeSheetIndex")&&this.windows.clear(),changed.has("fetchState")&&(this.scroll.cancel(),this.renderers.clear(),this.windows.clear(),this.rowHighlights.clear()),(changed.has("src")||changed.has("rows")||changed.has("table")||changed.has("workbook"))&&(this.searchCorpus=void 0,this.renderers.clear(),this.windows.clear(),this.pendingResetEvent||=this.search.dirty,this.search.reset(),this.activeRowKey=""),(changed.has("highlights")||changed.has("activeHighlightId"))&&(this.rowHighlights.clear(),this.highlights=prioritizedHighlightCandidates(highlights,activeHighlightId).flatMap(highlight=>{if(highlight.anchor.kind!=="cell-range"||!sheets&&highlight.anchor.sheet)return[];const parsed=parseCellRange(highlight.anchor.range);return parsed?[sheets?{highlight,parsed,sheet:highlight.anchor.sheet??parsed.sheet}:{highlight,parsed}]:[]}))}updated(changed,state){this.announcements.transition("load",state.kind,state.kind==="error"?state.message:this.hooks.localize("loadingDocument")),["dataSource","src","rows","table","workbook","maxRows","maxColumns","maxBytes"].some(key=>changed.has(key))&&this.hooks.schedule(()=>{this.hooks.load()}),this.pendingResetEvent&&(this.pendingResetEvent=!1,this.search.emit());const locale=this.hooks.locale();locale!==this.lastLocale&&(this.lastLocale=locale,this.search.query&&this.hooks.schedule(()=>{this.hooks.research(this.search.query)},"search"))}setActiveRow(key){this.activeRowKey=key,this.hooks.repaint()}highlightsForRow(rawRow,sheet){if(!this.highlights.length)return this.highlights;const key=`${sheet??""}:${rawRow}`;let result=this.rowHighlights.get(key);return result||(result=tableHighlightsForRow(this.highlights,rawRow,sheet),this.rowHighlights.set(key,result),this.rowHighlights.size>256&&this.rowHighlights.delete(this.rowHighlights.keys().next().value)),result}renderCell(text,colIndex,rowHighlights,role,part,colorVar,activeHighlightId){if(!rowHighlights.length)return html`<div part=${part} role=${role} aria-colindex=${colIndex+1} style=${`grid-column:${colIndex+1}`}>${text}</div>`;let byColumn=this.columnHighlights.get(rowHighlights);byColumn||(byColumn=new Map,this.columnHighlights.set(rowHighlights,byColumn));let colHighlights=byColumn.get(colIndex);if(colHighlights||(colHighlights=tableHighlightsForColumn(rowHighlights,colIndex),byColumn.set(colIndex,colHighlights)),!colHighlights.length)return html`<div part=${part} role=${role} aria-colindex=${colIndex+1} style=${`grid-column:${colIndex+1}`}>${text}</div>`;const active=colHighlights.find(entry=>entry.highlight.id===activeHighlightId),primary=active??colHighlights[0],accessibleLabel=primary.highlight.label?this.hooks.localize("cellHighlightWithLabel",void 0,{value:text,label:primary.highlight.label}):this.hooks.localize("highlightWithLabel",void 0,{label:text});return html`<div
2
2
  part="${part} cell-highlight"
3
3
  role=${role}
4
+ aria-colindex=${colIndex+1}
4
5
  ?data-active=${!!active}
5
- style=${active?`${colorVar}: var(--lr-color-warning, var(--lr-color-brand))`:""}
6
+ style=${`grid-column:${colIndex+1};${active?`${colorVar}: var(--lr-color-warning, var(--lr-color-brand))`:""}`}
6
7
  >
7
8
  <button
8
9
  part="cell-highlight-action"
@@ -12,4 +13,19 @@ import{html}from"lit";import{parseCellRange}from"../../internal/cell-range.js";i
12
13
  >
13
14
  ${text}
14
15
  </button>
15
- </div>`}revealCell(target){return this.scroll.reveal(target),!!target}scrollColumnIntoView(root,selector,col){return this.scroll.scrollColumnIntoView(root.querySelector(selector),col)}async runSearch(query,loaded,scan){this.search.query=query;const locale=this.hooks.locale();this.lastLocale=locale;const{matches,exact}=collectTableSearchMatches(query,locale,loaded,scan);return this.search.publish(matches,exact),matches.length>0&&await this.hooks.jump(matches[0]),matches.length}async step(direction){return this.search.step(direction)?(await this.hooks.jump(this.search.matches[this.search.activeIndex]),!0):!1}clearSearch(){this.activeRowKey="",this.search.clear()}}export{TableViewerController,TableViewerScrollController,collectTableSearchMatches,tableHighlightsForColumn,tableHighlightsForRow};
16
+ </div>`}columnWindow(key,count,limit=count){if(this.geometryWidth===void 0){const view=this.host.ownerDocument.defaultView,token=view?.getComputedStyle(this.host).getPropertyValue("--lr-size-8rem").trim()||"8rem";if(this.geometryWidth=Math.max(1,resolveCssTokenLength(token,{host:this.host})??1),this.hooks.pageScroll?.()&&view){const rect=this.host.getBoundingClientRect(),leading=view.getComputedStyle(this.host).direction==="rtl"?view.innerWidth-rect.right:rect.left;this.geometryAllocation=Math.max(0,view.innerWidth-Math.max(0,leading)),this.pageOffset=Math.max(0,-leading)}else this.geometryAllocation=this.host.clientWidth}const width=this.geometryWidth,allocation=this.geometryAllocation??0;let window=this.windows.get(key);const offset=this.hooks.pageScroll?.()?this.forcedPageOffset??this.pageOffset:window?.offset??0,start=Math.min(Math.max(0,count-1),Math.max(0,Math.floor(offset/width)-2)),end=Math.min(count,start+Math.max(1,limit),Math.max(start+1,Math.ceil((offset+allocation)/width)+4));return(!window||window.count!==count||window.width!==width||window.start!==start||window.end!==end)&&(window={start,end,count,width,offset,columns:Array.from({length:end-start},(_,index)=>start+index),style:`grid-template-columns:repeat(${count},minmax(var(--lr-size-8rem),1fr));min-inline-size:calc(${count} * var(--lr-size-8rem))`},this.windows.set(key,window)),window}scrollColumns(key,target){this.setColumnOffset(key,Math.abs(target.scrollLeft))}setColumnOffset(key,offset){const window=this.windows.get(key);if(!window||window.offset===offset)return;window.offset=offset;const previous=window.columns;this.columnWindow(key,window.count).columns!==previous&&this.hooks.repaint()}async showColumn(key,col,scroller){const window=this.windows.get(key);if(!(!window||!scroller)&&(col<window.start||col>=window.end)){const rtl=this.host.ownerDocument.defaultView?.getComputedStyle(this.host).direction==="rtl";scroller.scrollLeft=(rtl?-1:1)*col*window.width,this.hooks.pageScroll?.()?(this.forcedPageOffset=col*window.width,this.setColumnOffset(key,this.forcedPageOffset)):this.scrollColumns(key,scroller),await this.host.updateComplete}}rowRenderer(key,inputs,render){const dependencies=[...inputs,this.highlights,this.hooks.locale(),this.hooks.localize("highlightWithLabel"),this.hooks.localize("cellHighlightWithLabel")],existing=this.renderers.get(key);if(existing&&dependencies.length===existing.inputs.length&&dependencies.every((value,index)=>value===existing.inputs[index]))return existing.render;const rows=new Map,memo=(row,index)=>{const existing2=rows.get(index);if(existing2&&existing2.row===row)return existing2.result;const result=render(row,index);return rows.set(index,{row,result}),rows.size>256&&rows.delete(rows.keys().next().value),result};return this.renderers.set(key,{inputs:dependencies,render:memo}),memo}revealCell(target){return this.scroll.reveal(target),!!target}scrollColumnIntoView(root,selector,col){return this.scroll.scrollColumnIntoView(root.querySelector(selector),col)}async runSearch(query,loaded,scan,source=scan){this.search.query=query;const locale=this.hooks.locale();this.lastLocale=locale;const bounded=boundedViewerSearchQuery(query,locale),matches=[];let exact=bounded.accepted;if(loaded&&bounded.accepted&&bounded.needle){let corpus=this.searchCorpus;if(!corpus||corpus.source!==source||corpus.locale!==locale){const budget=new ViewerSearchWorkBudget,fields=[];scan((text,match)=>(fields.push({text:budget.prepare(text,locale),match}),budget.complete)),corpus={source,locale,fields,exact:budget.complete},this.searchCorpus=corpus}exact=corpus.exact;for(const field of corpus.fields)if(field.text?.includes(bounded.needle)){if(matches.length===MAX_TABLE_SEARCH_MATCHES){exact=!1;break}matches.push(field.match)}}return this.search.publish(matches,exact),matches.length>0&&await this.hooks.jump(matches[0]),matches.length}async step(direction){return this.search.step(direction)?await this.hooks.jump(this.search.matches[this.search.activeIndex])!==!1:!1}clearSearch(){this.activeRowKey="",this.search.clear()}}const TABLE_VIEWER_SOURCE_MESSAGE_KEYS={documentPreviewResourceTooLarge:"documentPreviewResourceTooLarge",documentPreviewFailedToLoad:"documentPreviewFailedToLoad",noData:"noData",loadingDocument:"loadingDocument",sourceSearchUnavailable:"sourceSearchUnavailable"};class TableViewerSourceController{constructor(host,chrome,hooks){this.host=host,this.chrome=chrome,this.hooks=hooks,this.locale="",this.limit=0,this.dirty=!0,this.bindingIntent=0,this.sheets=[],this.sheetIndex=0,this.rows=0,this.columns=0,this.slots=[],this.physicalReads=0,this.epoch=0,this.paint=0,this.firstRow=0,this.visibleRows=0,this.windowIntent=0,this.activeRow="",this.windowColumns=[],this.labels=[],this.columnStart=0,this.labelUnits=0,this.loaded=!1,this.pendingPaint=!1,this.sourceRows=this.makeRows(),this.searchRunning=!1,this.onRange=event=>{if(event.stopPropagation(),!this.loaded||event.currentTarget.source!==this.sourceRows)return;const start=Math.min(this.rows,event.detail.start),row=Math.max(0,start-6),visible=Math.max(0,Math.min(this.rows,event.detail.end)-start);row===this.firstRow&&visible===this.visibleRows||(this.visibleRows=visible,this.firstRow=row,this.requestWindow(),this.notify())},this.searchState=new ViewerSearchState(()=>[],detail=>hooks.emitSearch(detail),()=>hooks.repaint()),this.authority=new SourceRequestController(host,{channels:["cells0","cells1","search","reveal"],onReset:()=>this.reset()}),host.addController(this)}get enabled(){return this.hooks.source()!==void 0}get busy(){return this.enabled&&!this.failure&&this.slots.some(slot=>slot.state!=="ready")}makeRows(){return{count:this.rows,itemAt:index=>index,keyAt:index=>index,indexOfKey:key=>typeof key=="number"&&Number.isSafeInteger(key)&&key>=0&&key<this.rows?key:-1}}notify(){if(this.pendingPaint)return;this.pendingPaint=!0;const document=this.host.ownerDocument;queueMicrotask(()=>{this.pendingPaint=!1,this.host.isConnected&&this.host.ownerDocument===document&&this.hooks.repaint()})}reset(){this.epoch++,this.dirty=!0;for(const slot of this.slots)slot.settle(!1);this.slots=[],this.windowColumns=[],this.labels=[],this.labelUnits=0,this.failure=void 0,this.loaded=!1,this.firstRow=0,this.visibleRows=0,this.paint++,this.queuedSearch=void 0,this.notify()}refresh(){this.bindingIntent++,this.hooks.cancelAnchor(),this.authority.refresh()}hostConnected(){this.dirty=!0,this.notify()}hostDisconnected(){this.dirty=!0}adopted(){this.hooks.cancelAnchor(),this.authority.adopted()}update(){const source=this.hooks.source(),intent=this.bindingIntent,locale=this.hooks.locale(),limit=this.hooks.columnLimit();if(!(source===this.bound&&this.failure&&!this.dirty&&locale===this.locale&&limit===this.limit))try{const revision=source===void 0?void 0:sourceRevision(source.revision);if(source===this.bound&&revision===this.revision&&locale===this.locale&&limit===this.limit&&!this.dirty||source!==this.hooks.source()||intent!==this.bindingIntent||(source===this.bound&&(revision!==this.revision||locale!==this.locale||limit!==this.limit)&&this.hooks.cancelAnchor(),this.authority.setSource(source,revision),source!==this.hooks.source()||intent!==this.bindingIntent))return;source===this.bound&&revision===this.revision&&(locale!==this.locale||limit!==this.limit)&&this.authority.refresh();const epoch=this.epoch;if(this.bound=source,this.revision=revision,this.locale=locale,this.limit=limit,this.dirty=!1,this.failure=void 0,this.sheetIndex=0,this.firstRow=0,this.activeRow="",this.searchState.dirty&&this.searchState.clear(),source===void 0){this.theme&&(this.theme.hostDisconnected(),this.host.removeController(this.theme),this.theme=void 0),this.sheets=[],this.sheet=void 0;return}this.theme??=new ThemeWatcher(this.host,()=>this.notify());let sheets;if(this.hooks.workbook){const raw=source.sheets;if(!Array.isArray(raw)||raw.length>256)throw new LyraResourceLimitError;const keys=new Set,names=new Set;sheets=raw.map(entry=>{if(!entry||typeof entry.key!="string"||!entry.key||typeof entry.name!="string"||!entry.name||keys.has(entry.key)||names.has(entry.name))throw new TypeError("Invalid source sheet");if(entry.key.length>65536||entry.name.length>65536)throw new LyraResourceLimitError;return keys.add(entry.key),names.add(entry.name),Object.freeze({key:entry.key,name:entry.name,data:entry.data})})}else sheets=[{key:"",name:"",data:source}];if(!this.current(epoch))return;this.sheets=Object.freeze(sheets),this.selectSheet(0)}catch(error){if(this.hooks.source()!==source)return;this.bound=source,this.locale=locale,this.limit=limit,this.dirty=!1,this.fail(error)}}current(epoch){return epoch===this.epoch&&this.hooks.source()===this.bound&&this.host.isConnected}fail(error){this.failure!==error&&(this.failure=error,this.hooks.error(error),this.notify())}selectSheet(index){this.authority.invalidate("cells0"),this.authority.invalidate("cells1"),this.authority.invalidate("reveal");for(const slot of this.slots)slot.settle(!1);if(this.slots=[],this.windowColumns=[],this.labels=[],this.labelUnits=0,this.firstRow=0,this.visibleRows=0,this.activeRow="",this.sheetIndex=index,this.sheet=this.sheets[index],this.paint++,!this.sheet){this.rows=this.columns=0,this.sourceRows=this.makeRows();return}const data=this.sheet.data,epoch=this.epoch,revision=sourceRevision(data.revision),rows=sourceCount(data.rowCount),columns=sourceCount(data.columnCount);if(rows>=Number.MAX_SAFE_INTEGER||columns>this.limit)throw new LyraResourceLimitError;if(typeof data.columnAt!="function"||typeof data.cellAt=="function"==(typeof data.readCells=="function"))throw new TypeError("Invalid cell source");this.current(epoch)&&(this.sheetRevision=revision,this.rows=rows,this.columns=columns,this.sourceRows=this.makeRows(),this.loaded=!0,this.host.shadowRoot?.querySelector(tag("virtual-list"))?.scrollToIndex(0,{align:"start",behavior:"auto"}))}scalar(value){if(value!=null&&typeof value!="string"&&typeof value!="boolean"&&(typeof value!="number"||!Number.isFinite(value)))throw new TypeError("Invalid source cell");const text=this.hooks.format(value);if(text.length>65536)throw new LyraResourceLimitError;return text}prepareColumns(columns){if(this.windowColumns===columns||!this.sheet)return;const epoch=this.epoch,sheet=this.sheet,labels=[];let units=0;for(const index of columns){const column=sheet.data.columnAt(index);if(!this.current(epoch)||this.sheet!==sheet)return;if(!column||typeof column.key!="string"||!column.key||typeof column.label!="string")throw new TypeError("Invalid source column");if(column.key.length>65536||column.label.length>65536)throw new LyraResourceLimitError;if(units+=column.key.length+column.label.length,units>2e6)throw new LyraResourceLimitError;labels.push(Object.freeze({key:column.key,label:column.label}))}this.labels=labels,this.labelUnits=units,this.windowColumns=columns,this.columnStart=columns[0]??0,this.paint++,this.requestWindow()}requestWindow(){if(!this.sheet||!this.loaded||!this.windowColumns.length||!this.rows||this.failure)return;const epoch=this.epoch,intent=++this.windowIntent,maximum=Math.min(500,Math.floor(1e4/this.windowColumns.length)),first=Math.min(this.firstRow,this.rows-1),demand=Math.min(this.rows-first,this.visibleRows+12),block=Math.min(maximum,Math.max(64,demand));if(demand>maximum*2){this.fail(new LyraResourceLimitError);return}const aligned=Math.floor(first/block)*block,row=first-aligned+demand<=block*2?aligned:first,starts=row+block<this.rows?[row,row+block]:[row],keys=starts.map(start=>`${this.sheetIndex}:${start}:${block}:${this.columnStart}:${this.windowColumns.length}`),previous=this.slots;this.slots=previous.filter(slot=>keys.includes(slot.key));for(const slot of previous)if(!this.slots.includes(slot)&&(slot.settle(!1),this.authority.invalidate(slot.channel),!this.current(epoch)||intent!==this.windowIntent))return;for(let index=0;index<starts.length;index++){if(this.slots.some(slot2=>slot2.key===keys[index]))continue;const channel=this.slots.some(slot2=>slot2.channel==="cells0")?"cells1":"cells0",lease=this.authority.begin(channel,this.locale);if(!lease||!this.current(epoch)||intent!==this.windowIntent)return;let settle;const promise=new Promise(resolve=>{settle=resolve}),slot={key:keys[index],channel,row:starts[index],rows:Math.min(block,this.rows-starts[index]),column:this.columnStart,columns:this.windowColumns.length,lease,source:this.sheet.data,promise,settle,state:"queued",units:0};lease.context.signal.addEventListener("abort",()=>slot.settle(!1),{once:!0}),this.slots.push(slot)}this.paint++,queueMicrotask(()=>this.pump())}pump(){for(;this.physicalReads<2;){const slot=this.slots.find(value=>value.state==="queued"&&value.lease.isCurrent());if(!slot)return;slot.state="loading",this.physicalReads++,this.read(slot)}}async read(slot){try{const source=slot.source,result=source.readCells?await source.readCells(Object.freeze({...slot.lease.context,revision:this.sheetRevision,row:slot.row,rowCount:slot.rows,column:slot.column,columnCount:slot.columns})):void 0;if(!slot.lease.isCurrent()||!this.slots.includes(slot))return;if(result!==void 0&&(!Array.isArray(result)||result.length!==slot.rows))throw new TypeError("Invalid source rectangle");const values=[];let units=this.labelUnits+this.slots.reduce((sum,other)=>sum+(other===slot?0:other.units),0);const initialUnits=units;for(let row=0;row<slot.rows;row++){const input=result?.[row];if(result!==void 0&&(!Array.isArray(input)||input.length!==slot.columns))throw new TypeError("Invalid source rectangle row");const cells=[];for(let col=0;col<slot.columns;col++){const value=result!==void 0?input[col]:source.cellAt(slot.row+row,slot.column+col);if(!slot.lease.isCurrent()||!this.slots.includes(slot))return;const text=this.scalar(value);if(units+=text.length,units>2e6)throw new LyraResourceLimitError;cells.push(text)}values.push(cells)}slot.values=values,slot.units=units-initialUnits,slot.state="ready",slot.settle(!0),this.paint++,this.notify()}catch(error){slot.lease.isCurrent()&&this.slots.includes(slot)&&this.fail(error),slot.settle(!1)}finally{this.physicalReads--,this.pump()}}scrollColumns(target){this.chrome.scrollColumns(this,target)}row(index,style,height){const slot=this.slots.find(value=>index>=value.row&&index<value.row+value.rows&&value.state==="ready"),rawRow=index+1+Number(this.hooks.header()),highlights=this.chrome.highlightsForRow(rawRow,this.hooks.workbook?this.sheet?.name:void 0);return html`<div part="data-row" role="presentation" aria-busy=${slot?"false":"true"} style=${`${style};height:${height}px;overflow:hidden`}>
17
+ ${this.windowColumns.map((column,position)=>this.chrome.renderCell(slot?.values?.[index-slot.row]?.[position]??"",column,highlights,"cell","cell",this.hooks.colorVar,this.hooks.activeHighlight()))}
18
+ </div>`}render(){if(this.failure)return html`<div part="error">${this.hooks.localize(isResourceLimitError(this.failure)?"documentPreviewResourceTooLarge":"documentPreviewFailedToLoad")}</div>`;if(!this.loaded||!this.sheet||!this.columns)return html`<p class="empty-note">${this.hooks.localize("noData")}</p>`;try{const epoch=this.epoch,window=this.chrome.columnWindow(this,this.columns,100);if(this.prepareColumns(window.columns),!this.current(epoch))return html``;if(this.failure)return html`<div part="error">${this.hooks.localize("documentPreviewFailedToLoad")}</div>`;const view=this.host.ownerDocument.defaultView,height=Math.max(1,resolveCssTokenLength(view?.getComputedStyle(this.host).getPropertyValue("--lr-size-3rem").trim()||"3rem",{host:this.host})??48),header=this.hooks.header(),search=this.hooks.workbook?this.bound.search:this.sheet.data.search;return html`
19
+ ${this.hooks.workbook&&this.sheets.length>1?this.hooks.renderSheetTabs?.(this.sheets.map(sheet=>sheet.name),this.sheetIndex,index=>{if(Number.isInteger(index)&&index>=0&&index<this.sheets.length&&index!==this.sheetIndex)try{this.selectSheet(index),this.notify()}catch(error){this.fail(error)}})??nothing:nothing}
20
+ ${this.busy?html`<p part="spinner" class="empty-note">${this.hooks.localize("loadingDocument")}</p>`:nothing}
21
+ ${typeof search!="function"?html`<p part="search-status" class="empty-note">${this.hooks.localize("sourceSearchUnavailable")}</p>`:nothing}
22
+ <div part=${this.hooks.headerPart==="header-cell"?"table":"sheet"} role="table" aria-label=${this.hooks.workbook?this.sheet.name:this.hooks.label(this.rows)} aria-rowcount=${this.rows+Number(header)} aria-colcount=${this.columns}
23
+ @scroll=${event=>{this.chrome.scrollColumns(this,event.currentTarget)}}>
24
+ ${header?html`<div part="header-row" role="row" aria-rowindex="1" style=${window.style}>${this.labels.map((column,index)=>this.chrome.renderCell(column.label,this.columnStart+index,this.chrome.highlightsForRow(1,this.hooks.workbook?this.sheet?.name:void 0),"columnheader",this.hooks.headerPart,this.hooks.colorVar,this.hooks.activeHighlight()))}</div>`:nothing}
25
+ <lr-virtual-list part=${this.hooks.headerPart==="header-cell"?nothing:"rows"} exportparts="data-row:data-row, cell:cell, cell-highlight:cell-highlight, cell-highlight-action:cell-highlight-action"
26
+ .source=${this.sourceRows} .rowHeight=${height} .renderItem=${this.chrome.rowRenderer(this,[this.paint,window.columns,height,header,this.hooks.activeHighlight()],(_row,index)=>this.row(index,window.style,height))}
27
+ .activeItemId=${this.activeRow} item-role="row" .rowIndexOffset=${Number(header)}
28
+ .scrollElement=${this.hooks.pageScroll?.()?view??void 0:void 0}
29
+ @lr-visible-range-change=${this.onRange} @lr-virtual-scroll=${event=>event.stopPropagation()} @lr-load-more=${event=>event.stopPropagation()}
30
+ ></lr-virtual-list>
31
+ </div>`}catch(error){return this.fail(error),html`<div part="error">${this.hooks.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"documentPreviewFailedToLoad")}</div>`}}async revealAnchor(anchor){if(anchor.kind!=="cell-range")return!1;const range=parseCellRange(anchor.range);if(!range)return!1;const name=anchor.sheet??range.sheet;if(!this.hooks.workbook&&name)return!1;const index=name?this.sheets.findIndex(sheet=>sheet.name===name):this.sheetIndex;return this.reveal(index,range.startRow-Number(this.hooks.header()),range.startCol)}async reveal(sheetIndex,row,column){if(this.failure||sheetIndex<0||sheetIndex>=this.sheets.length)return!1;if(sheetIndex!==this.sheetIndex)try{this.selectSheet(sheetIndex),this.notify()}catch(error){return this.fail(error),!1}if(!Number.isSafeInteger(row)||row<(this.hooks.header()?-1:0)||row>=this.rows||!Number.isSafeInteger(column)||column<0||column>=this.columns)return!1;const lease=this.authority.begin("reveal",this.locale);if(!lease||(await this.host.updateComplete,!lease.isCurrent())||(await this.chrome.showColumn(this,column,this.hooks.scrollContainer?.()??this.host.shadowRoot?.querySelector('[part="sheet"]')??null),!lease.isCurrent()))return!1;if(row<0)return this.chrome.revealCell(this.host.shadowRoot?.querySelector(`[part="header-row"] [aria-colindex="${column+1}"]`));if(this.firstRow=row,this.activeRow=row,this.requestWindow(),this.notify(),await this.host.updateComplete,!lease.isCurrent())return!1;const list=this.host.shadowRoot?.querySelector(tag("virtual-list"));if(!list||(list.scrollToIndex(row,{align:"start",behavior:"auto"}),await list.updateComplete,!lease.isCurrent()))return!1;const slot=this.slots.find(value=>row>=value.row&&row<value.row+value.rows&&column>=value.column&&column<value.column+value.columns);if(!slot||!await slot.promise||!lease.isCurrent()||(await this.host.updateComplete,await list.updateComplete,!lease.isCurrent()))return!1;const target=list.shadowRoot?.querySelector(`[data-row-index="${row}"] [aria-colindex="${column+1}"]`);return this.chrome.revealCell(target)&&lease.isCurrent()}async search(query){this.hooks.cancelAnchor(),this.authority.invalidate("search"),this.authority.invalidate("reveal"),this.searchState.query=query;const bounded=boundedViewerSearchQuery(query,this.locale);if(!bounded.needle||!bounded.accepted)return this.searchState.publish([],bounded.accepted),0;const source=this.bound,search=this.hooks.workbook?source?.search:this.sheet?.data.search;if(!source||!search||this.failure)return this.searchState.publish([],!1),0;const lease=this.authority.begin("search",this.locale);return lease?new Promise(resolve=>{lease.context.signal.addEventListener("abort",()=>resolve(0),{once:!0});const run=async()=>{if(!lease.isCurrent()){resolve(0);return}this.searchRunning=!0;try{const result=await search.call(source,Object.freeze({...lease.context,query,limit:MAX_TABLE_SEARCH_MATCHES}));if(!lease.isCurrent())return;if(!result||!Array.isArray(result.hits)||result.hits.length>MAX_TABLE_SEARCH_MATCHES||typeof result.exhaustive!="boolean"||result.total!==null&&sourceCount(result.total)<result.hits.length)throw new TypeError("Invalid source search result");if(result.exhaustive&&result.total!==null&&result.total!==result.hits.length)throw new TypeError("Inconsistent source search total");let exact=result.exhaustive;const hits=[];for(const hit of result.hits){const index=this.hooks.workbook?this.sheets.findIndex(sheet=>sheet.key===hit.sheetKey):0;if(index<0||!Number.isSafeInteger(hit.row)||hit.row<-1||!Number.isSafeInteger(hit.column)||hit.column<0)throw new TypeError("Invalid source search hit");const data=this.sheets[index].data;if(hit.row>=sourceCount(data.rowCount)||hit.column>=sourceCount(data.columnCount)||hit.column>=this.limit)throw new TypeError("Source search hit is out of bounds");if(!lease.isCurrent())return;if(hit.row===-1&&!this.hooks.header()){exact=!1;continue}hits.push({sheetIndex:index,row:hit.row,col:hit.column})}if(!lease.isCurrent())return;this.searchState.publish(hits,exact),hits.length&&await this.reveal(hits[0].sheetIndex,hits[0].row,hits[0].col),lease.isCurrent()&&resolve(hits.length)}catch(error){lease.isCurrent()&&(this.fail(error),this.searchState.publish([],!1),resolve(0))}finally{this.searchRunning=!1;const next=this.queuedSearch;this.queuedSearch=void 0,next&&next()}};this.searchRunning?this.queuedSearch=run:run()}):0}async step(direction){if(!this.searchState.step(direction))return!1;const hit=this.searchState.matches[this.searchState.activeIndex];return this.reveal(hit.sheetIndex,hit.row,hit.col)}clearSearch(){this.hooks.cancelAnchor(),this.authority.invalidate("search"),this.authority.invalidate("reveal"),this.activeRow="",this.searchState.clear(),this.notify()}}export{TABLE_VIEWER_SOURCE_MESSAGE_KEYS,TableViewerController,TableViewerScrollController,TableViewerSourceController,collectTableSearchMatches,tableHighlightsForColumn,tableHighlightsForRow};
@@ -1 +1 @@
1
- import{TEXT_QUOTE_LIMITS}from"../../internal/text-quote.js";import{resolveIntlLocale}from"../../internal/intl-cache.js";const VIEWER_SEARCH_QUERY_LIMIT=TEXT_QUOTE_LIMITS.maxQueryCodeUnits,VIEWER_SEARCH_WORK_LIMIT=TEXT_QUOTE_LIMITS.maxSearchWorkCodeUnits;function boundedViewerSearchQuery(query,locale){if(query.length>VIEWER_SEARCH_QUERY_LIMIT)return{needle:"",accepted:!1};const needle=query.trim().toLocaleLowerCase(resolveIntlLocale(locale));return needle.length<=VIEWER_SEARCH_QUERY_LIMIT?{needle,accepted:!0}:{needle:"",accepted:!1}}class ViewerSearchWorkBudget{constructor(maxWork=VIEWER_SEARCH_WORK_LIMIT){this.complete=!0,this.remaining=Number.isFinite(maxWork)?Math.min(VIEWER_SEARCH_WORK_LIMIT,Math.max(0,Math.floor(maxWork))):VIEWER_SEARCH_WORK_LIMIT}includes(value,needle,locale){return this.includesJoined([value],needle,locale)}consume(value){if(this.remaining<=0)return this.complete=!1,!1;const cost=Math.max(1,value.length);return cost>this.remaining?(this.remaining=0,this.complete=!1,!1):(this.remaining-=cost,!0)}canConsume(value){return this.remaining>0&&Math.max(1,value.length)<=this.remaining}includesJoined(values,needle,locale){const chunks=[],availableWork=this.remaining;let retainedCodeUnits=0,asciiOnly=!0,inspectedAny=!1;for(const value of values){if(inspectedAny=!0,this.remaining<=0){this.complete=!1;break}if(value.length===0){this.remaining--;continue}const retainedLength=Math.min(value.length,this.remaining),chunk=value.slice(0,retainedLength);if(chunks.push(chunk),retainedCodeUnits+=retainedLength,asciiOnly&&/[^\x00-\x7f]/u.test(chunk)&&(asciiOnly=!1),this.remaining-=retainedLength,retainedLength!==value.length){this.complete=!1;break}}inspectedAny||(this.remaining<=0?this.complete=!1:this.remaining--);const maximumFoldedCodeUnits=asciiOnly?retainedCodeUnits:retainedCodeUnits*4;if(retainedCodeUnits+maximumFoldedCodeUnits>availableWork)return this.remaining=0,this.complete=!1,!1;const folded=chunks.join("").toLocaleLowerCase(resolveIntlLocale(locale));return folded.length>this.remaining?(this.remaining=0,this.complete=!1,!1):(this.remaining-=folded.length,folded.includes(needle))}get exhausted(){return this.remaining<=0}}export{VIEWER_SEARCH_QUERY_LIMIT,VIEWER_SEARCH_WORK_LIMIT,ViewerSearchWorkBudget,boundedViewerSearchQuery};
1
+ import{TEXT_QUOTE_LIMITS}from"../../internal/text-quote.js";import{resolveIntlLocale}from"../../internal/intl-cache.js";const VIEWER_SEARCH_QUERY_LIMIT=TEXT_QUOTE_LIMITS.maxQueryCodeUnits,VIEWER_SEARCH_WORK_LIMIT=TEXT_QUOTE_LIMITS.maxSearchWorkCodeUnits;function boundedViewerSearchQuery(query,locale){if(query.length>VIEWER_SEARCH_QUERY_LIMIT)return{needle:"",accepted:!1};const needle=query.trim().toLocaleLowerCase(resolveIntlLocale(locale));return needle.length<=VIEWER_SEARCH_QUERY_LIMIT?{needle,accepted:!0}:{needle:"",accepted:!1}}class ViewerSearchWorkBudget{constructor(maxWork=VIEWER_SEARCH_WORK_LIMIT){this.complete=!0,this.remaining=Number.isFinite(maxWork)?Math.min(VIEWER_SEARCH_WORK_LIMIT,Math.max(0,Math.floor(maxWork))):VIEWER_SEARCH_WORK_LIMIT}includes(value,needle,locale){return this.includesJoined([value],needle,locale)}consume(value){if(this.remaining<=0)return this.complete=!1,!1;const cost=Math.max(1,value.length);return cost>this.remaining?(this.remaining=0,this.complete=!1,!1):(this.remaining-=cost,!0)}canConsume(value){return this.remaining>0&&Math.max(1,value.length)<=this.remaining}prepare(value,locale){return this.foldJoined([value],locale)}includesJoined(values,needle,locale){return this.foldJoined(values,locale)?.includes(needle)??!1}foldJoined(values,locale){const chunks=[],availableWork=this.remaining;let retainedCodeUnits=0,asciiOnly=!0,inspectedAny=!1;for(const value of values){if(inspectedAny=!0,this.remaining<=0){this.complete=!1;break}if(value.length===0){this.remaining--;continue}const retainedLength=Math.min(value.length,this.remaining),chunk=value.slice(0,retainedLength);if(chunks.push(chunk),retainedCodeUnits+=retainedLength,asciiOnly&&/[^\x00-\x7f]/u.test(chunk)&&(asciiOnly=!1),this.remaining-=retainedLength,retainedLength!==value.length){this.complete=!1;break}}inspectedAny||(this.remaining<=0?this.complete=!1:this.remaining--);const maximumFoldedCodeUnits=asciiOnly?retainedCodeUnits:retainedCodeUnits*4;if(retainedCodeUnits+maximumFoldedCodeUnits>availableWork){this.remaining=0,this.complete=!1;return}const folded=chunks.join("").toLocaleLowerCase(resolveIntlLocale(locale));if(folded.length>this.remaining){this.remaining=0,this.complete=!1;return}return this.remaining-=folded.length,folded}get exhausted(){return this.remaining<=0}}export{VIEWER_SEARCH_QUERY_LIMIT,VIEWER_SEARCH_WORK_LIMIT,ViewerSearchWorkBudget,boundedViewerSearchQuery};
@@ -1,7 +1,25 @@
1
- import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{AnchorResultDetail,HighlightActivateDetail,LyraAnchor,LyraAnchorKind}from'../document-viewer/anchors.js';import{type LyraViewerSource}from'../viewer-source.js';import{type LyraClipboardWriteFailure,type LyraClipboardWriteSuccess}from'../../../internal/clipboard.js';import type{LyraSearchChangeDetail}from'../../../internal/text-viewer-target.js';export interface LyraXmlViewerEventMap{'lr-copy':CustomEvent<LyraClipboardWriteSuccess>;'lr-error':CustomEvent<null>;'lr-copy-error':CustomEvent<LyraClipboardWriteFailure>;'lr-search-change':CustomEvent<LyraSearchChangeDetail>;'lr-render-error':CustomEvent<{error:unknown;}>;'lr-anchor-result':CustomEvent<AnchorResultDetail>;'lr-highlight-activate':CustomEvent<HighlightActivateDetail>;}
1
+ import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{AnchorResultDetail,HighlightActivateDetail,LyraAnchor,LyraAnchorKind}from'../document-viewer/anchors.js';import type{LyraHierarchySource,LyraHierarchyQuery,LyraInspectionNode}from'../../../data-sources.js';export type XmlViewerTreeSource=LyraHierarchySource<LyraInspectionNode,LyraHierarchyQuery>;import{type LyraViewerSource}from'../viewer-source.js';import{type LyraClipboardWriteFailure,type LyraClipboardWriteSuccess}from'../../../internal/clipboard.js';import type{LyraSearchChangeDetail}from'../../../internal/text-viewer-target.js';export interface LyraXmlViewerEventMap{'lr-copy':CustomEvent<LyraClipboardWriteSuccess>;'lr-error':CustomEvent<null>;'lr-copy-error':CustomEvent<LyraClipboardWriteFailure>;'lr-search-change':CustomEvent<LyraSearchChangeDetail>;'lr-render-error':CustomEvent<{error:unknown;}>;'lr-anchor-result':CustomEvent<AnchorResultDetail>;'lr-highlight-activate':CustomEvent<HighlightActivateDetail>;}
2
2
  /** Effective XML source authority. Inline presence wins, including an empty string. */
3
3
  export type LyraXmlViewerSource=LyraViewerSource<string>;declare class LyraXmlViewerBase extends LyraElement<LyraXmlViewerEventMap>{}declare const LyraXmlViewer_base:Omit<typeof LyraXmlViewerBase,'prototype'> &(new(...args:ConstructorParameters<typeof LyraXmlViewerBase>)=>InstanceType<typeof LyraXmlViewerBase> &import("../../../lyra.js").LyraAnchorTarget&import("../../../internal/anchor-target.js").DocumentAnchorTargetHooks&{renderAnchorLiveRegion():unknown;});
4
4
  /**
5
+ * Property-only treeSource takes display precedence over xml/src without parsing provider records.
6
+ * The xml setter still parses synchronously; readonly source reports the current legacy text source.
7
+ * Removing treeSource restores current inline XML or normal src loading. Source rows bound each
8
+ * name/path/value to 65,536 UTF-16 units and retained/staged/focused text plus projection state to
9
+ * 2,000,000 units. Source search accepts 4,096 query units and retains at most 10,000 global node
10
+ * hits independent of maxNodes/maxRows; it reveals the first hit. Copy requests complete provider
11
+ * document/subtree/node text within maxBytes, never serialized mounted rows. Compact keys support
12
+ * deep revealSourceKey access; node-path anchors require canonical JSON.stringify(path) keys
13
+ * (at most 256 segments), with exact attribute targets and no promotion to parent elements.
14
+ *
15
+ * @csspart source-list - Source-only bounded virtual scroller.
16
+ * @csspart source-row - Source-only flat tree item with logical hierarchy metadata.
17
+ * @csspart source-toggle - Source-only expansion or retry action.
18
+ * @csspart source-label - Source-only inspection text, copy and highlight content.
19
+ * @csspart source-status - Source-only loading, empty and full-source count status.
20
+ * @csspart source-error - Source-only projection or admission failure.
21
+ * @csspart search-status - Unavailable or partial global provider search status.
22
+ *
5
23
  * `<lr-xml-viewer>` — collapsible, copyable, `DOMParser`-based tree view for XML documents,
6
24
  * mirroring `lr-json-viewer`'s UX (`expand-depth`, `copyable`, structural-path-keyed expand
7
25
  * state that survives a same-shape `xml` reassignment -- e.g. a streaming document being patched
@@ -108,6 +126,20 @@ export type LyraXmlViewerSource=LyraViewerSource<string>;declare class LyraXmlVi
108
126
  * @since 4.0.0
109
127
  */
110
128
  export declare class LyraXmlViewer extends LyraXmlViewer_base{static styles:import("lit").CSSResultGroup[];
129
+ /** Maximum parsed document nodes, from 1 to 500,000; invalid values use 50,000. */
130
+ maxNodes:number;
131
+ /** Maximum displayed tree rows, from 1 to 50,000; invalid values use 5,000. */
132
+ maxRows:number;
133
+ /** Maximum UTF-8 input bytes, from 1 to 262,144,000; invalid values use 26,214,400. */
134
+ maxBytes:number;private _treeSource?;private sourceMode;private sourceSearchDirty;private sourceSearchIntent;private sourceCopyIntent;private sourceNavigationIntent;private sourceAnchorTask?;private sourceSearchTask;private sourceHits?;private sourceHitKeys;private sourceSearchExact;private sourceSearchUnavailable;private sourceBinding?;private sourceAnnouncement?;private readonly hierarchy;
135
+ /** Whole-source inspection provider. Takes display precedence over xml/src; maxNodes, maxRows and expandDepth
136
+ * apply only to legacy XML. The xml setter still parses synchronously. Reassign, including the same identity, or requestUpdate() to refresh.
137
+ * Source search returns at most 10,000 global node hits, independent of maxNodes.
138
+ * @default undefined */
139
+ get treeSource():XmlViewerTreeSource|undefined;set treeSource(value:XmlViewerTreeSource|undefined);
140
+ /** Reveals and focuses an exact provider key; compact keys can address arbitrarily deep nodes.
141
+ * Resolves false when absent, superseded, or no provider is active. */
142
+ revealSourceKey(key:string):Promise<boolean>;private syncSource;private normalizeSourceNode;private invalidateSourceSearch;private searchSource;private stepSourceSearch;private sourceSummary;private hasSourceCopy;private copySource;private sourceCopyButton;private showSourceCopyFeedback;private renderSourceNode;private renderSource;private get effectiveMaxNodes();private get effectiveMaxRows();private get effectiveMaxBytes();
111
143
  /** URL to fetch and parse as XML. Ignored once `xml` is set. */
112
144
  src:string;
113
145
  /** Raw XML text to parse and render, wins over `src`. Setting this parses synchronously;
@@ -131,7 +163,7 @@ copyable:boolean;
131
163
  * instead of growing the page. Invalid values are ignored. */
132
164
  maxHeight:string;
133
165
  /** Anchor kinds this component resolves via `scrollToAnchor()`. */
134
- readonly anchorKinds:readonly LyraAnchorKind[];private xmlState;private expandedOverrides;private activePath;private activeAttr;private activeSearchIndex;private searchQuery;private renderedHighlights;private searchState;private lastSearchLocale;private pendingSearchStateEvent;private generation;private readonly announcements;private copyFeedback;private copyGeneration;private copyTimer?;private get safeExpandDepth();protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private readonly detached;connectedCallback():void;disconnectedCallback():void;private releaseDetachedDocument;adoptedCallback():void;private parseInline;private loadFromSrc;private resetSearchForSourceReplacement;private setDoc;private computeSearch;protected applyAnchor(anchor:LyraAnchor):Promise<boolean>;private resolveHighlights;private highlightActionLabel;private expandAncestors;
166
+ readonly anchorKinds:readonly LyraAnchorKind[];private childCounts;private xmlState;private expandedOverrides;private activePath;private activeAttr;private activeSearchIndex;private searchQuery;private renderedHighlights;private searchState;private lastSearchLocale;private pendingSearchStateEvent;private generation;private explicitRefresh;private highlightDeps?;private treeMemo?;private readonly nodeElements;private readonly attributeElements;private cursorElements;requestUpdate(...args:Parameters<LyraElement['requestUpdate']>):void;private syncCursors;private readonly announcements;private copyFeedback;private copyGeneration;private copyTimer?;private get safeExpandDepth();protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private readonly detached;connectedCallback():void;private readonly cancelSourceAnchor;disconnectedCallback():void;private releaseDetachedDocument;adoptedCallback():void;private parseInline;private loadFromSrc;private resetSearchForSourceReplacement;private setDoc;private computeSearch;private sourcePathKey;protected applyAnchor(anchor:LyraAnchor):Promise<boolean>;private resolveHighlights;private highlightActionLabel;private expandAncestors;
135
167
  /** Case-insensitive substring search over every element's tag name, attribute names/values,
136
168
  * and own text, layered over the already-parsed document -- accepts at most 4,096 query code
137
169
  * units, scans at most 4,000,000 code units, resolves at most 10,000 retained matches, and fires
@@ -147,4 +179,4 @@ search(query:string):Promise<number>;
147
179
  searchNext():Promise<boolean>;
148
180
  /** Moves to the previous match, wrapping to the last before the first. Resolves `true` once the
149
181
  * active match moved, `false` when there are no matches. */
150
- searchPrevious():Promise<boolean>;clearSearch():void;private scrollActiveMatchIntoView;private emitSearchChange;private toggleNode;private isExpanded;private cancelCopyTimer;private resetCopyFeedback;private showCopyFeedback;private copyText;private serializeXml;private copySerializedXml;private copyButtonLabel;private renderCopyButton;private renderNode;private renderLoadedTree;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-xml-viewer':LyraXmlViewer;}}export{};
182
+ searchPrevious():Promise<boolean>;clearSearch():void;private scrollActiveMatchIntoView;private emitSearchChange;private toggleNode;private isExpanded;private cancelCopyTimer;private resetCopyFeedback;private showCopyFeedback;private copyText;private serializeXml;private copySerializedXml;private copyButtonLabel;private renderCopyButton;private renderNode;private renderLoadedTree;private buildLoadedTree;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-xml-viewer':LyraXmlViewer;}}export{};