@aceshooting/lyra-ui 1.2.0 → 2.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 (384) hide show
  1. package/README.md +98 -14
  2. package/custom-elements.json +30279 -12124
  3. package/dist/components/app-rail/app-rail-item.d.ts +30 -0
  4. package/dist/components/app-rail/app-rail-item.js +68 -0
  5. package/dist/components/app-rail/app-rail-item.styles.d.ts +1 -0
  6. package/dist/components/app-rail/app-rail-item.styles.js +65 -0
  7. package/dist/components/app-rail/app-rail.d.ts +168 -0
  8. package/dist/components/app-rail/app-rail.js +419 -0
  9. package/dist/components/app-rail/app-rail.styles.d.ts +1 -0
  10. package/dist/components/app-rail/app-rail.styles.js +128 -0
  11. package/dist/components/attachment-chip/attachment-chip.d.ts +141 -0
  12. package/dist/components/attachment-chip/attachment-chip.js +356 -0
  13. package/dist/components/attachment-chip/attachment-chip.styles.d.ts +1 -0
  14. package/dist/components/attachment-chip/attachment-chip.styles.js +184 -0
  15. package/dist/components/attachment-trigger/attachment-trigger.d.ts +96 -0
  16. package/dist/components/attachment-trigger/attachment-trigger.js +270 -0
  17. package/dist/components/attachment-trigger/attachment-trigger.styles.d.ts +1 -0
  18. package/dist/components/attachment-trigger/attachment-trigger.styles.js +90 -0
  19. package/dist/components/chart/bar-chart.js +2 -18
  20. package/dist/components/chart/box-plot.d.ts +25 -1
  21. package/dist/components/chart/box-plot.js +147 -7
  22. package/dist/components/chart/box-plot.styles.js +13 -0
  23. package/dist/components/chart/bubble-chart.js +2 -18
  24. package/dist/components/chart/chart-loader.d.ts +44 -13
  25. package/dist/components/chart/chart-loader.js +65 -18
  26. package/dist/components/chart/chart.d.ts +55 -12
  27. package/dist/components/chart/chart.js +247 -49
  28. package/dist/components/chart/doughnut-chart.js +2 -18
  29. package/dist/components/chart/histogram-bin.d.ts +7 -1
  30. package/dist/components/chart/histogram-bin.js +32 -14
  31. package/dist/components/chart/histogram.js +8 -16
  32. package/dist/components/chart/line-chart.js +2 -18
  33. package/dist/components/chart/lite-chart.d.ts +134 -3
  34. package/dist/components/chart/lite-chart.js +382 -67
  35. package/dist/components/chart/lite-chart.styles.js +9 -0
  36. package/dist/components/chart/pie-chart.js +2 -18
  37. package/dist/components/chart/polar-area-chart.js +2 -18
  38. package/dist/components/chart/radar-chart.js +2 -18
  39. package/dist/components/chart/scatter-chart.js +2 -18
  40. package/dist/components/chat-composer/chat-composer.d.ts +133 -0
  41. package/dist/components/chat-composer/chat-composer.js +366 -0
  42. package/dist/components/chat-composer/chat-composer.styles.d.ts +1 -0
  43. package/dist/components/chat-composer/chat-composer.styles.js +145 -0
  44. package/dist/components/chat-message/chat-message.d.ts +141 -0
  45. package/dist/components/chat-message/chat-message.js +331 -0
  46. package/dist/components/chat-message/chat-message.styles.d.ts +1 -0
  47. package/dist/components/chat-message/chat-message.styles.js +203 -0
  48. package/dist/components/checkbox/checkbox.d.ts +117 -0
  49. package/dist/components/checkbox/checkbox.js +353 -0
  50. package/dist/components/checkbox/checkbox.styles.d.ts +1 -0
  51. package/dist/components/checkbox/checkbox.styles.js +77 -0
  52. package/dist/components/chip/chip-group.d.ts +56 -0
  53. package/dist/components/chip/chip-group.js +130 -0
  54. package/dist/components/chip/chip-group.styles.d.ts +1 -0
  55. package/dist/components/chip/chip-group.styles.js +57 -0
  56. package/dist/components/chip/chip.d.ts +64 -0
  57. package/dist/components/chip/chip.js +122 -0
  58. package/dist/components/chip/chip.styles.d.ts +1 -0
  59. package/dist/components/chip/chip.styles.js +115 -0
  60. package/dist/components/citation-badge/citation-badge.d.ts +113 -0
  61. package/dist/components/citation-badge/citation-badge.js +318 -0
  62. package/dist/components/citation-badge/citation-badge.styles.d.ts +1 -0
  63. package/dist/components/citation-badge/citation-badge.styles.js +96 -0
  64. package/dist/components/code-block/code-block.d.ts +127 -0
  65. package/dist/components/code-block/code-block.js +382 -0
  66. package/dist/components/code-block/code-block.styles.d.ts +1 -0
  67. package/dist/components/code-block/code-block.styles.js +187 -0
  68. package/dist/components/code-block/code-loader.d.ts +87 -0
  69. package/dist/components/code-block/code-loader.js +142 -0
  70. package/dist/components/combobox/combobox.d.ts +65 -6
  71. package/dist/components/combobox/combobox.js +258 -48
  72. package/dist/components/combobox/combobox.styles.js +3 -3
  73. package/dist/components/combobox/option.d.ts +5 -1
  74. package/dist/components/combobox/option.js +35 -0
  75. package/dist/components/context-meter/context-meter.d.ts +53 -0
  76. package/dist/components/context-meter/context-meter.js +159 -0
  77. package/dist/components/context-meter/context-meter.styles.d.ts +1 -0
  78. package/dist/components/context-meter/context-meter.styles.js +114 -0
  79. package/dist/components/conversation-item/conversation-item.d.ts +125 -0
  80. package/dist/components/conversation-item/conversation-item.js +331 -0
  81. package/dist/components/conversation-item/conversation-item.styles.d.ts +1 -0
  82. package/dist/components/conversation-item/conversation-item.styles.js +155 -0
  83. package/dist/components/date-picker/calendar-core.d.ts +24 -0
  84. package/dist/components/date-picker/calendar-core.js +51 -4
  85. package/dist/components/date-picker/date-input.d.ts +100 -9
  86. package/dist/components/date-picker/date-input.js +383 -66
  87. package/dist/components/date-picker/date-picker.d.ts +35 -4
  88. package/dist/components/date-picker/date-picker.js +171 -44
  89. package/dist/components/dialog/confirm.d.ts +40 -0
  90. package/dist/components/dialog/confirm.js +76 -0
  91. package/dist/components/dialog/dialog.d.ts +129 -0
  92. package/dist/components/dialog/dialog.js +288 -0
  93. package/dist/components/dialog/dialog.styles.d.ts +1 -0
  94. package/dist/components/dialog/dialog.styles.js +96 -0
  95. package/dist/components/dock-panel/dock-panel.d.ts +142 -0
  96. package/dist/components/dock-panel/dock-panel.js +359 -0
  97. package/dist/components/dock-panel/dock-panel.styles.d.ts +1 -0
  98. package/dist/components/dock-panel/dock-panel.styles.js +159 -0
  99. package/dist/components/document-preview/document-preview.d.ts +143 -0
  100. package/dist/components/document-preview/document-preview.js +388 -0
  101. package/dist/components/document-preview/document-preview.styles.d.ts +1 -0
  102. package/dist/components/document-preview/document-preview.styles.js +191 -0
  103. package/dist/components/empty/empty.d.ts +1 -2
  104. package/dist/components/empty/empty.js +18 -12
  105. package/dist/components/empty/empty.styles.js +0 -3
  106. package/dist/components/export-button/csv.js +1 -1
  107. package/dist/components/export-button/export-button.d.ts +12 -0
  108. package/dist/components/export-button/export-button.js +35 -5
  109. package/dist/components/export-button/export-button.styles.js +5 -1
  110. package/dist/components/file-input/accept.js +2 -0
  111. package/dist/components/file-input/file-input.d.ts +10 -1
  112. package/dist/components/file-input/file-input.js +36 -5
  113. package/dist/components/flag/flag.d.ts +29 -13
  114. package/dist/components/flag/flag.js +54 -14
  115. package/dist/components/flag/flag.styles.js +1 -1
  116. package/dist/components/flag/language-map.d.ts +4 -1
  117. package/dist/components/flag/language-map.js +6 -3
  118. package/dist/components/gauge/gauge.d.ts +10 -1
  119. package/dist/components/gauge/gauge.js +41 -13
  120. package/dist/components/generation-status/generation-status.d.ts +117 -0
  121. package/dist/components/generation-status/generation-status.js +327 -0
  122. package/dist/components/generation-status/generation-status.styles.d.ts +1 -0
  123. package/dist/components/generation-status/generation-status.styles.js +84 -0
  124. package/dist/components/graph/graph.d.ts +37 -3
  125. package/dist/components/graph/graph.js +132 -20
  126. package/dist/components/heatmap/calendar-grid.d.ts +19 -7
  127. package/dist/components/heatmap/calendar-grid.js +42 -18
  128. package/dist/components/heatmap/heatmap-scale.d.ts +11 -1
  129. package/dist/components/heatmap/heatmap-scale.js +14 -2
  130. package/dist/components/heatmap/heatmap.d.ts +227 -12
  131. package/dist/components/heatmap/heatmap.js +488 -93
  132. package/dist/components/json-viewer/json-viewer.d.ts +70 -0
  133. package/dist/components/json-viewer/json-viewer.js +361 -0
  134. package/dist/components/json-viewer/json-viewer.styles.d.ts +1 -0
  135. package/dist/components/json-viewer/json-viewer.styles.js +177 -0
  136. package/dist/components/kbd/kbd.d.ts +77 -0
  137. package/dist/components/kbd/kbd.js +231 -0
  138. package/dist/components/kbd/kbd.styles.d.ts +1 -0
  139. package/dist/components/kbd/kbd.styles.js +52 -0
  140. package/dist/components/live-region/live-region.d.ts +90 -0
  141. package/dist/components/live-region/live-region.js +189 -0
  142. package/dist/components/live-region/live-region.styles.d.ts +1 -0
  143. package/dist/components/live-region/live-region.styles.js +10 -0
  144. package/dist/components/map/map.d.ts +32 -7
  145. package/dist/components/map/map.js +133 -32
  146. package/dist/components/markdown/markdown-loader.d.ts +58 -0
  147. package/dist/components/markdown/markdown-loader.js +77 -0
  148. package/dist/components/markdown/markdown.d.ts +119 -0
  149. package/dist/components/markdown/markdown.js +389 -0
  150. package/dist/components/markdown/markdown.styles.d.ts +1 -0
  151. package/dist/components/markdown/markdown.styles.js +88 -0
  152. package/dist/components/media-card/media-card.d.ts +130 -0
  153. package/dist/components/media-card/media-card.js +273 -0
  154. package/dist/components/media-card/media-card.styles.d.ts +1 -0
  155. package/dist/components/media-card/media-card.styles.js +132 -0
  156. package/dist/components/mention-popover/mention-popover.d.ts +203 -0
  157. package/dist/components/mention-popover/mention-popover.js +493 -0
  158. package/dist/components/mention-popover/mention-popover.styles.d.ts +1 -0
  159. package/dist/components/mention-popover/mention-popover.styles.js +101 -0
  160. package/dist/components/menu/menu-item.d.ts +91 -0
  161. package/dist/components/menu/menu-item.js +206 -0
  162. package/dist/components/menu/menu-item.styles.d.ts +1 -0
  163. package/dist/components/menu/menu-item.styles.js +75 -0
  164. package/dist/components/menu/menu.d.ts +167 -0
  165. package/dist/components/menu/menu.js +461 -0
  166. package/dist/components/menu/menu.styles.d.ts +1 -0
  167. package/dist/components/menu/menu.styles.js +67 -0
  168. package/dist/components/model-select/model-select.d.ts +170 -0
  169. package/dist/components/model-select/model-select.js +588 -0
  170. package/dist/components/model-select/model-select.styles.d.ts +1 -0
  171. package/dist/components/model-select/model-select.styles.js +203 -0
  172. package/dist/components/model-settings-panel/model-settings-panel.d.ts +93 -0
  173. package/dist/components/model-settings-panel/model-settings-panel.js +209 -0
  174. package/dist/components/model-settings-panel/model-settings-panel.styles.d.ts +1 -0
  175. package/dist/components/model-settings-panel/model-settings-panel.styles.js +82 -0
  176. package/dist/components/playback/playback.d.ts +19 -3
  177. package/dist/components/playback/playback.js +109 -33
  178. package/dist/components/playback/playback.styles.js +6 -1
  179. package/dist/components/responsive-panel/responsive-panel.d.ts +163 -0
  180. package/dist/components/responsive-panel/responsive-panel.js +363 -0
  181. package/dist/components/responsive-panel/responsive-panel.styles.d.ts +1 -0
  182. package/dist/components/responsive-panel/responsive-panel.styles.js +103 -0
  183. package/dist/components/result-card/result-card.d.ts +50 -0
  184. package/dist/components/result-card/result-card.js +89 -0
  185. package/dist/components/result-card/result-card.styles.d.ts +1 -0
  186. package/dist/components/result-card/result-card.styles.js +49 -0
  187. package/dist/components/result-card/result-field.d.ts +36 -0
  188. package/dist/components/result-card/result-field.js +87 -0
  189. package/dist/components/result-card/result-field.styles.d.ts +1 -0
  190. package/dist/components/result-card/result-field.styles.js +32 -0
  191. package/dist/components/select/select.d.ts +84 -4
  192. package/dist/components/select/select.js +251 -36
  193. package/dist/components/skeleton/skeleton.d.ts +3 -0
  194. package/dist/components/skeleton/skeleton.js +7 -1
  195. package/dist/components/skeleton/skeleton.styles.js +5 -4
  196. package/dist/components/slider/slider.d.ts +141 -0
  197. package/dist/components/slider/slider.js +467 -0
  198. package/dist/components/slider/slider.styles.d.ts +1 -0
  199. package/dist/components/slider/slider.styles.js +87 -0
  200. package/dist/components/source-card/source-card.d.ts +104 -0
  201. package/dist/components/source-card/source-card.js +195 -0
  202. package/dist/components/source-card/source-card.styles.d.ts +1 -0
  203. package/dist/components/source-card/source-card.styles.js +69 -0
  204. package/dist/components/source-list/source-list.d.ts +63 -0
  205. package/dist/components/source-list/source-list.js +130 -0
  206. package/dist/components/source-list/source-list.styles.d.ts +1 -0
  207. package/dist/components/source-list/source-list.styles.js +59 -0
  208. package/dist/components/sparkline/sparkline.js +58 -20
  209. package/dist/components/split/split.d.ts +224 -5
  210. package/dist/components/split/split.js +617 -43
  211. package/dist/components/split/split.styles.js +47 -0
  212. package/dist/components/stat/stat.d.ts +15 -4
  213. package/dist/components/stat/stat.js +53 -12
  214. package/dist/components/stream-status/stream-status.d.ts +126 -0
  215. package/dist/components/stream-status/stream-status.js +292 -0
  216. package/dist/components/stream-status/stream-status.styles.d.ts +1 -0
  217. package/dist/components/stream-status/stream-status.styles.js +103 -0
  218. package/dist/components/streaming-text/streaming-text.d.ts +104 -0
  219. package/dist/components/streaming-text/streaming-text.js +224 -0
  220. package/dist/components/streaming-text/streaming-text.styles.d.ts +1 -0
  221. package/dist/components/streaming-text/streaming-text.styles.js +63 -0
  222. package/dist/components/switch/switch.d.ts +103 -0
  223. package/dist/components/switch/switch.js +250 -0
  224. package/dist/components/switch/switch.styles.d.ts +1 -0
  225. package/dist/components/switch/switch.styles.js +75 -0
  226. package/dist/components/table/table.d.ts +89 -5
  227. package/dist/components/table/table.js +243 -26
  228. package/dist/components/table/table.styles.js +6 -1
  229. package/dist/components/tabs/tabs.d.ts +74 -0
  230. package/dist/components/tabs/tabs.js +254 -0
  231. package/dist/components/tabs/tabs.styles.d.ts +1 -0
  232. package/dist/components/tabs/tabs.styles.js +74 -0
  233. package/dist/components/thinking-panel/thinking-panel.d.ts +123 -0
  234. package/dist/components/thinking-panel/thinking-panel.js +260 -0
  235. package/dist/components/thinking-panel/thinking-panel.styles.d.ts +1 -0
  236. package/dist/components/thinking-panel/thinking-panel.styles.js +123 -0
  237. package/dist/components/time-range/time-range.d.ts +59 -2
  238. package/dist/components/time-range/time-range.js +163 -67
  239. package/dist/components/toast/toast-item.d.ts +12 -2
  240. package/dist/components/toast/toast-item.js +106 -44
  241. package/dist/components/toast/toast-item.styles.js +59 -28
  242. package/dist/components/toast/toast.js +17 -5
  243. package/dist/components/toast/toaster.js +10 -1
  244. package/dist/components/tool-approval-dialog/tool-approval-dialog.d.ts +131 -0
  245. package/dist/components/tool-approval-dialog/tool-approval-dialog.js +329 -0
  246. package/dist/components/tool-approval-dialog/tool-approval-dialog.styles.d.ts +1 -0
  247. package/dist/components/tool-approval-dialog/tool-approval-dialog.styles.js +160 -0
  248. package/dist/components/tool-call-chip/tool-call-chip.d.ts +105 -0
  249. package/dist/components/tool-call-chip/tool-call-chip.js +349 -0
  250. package/dist/components/tool-call-chip/tool-call-chip.styles.d.ts +1 -0
  251. package/dist/components/tool-call-chip/tool-call-chip.styles.js +203 -0
  252. package/dist/components/tool-param-form/tool-param-form.d.ts +206 -0
  253. package/dist/components/tool-param-form/tool-param-form.js +610 -0
  254. package/dist/components/tool-param-form/tool-param-form.styles.d.ts +1 -0
  255. package/dist/components/tool-param-form/tool-param-form.styles.js +75 -0
  256. package/dist/components/tool-result-dialog/tool-result-dialog.d.ts +122 -0
  257. package/dist/components/tool-result-dialog/tool-result-dialog.js +358 -0
  258. package/dist/components/tool-result-dialog/tool-result-dialog.styles.d.ts +1 -0
  259. package/dist/components/tool-result-dialog/tool-result-dialog.styles.js +176 -0
  260. package/dist/components/tool-result-view/registry.d.ts +73 -0
  261. package/dist/components/tool-result-view/registry.js +89 -0
  262. package/dist/components/tool-result-view/tool-result-view.d.ts +58 -0
  263. package/dist/components/tool-result-view/tool-result-view.js +152 -0
  264. package/dist/components/tool-result-view/tool-result-view.styles.d.ts +1 -0
  265. package/dist/components/tool-result-view/tool-result-view.styles.js +13 -0
  266. package/dist/components/tool-select-dialog/tool-select-dialog.d.ts +151 -0
  267. package/dist/components/tool-select-dialog/tool-select-dialog.js +350 -0
  268. package/dist/components/tool-select-dialog/tool-select-dialog.styles.d.ts +1 -0
  269. package/dist/components/tool-select-dialog/tool-select-dialog.styles.js +191 -0
  270. package/dist/components/tree/tree-node.d.ts +15 -3
  271. package/dist/components/tree/tree-node.js +20 -7
  272. package/dist/components/tree/tree.d.ts +25 -10
  273. package/dist/components/tree/tree.js +39 -31
  274. package/dist/components/typing-indicator/typing-indicator.d.ts +70 -0
  275. package/dist/components/typing-indicator/typing-indicator.js +108 -0
  276. package/dist/components/typing-indicator/typing-indicator.styles.d.ts +1 -0
  277. package/dist/components/typing-indicator/typing-indicator.styles.js +132 -0
  278. package/dist/components/virtual-list/virtual-list.d.ts +210 -0
  279. package/dist/components/virtual-list/virtual-list.js +607 -0
  280. package/dist/components/virtual-list/virtual-list.styles.d.ts +1 -0
  281. package/dist/components/virtual-list/virtual-list.styles.js +56 -0
  282. package/dist/components/widget/widget.d.ts +5 -4
  283. package/dist/components/widget/widget.js +54 -120
  284. package/dist/components/widget/widget.styles.js +8 -2
  285. package/dist/components/word-cloud/word-cloud-layout.d.ts +7 -0
  286. package/dist/components/word-cloud/word-cloud-layout.js +29 -2
  287. package/dist/components/word-cloud/word-cloud.d.ts +28 -2
  288. package/dist/components/word-cloud/word-cloud.js +69 -19
  289. package/dist/components/word-cloud/word-cloud.styles.js +16 -3
  290. package/dist/internal/anchored-validity.d.ts +1 -0
  291. package/dist/internal/anchored-validity.js +86 -0
  292. package/dist/internal/announcer.d.ts +57 -0
  293. package/dist/internal/announcer.js +71 -0
  294. package/dist/internal/form-associated.d.ts +8 -0
  295. package/dist/internal/form-associated.js +98 -15
  296. package/dist/internal/group-by-recency.d.ts +50 -0
  297. package/dist/internal/group-by-recency.js +80 -0
  298. package/dist/internal/numbers.d.ts +12 -0
  299. package/dist/internal/numbers.js +26 -0
  300. package/dist/internal/overlay-manager.d.ts +51 -0
  301. package/dist/internal/overlay-manager.js +523 -0
  302. package/dist/internal/positioner.js +27 -3
  303. package/dist/internal/rtl.d.ts +23 -0
  304. package/dist/internal/rtl.js +28 -0
  305. package/dist/internal/safe-url.d.ts +12 -0
  306. package/dist/internal/safe-url.js +41 -0
  307. package/dist/internal/scroll-lock.d.ts +10 -5
  308. package/dist/internal/scroll-lock.js +30 -14
  309. package/dist/internal/tokens.styles.js +22 -10
  310. package/dist/lyra.d.ts +133 -31
  311. package/dist/lyra.js +96 -26
  312. package/llms-full.txt +4546 -183
  313. package/llms.txt +21 -5
  314. package/package.json +41 -6
  315. package/dist/components/chart/bar-chart.stories.d.ts +0 -5
  316. package/dist/components/chart/bar-chart.stories.js +0 -20
  317. package/dist/components/chart/box-plot.stories.d.ts +0 -5
  318. package/dist/components/chart/box-plot.stories.js +0 -29
  319. package/dist/components/chart/bubble-chart.stories.d.ts +0 -5
  320. package/dist/components/chart/bubble-chart.stories.js +0 -26
  321. package/dist/components/chart/chart.stories.d.ts +0 -32
  322. package/dist/components/chart/chart.stories.js +0 -141
  323. package/dist/components/chart/doughnut-chart.stories.d.ts +0 -5
  324. package/dist/components/chart/doughnut-chart.stories.js +0 -26
  325. package/dist/components/chart/histogram.stories.d.ts +0 -5
  326. package/dist/components/chart/histogram.stories.js +0 -17
  327. package/dist/components/chart/line-chart.stories.d.ts +0 -22
  328. package/dist/components/chart/line-chart.stories.js +0 -99
  329. package/dist/components/chart/lite-chart.stories.d.ts +0 -14
  330. package/dist/components/chart/lite-chart.stories.js +0 -114
  331. package/dist/components/chart/pie-chart.stories.d.ts +0 -5
  332. package/dist/components/chart/pie-chart.stories.js +0 -26
  333. package/dist/components/chart/polar-area-chart.stories.d.ts +0 -5
  334. package/dist/components/chart/polar-area-chart.stories.js +0 -20
  335. package/dist/components/chart/radar-chart.stories.d.ts +0 -5
  336. package/dist/components/chart/radar-chart.stories.js +0 -20
  337. package/dist/components/chart/scatter-chart.stories.d.ts +0 -5
  338. package/dist/components/chart/scatter-chart.stories.js +0 -31
  339. package/dist/components/combobox/combobox.stories.d.ts +0 -24
  340. package/dist/components/combobox/combobox.stories.js +0 -102
  341. package/dist/components/date-picker/date-input.stories.d.ts +0 -10
  342. package/dist/components/date-picker/date-input.stories.js +0 -48
  343. package/dist/components/date-picker/date-picker.stories.d.ts +0 -10
  344. package/dist/components/date-picker/date-picker.stories.js +0 -25
  345. package/dist/components/empty/empty.stories.d.ts +0 -7
  346. package/dist/components/empty/empty.stories.js +0 -34
  347. package/dist/components/export-button/export-button.stories.d.ts +0 -7
  348. package/dist/components/export-button/export-button.stories.js +0 -37
  349. package/dist/components/file-input/file-input.stories.d.ts +0 -7
  350. package/dist/components/file-input/file-input.stories.js +0 -19
  351. package/dist/components/flag/flag.stories.d.ts +0 -6
  352. package/dist/components/flag/flag.stories.js +0 -31
  353. package/dist/components/gauge/gauge.stories.d.ts +0 -8
  354. package/dist/components/gauge/gauge.stories.js +0 -19
  355. package/dist/components/graph/graph.stories.d.ts +0 -8
  356. package/dist/components/graph/graph.stories.js +0 -68
  357. package/dist/components/heatmap/heatmap.stories.d.ts +0 -27
  358. package/dist/components/heatmap/heatmap.stories.js +0 -179
  359. package/dist/components/map/map.stories.d.ts +0 -15
  360. package/dist/components/map/map.stories.js +0 -135
  361. package/dist/components/playback/playback.stories.d.ts +0 -7
  362. package/dist/components/playback/playback.stories.js +0 -16
  363. package/dist/components/select/select.stories.d.ts +0 -21
  364. package/dist/components/select/select.stories.js +0 -91
  365. package/dist/components/skeleton/skeleton.stories.d.ts +0 -5
  366. package/dist/components/skeleton/skeleton.stories.js +0 -16
  367. package/dist/components/sparkline/sparkline.stories.d.ts +0 -11
  368. package/dist/components/sparkline/sparkline.stories.js +0 -39
  369. package/dist/components/split/split.stories.d.ts +0 -7
  370. package/dist/components/split/split.stories.js +0 -36
  371. package/dist/components/stat/stat.stories.d.ts +0 -9
  372. package/dist/components/stat/stat.stories.js +0 -81
  373. package/dist/components/table/table.stories.d.ts +0 -12
  374. package/dist/components/table/table.stories.js +0 -67
  375. package/dist/components/time-range/time-range.stories.d.ts +0 -8
  376. package/dist/components/time-range/time-range.stories.js +0 -26
  377. package/dist/components/toast/toast.stories.d.ts +0 -8
  378. package/dist/components/toast/toast.stories.js +0 -72
  379. package/dist/components/tree/tree.stories.d.ts +0 -9
  380. package/dist/components/tree/tree.stories.js +0 -52
  381. package/dist/components/widget/widget.stories.d.ts +0 -9
  382. package/dist/components/widget/widget.stories.js +0 -74
  383. package/dist/components/word-cloud/word-cloud.stories.d.ts +0 -10
  384. package/dist/components/word-cloud/word-cloud.stories.js +0 -55
