@aceshooting/lyra-ui 1.2.0 → 2.0.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 (330) hide show
  1. package/README.md +11 -0
  2. package/custom-elements.json +23341 -11202
  3. package/dist/components/app-rail/app-rail.d.ts +171 -0
  4. package/dist/components/app-rail/app-rail.js +483 -0
  5. package/dist/components/app-rail/app-rail.styles.d.ts +1 -0
  6. package/dist/components/app-rail/app-rail.styles.js +125 -0
  7. package/dist/components/attachment-chip/attachment-chip.d.ts +114 -0
  8. package/dist/components/attachment-chip/attachment-chip.js +312 -0
  9. package/dist/components/attachment-chip/attachment-chip.styles.d.ts +1 -0
  10. package/dist/components/attachment-chip/attachment-chip.styles.js +184 -0
  11. package/dist/components/attachment-trigger/attachment-trigger.d.ts +83 -0
  12. package/dist/components/attachment-trigger/attachment-trigger.js +258 -0
  13. package/dist/components/attachment-trigger/attachment-trigger.styles.d.ts +1 -0
  14. package/dist/components/attachment-trigger/attachment-trigger.styles.js +68 -0
  15. package/dist/components/chart/box-plot.js +11 -1
  16. package/dist/components/chart/chart-loader.d.ts +44 -13
  17. package/dist/components/chart/chart-loader.js +65 -18
  18. package/dist/components/chart/chart.d.ts +1 -2
  19. package/dist/components/chart/chart.js +67 -12
  20. package/dist/components/chart/histogram-bin.d.ts +4 -1
  21. package/dist/components/chart/histogram-bin.js +24 -14
  22. package/dist/components/chart/lite-chart.d.ts +54 -0
  23. package/dist/components/chart/lite-chart.js +140 -22
  24. package/dist/components/chart/lite-chart.styles.js +9 -0
  25. package/dist/components/chat-composer/chat-composer.d.ts +92 -0
  26. package/dist/components/chat-composer/chat-composer.js +285 -0
  27. package/dist/components/chat-composer/chat-composer.styles.d.ts +1 -0
  28. package/dist/components/chat-composer/chat-composer.styles.js +135 -0
  29. package/dist/components/chat-message/chat-message.d.ts +113 -0
  30. package/dist/components/chat-message/chat-message.js +291 -0
  31. package/dist/components/chat-message/chat-message.styles.d.ts +1 -0
  32. package/dist/components/chat-message/chat-message.styles.js +203 -0
  33. package/dist/components/checkbox/checkbox.d.ts +59 -0
  34. package/dist/components/checkbox/checkbox.js +230 -0
  35. package/dist/components/checkbox/checkbox.styles.d.ts +1 -0
  36. package/dist/components/checkbox/checkbox.styles.js +70 -0
  37. package/dist/components/chip/chip-group.d.ts +56 -0
  38. package/dist/components/chip/chip-group.js +124 -0
  39. package/dist/components/chip/chip-group.styles.d.ts +1 -0
  40. package/dist/components/chip/chip-group.styles.js +57 -0
  41. package/dist/components/chip/chip.d.ts +64 -0
  42. package/dist/components/chip/chip.js +115 -0
  43. package/dist/components/chip/chip.styles.d.ts +1 -0
  44. package/dist/components/chip/chip.styles.js +115 -0
  45. package/dist/components/citation-badge/citation-badge.d.ts +113 -0
  46. package/dist/components/citation-badge/citation-badge.js +300 -0
  47. package/dist/components/citation-badge/citation-badge.styles.d.ts +1 -0
  48. package/dist/components/citation-badge/citation-badge.styles.js +96 -0
  49. package/dist/components/code-block/code-block.d.ts +89 -0
  50. package/dist/components/code-block/code-block.js +317 -0
  51. package/dist/components/code-block/code-block.styles.d.ts +1 -0
  52. package/dist/components/code-block/code-block.styles.js +187 -0
  53. package/dist/components/code-block/code-loader.d.ts +44 -0
  54. package/dist/components/code-block/code-loader.js +79 -0
  55. package/dist/components/combobox/combobox.d.ts +19 -1
  56. package/dist/components/combobox/combobox.js +84 -14
  57. package/dist/components/combobox/option.d.ts +5 -1
  58. package/dist/components/combobox/option.js +35 -0
  59. package/dist/components/context-meter/context-meter.d.ts +53 -0
  60. package/dist/components/context-meter/context-meter.js +150 -0
  61. package/dist/components/context-meter/context-meter.styles.d.ts +1 -0
  62. package/dist/components/context-meter/context-meter.styles.js +120 -0
  63. package/dist/components/conversation-item/conversation-item.d.ts +128 -0
  64. package/dist/components/conversation-item/conversation-item.js +322 -0
  65. package/dist/components/conversation-item/conversation-item.styles.d.ts +1 -0
  66. package/dist/components/conversation-item/conversation-item.styles.js +155 -0
  67. package/dist/components/date-picker/date-input.d.ts +24 -0
  68. package/dist/components/date-picker/date-input.js +134 -22
  69. package/dist/components/date-picker/date-picker.d.ts +7 -0
  70. package/dist/components/date-picker/date-picker.js +85 -16
  71. package/dist/components/dialog/confirm.d.ts +40 -0
  72. package/dist/components/dialog/confirm.js +79 -0
  73. package/dist/components/dialog/dialog.d.ts +85 -0
  74. package/dist/components/dialog/dialog.js +272 -0
  75. package/dist/components/dialog/dialog.styles.d.ts +1 -0
  76. package/dist/components/dialog/dialog.styles.js +52 -0
  77. package/dist/components/dock-panel/dock-panel.d.ts +134 -0
  78. package/dist/components/dock-panel/dock-panel.js +345 -0
  79. package/dist/components/dock-panel/dock-panel.styles.d.ts +1 -0
  80. package/dist/components/dock-panel/dock-panel.styles.js +145 -0
  81. package/dist/components/document-preview/document-preview.d.ts +135 -0
  82. package/dist/components/document-preview/document-preview.js +372 -0
  83. package/dist/components/document-preview/document-preview.styles.d.ts +1 -0
  84. package/dist/components/document-preview/document-preview.styles.js +191 -0
  85. package/dist/components/export-button/csv.js +1 -1
  86. package/dist/components/export-button/export-button.js +2 -0
  87. package/dist/components/flag/flag.d.ts +29 -13
  88. package/dist/components/flag/flag.js +39 -13
  89. package/dist/components/gauge/gauge.js +19 -10
  90. package/dist/components/generation-status/generation-status.d.ts +109 -0
  91. package/dist/components/generation-status/generation-status.js +273 -0
  92. package/dist/components/generation-status/generation-status.styles.d.ts +1 -0
  93. package/dist/components/generation-status/generation-status.styles.js +84 -0
  94. package/dist/components/heatmap/calendar-grid.d.ts +4 -1
  95. package/dist/components/heatmap/calendar-grid.js +25 -12
  96. package/dist/components/heatmap/heatmap-scale.d.ts +6 -0
  97. package/dist/components/heatmap/heatmap-scale.js +7 -1
  98. package/dist/components/heatmap/heatmap.d.ts +74 -0
  99. package/dist/components/heatmap/heatmap.js +135 -23
  100. package/dist/components/json-viewer/json-viewer.d.ts +53 -0
  101. package/dist/components/json-viewer/json-viewer.js +283 -0
  102. package/dist/components/json-viewer/json-viewer.styles.d.ts +1 -0
  103. package/dist/components/json-viewer/json-viewer.styles.js +176 -0
  104. package/dist/components/kbd/kbd.d.ts +77 -0
  105. package/dist/components/kbd/kbd.js +214 -0
  106. package/dist/components/kbd/kbd.styles.d.ts +1 -0
  107. package/dist/components/kbd/kbd.styles.js +52 -0
  108. package/dist/components/live-region/live-region.d.ts +81 -0
  109. package/dist/components/live-region/live-region.js +153 -0
  110. package/dist/components/live-region/live-region.styles.d.ts +1 -0
  111. package/dist/components/live-region/live-region.styles.js +10 -0
  112. package/dist/components/map/map.d.ts +8 -6
  113. package/dist/components/map/map.js +44 -8
  114. package/dist/components/markdown/markdown-loader.d.ts +34 -0
  115. package/dist/components/markdown/markdown-loader.js +43 -0
  116. package/dist/components/markdown/markdown.d.ts +81 -0
  117. package/dist/components/markdown/markdown.js +284 -0
  118. package/dist/components/markdown/markdown.styles.d.ts +1 -0
  119. package/dist/components/markdown/markdown.styles.js +82 -0
  120. package/dist/components/media-card/media-card.d.ts +122 -0
  121. package/dist/components/media-card/media-card.js +295 -0
  122. package/dist/components/media-card/media-card.styles.d.ts +1 -0
  123. package/dist/components/media-card/media-card.styles.js +132 -0
  124. package/dist/components/mention-popover/mention-popover.d.ts +200 -0
  125. package/dist/components/mention-popover/mention-popover.js +475 -0
  126. package/dist/components/mention-popover/mention-popover.styles.d.ts +1 -0
  127. package/dist/components/mention-popover/mention-popover.styles.js +101 -0
  128. package/dist/components/menu/menu-item.d.ts +62 -0
  129. package/dist/components/menu/menu-item.js +119 -0
  130. package/dist/components/menu/menu-item.styles.d.ts +1 -0
  131. package/dist/components/menu/menu-item.styles.js +67 -0
  132. package/dist/components/menu/menu.d.ts +143 -0
  133. package/dist/components/menu/menu.js +365 -0
  134. package/dist/components/menu/menu.styles.d.ts +1 -0
  135. package/dist/components/menu/menu.styles.js +66 -0
  136. package/dist/components/model-select/model-select.d.ts +125 -0
  137. package/dist/components/model-select/model-select.js +490 -0
  138. package/dist/components/model-select/model-select.styles.d.ts +1 -0
  139. package/dist/components/model-select/model-select.styles.js +189 -0
  140. package/dist/components/model-settings-panel/model-settings-panel.d.ts +69 -0
  141. package/dist/components/model-settings-panel/model-settings-panel.js +145 -0
  142. package/dist/components/model-settings-panel/model-settings-panel.styles.d.ts +1 -0
  143. package/dist/components/model-settings-panel/model-settings-panel.styles.js +82 -0
  144. package/dist/components/playback/playback.d.ts +13 -1
  145. package/dist/components/playback/playback.js +47 -14
  146. package/dist/components/responsive-panel/responsive-panel.d.ts +150 -0
  147. package/dist/components/responsive-panel/responsive-panel.js +365 -0
  148. package/dist/components/responsive-panel/responsive-panel.styles.d.ts +1 -0
  149. package/dist/components/responsive-panel/responsive-panel.styles.js +103 -0
  150. package/dist/components/result-card/result-card.d.ts +44 -0
  151. package/dist/components/result-card/result-card.js +83 -0
  152. package/dist/components/result-card/result-card.styles.d.ts +1 -0
  153. package/dist/components/result-card/result-card.styles.js +50 -0
  154. package/dist/components/result-card/result-field.d.ts +36 -0
  155. package/dist/components/result-card/result-field.js +87 -0
  156. package/dist/components/result-card/result-field.styles.d.ts +1 -0
  157. package/dist/components/result-card/result-field.styles.js +32 -0
  158. package/dist/components/select/select.d.ts +43 -2
  159. package/dist/components/select/select.js +150 -17
  160. package/dist/components/slider/slider.d.ts +89 -0
  161. package/dist/components/slider/slider.js +352 -0
  162. package/dist/components/slider/slider.styles.d.ts +1 -0
  163. package/dist/components/slider/slider.styles.js +87 -0
  164. package/dist/components/source-card/source-card.d.ts +92 -0
  165. package/dist/components/source-card/source-card.js +148 -0
  166. package/dist/components/source-card/source-card.styles.d.ts +1 -0
  167. package/dist/components/source-card/source-card.styles.js +69 -0
  168. package/dist/components/source-list/source-list.d.ts +63 -0
  169. package/dist/components/source-list/source-list.js +122 -0
  170. package/dist/components/source-list/source-list.styles.d.ts +1 -0
  171. package/dist/components/source-list/source-list.styles.js +59 -0
  172. package/dist/components/sparkline/sparkline.js +27 -13
  173. package/dist/components/split/split.d.ts +93 -1
  174. package/dist/components/split/split.js +284 -15
  175. package/dist/components/split/split.styles.js +30 -0
  176. package/dist/components/stat/stat.d.ts +6 -1
  177. package/dist/components/stat/stat.js +8 -2
  178. package/dist/components/stream-status/stream-status.d.ts +110 -0
  179. package/dist/components/stream-status/stream-status.js +210 -0
  180. package/dist/components/stream-status/stream-status.styles.d.ts +1 -0
  181. package/dist/components/stream-status/stream-status.styles.js +103 -0
  182. package/dist/components/streaming-text/streaming-text.d.ts +98 -0
  183. package/dist/components/streaming-text/streaming-text.js +209 -0
  184. package/dist/components/streaming-text/streaming-text.styles.d.ts +1 -0
  185. package/dist/components/streaming-text/streaming-text.styles.js +62 -0
  186. package/dist/components/switch/switch.d.ts +58 -0
  187. package/dist/components/switch/switch.js +179 -0
  188. package/dist/components/switch/switch.styles.d.ts +1 -0
  189. package/dist/components/switch/switch.styles.js +75 -0
  190. package/dist/components/table/table.d.ts +73 -4
  191. package/dist/components/table/table.js +169 -20
  192. package/dist/components/table/table.styles.js +6 -1
  193. package/dist/components/tabs/tabs.d.ts +51 -0
  194. package/dist/components/tabs/tabs.js +190 -0
  195. package/dist/components/tabs/tabs.styles.d.ts +1 -0
  196. package/dist/components/tabs/tabs.styles.js +63 -0
  197. package/dist/components/thinking-panel/thinking-panel.d.ts +121 -0
  198. package/dist/components/thinking-panel/thinking-panel.js +235 -0
  199. package/dist/components/thinking-panel/thinking-panel.styles.d.ts +1 -0
  200. package/dist/components/thinking-panel/thinking-panel.styles.js +117 -0
  201. package/dist/components/toast/toast-item.d.ts +1 -0
  202. package/dist/components/toast/toast-item.js +31 -6
  203. package/dist/components/tool-approval-dialog/tool-approval-dialog.d.ts +130 -0
  204. package/dist/components/tool-approval-dialog/tool-approval-dialog.js +403 -0
  205. package/dist/components/tool-approval-dialog/tool-approval-dialog.styles.d.ts +1 -0
  206. package/dist/components/tool-approval-dialog/tool-approval-dialog.styles.js +160 -0
  207. package/dist/components/tool-call-chip/tool-call-chip.d.ts +89 -0
  208. package/dist/components/tool-call-chip/tool-call-chip.js +288 -0
  209. package/dist/components/tool-call-chip/tool-call-chip.styles.d.ts +1 -0
  210. package/dist/components/tool-call-chip/tool-call-chip.styles.js +203 -0
  211. package/dist/components/tool-param-form/tool-param-form.d.ts +145 -0
  212. package/dist/components/tool-param-form/tool-param-form.js +366 -0
  213. package/dist/components/tool-param-form/tool-param-form.styles.d.ts +1 -0
  214. package/dist/components/tool-param-form/tool-param-form.styles.js +75 -0
  215. package/dist/components/tool-result-dialog/tool-result-dialog.d.ts +102 -0
  216. package/dist/components/tool-result-dialog/tool-result-dialog.js +393 -0
  217. package/dist/components/tool-result-dialog/tool-result-dialog.styles.d.ts +1 -0
  218. package/dist/components/tool-result-dialog/tool-result-dialog.styles.js +176 -0
  219. package/dist/components/tool-result-view/registry.d.ts +81 -0
  220. package/dist/components/tool-result-view/registry.js +84 -0
  221. package/dist/components/tool-result-view/tool-result-view.d.ts +55 -0
  222. package/dist/components/tool-result-view/tool-result-view.js +138 -0
  223. package/dist/components/tool-result-view/tool-result-view.styles.d.ts +1 -0
  224. package/dist/components/tool-result-view/tool-result-view.styles.js +13 -0
  225. package/dist/components/tool-select-dialog/tool-select-dialog.d.ts +151 -0
  226. package/dist/components/tool-select-dialog/tool-select-dialog.js +439 -0
  227. package/dist/components/tool-select-dialog/tool-select-dialog.styles.d.ts +1 -0
  228. package/dist/components/tool-select-dialog/tool-select-dialog.styles.js +182 -0
  229. package/dist/components/tree/tree-node.d.ts +11 -2
  230. package/dist/components/tree/tree-node.js +16 -6
  231. package/dist/components/tree/tree.d.ts +8 -2
  232. package/dist/components/tree/tree.js +18 -11
  233. package/dist/components/typing-indicator/typing-indicator.d.ts +60 -0
  234. package/dist/components/typing-indicator/typing-indicator.js +96 -0
  235. package/dist/components/typing-indicator/typing-indicator.styles.d.ts +1 -0
  236. package/dist/components/typing-indicator/typing-indicator.styles.js +132 -0
  237. package/dist/components/virtual-list/virtual-list.d.ts +173 -0
  238. package/dist/components/virtual-list/virtual-list.js +461 -0
  239. package/dist/components/virtual-list/virtual-list.styles.d.ts +1 -0
  240. package/dist/components/virtual-list/virtual-list.styles.js +44 -0
  241. package/dist/components/word-cloud/word-cloud-layout.js +14 -1
  242. package/dist/components/word-cloud/word-cloud.d.ts +6 -0
  243. package/dist/components/word-cloud/word-cloud.js +25 -14
  244. package/dist/components/word-cloud/word-cloud.styles.js +3 -2
  245. package/dist/internal/announcer.d.ts +57 -0
  246. package/dist/internal/announcer.js +71 -0
  247. package/dist/internal/form-associated.d.ts +1 -0
  248. package/dist/internal/form-associated.js +55 -11
  249. package/dist/internal/group-by-recency.d.ts +50 -0
  250. package/dist/internal/group-by-recency.js +80 -0
  251. package/dist/internal/rtl.d.ts +23 -0
  252. package/dist/internal/rtl.js +28 -0
  253. package/dist/internal/scroll-lock.d.ts +10 -5
  254. package/dist/internal/scroll-lock.js +30 -14
  255. package/dist/internal/tokens.styles.js +6 -0
  256. package/dist/lyra.d.ts +130 -31
  257. package/dist/lyra.js +94 -26
  258. package/llms-full.txt +3836 -17
  259. package/llms.txt +16 -1
  260. package/package.json +23 -5
  261. package/dist/components/chart/bar-chart.stories.d.ts +0 -5
  262. package/dist/components/chart/bar-chart.stories.js +0 -20
  263. package/dist/components/chart/box-plot.stories.d.ts +0 -5
  264. package/dist/components/chart/box-plot.stories.js +0 -29
  265. package/dist/components/chart/bubble-chart.stories.d.ts +0 -5
  266. package/dist/components/chart/bubble-chart.stories.js +0 -26
  267. package/dist/components/chart/chart.stories.d.ts +0 -32
  268. package/dist/components/chart/chart.stories.js +0 -141
  269. package/dist/components/chart/doughnut-chart.stories.d.ts +0 -5
  270. package/dist/components/chart/doughnut-chart.stories.js +0 -26
  271. package/dist/components/chart/histogram.stories.d.ts +0 -5
  272. package/dist/components/chart/histogram.stories.js +0 -17
  273. package/dist/components/chart/line-chart.stories.d.ts +0 -22
  274. package/dist/components/chart/line-chart.stories.js +0 -99
  275. package/dist/components/chart/lite-chart.stories.d.ts +0 -14
  276. package/dist/components/chart/lite-chart.stories.js +0 -114
  277. package/dist/components/chart/pie-chart.stories.d.ts +0 -5
  278. package/dist/components/chart/pie-chart.stories.js +0 -26
  279. package/dist/components/chart/polar-area-chart.stories.d.ts +0 -5
  280. package/dist/components/chart/polar-area-chart.stories.js +0 -20
  281. package/dist/components/chart/radar-chart.stories.d.ts +0 -5
  282. package/dist/components/chart/radar-chart.stories.js +0 -20
  283. package/dist/components/chart/scatter-chart.stories.d.ts +0 -5
  284. package/dist/components/chart/scatter-chart.stories.js +0 -31
  285. package/dist/components/combobox/combobox.stories.d.ts +0 -24
  286. package/dist/components/combobox/combobox.stories.js +0 -102
  287. package/dist/components/date-picker/date-input.stories.d.ts +0 -10
  288. package/dist/components/date-picker/date-input.stories.js +0 -48
  289. package/dist/components/date-picker/date-picker.stories.d.ts +0 -10
  290. package/dist/components/date-picker/date-picker.stories.js +0 -25
  291. package/dist/components/empty/empty.stories.d.ts +0 -7
  292. package/dist/components/empty/empty.stories.js +0 -34
  293. package/dist/components/export-button/export-button.stories.d.ts +0 -7
  294. package/dist/components/export-button/export-button.stories.js +0 -37
  295. package/dist/components/file-input/file-input.stories.d.ts +0 -7
  296. package/dist/components/file-input/file-input.stories.js +0 -19
  297. package/dist/components/flag/flag.stories.d.ts +0 -6
  298. package/dist/components/flag/flag.stories.js +0 -31
  299. package/dist/components/gauge/gauge.stories.d.ts +0 -8
  300. package/dist/components/gauge/gauge.stories.js +0 -19
  301. package/dist/components/graph/graph.stories.d.ts +0 -8
  302. package/dist/components/graph/graph.stories.js +0 -68
  303. package/dist/components/heatmap/heatmap.stories.d.ts +0 -27
  304. package/dist/components/heatmap/heatmap.stories.js +0 -179
  305. package/dist/components/map/map.stories.d.ts +0 -15
  306. package/dist/components/map/map.stories.js +0 -135
  307. package/dist/components/playback/playback.stories.d.ts +0 -7
  308. package/dist/components/playback/playback.stories.js +0 -16
  309. package/dist/components/select/select.stories.d.ts +0 -21
  310. package/dist/components/select/select.stories.js +0 -91
  311. package/dist/components/skeleton/skeleton.stories.d.ts +0 -5
  312. package/dist/components/skeleton/skeleton.stories.js +0 -16
  313. package/dist/components/sparkline/sparkline.stories.d.ts +0 -11
  314. package/dist/components/sparkline/sparkline.stories.js +0 -39
  315. package/dist/components/split/split.stories.d.ts +0 -7
  316. package/dist/components/split/split.stories.js +0 -36
  317. package/dist/components/stat/stat.stories.d.ts +0 -9
  318. package/dist/components/stat/stat.stories.js +0 -81
  319. package/dist/components/table/table.stories.d.ts +0 -12
  320. package/dist/components/table/table.stories.js +0 -67
  321. package/dist/components/time-range/time-range.stories.d.ts +0 -8
  322. package/dist/components/time-range/time-range.stories.js +0 -26
  323. package/dist/components/toast/toast.stories.d.ts +0 -8
  324. package/dist/components/toast/toast.stories.js +0 -72
  325. package/dist/components/tree/tree.stories.d.ts +0 -9
  326. package/dist/components/tree/tree.stories.js +0 -52
  327. package/dist/components/widget/widget.stories.d.ts +0 -9
  328. package/dist/components/widget/widget.stories.js +0 -74
  329. package/dist/components/word-cloud/word-cloud.stories.d.ts +0 -10
  330. package/dist/components/word-cloud/word-cloud.stories.js +0 -55
