@aceshooting/lyra-ui 5.2.0 → 6.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 (327) hide show
  1. package/CHANGELOG.md +3979 -0
  2. package/README.md +6 -5
  3. package/custom-elements.json +3580 -1047
  4. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts +4 -2
  5. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts.map +1 -1
  6. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js.map +1 -1
  7. package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts +7 -3
  8. package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts.map +1 -1
  9. package/dist/components/agent-tools/browser-frame/browser-frame.class.js.map +1 -1
  10. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +36 -4
  11. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts.map +1 -1
  12. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +68 -19
  13. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js.map +1 -1
  14. package/dist/components/agent-tools/confirm-bar/confirm-bar.d.ts +1 -0
  15. package/dist/components/agent-tools/confirm-bar/confirm-bar.d.ts.map +1 -1
  16. package/dist/components/agent-tools/confirm-bar/confirm-bar.js +1 -0
  17. package/dist/components/agent-tools/confirm-bar/confirm-bar.js.map +1 -1
  18. package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.d.ts.map +1 -1
  19. package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.js +10 -29
  20. package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.js.map +1 -1
  21. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +7 -7
  22. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts.map +1 -1
  23. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +14 -13
  24. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js.map +1 -1
  25. package/dist/components/agent-tools/eval-dataset/eval-dataset.d.ts +1 -1
  26. package/dist/components/agent-tools/eval-dataset/eval-dataset.d.ts.map +1 -1
  27. package/dist/components/agent-tools/eval-dataset/eval-dataset.js +1 -1
  28. package/dist/components/agent-tools/eval-dataset/eval-dataset.js.map +1 -1
  29. package/dist/components/agent-tools/eval-result/eval-result.class.d.ts +11 -9
  30. package/dist/components/agent-tools/eval-result/eval-result.class.d.ts.map +1 -1
  31. package/dist/components/agent-tools/eval-result/eval-result.class.js +9 -7
  32. package/dist/components/agent-tools/eval-result/eval-result.class.js.map +1 -1
  33. package/dist/components/agent-tools/eval-result/eval-result.d.ts +1 -1
  34. package/dist/components/agent-tools/eval-result/eval-result.d.ts.map +1 -1
  35. package/dist/components/agent-tools/eval-result/eval-result.js +1 -1
  36. package/dist/components/agent-tools/eval-result/eval-result.js.map +1 -1
  37. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts +47 -5
  38. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts.map +1 -1
  39. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +90 -15
  40. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js.map +1 -1
  41. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.d.ts +2 -1
  42. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.d.ts.map +1 -1
  43. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.js +2 -1
  44. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.js.map +1 -1
  45. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.d.ts.map +1 -1
  46. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.js +6 -26
  47. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.js.map +1 -1
  48. package/dist/components/charts/chart/chart.class.d.ts.map +1 -1
  49. package/dist/components/charts/chart/chart.class.js.map +1 -1
  50. package/dist/components/charts/chart/lite-chart.class.d.ts +5 -1
  51. package/dist/components/charts/chart/lite-chart.class.d.ts.map +1 -1
  52. package/dist/components/charts/chart/lite-chart.class.js.map +1 -1
  53. package/dist/components/conversation/code-block/greycat-language.d.ts +5 -0
  54. package/dist/components/conversation/code-block/greycat-language.d.ts.map +1 -1
  55. package/dist/components/conversation/code-block/greycat-language.js +48 -6
  56. package/dist/components/conversation/code-block/greycat-language.js.map +1 -1
  57. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +5 -3
  58. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts.map +1 -1
  59. package/dist/components/conversation/message-feedback/message-feedback.class.js.map +1 -1
  60. package/dist/components/conversation/thread-list/thread-list.class.d.ts +16 -3
  61. package/dist/components/conversation/thread-list/thread-list.class.d.ts.map +1 -1
  62. package/dist/components/conversation/thread-list/thread-list.class.js +13 -3
  63. package/dist/components/conversation/thread-list/thread-list.class.js.map +1 -1
  64. package/dist/components/data/calendar/calendar.class.d.ts +3 -1
  65. package/dist/components/data/calendar/calendar.class.d.ts.map +1 -1
  66. package/dist/components/data/calendar/calendar.class.js.map +1 -1
  67. package/dist/components/data/calendar/calendar.styles.js +3 -3
  68. package/dist/components/data/document-library/document-library.class.d.ts +6 -5
  69. package/dist/components/data/document-library/document-library.class.d.ts.map +1 -1
  70. package/dist/components/data/document-library/document-library.class.js +2 -3
  71. package/dist/components/data/document-library/document-library.class.js.map +1 -1
  72. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +8 -1
  73. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts.map +1 -1
  74. package/dist/components/data/flow-canvas/flow-canvas.class.js +5 -0
  75. package/dist/components/data/flow-canvas/flow-canvas.class.js.map +1 -1
  76. package/dist/components/data/flow-canvas/flow-canvas.styles.d.ts.map +1 -1
  77. package/dist/components/data/flow-canvas/flow-canvas.styles.js +2 -1
  78. package/dist/components/data/flow-canvas/flow-canvas.styles.js.map +1 -1
  79. package/dist/components/data/heatmap/heatmap.class.d.ts +6 -2
  80. package/dist/components/data/heatmap/heatmap.class.d.ts.map +1 -1
  81. package/dist/components/data/heatmap/heatmap.class.js.map +1 -1
  82. package/dist/components/data/table/table.class.d.ts +16 -4
  83. package/dist/components/data/table/table.class.d.ts.map +1 -1
  84. package/dist/components/data/table/table.class.js.map +1 -1
  85. package/dist/components/data/tree/tree.class.d.ts +3 -1
  86. package/dist/components/data/tree/tree.class.d.ts.map +1 -1
  87. package/dist/components/data/tree/tree.class.js.map +1 -1
  88. package/dist/components/data/word-cloud/word-cloud-layout.d.ts +7 -2
  89. package/dist/components/data/word-cloud/word-cloud-layout.d.ts.map +1 -1
  90. package/dist/components/data/word-cloud/word-cloud-layout.js.map +1 -1
  91. package/dist/components/data/word-cloud/word-cloud.class.d.ts +3 -3
  92. package/dist/components/data/word-cloud/word-cloud.class.d.ts.map +1 -1
  93. package/dist/components/data/word-cloud/word-cloud.class.js.map +1 -1
  94. package/dist/components/forms/button/button.class.d.ts +5 -0
  95. package/dist/components/forms/button/button.class.d.ts.map +1 -1
  96. package/dist/components/forms/button/button.class.js +5 -0
  97. package/dist/components/forms/button/button.class.js.map +1 -1
  98. package/dist/components/forms/button/button.styles.d.ts.map +1 -1
  99. package/dist/components/forms/button/button.styles.js +6 -2
  100. package/dist/components/forms/button/button.styles.js.map +1 -1
  101. package/dist/components/forms/color-picker/color-picker.class.d.ts +4 -0
  102. package/dist/components/forms/color-picker/color-picker.class.d.ts.map +1 -1
  103. package/dist/components/forms/color-picker/color-picker.class.js +6 -0
  104. package/dist/components/forms/color-picker/color-picker.class.js.map +1 -1
  105. package/dist/components/forms/color-picker/color-picker.styles.d.ts.map +1 -1
  106. package/dist/components/forms/color-picker/color-picker.styles.js +20 -2
  107. package/dist/components/forms/color-picker/color-picker.styles.js.map +1 -1
  108. package/dist/components/forms/combobox/combobox.class.d.ts +2 -2
  109. package/dist/components/forms/combobox/combobox.class.d.ts.map +1 -1
  110. package/dist/components/forms/combobox/combobox.class.js +1 -1
  111. package/dist/components/forms/combobox/combobox.class.js.map +1 -1
  112. package/dist/components/forms/combobox/combobox.styles.d.ts.map +1 -1
  113. package/dist/components/forms/combobox/combobox.styles.js +8 -0
  114. package/dist/components/forms/combobox/combobox.styles.js.map +1 -1
  115. package/dist/components/forms/date-picker/date-picker.class.d.ts +4 -0
  116. package/dist/components/forms/date-picker/date-picker.class.d.ts.map +1 -1
  117. package/dist/components/forms/date-picker/date-picker.class.js +6 -0
  118. package/dist/components/forms/date-picker/date-picker.class.js.map +1 -1
  119. package/dist/components/forms/date-picker/date-picker.styles.d.ts.map +1 -1
  120. package/dist/components/forms/date-picker/date-picker.styles.js +15 -0
  121. package/dist/components/forms/date-picker/date-picker.styles.js.map +1 -1
  122. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +9 -2
  123. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts.map +1 -1
  124. package/dist/components/forms/emoji-picker/emoji-picker.class.js +11 -2
  125. package/dist/components/forms/emoji-picker/emoji-picker.class.js.map +1 -1
  126. package/dist/components/forms/emoji-picker/emoji-picker.styles.d.ts.map +1 -1
  127. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +30 -7
  128. package/dist/components/forms/emoji-picker/emoji-picker.styles.js.map +1 -1
  129. package/dist/components/forms/icon-button/icon-button.class.d.ts +20 -3
  130. package/dist/components/forms/icon-button/icon-button.class.d.ts.map +1 -1
  131. package/dist/components/forms/icon-button/icon-button.class.js +84 -4
  132. package/dist/components/forms/icon-button/icon-button.class.js.map +1 -1
  133. package/dist/components/forms/icon-button/icon-button.styles.d.ts.map +1 -1
  134. package/dist/components/forms/icon-button/icon-button.styles.js +4 -0
  135. package/dist/components/forms/icon-button/icon-button.styles.js.map +1 -1
  136. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +221 -0
  137. package/dist/components/forms/locale-picker/locale-picker.class.d.ts.map +1 -0
  138. package/dist/components/forms/locale-picker/locale-picker.class.js +630 -0
  139. package/dist/components/forms/locale-picker/locale-picker.class.js.map +1 -0
  140. package/dist/components/forms/locale-picker/locale-picker.d.ts +3 -0
  141. package/dist/components/forms/locale-picker/locale-picker.d.ts.map +1 -0
  142. package/dist/components/forms/locale-picker/locale-picker.js +6 -0
  143. package/dist/components/forms/locale-picker/locale-picker.js.map +1 -0
  144. package/dist/components/forms/locale-picker/locale-picker.styles.d.ts +2 -0
  145. package/dist/components/forms/locale-picker/locale-picker.styles.d.ts.map +1 -0
  146. package/dist/components/forms/locale-picker/locale-picker.styles.js +213 -0
  147. package/dist/components/forms/locale-picker/locale-picker.styles.js.map +1 -0
  148. package/dist/components/forms/phone-input/phone-input.class.d.ts +11 -0
  149. package/dist/components/forms/phone-input/phone-input.class.d.ts.map +1 -1
  150. package/dist/components/forms/phone-input/phone-input.class.js +13 -0
  151. package/dist/components/forms/phone-input/phone-input.class.js.map +1 -1
  152. package/dist/components/forms/phone-input/phone-input.styles.d.ts.map +1 -1
  153. package/dist/components/forms/phone-input/phone-input.styles.js +39 -3
  154. package/dist/components/forms/phone-input/phone-input.styles.js.map +1 -1
  155. package/dist/components/forms/select/select.class.d.ts +2 -2
  156. package/dist/components/forms/select/select.class.d.ts.map +1 -1
  157. package/dist/components/forms/select/select.class.js +1 -1
  158. package/dist/components/forms/select/select.class.js.map +1 -1
  159. package/dist/components/forms/select/select.styles.d.ts.map +1 -1
  160. package/dist/components/forms/select/select.styles.js +6 -0
  161. package/dist/components/forms/select/select.styles.js.map +1 -1
  162. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +12 -3
  163. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts.map +1 -1
  164. package/dist/components/forms/swatch-picker/swatch-picker.class.js +14 -3
  165. package/dist/components/forms/swatch-picker/swatch-picker.class.js.map +1 -1
  166. package/dist/components/forms/swatch-picker/swatch-picker.styles.d.ts.map +1 -1
  167. package/dist/components/forms/swatch-picker/swatch-picker.styles.js +32 -9
  168. package/dist/components/forms/swatch-picker/swatch-picker.styles.js.map +1 -1
  169. package/dist/components/forms/time-range/time-range.class.d.ts +8 -0
  170. package/dist/components/forms/time-range/time-range.class.d.ts.map +1 -1
  171. package/dist/components/forms/time-range/time-range.class.js +10 -0
  172. package/dist/components/forms/time-range/time-range.class.js.map +1 -1
  173. package/dist/components/forms/time-range/time-range.styles.d.ts.map +1 -1
  174. package/dist/components/forms/time-range/time-range.styles.js +42 -13
  175. package/dist/components/forms/time-range/time-range.styles.js.map +1 -1
  176. package/dist/components/forms/token-input/token-input.class.d.ts +11 -0
  177. package/dist/components/forms/token-input/token-input.class.d.ts.map +1 -1
  178. package/dist/components/forms/token-input/token-input.class.js +13 -0
  179. package/dist/components/forms/token-input/token-input.class.js.map +1 -1
  180. package/dist/components/forms/token-input/token-input.styles.d.ts.map +1 -1
  181. package/dist/components/forms/token-input/token-input.styles.js +36 -2
  182. package/dist/components/forms/token-input/token-input.styles.js.map +1 -1
  183. package/dist/components/layout/app-rail/app-rail.class.d.ts +6 -2
  184. package/dist/components/layout/app-rail/app-rail.class.d.ts.map +1 -1
  185. package/dist/components/layout/app-rail/app-rail.class.js.map +1 -1
  186. package/dist/components/layout/control-group/control-group.class.d.ts +16 -0
  187. package/dist/components/layout/control-group/control-group.class.d.ts.map +1 -1
  188. package/dist/components/layout/control-group/control-group.class.js +19 -0
  189. package/dist/components/layout/control-group/control-group.class.js.map +1 -1
  190. package/dist/components/layout/control-group/control-group.styles.d.ts.map +1 -1
  191. package/dist/components/layout/control-group/control-group.styles.js +8 -3
  192. package/dist/components/layout/control-group/control-group.styles.js.map +1 -1
  193. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts +3 -0
  194. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts.map +1 -1
  195. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +3 -0
  196. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js.map +1 -1
  197. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.d.ts.map +1 -1
  198. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +2 -1
  199. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js.map +1 -1
  200. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +59 -0
  201. package/dist/components/layout/reorder-list/reorder-item.class.d.ts.map +1 -0
  202. package/dist/components/layout/reorder-list/reorder-item.class.js +110 -0
  203. package/dist/components/layout/reorder-list/reorder-item.class.js.map +1 -0
  204. package/dist/components/layout/reorder-list/reorder-item.d.ts +2 -0
  205. package/dist/components/layout/reorder-list/reorder-item.d.ts.map +1 -0
  206. package/dist/components/layout/reorder-list/reorder-item.js +5 -0
  207. package/dist/components/layout/reorder-list/reorder-item.js.map +1 -0
  208. package/dist/components/{data/data-grid/data-grid.styles.d.ts → layout/reorder-list/reorder-item.styles.d.ts} +1 -1
  209. package/dist/components/layout/reorder-list/reorder-item.styles.d.ts.map +1 -0
  210. package/dist/components/layout/reorder-list/reorder-item.styles.js +62 -0
  211. package/dist/components/layout/reorder-list/reorder-item.styles.js.map +1 -0
  212. package/dist/components/layout/reorder-list/reorder-list.class.d.ts +77 -0
  213. package/dist/components/layout/reorder-list/reorder-list.class.d.ts.map +1 -0
  214. package/dist/components/layout/reorder-list/reorder-list.class.js +197 -0
  215. package/dist/components/layout/reorder-list/reorder-list.class.js.map +1 -0
  216. package/dist/components/layout/reorder-list/reorder-list.d.ts +3 -0
  217. package/dist/components/layout/reorder-list/reorder-list.d.ts.map +1 -0
  218. package/dist/components/layout/reorder-list/reorder-list.js +6 -0
  219. package/dist/components/layout/reorder-list/reorder-list.js.map +1 -0
  220. package/dist/components/layout/reorder-list/reorder-list.styles.d.ts +2 -0
  221. package/dist/components/layout/reorder-list/reorder-list.styles.d.ts.map +1 -0
  222. package/dist/components/layout/reorder-list/reorder-list.styles.js +12 -0
  223. package/dist/components/layout/reorder-list/reorder-list.styles.js.map +1 -0
  224. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +7 -1
  225. package/dist/components/layout/virtual-list/virtual-list.class.d.ts.map +1 -1
  226. package/dist/components/layout/virtual-list/virtual-list.class.js +3 -0
  227. package/dist/components/layout/virtual-list/virtual-list.class.js.map +1 -1
  228. package/dist/components/layout/virtual-list/virtual-list.styles.d.ts.map +1 -1
  229. package/dist/components/layout/virtual-list/virtual-list.styles.js +2 -1
  230. package/dist/components/layout/virtual-list/virtual-list.styles.js.map +1 -1
  231. package/dist/components/overlays/chip/chip.class.d.ts +2 -2
  232. package/dist/components/overlays/chip/chip.class.d.ts.map +1 -1
  233. package/dist/components/overlays/chip/chip.class.js +1 -1
  234. package/dist/components/overlays/chip/chip.styles.d.ts.map +1 -1
  235. package/dist/components/overlays/chip/chip.styles.js +10 -0
  236. package/dist/components/overlays/chip/chip.styles.js.map +1 -1
  237. package/dist/components/overlays/overlay/popover.class.d.ts +3 -1
  238. package/dist/components/overlays/overlay/popover.class.d.ts.map +1 -1
  239. package/dist/components/overlays/overlay/popover.class.js.map +1 -1
  240. package/dist/components/retrieval/graph/graph.class.d.ts +7 -3
  241. package/dist/components/retrieval/graph/graph.class.d.ts.map +1 -1
  242. package/dist/components/retrieval/graph/graph.class.js.map +1 -1
  243. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +6 -3
  244. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts.map +1 -1
  245. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js.map +1 -1
  246. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +4 -2
  247. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts.map +1 -1
  248. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js.map +1 -1
  249. package/dist/components/utility/diff-view/diff-view.class.d.ts +4 -1
  250. package/dist/components/utility/diff-view/diff-view.class.d.ts.map +1 -1
  251. package/dist/components/utility/diff-view/diff-view.class.js.map +1 -1
  252. package/dist/components/utility/format/relative-time.class.d.ts.map +1 -1
  253. package/dist/components/utility/format/relative-time.class.js +4 -1
  254. package/dist/components/utility/format/relative-time.class.js.map +1 -1
  255. package/dist/components/viewers/document-compare/document-compare.class.d.ts +9 -2
  256. package/dist/components/viewers/document-compare/document-compare.class.d.ts.map +1 -1
  257. package/dist/components/viewers/document-compare/document-compare.class.js.map +1 -1
  258. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts +6 -0
  259. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts.map +1 -1
  260. package/dist/components/viewers/geojson-view/geojson-view.class.js.map +1 -1
  261. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts.map +1 -1
  262. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js.map +1 -1
  263. package/dist/internal/localization.d.ts +11 -1
  264. package/dist/internal/localization.d.ts.map +1 -1
  265. package/dist/internal/localization.js +24 -1
  266. package/dist/internal/localization.js.map +1 -1
  267. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  268. package/dist/internal/root-registration-allowlist.d.ts.map +1 -1
  269. package/dist/internal/root-registration-allowlist.js +3 -1
  270. package/dist/internal/root-registration-allowlist.js.map +1 -1
  271. package/dist/internal/tokens.styles.d.ts.map +1 -1
  272. package/dist/internal/tokens.styles.js +1 -0
  273. package/dist/internal/tokens.styles.js.map +1 -1
  274. package/dist/lyra.d.ts +11 -5
  275. package/dist/lyra.d.ts.map +1 -1
  276. package/dist/lyra.js +7 -3
  277. package/dist/lyra.js.map +1 -1
  278. package/dist/theme.css +1 -0
  279. package/llms/components/lr-button.md +4 -1
  280. package/llms/components/lr-chip-group.md +1 -1
  281. package/llms/components/lr-chip.md +1 -1
  282. package/llms/components/lr-color-picker.md +7 -1
  283. package/llms/components/lr-combobox.md +1 -1
  284. package/llms/components/lr-confirm-bar.md +31 -4
  285. package/llms/components/lr-control-group.md +12 -4
  286. package/llms/components/lr-dashboard-grid.md +4 -1
  287. package/llms/components/lr-date-input.md +5 -1
  288. package/llms/components/lr-date-picker.md +5 -1
  289. package/llms/components/lr-emoji-picker.md +11 -6
  290. package/llms/components/lr-eval-dataset.md +1 -1
  291. package/llms/components/lr-eval-result.md +4 -4
  292. package/llms/components/lr-flag.md +9 -5
  293. package/llms/components/lr-flow-canvas.md +7 -1
  294. package/llms/components/lr-icon-button.md +10 -5
  295. package/llms/components/lr-locale-picker.md +86 -0
  296. package/llms/components/lr-option.md +1 -1
  297. package/llms/components/lr-phone-input.md +10 -3
  298. package/llms/components/lr-reorder-item.md +81 -0
  299. package/llms/components/lr-reorder-list.md +81 -0
  300. package/llms/components/lr-select.md +2 -2
  301. package/llms/components/lr-swatch-picker.md +15 -9
  302. package/llms/components/lr-thread-list.md +11 -6
  303. package/llms/components/lr-time-range.md +8 -0
  304. package/llms/components/lr-token-input.md +14 -6
  305. package/llms/components/lr-tool-approval-dialog.md +30 -6
  306. package/llms/components/lr-virtual-list.md +5 -1
  307. package/llms/index.md +7 -5
  308. package/llms/shared.md +13 -4
  309. package/llms/tokens.md +4 -2
  310. package/llms-full.txt +362 -120
  311. package/llms.txt +4 -4
  312. package/package.json +8 -3
  313. package/vscode-css-data.json +183 -8
  314. package/vscode-html-data.json +521 -366
  315. package/web-types.json +810 -96
  316. package/dist/components/data/data-grid/data-grid.class.d.ts +0 -69
  317. package/dist/components/data/data-grid/data-grid.class.d.ts.map +0 -1
  318. package/dist/components/data/data-grid/data-grid.class.js +0 -123
  319. package/dist/components/data/data-grid/data-grid.class.js.map +0 -1
  320. package/dist/components/data/data-grid/data-grid.d.ts +0 -2
  321. package/dist/components/data/data-grid/data-grid.d.ts.map +0 -1
  322. package/dist/components/data/data-grid/data-grid.js +0 -5
  323. package/dist/components/data/data-grid/data-grid.js.map +0 -1
  324. package/dist/components/data/data-grid/data-grid.styles.d.ts.map +0 -1
  325. package/dist/components/data/data-grid/data-grid.styles.js +0 -15
  326. package/dist/components/data/data-grid/data-grid.styles.js.map +0 -1
  327. package/llms/components/lr-data-grid.md +0 -55