@@ -0,0 +1,523 @@
1
+ const FOCUSABLE_SELECTOR = [
2
+ 'a[href]',
3
+ 'area[href]',
4
+ 'audio[controls]',
5
+ 'button:not([disabled])',
6
+ 'iframe',
7
+ 'input:not([disabled]):not([type="hidden"])',
8
+ 'select:not([disabled])',
9
+ 'summary',
10
+ 'textarea:not([disabled])',
11
+ 'video[controls]',
12
+ '[contenteditable]:not([contenteditable="false"])',
13
+ '[tabindex]',
14
+ ].join(', ');
15
+ const STACK_PROPERTY = '--lyra-overlay-stack-index';
16
+ const STACK_BASE = 1000;
17
+ const STACK_STEP = 2;
18
+ const states = new WeakMap();
19
+ const hostEntries = new WeakMap();
20
+ /** Returns the deepest focused descendant across open shadow roots. */
21
+ export function deepActiveElement(doc = document) {
22
+ let active = doc.activeElement;
23
+ while (active) {
24
+ const inner = active.shadowRoot?.activeElement ?? null;
25
+ if (!inner)
26
+ break;
27
+ active = inner;
28
+ }
29
+ return active;
30
+ }
31
+ function isSlot(element) {
32
+ return element.localName === 'slot' && typeof element.assignedElements === 'function';
33
+ }
34
+ function composedParent(element) {
35
+ if (element.assignedSlot)
36
+ return element.assignedSlot;
37
+ if (element.parentElement)
38
+ return element.parentElement;
39
+ const root = element.getRootNode();
40
+ return root.host ?? null;
41
+ }
42
+ export function composedContains(container, candidate) {
43
+ let current = candidate;
44
+ while (current) {
45
+ if (current === container)
46
+ return true;
47
+ current = composedParent(current);
48
+ }
49
+ return false;
50
+ }
51
+ function hasInertAncestor(element) {
52
+ let current = element;
53
+ while (current) {
54
+ if (current.inert)
55
+ return true;
56
+ current = composedParent(current);
57
+ }
58
+ return false;
59
+ }
60
+ function isRendered(element) {
61
+ if (element.hidden || element.getAttribute('aria-hidden') === 'true' || hasInertAncestor(element))
62
+ return false;
63
+ if (element.ownerDocument.defaultView?.getComputedStyle(element).visibility !== 'visible')
64
+ return false;
65
+ return element.checkVisibility ? element.checkVisibility() : element.getClientRects().length > 0;
66
+ }
67
+ function isTabbable(element) {
68
+ if (element.tabIndex < 0 || element.matches(':disabled'))
69
+ return false;
70
+ return isRendered(element);
71
+ }
72
+ function collectFocusable(element, result) {
73
+ if (element.matches(FOCUSABLE_SELECTOR) && isTabbable(element))
74
+ result.push(element);
75
+ if (isSlot(element)) {
76
+ const hasAssignedNodes = element.assignedNodes().length > 0;
77
+ const assigned = element
78
+ .assignedNodes({ flatten: true })
79
+ .filter((node) => node.nodeType === 1);
80
+ const children = hasAssignedNodes ? assigned : Array.from(element.children);
81
+ for (const child of children)
82
+ collectFocusable(child, result);
83
+ return;
84
+ }
85
+ const container = element.shadowRoot ?? element;
86
+ for (const child of Array.from(container.children))
87
+ collectFocusable(child, result);
88
+ }
89
+ /** Collects rendered focus targets through slots and nested open shadow roots in browser tab order. */
90
+ export function collectFocusableElements(root) {
91
+ const result = [];
92
+ if ('matches' in root) {
93
+ collectFocusable(root, result);
94
+ }
95
+ else {
96
+ for (const child of Array.from(root.children))
97
+ collectFocusable(child, result);
98
+ }
99
+ const radioGroups = [];
100
+ for (const element of result) {
101
+ if (element.localName !== 'input')
102
+ continue;
103
+ const input = element;
104
+ if (input.type !== 'radio' || input.name === '')
105
+ continue;
106
+ let group = radioGroups.find((candidate) => candidate.name === input.name && candidate.form === input.form && candidate.root === input.getRootNode());
107
+ if (!group) {
108
+ group = { name: input.name, form: input.form, root: input.getRootNode(), members: [] };
109
+ radioGroups.push(group);
110
+ }
111
+ group.members.push(input);
112
+ }
113
+ const excludedRadios = new Set();
114
+ for (const group of radioGroups) {
115
+ const tabStop = group.members.find((radio) => radio.checked) ?? group.members[0];
116
+ for (const radio of group.members) {
117
+ if (radio !== tabStop)
118
+ excludedRadios.add(radio);
119
+ }
120
+ }
121
+ return result
122
+ .filter((element) => !excludedRadios.has(element))
123
+ .map((element, index) => ({ element, index }))
124
+ .sort((a, b) => {
125
+ const aPositive = a.element.tabIndex > 0;
126
+ const bPositive = b.element.tabIndex > 0;
127
+ if (aPositive !== bPositive)
128
+ return aPositive ? -1 : 1;
129
+ if (aPositive && a.element.tabIndex !== b.element.tabIndex)
130
+ return a.element.tabIndex - b.element.tabIndex;
131
+ return a.index - b.index;
132
+ })
133
+ .map(({ element }) => element);
134
+ }
135
+ function tryFocus(target) {
136
+ if (!target?.isConnected || !isRendered(target) || target.matches(':disabled'))
137
+ return false;
138
+ target.focus();
139
+ const active = deepActiveElement(target.ownerDocument);
140
+ return active === target || composedContains(target, active);
141
+ }
142
+ function focusEntry(entry, backwards = false, preserveCurrent = true) {
143
+ const panel = entry.options.panel();
144
+ if (!panel)
145
+ return;
146
+ const active = deepActiveElement(entry.state.document);
147
+ if (preserveCurrent && composedContains(panel, active))
148
+ return;
149
+ const preferred = entry.options.preferredInitialFocus?.() ?? null;
150
+ if (preferred && composedContains(panel, preferred) && tryFocus(preferred))
151
+ return;
152
+ const focusable = collectFocusableElements(panel);
153
+ const ordered = backwards ? focusable.reverse() : focusable;
154
+ for (const target of ordered) {
155
+ if (tryFocus(target))
156
+ return;
157
+ }
158
+ panel.focus();
159
+ }
160
+ function handleTab(state, entry, event) {
161
+ const panel = entry.options.panel();
162
+ if (!panel)
163
+ return;
164
+ const focusable = collectFocusableElements(panel);
165
+ if (focusable.length === 0) {
166
+ event.preventDefault();
167
+ panel.focus();
168
+ return;
169
+ }
170
+ const active = deepActiveElement(state.document);
171
+ const first = focusable[0];
172
+ const last = focusable[focusable.length - 1];
173
+ const activeIndex = active ? focusable.indexOf(active) : -1;
174
+ if (activeIndex === -1) {
175
+ event.preventDefault();
176
+ (event.shiftKey ? last : first).focus();
177
+ }
178
+ else if (event.shiftKey && active === first) {
179
+ event.preventDefault();
180
+ last.focus();
181
+ }
182
+ else if (!event.shiftKey && active === last) {
183
+ event.preventDefault();
184
+ first.focus();
185
+ }
186
+ }
187
+ function scheduleInertUpdate(state) {
188
+ if (state.inertUpdateQueued)
189
+ return;
190
+ state.inertUpdateQueued = true;
191
+ queueMicrotask(() => {
192
+ state.inertUpdateQueued = false;
193
+ applyTopmostInert(state);
194
+ });
195
+ }
196
+ function handleMutations(state, records) {
197
+ let needsInertUpdate = false;
198
+ for (let index = 0; index < records.length; index++) {
199
+ const record = records[index];
200
+ if (record.type === 'childList') {
201
+ needsInertUpdate = true;
202
+ continue;
203
+ }
204
+ if (record.type !== 'attributes' || record.attributeName !== 'inert')
205
+ continue;
206
+ const element = record.target;
207
+ let nextRecord;
208
+ for (let nextIndex = index + 1; nextIndex < records.length; nextIndex++) {
209
+ const candidate = records[nextIndex];
210
+ if (candidate.type === 'attributes' && candidate.attributeName === 'inert' && candidate.target === element) {
211
+ nextRecord = candidate;
212
+ break;
213
+ }
214
+ }
215
+ const newValue = nextRecord ? nextRecord.oldValue !== null : element.hasAttribute('inert');
216
+ const pending = state.pendingInertWrites.get(element);
217
+ if (pending?.[0] === newValue) {
218
+ pending.shift();
219
+ if (pending.length === 0)
220
+ state.pendingInertWrites.delete(element);
221
+ continue;
222
+ }
223
+ if (state.inerted.has(element)) {
224
+ state.inerted.set(element, newValue);
225
+ needsInertUpdate = true;
226
+ }
227
+ }
228
+ if (needsInertUpdate)
229
+ scheduleInertUpdate(state);
230
+ }
231
+ const mutationObserverOptions = {
232
+ attributeFilter: ['inert'],
233
+ attributeOldValue: true,
234
+ attributes: true,
235
+ childList: true,
236
+ subtree: true,
237
+ };
238
+ function observeMutationRoot(state, root) {
239
+ if (!state.observer || state.observedRoots.has(root))
240
+ return;
241
+ state.observer.observe(root === state.document ? state.document.documentElement : root, mutationObserverOptions);
242
+ state.observedRoots.add(root);
243
+ }
244
+ function startState(state) {
245
+ state.document.addEventListener('keydown', state.onKeyDown);
246
+ const Observer = state.document.defaultView?.MutationObserver ?? MutationObserver;
247
+ state.observer = new Observer((records) => handleMutations(state, records));
248
+ observeMutationRoot(state, state.document);
249
+ }
250
+ function stopState(state) {
251
+ state.document.removeEventListener('keydown', state.onKeyDown);
252
+ state.observer?.disconnect();
253
+ state.observer = undefined;
254
+ state.observedRoots.clear();
255
+ state.pendingInertWrites.clear();
256
+ }
257
+ function createState(doc) {
258
+ const state = {};
259
+ state.document = doc;
260
+ state.stack = [];
261
+ state.nextStackOrder = 0;
262
+ state.inerted = new Map();
263
+ state.pendingInertWrites = new Map();
264
+ state.observedRoots = new Set();
265
+ state.inertUpdateQueued = false;
266
+ state.onKeyDown = (event) => {
267
+ if (event.defaultPrevented || event.isComposing)
268
+ return;
269
+ const entry = state.stack[state.stack.length - 1];
270
+ if (!entry)
271
+ return;
272
+ if (event.key === 'Escape') {
273
+ event.preventDefault();
274
+ entry.options.onEscape();
275
+ }
276
+ else if (event.key === 'Tab') {
277
+ if (entry.options.trapFocus === false)
278
+ entry.options.onTab?.();
279
+ else
280
+ handleTab(state, entry, event);
281
+ }
282
+ };
283
+ states.set(doc, state);
284
+ return state;
285
+ }
286
+ function stateFor(doc) {
287
+ return states.get(doc) ?? createState(doc);
288
+ }
289
+ function setInertByManager(state, element, value) {
290
+ if (element.inert === value)
291
+ return;
292
+ if (state.observer && state.observedRoots.has(element.getRootNode())) {
293
+ let pending = state.pendingInertWrites.get(element);
294
+ if (!pending) {
295
+ pending = [];
296
+ state.pendingInertWrites.set(element, pending);
297
+ }
298
+ pending.push(value);
299
+ }
300
+ else {
301
+ // No mutation record will be delivered for a detached element or for an
302
+ // element in a shadow root outside this state's observed document tree.
303
+ state.pendingInertWrites.delete(element);
304
+ }
305
+ element.inert = value;
306
+ }
307
+ function inertElement(state, element, desired) {
308
+ if (!('inert' in element))
309
+ return;
310
+ const htmlElement = element;
311
+ desired.add(htmlElement);
312
+ if (!state.inerted.has(htmlElement))
313
+ state.inerted.set(htmlElement, htmlElement.inert);
314
+ setInertByManager(state, htmlElement, true);
315
+ }
316
+ function pathParent(element) {
317
+ return element.assignedSlot ?? element.parentNode;
318
+ }
319
+ function parentPathElement(parent) {
320
+ if (parent.nodeType === Node.ELEMENT_NODE)
321
+ return parent;
322
+ return parent.host ?? null;
323
+ }
324
+ function composedChildren(parent) {
325
+ if (parent.localName === 'slot') {
326
+ return parent.assignedElements({ flatten: true });
327
+ }
328
+ return 'children' in parent ? Array.from(parent.children) : [];
329
+ }
330
+ function isShadowRoot(node) {
331
+ return node.nodeType === 11 && 'host' in node;
332
+ }
333
+ function addAllowedPath(allowed, host, doc) {
334
+ let current = host;
335
+ while (current && current !== doc.body && current !== doc.documentElement) {
336
+ const parent = pathParent(current);
337
+ if (!parent)
338
+ break;
339
+ let children = allowed.get(parent);
340
+ if (!children) {
341
+ children = new Set();
342
+ allowed.set(parent, children);
343
+ }
344
+ children.add(current);
345
+ current = parentPathElement(parent);
346
+ }
347
+ }
348
+ function applyTopmostInert(state) {
349
+ let modalIndex = -1;
350
+ for (let index = state.stack.length - 1; index >= 0; index--) {
351
+ if (state.stack[index].options.modal !== false) {
352
+ modalIndex = index;
353
+ break;
354
+ }
355
+ }
356
+ const desired = new Set();
357
+ if (modalIndex !== -1) {
358
+ const allowed = new Map();
359
+ for (const entry of state.stack.slice(modalIndex)) {
360
+ if (entry.options.host.isConnected)
361
+ addAllowedPath(allowed, entry.options.host, state.document);
362
+ }
363
+ for (const [parent, children] of allowed) {
364
+ if (isShadowRoot(parent))
365
+ observeMutationRoot(state, parent);
366
+ for (const child of composedChildren(parent)) {
367
+ if (!children.has(child))
368
+ inertElement(state, child, desired);
369
+ }
370
+ }
371
+ }
372
+ for (const [element, intended] of state.inerted) {
373
+ if (desired.has(element))
374
+ continue;
375
+ setInertByManager(state, element, intended);
376
+ state.inerted.delete(element);
377
+ }
378
+ }
379
+ function restoreStackStyle(entry) {
380
+ if (entry.previousStackValue) {
381
+ entry.options.host.style.setProperty(STACK_PROPERTY, entry.previousStackValue, entry.previousStackPriority);
382
+ }
383
+ else {
384
+ entry.options.host.style.removeProperty(STACK_PROPERTY);
385
+ }
386
+ }
387
+ function updateStackStyles(state) {
388
+ state.stack.forEach((entry, index) => {
389
+ entry.options.host.style.setProperty(STACK_PROPERTY, String(STACK_BASE + index * STACK_STEP));
390
+ });
391
+ }
392
+ function registerEntry(entry, state, preserveStackOrder = false) {
393
+ if (state.stack.length === 0)
394
+ startState(state);
395
+ if (!preserveStackOrder || entry.state !== state)
396
+ entry.stackOrder = state.nextStackOrder++;
397
+ entry.state = state;
398
+ entry.registered = true;
399
+ const nextIndex = state.stack.findIndex((candidate) => candidate.stackOrder > entry.stackOrder);
400
+ if (nextIndex === -1)
401
+ state.stack.push(entry);
402
+ else
403
+ state.stack.splice(nextIndex, 0, entry);
404
+ updateStackStyles(state);
405
+ applyTopmostInert(state);
406
+ }
407
+ function unregisterEntry(entry) {
408
+ if (!entry.registered)
409
+ return entry.wasTopmostOnSuspend;
410
+ const state = entry.state;
411
+ const index = state.stack.indexOf(entry);
412
+ const wasTopmost = index === state.stack.length - 1;
413
+ if (index !== -1)
414
+ state.stack.splice(index, 1);
415
+ entry.registered = false;
416
+ entry.wasTopmostOnSuspend = wasTopmost;
417
+ restoreStackStyle(entry);
418
+ updateStackStyles(state);
419
+ applyTopmostInert(state);
420
+ if (state.stack.length === 0)
421
+ stopState(state);
422
+ return wasTopmost;
423
+ }
424
+ function rebaseReturnTargets(entry) {
425
+ for (const candidate of entry.state.stack) {
426
+ if (candidate === entry || candidate.stackOrder <= entry.stackOrder)
427
+ continue;
428
+ if (candidate.restoreFocusTo && composedContains(entry.options.host, candidate.restoreFocusTo)) {
429
+ candidate.restoreFocusTo = entry.restoreFocusTo;
430
+ }
431
+ }
432
+ }
433
+ function restoreEntryFocus(entry) {
434
+ if (tryFocus(entry.restoreFocusTo))
435
+ return;
436
+ const next = entry.state.stack[entry.state.stack.length - 1];
437
+ if (next)
438
+ focusEntry(next, false, false);
439
+ }
440
+ function deactivateEntry(entry, restoreFocus) {
441
+ if (!entry.active)
442
+ return;
443
+ rebaseReturnTargets(entry);
444
+ const wasTopmost = unregisterEntry(entry);
445
+ entry.active = false;
446
+ entry.suspendGeneration++;
447
+ if (hostEntries.get(entry.options.host) === entry)
448
+ hostEntries.delete(entry.options.host);
449
+ if (!wasTopmost)
450
+ return;
451
+ if (restoreFocus) {
452
+ restoreEntryFocus(entry);
453
+ return;
454
+ }
455
+ const next = entry.state.stack[entry.state.stack.length - 1];
456
+ if (next)
457
+ focusEntry(next);
458
+ }
459
+ /**
460
+ * Adds an overlay to a stack scoped to its own `ownerDocument`. One document
461
+ * listener routes Escape and Tab only to the top entry, while modal inerting,
462
+ * visual stack depth, and focus return are recomputed as entries move.
463
+ */
464
+ export function activateOverlay(options) {
465
+ const previous = hostEntries.get(options.host);
466
+ const inheritedReturnTarget = previous?.active ? previous.restoreFocusTo : undefined;
467
+ if (previous?.active)
468
+ previous.handle.deactivate({ restoreFocus: false });
469
+ const doc = options.host.ownerDocument;
470
+ const active = deepActiveElement(doc);
471
+ const captured = active && typeof active.focus === 'function' ? active : null;
472
+ const entry = {};
473
+ entry.options = options;
474
+ entry.restoreFocusTo =
475
+ options.restoreFocusTo !== undefined ? options.restoreFocusTo : (inheritedReturnTarget ?? captured);
476
+ entry.active = true;
477
+ entry.registered = false;
478
+ entry.wasTopmostOnSuspend = false;
479
+ entry.suspendGeneration = 0;
480
+ entry.state = stateFor(doc);
481
+ entry.stackOrder = -1;
482
+ entry.previousStackValue = options.host.style.getPropertyValue(STACK_PROPERTY);
483
+ entry.previousStackPriority = options.host.style.getPropertyPriority(STACK_PROPERTY);
484
+ entry.handle = {
485
+ focusInitial: () => {
486
+ if (entry.active && entry.registered && entry.state.stack[entry.state.stack.length - 1] === entry) {
487
+ focusEntry(entry);
488
+ }
489
+ },
490
+ deactivate: (deactivateOptions = {}) => {
491
+ deactivateEntry(entry, deactivateOptions.restoreFocus !== false);
492
+ },
493
+ suspend: () => {
494
+ if (!entry.active || !entry.registered)
495
+ return;
496
+ unregisterEntry(entry);
497
+ const generation = ++entry.suspendGeneration;
498
+ queueMicrotask(() => {
499
+ if (entry.active && !entry.registered && entry.suspendGeneration === generation && !entry.options.host.isConnected) {
500
+ deactivateEntry(entry, true);
501
+ }
502
+ });
503
+ },
504
+ resume: () => {
505
+ if (!entry.active || entry.registered)
506
+ return;
507
+ entry.suspendGeneration++;
508
+ const state = stateFor(entry.options.host.ownerDocument);
509
+ registerEntry(entry, state, entry.state === state);
510
+ },
511
+ isTopmost: () => entry.active && entry.registered && entry.state.stack[entry.state.stack.length - 1] === entry,
512
+ isActive: () => entry.active,
513
+ dismissBackdrop: () => {
514
+ if (!entry.handle.isTopmost() || !entry.options.onBackdrop)
515
+ return false;
516
+ entry.options.onBackdrop();
517
+ return true;
518
+ },
519
+ };
520
+ hostEntries.set(options.host, entry);
521
+ registerEntry(entry, entry.state);
522
+ return entry.handle;
523
+ }
@@ -1,4 +1,4 @@
1
- import { computePosition, autoUpdate, flip, shift, offset, } from '@floating-ui/dom';
1
+ import { computePosition, autoUpdate, flip, shift, offset, size, } from '@floating-ui/dom';
2
2
  /**
3
3
  * Position `popup` (fixed) relative to `anchor` with flip/shift, keeping it
4
4
  * updated on scroll/resize. Returns a cleanup function that stops updating.
@@ -12,10 +12,34 @@ export function place(anchor, popup, opts = {}) {
12
12
  // the scroll offset (appears too far down on a scrolled page).
13
13
  strategy: 'fixed',
14
14
  placement: opts.placement ?? 'bottom-start',
15
- middleware: [offset(opts.offset ?? 4), flip(), shift({ padding: 8 })],
15
+ middleware: [
16
+ offset(opts.offset ?? 4),
17
+ flip(),
18
+ shift({ padding: 8 }),
19
+ size({
20
+ padding: 8,
21
+ apply({ availableWidth, availableHeight, elements }) {
22
+ elements.floating.style.setProperty('--lyra-positioner-available-inline-size', `${Math.max(0, availableWidth)}px`);
23
+ elements.floating.style.setProperty('--lyra-positioner-available-block-size', `${Math.max(0, availableHeight)}px`);
24
+ },
25
+ }),
26
+ ],
16
27
  }).then(({ x, y }) => {
17
28
  popup.style.left = `${x}px`;
18
29
  popup.style.top = `${y}px`;
19
30
  });
20
- return autoUpdate(anchor, popup, update);
31
+ const stopAutoUpdate = autoUpdate(anchor, popup, update);
32
+ // The visual viewport changes independently of the layout viewport when a
33
+ // mobile on-screen keyboard opens or closes. Floating UI's normal window
34
+ // resize listener does not receive those events, so keep the available-size
35
+ // CSS variables and fixed coordinates in sync with the visual viewport too.
36
+ const visualViewport = anchor.ownerDocument.defaultView?.visualViewport;
37
+ const updateFromVisualViewport = () => void update();
38
+ visualViewport?.addEventListener('resize', updateFromVisualViewport);
39
+ visualViewport?.addEventListener('scroll', updateFromVisualViewport);
40
+ return () => {
41
+ stopAutoUpdate();
42
+ visualViewport?.removeEventListener('resize', updateFromVisualViewport);
43
+ visualViewport?.removeEventListener('scroll', updateFromVisualViewport);
44
+ };
21
45
  }
@@ -1,3 +1,4 @@
1
+ import type { Placement } from '@floating-ui/dom';
1
2
  /**
2
3
  * Whether `el` resolves to RTL text direction. Logical CSS properties
3
4
  * (`inset-inline-start`, etc.) already flip visual layout for free, but
@@ -5,3 +6,25 @@
5
6
  * arrow-key direction) has to consult this explicitly to match.
6
7
  */