@@ -0,0 +1,300 @@
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 } from 'lit';
8
+ import { property, state, query } from 'lit/decorators.js';
9
+ import { LyraElement } from '../../internal/lyra-element.js';
10
+ import { defineElement } from '../../internal/prefix.js';
11
+ import { place } from '../../internal/positioner.js';
12
+ import { nextId } from '../../internal/a11y.js';
13
+ import { styles } from './citation-badge.styles.js';
14
+ /** Visible (not just color-coded) status word, folded into the computed
15
+ * accessible name — `''` for `default` omits the status clause entirely
16
+ * rather than announcing a meaningless "Citation 3, Default". */
17
+ const STATUS_LABEL = {
18
+ default: '',
19
+ high: 'High confidence',
20
+ medium: 'Medium confidence',
21
+ low: 'Low confidence',
22
+ verified: 'Verified',
23
+ unverified: 'Unverified',
24
+ };
25
+ // A short grace period before the popover actually hides on pointer-leave/
26
+ // focus-out, so moving the mouse from the badge into the popover itself (to
27
+ // select/copy its text) doesn't make it vanish mid-move. Cancelled outright
28
+ // if hover or focus returns before it fires. No delay on Escape or explicit
29
+ // keyboard blur — those are intentional dismissals, not transient pointer
30
+ // travel, so they close immediately.
31
+ const HIDE_DELAY_MS = 200;
32
+ /**
33
+ * `<lyra-citation-badge>` — an inline `[n]` citation marker with a hover/
34
+ * focus preview popover and confidence/verification-status coloring. Used
35
+ * for an agent response's inline citations, each carrying a `source-id`
36
+ * that matches a corresponding `<lyra-source-card>` shown elsewhere on the
37
+ * page (a sibling component in this same family — this component doesn't
38
+ * import or know anything about it, only carries the id through its
39
+ * events).
40
+ *
41
+ * The default slot is *not* the badge's visible content — the badge always
42
+ * renders `[index]` — it's reserved for optional rich preview content (e.g.
43
+ * a filename + short excerpt) shown in a floating popover on hover/focus,
44
+ * positioned with `internal/positioner.js`'s `place()` the same way
45
+ * `<lyra-tool-call-chip>` positions its own detail tooltip. No popover shows
46
+ * at all when the slot carries no content, and the popover never traps
47
+ * focus — it's supplementary preview content, not a modal, so Tab continues
48
+ * past the badge normally even while it happens to be visible from a mouse
49
+ * hover.
50
+ *
51
+ * Two distinct signals fire from the same badge: `lyra-citation-activate`
52
+ * (click, or Enter while focused — native `<button>` behavior, no listener
53
+ * needed for the Enter case) is the lightweight "jump to this source"
54
+ * signal a host wires to scrolling/highlighting the matching
55
+ * `<lyra-source-card>`. `lyra-citation-open` (dblclick, or Space while
56
+ * focused) is a distinct "full preview" signal — `href` in its detail is
57
+ * `undefined` when the `href` prop isn't set; the consumer decides what
58
+ * "open" means (a new tab, a dialog, etc). A double-click still fires two
59
+ * `lyra-citation-activate` events (one per constituent click — standard
60
+ * browser `dblclick` behavior) in addition to the one `lyra-citation-open`;
61
+ * a consumer that only cares about the richer signal on a double-click
62
+ * should ignore the paired activate events in that case.
63
+ *
64
+ * Status coloring: `verified`/`high` use the success tones (a claim that's
65
+ * been checked out, or the model is confident in). `medium`/`low` use
66
+ * warning (progressively less certain, but still a real citation).
67
+ * `unverified` uses danger — deliberately distinct from `low`: "hasn't been
68
+ * checked at all" is a different (arguably riskier) claim than "checked but
69
+ * uncertain". `default` renders as plain neutral text with no background
70
+ * tint, for citations that carry no confidence/verification signal at all.
71
+ *
72
+ * @customElement lyra-citation-badge
73
+ * @slot - Rich preview/tooltip content (e.g. a filename + excerpt), shown in
74
+ * a floating popover on hover/focus. Nothing renders (no hover affordance at
75
+ * all) when this slot is empty.
76
+ * @event lyra-citation-activate - The badge was activated (click, or Enter
77
+ * while focused). `detail: { sourceId, index }`.
78
+ * @event lyra-citation-open - The badge's "full preview" affordance was
79
+ * triggered (dblclick, or Space while focused).
80
+ * `detail: { sourceId, index, href }`.
81
+ * @csspart base - The clickable badge (`<button>`).
82
+ * @csspart bracket - Each of the two literal `[`/`]` glyphs.
83
+ * @csspart index - The citation number.
84
+ * @csspart popover - The floating preview panel (only meaningful while open).
85
+ */
86
+ export class LyraCitationBadge extends LyraElement {
87
+ constructor() {
88
+ super(...arguments);
89
+ /** The citation number shown, e.g. `3` renders as `[3]`. */
90
+ this.index = 1;
91
+ /** Confidence/verification state — drives the badge's color and (unless
92
+ * `label` is set) part of its accessible name. */
93
+ this.status = 'default';
94
+ /** Id of a corresponding `<lyra-source-card>` elsewhere on the page —
95
+ * echoed back verbatim in both events, never read or validated here. */
96
+ this.sourceId = '';
97
+ /** Optional direct link target for the citation's source. Carried into
98
+ * `lyra-citation-open`'s detail as-is; this component never navigates. */
99
+ this.href = '';
100
+ /** Overrides the computed accessible name (`"Citation {index}[, {status}]"`). */
101
+ this.label = '';
102
+ // A `[part]` always contains a literal `<slot>` child regardless of
103
+ // assigned content, so `:empty` never matches — real emptiness is tracked
104
+ // in JS instead, same fix lyra-tool-call-chip's hasDetailSlot/lyra-stat's
105
+ // hasIcon etc. already establish.
106
+ this.hasPreviewSlot = false;
107
+ this.popoverOpen = false;
108
+ this.popoverId = nextId('citation-badge-popover');
109
+ // Hover and focus are tracked as independent "keep it open" reasons —
110
+ // mirrors lyra-toast-item's identical hovering/focused pair — so releasing
111
+ // one (e.g. the pointer leaving while the badge still has keyboard focus)
112
+ // doesn't schedule a hide the other modality is still holding open.
113
+ this.hovering = false;
114
+ this.focused = false;
115
+ this.onSlotChange = (e) => {
116
+ this.hasPreviewSlot = e.target.assignedElements({ flatten: true }).length > 0;
117
+ // The slot can be emptied out from under an already-open popover (e.g. a
118
+ // consumer clearing preview content asynchronously) — nothing left to
119
+ // show, so don't leave an empty panel floating open.
120
+ if (!this.hasPreviewSlot)
121
+ this.hidePreviewNow();
122
+ };
123
+ // Attached to the wrapper (not the button alone) so the popover's own
124
+ // slotted content counts too — pointerenter/pointerleave/focusin/focusout
125
+ // fire relative to whichever element they're bound to, not per descendant,
126
+ // so moving the pointer or focus between the button and the popover panel
127
+ // within this same wrapper never toggles hovering/focused off and on.
128
+ this.onPointerEnter = () => {
129
+ this.hovering = true;
130
+ this.showPreview();
131
+ };
132
+ this.onPointerLeave = () => {
133
+ this.hovering = false;
134
+ this.scheduleHidePreview();
135
+ };
136
+ this.onFocusIn = () => {
137
+ this.focused = true;
138
+ this.showPreview();
139
+ };
140
+ // No grace period here, unlike onPointerLeave -- a blur (Tab/Shift+Tab
141
+ // away, or focus programmatically moved elsewhere) is a deliberate
142
+ // navigation, not the transient pointer travel the delay exists to survive,
143
+ // so it closes at once. Still deferred to hover if the pointer happens to
144
+ // be resting on the badge/popover at the same time.
145
+ this.onFocusOut = () => {
146
+ this.focused = false;
147
+ if (this.hovering)
148
+ return;
149
+ this.hidePreviewNow();
150
+ };
151
+ // keydown bubbles up from whatever actually holds focus (the button, or a
152
+ // focusable element inside slotted preview content) — attaching this at
153
+ // the wrapper, rather than the button alone, is what makes Escape work
154
+ // "while the popover has focus-within" per the component's contract,
155
+ // without needing to track focus targets explicitly here.
156
+ this.onKeyDown = (e) => {
157
+ if (e.key === 'Escape' && this.popoverOpen) {
158
+ // Swallow it here rather than letting it bubble to e.g. a containing
159
+ // lyra-dialog's own Escape-to-close handler — dismissing this
160
+ // lightweight preview shouldn't also close a surrounding modal.
161
+ e.stopPropagation();
162
+ this.hidePreviewNow();
163
+ return;
164
+ }
165
+ // Space normally activates a <button> the same as Enter, but this
166
+ // component gives the two keys distinct meanings (Enter = activate,
167
+ // Space = open) — so Space's native click-on-keyup must be pre-empted
168
+ // here (preventDefault on keydown suppresses it) rather than left to
169
+ // fire alongside this. Enter deliberately gets no such handling: its
170
+ // native immediate click already reaches onClick below.
171
+ if (e.key === ' ' && !e.repeat && e.target === this.buttonEl) {
172
+ e.preventDefault();
173
+ this.emitOpen();
174
+ }
175
+ };
176
+ this.onClick = () => {
177
+ this.emit('lyra-citation-activate', { sourceId: this.sourceId, index: this.index });
178
+ };
179
+ this.onDblClick = () => {
180
+ this.emitOpen();
181
+ };
182
+ }
183
+ static { this.styles = [LyraElement.styles, styles]; }
184
+ willUpdate() {
185
+ if (!this.hasUpdated) {
186
+ this.hasPreviewSlot = Array.from(this.children).some((el) => !el.hasAttribute('slot'));
187
+ }
188
+ }
189
+ updated(changed) {
190
+ if (changed.has('popoverOpen')) {
191
+ this.cleanupPositioner?.();
192
+ this.cleanupPositioner = undefined;
193
+ if (this.popoverOpen && this.buttonEl && this.popoverEl) {
194
+ this.cleanupPositioner = place(this.buttonEl, this.popoverEl, { placement: 'top-start' });
195
+ }
196
+ }
197
+ }
198
+ disconnectedCallback() {
199
+ super.disconnectedCallback();
200
+ this.cleanupPositioner?.();
201
+ clearTimeout(this.hideTimer);
202
+ }
203
+ get accessibleLabel() {
204
+ if (this.label)
205
+ return this.label;
206
+ const statusText = STATUS_LABEL[this.status];
207
+ return statusText ? `Citation ${this.index}, ${statusText}` : `Citation ${this.index}`;
208
+ }
209
+ // Named showPreview/hidePreviewNow (not show/hidePopover) to avoid
210
+ // colliding with the standard HTML Popover API's own
211
+ // HTMLElement.prototype.showPopover()/hidePopover() -- this component
212
+ // renders its own floating panel via internal/positioner.js rather than
213
+ // the native `popover` attribute, but TS's DOM lib still declares those
214
+ // method names on every HTMLElement subclass, so reusing them here would
215
+ // be a same-name-different-signature override error.
216
+ showPreview() {
217
+ if (!this.hasPreviewSlot || this.popoverOpen)
218
+ return;
219
+ clearTimeout(this.hideTimer);
220
+ this.hideTimer = undefined;
221
+ this.popoverOpen = true;
222
+ }
223
+ scheduleHidePreview() {
224
+ if (!this.popoverOpen || this.hovering || this.focused)
225
+ return;
226
+ clearTimeout(this.hideTimer);
227
+ this.hideTimer = setTimeout(() => {
228
+ this.hideTimer = undefined;
229
+ this.popoverOpen = false;
230
+ }, HIDE_DELAY_MS);
231
+ }
232
+ hidePreviewNow() {
233
+ clearTimeout(this.hideTimer);
234
+ this.hideTimer = undefined;
235
+ if (this.popoverOpen)
236
+ this.popoverOpen = false;
237
+ }
238
+ emitOpen() {
239
+ this.emit('lyra-citation-open', {
240
+ sourceId: this.sourceId,
241
+ index: this.index,
242
+ href: this.href || undefined,
243
+ });
244
+ }
245
+ render() {
246
+ return html `
247
+ <span
248
+ class="wrapper"
249
+ @pointerenter=${this.onPointerEnter}
250
+ @pointerleave=${this.onPointerLeave}
251
+ @focusin=${this.onFocusIn}
252
+ @focusout=${this.onFocusOut}
253
+ @keydown=${this.onKeyDown}
254
+ >
255
+ <button
256
+ part="base"
257
+ type="button"
258
+ aria-label=${this.getAttribute('aria-label') || this.accessibleLabel}
259
+ aria-describedby=${this.hasPreviewSlot && this.popoverOpen ? this.popoverId : nothing}
260
+ @click=${this.onClick}
261
+ @dblclick=${this.onDblClick}
262
+ >
263
+ <span part="bracket" aria-hidden="true">[</span><span part="index">${this.index}</span
264
+ ><span part="bracket" aria-hidden="true">]</span>
265
+ </button>
266
+ <div part="popover" id=${this.popoverId} role="tooltip" ?hidden=${!this.popoverOpen}>
267
+ <slot @slotchange=${this.onSlotChange}></slot>
268
+ </div>
269
+ </span>
270
+ `;
271
+ }
272
+ }
273
+ __decorate([
274
+ property({ type: Number })
275
+ ], LyraCitationBadge.prototype, "index", void 0);
276
+ __decorate([
277
+ property({ reflect: true })
278
+ ], LyraCitationBadge.prototype, "status", void 0);
279
+ __decorate([
280
+ property({ attribute: 'source-id' })
281
+ ], LyraCitationBadge.prototype, "sourceId", void 0);
282
+ __decorate([
283
+ property()
284
+ ], LyraCitationBadge.prototype, "href", void 0);
285
+ __decorate([
286
+ property()
287
+ ], LyraCitationBadge.prototype, "label", void 0);
288
+ __decorate([
289
+ state()
290
+ ], LyraCitationBadge.prototype, "hasPreviewSlot", void 0);
291
+ __decorate([
292
+ state()
293
+ ], LyraCitationBadge.prototype, "popoverOpen", void 0);
294
+ __decorate([
295
+ query('[part="base"]')
296
+ ], LyraCitationBadge.prototype, "buttonEl", void 0);
297
+ __decorate([
298
+ query('[part="popover"]')
299
+ ], LyraCitationBadge.prototype, "popoverEl", void 0);
300
+ defineElement('citation-badge', LyraCitationBadge);
@@ -0,0 +1 @@
1
+ export declare const styles: import("lit").CSSResult;
@@ -0,0 +1,96 @@
1
+ import { css } from 'lit';
2
+ export const styles = css `
3
+ :host {
4
+ display: inline-flex;
5
+ vertical-align: baseline;
6
+ line-height: 1;
7
+ /* Per-status accent -- one pair of custom properties swapped by the
8
+ :host([status]) rules below rather than repeating background/color
9
+ per part per status. 'default' (and any unrecognized status) stays
10
+ plain/neutral -- transparent background, quiet text -- rather than
11
+ inventing a seventh visual tone for "no signal at all". */
12
+ --lyra-citation-badge-accent: var(--lyra-color-text-quiet);
13
+ --lyra-citation-badge-bg: transparent;
14
+ --lyra-citation-badge-border: transparent;
15
+ }
16
+
17
+ :host([status='high']),
18
+ :host([status='verified']) {
19
+ --lyra-citation-badge-accent: var(--lyra-color-success);
20
+ --lyra-citation-badge-bg: var(--lyra-color-success-quiet);
21
+ }
22
+ :host([status='medium']),
23
+ :host([status='low']) {
24
+ --lyra-citation-badge-accent: var(--lyra-color-warning);
25
+ --lyra-citation-badge-bg: var(--lyra-color-warning-quiet);
26
+ }
27
+ /* Deliberately its own danger tone, not grouped with 'low' -- see the
28
+ component doc's status-coloring note: "hasn't been checked" reads as a
29
+ distinct (riskier) claim from "checked but uncertain". */
30
+ :host([status='unverified']) {
31
+ --lyra-citation-badge-accent: var(--lyra-color-danger);
32
+ --lyra-citation-badge-bg: var(--lyra-color-danger-quiet);
33
+ }
34
+
35
+ .wrapper {
36
+ display: inline-flex;
37
+ }
38
+
39
+ [part='base'] {
40
+ display: inline-flex;
41
+ align-items: baseline;
42
+ box-sizing: border-box;
43
+ padding: 0 0.3em;
44
+ border: 1px solid var(--lyra-citation-badge-border);
45
+ border-radius: calc(var(--lyra-radius) * 0.6);
46
+ background: var(--lyra-citation-badge-bg);
47
+ color: var(--lyra-citation-badge-accent);
48
+ font: inherit;
49
+ font-size: 0.75em;
50
+ font-weight: 600;
51
+ font-variant-numeric: tabular-nums;
52
+ line-height: 1.5;
53
+ cursor: pointer;
54
+ -webkit-tap-highlight-color: transparent;
55
+ transition:
56
+ background-color var(--lyra-transition-fast),
57
+ border-color var(--lyra-transition-fast);
58
+ }
59
+ [part='base']:hover {
60
+ border-color: var(--lyra-citation-badge-accent);
61
+ }
62
+ [part='base']:focus-visible {
63
+ outline: var(--lyra-focus-ring-width) solid var(--lyra-focus-ring-color);
64
+ outline-offset: var(--lyra-focus-ring-offset);
65
+ }
66
+
67
+ [part='bracket'] {
68
+ opacity: 0.7;
69
+ }
70
+
71
+ /* Positioned by internal/positioner.js's place() -- same fixed/z-index/
72
+ max-size shape as lyra-tool-call-chip's own [part='tooltip']. No open/
73
+ close transition, for the same reason that one has none: a preview
74
+ that tracks the pointer/focus target should appear instantly, not
75
+ chase a fade. */
76
+ [part='popover'] {
77
+ position: fixed;
78
+ z-index: 900;
79
+ box-sizing: border-box;
80
+ max-inline-size: min(90vw, 22rem);
81
+ padding: var(--lyra-space-s) var(--lyra-space-m);
82
+ background: var(--lyra-color-surface);
83
+ border: 1px solid var(--lyra-color-border);
84
+ border-radius: var(--lyra-radius);
85
+ box-shadow: var(--lyra-shadow);
86
+ font-size: 0.8125rem;
87
+ line-height: 1.4;
88
+ color: var(--lyra-color-text);
89
+ }
90
+
91
+ @media (prefers-reduced-motion: reduce) {
92
+ [part='base'] {
93
+ transition: none !important;
94
+ }
95
+ }
96
+ `;
@@ -0,0 +1,89 @@
1
+ import { type TemplateResult, type PropertyValues } from 'lit';
2
+ import { LyraElement } from '../../internal/lyra-element.js';
3
+ import '../skeleton/skeleton.js';
4
+ /**
5
+ * `<lyra-code-block>` — fenced code display with optional lazy syntax
6
+ * highlighting and a copy button. No highlighting grammar ships in this
7
+ * component itself: it lazy-loads the optional peer dependency `shiki` (see
8
+ * `code-loader.ts`) for the actual tokenizing, and degrades to a plain
9
+ * `<pre><code>` when that peer isn't installed or `language` is unset/
10
+ * unrecognized — the exact same optional-peer shape `<lyra-markdown>` and
11
+ * `<lyra-chart>` already establish. That fallback is the *default* rendering
12
+ * path, not a degraded one: unhighlighted code is perfectly usable, and it's
13
+ * what every instance renders at zero extra bytes until shiki resolves.
14
+ *
15
+ * A `<lyra-skeleton>` placeholder stands in only while shiki itself is
16
+ * loading for the very first time on the page (cached — see
17
+ * `loadShikiHighlighter()`) and `language` is set. It's deliberately *not*
18
+ * shown again for a subsequent per-language grammar load (e.g. a second
19
+ * `<lyra-code-block>` requesting a language no earlier instance has used
20
+ * yet) — that grammar fetch is typically fast, and the plain-text fallback
21
+ * is already a perfectly readable placeholder for it, so a second
22
+ * loading-chrome state would add complexity for little practical benefit.
23
+ *
24
+ * @customElement lyra-code-block
25
+ * @event lyra-copy - The copy button was activated. `detail: { text }` is
26
+ * always the raw `code` value (never the highlighted HTML), and always
27
+ * fires regardless of whether the actual OS clipboard write succeeded —
28
+ * same convention as `<lyra-json-viewer>`'s own copy button.
29
+ * @csspart base - The outer container.
30
+ * @csspart header - The row above the code (filename/language/copy/toggle),
31
+ * present whenever there's anything to put in it.
32
+ * @csspart filename - The `filename` text, when set.
33
+ * @csspart language - The `language` badge, when set, so the language is
34
+ * exposed to assistive tech as visible text rather than only a `language`
35
+ * attribute a screen reader would never announce.
36
+ * @csspart copy-button - The copy-to-clipboard button, when `copyable`.
37
+ * @csspart toggle - The collapse/expand chevron button, when `collapsible`.
38
+ * @csspart body - The scrollable region wrapping the code (or the loading
39
+ * skeleton); respects `max-height`, `hidden` while `collapsible` and
40
+ * `collapsed`.
41
+ * @csspart pre - The rendered `<pre>` — shiki's own in the highlighted path,
42
+ * this component's own plain one in the fallback path.
43
+ * @csspart code - The rendered `<code>`, same split as `pre` above.
44
+ */
45
+ export declare class LyraCodeBlock extends LyraElement {
46
+ static styles: import("lit").CSSResultGroup[];
47
+ /** The raw source text. */
48
+ code: string;
49
+ /** A shiki-recognized language id or alias (e.g. `"javascript"`,
50
+ * `"python"`, `"json"`). When unset, or when shiki doesn't recognize it,
51
+ * the code renders as plain unhighlighted text regardless of whether
52
+ * shiki itself is available. */
53
+ language: string;
54
+ /** Shown in the header above the code, when set. */
55
+ filename: string;
56
+ /** Whether the code region can be collapsed via a header toggle. */
57
+ collapsible: boolean;
58
+ /** Whether the code region is currently hidden. Only has a visible effect
59
+ * while `collapsible` is also true. */
60
+ collapsed: boolean;
61
+ /** Shows a copy-to-clipboard button in the header. */
62
+ copyable: boolean;
63
+ /** A CSS length (e.g. `"20rem"`); once set, the code scrolls internally
64
+ * past this height instead of growing the page. */
65
+ maxHeight: string;
66
+ private highlightedHtml;
67
+ private shikiReady;
68
+ private justCopied;
69
+ private highlighter?;
70
+ private highlightToken;
71
+ private copyTimeoutId?;
72
+ private readonly bodyId;
73
+ connectedCallback(): void;
74
+ disconnectedCallback(): void;
75
+ protected willUpdate(changed: PropertyValues): void;
76
+ protected updated(): void;
77
+ private syncHighlight;
78
+ private tokenize;
79
+ private writeClipboard;
80
+ private copy;
81
+ private toggleCollapsed;
82
+ private renderHeader;
83
+ render(): TemplateResult;
84
+ }
85
+ declare global {
86
+ interface HTMLElementTagNameMap {
87
+ 'lyra-code-block': LyraCodeBlock;
88
+ }
89
+ }