package/llms-full.txt CHANGED
@@ -7,7 +7,7 @@ Agent UI. Selected components retain documented Web Awesome-compatible public na
7
7
  prefix to make migration easier, but Lyra has its own implementation, design tokens, localization
8
8
  runtime, RTL behavior, and release surface. It has no runtime dependency on either project.
9
9
 
10
- **This file is the whole catalog concatenated — 249 components, several hundred thousand tokens.**
10
+ **This file is the whole catalog concatenated — 251 components, several hundred thousand tokens.**
11
11
  Read it end to end only if you genuinely need everything. Otherwise:
12
12
 
13
13
  | To… | Read |
@@ -31,9 +31,9 @@ and costs a few hundred tokens instead of the whole catalog. `llms/index.md` map
31
31
  family and entry point.
32
32
 
33
33
  - **Foundation** — base class, form association, events, i18n, theming, TypeScript, frameworks, SSR, packaging (`llms/shared.md`)
34
- - **Form controls & inputs** — 25 tags in `components/forms/`
35
- - **Data display, dashboards & flow canvas** — 25 tags in `components/data/`
36
- - **Layout, navigation & structure** — 28 tags in `components/layout/`
34
+ - **Form controls & inputs** — 26 tags in `components/forms/`
35
+ - **Data display, dashboards & flow canvas** — 24 tags in `components/data/`
36
+ - **Layout, navigation & structure** — 30 tags in `components/layout/`
37
37
  - **Overlays, status & feedback** — 19 tags in `components/overlays/`