7
8
  export declare function isRtl(el: Element): boolean;
9
+ /** A physical (not logical) horizontal side. */
10
+ export type PhysicalSide = 'left' | 'right';
11
+ /**
12
+ * Swaps `side` under RTL, passes it through unchanged under LTR -- for
13
+ * reasoning about a physical side (e.g. which edge an icon should point at,
14
+ * or which edge of a track a dock panel resizes from) that logical CSS
15
+ * properties alone can't express, since the caller needs the resolved
16
+ * physical value itself (to rotate a glyph, to pick a Floating UI
17
+ * `Placement`), not just a layout that flips for free.
18
+ */
19
+ export declare function rtlAwareSide(side: PhysicalSide, el: Element): PhysicalSide;
20
+ /**
21
+ * Swaps the `left`/`right` component of a Floating UI `Placement` under RTL
22
+ * (`'right-start'` <-> `'left-start'`, etc.) -- `'top'`/`'bottom'`-based
23
+ * placements are already direction-agnostic and pass through unchanged.
24
+ * Floating UI's own `computePosition()` has no built-in RTL awareness (it
25
+ * positions purely by the physical `left`/`right`/`top`/`bottom` it's given),
26
+ * so a popover that means "anchor to my trailing edge" must resolve that
27
+ * intent to a physical placement itself before calling `place()` from
28
+ * `positioner.ts` -- this is the resolution step.
29
+ */
30
+ export declare function rtlAwarePlacement(placement: Placement, el: Element): Placement;
@@ -7,3 +7,31 @@
7
7
  export function isRtl(el) {
8
8
  return getComputedStyle(el).direction === 'rtl';
9
9
  }
