@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,388 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { html, nothing, svg } from 'lit';
8
+ import { property, state } from 'lit/decorators.js';
9
+ import { LyraElement } from '../../internal/lyra-element.js';
10
+ import { defineElement } from '../../internal/prefix.js';
11
+ import { srOnly } from '../../internal/a11y.js';
12
+ import { safeFetchUrl, safeLinkHref, safeMediaSrc } from '../../internal/safe-url.js';
13
+ import { styles } from './document-preview.styles.js';
14
+ const IDLE_TEXT_FETCH = { kind: 'idle' };
15
+ function classifyFormat(mimeType) {
16
+ const mt = mimeType.trim().toLowerCase();
17
+ if (mt.startsWith('text/') || mt === 'application/json')
18
+ return 'text';
19
+ if (mt.startsWith('image/'))
20
+ return 'image';
21
+ return 'generic';
22
+ }
23
+ // Mirrors the shared icon set's viewBox/stroke conventions
24
+ // (internal/icons.ts's chevronIcon()/closeIcon()/etc.) without adding
25
+ // document/download glyphs to that module -- it's off limits here -- so
26
+ // these one-off icons still read as part of the same visual language as the
27
+ // rest of the library's inline icons.
28
+ const ICON_VIEW_BOX = '0 0 24 24';
29
+ const ICON_STROKE_WIDTH = '1.75';
30
+ /** A generic "document" glyph for the can't-preview-this fallback. Same
31
+ * shape as `<lyra-attachment-chip>`'s local `fileGlyph()` -- duplicated
32
+ * rather than imported (these are two independently consumable components)
33
+ * but kept visually identical so an unpreviewable-file affordance reads the
34
+ * same wherever it shows up in the library. */
35
+ function fileGlyph() {
36
+ return svg `
37
+ <svg
38
+ width="1em"
39
+ height="1em"
40
+ viewBox=${ICON_VIEW_BOX}
41
+ fill="none"
42
+ stroke="currentColor"
43
+ stroke-width=${ICON_STROKE_WIDTH}
44
+ stroke-linecap="round"
45
+ stroke-linejoin="round"
46
+ aria-hidden="true"
47
+ focusable="false"
48
+ ><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Z"></path><polyline points="14 2 14 8 20 8"></polyline></svg>
49
+ `;
50
+ }
51
+ /** A downward arrow into a tray -- the conventional "download" glyph. */
52
+ function downloadIcon() {
53
+ return icon(svg `
54
+ <path d="M12 3v12"></path>
55
+ <polyline points="7 11 12 16 17 11"></polyline>
56
+ <path d="M4 18v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2"></path>
57
+ `);
58
+ }
59
+ function icon(paths) {
60
+ return svg `
61
+ <svg
62
+ width="1em"
63
+ height="1em"
64
+ viewBox=${ICON_VIEW_BOX}
65
+ fill="none"
66
+ stroke="currentColor"
67
+ stroke-width=${ICON_STROKE_WIDTH}
68
+ stroke-linecap="round"
69
+ stroke-linejoin="round"
70
+ aria-hidden="true"
71
+ focusable="false"
72
+ >${paths}</svg>
73
+ `;
74
+ }
75
+ /**
76
+ * `<lyra-document-preview>` — a format-dispatching viewer for one document/
77
+ * attachment, plus the visual state machine for an async server-side
78
+ * conversion a host app runs in front of it.
79
+ *
80
+ * Format dispatch is intentionally minimal (see this family's scope
81
+ * guidance): only `text/*`/`application/json` (plain, scrollable `<pre>` —
82
+ * no syntax highlighting; compose `<lyra-code-block>` yourself via the
83
+ * `unsupported` slot for that) and `image/*` (a contained `<img>`) render
84
+ * inline. Everything else — PDF, office documents, video, audio, or any
85
+ * unrecognized MIME type — falls back to a generic "can't preview this"
86
+ * state: a file glyph, a short message, and (when `src` is set) a native
87
+ * `<a download>` link. This is a deliberate ceiling, not a gap: this
88
+ * component ships a dispatch *shell*, not a format registry. The
89
+ * `unsupported` slot is the escape hatch for every format left out of the
90
+ * built-in three — plug in a PDF.js viewer, an office-doc renderer, a
91
+ * `<lyra-code-block>`, or anything else keyed off `mime-type` yourself.
92
+ *
93
+ * `status="converting"` is a second, independent axis from format dispatch.
94
+ * This component does not know your backend's conversion API shape and
95
+ * therefore owns none of the actual polling/fetch — a host that's converting
96
+ * a non-natively-previewable format server-side (e.g. .docx → .pdf) polls
97
+ * its own backend and updates `status`/`progress`/`src` here as that
98
+ * proceeds. This component only *visualizes* that state: an indeterminate
99
+ * spinner, or a determinate one once `progress` is supplied. Once the host
100
+ * flips `status` to `"ready"` (typically alongside a new `src`/`mime-type`
101
+ * pointing at the converted artifact), normal format dispatch resumes.
102
+ *
103
+ * The one piece of async work this component *does* own is fetching a
104
+ * `text/*`/`application/json` `src` itself (there's no other way to get a
105
+ * `<pre>`'s text content from a URL) — gated behind the same generation-
106
+ * counter guard `<lyra-tool-result-view>`'s `resolve()` uses, so a `src`
107
+ * reassigned mid-fetch can't have a stale response clobber a newer one. A
108
+ * failure here (network error, non-2xx response) renders inline via
109
+ * `[part="error"]` and fires `lyra-render-error`, independently of the
110
+ * host-owned `status` prop — mirrors `<lyra-markdown>`'s identical stance
111
+ * that a *rendering* failure and a host's own state machine are different
112
+ * concerns.
113
+ *
114
+ * Every `src` is validated for the DOM/API sink that consumes it. Text
115
+ * fetches and image sources allow relative URLs plus `http:`, `https:`,
116
+ * `blob:`, and `data:`. Download links deliberately exclude `data:` because
117
+ * following a `data:text/html` URL can create an active document. Unsafe or
118
+ * malformed URLs never reach `fetch()`, an image `src`, or an anchor `href`;
119
+ * they render a non-interactive fallback/error instead.
120
+ *
121
+ * Accessibility: the `"converting"` state (no numeric `progress`) is a
122
+ * `role="status"` region wrapping a visually-hidden "Converting document…"
123
+ * string. This is a *plain* static region, not routed through
124
+ * `<lyra-live-region>`/`Announcer` — like `<lyra-typing-indicator>`'s
125
+ * identical judgement call (see that component's class doc), this only ever
126
+ * has one thing to announce (entering the state), not a rapidly-repeating
127
+ * stream of updates, so the coalescing machinery a high-frequency component
128
+ * needs would be pure overhead here. Once real `progress` is available, the
129
+ * region becomes a standard `role="progressbar"` instead, which is
130
+ * self-describing via `aria-valuenow` with no extra live-region wiring
131
+ * needed. `status="error"` renders `[part="error"]` as `role="alert"` — an
132
+ * assertive, one-shot failure notice, the same native-role shortcut
133
+ * `<lyra-live-region>`'s own `mode="assertive"` maps to, without requiring
134
+ * the announcer machinery here either.
135
+ *
136
+ * @customElement lyra-document-preview
137
+ * @slot unsupported - Escape hatch: when populated, its content renders
138
+ * *instead of* the generic download fallback for any `mime-type` this
139
+ * component doesn't natively support (i.e. whenever format dispatch would
140
+ * otherwise fall through to "generic"). Ignored while `mime-type` resolves
141
+ * to `text`/`image` dispatch, or while `status` is `"converting"`/`"error"`.
142
+ * @event lyra-download - `detail: { src, filename }` — fired when the safe
143
+ * generic-download fallback link is activated. The browser download itself
144
+ * needs no JS (a plain `<a download>` handles it); this is purely for a host
145
+ * that wants to observe/log the download.
146
+ * @event lyra-render-error - `detail: { error }` — fired when this
147
+ * component's own `text/*`/`application/json` `fetch(src)` fails. Distinct
148
+ * from `status="error"`, which is entirely host-driven (see the class
149
+ * doc).
150
+ * @csspart base - The root container.
151
+ * @csspart header - The row above the body, holding `filename`. Hidden entirely when `filename` is unset.
152
+ * @csspart filename - The filename text.
153
+ * @csspart body - The wrapper around whichever content is currently showing (text/image preview, the generic fallback, the spinner, or the error message).
154
+ * @csspart spinner - The converting/loading indicator — indeterminate (`role="status"`) or, once numeric progress is known, a determinate `role="progressbar"`. Used both for `status="converting"` and for this component's own in-flight text fetch.
155
+ * @csspart error - The error message region (`role="alert"`) — used both for `status="error"` and for a failed text fetch.
156
+ * @csspart download-link - The `<a download>` affordance in the generic fallback. Only rendered when `src` is set and safe for link navigation.
157
+ */
158
+ export class LyraDocumentPreview extends LyraElement {
159
+ constructor() {
160
+ super(...arguments);
161
+ /** URL to fetch (for `text`/`application/json`) or display (`image`, or as
162
+ * the generic fallback's download `href`). The value is validated against
163
+ * a sink-specific scheme allowlist before use. Optional — gracefully
164
+ * absent while, e.g., a conversion is still in progress. */
165
+ this.src = '';
166
+ /** Drives format dispatch — see the class doc. */
167
+ this.mimeType = '';
168
+ /** Shown in the header and used as the download link's suggested filename. */
169
+ this.filename = '';
170
+ /** Host-owned lifecycle state. `"converting"` shows the spinner regardless
171
+ * of `mime-type`/`src`; `"error"` shows `errorMessage` regardless of
172
+ * either. `"idle"`/`"ready"` both resume normal format dispatch — this
173
+ * component doesn't require a host that has no conversion step to ever
174
+ * set `"ready"` explicitly. */
175
+ this.status = 'idle';
176
+ /** Shown (via `[part="error"]`) while `status="error"`. */
177
+ this.errorMessage = '';
178
+ /** A CSS length (e.g. `"24rem"`); once set, `[part="body"]` scrolls
179
+ * internally past this height instead of growing the page — same
180
+ * contract as `<lyra-json-viewer>`'s identically-named prop. */
181
+ this.maxHeight = '';
182
+ this.hasUnsupportedSlot = false;
183
+ this.textFetch = IDLE_TEXT_FETCH;
184
+ // Bumped on every fetchText() call so a stale in-flight fetch (superseded
185
+ // by a newer src/mime-type/status before it settles) can detect it's no
186
+ // longer current and skip writing its result over a more recent one --
187
+ // same guard <lyra-tool-result-view>'s resolve() uses.
188
+ this.fetchGeneration = 0;
189
+ this.onUnsupportedSlotChange = (e) => {
190
+ this.hasUnsupportedSlot = e.target.assignedElements({ flatten: true }).length > 0;
191
+ };
192
+ this.onDownloadClick = () => {
193
+ this.emit('lyra-download', { src: this.src, filename: this.filename });
194
+ };
195
+ }
196
+ static { this.styles = [LyraElement.styles, styles, srOnly]; }
197
+ willUpdate(changed) {
198
+ if (!this.hasUpdated) {
199
+ this.hasUnsupportedSlot = Array.from(this.children).some((el) => el.getAttribute('slot') === 'unsupported');
200
+ }
201
+ const safeTextSrc = safeFetchUrl(this.src);
202
+ const shouldFetchText = classifyFormat(this.mimeType) === 'text' &&
203
+ safeTextSrc !== null &&
204
+ this.status !== 'converting' &&
205
+ this.status !== 'error';
206
+ if (shouldFetchText) {
207
+ // Refetch when the target itself changed, or when this just became
208
+ // fetchable (e.g. a "converting" -> "ready" transition) and nothing
209
+ // has been fetched yet -- but not on every unrelated property change.
210
+ if (!this.hasUpdated ||
211
+ changed.has('src') ||
212
+ changed.has('mimeType') ||
213
+ (changed.has('status') && this.textFetch.kind === 'idle')) {
214
+ void this.fetchText(safeTextSrc);
215
+ }
216
+ }
217
+ else if (this.textFetch.kind !== 'idle') {
218
+ // No longer applicable (format changed away from text, src cleared,
219
+ // or status moved to converting/error) -- invalidate any in-flight
220
+ // fetch and drop the stale result so a later re-entry starts clean.
221
+ this.fetchGeneration++;
222
+ this.textFetch = IDLE_TEXT_FETCH;
223
+ }
224
+ }
225
+ async fetchText(url) {
226
+ const generation = ++this.fetchGeneration;
227
+ this.textFetch = { kind: 'loading' };
228
+ try {
229
+ const response = await fetch(url);
230
+ if (!response.ok)
231
+ throw new Error(`${response.status} ${response.statusText}`);
232
+ const text = await response.text();
233
+ if (generation !== this.fetchGeneration)
234
+ return;
235
+ this.textFetch = { kind: 'loaded', text };
236
+ }
237
+ catch (error) {
238
+ if (generation !== this.fetchGeneration)
239
+ return;
240
+ const message = error instanceof Error ? error.message : 'Failed to load document.';
241
+ this.textFetch = { kind: 'error', message };
242
+ this.emit('lyra-render-error', { error });
243
+ }
244
+ }
245
+ /** Renders `[part="spinner"]` -- indeterminate (`role="status"` + a
246
+ * visually-hidden label, per the class doc's accessibility note) when
247
+ * `progressValue` is absent, or a `role="progressbar"` once it's a finite
248
+ * 0-100 number. Shared by the host-driven `"converting"` state and this
249
+ * component's own in-flight text fetch (which never has a numeric
250
+ * progress of its own to report). */
251
+ renderSpinner(label, progressValue) {
252
+ const hasProgress = progressValue != null && Number.isFinite(progressValue);
253
+ if (hasProgress) {
254
+ const clamped = Math.min(100, Math.max(0, progressValue));
255
+ const rounded = Math.round(clamped);
256
+ return html `
257
+ <div
258
+ part="spinner"
259
+ role="progressbar"
260
+ aria-valuenow=${rounded}
261
+ aria-valuemin="0"
262
+ aria-valuemax="100"
263
+ aria-label=${label}
264
+ >
265
+ <span class="ring determinate" style=${`--lyra-document-preview-progress:${clamped}`}></span>
266
+ <span class="spinner-text">${rounded}%</span>
267
+ </div>
268
+ `;
269
+ }
270
+ return html `
271
+ <div part="spinner" role="status">
272
+ <span class="ring" aria-hidden="true"></span>
273
+ <span class="sr-only">${label}</span>
274
+ </div>
275
+ `;
276
+ }
277
+ renderError(message) {
278
+ return html `<div part="error" role="alert">${message || 'Something went wrong.'}</div>`;
279
+ }
280
+ renderTextPreview() {
281
+ if (this.src === '')
282
+ return html `<p class="empty-note">No document to display.</p>`;
283
+ if (safeFetchUrl(this.src) === null)
284
+ return this.renderError('Document URL is not allowed.');
285
+ switch (this.textFetch.kind) {
286
+ case 'loaded':
287
+ return html `<pre class="text">${this.textFetch.text}</pre>`;
288
+ case 'error':
289
+ return this.renderError(this.textFetch.message);
290
+ case 'loading':
291
+ case 'idle':
292
+ default:
293
+ return this.renderSpinner('Loading document…');
294
+ }
295
+ }
296
+ renderImagePreview() {
297
+ if (this.src === '')
298
+ return html `<p class="empty-note">No image to display.</p>`;
299
+ const src = safeMediaSrc(this.src);
300
+ if (src === null)
301
+ return this.renderDownloadFallback();
302
+ return html `<img src=${src} alt=${this.filename || 'Document preview'} />`;
303
+ }
304
+ renderDownloadFallback() {
305
+ const label = this.filename || 'this file';
306
+ const href = safeLinkHref(this.src);
307
+ return html `
308
+ <div class="fallback">
309
+ <span class="fallback-icon" aria-hidden="true">${fileGlyph()}</span>
310
+ <p class="fallback-text">Preview not available for ${label}.</p>
311
+ ${href !== null
312
+ ? html `
313
+ <a
314
+ part="download-link"
315
+ href=${href}
316
+ download=${this.filename || ''}
317
+ @click=${this.onDownloadClick}
318
+ >
319
+ ${downloadIcon()}<span>Download</span>
320
+ </a>
321
+ `
322
+ : nothing}
323
+ </div>
324
+ `;
325
+ }
326
+ /** The `<slot>` element renders unconditionally (not just while
327
+ * `hasUnsupportedSlot`) so a slot-assignment change is always observable
328
+ * via `slotchange` -- same reasoning as `<lyra-chat-message>`'s
329
+ * always-rendered optional slots. */
330
+ renderGenericFallback() {
331
+ return html `
332
+ <slot name="unsupported" @slotchange=${this.onUnsupportedSlotChange}></slot>
333
+ ${this.hasUnsupportedSlot ? nothing : this.renderDownloadFallback()}
334
+ `;
335
+ }
336
+ renderBody() {
337
+ if (this.status === 'converting')
338
+ return this.renderSpinner('Converting document…', this.progress);
339
+ if (this.status === 'error')
340
+ return this.renderError(this.errorMessage);
341
+ switch (classifyFormat(this.mimeType)) {
342
+ case 'text':
343
+ return this.renderTextPreview();
344
+ case 'image':
345
+ return this.renderImagePreview();
346
+ default:
347
+ return this.renderGenericFallback();
348
+ }
349
+ }
350
+ render() {
351
+ return html `
352
+ <div part="base" style=${this.maxHeight ? `--lyra-document-preview-max-height:${this.maxHeight}` : nothing}>
353
+ <div part="header" ?hidden=${!this.filename}>
354
+ <span part="filename" title=${this.filename}>${this.filename}</span>
355
+ </div>
356
+ <div part="body">${this.renderBody()}</div>
357
+ </div>
358
+ `;
359
+ }
360
+ }
361
+ __decorate([
362
+ property()
363
+ ], LyraDocumentPreview.prototype, "src", void 0);
364
+ __decorate([
365
+ property({ attribute: 'mime-type' })
366
+ ], LyraDocumentPreview.prototype, "mimeType", void 0);
367
+ __decorate([
368
+ property()
369
+ ], LyraDocumentPreview.prototype, "filename", void 0);
370
+ __decorate([
371
+ property({ reflect: true })
372
+ ], LyraDocumentPreview.prototype, "status", void 0);
373
+ __decorate([
374
+ property({ type: Number })
375
+ ], LyraDocumentPreview.prototype, "progress", void 0);
376
+ __decorate([
377
+ property({ attribute: 'error-message' })
378
+ ], LyraDocumentPreview.prototype, "errorMessage", void 0);
379
+ __decorate([
380
+ property({ attribute: 'max-height' })
381
+ ], LyraDocumentPreview.prototype, "maxHeight", void 0);
382
+ __decorate([
383
+ state()
384
+ ], LyraDocumentPreview.prototype, "hasUnsupportedSlot", void 0);
385
+ __decorate([
386
+ state()
387
+ ], LyraDocumentPreview.prototype, "textFetch", void 0);
388
+ defineElement('document-preview', LyraDocumentPreview);
@@ -0,0 +1 @@
1
+ export declare const styles: import("lit").CSSResult;
@@ -0,0 +1,191 @@
1
+ import { css } from 'lit';
2
+ export const styles = css `
3
+ :host {
4
+ display: block;
5
+ /* Consumer-tunable scroll cap on [part='body'] -- 'none' means the
6
+ preview grows with its content until a caller opts into an internal
7
+ scrollbar, same contract as lyra-json-viewer's identical
8
+ --lyra-json-viewer-max-height. */
9
+ --lyra-document-preview-max-height: none;
10
+ /* No shared --wa-*/--lyra-* monospace token exists to resolve through
11
+ (same gap lyra-json-viewer's own --lyra-json-viewer-font documents) --
12
+ contained here so a host page can retheme it. */
13
+ --lyra-document-preview-font: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
14
+ }
15
+
16
+ [part='base'] {
17
+ display: flex;
18
+ flex-direction: column;
19
+ box-sizing: border-box;
20
+ border: 1px solid var(--lyra-color-border);
21
+ border-radius: var(--lyra-radius);
22
+ background: var(--lyra-color-surface);
23
+ overflow: hidden;
24
+ }
25
+
26
+ [part='header'] {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: var(--lyra-space-s);
30
+ padding: var(--lyra-space-s) var(--lyra-space-m);
31
+ border-block-end: 1px solid var(--lyra-color-border);
32
+ background: var(--lyra-color-surface);
33
+ }
34
+ [part='header'][hidden] {
35
+ display: none;
36
+ }
37
+ [part='filename'] {
38
+ overflow: hidden;
39
+ text-overflow: ellipsis;
40
+ white-space: nowrap;
41
+ font-weight: 600;
42
+ font-size: 0.875rem;
43
+ color: var(--lyra-color-text);
44
+ }
45
+
46
+ [part='body'] {
47
+ display: flex;
48
+ flex-direction: column;
49
+ align-items: center;
50
+ justify-content: center;
51
+ min-block-size: 10rem;
52
+ max-block-size: var(--lyra-document-preview-max-height);
53
+ box-sizing: border-box;
54
+ overflow: auto;
55
+ flex: 1 1 auto;
56
+ }
57
+
58
+ /* -- text/*, application/json: plain, scrollable <pre> -----------------
59
+ No syntax highlighting -- see the class doc for why that's intentionally
60
+ out of scope here. */
61
+ pre.text {
62
+ align-self: stretch;
63
+ box-sizing: border-box;
64
+ margin: 0;
65
+ padding: var(--lyra-space-m);
66
+ font-family: var(--lyra-document-preview-font);
67
+ font-size: 0.8125rem;
68
+ line-height: 1.6;
69
+ white-space: pre;
70
+ overflow: auto;
71
+ color: var(--lyra-color-text);
72
+ }
73
+
74
+ /* -- image/* -------------------------------------------------------- */
75
+ [part='body'] img {
76
+ display: block;
77
+ max-inline-size: 100%;
78
+ max-block-size: 100%;
79
+ object-fit: contain;
80
+ }
81
+
82
+ .empty-note {
83
+ margin: 0;
84
+ padding: var(--lyra-space-m);
85
+ color: var(--lyra-color-text-quiet);
86
+ font-size: 0.875rem;
87
+ }
88
+
89
+ /* -- generic download fallback ------------------------------------- */
90
+ .fallback {
91
+ display: flex;
92
+ flex-direction: column;
93
+ align-items: center;
94
+ gap: var(--lyra-space-s);
95
+ padding: var(--lyra-space-l);
96
+ text-align: center;
97
+ }
98
+ .fallback-icon {
99
+ display: inline-flex;
100
+ font-size: 2rem;
101
+ color: var(--lyra-color-text-quiet);
102
+ }
103
+ .fallback-icon svg {
104
+ display: block;
105
+ }
106
+ .fallback-text {
107
+ margin: 0;
108
+ color: var(--lyra-color-text-quiet);
109
+ font-size: 0.875rem;
110
+ }
111
+ [part='download-link'] {
112
+ display: inline-flex;
113
+ align-items: center;
114
+ gap: var(--lyra-space-xs);
115
+ padding: var(--lyra-space-xs) var(--lyra-space-m);
116
+ border-radius: var(--lyra-radius);
117
+ background: var(--lyra-color-brand);
118
+ color: var(--lyra-color-on-brand);
119
+ font: inherit;
120
+ font-weight: 600;
121
+ font-size: 0.8125rem;
122
+ text-decoration: none;
123
+ cursor: pointer;
124
+ transition: background-color var(--lyra-transition-fast);
125
+ }
126
+ [part='download-link']:hover {
127
+ background: color-mix(in srgb, var(--lyra-color-brand) 85%, black);
128
+ }
129
+ [part='download-link']:focus-visible {
130
+ outline: var(--lyra-focus-ring-width) solid var(--lyra-focus-ring-color);
131
+ outline-offset: var(--lyra-focus-ring-offset);
132
+ }
133
+ [part='download-link'] svg {
134
+ display: block;
135
+ }
136
+
137
+ /* -- spinner (converting / loading text) ----------------------------- */
138
+ [part='spinner'] {
139
+ display: flex;
140
+ flex-direction: column;
141
+ align-items: center;
142
+ gap: var(--lyra-space-s);
143
+ padding: var(--lyra-space-l);
144
+ }
145
+ .ring {
146
+ display: inline-block;
147
+ inline-size: 2rem;
148
+ block-size: 2rem;
149
+ border-radius: 50%;
150
+ border: 3px solid var(--lyra-color-border);
151
+ border-block-start-color: var(--lyra-color-brand);
152
+ animation: lyra-document-preview-spin 0.8s linear infinite;
153
+ }
154
+ /* Determinate progress reuses the same ring shape but holds a fixed
155
+ rotation instead of spinning -- conic-gradient renders the actual fill,
156
+ so the ring visually communicates a real fraction rather than motion. */
157
+ .ring.determinate {
158
+ animation: none;
159
+ border-color: transparent;
160
+ background: conic-gradient(
161
+ var(--lyra-color-brand) calc(var(--lyra-document-preview-progress, 0) * 1%),
162
+ var(--lyra-color-border) 0
163
+ );
164
+ -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));
165
+ mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));
166
+ }
167
+ .spinner-text {
168
+ color: var(--lyra-color-text-quiet);
169
+ font-size: 0.8125rem;
170
+ font-variant-numeric: tabular-nums;
171
+ }
172
+ @keyframes lyra-document-preview-spin {
173
+ to {
174
+ transform: rotate(360deg);
175
+ }
176
+ }
177
+ @media (prefers-reduced-motion: reduce) {
178
+ .ring {
179
+ animation: none !important;
180
+ }
181
+ }
182
+
183
+ /* -- error ------------------------------------------------------------ */
184
+ [part='error'] {
185
+ margin: 0;
186
+ padding: var(--lyra-space-l);
187
+ color: var(--lyra-color-danger);
188
+ font-size: 0.875rem;
189
+ text-align: center;
190
+ }
191
+ `;
@@ -30,8 +30,7 @@ export declare class LyraEmpty extends LyraElement {
30
30
  private hasActions;
31
31
  protected willUpdate(): void;
32
32
  firstUpdated(): void;
33
- private checkIconSlot;
34
- private checkActionsSlot;
33
+ private reconcileSlotHidden;
35
34
  private onIconSlotChange;
36
35
  private onActionsSlotChange;
37
36
  render(): TemplateResult;
@@ -42,10 +42,12 @@ export class LyraEmpty extends LyraElement {
42
42
  this.hasIcon = false;
43
43
  this.hasActions = false;
44
44
  this.onIconSlotChange = (e) => {
45
- this.checkIconSlot(e.target);
45
+ const slot = e.target;
46
+ this.hasIcon = slot.assignedElements({ flatten: true }).length > 0;
46
47
  };
47
48
  this.onActionsSlotChange = (e) => {
48
- this.checkActionsSlot(e.target);
49
+ const slot = e.target;
50
+ this.hasActions = slot.assignedElements({ flatten: true }).length > 0;
49
51
  };
50
52
  }
51
53
  static { this.styles = [LyraElement.styles, styles]; }
@@ -64,17 +66,21 @@ export class LyraEmpty extends LyraElement {
64
66
  }
65
67
  firstUpdated() {
66
68
  // Fallback reconciliation against the fully-resolved slot assignment
67
- // (handles slot-forwarding and any browser where `slotchange` doesn't
68
- // fire for content present at parse/upgrade time). A no-op in the
69
- // common case since `willUpdate` already set the correct value above.
70
- this.checkIconSlot(this.shadowRoot.querySelector('slot:not([name])'));
71
- this.checkActionsSlot(this.shadowRoot.querySelector('slot[name="actions"]'));
69
+ // (handles slot-forwarding where `this.children` in `willUpdate` above
70
+ // are forwarding `<slot>` elements rather than the real projected
71
+ // content, e.g. a wrapper component's own default slot re-slotted into
72
+ // ours — and any browser where `slotchange` doesn't fire for content
73
+ // present at parse/upgrade time). This corrects the `hidden` attribute
74
+ // on the wrapper elements directly rather than through
75
+ // `hasIcon`/`hasActions`, so this one-shot correction doesn't need to
76
+ // schedule and wait out a second Lit render pass; the reactive state is
77
+ // left as `willUpdate` set it and continues to drive only the ongoing
78
+ // `slotchange` path below.
79
+ this.reconcileSlotHidden(this.shadowRoot.querySelector('slot:not([name])'), this.shadowRoot.querySelector('[part="icon"]'));
80
+ this.reconcileSlotHidden(this.shadowRoot.querySelector('slot[name="actions"]'), this.shadowRoot.querySelector('[part="actions"]'));
72
81
  }
73
- checkIconSlot(slot) {
74
- this.hasIcon = slot.assignedElements({ flatten: true }).length > 0;
75
- }
76
- checkActionsSlot(slot) {
77
- this.hasActions = slot.assignedElements({ flatten: true }).length > 0;
82
+ reconcileSlotHidden(slot, wrapper) {
83
+ wrapper.toggleAttribute('hidden', slot.assignedElements({ flatten: true }).length === 0);
78
84
  }
79
85
  render() {
80
86
  return html `
@@ -44,9 +44,6 @@ export const styles = css `
44
44
  [part='description']:empty {
45
45
  display: none;
46
46
  }
47
- [part='actions'] {
48
- margin-block-start: var(--lyra-space-s);
49
- }
50
47
  [part='actions'][hidden] {
51
48
  display: none;
52
49
  }
@@ -2,7 +2,7 @@
2
2
  // reliably trigger spreadsheet formula evaluation) — guarding it forces text rendering on
3
3
  // ordinary negative numbers/currency. Per OWASP CSV-injection guidance, '-' is intentionally
4
4
  // excluded here.
5
- const UNSAFE_LEADING = /^[=+@\t\r]/;
5
+ const UNSAFE_LEADING = /^[=+@\t\r\n]/;
6
6
  const NEEDS_QUOTING = /[",\r\n]/;
7
7
  /** Escapes a CSV field: quotes as needed, guards against formula injection. */
8
8
  export function escapeCsvField(value) {