38
38
  - **Utilities, formatting & observers** — 19 tags in `components/utility/`
39
39
  - **Media, files & maps** — 18 tags in `components/media/`
@@ -58,7 +58,7 @@ import '@aceshooting/lyra-ui/components/forms/combobox/combobox.js'; // register
58
58
  import '@aceshooting/lyra-ui/components/data/table/table.js'; // registers <lr-table>
59
59
  ```
60
60
 
61
- `llms/index.md` lists the exact path for all 249 tags. A wrong or missing family segment is a hard
61
+ `llms/index.md` lists the exact path for all 251 tags. A wrong or missing family segment is a hard
62
62
  module-resolution failure, not a silent no-op — `exports` maps `./components/*` straight onto
63
63
  `./dist/components/*`.
64
64
 
@@ -266,12 +266,21 @@ setLyraLocale('fr'); // …or just set <html lang="fr"> and let components inher
266
266
  ```
267
267
 
268
268
  Exported from the package root: `registerLyraLocale`, `setLyraLocale`, `getLyraLocale`,
269
- `resolveLyraLocale`, `resolveLyraDirection`, `resolveLyraString`, `LYRA_DEFAULT_STRINGS`, and the
270
- types `LyraLocaleStrings` / `LyraMessageKey`. **`LYRA_DEFAULT_STRINGS` is the authoritative key list**
271
- (996 keys, matching the `LyraMessageKey` union) read it to find the key to override rather than
269
+ `getRegisteredLyraLocales`, `subscribeLyraLocaleRegistry`, `resolveLyraLocale`,
270
+ `resolveLyraDirection`, `resolveLyraString`, `LYRA_DEFAULT_STRINGS`, and the types
271
+ `LyraLocaleStrings` / `LyraMessageKey`. **`LYRA_DEFAULT_STRINGS` is the authoritative key list**
272
+ (1005 keys, matching the `LyraMessageKey` union) — read it to find the key to override rather than
272
273
  guessing one. Lookup falls back exact locale → base language → English. Date, number, byte,
273
274
  relative-time and calendar output goes through `Intl`.
274
275
 
276
+ `getRegisteredLyraLocales(): string[]` lists every locale with strings registered via
277
+ `registerLyraLocale()`, plus `'en'` (always available through the built-in English fallback),
278
+ sorted and deduped. `subscribeLyraLocaleRegistry(listener: () => void): () => void` fires whenever
279
+ `registerLyraLocale()` registers *any* locale — including one that isn't the currently active
280
+ locale — unlike the page-level locale-change subscription every component already uses
281
+ internally, which only fires for the active locale's own string changes. `<lr-locale-picker>` is
282
+ the built-in consumer of both; see `llms/components/lr-locale-picker.md`.
283
+
275
284
  Gotcha: `localize()`'s optional second argument is a fallback string. Passing a defined literal there
276
285
  silently defeats a registered catalog — omit it, or pass `undefined`.
277
286
 
@@ -504,7 +513,7 @@ shared `FormAssociated` mixin — see gotchas).
504
513
 
505
514
  **Properties:**
506
515
  - `multiple: boolean = false` (reflected)
507
- - `size: 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — same scale as `lr-select`'s `size`;
516
+ - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — same scale as `lr-select`'s `size`;
508
517
  also scales the "+N" overflow tag and decorative expand icon; `size="s"` shares its outer
509
518
  control height with `lr-input`, `lr-select`, and `lr-segmented` without part overrides)
510
519
  - `placeholder: string = ''`
@@ -748,8 +757,8 @@ exactly like the multi-option case, until the trigger is actually activated.
748
757
  - `errorText: string = ''` (attribute `error-text` — static error copy shown below the hint;
749
758
  overridden by slotted `error` content when provided)
750
759
  - `open: boolean = false` (reflected)
751
- - `size: 'xs'|'s'|'m'|'l'|'xl' = 'm'` (reflected — same scale as `lr-toast-item`'s `size`, for
752
- compact toolbar placements that don't fit the default trigger height)
760
+ - `size: '2xs'|'xs'|'s'|'m'|'l'|'xl' = 'm'` (reflected — same scale as `lr-input`/`lr-combobox`'s
761
+ `size`, for compact toolbar placements that don't fit the default trigger height)
753
762
  - `autoCommitSingleOption: boolean = false` (attribute `auto-commit-single-option`) — opts in to the
754
763
  single-option auto-commit behavior described above
755
764
  - `value: string` — a getter/setter; always a single string (no `multiple` mode)
@@ -868,6 +877,10 @@ Inline month-grid calendar, not form-associated (used standalone or embedded ins
868
877
  - `disablePast: boolean = false` (attribute `disable-past`)
869
878
  - `disableFuture: boolean = false` (attribute `disable-future`)
870
879
  - `withOutsideDays: boolean = false` (attribute `with-outside-days`)
880
+ - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected) — scales calendar cell density
881
+ proportionally; unlike `lr-input`'s row-height scale (text containers), this scales cell density
882
+ itself (fewer/more days per visual unit). Month title, weekday labels, and nav buttons stay fixed
883
+ across tiers.
871
884
  - `previousLabel: string = 'Previous month'` (attribute `previous-label` — accessible label for the
872
885
  previous-month nav button; override for a non-English `locale`)
873
886
  - `nextLabel: string = 'Next month'` (attribute `next-label` — accessible label for the next-month
@@ -889,7 +902,7 @@ mode only)
889
902
  `day-range-end`, `day-range-inner`, `day-placeholder`
890
903
 
891
904
  **Themeable custom properties:** `--lr-cell-size` (default `2.25rem`, controls day-cell/grid-column
892
- size).
905
+ size; auto-scaled per `size` tier — `2xs`/`xs`/`s`/`l`/`xl`; `m` keeps the `:host` default).
893
906
 
894
907
  **Optional peer deps:** none.
895
908
 
@@ -1219,7 +1232,10 @@ and the per-`size`
1219
1232
  `min-block-size` floors `--lr-button-size-2xs` (`1.25rem`), `--lr-button-size-xs` (`1.5rem`),
1220
1233
  `--lr-button-size-s` (`1.75rem`), `--lr-button-size-m` (`2rem`), `--lr-button-size-l` (`2.5rem`),
1221
1234
  `--lr-button-size-xl` (`3rem`) — each read only by its own `size` tier, and all ignored by
1222
- `appearance="link"`.
1235
+ `appearance="link"`. `--lr-button-gap` (default `--lr-space-2xs`, the gap between the icon/label
1236
+ and any slotted content) and `--lr-button-radius` (default `--lr-radius`, the corner radius) are
1237
+ both retunable without a `::part(base)` rule but — unlike the four size knobs below — do not vary
1238
+ by `size` tier; `appearance="link"` ignores `--lr-button-radius` (it renders with zero radius).
1223
1239
 
1224
1240
  **Retuning one `size` tier's geometry, without a `::part(base)` rule.** Four more properties carry
1225
1241
  the active tier's geometry, and every `:host([size='…'])` rule does nothing but re-assign them — no
@@ -1292,11 +1308,16 @@ complete element — an `<svg>`, an `<img>`, an `<lr-flag>` — render at its ow
1292
1308
  instead of being forced into a 1:1 box. Setting both `icon` and slotted content renders both, side
1293
1309
  by side; that is a valid composition, not a fallback.
1294
1310
 
1295
- **Migration note:** bare SVG *geometry* (`<path>`, `<circle>`, `<rect>` …) slotted with no `icon`
1296
- set has no SVG parent here and will not paint. Wrap it in an `<lr-icon>`, or in a complete `<svg>`
1297
- of your own.
1311
+ **Bare SVG geometry fallback:** slotted bare SVG *geometry* (`path`, `circle`, `rect`, `line`,
1312
+ `polygon`, `polyline`, `ellipse`, `g`, `use`) with no `icon` set and no enclosing `<svg>` of its
1313
+ own has no real SVG parent as parsed, and is detected and cloned into an internal
1314
+ `[part="fallback"]` SVG-namespaced element so it still paints — the same fallback `<lr-icon>`'s own
1315
+ custom-content slot uses. This is narrowly scoped to that whitelist: a complete `<svg>`, `<img>`,
1316
+ or custom element (e.g. `<lr-flag>`) is never touched by it and keeps rendering as an untouched
1317
+ sibling at its own natural aspect ratio.
1298
1318
 
1299
- **CSS parts:** `button`
1319
+ **CSS parts:** `button`, `fallback` (only present in the DOM while at least one top-level slotted
1320
+ element needs the bare-geometry fallback above)
1300
1321
 
1301
1322
  **Themeable custom properties:** `--lr-icon-button-size` (default `2.5rem`) is the **minimum**
1302
1323
  tappable inline and block size of the native button — a floor, not a fixed size. Content larger
@@ -1550,6 +1571,9 @@ interface PhoneNumberAdapter {
1550
1571
  `@aceshooting/lyra-ui/components/media/flag/flag-peer.js` once; without that registration the
1551
1572
  trigger simply omits the image. The open popup list stays text-only — a native `<option>` cannot
1552
1573
  contain elements.
1574
+ - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — same scale as `lr-input`'s
1575
+ `size`; scales input padding, font size, and wrapper min-height; `size="s"` shares its outer
1576
+ control height with `lr-input`, `lr-select`, and `lr-combobox` without part overrides)
1553
1577
  - `country: string` — current uppercase ISO alpha-2 selection; falls back to `defaultCountry`, then
1554
1578
  the first explicit/adapter country. Changing the country reparses the editable number.
1555
1579
  - `label: string = ''`, `hint: string = ''`, `errorText: string = ''` (attribute `error-text`) —
@@ -1616,9 +1640,13 @@ such as a consumer-owned `<lr-flag>`; no flag package is imported automatically)
1616
1640
  `flags`), `country-code` (selected alpha-2 code, `data-placeholder` when no country exists),
1617
1641
  `expand-icon`, `calling-code`, `input`, `hint`, `error`.
1618
1642
 
1619
- **Themeable custom properties:** shared tokens only. The phone-number input and calling code are
1620
- deliberately `dir="ltr"`/isolated because telephone numbers are algorithmic content; surrounding
1621
- form chrome and the country selector inherit LTR/RTL and use logical spacing/borders.
1643
+ **Themeable custom properties:** `--lr-phone-input-padding-block`, `--lr-phone-input-font-size`,
1644
+ and `--lr-phone-input-control-min-height` (each scaled by `size`), plus `--lr-phone-input-control-height`
1645
+ to pin an exact input-wrapper height (both floors and caps it — use it for pixel-matching an
1646
+ `<lr-input>` or `<lr-select>` in the same toolbar row; undeclared by default, leaving the min height
1647
+ as a floor only). The phone-number input and calling code are deliberately `dir="ltr"`/isolated
1648
+ because telephone numbers are algorithmic content; surrounding form chrome and the country selector
1649
+ inherit LTR/RTL and use logical spacing/borders.
1622
1650
 
1623
1651
  **Optional peer deps:** `libphonenumber-js` is declared optional but never imported by Lyra itself.
1624
1652
  For full national parsing/formatting, install it in the consuming app and pass it through the
@@ -1688,6 +1716,10 @@ consumer-facing `disabled` property/attribute itself.
1688
1716
  - `start: number = 0`
1689
1717
  - `end: number = 100`
1690
1718
  - `step: number = 1`
1719
+ - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected) — visual size; proportionally
1720
+ scales the handle, track, and preset buttons via a single `--lr-time-range-size-scale` multiplier
1721
+ (not pixel-matched to `lr-input`'s row-height scale — this component's own dimensions aren't on
1722
+ that ladder); the drag hit-area never shrinks below 24px (WCAG 2.5.8)
1691
1723
  - `disabled: boolean = false` (reflected)
1692
1724
  - `startLabel: string = 'Range start'` (attribute `start-label`) — `aria-label` for the start handle
1693
1725
  - `endLabel: string = 'Range end'` (attribute `end-label`) — `aria-label` for the end handle
@@ -1717,6 +1749,10 @@ palette: `--lr-time-range-preset-active-bg` (falls back to `--lr-color-brand`),
1717
1749
  `--lr-time-range-preset-active-color` (falls back to `--lr-color-on-brand`). Unset, each resolves
1718
1750
  to exactly the token the rule used before they existed, so the default rendering is unchanged.
1719
1751
 
1752
+ One additional component-local property, `--lr-time-range-size-scale` (unitless multiplier,
1753
+ default 1, automatically set based on the `size` property), scales the handle, track, and preset
1754
+ button dimensions proportionally — unset, it defaults to 1 (size='m', no scaling).
1755
+
1720
1756
  They exist because the active preset is marked with an attribute on a part, and
1721
1757
  `::part(preset-button)[data-active]` is **invalid CSS** — an attribute selector cannot follow
1722
1758
  `::part()`. Without these, recoloring just the active preset meant hijacking the shared
@@ -1788,6 +1824,9 @@ named colors, the shape apps otherwise hand-roll as a row of round accent-color
1788
1824
  `<lr-segmented>`'s `SegmentedItem.icon`.
1789
1825
  - `value: string | null = null` — the currently selected option's `value` (controlled); `null`
1790
1826
  leaves nothing selected while keeping the first swatch tabbable.
1827
+ - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — scales the swatch hit-area and
1828
+ fill diameter proportionally, hit-area floored at 24px; not pixel-matched to `lr-input`'s
1829
+ row-height scale)
1791
1830
  - `label: string = ''` — accessible name copied to the internal `role="radiogroup"`; when empty, a
1792
1831
  host-level `aria-label` is used as a fallback.
1793
1832
 
@@ -1797,11 +1836,13 @@ changes via click or keyboard (re-selecting the current swatch is a no-op).
1797
1836
  **Slots:** none.
1798
1837
 
1799
1838
  **CSS parts:** `base` (the `role="radiogroup"` root), `swatch` (a single `role="radio"` color
1800
- swatch's interactive hit target, floored at the shared `--lr-icon-button-size` tap size; the
1801
- selected one is `[part='swatch'][aria-checked='true']`), `swatch-fill` (the compact
1802
- `--lr-size-1-5rem` filled circle inside it, rendered when the option has no `icon`), `swatch-icon`
1803
- (the option's `icon` shape, rendered in its place when it has one). Exactly one of
1804
- `swatch-fill`/`swatch-icon` is mounted per swatch, so the two never coexist.
1839
+ swatch's interactive hit target, sized via `--lr-swatch-picker-hit-size` defaults to
1840
+ `--lr-size-2-5rem`, swapped per `size` tier and floored at 24px; the selected one is
1841
+ `[part='swatch'][aria-checked='true']`), `swatch-fill` (the filled circle inside it, sized via
1842
+ `--lr-swatch-picker-fill-size` defaults to `--lr-size-1-5rem`, also swapped per `size` tier
1843
+ rendered when the option has no `icon`), `swatch-icon` (the option's `icon` shape, rendered in its
1844
+ place when it has one). Exactly one of `swatch-fill`/`swatch-icon` is mounted per swatch, so the
1845
+ two never coexist.
1805
1846
 
1806
1847
  **Themeable custom properties:** `--lr-swatch-picker-selected-color` (ring color around the
1807
1848
  selected swatch, defaults to `--lr-color-brand`, themeable independently of the focus ring),
@@ -1812,10 +1853,11 @@ shape), `--lr-swatch-picker-shine-duration` (default `0s`, a no-op; set a durati
1812
1853
  for a looping brighten-and-settle pulse on the selected swatch. It drives a separate
1813
1854
  `filter: brightness()` keyframe rather than `box-shadow`, so it composes with the blur token and
1814
1855
  works identically for a fill and an icon; disabled outright under `prefers-reduced-motion: reduce`,
1815
- which also drops the hover/selection scale transition); plus
1816
- shared tokens `--lr-color-border`/`-brand`, `--lr-icon-button-size`, `--lr-space-xs`,
1817
- `--lr-size-1-5rem`, `--lr-border-width-thin`/`-thick`, `--lr-radius`, `--lr-transition-fast`,
1818
- `--lr-focus-ring-*`.
1856
+ which also drops the hover/selection scale transition), `--lr-swatch-picker-hit-size` (hit-area
1857
+ size, swapped per `size` tier), `--lr-swatch-picker-fill-size` (visible fill/icon diameter, swapped
1858
+ per `size` tier); plus shared tokens — `--lr-color-border`/`-brand`, `--lr-space-xs`,
1859
+ `--lr-border-width-thin`/`-thick`, `--lr-radius`, `--lr-transition-fast`, `--lr-focus-ring-*`,
1860
+ and the per-tier `--lr-size-*` tokens.
1819
1861
 
1820
1862
  **Optional peer deps:** none.
1821
1863
 
@@ -2173,8 +2215,11 @@ the last token. `value` is a `string[]` and repeated values are submitted under
2173
2215
 
2174
2216
  **Properties:** `value`, `label`, `hint`, `errorText` (`error-text`), `placeholder`, `name`,
2175
2217
  `required`, `disabled`, `accessibleLabel` (attribute `aria-label` — forwarded to the internal text
2176
- input), `allowDuplicates` (`allow-duplicates`, default `false`), `editable` (reflected, default
2177
- `false` see below), and `delimiter: string | null` (default `','` see below).
2218
+ input), `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — same scale as `lr-input`'s
2219
+ `size`, scaling the input-wrapper's row height and text size across six tiers; the remove button's
2220
+ hit area stays fixed at `40px` across all sizes), `allowDuplicates` (`allow-duplicates`, default
2221
+ `false`), `editable` (reflected, default `false` — see below), and `delimiter: string | null` (default
2222
+ `','` — see below).
2178
2223
  **Slots:** `label`, `hint`, `error`.
2179
2224
  **Events:** `input`, `change`, `lr-add` (`detail: { value }`), `lr-remove`
2180
2225
  (`detail: { value, index }`), and `lr-token-edit`
@@ -2207,10 +2252,15 @@ does not work** — that is the four-character string `null`. Use `delimiter="no
2207
2252
  (both of which the attribute converter maps to `null`), or a property binding
2208
2253
  (`.delimiter=${null}`). Removing the attribute restores the `,` default.
2209
2254
 
2210
- **Themeable custom properties:** `--lr-token-input-input-inline-size` (the editable input's
2211
- `flex-basis` inside the wrapped token row; undeclared by default, falling back inline to
2212
- `--lr-size-8rem`), `--lr-token-input-min-input-inline-size` (default `--lr-size-4rem`, the floor
2213
- that input keeps once tokens have consumed the row), and `--lr-token-input-editor-inline-size`
2255
+ **Themeable custom properties:** `--lr-token-input-padding` (the input-wrapper padding, scaled by
2256
+ `size`), `--lr-token-input-font-size` (the input-wrapper and token font size, scaled by `size`),
2257
+ `--lr-token-input-control-min-height` (the input-wrapper's block-size floor, scaled by `size`),
2258
+ `--lr-token-input-control-height` (exact input-wrapper height undeclared by default, leaving the
2259
+ `--lr-token-input-control-min-height` floor only; set it to a length to both floor and cap the row,
2260
+ e.g. to pixel-match a sibling field in the same toolbar row), `--lr-token-input-input-inline-size`
2261
+ (the editable input's `flex-basis` inside the wrapped token row; undeclared by default, falling back
2262
+ inline to `--lr-size-8rem`), `--lr-token-input-min-input-inline-size` (default `--lr-size-4rem`, the
2263
+ floor that input keeps once tokens have consumed the row), and `--lr-token-input-editor-inline-size`
2214
2264
  (default `--lr-size-6rem`, the inline size of the inline token editor opened by `editable`).
2215
2265
 
2216
2266
  ## `lr-code-editor`
@@ -2278,12 +2328,18 @@ spaces — the Tab key keeps inserting `tabSize` spaces in that case.
2278
2328
 
2279
2329
  A form-associated native color picker with label, hint, and error chrome. **Properties:** the shared
2280
2330
  form properties `name`, `value`, `disabled`, and `required`, plus `label`, `hint`, `errorText`
2281
- (`error-text`), and `accessibleLabel` (`aria-label`). **Slots:** `label`, `hint`, `error`. **Events:**
2331
+ (`error-text`), `accessibleLabel` (`aria-label`), and `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'`
2332
+ (reflected — same scale as `lr-input`'s `size`, for compact swatch rendering at every density tier).
2333
+ **Slots:** `label`, `hint`, `error`. **Events:**
2282
2334
  composed `input` and `change`, `lr-change` with `{ value }`, and `focus`/`blur` (re-dispatched from
2283
2335
  the internal `<input>`'s own `focus`/`blur`, bubbling and composed unlike the native events). **CSS
2284
2336
  parts:** `form-control`, `form-control-label` (the label; `label` is an alias kept for back-compat),
2285
2337
  `input`, `hint`, `error`.
2286
2338
 
2339
+ **Themeable custom properties:** `--lr-color-picker-swatch-size` — the swatch's inline and block size,
2340
+ auto-swapped per `size` tier (default `'m'` reads `2.5rem`, `'2xs'` reads `1.25rem`, etc.), matching
2341
+ the size ladder `lr-input` uses.
2342
+
2287
2343
  ## `lr-emoji-picker`
2288
2344
 
2289
2345
  A searchable, keyboard-navigable, form-associated emoji picker. `groups` is fully consumer-suppliable
@@ -2310,7 +2366,8 @@ search/grid; unset renders no label chrome. When `label` (or the `label` slot) i
2310
2366
  localized default to `aria-labelledby` pointing at the visible label. `hint: string = ''` —
2311
2367
  supporting text rendered below the search/grid; unset renders no hint chrome. `errorText: string =
2312
2368
  ''` (attribute `error-text`) — validation-error text rendered below the hint (overridden by slotted
2313
- `error` content when provided); unset renders no error chrome.
2369
+ `error` content when provided); unset renders no error chrome. `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` —
2370
+ visual size; scales the emoji grid item box and its glyph proportionally, floored at 24px (WCAG 2.5.8).
2314
2371
 
2315
2372
  **Events:** `lr-change` with `detail: { emoji }` (an emoji was picked — click, or Enter/Space on
2316
2373
  the active grid cell; also sets `value`), plus the shared form `input`, `change`, `focus`, and `blur`.
@@ -2336,10 +2393,13 @@ error message). While windowing is active the rows are wrapped in `virtual-space
2336
2393
  emoji flex line).
2337
2394
 
2338
2395
  **Themeable custom properties:** `--lr-emoji-picker-item-size` (default `--lr-icon-button-size`,
2339
- each emoji button's box), `--lr-emoji-picker-gap` (default `--lr-space-2xs`, the gap between
2396
+ each emoji button's box; scaled by the `size` property), `--lr-emoji-picker-glyph-size` (default
2397
+ `--lr-font-size-lg`, the font size of the emoji glyph; scaled by the `size` property to keep the glyph
2398
+ proportional to the item box), `--lr-emoji-picker-gap` (default `--lr-space-2xs`, the gap between
2340
2399
  emoji within a windowed row), and `--lr-emoji-picker-row-height` (default
2341
- `calc(var(--lr-emoji-picker-item-size) + var(--lr-space-l))`, one windowed row's height). All three
2342
- are also read back in JS to derive columns-per-row and row offsets for the windowed layout,
2400
+ `calc(var(--lr-emoji-picker-item-size) + var(--lr-space-l))`, one windowed row's height).
2401
+ `--lr-emoji-picker-item-size`, `--lr-emoji-picker-gap`, and `--lr-emoji-picker-row-height` are also
2402
+ read back in JS to derive columns-per-row and row offsets for the windowed layout,
2343
2403
  resolved to real pixels by measuring hidden probe boxes the component's own stylesheet sizes from
2344
2404
  those same tokens — so any CSS length unit works, `rem`/`em` and `calc()` included, and the windowed
2345
2405
  geometry matches what is painted without expressing the tokens in `px`. The measurement is cached
@@ -2356,8 +2416,9 @@ repainting everything else that reads it — as the only way in. Like `lr-time-r
2356
2416
  properties, it is written as an inline `var()` fallback at the point of use rather than declared on
2357
2417
  `:host`, so a value set on **any ancestor** reaches it instead of being shadowed.
2358
2418
 
2359
- Two constraints remain. `--lr-emoji-picker-item-size` is clamped up to `--lr-icon-button-size`, the
2360
- shared minimum tappable box: a smaller value does not shrink the button, and the windowed geometry
2419
+ Two constraints remain. `--lr-emoji-picker-item-size` is held at a flat 24px minimum (WCAG 2.5.8
2420
+ touch target floor): the smaller `size` tier values can shrink the box below the old 40px
2421
+ unconditional floor, but the minimum holds at 24px regardless of tokens, and the windowed geometry
2361
2422
  follows the clamped, painted size. And windowed rows are absolutely positioned at the row-height
2362
2423
  pitch, so `--lr-emoji-picker-row-height` must stay at or above the item size plus the group-label
2363
2424
  band (`--lr-space-l`) — the default's own formula — or consecutive rows overlap. Columns per
@@ -2399,6 +2460,81 @@ dim through `--lr-opacity-disabled`, the same library-wide token every other dis
2399
2460
  reads — so retuning `--lr-theme-opacity-disabled` keeps this form's disabled state consistent with
2400
2461
  the rest of the UI instead of needing a `::part()` rule here.
2401
2462
 
2463
+ ## `lr-locale-picker`
2464
+
2465
+ A closed-list locale switcher over the library's own locale registry. First-party invention (no
2466
+ Web Awesome equivalent). With `locales` unset (the default), the offered rows are exactly
2467
+ `getRegisteredLyraLocales()` — every locale with strings registered via `registerLyraLocale()`,
2468
+ plus `en` — kept live via `subscribeLyraLocaleRegistry()`. Built directly on `lr-select`'s
2469
+ trigger-button/`aria-activedescendant` listbox technique, not composed from it — a plain closed
2470
+ list, no filter/free-text mode.
2471
+
2472
+ **Properties:**
2473
+ - `locales: LyraLocaleCatalog = []` (attribute: false) — `LyraLocaleCatalog = string[] |
2474
+ LyraLocaleEntry[]`, `LyraLocaleEntry { tag: string; label?: string }`. Empty (the default)
2475
+ auto-discovers the registry; a non-empty array (either form) overrides it entirely — a curated
2476
+ subset, custom order, custom labels, or a locale offered before its strings are registered.
2477
+ - `showFlags: boolean = true` — each row's leading `<lr-flag language={tag} variant="compact">`;
2478
+ `false` omits the flag element entirely (not just visually).
2479
+ - `value: string = ''` — the **committed** selection (form value, drives `lr-change`). While `''`
2480
+ and untouched, the trigger *displays* `effectiveLocale` as a preview label, but
2481
+ `checkValidity()`/`required` are governed by the real `value`, which stays `''` until a real
2482
+ commit — mirrors a native `<select>` showing its first option's text without that being a
2483
+ committed selection.
2484
+ - `required: boolean = false`, `disabled: boolean = false`, `name: string = ''` — standard
2485
+ form-associated properties.
2486
+ - `label: string = ''`, `hint: string = ''`, `errorText: string = ''` (attribute `error-text`) —
2487
+ same opt-in form-control chrome as `lr-select` (props + matching named slots + parts); unset
2488
+ renders none of it.
2489
+ - `open: boolean = false` (reflected).
2490
+ - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — same scale as `lr-select`'s `size`).
2491
+
2492
+ **Events:** `lr-change` (`detail: { value, previousValue }`, **cancelable**) — fired on every
2493
+ explicit pick; if not `defaultPrevented`, the component applies the pick itself via
2494
+ `setLyraLocale(value)`. A listener calling `event.preventDefault()` leaves `value` updated but the
2495
+ active locale untouched, so a host can persist the choice first and apply it later. `blur`/`focus`
2496
+ re-dispatched from the internal trigger as bubbling, composed events.
2497
+
2498
+ **Methods:** `focus(options?)`, `blur()`, and `click()` — all forward to the internal trigger
2499
+ button, same convention as `lr-select`'s identical trio.
2500
+
2501
+ **Slots:** `label`, `hint`, `error`.
2502
+
2503
+ **CSS parts:** `form-control`, `form-control-label`, `trigger`, `listbox`, `option`,
2504
+ `option-flag` (present only while `showFlags` is on), `option-label`, `option-tag` (the row's
2505
+ secondary line — the raw BCP-47 tag), `expand-icon`, `hint`, `error`.
2506
+
2507
+ **Themeable custom properties:** `--lr-locale-picker-trigger-padding`,
2508
+ `--lr-locale-picker-trigger-min-height`, `--lr-locale-picker-trigger-height` (unset by default, a
2509
+ floor-only escape hatch — set a length to both floor and cap the trigger),
2510
+ `--lr-locale-picker-font-size`, `--lr-locale-picker-expand-size` (all scaled by `size`), and
2511
+ `--lr-locale-picker-option-active-bg` (default `--lr-color-brand-quiet`, the hovered/keyboard-active
2512
+ row background).
2513
+
2514
+ **Optional peer deps:** none directly — each row's `<lr-flag>` degrades to an empty render (no
2515
+ peer warning duplication; `lr-flag` itself already logs one) when the optional
2516
+ `@aceshooting/lyra-flags` package isn't installed and `showFlags` is left on.
2517
+
2518
+ ```html
2519
+ <lr-locale-picker label="Language"></lr-locale-picker>
2520
+ <script type="module">
2521
+ import { registerLyraLocale } from '@aceshooting/lyra-ui';
2522
+ registerLyraLocale('fr', { close: 'Fermer' });
2523
+ document
2524
+ .querySelector('lr-locale-picker')
2525
+ .addEventListener('lr-change', (e) => console.log(e.detail.value));
2526
+ </script>
2527
+ ```
2528
+
2529
+ **Known gotchas:**
2530
+ - selecting a row applies `setLyraLocale()` itself unless the listener calls
2531
+ `event.preventDefault()` on `lr-change` — it does not touch
2532
+ `document.documentElement.lang`/`dir`; apply writing-direction changes to the page yourself.
2533
+ - no filter/free-text mode — for a catalog with hundreds+ of rows, roll your own with `lr-select`
2534
+ or `lr-combobox` instead.
2535
+ - arrow-key navigation is vertical-only (Home/End/ArrowUp/ArrowDown); there is no
2536
+ ArrowLeft/ArrowRight remap under RTL, since there is no horizontal axis to remap.
2537
+
2402
2538
  # Data display, dashboards & flow canvas (`components/data/`)
2403
2539
 
2404
2540
  ## `lr-sparkline`
@@ -3645,7 +3781,13 @@ that reads it. The same restriction motivates three more state-scoped outline co
3645
3781
  a node that is an invalid connect-gesture drop target; `--lr-flow-canvas-node-connect-target-outline-color`
3646
3782
  (default `var(--lr-color-brand)`) — outline of a node that is a valid connect-gesture drop target; and
3647
3783
  `--lr-flow-canvas-drop-active-outline-color` (default `var(--lr-color-brand)`) — outline of the
3648
- viewport itself while a palette item is dragged over it (`droppable`).
3784
+ viewport itself while a palette item is dragged over it (`droppable`). A fifth,
3785
+ `--lr-flow-canvas-node-hover-outline-color` (default `var(--lr-color-border-strong)`) — the
3786
+ mouse-hover preview of a node's own `:focus-visible` ring — exists for a different reason than the
3787
+ four above: it is `:hover`-gated rather than attribute-gated, so `::part(node):hover` *is* valid
3788
+ CSS here, but the internal `[part='node']:hover` rule still out-specifies it ((0,2,0) vs. (0,1,1)),
3789
+ which this custom property sidesteps the same way. Set it to `transparent` to opt out of the hover
3790
+ treatment entirely.
3649
3791
 
3650
3792
  **Optional peer deps:** none.
3651
3793
 
@@ -3966,50 +4108,6 @@ numbers, so the two circular-meter components in the library share one visual sc
3966
4108
 
3967
4109
  ---
3968
4110
 
3969
- ## `lr-data-grid`
3970
-
3971
- Keyboard-navigable data grid with typed `columns` and `rows`, sortable headers, roving cell focus,
3972
- loading/empty states, and responsive horizontal overflow.
3973
-
3974
- **Properties:**
3975
- - `columns: DataGridColumn<T>[] = []` (attribute: false) — `{ key, label, width?, sortable?,
3976
- value? }`; `width` becomes the header cell's `inline-size`, `value(row)` overrides the default
3977
- `row[key]` lookup
3978
- - `rows: T[] = []` (attribute: false)
3979
- - `rowKey: (row: T, index: number) => string | number = (_row, index) => index` (attribute: false)
3980
- - `selectedKey: string | number | null = null` (attribute: false) — compared against `rowKey(row, i)`
3981
- to set `[part='row'][data-selected]` and `aria-selected`
3982
- - `sortKey: string = ''`, `sortDirection: 'ascending' | 'descending' = 'ascending'`
3983
- (attribute: false) — the grid updates both on header activation and emits `lr-sort`, but never
3984
- reorders `rows`; sorting stays the consumer's job
3985
- - `loading: boolean = false` (reflected) — replaces the body with a localized "loading" row
3986
- - `emptyText: string = ''` (attribute `empty-text`) — empty-state text; falls back to the localized
3987
- `noData`
3988
- - `accessibleLabel: string = ''` (attribute `aria-label`) — names the `role="grid"` table; falls back
3989
- to the localized `dataGridLabel`
3990
-
3991
- **Keyboard:** exactly one cell is tabbable. Arrows move the roving focus (Left/Right are swapped
3992
- under RTL), Home/End jump to the first/last column of the current row, Enter/Space activate the row.
3993
- The focus position is re-clamped whenever `rows`/`columns` shrink, so the grid can't lose its tab stop.
3994
-
3995
- **Events:** `lr-row-click` (`detail: { row }`, click or Enter/Space), `lr-selection-change`
3996
- (`detail: { row }`, emitted alongside it after `selectedKey` updates), `lr-cell-focus`
3997
- (`detail: { row, column }`, `column` is the column `key`), `lr-sort` (`detail: { key, direction }`,
3998
- `sortable` columns only; re-activating the active column flips `direction`).
3999
-
4000
- **Slots:** none.
4001
-
4002
- **CSS parts:** `viewport` (the scrolling bordered wrapper), `grid` (the `<table role="grid">`),
4003
- `header` (each sticky `<th>`), `row`, `cell`, `empty` (the loading / no-data cell).
4004
-
4005
- **Themeable custom properties:** `--lr-data-grid-row-selected-bg` (default
4006
- `var(--lr-color-brand-quiet)`) — the background of the selected row's cells. It is an inline `var()`
4007
- fallback at its point of use rather than a `:host` declaration, so it can be set on the element *or
4008
- any ancestor*. It exists because Shadow Parts forbids an attribute selector after `::part()` —
4009
- `::part(row)[aria-selected='true']` is invalid CSS — leaving the library-wide
4010
- `--lr-color-brand-quiet` token as the only prior lever, which repaints every other surface reading
4011
- it. `lr-table` exposes the equivalent knob as `--lr-table-row-selected-bg`.
4012
-
4013
4111
  ## `lr-calendar`
4014
4112
 
4015
4113
  Responsive month calendar with event markers and an agenda view.
@@ -4835,14 +4933,18 @@ each falls back to the token its rule used before. Otherwise shared tokens —
4835
4933
 
4836
4934
  ## `lr-control-group`
4837
4935
 
4838
- Responsive semantic grouping for mixed controls and actions. It keeps slotted children in a
4839
- wrapping inline-flex row, centers children with different intrinsic heights, and switches to a
4840
- full-width allocation in narrow containers. Use it for dashboard toolbars that combine segmented
4841
- controls, selects, buttons, and other interactive elements.
4936
+ Semantic grouping for mixed controls and actions. It keeps slotted children in a wrapping
4937
+ inline-flex row and centers children with different intrinsic heights. Use it for dashboard
4938
+ toolbars that combine segmented controls, selects, buttons, and other interactive elements.
4842
4939
 
4843
4940
  **Properties:**
4844
4941
  - `label: string = ''` — accessible name for the internal `role="group"`; when empty, a host
4845
4942
  `aria-label` is forwarded as a fallback.
4943
+ - `responsive: boolean = false` (reflected) — opts into a `@container` narrow-allocation breakpoint
4944
+ (switches to a full-width allocation below `20rem`) by making the host a CSS size-query
4945
+ container. Left unset, the host is `container-type: normal`, since `container-type: inline-size`
4946
+ unconditionally would collapse the group to 0 inline size whenever it sits as an ordinary
4947
+ (`flex-basis: auto`) child of a shrink-to-fit flex row — this component's own primary use case.
4846
4948
 
4847
4949
  **Events:** none.
4848
4950
 
@@ -4865,6 +4967,79 @@ between grouped controls; shared spacing and layout tokens apply as well.
4865
4967
  - This is a layout and semantics primitive; it does not coordinate child values or emit a group
4866
4968
  change event.
4867
4969
  - Children wrap according to the group's own allocated inline size, not the viewport width.
4970
+ - The `@container` narrow-allocation breakpoint only applies when `responsive` is set. Setting
4971
+ `responsive` while this group also sits as a shrink-to-fit flex child re-introduces the 0-width
4972
+ collapse this default is designed to avoid — only opt in when the group's own size comes from
4973
+ somewhere else (a percentage width, a grid track, a block-level parent).
4974
+
4975
+ ---
4976
+
4977
+ ## `lr-reorder-list` / `lr-reorder-item`
4978
+
4979
+ A generic flat-list reorder primitive: per-row move-up/move-down buttons (always available), plus
4980
+ Ctrl/Cmd+ArrowUp/ArrowDown from focus anywhere inside a row — the same modifier convention
4981
+ `<lr-tree>`'s `reorderable` and `<lr-dashboard-grid>`'s `cells-draggable` already establish. Unlike
4982
+ `<lr-tree>`'s controlled `reorderable` mode, this list physically moves its own slotted
4983
+ `<lr-reorder-item>` light-DOM nodes itself (there is no `data` array prop to reconcile against),
4984
+ and emits `lr-reorder` with the full new order so the host can persist it without hand-rolling its
4985
+ own splice/resort logic.
4986
+
4987
+ ### `lr-reorder-list`
4988
+
4989
+ **Properties:**
4990
+ - `label: string = ''` — accessible name for the internal `role="list"`; when empty, a host
4991
+ `aria-label` is forwarded as a fallback.
4992
+ - `disabled: boolean = false` (reflected) — disables every item's move buttons and the Ctrl/Cmd+
4993
+ Arrow shortcut, without mutating any item's own `disabled` attribute.
4994
+
4995
+ **Events:** `lr-reorder` (`detail: { order: string[], fromIndex: number, toIndex: number }` — fired
4996
+ after every successful move; `order` is every current item's `value` (or its DOM-position-index
4997
+ fallback) in the new top-to-bottom order)
4998
+
4999
+ **Slots:** default — `<lr-reorder-item>` elements.
5000
+
5001
+ **CSS parts:** `base` — the internal `role="list"` wrapper.
5002
+
5003
+ **Themeable custom properties:** `--lr-reorder-list-gap` (default `var(--lr-space-2xs)`) — gap
5004
+ between rows.
5005
+
5006
+ ```html
5007
+ <lr-reorder-list label="Form fields" @lr-reorder=${(e) => console.log(e.detail.order)}>
5008
+ <lr-reorder-item value="name">Name</lr-reorder-item>
5009
+ <lr-reorder-item value="email">Email</lr-reorder-item>
5010
+ <lr-reorder-item value="phone">Phone</lr-reorder-item>
5011
+ </lr-reorder-list>
5012
+ ```
5013
+
5014
+ **Known gotchas:**
5015
+ - Boundary-disabled state (`atStart`/`atEnd`) and the `listDisabled` cascade are computed and
5016
+ pushed onto each `<lr-reorder-item>` by this list, on every slot change and every move — an item
5017
+ alone can't know its own position.
5018
+ - No pointer drag-and-drop; move-up/move-down buttons and the keyboard shortcut only.
5019
+
5020
+ ---
5021
+
5022
+ ### `lr-reorder-item`
5023
+
5024
+ **Properties:**
5025
+ - `value?: string` — stable identifier included in the parent's `lr-reorder` order array; falls
5026
+ back to this item's live DOM-position index when unset.
5027
+ - `disabled: boolean = false` (reflected) — disables this row's own move buttons only; does not
5028
+ hide its slotted content.
5029
+ - `atStart: boolean = false`, `atEnd: boolean = false`, `listDisabled: boolean = false`
5030
+ (attribute: false) — pushed down by the parent `<lr-reorder-list>`; normally set internally, not
5031
+ by consumers.
5032
+
5033
+ **Events:** `lr-move-request` (`detail: { direction: 'up' | 'down' }` — a move button was activated
5034
+ while not disabled; handled by the parent `<lr-reorder-list>`, which performs the actual move)
5035
+
5036
+ **Slots:** default — arbitrary row content.
5037
+
5038
+ **CSS parts:** `base` (row wrapper), `move-up-button`, `move-down-button`, `content` (default-slot
5039
+ wrapper).
5040
+
5041
+ **Themeable custom properties:** `--lr-reorder-item-gap` (default `var(--lr-space-xs)`) — gap
5042
+ between the move buttons and the row content.
4868
5043
 
4869
5044
  ---
4870
5045
 
@@ -5087,7 +5262,11 @@ content clickable, and it shows nothing while the viewport is above the first gr
5087
5262
  **Themeable custom properties:** `--lr-virtual-list-height` (default `24rem` — the host's bounded
5088
5263
  scroll extent; component-specific since a virtualized list is meaningless without a sized viewport),
5089
5264
  plus shared `--lr-focus-ring-width/-color/-offset` (inward-offset ring on `[part="base"]`, negative
5090
- so it isn't clipped by the container's own `overflow: auto`).
5265
+ so it isn't clipped by the container's own `overflow: auto`). `[part="base"]` also carries a
5266
+ mouse-hover outline — a subtler preview of that same `:focus-visible` ring, shown because the part
5267
+ always carries `tabindex="0"` and is a real keyboard-navigable target — tinted via
5268
+ `--lr-virtual-list-hover-outline-color` (default `var(--lr-color-border-strong)`); set it to
5269
+ `transparent` to opt out of the hover treatment entirely.
5091
5270
 
5092
5271
  **Optional peer deps:** none.
5093
5272
 
@@ -5994,7 +6173,10 @@ false` (reflected — disables every gesture grid-wide), `accessibleLabel: strin
5994
6173
  **Themeable custom properties:** `--lr-dashboard-grid-columns`, `--lr-dashboard-grid-row-height`,
5995
6174
  and `--lr-dashboard-grid-gap` back the CSS Grid's `grid-template-columns`/`grid-auto-rows`/`gap`.
5996
6175
  The `columns`/`rowHeight`/`gap` properties write them inline on `[part='base']` on every render, so
5997
- overriding them from a stylesheet has no effect — set the properties instead.
6176
+ overriding them from a stylesheet has no effect — set the properties instead. `--lr-dashboard-grid-cell-hover-outline-color`
6177
+ (default `var(--lr-color-border-strong)`) retints the mouse-hover outline on `[part='cell']` — a
6178
+ preview of its own `:focus-visible` ring, shown because every cell is a real focusable,
6179
+ draggable/resizable target; set it to `transparent` to opt out of the hover treatment entirely.
5998
6180
 
5999
6181
  ## `lr-drilldown-panel`
6000
6182
 
@@ -6468,7 +6650,7 @@ already follow.
6468
6650
  ### `lr-chip`
6469
6651
 
6470
6652
  **Properties:**
6471
- - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected) — standard visual-density
6653
+ - `size: '3xs' | '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected) — standard visual-density
6472
6654
  scale for typography, padding, gap, and icon size; `m` preserves the original chip dimensions
6473
6655
  - `tone: 'neutral' | 'brand' | 'success' | 'warning' | 'danger' = 'neutral'` (reflected — tints the
6474
6656
  whole pill using a loud-color-on-quiet-tint convention; `neutral` has no dedicated token pair, so
@@ -7933,11 +8115,15 @@ tag itself, and so does a structurally invalid one — `Intl.DisplayNames` throw
7933
8115
  those rather than falling back, and a language picker should degrade to showing the raw tag rather
7934
8116
  than tearing down the render. Pair it with `languageToCountry()` for the flag half of the same row.
7935
8117
 
7936
- **Locale picker recipe.** A locale picker is a composition, not a component: `<lr-popover>` supplies
7937
- the light-dismiss surface, `<lr-flag>` the country mark, `localeNativeName()` the endonym, and
7938
- `aria-current="true"` marks the active choice. Which locales exist is the app's decision, so the app
7939
- owns the list. Set `lang` on each row so assistive tech pronounces the endonym in its own language,
7940
- and use `variant="compact"` at icon scale.
8118
+ **Locale picker recipe.** `<lr-locale-picker>` (`components/forms/locale-picker/`) is the built-in
8119
+ locale switcher a closed-list dropdown over the locale registry or an explicit catalog, with
8120
+ `lr-flag`/`localeNativeName()` rows and full form association out of the box. The manual
8121
+ composition below remains available for an app that wants different chrome (its own dismiss
8122
+ surface, a different active-state marker, or a layout `<lr-locale-picker>` doesn't offer):
8123
+ `<lr-popover>` supplies the light-dismiss surface, `<lr-flag>` the country mark,
8124
+ `localeNativeName()` the endonym, and `aria-current="true"` marks the active choice. Which locales
8125
+ exist is the app's decision, so the app owns the list. Set `lang` on each row so assistive tech
8126
+ pronounces the endonym in its own language, and use `variant="compact"` at icon scale.
7941
8127
 
7942
8128
  ```html
7943
8129
  <lr-popover placement="bottom-start">
@@ -12609,8 +12795,11 @@ appends host-supplied content (re-invoked per row on every render, e.g. a `lr-me
12609
12795
  actions) after the built-in `rowActions` output in each row's `actions` slot; events it fires reach
12610
12796
  the host normally and never trigger `lr-select`. Unset renders only the built-in `rowActions`.
12611
12797
  `renderLeading?: (thread: ChatThread) => TemplateResult` (attribute: false) — renders non-interactive
12612
- leading content in each virtualized row. `renderMeta?: (thread: ChatThread) => TemplateResult`
12613
- (attribute: false) — appends structured metadata in the row's meta region.
12798
+ leading content in each virtualized row. `renderExcerpt?: (thread: ChatThread) => TemplateResult`
12799
+ (attribute: false) — renders rich content into the row item's own `excerpt` slot, winning over the
12800
+ plain-string `excerpt` property (e.g. a server-highlighted search-match snippet), while leaving the
12801
+ built-in title layout and inline-rename affordance untouched. `renderMeta?: (thread: ChatThread) =>
12802
+ TemplateResult` (attribute: false) — appends structured metadata in the row's meta region.
12614
12803
  `renderRowContent?: (thread: ChatThread) => TemplateResult` (attribute: false) — replaces the
12615
12804
  conversation item's title/excerpt/meta content area with custom non-interactive row content.
12616
12805
  `formatGroupLabel?: (key: ThreadBucketKey, date?: Date) => string` (attribute: false) — overrides
@@ -12643,9 +12832,10 @@ header row and the pinned copy alike, and the band itself is where a shadow or b
12643
12832
  belongs), `row` (all exported across the internal `lr-virtual-list` shadow
12644
12833
  boundary), `row-wrapper` (the wrapper around `wrapRow` output, only present when `wrapRow` is set;
12645
12834
  row-only — group headers are never passed through `wrapRow`, so they never carry it), and
12646
- `row-leading`/`row-content`/`row-meta`/`row-actions` (the library-owned wrappers around
12835
+ `row-leading`/`row-excerpt`/`row-content`/`row-meta`/`row-actions` (the library-owned wrappers around
12647
12836
  their corresponding render-hook output; inherited fonts, layout values, and theme custom properties
12648
- reach callback-rendered descendants through these parts).
12837
+ reach callback-rendered descendants through these parts). `row-excerpt` wraps `renderExcerpt`
12838
+ output, which is slotted into the row item's own `excerpt` slot.
12649
12839
 
12650
12840
  Data mode additionally forwards each row `<lr-conversation-item>`'s own parts under a `row-item-`
12651
12841
  prefix: `row-item-base`, `row-item-option`, `row-item-leading`, `row-item-content`,
@@ -12653,8 +12843,9 @@ prefix: `row-item-base`, `row-item-option`, `row-item-leading`, `row-item-conten
12653
12843
  `row-item-meta`, `row-item-timestamp`, `row-item-actions`.
12654
12844
 
12655
12845
  **Keep the two prefixes straight — they are different surfaces.** The `row-*` parts wrap *this*
12656
- component's own render-callback output (`wrapRow`, `renderLeading`, `renderRowContent`,
12657
- `renderMeta`, `renderActions`); the `row-item-*` parts are the row item's *internals*. Row density
12846
+ component's own render-callback output (`wrapRow`, `renderLeading`, `renderExcerpt`,
12847
+ `renderRowContent`, `renderMeta`, `renderActions`); the `row-item-*` parts are the row item's
12848
+ *internals*. Row density
12658
12849
  in particular lives in `row-item-base`'s padding and `row-item-title`'s font size, so
12659
12850
  `::part(row-item-base)` is the supported way to build a dense sidebar.
12660
12851
 
@@ -13651,17 +13842,26 @@ renders at the start of the action row, before Deny/Edit/Approve.
13651
13842
  `autoCorrect: string = 'off'` (attribute `autocorrect`), `autocomplete: string = 'off'`,
13652
13843
  `wrap: 'hard'|'soft'|'off' = 'soft'`, `inputMode: string = ''` (attribute `inputmode`),
13653
13844
  and `enterKeyHint: string = ''` (attribute `enterkeyhint`) — forwarded to the raw-JSON
13654
- `<textarea>` while editing; the defaults keep browser editing assistance from changing JSON text
13845
+ `<textarea>` while editing; the defaults keep browser editing assistance from changing JSON text.
13846
+ `pending: 'approve' | 'deny' | null = null` (reflected) — which decision is awaiting host
13847
+ resolution while an `lr-approve`/`lr-deny` listener has called `preventDefault()` on the
13848
+ now-cancelable event; the pending button shows `loading`, the other is `disabled` (Approve is
13849
+ also still `disabled` while an in-progress edit is invalid JSON, independent of `pending`).
13850
+ Escape/backdrop dismissal is suppressed while `pending` is set. Finalize by calling
13851
+ `close('approve'|'deny')`, or clear `.pending` back to `null` to bounce back to the undecided
13852
+ state; `pending` also resets to `null` every time the dialog re-opens.
13655
13853
 
13656
13854
  **Methods:** `close(reason: ToolApprovalDialogCloseReason = 'api'): void` — closes the dialog, emits
13657
13855
  `lr-close` with `reason`, and returns focus to whatever had it before the dialog opened; a no-op if
13658
13856
  already closed.
13659
13857
 
13660
13858
  **Events:** `lr-approve` (`detail: { args: unknown }` — the current, already-parsed arguments: the
13661
- original `args` prop, or the user's edited-and-validated version if an edit was in progress; always
13662
- followed by `lr-close` with reason `'approve'`), `lr-deny` (no detail — `this.emit('lr-deny')` is
13663
- called with no second argument, so per the DOM spec's `CustomEventInit` default, `event.detail` is
13664
- `null`, not `undefined`; always followed by `lr-close` with reason `'deny'`), `lr-close`
13859
+ original `args` prop, or the user's edited-and-validated version if an edit was in progress.
13860
+ Cancelable: a listener calling `preventDefault()` sets `pending` to `'approve'` instead of
13861
+ closing; otherwise always followed by `lr-close` with reason `'approve'`), `lr-deny` (no detail
13862
+ `this.emit('lr-deny')` is called with no second argument, so per the DOM spec's `CustomEventInit`
13863
+ default, `event.detail` is `null`, not `undefined`. Cancelable, same `pending` mechanism, setting
13864
+ `pending` to `'deny'`; otherwise always followed by `lr-close` with reason `'deny'`), `lr-close`
13665
13865
  (`detail: ToolApprovalDialogCloseReason` — fired exactly once per dismissal, via Escape, a backdrop
13666
13866
  click, the Approve/Deny buttons, or a `close()` call)
13667
13867
 
@@ -13669,7 +13869,12 @@ click, the Approve/Deny buttons, or a `close()` call)
13669
13869
  rendered before the built-in Deny/Edit/Approve buttons.
13670
13870
 
13671
13871
  **CSS parts:** `backdrop`, `panel`, `header`, `tool-name`, `body`, `args-view`, `args-editor`, `error`,
13672
- `footer`, `deny-button`, `edit-button`, `approve-button`
13872
+ `footer`, `deny-button`, `edit-button`, `approve-button`,
13873
+ `deny-button-base`, `deny-button-label`, `deny-button-start`, `deny-button-end`,
13874
+ `deny-button-spinner`, `approve-button-base`, `approve-button-label`, `approve-button-start`,
13875
+ `approve-button-end`, `approve-button-spinner` (`deny-button`/`approve-button` are each an
13876
+ `<lr-button>` host; these five per-button parts are re-exported from its own `lr-button` parts via
13877
+ `exportparts`; `edit-button` stays a plain `<button>`, unaffected by this).
13673
13878
 
13674
13879
  **Themeable custom properties:** `--lr-tool-approval-dialog-overlay-color` (default
13675
13880
  `rgb(0 0 0 / 0.5)` — the backdrop scrim color; component-specific since no shared overlay token
@@ -13731,6 +13936,16 @@ shared composed-tree focus traversal used by the other modal families.
13731
13936
  this a mobile browser (notably iOS Safari, which defaults textarea `autocapitalize` to
13732
13937
  `'sentences'`) could auto-capitalize or auto-correct key/value text as the user edits, silently
13733
13938
  corrupting the JSON.
13939
+ - `deny-button`/`approve-button` are `<lr-button>` hosts (`variant="neutral"`/`"brand"` — this
13940
+ component has no `tone` property) — `--lr-button-*` theming reaches them directly. A consumer
13941
+ previously styling `::part(deny-button)`/`::part(approve-button)` for
13942
+ padding/border/font/`:hover`/`:focus-visible` must move that CSS onto the re-exported
13943
+ `deny-button-base`/`approve-button-base` sub-parts instead. `edit-button` is unaffected and stays
13944
+ a raw `<button>`.
13945
+ - An `lr-approve`/`lr-deny` listener can call `preventDefault()` to keep the decision open while
13946
+ its own async work is in flight — see `pending` above. While `pending` is set, Escape/backdrop
13947
+ dismissal is suppressed, so a consumer that never resolves the pending decision leaves the
13948
+ dialog open until it clears `.pending` or calls `close()` directly itself.
13734
13949
 
13735
13950
  ---
13736
13951
 
@@ -14298,6 +14513,10 @@ narrow-allocation `@container` treatment is switched off — a compact bar is *e
14298
14513
  so stretching the buttons to fill would be exactly wrong. Re-chrome it through the
14299
14514
  `--lr-confirm-bar-compact-*` properties below. Everything else is unchanged: the event shapes, the
14300
14515
  focus-to-`[part="status"]`-before-unmount contract, and `role="group"` with its heading label.
14516
+ `pending: 'approved' | 'denied' | null = null` (reflected) — which decision is awaiting host
14517
+ resolution while an `lr-approve`/`lr-deny` listener has called `preventDefault()` on the
14518
+ now-cancelable event; the pending button shows `loading`, the other is `disabled`. Set `.decision`
14519
+ to finalize, or clear `.pending` back to `null` to bounce back to the undecided state.
14301
14520
 
14302
14521
  **Slots:** default — supplementary body content between the heading and the actions (e.g. a
14303
14522
  `lr-diff-view`). `footer` — extra content at the start of the action row.
@@ -14307,8 +14526,12 @@ focus-to-`[part="status"]`-before-unmount contract, and `role="group"` with its
14307
14526
 
14308
14527
  **CSS parts:** `base` (`role="group"`), `heading`/`tool-name`, `body`, `args` (the
14309
14528
  details/json-viewer wrapper, only rendered when `args` is defined), `footer`, `deny-button`,
14310
- `approve-button` (named identically to the dialog's parts), `status` (the decided-state text, always
14311
- present in the DOM as a focus landing spot).
14529
+ `approve-button` (each an `<lr-button>` host, named identically to the dialog's parts),
14530
+ `deny-button-base`, `deny-button-label`, `deny-button-start`, `deny-button-end`,
14531
+ `deny-button-spinner`, `approve-button-base`, `approve-button-label`, `approve-button-start`,
14532
+ `approve-button-end`, `approve-button-spinner` (re-exported from each button's own
14533
+ `lr-button` parts via `exportparts`), `status` (the decided-state text, always present in the DOM
14534
+ as a focus landing spot).
14312
14535
 
14313
14536
  **Themeable custom properties:** the `compact` presentation is deliberately chrome-less by default
14314
14537
  and re-chromed entirely through five properties, all scoped to `[part="base"]` while `compact`:
@@ -14325,8 +14548,15 @@ bar in this panel a hairline border" a one-rule change on the panel.
14325
14548
  - `[part="status"]` is always rendered and must never be given `display: none`. Deciding moves focus
14326
14549
  to it synchronously, before the Deny/Approve buttons unmount, so hiding it would drop focus to
14327
14550
  `<body>`. The shipped `:empty` rule on it has never matched, and that is load-bearing.
14328
- - `[part="deny-button"]` and `[part="approve-button"]` are raw `<button>` elements, not composed
14329
- `lr-button`s, so `--lr-button-*` theming does not reach them. Style them through their parts.
14551
+ - `[part="deny-button"]`/`[part="approve-button"]` are `<lr-button>` hosts (`variant="neutral"`/
14552
+ `"brand"`, `"danger"` under `tone="danger"`) — `--lr-button-*` theming reaches them directly. A
14553
+ consumer previously styling `::part(deny-button)`/`::part(approve-button)` for
14554
+ padding/border/font/`:hover`/`:focus-visible` must move that CSS onto the re-exported
14555
+ `deny-button-base`/`approve-button-base` sub-parts instead — the outer part now resolves to the
14556
+ `<lr-button>` host, where those declarations either do nothing or must be re-expressed through
14557
+ `lr-button`'s own parts/custom properties.
14558
+ - An `lr-approve`/`lr-deny` listener can call `preventDefault()` to keep the decision open while
14559
+ its own async work is in flight — see `pending` above.
14330
14560
 
14331
14561
  ```html
14332
14562
  <lr-tool-call-chip status="pending"></lr-tool-call-chip>
@@ -14335,6 +14565,18 @@ bar in this panel a hairline border" a one-rule change on the panel.
14335
14565
  ></lr-confirm-bar>
14336
14566
  ```
14337
14567
 
14568
+ An `lr-approve`/`lr-deny` listener that needs to await its own async work before finalizing calls
14569
+ `preventDefault()` and sets `.decision` (or clears `.pending`) once it resolves:
14570
+
14571
+ ```ts
14572
+ bar.addEventListener('lr-approve', (e) => {
14573
+ e.preventDefault();
14574
+ runApproval(e.detail.args)
14575
+ .then(() => { bar.decision = 'approved'; })
14576
+ .catch(() => { bar.pending = null; }); // bounce back, retry
14577
+ });
14578
+ ```
14579
+
14338
14580
  ## `lr-browser-frame`
14339
14581
 
14340
14582
  Presentational "agent computer" viewport: a screenshot/frame stream (or slotted live media), a
@@ -14594,7 +14836,7 @@ Filterable and taggable evaluation-example list with add, remove, import, and ex
14594
14836
  expectedOutput?: string; tags?: string[]; metadata?: Record<string, unknown> }` (exported here).
14595
14837
  Deliberately its own small shape rather than reusing anything from `src/ai/types.ts` — none of that
14596
14838
  module's interfaces models "one row of a labeled eval dataset". `input`/`expectedOutput` are plain
14597
- strings (not structured payloads) to match `lr-data-grid`'s stringifying cell rendering. Fully
14839
+ strings (not structured payloads), rendered as plain text by every column's `cell()`. Fully
14598
14840
  controlled: add/remove/import/export are all *requests*; the host mutates and passes the array back
14599
14841
  - `searchable: boolean = false` (reflected) — built-in free-text search over `input`,
14600
14842
  `expectedOutput`, and `tags` (case-insensitive substring)
@@ -14625,7 +14867,7 @@ loses focus, since native focus neither bubbles nor crosses the shadow boundary.
14625
14867
 
14626
14868
  Rubric scoring and human-review surface for comparing the runs of one evaluation example.
14627
14869
 
14628
- Composes `lr-data-grid` (the comparison table), `lr-rubric-form` (the review surface), and
14870
+ Composes `lr-table` (the comparison table), `lr-rubric-form` (the review surface), and
14629
14871
  `lr-diff-view` (baseline↔selected output diff) rather than re-deriving any of their behavior.
14630
14872
 
14631
14873
  **Properties:**
@@ -14633,10 +14875,10 @@ Composes `lr-data-grid` (the comparison table), `lr-rubric-form` (the review sur
14633
14875
  model?: string; promptVersion?: string; output: string; scores?: RubricValue; review?: RubricValue }`
14634
14876
  (exported here). One entry per model or prompt version being compared for a single evaluation
14635
14877
  example. `scores`/`review` use the same `RubricValue` shape `lr-rubric-form` itself reads and
14636
- writes, so a `DataGridColumn`'s `value()` accessor and the rubric form's own `value` binding read a
14878
+ writes, so a `TableColumn`'s `cell()` accessor and the rubric form's own `value` binding read a
14637
14879
  run's fields with no conversion
14638
- - `columns: DataGridColumn<EvalRunResult>[] = []` (attribute: false) — plain pass-through to
14639
- `lr-data-grid.columns`, not re-derived here
14880
+ - `columns: TableColumn<EvalRunResult>[] = []` (attribute: false) — plain pass-through to
14881
+ `lr-table.columns`, not re-derived here
14640
14882
  - `rubricKeys: RubricKey[] = []` (attribute: false) — plain pass-through to `lr-rubric-form.keys`
14641
14883
  - `selectedRunId: string = ''` (attribute `selected-run-id`) — the run open for review and the diff's
14642
14884
  **new** side; falls back to `runs[0]?.id` when empty