10
+ /**
11
+ * Swaps `side` under RTL, passes it through unchanged under LTR -- for
12
+ * reasoning about a physical side (e.g. which edge an icon should point at,
13
+ * or which edge of a track a dock panel resizes from) that logical CSS
14
+ * properties alone can't express, since the caller needs the resolved
15
+ * physical value itself (to rotate a glyph, to pick a Floating UI
16
+ * `Placement`), not just a layout that flips for free.
17
+ */
18
+ export function rtlAwareSide(side, el) {
19
+ if (!isRtl(el))
20
+ return side;
21
+ return side === 'left' ? 'right' : 'left';
22
+ }
23
+ /**
24
+ * Swaps the `left`/`right` component of a Floating UI `Placement` under RTL
25
+ * (`'right-start'` <-> `'left-start'`, etc.) -- `'top'`/`'bottom'`-based
26
+ * placements are already direction-agnostic and pass through unchanged.
27
+ * Floating UI's own `computePosition()` has no built-in RTL awareness (it
28
+ * positions purely by the physical `left`/`right`/`top`/`bottom` it's given),
29
+ * so a popover that means "anchor to my trailing edge" must resolve that
30
+ * intent to a physical placement itself before calling `place()` from
31
+ * `positioner.ts` -- this is the resolution step.
32
+ */
33
+ export function rtlAwarePlacement(placement, el) {
34
+ if (!isRtl(el))
35
+ return placement;
36
+ return placement.replace(/^(left|right)/, (side) => (side === 'left' ? 'right' : 'left'));
37
+ }
@@ -0,0 +1,12 @@
1
+ /** Returns a trimmed URL safe for an `<img>`/`<video>` `src`, or `null`.
2
+ * Relative URLs and `http:`, `https:`, `blob:`, and `data:` are allowed. The
3
+ * platform parser performs the same control-character normalization as DOM
4
+ * URL sinks, preventing obfuscated schemes such as `java\tscript:`. */
5
+ export declare function safeMediaSrc(url: unknown): string | null;
6
+ /** Returns a trimmed URL safe to pass to `fetch()`, or `null`. This shares the
7
+ * resource allowlist with media sources so text/image `data:` URLs remain
8
+ * usable, while navigation-only and executable schemes are rejected. */
9
+ export declare function safeFetchUrl(url: unknown): string | null;
10
+ /** Returns a trimmed URL safe for an `<a href>`, or `null`. `data:` is
11
+ * intentionally excluded because following it can open an active document. */
12
+ export declare function safeLinkHref(url: unknown): string | null;
@@ -0,0 +1,41 @@
1
+ // URL safety is sink-specific. A `data:` URL is inert when used as media or
2
+ // fetched as data, but navigating an anchor to `data:text/html,...` creates an
3
+ // active document. Keep the link allowlist deliberately narrower.
4
+ const SAFE_RESOURCE_SCHEMES = new Set(['http:', 'https:', 'blob:', 'data:']);
5
+ const SAFE_LINK_SCHEMES = new Set(['http:', 'https:', 'blob:']);
6
+ // A fixed web base makes relative and scheme-relative inputs parse through the
7
+ // same WHATWG URL algorithm as absolute inputs. This also means malformed
8
+ // absolute URLs are rejected instead of being mistaken for relative paths.
9
+ const PARSE_BASE = 'https://lyra.invalid/';
10
+ function safeUrlOrNull(url, allowedSchemes) {
11
+ if (typeof url !== 'string')
12
+ return null;
13
+ const trimmed = url.trim();
14
+ if (trimmed === '')
15
+ return null;
16
+ try {
17
+ const protocol = new URL(trimmed, PARSE_BASE).protocol;
18
+ return allowedSchemes.has(protocol) ? trimmed : null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ /** Returns a trimmed URL safe for an `<img>`/`<video>` `src`, or `null`.
25
+ * Relative URLs and `http:`, `https:`, `blob:`, and `data:` are allowed. The
26
+ * platform parser performs the same control-character normalization as DOM
27
+ * URL sinks, preventing obfuscated schemes such as `java\tscript:`. */
28
+ export function safeMediaSrc(url) {
29
+ return safeUrlOrNull(url, SAFE_RESOURCE_SCHEMES);
30
+ }
31
+ /** Returns a trimmed URL safe to pass to `fetch()`, or `null`. This shares the
32
+ * resource allowlist with media sources so text/image `data:` URLs remain
33
+ * usable, while navigation-only and executable schemes are rejected. */
34
+ export function safeFetchUrl(url) {
35
+ return safeUrlOrNull(url, SAFE_RESOURCE_SCHEMES);
36
+ }
37
+ /** Returns a trimmed URL safe for an `<a href>`, or `null`. `data:` is
38
+ * intentionally excluded because following it can open an active document. */
39
+ export function safeLinkHref(url) {
40
+ return safeUrlOrNull(url, SAFE_LINK_SCHEMES);
41
+ }