@aceshooting/lyra-ui 14.0.0 → 14.1.1

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 (475) hide show
  1. package/CHANGELOG.md +155 -19
  2. package/custom-elements.json +1 -1
  3. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts +3 -1
  4. package/dist/components/agent-tools/commit-card/commit-card.class.js +2 -2
  5. package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +2 -1
  6. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +1 -1
  7. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts +6 -2
  8. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +4 -4
  9. package/dist/components/agent-tools/result-card/result-card.class.d.ts +1 -1
  10. package/dist/components/agent-tools/result-card/result-card.class.js +1 -1
  11. package/dist/components/agent-tools/result-card/result-field.class.d.ts +1 -1
  12. package/dist/components/agent-tools/result-card/result-field.class.js +1 -1
  13. package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts +1 -1
  14. package/dist/components/agent-tools/stack-trace/stack-trace.class.js +1 -1
  15. package/dist/components/agent-tools/terminal/terminal.class.d.ts +1 -1
  16. package/dist/components/agent-tools/terminal/terminal.class.js +2 -2
  17. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +2 -2
  18. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +1 -1
  19. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +1 -1
  20. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +2 -2
  21. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +4 -4
  22. package/dist/components/agent-tools/trace-tree/span.d.ts +3 -1
  23. package/dist/components/agent-tools/trace-tree/span.js +1 -1
  24. package/dist/components/charts/chart/box-plot.class.d.ts +2 -0
  25. package/dist/components/charts/chart/box-plot.class.js +1 -1
  26. package/dist/components/charts/chart/chart.class.d.ts +6 -1
  27. package/dist/components/charts/chart/chart.class.js +1 -1
  28. package/dist/components/charts/chart/lite-chart.class.d.ts +20 -11
  29. package/dist/components/charts/chart/lite-chart.class.js +10 -8
  30. package/dist/components/conversation/chat-message/chat-message.class.d.ts +4 -3
  31. package/dist/components/conversation/code-block/code-block-core.class.d.ts +4 -3
  32. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  33. package/dist/components/conversation/code-block/code-block-shared.d.ts +3 -3
  34. package/dist/components/conversation/code-block/code-block-shared.js +2 -2
  35. package/dist/components/conversation/code-block/code-block.class.d.ts +4 -3
  36. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  37. package/dist/components/conversation/code-block/shiki-types.d.ts +2 -0
  38. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  39. package/dist/components/conversation/conversation-item/conversation-item.class.js +1 -1
  40. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  41. package/dist/components/conversation/markdown/markdown-core.class.d.ts +1 -1
  42. package/dist/components/conversation/markdown/markdown.class.d.ts +1 -1
  43. package/dist/components/conversation/message-actions/message-actions.class.d.ts +2 -0
  44. package/dist/components/conversation/message-actions/message-actions.class.js +1 -1
  45. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +3 -1
  46. package/dist/components/conversation/message-feedback/message-feedback.class.js +2 -2
  47. package/dist/components/conversation/message-parts/message-parts.class.d.ts +3 -0
  48. package/dist/components/conversation/model-select/model-select.class.js +3 -3
  49. package/dist/components/conversation/thread-list/thread-list.class.js +1 -1
  50. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +2 -0
  51. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
  52. package/dist/components/conversation/typing-indicator/typing-indicator.class.d.ts +2 -1
  53. package/dist/components/conversation/typing-indicator/typing-indicator.class.js +1 -1
  54. package/dist/components/conversation/usage-badge/usage-badge-overlay-runtime.d.ts +3 -0
  55. package/dist/components/conversation/usage-badge/usage-badge-overlay-runtime.js +1 -0
  56. package/dist/components/conversation/usage-badge/usage-badge.class.d.ts +4 -2
  57. package/dist/components/conversation/usage-badge/usage-badge.class.js +1 -1
  58. package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -3
  59. package/dist/components/conversation/widget-renderer/resolve.d.ts +4 -6
  60. package/dist/components/conversation/widget-renderer/resolve.js +1 -1
  61. package/dist/components/data/calendar/calendar.class.d.ts +6 -3
  62. package/dist/components/data/calendar/calendar.class.js +1 -1
  63. package/dist/components/data/calendar/calendar.styles.js +1 -1
  64. package/dist/components/data/condition-builder/condition-builder.class.d.ts +3 -1
  65. package/dist/components/data/condition-builder/condition-builder.class.js +15 -1
  66. package/dist/components/data/context-meter/context-meter.class.js +2 -2
  67. package/dist/components/data/data-grid/data-grid.class.d.ts +6 -2
  68. package/dist/components/data/data-grid/data-grid.class.js +1 -1
  69. package/dist/components/data/document-library/document-library.class.d.ts +5 -2
  70. package/dist/components/data/document-library/document-library.class.js +1 -1
  71. package/dist/components/data/file-tree/file-tree.class.d.ts +2 -1
  72. package/dist/components/data/file-tree/file-tree.class.js +1 -1
  73. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +5 -2
  74. package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
  75. package/dist/components/data/flow-canvas/flow-model.js +1 -1
  76. package/dist/components/data/flow-canvas/flow-types.d.ts +2 -1
  77. package/dist/components/data/funnel/funnel.class.d.ts +1 -0
  78. package/dist/components/data/funnel/funnel.class.js +1 -1
  79. package/dist/components/data/gauge/gauge.class.d.ts +4 -1
  80. package/dist/components/data/gauge/gauge.class.js +6 -6
  81. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +5 -2
  82. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +15 -1
  83. package/dist/components/data/heatmap/heatmap.class.d.ts +7 -4
  84. package/dist/components/data/heatmap/heatmap.class.js +1 -1
  85. package/dist/components/data/sparkline/sparkline.class.d.ts +2 -1
  86. package/dist/components/data/sparkline/sparkline.class.js +1 -1
  87. package/dist/components/data/stat/stat.class.d.ts +6 -2
  88. package/dist/components/data/stat/stat.class.js +1 -1
  89. package/dist/components/data/table/table.class.d.ts +5 -2
  90. package/dist/components/data/table/table.class.js +2 -2
  91. package/dist/components/data/timeline/timeline.class.d.ts +7 -2
  92. package/dist/components/data/timeline/timeline.class.js +1 -1
  93. package/dist/components/data/timeline/timeline.styles.js +1 -1
  94. package/dist/components/data/tree/tree-item.class.d.ts +3 -1
  95. package/dist/components/data/tree/tree-item.class.js +1 -1
  96. package/dist/components/data/tree/tree.class.d.ts +4 -1
  97. package/dist/components/data/tree/tree.class.js +1 -1
  98. package/dist/components/data/word-cloud/word-cloud-layout.d.ts +2 -1
  99. package/dist/components/data/word-cloud/word-cloud-layout.js +1 -1
  100. package/dist/components/data/word-cloud/word-cloud.class.d.ts +2 -1
  101. package/dist/components/forms/button/button.class.d.ts +5 -3
  102. package/dist/components/forms/button/button.class.js +1 -1
  103. package/dist/components/forms/checkbox/checkbox.class.d.ts +3 -0
  104. package/dist/components/forms/checkbox/checkbox.class.js +1 -1
  105. package/dist/components/forms/code-editor/code-editor.class.d.ts +11 -3
  106. package/dist/components/forms/code-editor/code-editor.class.js +6 -7
  107. package/dist/components/forms/code-editor/code-editor.styles.js +1 -1
  108. package/dist/components/forms/color-picker/color-picker.class.d.ts +5 -1
  109. package/dist/components/forms/color-picker/color-picker.class.js +4 -4
  110. package/dist/components/forms/combobox/combobox.class.d.ts +19 -8
  111. package/dist/components/forms/combobox/combobox.class.js +3 -3
  112. package/dist/components/forms/combobox/option.class.d.ts +4 -0
  113. package/dist/components/forms/combobox/option.class.js +2 -2
  114. package/dist/components/forms/date-picker/calendar-core.d.ts +1 -1
  115. package/dist/components/forms/date-picker/calendar-core.js +1 -1
  116. package/dist/components/forms/date-picker/date-input.class.d.ts +20 -10
  117. package/dist/components/forms/date-picker/date-input.class.js +4 -4
  118. package/dist/components/forms/date-picker/date-picker.class.d.ts +24 -13
  119. package/dist/components/forms/date-picker/date-picker.class.js +7 -7
  120. package/dist/components/forms/date-picker/date-picker.styles.js +1 -1
  121. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +11 -3
  122. package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -3
  123. package/dist/components/forms/emoji-picker/emoji-types.d.ts +2 -2
  124. package/dist/components/forms/icon-button/icon-button.class.d.ts +4 -2
  125. package/dist/components/forms/icon-button/icon-button.class.js +1 -1
  126. package/dist/components/forms/input/input.class.d.ts +5 -1
  127. package/dist/components/forms/input/input.class.js +1 -1
  128. package/dist/components/forms/input/native-time-input.class.d.ts +3 -0
  129. package/dist/components/forms/input/number-input.class.d.ts +3 -0
  130. package/dist/components/forms/input/time-input.class.d.ts +3 -0
  131. package/dist/components/forms/input/time-input.class.js +1 -1
  132. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +5 -1
  133. package/dist/components/forms/locale-picker/locale-picker.class.js +2 -2
  134. package/dist/components/forms/otp-input/otp-input.class.d.ts +5 -1
  135. package/dist/components/forms/otp-input/otp-input.class.js +1 -1
  136. package/dist/components/forms/phone-input/phone-input.class.d.ts +21 -8
  137. package/dist/components/forms/phone-input/phone-input.class.js +1 -1
  138. package/dist/components/forms/radio/radio-button.class.d.ts +4 -0
  139. package/dist/components/forms/radio/radio-group.class.d.ts +4 -1
  140. package/dist/components/forms/radio/radio-group.class.js +1 -1
  141. package/dist/components/forms/radio/radio.class.d.ts +6 -2
  142. package/dist/components/forms/radio/radio.class.js +1 -1
  143. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +7 -1
  144. package/dist/components/forms/rubric-form/rubric-form.class.js +3 -3
  145. package/dist/components/forms/select/select.class.d.ts +8 -2
  146. package/dist/components/forms/select/select.class.js +2 -2
  147. package/dist/components/forms/slider/slider.class.d.ts +12 -6
  148. package/dist/components/forms/slider/slider.class.js +2 -2
  149. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +4 -0
  150. package/dist/components/forms/swatch-picker/swatch-picker.class.js +1 -1
  151. package/dist/components/forms/switch/switch.class.d.ts +5 -1
  152. package/dist/components/forms/switch/switch.class.js +1 -1
  153. package/dist/components/forms/textarea/textarea.class.d.ts +3 -0
  154. package/dist/components/forms/textarea/textarea.class.js +1 -1
  155. package/dist/components/forms/time-range/time-range.class.d.ts +3 -0
  156. package/dist/components/forms/time-range/time-range.class.js +1 -1
  157. package/dist/components/forms/token-input/token-input.class.d.ts +8 -2
  158. package/dist/components/forms/token-input/token-input.class.js +2 -2
  159. package/dist/components/forms/token-input/token-input.styles.js +1 -1
  160. package/dist/components/layout/app-rail/app-rail.class.d.ts +3 -1
  161. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  162. package/dist/components/layout/carousel/carousel.class.d.ts +3 -2
  163. package/dist/components/layout/carousel/carousel.class.js +1 -1
  164. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  165. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts +2 -0
  166. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
  167. package/dist/components/layout/details/details.class.d.ts +3 -3
  168. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +3 -1
  169. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  170. package/dist/components/layout/menu/menu-label.class.d.ts +3 -3
  171. package/dist/components/layout/menu/menu.class.d.ts +4 -1
  172. package/dist/components/layout/menu/menu.class.js +1 -1
  173. package/dist/components/layout/multi-split/multi-split.class.d.ts +9 -3
  174. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  175. package/dist/components/layout/multi-split/multi-split.styles.js +1 -1
  176. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +2 -1
  177. package/dist/components/layout/reorder-list/reorder-item.class.js +1 -1
  178. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  179. package/dist/components/layout/reorder-list/reorder-owner.js +1 -1
  180. package/dist/components/layout/split-panel/split-panel.class.d.ts +2 -1
  181. package/dist/components/layout/split-panel/split-panel.class.js +1 -1
  182. package/dist/components/layout/tab-group/tab-group.class.d.ts +3 -1
  183. package/dist/components/layout/tab-group/tab-group.class.js +1 -1
  184. package/dist/components/layout/widget/widget.class.d.ts +6 -2
  185. package/dist/components/layout/widget/widget.class.js +1 -1
  186. package/dist/components/media/animation/animation.class.d.ts +3 -2
  187. package/dist/components/media/animation/animation.class.js +1 -1
  188. package/dist/components/media/attachment-chip/attachment-chip.class.d.ts +4 -3
  189. package/dist/components/media/attachment-chip/attachment-chip.class.js +1 -1
  190. package/dist/components/media/av-player/av-metadata.d.ts +3 -2
  191. package/dist/components/media/av-player/av-player.class.d.ts +4 -3
  192. package/dist/components/media/av-player/av-player.class.js +3 -3
  193. package/dist/components/media/av-player/av-player.styles.js +1 -1
  194. package/dist/components/media/avatar/avatar.class.d.ts +2 -1
  195. package/dist/components/media/avatar/avatar.class.js +1 -1
  196. package/dist/components/media/file-input/file-input.class.d.ts +4 -2
  197. package/dist/components/media/file-input/file-input.class.js +1 -1
  198. package/dist/components/media/file-input/file-input.styles.js +1 -1
  199. package/dist/components/media/image-viewer/image-viewer.class.d.ts +2 -1
  200. package/dist/components/media/image-viewer/image-viewer.class.js +1 -1
  201. package/dist/components/media/image-viewer/image-viewer.styles.js +1 -1
  202. package/dist/components/media/map/map.class.d.ts +5 -3
  203. package/dist/components/media/map/map.class.js +1 -1
  204. package/dist/components/media/map/map.styles.js +1 -1
  205. package/dist/components/media/media-card/media-card.class.d.ts +1 -1
  206. package/dist/components/media/media-card/media-card.class.js +1 -1
  207. package/dist/components/media/pan-zoom/pan-zoom.class.js +1 -1
  208. package/dist/components/media/sequence-playback/sequence-playback.class.d.ts +1 -1
  209. package/dist/components/media/sequence-playback/sequence-playback.styles.js +1 -1
  210. package/dist/components/media/video/video.class.d.ts +2 -1
  211. package/dist/components/media/video/video.styles.js +1 -1
  212. package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts +3 -2
  213. package/dist/components/media/zoomable-frame/zoomable-frame.class.js +2 -2
  214. package/dist/components/overlays/chip/chip-group.class.d.ts +2 -0
  215. package/dist/components/overlays/chip/chip-group.class.js +1 -1
  216. package/dist/components/overlays/dialog/dialog.class.d.ts +2 -0
  217. package/dist/components/overlays/dialog/dialog.class.js +1 -1
  218. package/dist/components/overlays/empty/empty.class.d.ts +2 -0
  219. package/dist/components/overlays/empty/empty.class.js +1 -1
  220. package/dist/components/overlays/kbd/kbd.class.d.ts +2 -0
  221. package/dist/components/overlays/kbd/kbd.class.js +1 -1
  222. package/dist/components/overlays/overlay/popover.class.d.ts +3 -1
  223. package/dist/components/overlays/overlay/popover.class.js +1 -1
  224. package/dist/components/overlays/overlay/tooltip.class.d.ts +3 -1
  225. package/dist/components/overlays/overlay/tooltip.class.js +1 -1
  226. package/dist/components/overlays/rating/rating.class.d.ts +2 -0
  227. package/dist/components/overlays/rating/rating.class.js +1 -1
  228. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +2 -2
  229. package/dist/components/retrieval/entity-card/entity-card.class.d.ts +5 -2
  230. package/dist/components/retrieval/entity-card/entity-card.class.js +1 -1
  231. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +4 -2
  232. package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -1
  233. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  234. package/dist/components/retrieval/graph/graph.class.d.ts +9 -7
  235. package/dist/components/retrieval/graph/graph.class.js +1 -1
  236. package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts +1 -3
  237. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +2 -0
  238. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +1 -1
  239. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +3 -2
  240. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +7 -3
  241. package/dist/components/retrieval/provenance-panel/provenance-panel.class.d.ts +2 -1
  242. package/dist/components/retrieval/provenance-panel/provenance-panel.class.js +1 -1
  243. package/dist/components/retrieval/source-picker/source-picker.class.d.ts +2 -1
  244. package/dist/components/retrieval/source-picker/source-picker.class.js +1 -1
  245. package/dist/components/utility/format/format-number.class.d.ts +3 -1
  246. package/dist/components/utility/format/format-options.js +1 -1
  247. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +3 -2
  248. package/dist/components/utility/json-viewer/json-viewer.class.js +2 -2
  249. package/dist/components/utility/known-date/known-date.class.d.ts +9 -5
  250. package/dist/components/utility/known-date/known-date.class.js +2 -2
  251. package/dist/components/utility/known-date/known-date.styles.js +1 -1
  252. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +3 -1
  253. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  254. package/dist/components/utility/poll-status/poll-status.class.d.ts +3 -0
  255. package/dist/components/utility/poll-status/poll-status.styles.js +1 -1
  256. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts +1 -0
  257. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +1 -1
  258. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +2 -1
  259. package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.js +1 -1
  260. package/dist/components/viewers/document-preview/document-preview.class.d.ts +4 -2
  261. package/dist/components/viewers/document-preview/document-preview.class.js +1 -1
  262. package/dist/components/viewers/document-preview/document-preview.styles.js +1 -1
  263. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +3 -2
  264. package/dist/components/viewers/document-viewer/document-viewer.class.js +2 -2
  265. package/dist/components/viewers/document-viewer/registry-ownership.d.ts +1 -0
  266. package/dist/components/viewers/document-viewer/registry-ownership.js +1 -0
  267. package/dist/components/viewers/document-viewer/registry.js +1 -1
  268. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts +7 -1
  269. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
  270. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +2 -1
  271. package/dist/components/viewers/email-viewer/email-viewer.class.js +2 -2
  272. package/dist/components/viewers/include/include-resource.js +1 -1
  273. package/dist/components/viewers/include/include.class.d.ts +3 -1
  274. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +4 -2
  275. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +4 -4
  276. package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.js +1 -1
  277. package/dist/components/viewers/passive-markup.js +1 -1
  278. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts +2 -1
  279. package/dist/components/viewers/svg-viewer/svg-viewer.styles.js +1 -1
  280. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +2 -1
  281. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +1 -1
  282. package/dist/components/viewers/xml-viewer/xml-viewer.js +1 -1
  283. package/dist/custom-elements-jsx.d.ts +1 -1
  284. package/dist/internal/aria-reflection.js +1 -1
  285. package/dist/internal/catalog-picker.js +1 -1
  286. package/dist/internal/default-strings.generated.d.ts +1 -1
  287. package/dist/internal/default-strings.generated.js +1 -1
  288. package/dist/internal/dev-mode-attribute-warning.d.ts +3 -0
  289. package/dist/internal/dev-mode-attribute-warning.js +1 -1
  290. package/dist/internal/form-associated.js +1 -1
  291. package/dist/internal/localization-types.d.ts +1 -1
  292. package/dist/internal/localization.js +1 -1
  293. package/dist/internal/lyra-element.js +1 -1
  294. package/dist/internal/native-control-description.d.ts +7 -0
  295. package/dist/internal/native-control-description.js +1 -0
  296. package/dist/internal/option-selection.js +1 -1
  297. package/dist/internal/overlay-order.d.ts +6 -0
  298. package/dist/internal/overlay-order.js +1 -0
  299. package/dist/internal/overlay-stack.d.ts +1 -1
  300. package/dist/internal/overlay-stack.js +1 -1
  301. package/dist/internal/package-metadata.d.ts +1 -1
  302. package/dist/internal/package-metadata.js +1 -1
  303. package/dist/internal/positioner.d.ts +5 -4
  304. package/dist/internal/reactive-property-writes.d.ts +1 -0
  305. package/dist/internal/reactive-property-writes.js +1 -0
  306. package/dist/internal/svg-title.d.ts +3 -0
  307. package/dist/internal/svg-title.js +1 -0
  308. package/dist/svelte.d.ts +1 -1
  309. package/dist/translations/ar.js +1 -1
  310. package/dist/translations/de.js +1 -1
  311. package/dist/translations/es.js +1 -1
  312. package/dist/translations/fa.js +1 -1
  313. package/dist/translations/fr.js +1 -1
  314. package/dist/translations/he.js +1 -1
  315. package/dist/translations/ja.js +1 -1
  316. package/dist/translations/pt-BR.js +1 -1
  317. package/dist/translations/ru.js +1 -1
  318. package/dist/translations/zh-CN.js +1 -1
  319. package/dist/vue.d.ts +1 -1
  320. package/llms/components/lr-accordion-item.md +4 -0
  321. package/llms/components/lr-accordion.md +4 -0
  322. package/llms/components/lr-agent-trace.md +3 -0
  323. package/llms/components/lr-animation.md +4 -0
  324. package/llms/components/lr-app-rail-item.md +4 -2
  325. package/llms/components/lr-app-rail.md +4 -2
  326. package/llms/components/lr-attachment-chip.md +6 -0
  327. package/llms/components/lr-av-player.md +14 -0
  328. package/llms/components/lr-avatar.md +4 -0
  329. package/llms/components/lr-box-plot.md +6 -0
  330. package/llms/components/lr-button.md +11 -3
  331. package/llms/components/lr-calendar-viewer.md +4 -0
  332. package/llms/components/lr-calendar.md +5 -0
  333. package/llms/components/lr-carousel.md +5 -0
  334. package/llms/components/lr-chart.md +13 -4
  335. package/llms/components/lr-chat-message.md +4 -0
  336. package/llms/components/lr-checkbox.md +3 -0
  337. package/llms/components/lr-chip-group.md +3 -0
  338. package/llms/components/lr-chip.md +3 -0
  339. package/llms/components/lr-code-block-core.md +16 -4
  340. package/llms/components/lr-code-block.md +7 -0
  341. package/llms/components/lr-code-editor.md +18 -5
  342. package/llms/components/lr-color-picker.md +9 -0
  343. package/llms/components/lr-combobox.md +35 -4
  344. package/llms/components/lr-command-palette.md +4 -0
  345. package/llms/components/lr-commit-card.md +3 -0
  346. package/llms/components/lr-compare-panel.md +7 -0
  347. package/llms/components/lr-condition-builder.md +5 -0
  348. package/llms/components/lr-conversation-item.md +3 -0
  349. package/llms/components/lr-copy-button.md +6 -0
  350. package/llms/components/lr-dashboard-grid.md +5 -0
  351. package/llms/components/lr-data-grid.md +11 -1
  352. package/llms/components/lr-dataset-viewer.md +3 -2
  353. package/llms/components/lr-date-input.md +46 -6
  354. package/llms/components/lr-date-picker.md +46 -6
  355. package/llms/components/lr-details.md +4 -0
  356. package/llms/components/lr-dialog.md +4 -0
  357. package/llms/components/lr-document-library.md +4 -0
  358. package/llms/components/lr-document-preview.md +7 -1
  359. package/llms/components/lr-document-viewer.md +9 -3
  360. package/llms/components/lr-dropdown-item.md +4 -0
  361. package/llms/components/lr-dropdown.md +3 -0
  362. package/llms/components/lr-ebook-viewer.md +4 -0
  363. package/llms/components/lr-email-viewer.md +5 -0
  364. package/llms/components/lr-emoji-picker.md +17 -3
  365. package/llms/components/lr-empty.md +3 -0
  366. package/llms/components/lr-entity-card.md +3 -0
  367. package/llms/components/lr-entity-chip.md +4 -0
  368. package/llms/components/lr-file-input.md +7 -0
  369. package/llms/components/lr-file-tree.md +5 -1
  370. package/llms/components/lr-filter-bar.md +5 -0
  371. package/llms/components/lr-flow-canvas.md +8 -1
  372. package/llms/components/lr-flow-node.md +2 -1
  373. package/llms/components/lr-flow-run-status.md +1 -1
  374. package/llms/components/lr-format-number.md +4 -0
  375. package/llms/components/lr-funnel.md +4 -0
  376. package/llms/components/lr-gauge.md +4 -0
  377. package/llms/components/lr-generation-metrics.md +5 -0
  378. package/llms/components/lr-graph-query-builder.md +6 -0
  379. package/llms/components/lr-graph.md +8 -2
  380. package/llms/components/lr-heatmap.md +13 -0
  381. package/llms/components/lr-icon-button.md +7 -0
  382. package/llms/components/lr-image-viewer.md +9 -0
  383. package/llms/components/lr-include.md +5 -0
  384. package/llms/components/lr-ingestion-queue.md +4 -0
  385. package/llms/components/lr-input.md +22 -8
  386. package/llms/components/lr-json-viewer.md +4 -0
  387. package/llms/components/lr-kbd.md +3 -0
  388. package/llms/components/lr-knowledge-graph-explorer.md +7 -0
  389. package/llms/components/lr-known-date.md +7 -0
  390. package/llms/components/lr-lite-chart.md +21 -4
  391. package/llms/components/lr-live-region.md +3 -0
  392. package/llms/components/lr-locale-picker.md +6 -0
  393. package/llms/components/lr-map.md +8 -0
  394. package/llms/components/lr-markdown-core.md +4 -0
  395. package/llms/components/lr-markdown.md +8 -4
  396. package/llms/components/lr-media-card.md +5 -2
  397. package/llms/components/lr-mention-popover.md +5 -0
  398. package/llms/components/lr-menu-item.md +4 -0
  399. package/llms/components/lr-menu-label.md +4 -3
  400. package/llms/components/lr-menu.md +4 -0
  401. package/llms/components/lr-message-actions.md +3 -0
  402. package/llms/components/lr-message-feedback.md +4 -0
  403. package/llms/components/lr-message-parts.md +3 -2
  404. package/llms/components/lr-model-select.md +8 -0
  405. package/llms/components/lr-multi-split.md +15 -6
  406. package/llms/components/lr-native-time-input.md +10 -0
  407. package/llms/components/lr-node-palette.md +3 -0
  408. package/llms/components/lr-notebook-viewer.md +4 -1
  409. package/llms/components/lr-number-input.md +12 -1
  410. package/llms/components/lr-option.md +35 -4
  411. package/llms/components/lr-otp-input.md +10 -0
  412. package/llms/components/lr-pan-zoom.md +1 -2
  413. package/llms/components/lr-phone-input.md +20 -5
  414. package/llms/components/lr-poll-status.md +4 -0
  415. package/llms/components/lr-popover.md +3 -0
  416. package/llms/components/lr-popup.md +3 -2
  417. package/llms/components/lr-prompt-studio.md +7 -0
  418. package/llms/components/lr-provenance-panel.md +3 -0
  419. package/llms/components/lr-push-to-talk.md +3 -0
  420. package/llms/components/lr-radio-button.md +13 -4
  421. package/llms/components/lr-radio-group.md +5 -0
  422. package/llms/components/lr-radio.md +9 -0
  423. package/llms/components/lr-rating.md +3 -0
  424. package/llms/components/lr-reorder-item.md +6 -0
  425. package/llms/components/lr-reorder-list.md +6 -0
  426. package/llms/components/lr-result-card.md +3 -0
  427. package/llms/components/lr-result-field.md +3 -0
  428. package/llms/components/lr-rubric-form.md +12 -0
  429. package/llms/components/lr-select.md +9 -0
  430. package/llms/components/lr-sequence-playback.md +4 -0
  431. package/llms/components/lr-slider.md +16 -4
  432. package/llms/components/lr-source-picker.md +4 -0
  433. package/llms/components/lr-span-waterfall.md +3 -0
  434. package/llms/components/lr-sparkline.md +4 -0
  435. package/llms/components/lr-split-panel.md +4 -0
  436. package/llms/components/lr-stack-trace.md +3 -0
  437. package/llms/components/lr-stat.md +10 -0
  438. package/llms/components/lr-subagent-panel.md +3 -2
  439. package/llms/components/lr-svg-viewer.md +3 -0
  440. package/llms/components/lr-swatch-picker.md +4 -0
  441. package/llms/components/lr-switch.md +6 -0
  442. package/llms/components/lr-tab-group.md +4 -0
  443. package/llms/components/lr-table.md +10 -2
  444. package/llms/components/lr-terminal.md +3 -0
  445. package/llms/components/lr-textarea.md +9 -0
  446. package/llms/components/lr-thread-list.md +6 -3
  447. package/llms/components/lr-time-input.md +3 -0
  448. package/llms/components/lr-time-range.md +5 -0
  449. package/llms/components/lr-timeline-item.md +6 -0
  450. package/llms/components/lr-timeline.md +6 -0
  451. package/llms/components/lr-token-input.md +14 -0
  452. package/llms/components/lr-tool-call-chip.md +5 -3
  453. package/llms/components/lr-tool-param-form.md +4 -0
  454. package/llms/components/lr-tool-result-dialog.md +4 -0
  455. package/llms/components/lr-tool-select-dialog.md +4 -0
  456. package/llms/components/lr-tooltip.md +6 -0
  457. package/llms/components/lr-trace-tree.md +3 -0
  458. package/llms/components/lr-transcript-feed.md +3 -0
  459. package/llms/components/lr-tree-item.md +12 -5
  460. package/llms/components/lr-tree.md +12 -5
  461. package/llms/components/lr-typing-indicator.md +3 -0
  462. package/llms/components/lr-usage-badge.md +4 -0
  463. package/llms/components/lr-video.md +8 -2
  464. package/llms/components/lr-virtual-list.md +5 -3
  465. package/llms/components/lr-voice-picker.md +8 -0
  466. package/llms/components/lr-widget-renderer.md +9 -0
  467. package/llms/components/lr-widget.md +4 -2
  468. package/llms/components/lr-word-cloud.md +4 -0
  469. package/llms/components/lr-xml-viewer.md +9 -2
  470. package/llms/components/lr-zoomable-frame.md +6 -3
  471. package/llms-full.txt +4080 -2711
  472. package/package.json +4 -4
  473. package/vscode-css-data.json +1 -1
  474. package/vscode-html-data.json +1 -1
  475. package/web-types.json +1 -1
@@ -1 +1 @@
1
- import{isWidgetTypeRegistry}from"./registry.js";import{readWidgetPointer,WIDGET_MAX_DEPTH,WIDGET_MAX_NODES,WIDGET_MAX_PROPS_PER_NODE,WIDGET_MAX_WARNINGS}from"../../../internal/widget-resolver.js";const WIDGET_MAX_STRING_LENGTH=16384;function truncateWidgetString(value){if(value.length<=WIDGET_MAX_STRING_LENGTH)return value;const capped=value.slice(0,WIDGET_MAX_STRING_LENGTH),last=capped.charCodeAt(capped.length-1);return last>=55296&&last<=56319?capped.slice(0,-1):capped}const DOCUMENT_INVALID=Symbol("invalid-widget-document"),DOCUMENT_MISSING=Symbol("missing-widget-document-field");function readDocumentField(input,key){try{return Object.hasOwn(input,key)?Reflect.get(input,key):DOCUMENT_MISSING}catch{return DOCUMENT_INVALID}}function snapshotDocumentProps(input){const output={};let admitted=0;try{for(const key in input){if(!Object.hasOwn(input,key))continue;if(admitted>=WIDGET_MAX_PROPS_PER_NODE)break;const value=Reflect.get(input,key);admitted+=1,output[key]=typeof value=="string"?truncateWidgetString(value):value}}catch{return DOCUMENT_INVALID}return Object.freeze(output)}function snapshotDocumentNode(input,depth,context){if(depth>WIDGET_MAX_DEPTH||context.remaining<=0)return null;if(context.remaining-=1,input===null||typeof input!="object"||Array.isArray(input)||context.ancestors.has(input))return DOCUMENT_INVALID;const type=readDocumentField(input,"type");if(typeof type!="string")return DOCUMENT_INVALID;const id=readDocumentField(input,"id"),slot=readDocumentField(input,"slot"),actionId=readDocumentField(input,"actionId"),propsInput=readDocumentField(input,"props"),childrenInput=readDocumentField(input,"children");if([id,slot,actionId,propsInput,childrenInput].includes(DOCUMENT_INVALID)||id!==DOCUMENT_MISSING&&(typeof id!="string"||id.length===0||id!==id.trim()))return DOCUMENT_INVALID;if(typeof id=="string"){if(context.ids.has(id))return DOCUMENT_INVALID;context.ids.add(id)}if(slot!==DOCUMENT_MISSING&&(typeof slot!="string"||slot.length===0||slot!==slot.trim())||actionId!==DOCUMENT_MISSING&&(typeof actionId!="string"||actionId.length===0||actionId!==actionId.trim())||propsInput!==DOCUMENT_MISSING&&(propsInput===null||typeof propsInput!="object"||Array.isArray(propsInput))||childrenInput!==DOCUMENT_MISSING&&!Array.isArray(childrenInput))return DOCUMENT_INVALID;const props=propsInput===DOCUMENT_MISSING?void 0:snapshotDocumentProps(propsInput);if(props===DOCUMENT_INVALID)return DOCUMENT_INVALID;let payload=DOCUMENT_MISSING;if(actionId!==DOCUMENT_MISSING&&(payload=readDocumentField(input,"payload"),payload===DOCUMENT_INVALID))return DOCUMENT_INVALID;const children=[];if(childrenInput!==DOCUMENT_MISSING&&depth<WIDGET_MAX_DEPTH){const length=readDocumentField(childrenInput,"length");if(typeof length!="number"||!Number.isSafeInteger(length)||length<0)return DOCUMENT_INVALID;context.ancestors.add(input);try{for(let index=0;index<length&&context.remaining>0;index++){const child=readDocumentField(childrenInput,index);if(child===DOCUMENT_INVALID||child===DOCUMENT_MISSING)return DOCUMENT_INVALID;if(typeof child=="string"){context.remaining-=1,children.push(truncateWidgetString(child));continue}const snapshot=snapshotDocumentNode(child,depth+1,context);if(snapshot===DOCUMENT_INVALID)return DOCUMENT_INVALID;snapshot&&children.push(snapshot)}}finally{context.ancestors.delete(input)}}return Object.freeze({type,...typeof id=="string"?{id}:{},...typeof slot=="string"?{slot}:{},...typeof actionId=="string"?{actionId,payload:payload===DOCUMENT_MISSING?void 0:payload}:{},...props===void 0?{}:{props},...children.length===0?{}:{children:Object.freeze(children)}})}function createWidgetDocument(root){const snapshot=snapshotDocumentNode(root,0,{ancestors:new Set,ids:new Set,remaining:WIDGET_MAX_NODES});if(snapshot===DOCUMENT_INVALID||snapshot===null)throw new TypeError("A widget document root must be a valid bounded widget node.");return Object.freeze({version:"2",root:snapshot})}const WARNING_SUPPRESSION_KEY="__warning-cap__",INVALID=Symbol("invalid-widget-input"),ROW_COL_PROP_ENUMS={gap:["s","m","l"],align:["start","center","end","stretch"],justify:["start","center","end","between"]};function warnOnce(ctx,key,message){if(!ctx.warned.has(key)){if(ctx.warned.size>=WIDGET_MAX_WARNINGS){if(ctx.warned.has(WARNING_SUPPRESSION_KEY))return;ctx.warned.add(WARNING_SUPPRESSION_KEY),(ctx.warn??console.warn)(`[lr-widget-renderer] suppressed further diagnostics after ${WIDGET_MAX_WARNINGS} unique warnings`);return}ctx.warned.add(key),(ctx.warn??console.warn)(`[lr-widget-renderer] ${message}`)}}function capResolvedString(value,ctx,key,subject){const capped=truncateWidgetString(value);return capped.length!==value.length&&warnOnce(ctx,`__string-cap__:${key}`,`truncated ${subject} after the ${WIDGET_MAX_STRING_LENGTH}-character string cap was reached`),capped}function isBinding(value){return!!(value&&typeof value=="object"&&!Array.isArray(value)&&typeof value.$bind=="string")}function resolveValue(value,ctx){if(!isBinding(value))return{value};const resolved=readWidgetPointer(ctx.bindingState,value.$bind);return{value:resolved===void 0?value.fallback:resolved,path:value.$bind}}function consumeNodeBudget(snapshot){return snapshot.remaining<=0?(warnOnce(snapshot.resolve,"__node-cap__",`stopped resolving after the ${WIDGET_MAX_NODES}-node cap was reached`),!1):(snapshot.remaining--,!0)}function snapshotProps(input,type,ctx){const out={};let visited=0;for(const key in input){if(visited>=WIDGET_MAX_PROPS_PER_NODE){warnOnce(ctx,`__prop-cap__:${type}`,`stopped reading props on type "${type}" after the ${WIDGET_MAX_PROPS_PER_NODE}-prop cap was reached`);break}visited++,Object.hasOwn(input,key)&&(out[key]=input[key])}return out}function definitionFor(type,registry){return registry.get(type)}function snapshotNode(input,depth,snapshot){if(depth>WIDGET_MAX_DEPTH)return warnOnce(snapshot.resolve,"__depth-cap__",`stopped resolving after the ${WIDGET_MAX_DEPTH}-level depth cap was reached`),null;if(!consumeNodeBudget(snapshot))return null;if(input===null||typeof input!="object"||Array.isArray(input)||snapshot.ancestors.has(input))return INVALID;const candidate=input,type=candidate.type;if(typeof type!="string")return INVALID;if(!(type==="row"||type==="col"||type==="text")&&!definitionFor(type,snapshot.resolve.registry))return{type};const id=candidate.id;if(id!==void 0&&(typeof id!="string"||id.length===0||id!==id.trim()))return INVALID;const slot=candidate.slot;if(slot!==void 0&&(typeof slot!="string"||slot.length===0||slot!==slot.trim()))return INVALID;const actionId=candidate.actionId;if(actionId!==void 0&&(typeof actionId!="string"||actionId.length===0||actionId!==actionId.trim()))return INVALID;const propsInput=candidate.props;if(propsInput!==void 0&&(propsInput===null||typeof propsInput!="object"||Array.isArray(propsInput)))return INVALID;const childrenInput=candidate.children;if(childrenInput!==void 0&&!Array.isArray(childrenInput))return INVALID;const node={type,...id!==void 0?{id}:{},...slot!==void 0?{slot}:{},...actionId!==void 0?{actionId,payload:candidate.payload}:{},...propsInput!==void 0?{props:snapshotProps(propsInput,type,snapshot.resolve)}:{}};if(childrenInput===void 0||depth===WIDGET_MAX_DEPTH)return childrenInput&&childrenInput.length>0&&warnOnce(snapshot.resolve,"__depth-cap__",`stopped resolving after the ${WIDGET_MAX_DEPTH}-level depth cap was reached`),node;const children=[];snapshot.ancestors.add(input);try{const childCount=childrenInput.length;for(let index=0;index<childCount;index++){if(snapshot.remaining<=0){consumeNodeBudget(snapshot);break}const child=childrenInput[index];if(typeof child=="string"){if(!consumeNodeBudget(snapshot))break;children.push(child);continue}const accepted=snapshotNode(child,depth+1,snapshot);if(accepted===INVALID)return INVALID;accepted&&children.push(accepted)}}finally{snapshot.ancestors.delete(input)}return children.length>0?{...node,children}:node}function filterRowColProps(props){const out={};if(!props)return out;for(const[key,allowed]of Object.entries(ROW_COL_PROP_ENUMS)){const value=props[key];typeof value=="string"&&allowed.includes(value)&&(out[key]=value)}return out}function filterMappedProps(props,def,ctx,type){const out={},bindings=[],allowlist=def.props??{};if(props)for(const[key,rawValue]of Object.entries(props)){const expectedType=allowlist[key],{value,path}=resolveValue(rawValue,ctx);if(expectedType===void 0||typeof value!==expectedType){warnOnce(ctx,`${type}:${key}`,`skipped disallowed or mistyped prop "${key}" on type "${type}"`);continue}out[key]=typeof value=="string"?capResolvedString(value,ctx,`${type}:${key}`,`string prop "${key}" on type "${type}"`):value,path&&bindings.push({prop:key,path,event:def.bindings?.[key]?.event})}return{props:{...out,...def.forcedProps??{}},bindings}}function containsInteractive(node){return node.kind==="text"?!1:node.interactive||node.children.some(containsInteractive)}function resolveChild(value,ctx,path){return typeof value=="string"?{nodeKey:`path:${path}`,nodePath:path,kind:"text",text:capResolvedString(value,ctx,"__text__","a text child")}:resolveNode(value,ctx,path)}function resolveNode(node,ctx,path){const authoredId=node.id,nodeKey=authoredId?`id:${authoredId}`:`path:${path}`;let kind,tag,interactive=!1,props,actionEvent,bindings=[],slots=[];if(node.type==="row"||node.type==="col")kind=node.type==="row"?"builtin-row":"builtin-col",props=filterRowColProps(node.props);else if(node.type==="text"){kind="builtin-text";const resolved=resolveValue(node.props?.value,ctx);if(props=typeof resolved.value=="string"||typeof resolved.value=="number"?{value:capResolvedString(String(resolved.value),ctx,"__text-value__",'the "value" of a built-in text node')}:{},resolved.path){if(!authoredId)throw warnOnce(ctx,`__required-id__:${path}`,"rejected bound text without a stable id"),new TypeError("A bound widget node requires a stable id.");bindings=[{prop:"value",path:resolved.path}]}}else{const def=definitionFor(node.type,ctx.registry);if(!def)return warnOnce(ctx,node.type,`skipped unknown widget type "${node.type}" (and its subtree)`),null;kind="mapped",tag=def.tag,interactive=def.interaction==="control";const filtered=filterMappedProps(node.props,def,ctx,node.type);if(props=filtered.props,bindings=filtered.bindings,slots=def.slots??[],node.actionId!==void 0&&def.action&&(actionEvent=def.action.event),(actionEvent||bindings.length>0)&&!authoredId)throw warnOnce(ctx,`__required-id__:${path}`,`rejected stateful or actionable type "${node.type}" without a stable id`),new TypeError("A stateful or actionable widget node requires a stable id.")}const children=[];for(let index=0;index<(node.children?.length??0);index++){const resolvedChild=resolveChild(node.children[index],ctx,`${path}.${index}`);if(resolvedChild){if(interactive&&containsInteractive(resolvedChild)){warnOnce(ctx,`__nested-interactive__:${node.type}`,`skipped a control descendant inside control type "${node.type}"`);continue}resolvedChild.slot!==void 0&&!slots.includes(resolvedChild.slot)&&(resolvedChild.slot=void 0),children.push(resolvedChild)}}return{nodeId:authoredId,nodeKey,nodePath:path,kind,tag,interactive,props,actionEvent,actionId:actionEvent?node.actionId:void 0,payload:actionEvent?node.payload:void 0,bindings,children,slot:node.slot}}function hasDuplicateAuthoredIds(root,ctx){const counts=new Map,pending=[root];for(;pending.length>0;){const node=pending.pop();node.id&&counts.set(node.id,(counts.get(node.id)??0)+1);for(const child of node.children??[])typeof child!="string"&&pending.push(child)}let duplicate=!1;for(const[id,count]of counts)count<2||(duplicate=!0,warnOnce(ctx,`__duplicate-id__:${id}`,`rejected duplicate widget id "${id}"`));return duplicate}function resolveTree(root,ctx){if(root==null)return null;if(!isWidgetTypeRegistry(ctx.registry))throw new TypeError("A widget renderer registry must be created with createWidgetTypeRegistry().");const snapshot=snapshotNode(root,0,{resolve:ctx,ancestors:new Set,remaining:WIDGET_MAX_NODES});return snapshot===INVALID||snapshot===null||hasDuplicateAuthoredIds(snapshot,ctx)?null:resolveNode(snapshot,ctx,"0")}export{WIDGET_MAX_STRING_LENGTH,createWidgetDocument,resolveTree};
1
+ import{devWarn}from"../../../internal/dev-mode-attribute-warning.js";import{isWidgetTypeRegistry}from"./registry.js";import{readWidgetPointer,WIDGET_MAX_DEPTH,WIDGET_MAX_NODES,WIDGET_MAX_PROPS_PER_NODE,WIDGET_MAX_WARNINGS}from"../../../internal/widget-resolver.js";const WIDGET_MAX_STRING_LENGTH=16384;function truncateWidgetString(value){if(value.length<=WIDGET_MAX_STRING_LENGTH)return value;const capped=value.slice(0,WIDGET_MAX_STRING_LENGTH),last=capped.charCodeAt(capped.length-1);return last>=55296&&last<=56319?capped.slice(0,-1):capped}const DOCUMENT_INVALID=Symbol("invalid-widget-document"),DOCUMENT_MISSING=Symbol("missing-widget-document-field");function readDocumentField(input,key){try{return Object.hasOwn(input,key)?Reflect.get(input,key):DOCUMENT_MISSING}catch{return DOCUMENT_INVALID}}function snapshotDocumentProps(input){const output={};let admitted=0;try{for(const key in input){if(!Object.hasOwn(input,key))continue;if(admitted>=WIDGET_MAX_PROPS_PER_NODE)break;const value=Reflect.get(input,key);admitted+=1,output[key]=typeof value=="string"?truncateWidgetString(value):value}}catch{return DOCUMENT_INVALID}return Object.freeze(output)}function snapshotDocumentNode(input,depth,context){if(depth>WIDGET_MAX_DEPTH||context.remaining<=0)return null;if(context.remaining-=1,input===null||typeof input!="object"||Array.isArray(input)||context.ancestors.has(input))return DOCUMENT_INVALID;const type=readDocumentField(input,"type");if(typeof type!="string")return DOCUMENT_INVALID;const id=readDocumentField(input,"id"),slot=readDocumentField(input,"slot"),actionId=readDocumentField(input,"actionId"),propsInput=readDocumentField(input,"props"),childrenInput=readDocumentField(input,"children");if([id,slot,actionId,propsInput,childrenInput].includes(DOCUMENT_INVALID)||id!==DOCUMENT_MISSING&&(typeof id!="string"||id.length===0||id!==id.trim()))return DOCUMENT_INVALID;if(typeof id=="string"){if(context.ids.has(id))return DOCUMENT_INVALID;context.ids.add(id)}if(slot!==DOCUMENT_MISSING&&(typeof slot!="string"||slot.length===0||slot!==slot.trim())||actionId!==DOCUMENT_MISSING&&(typeof actionId!="string"||actionId.length===0||actionId!==actionId.trim())||propsInput!==DOCUMENT_MISSING&&(propsInput===null||typeof propsInput!="object"||Array.isArray(propsInput))||childrenInput!==DOCUMENT_MISSING&&!Array.isArray(childrenInput))return DOCUMENT_INVALID;const props=propsInput===DOCUMENT_MISSING?void 0:snapshotDocumentProps(propsInput);if(props===DOCUMENT_INVALID)return DOCUMENT_INVALID;let payload=DOCUMENT_MISSING;if(actionId!==DOCUMENT_MISSING&&(payload=readDocumentField(input,"payload"),payload===DOCUMENT_INVALID))return DOCUMENT_INVALID;const children=[];if(childrenInput!==DOCUMENT_MISSING&&depth<WIDGET_MAX_DEPTH){const length=readDocumentField(childrenInput,"length");if(typeof length!="number"||!Number.isSafeInteger(length)||length<0)return DOCUMENT_INVALID;context.ancestors.add(input);try{for(let index=0;index<length&&context.remaining>0;index++){const child=readDocumentField(childrenInput,index);if(child===DOCUMENT_INVALID||child===DOCUMENT_MISSING)return DOCUMENT_INVALID;if(typeof child=="string"){context.remaining-=1,children.push(truncateWidgetString(child));continue}const snapshot=snapshotDocumentNode(child,depth+1,context);if(snapshot===DOCUMENT_INVALID)return DOCUMENT_INVALID;snapshot&&children.push(snapshot)}}finally{context.ancestors.delete(input)}}return Object.freeze({type,...typeof id=="string"?{id}:{},...typeof slot=="string"?{slot}:{},...typeof actionId=="string"?{actionId,payload:payload===DOCUMENT_MISSING?void 0:payload}:{},...props===void 0?{}:{props},...children.length===0?{}:{children:Object.freeze(children)}})}function createWidgetDocument(root){const snapshot=snapshotDocumentNode(root,0,{ancestors:new Set,ids:new Set,remaining:WIDGET_MAX_NODES});if(snapshot===DOCUMENT_INVALID||snapshot===null)throw new TypeError("A widget document root must be a valid bounded widget node.");return Object.freeze({version:"2",root:snapshot})}const WARNING_SUPPRESSION_KEY="__warning-cap__",INVALID=Symbol("invalid-widget-input"),ROW_COL_PROP_ENUMS={gap:["s","m","l"],align:["start","center","end","stretch"],justify:["start","center","end","between"]};function warnOnce(ctx,key,message){if(!ctx.warned.has(key)){if(ctx.warned.size>=WIDGET_MAX_WARNINGS){if(ctx.warned.has(WARNING_SUPPRESSION_KEY))return;ctx.warned.add(WARNING_SUPPRESSION_KEY),(ctx.warn??devWarn)(`[lr-widget-renderer] suppressed further diagnostics after ${WIDGET_MAX_WARNINGS} unique warnings`);return}ctx.warned.add(key),(ctx.warn??devWarn)(`[lr-widget-renderer] ${message}`)}}function capResolvedString(value,ctx,key,subject){const capped=truncateWidgetString(value);return capped.length!==value.length&&warnOnce(ctx,`__string-cap__:${key}`,`truncated ${subject} after the ${WIDGET_MAX_STRING_LENGTH}-character string cap was reached`),capped}function isBinding(value){return!!(value&&typeof value=="object"&&!Array.isArray(value)&&typeof value.$bind=="string")}function resolveValue(value,ctx){if(!isBinding(value))return{value};const resolved=readWidgetPointer(ctx.bindingState,value.$bind);return{value:resolved===void 0?value.fallback:resolved,path:value.$bind}}function consumeNodeBudget(snapshot){return snapshot.remaining<=0?(warnOnce(snapshot.resolve,"__node-cap__",`stopped resolving after the ${WIDGET_MAX_NODES}-node cap was reached`),!1):(snapshot.remaining--,!0)}function snapshotProps(input,type,ctx){const out={};let visited=0;for(const key in input){if(visited>=WIDGET_MAX_PROPS_PER_NODE){warnOnce(ctx,`__prop-cap__:${type}`,`stopped reading props on type "${type}" after the ${WIDGET_MAX_PROPS_PER_NODE}-prop cap was reached`);break}visited++,Object.hasOwn(input,key)&&(out[key]=input[key])}return out}function definitionFor(type,registry){return registry.get(type)}function snapshotNode(input,depth,snapshot){if(depth>WIDGET_MAX_DEPTH)return warnOnce(snapshot.resolve,"__depth-cap__",`stopped resolving after the ${WIDGET_MAX_DEPTH}-level depth cap was reached`),null;if(!consumeNodeBudget(snapshot))return null;if(input===null||typeof input!="object"||Array.isArray(input)||snapshot.ancestors.has(input))return INVALID;const candidate=input,type=candidate.type;if(typeof type!="string")return INVALID;if(!(type==="row"||type==="col"||type==="text")&&!definitionFor(type,snapshot.resolve.registry))return{type};const id=candidate.id;if(id!==void 0&&(typeof id!="string"||id.length===0||id!==id.trim()))return INVALID;const slot=candidate.slot;if(slot!==void 0&&(typeof slot!="string"||slot.length===0||slot!==slot.trim()))return INVALID;const actionId=candidate.actionId;if(actionId!==void 0&&(typeof actionId!="string"||actionId.length===0||actionId!==actionId.trim()))return INVALID;const propsInput=candidate.props;if(propsInput!==void 0&&(propsInput===null||typeof propsInput!="object"||Array.isArray(propsInput)))return INVALID;const childrenInput=candidate.children;if(childrenInput!==void 0&&!Array.isArray(childrenInput))return INVALID;const node={type,...id!==void 0?{id}:{},...slot!==void 0?{slot}:{},...actionId!==void 0?{actionId,payload:candidate.payload}:{},...propsInput!==void 0?{props:snapshotProps(propsInput,type,snapshot.resolve)}:{}};if(childrenInput===void 0||depth===WIDGET_MAX_DEPTH)return childrenInput&&childrenInput.length>0&&warnOnce(snapshot.resolve,"__depth-cap__",`stopped resolving after the ${WIDGET_MAX_DEPTH}-level depth cap was reached`),node;const children=[];snapshot.ancestors.add(input);try{const childCount=childrenInput.length;for(let index=0;index<childCount;index++){if(snapshot.remaining<=0){consumeNodeBudget(snapshot);break}const child=childrenInput[index];if(typeof child=="string"){if(!consumeNodeBudget(snapshot))break;children.push(child);continue}const accepted=snapshotNode(child,depth+1,snapshot);if(accepted===INVALID)return INVALID;accepted&&children.push(accepted)}}finally{snapshot.ancestors.delete(input)}return children.length>0?{...node,children}:node}function filterRowColProps(props){const out={};if(!props)return out;for(const[key,allowed]of Object.entries(ROW_COL_PROP_ENUMS)){const value=props[key];typeof value=="string"&&allowed.includes(value)&&(out[key]=value)}return out}function filterMappedProps(props,def,ctx,type){const out={},bindings=[],allowlist=def.props??{};if(props)for(const[key,rawValue]of Object.entries(props)){const expectedType=allowlist[key],{value,path}=resolveValue(rawValue,ctx);if(expectedType===void 0||typeof value!==expectedType){warnOnce(ctx,`${type}:${key}`,`skipped disallowed or mistyped prop "${key}" on type "${type}"`);continue}out[key]=typeof value=="string"?capResolvedString(value,ctx,`${type}:${key}`,`string prop "${key}" on type "${type}"`):value,path&&bindings.push({prop:key,path,event:def.bindings?.[key]?.event})}return{props:{...out,...def.forcedProps??{}},bindings}}function containsInteractive(node){return node.kind==="text"?!1:node.interactive||node.children.some(containsInteractive)}function resolveChild(value,ctx,path){return typeof value=="string"?{nodeKey:`path:${path}`,nodePath:path,kind:"text",text:capResolvedString(value,ctx,"__text__","a text child")}:resolveNode(value,ctx,path)}function resolveNode(node,ctx,path){const authoredId=node.id,nodeKey=authoredId?`id:${authoredId}`:`path:${path}`;let kind,tag,interactive=!1,props,actionEvent,bindings=[],slots=[];if(node.type==="row"||node.type==="col")kind=node.type==="row"?"builtin-row":"builtin-col",props=filterRowColProps(node.props);else if(node.type==="text"){kind="builtin-text";const resolved=resolveValue(node.props?.value,ctx);if(props=typeof resolved.value=="string"||typeof resolved.value=="number"?{value:capResolvedString(String(resolved.value),ctx,"__text-value__",'the "value" of a built-in text node')}:{},resolved.path){if(!authoredId)throw warnOnce(ctx,`__required-id__:${path}`,"rejected bound text without a stable id"),new TypeError("A bound widget node requires a stable id.");bindings=[{prop:"value",path:resolved.path}]}}else{const def=definitionFor(node.type,ctx.registry);if(!def)return warnOnce(ctx,node.type,`skipped unknown widget type "${node.type}" (and its subtree)`),null;kind="mapped",tag=def.tag,interactive=def.interaction==="control";const filtered=filterMappedProps(node.props,def,ctx,node.type);if(props=filtered.props,bindings=filtered.bindings,slots=def.slots??[],node.actionId!==void 0&&def.action&&(actionEvent=def.action.event),(actionEvent||bindings.length>0)&&!authoredId)throw warnOnce(ctx,`__required-id__:${path}`,`rejected stateful or actionable type "${node.type}" without a stable id`),new TypeError("A stateful or actionable widget node requires a stable id.")}const children=[];for(let index=0;index<(node.children?.length??0);index++){const resolvedChild=resolveChild(node.children[index],ctx,`${path}.${index}`);if(resolvedChild){if(interactive&&containsInteractive(resolvedChild)){warnOnce(ctx,`__nested-interactive__:${node.type}`,`skipped a control descendant inside control type "${node.type}"`);continue}resolvedChild.slot!==void 0&&!slots.includes(resolvedChild.slot)&&(resolvedChild.slot=void 0),children.push(resolvedChild)}}return{nodeId:authoredId,nodeKey,nodePath:path,kind,tag,interactive,props,actionEvent,actionId:actionEvent?node.actionId:void 0,payload:actionEvent?node.payload:void 0,bindings,children,slot:node.slot}}function hasDuplicateAuthoredIds(root,ctx){const counts=new Map,pending=[root];for(;pending.length>0;){const node=pending.pop();node.id&&counts.set(node.id,(counts.get(node.id)??0)+1);for(const child of node.children??[])typeof child!="string"&&pending.push(child)}let duplicate=!1;for(const[id,count]of counts)count<2||(duplicate=!0,warnOnce(ctx,`__duplicate-id__:${id}`,`rejected duplicate widget id "${id}"`));return duplicate}function resolveTree(root,ctx){if(root==null)return null;if(!isWidgetTypeRegistry(ctx.registry))throw new TypeError("A widget renderer registry must be created with createWidgetTypeRegistry().");const snapshot=snapshotNode(root,0,{resolve:ctx,ancestors:new Set,remaining:WIDGET_MAX_NODES});return snapshot===INVALID||snapshot===null||hasDuplicateAuthoredIds(snapshot,ctx)?null:resolveNode(snapshot,ctx,"0")}export{WIDGET_MAX_STRING_LENGTH,createWidgetDocument,resolveTree};
@@ -9,7 +9,10 @@ export type LyraCalendarFirstDayOfWeek=LyraDatePickerFirstDayOfWeek;
9
9
  *
10
10
  * Month-view event markers are real buttons inside each focusable gridcell, so
11
11
  * keyboard users can activate individual events without switching views.
12
- * Agenda view renders the same events as full-width buttons.
12
+ * Agenda view renders the same events as full-width buttons. Early ISO dates retain their
13
+ * authored local year in month rendering and navigation. Colored agenda actions keep their
14
+ * foreground/background pairing during hover and press; callers remain responsible for choosing
15
+ * accessible custom event colors.
13
16
  *
14
17
  * Public collection properties take bounded, detached readonly sequences. Calendar-only fields
15
18
  * are projected from own data descriptors once per assignment; `lr-event-select` retains the
@@ -45,8 +48,8 @@ export type LyraCalendarFirstDayOfWeek=LyraDatePickerFirstDayOfWeek;
45
48
  * @cssprop [--lr-calendar-nav-active-bg=color-mix(in oklab, var(--lr-calendar-nav-hover-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active))] - Month-navigation pressed background.
46
49
  * @cssprop [--lr-calendar-day-hover-bg=var(--lr-color-brand-quiet)] - Day hover background.
47
50
  * @cssprop [--lr-calendar-day-active-bg=color-mix(in oklab, var(--lr-calendar-day-hover-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active))] - Day pressed background.
48
- * @cssprop [--lr-calendar-agenda-event-hover-bg=var(--lr-color-brand-quiet)] - Agenda-event hover background.
49
- * @cssprop [--lr-calendar-agenda-event-active-bg=color-mix(in oklab, var(--lr-calendar-agenda-event-hover-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active))] - Agenda-event pressed background.
51
+ * @cssprop [--lr-calendar-agenda-event-hover-bg=var(--lr-color-brand-quiet)] - Agenda-event hover background override; without one, colored events retain their event fill.
52
+ * @cssprop [--lr-calendar-agenda-event-active-bg=color-mix(in oklab, var(--lr-calendar-agenda-event-hover-bg, var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active))] - Agenda-event pressed background override; without one, colored events retain their event fill.
50
53
  * @cssprop [--lr-calendar-day-min-block-size=var(--lr-size-6rem)] - Minimum block size of a day cell.
51
54
  * @cssprop [--lr-calendar-day-min-block-size-narrow=var(--lr-size-4rem)] - Minimum block size of a day cell once the host is narrower than 28rem.
52
55
  * @cssprop [--lr-calendar-day-selected-bg=var(--lr-color-brand-quiet)] - Background of a selected day cell, decoupled from the shared token also driving the nav-button/agenda-event hover background.
@@ -1,2 +1,2 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{formatISO,monthMatrix,parseISO,resolveFirstDayOfWeek,weekdayLabels}from"../../forms/date-picker/calendar-core.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{styles}from"./calendar.styles.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR,getOwnDataDescriptor}from"../../../internal/data-descriptors.js";import{LYRA_DEFAULT_calendarEmpty,LYRA_DEFAULT_calendarLabel,LYRA_DEFAULT_calendarNextMonth,LYRA_DEFAULT_calendarPreviousMonth}from"../../../internal/default-strings.generated.js";const monthStart=date=>new Date(date.getFullYear(),date.getMonth(),1),canonicalEventSnapshots=new WeakMap;function normalizeCalendarEventDate(value){if(typeof value=="string"){const date=parseISO(value);return date?formatISO(date):void 0}if(typeof value=="number"){if(!Number.isFinite(value))return;const date=new Date(value);return Number.isNaN(date.getTime())?void 0:formatISO(date)}if(!(value===null||typeof value!="object"))try{const epoch=Date.prototype.getTime.call(value);return Number.isFinite(epoch)?formatISO(new Date(epoch)):void 0}catch{return}}function isSafeNonArrayObject(value){if(value===null||typeof value!="object")return!1;try{return!Array.isArray(value)}catch{return!1}}function projectCalendarEvent(value){if(!isSafeNonArrayObject(value))return;const date=getOwnDataDescriptor(value,"date"),title=getOwnDataDescriptor(value,"title"),color=getOwnDataDescriptor(value,"color");if(date===MISSING_OWN_DATA_DESCRIPTOR||date===UNSAFE_OWN_DATA_DESCRIPTOR||title===MISSING_OWN_DATA_DESCRIPTOR||title===UNSAFE_OWN_DATA_DESCRIPTOR||typeof title.value!="string"||title.value.trim().length===0)return;const normalizedDate=normalizeCalendarEventDate(date.value);if(normalizedDate)return Object.freeze({source:value,date:normalizedDate,title:title.value,color:color===MISSING_OWN_DATA_DESCRIPTOR||color===UNSAFE_OWN_DATA_DESCRIPTOR||typeof color.value!="string"?void 0:color.value})}function canonicalCalendarEvents(values){const cached=canonicalEventSnapshots.get(values);if(cached)return cached;const projected=[];for(const value of values){const event=projectCalendarEvent(value);event&&projected.push(event)}const snapshot=Object.freeze(projected);return canonicalEventSnapshots.set(values,snapshot),snapshot}class LyraCalendar extends LyraElement{constructor(){super(...arguments),this.events=[],this.value="",this.viewDate=formatISO(new Date).slice(0,7)+"-01",this._view="month",this.firstDayOfWeek="auto",this.accessibleLabel="",this.focusedDate=""}static{this.defaultStrings={...super.defaultStrings,calendarEmpty:LYRA_DEFAULT_calendarEmpty,calendarLabel:LYRA_DEFAULT_calendarLabel,calendarNextMonth:LYRA_DEFAULT_calendarNextMonth,calendarPreviousMonth:LYRA_DEFAULT_calendarPreviousMonth}}static{this.ownedCollectionProperties=Object.freeze(["events"])}static{this.identityCollectionProperties=Object.freeze(["events"])}static{this.styles=[LyraElement.styles,styles]}get view(){return this._view}set view(value){const normalized=value==="agenda"?"agenda":"month",previous=this._view;if(previous===normalized){value!==normalized&&this.requestUpdate("view",previous);return}this._view=normalized,this.requestUpdate("view",previous)}get viewStart(){const parsed=parseISO(this.viewDate);return monthStart(parsed||new Date)}get normalizedFirstDayOfWeek(){return resolveFirstDayOfWeek(this.firstDayOfWeek,this.effectiveLocale)}changeMonth(delta){const next=new Date(this.viewStart.getFullYear(),this.viewStart.getMonth()+delta,1);this.viewDate=formatISO(next),this.emit("lr-view-change",{viewDate:this.viewDate})}selectDate(date){this.value=date,this.focusedDate=date,this.emit("lr-date-select",{date})}get effectiveEvents(){return canonicalCalendarEvents(this.events)}bucketEventsByDate(events){const buckets=new Map;for(const event of events){const bucket=buckets.get(event.date);bucket?bucket.push(event):buckets.set(event.date,[event])}return buckets}weeks(){const start=this.viewStart;return monthMatrix(start.getFullYear(),start.getMonth(),this.normalizedFirstDayOfWeek)}gridBounds(weeks){return[weeks[0][0],weeks[weeks.length-1][6]]}onDayKeyDown(event,date){let delta=0;if(event.key==="ArrowLeft")delta=this.effectiveDirection==="rtl"?1:-1;else if(event.key==="ArrowRight")delta=this.effectiveDirection==="rtl"?-1:1;else if(event.key==="ArrowUp")delta=-7;else if(event.key==="ArrowDown")delta=7;else if(event.key==="Enter"||event.key===" "){event.preventDefault(),this.selectDate(formatISO(date));return}else return;event.preventDefault();const next=new Date(date);next.setDate(next.getDate()+delta);const[gridFirst,gridLast]=this.gridBounds(this.weeks());(next<gridFirst||next>gridLast)&&(this.viewDate=formatISO(monthStart(next)),this.emit("lr-view-change",{viewDate:this.viewDate})),this.focusedDate=formatISO(next),queueMicrotask(()=>this.renderRoot.querySelector(`[data-date="${this.focusedDate}"]`)?.focus())}weekdays(){return weekdayLabels(this.normalizedFirstDayOfWeek,"short",this.effectiveLocale)}updated(changed){super.updated(changed),this.getAttribute("view")!==this._view&&this.setAttribute("view",this._view)}render(){const start=this.viewStart,weeks=this.weeks(),monthTitle=getDateTimeFormat(this.effectiveLocale,{month:"long",year:"numeric"}).format(start),today=formatISO(new Date),label=hostAriaLabel(this)??this.localize("calendarLabel"),dayLabelFmt=getDateTimeFormat(this.effectiveLocale,{dateStyle:"full"}),agendaDateFmt=getDateTimeFormat(this.effectiveLocale,{dateStyle:"medium"}),dayNumberFmt=getNumberFormat(this.effectiveLocale),events=this.effectiveEvents,agenda=events.filter(event=>event.date.startsWith(formatISO(start).slice(0,7))).sort((a,b)=>a.date<b.date?-1:a.date>b.date?1:0),eventsByDate=this.view==="month"?this.bucketEventsByDate(events):void 0,[gridFirst,gridLast]=this.gridBounds(weeks),rawAnchor=this.focusedDate||this.value||today,rawAnchorDate=parseISO(rawAnchor),anchor=rawAnchorDate&&rawAnchorDate>=gridFirst&&rawAnchorDate<=gridLast?rawAnchor:formatISO(start);return html`<section aria-label=${label}><header part="header navigation"><button part="nav previous-button" type="button" aria-label=${this.localize("calendarPreviousMonth")} @click=${()=>this.changeMonth(-1)}><span part="nav-glyph" aria-hidden="true">‹</span></button><span part="title">${monthTitle}</span><button part="nav next-button" type="button" aria-label=${this.localize("calendarNextMonth")} @click=${()=>this.changeMonth(1)}><span part="nav-glyph" aria-hidden="true">›</span></button></header>
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{formatISO,localDate,monthMatrix,parseISO,resolveFirstDayOfWeek,weekdayLabels}from"../../forms/date-picker/calendar-core.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{styles}from"./calendar.styles.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR,getOwnDataDescriptor}from"../../../internal/data-descriptors.js";import{LYRA_DEFAULT_calendarEmpty,LYRA_DEFAULT_calendarLabel,LYRA_DEFAULT_calendarNextMonth,LYRA_DEFAULT_calendarPreviousMonth}from"../../../internal/default-strings.generated.js";const monthStart=date=>localDate(date.getFullYear(),date.getMonth(),1),canonicalEventSnapshots=new WeakMap;function normalizeCalendarEventDate(value){if(typeof value=="string"){const date=parseISO(value);return date?formatISO(date):void 0}if(typeof value=="number"){if(!Number.isFinite(value))return;const date=new Date(value);return Number.isNaN(date.getTime())?void 0:formatISO(date)}if(!(value===null||typeof value!="object"))try{const epoch=Date.prototype.getTime.call(value);return Number.isFinite(epoch)?formatISO(new Date(epoch)):void 0}catch{return}}function isSafeNonArrayObject(value){if(value===null||typeof value!="object")return!1;try{return!Array.isArray(value)}catch{return!1}}function projectCalendarEvent(value){if(!isSafeNonArrayObject(value))return;const date=getOwnDataDescriptor(value,"date"),title=getOwnDataDescriptor(value,"title"),color=getOwnDataDescriptor(value,"color");if(date===MISSING_OWN_DATA_DESCRIPTOR||date===UNSAFE_OWN_DATA_DESCRIPTOR||title===MISSING_OWN_DATA_DESCRIPTOR||title===UNSAFE_OWN_DATA_DESCRIPTOR||typeof title.value!="string"||title.value.trim().length===0)return;const normalizedDate=normalizeCalendarEventDate(date.value);if(normalizedDate)return Object.freeze({source:value,date:normalizedDate,title:title.value,color:color===MISSING_OWN_DATA_DESCRIPTOR||color===UNSAFE_OWN_DATA_DESCRIPTOR||typeof color.value!="string"?void 0:color.value})}function canonicalCalendarEvents(values){const cached=canonicalEventSnapshots.get(values);if(cached)return cached;const projected=[];for(const value of values){const event=projectCalendarEvent(value);event&&projected.push(event)}const snapshot=Object.freeze(projected);return canonicalEventSnapshots.set(values,snapshot),snapshot}class LyraCalendar extends LyraElement{constructor(){super(...arguments),this.events=[],this.value="",this.viewDate=formatISO(new Date).slice(0,7)+"-01",this._view="month",this.firstDayOfWeek="auto",this.accessibleLabel="",this.focusedDate=""}static{this.defaultStrings={...super.defaultStrings,calendarEmpty:LYRA_DEFAULT_calendarEmpty,calendarLabel:LYRA_DEFAULT_calendarLabel,calendarNextMonth:LYRA_DEFAULT_calendarNextMonth,calendarPreviousMonth:LYRA_DEFAULT_calendarPreviousMonth}}static{this.ownedCollectionProperties=Object.freeze(["events"])}static{this.identityCollectionProperties=Object.freeze(["events"])}static{this.styles=[LyraElement.styles,styles]}get view(){return this._view}set view(value){const normalized=value==="agenda"?"agenda":"month",previous=this._view;if(previous===normalized){value!==normalized&&this.requestUpdate("view",previous);return}this._view=normalized,this.requestUpdate("view",previous)}get viewStart(){const parsed=parseISO(this.viewDate);return monthStart(parsed||new Date)}get normalizedFirstDayOfWeek(){return resolveFirstDayOfWeek(this.firstDayOfWeek,this.effectiveLocale)}changeMonth(delta){const next=localDate(this.viewStart.getFullYear(),this.viewStart.getMonth()+delta,1);this.viewDate=formatISO(next),this.emit("lr-view-change",{viewDate:this.viewDate})}selectDate(date){this.value=date,this.focusedDate=date,this.emit("lr-date-select",{date})}get effectiveEvents(){return canonicalCalendarEvents(this.events)}bucketEventsByDate(events){const buckets=new Map;for(const event of events){const bucket=buckets.get(event.date);bucket?bucket.push(event):buckets.set(event.date,[event])}return buckets}weeks(){const start=this.viewStart;return monthMatrix(start.getFullYear(),start.getMonth(),this.normalizedFirstDayOfWeek)}gridBounds(weeks){return[weeks[0][0],weeks[weeks.length-1][6]]}onDayKeyDown(event,date){let delta=0;if(event.key==="ArrowLeft")delta=this.effectiveDirection==="rtl"?1:-1;else if(event.key==="ArrowRight")delta=this.effectiveDirection==="rtl"?-1:1;else if(event.key==="ArrowUp")delta=-7;else if(event.key==="ArrowDown")delta=7;else if(event.key==="Enter"||event.key===" "){event.preventDefault(),this.selectDate(formatISO(date));return}else return;event.preventDefault();const next=new Date(date);next.setDate(next.getDate()+delta);const[gridFirst,gridLast]=this.gridBounds(this.weeks());(next<gridFirst||next>gridLast)&&(this.viewDate=formatISO(monthStart(next)),this.emit("lr-view-change",{viewDate:this.viewDate})),this.focusedDate=formatISO(next),queueMicrotask(()=>this.renderRoot.querySelector(`[data-date="${this.focusedDate}"]`)?.focus())}weekdays(){return weekdayLabels(this.normalizedFirstDayOfWeek,"short",this.effectiveLocale)}updated(changed){super.updated(changed),this.getAttribute("view")!==this._view&&this.setAttribute("view",this._view)}render(){const start=this.viewStart,weeks=this.weeks(),monthTitle=getDateTimeFormat(this.effectiveLocale,{month:"long",year:"numeric"}).format(start),today=formatISO(new Date),label=hostAriaLabel(this)??this.localize("calendarLabel"),dayLabelFmt=getDateTimeFormat(this.effectiveLocale,{dateStyle:"full"}),agendaDateFmt=getDateTimeFormat(this.effectiveLocale,{dateStyle:"medium"}),dayNumberFmt=getNumberFormat(this.effectiveLocale),events=this.effectiveEvents,agenda=events.filter(event=>event.date.startsWith(formatISO(start).slice(0,7))).sort((a,b)=>a.date<b.date?-1:a.date>b.date?1:0),eventsByDate=this.view==="month"?this.bucketEventsByDate(events):void 0,[gridFirst,gridLast]=this.gridBounds(weeks),rawAnchor=this.focusedDate||this.value||today,rawAnchorDate=parseISO(rawAnchor),anchor=rawAnchorDate&&rawAnchorDate>=gridFirst&&rawAnchorDate<=gridLast?rawAnchor:formatISO(start);return html`<section aria-label=${label}><header part="header navigation"><button part="nav previous-button" type="button" aria-label=${this.localize("calendarPreviousMonth")} @click=${()=>this.changeMonth(-1)}><span part="nav-glyph" aria-hidden="true">‹</span></button><span part="title">${monthTitle}</span><button part="nav next-button" type="button" aria-label=${this.localize("calendarNextMonth")} @click=${()=>this.changeMonth(1)}><span part="nav-glyph" aria-hidden="true">›</span></button></header>
2
2
  ${this.view==="agenda"?html`<div part="agenda">${agenda.length?agenda.map(event=>{const date=parseISO(event.date),bg=event.color?sanitizeCssColor(event.color):void 0;return html`<button part="agenda-event" type="button" style=${styleMap(bg?{"--_lr-calendar-agenda-event-background":bg,"--_lr-calendar-agenda-event-foreground":"var(--lr-color-on-brand)"}:{})} @click=${()=>this.emit("lr-event-select",{event:event.source})}><strong>${date?agendaDateFmt.format(date):event.date}</strong> ${event.title}</button>`}):html`<p>${this.localize("calendarEmpty")}</p>`}</div>`:html`<div part="weekdays">${this.weekdays().map(day=>html`<span part="weekday">${day}</span>`)}</div><div part="grid" role="grid" aria-label=${monthTitle}>${weeks.map(week=>html`<div part="week" role="row">${week.map(date=>{const dateIso=formatISO(date),dayEvents=eventsByDate?.get(dateIso)??[];return html`<div part="day" role="gridcell" data-date=${dateIso} data-outside=${date.getMonth()!==start.getMonth()?"true":"false"} data-today=${dateIso===today?"true":"false"} data-selected=${dateIso===this.value?"true":"false"} aria-selected=${dateIso===this.value?"true":"false"} aria-label=${dayLabelFmt.format(date)} tabindex=${dateIso===anchor?"0":"-1"} @click=${event=>{(event.target===event.currentTarget||event.target.getAttribute("part")==="date")&&this.selectDate(dateIso)}} @keydown=${event=>{event.target===event.currentTarget&&this.onDayKeyDown(event,date)}}><span part="date">${dayNumberFmt.format(date.getDate())}</span>${dayEvents.map(item=>{const bg=item.color?sanitizeCssColor(item.color):void 0;return html`<button part="event" type="button" style=${styleMap(bg?{backgroundColor:bg}:{})} @click=${event=>{event.stopPropagation(),this.emit("lr-event-select",{event:item.source})}}>${item.title}</button>`})}</div>`})}</div>`)}</div>`}</section>`}}__decorate([property({attribute:!1})],LyraCalendar.prototype,"events",void 0),__decorate([property()],LyraCalendar.prototype,"value",void 0),__decorate([property({attribute:"view-date"})],LyraCalendar.prototype,"viewDate",void 0),__decorate([property({reflect:!0})],LyraCalendar.prototype,"view",null),__decorate([property({attribute:"first-day-of-week"})],LyraCalendar.prototype,"firstDayOfWeek",void 0),__decorate([property({attribute:"aria-label"})],LyraCalendar.prototype,"accessibleLabel",void 0),__decorate([state()],LyraCalendar.prototype,"focusedDate",void 0);export{LyraCalendar};
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{contain-intrinsic-inline-size:var(--lr-size-20rem);min-inline-size:0;display:block;container-type:inline-size}[part~=header]{justify-content:space-between;align-items:center;gap:var(--lr-space-s);margin-block-end:var(--lr-space-s);display:flex}[part=title]{font-weight:var(--lr-font-weight-semibold)}[part~=nav]{justify-content:center;align-items:center;gap:var(--lr-space-xs);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);display:flex}button[part~=nav],[part=day]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border:var(--lr-border-width-thin) solid var(--lr-color-border);background:var(--lr-color-surface);color:var(--lr-color-text);cursor:pointer;font:inherit}button[part~=nav]{padding-inline:var(--lr-space-s);border-radius:var(--lr-radius)}[part=nav-glyph]{font-size:var(--lr-size-1em)}button[part~=nav]:hover{background:var(--lr-calendar-nav-hover-bg,var(--lr-color-brand-quiet))}button[part~=nav]:active{background:var(--lr-calendar-nav-active-bg,color-mix(in oklab, var(--lr-calendar-nav-hover-bg,var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active)))}button[part~=nav]:focus-visible,[part=agenda-event]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(var(--lr-focus-ring-offset) * -1)}[part=day][data-outside=true]{color:var(--lr-calendar-day-outside-color,var(--lr-color-text-quiet));background:var(--lr-calendar-day-outside-bg,var(--lr-color-surface))}[part=day][data-today=true]{outline:var(--lr-border-width-medium) solid var(--lr-calendar-day-today-outline-color,var(--lr-color-brand));outline-offset:calc(var(--lr-border-width-medium) * -1)}[part=day][data-selected=true]{background:var(--lr-calendar-day-selected-bg,var(--lr-color-brand-quiet))}[part=day]:hover{background:var(--lr-calendar-day-hover-bg,var(--lr-color-brand-quiet))}[part=day]:active{background:var(--lr-calendar-day-active-bg,color-mix(in oklab, var(--lr-calendar-day-hover-bg,var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active)))}[part=day]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(var(--lr-focus-ring-offset) * -1)}[part=weekdays]{grid-template-columns:repeat(7,minmax(0,1fr));display:grid}[part=weekday]{padding:var(--lr-space-xs);color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-sm);text-align:center}[part=grid]{border-block-start:var(--lr-border-width-thin) solid var(--lr-color-border);border-inline-start:var(--lr-border-width-thin) solid var(--lr-color-border);grid-template-columns:repeat(7,minmax(0,1fr));display:grid}[part=week]{display:contents}[part=day]{min-block-size:var(--lr-calendar-day-min-block-size,var(--lr-size-6rem));padding:var(--lr-space-xs);text-align:start;border-block-start:0;border-inline-start:0;flex-direction:column;align-items:stretch;display:flex}[part=date]{font-weight:var(--lr-font-weight-semibold)}[part=event]{box-sizing:border-box;inline-size:100%;min-inline-size:var(--lr-size-1-5rem);min-block-size:var(--lr-size-1-5rem);padding:var(--lr-space-2xs);border-radius:var(--lr-radius);background:var(--lr-color-brand);color:var(--lr-color-on-brand);font:inherit;font-size:var(--lr-font-size-sm);text-align:start;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;border:0;margin-block-start:var(--lr-space-2xs);overflow:hidden}[part=event]:hover{background-image:linear-gradient(color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-hover)), color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-hover)))}[part=event]:active{background-image:linear-gradient(color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active)), color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active)))}[part=event]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(var(--lr-focus-ring-offset) * -1)}[part=agenda]{gap:var(--lr-space-s);display:grid}[part=agenda-event]{padding:var(--lr-space-s);border:0;border-inline-start:var(--lr-border-width-medium) solid var(--lr-color-brand);background:var(--_lr-calendar-agenda-event-background,var(--lr-color-surface));color:var(--_lr-calendar-agenda-event-foreground,var(--lr-color-text));font:inherit;text-align:start;cursor:pointer}[part=agenda-event]:hover{background:var(--lr-calendar-agenda-event-hover-bg,var(--lr-color-brand-quiet))}[part=agenda-event]:active{background:var(--lr-calendar-agenda-event-active-bg,color-mix(in oklab, var(--lr-calendar-agenda-event-hover-bg,var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active)))}@container (inline-size<=28rem){[part=day]{min-block-size:var(--lr-calendar-day-min-block-size-narrow,var(--lr-size-4rem))}[part=event]{font-size:var(--lr-font-size-xs)}}:host(:dir(rtl)) [part=nav-glyph]{transform:scaleX(-1)}@media (forced-colors:active){[part=day][data-selected=true]{outline:var(--lr-border-width-medium) solid Highlight;outline-offset:calc(var(--lr-border-width-medium) * -1)}[part=day][data-today=true]{border-style:double}[part=day]:hover,button[part~=nav]:hover,[part=agenda-event]:hover{outline:var(--lr-border-width-thin) dashed Highlight;outline-offset:calc(var(--lr-border-width-thin) * -1)}[part=event]{forced-color-adjust:none;border:var(--lr-border-width-thin) solid ButtonText;color:buttontext;background:buttonface!important}}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{contain-intrinsic-inline-size:var(--lr-size-20rem);min-inline-size:0;display:block;container-type:inline-size}[part~=header]{justify-content:space-between;align-items:center;gap:var(--lr-space-s);margin-block-end:var(--lr-space-s);display:flex}[part=title]{font-weight:var(--lr-font-weight-semibold)}[part~=nav]{justify-content:center;align-items:center;gap:var(--lr-space-xs);min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);display:flex}button[part~=nav],[part=day]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);border:var(--lr-border-width-thin) solid var(--lr-color-border);background:var(--lr-color-surface);color:var(--lr-color-text);cursor:pointer;font:inherit}button[part~=nav]{padding-inline:var(--lr-space-s);border-radius:var(--lr-radius)}[part=nav-glyph]{font-size:var(--lr-size-1em)}button[part~=nav]:hover{background:var(--lr-calendar-nav-hover-bg,var(--lr-color-brand-quiet))}button[part~=nav]:active{background:var(--lr-calendar-nav-active-bg,color-mix(in oklab, var(--lr-calendar-nav-hover-bg,var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active)))}button[part~=nav]:focus-visible,[part=agenda-event]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(var(--lr-focus-ring-offset) * -1)}[part=day][data-outside=true]{color:var(--lr-calendar-day-outside-color,var(--lr-color-text-quiet));background:var(--lr-calendar-day-outside-bg,var(--lr-color-surface))}[part=day][data-today=true]{outline:var(--lr-border-width-medium) solid var(--lr-calendar-day-today-outline-color,var(--lr-color-brand));outline-offset:calc(var(--lr-border-width-medium) * -1)}[part=day][data-selected=true]{background:var(--lr-calendar-day-selected-bg,var(--lr-color-brand-quiet))}[part=day]:hover{background:var(--lr-calendar-day-hover-bg,var(--lr-color-brand-quiet))}[part=day]:active{background:var(--lr-calendar-day-active-bg,color-mix(in oklab, var(--lr-calendar-day-hover-bg,var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active)))}[part=day]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(var(--lr-focus-ring-offset) * -1)}[part=weekdays]{grid-template-columns:repeat(7,minmax(0,1fr));display:grid}[part=weekday]{padding:var(--lr-space-xs);color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-sm);text-align:center}[part=grid]{border-block-start:var(--lr-border-width-thin) solid var(--lr-color-border);border-inline-start:var(--lr-border-width-thin) solid var(--lr-color-border);grid-template-columns:repeat(7,minmax(0,1fr));display:grid}[part=week]{display:contents}[part=day]{min-block-size:var(--lr-calendar-day-min-block-size,var(--lr-size-6rem));padding:var(--lr-space-xs);text-align:start;border-block-start:0;border-inline-start:0;flex-direction:column;align-items:stretch;display:flex}[part=date]{font-weight:var(--lr-font-weight-semibold)}[part=event]{box-sizing:border-box;inline-size:100%;min-inline-size:var(--lr-size-1-5rem);min-block-size:var(--lr-size-1-5rem);padding:var(--lr-space-2xs);border-radius:var(--lr-radius);background:var(--lr-color-brand);color:var(--lr-color-on-brand);font:inherit;font-size:var(--lr-font-size-sm);text-align:start;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;border:0;margin-block-start:var(--lr-space-2xs);overflow:hidden}[part=agenda-event]:hover{background:var(--lr-calendar-agenda-event-hover-bg,var(--_lr-calendar-agenda-event-background,var(--lr-color-brand-quiet)))}[part=agenda-event]:active{background:var(--lr-calendar-agenda-event-active-bg,var(--_lr-calendar-agenda-event-background,color-mix(in oklab, var(--lr-calendar-agenda-event-hover-bg,var(--lr-color-brand-quiet)), var(--lr-color-mix-partner) var(--lr-color-mix-active))))}[part=event]:hover,[part=agenda-event]:hover{background-image:linear-gradient(color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-hover)), color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-hover)))}[part=event]:active,[part=agenda-event]:active{background-image:linear-gradient(color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active)), color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active)))}[part=event]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(var(--lr-focus-ring-offset) * -1)}[part=agenda]{gap:var(--lr-space-s);display:grid}[part=agenda-event]{padding:var(--lr-space-s);border:0;border-inline-start:var(--lr-border-width-medium) solid var(--lr-color-brand);background:var(--_lr-calendar-agenda-event-background,var(--lr-color-surface));color:var(--_lr-calendar-agenda-event-foreground,var(--lr-color-text));font:inherit;text-align:start;cursor:pointer}@container (inline-size<=28rem){[part=day]{min-block-size:var(--lr-calendar-day-min-block-size-narrow,var(--lr-size-4rem))}[part=event]{font-size:var(--lr-font-size-xs)}}:host(:dir(rtl)) [part=nav-glyph]{transform:scaleX(-1)}@media (forced-colors:active){[part=day][data-selected=true]{outline:var(--lr-border-width-medium) solid Highlight;outline-offset:calc(var(--lr-border-width-medium) * -1)}[part=day][data-today=true]{border-style:double}[part=day]:hover,button[part~=nav]:hover,[part=agenda-event]:hover{outline:var(--lr-border-width-thin) dashed Highlight;outline-offset:calc(var(--lr-border-width-thin) * -1)}[part=event]{forced-color-adjust:none;border:var(--lr-border-width-thin) solid ButtonText;color:buttontext;background:buttonface!important}}`;export{styles};
@@ -94,6 +94,8 @@ export interface ConditionBuilderValidationIssue{readonly conditionId:string;rea
94
94
  * `<lr-combobox>` (`enum`, `in`/`notIn`). Date fields forward bounded `min`/`max` strings to
95
95
  * `<lr-date-input>`; number fields forward finite `min`/`max` and positive finite `step` values to
96
96
  * `<lr-input>`. A unary operator (`isEmpty`/`isNotEmpty`) renders no value control.
97
+ * Field/operator selections emit one complete-model `lr-input`; their native value events,
98
+ * prefixed value aliases and listbox lifecycle events stay within the picker.
97
99
  * `<lr-icon-button icon="trash">` removes a row; `<lr-button>` appends one.
98
100
  *
99
101
  * This is a composite query-definition control, not a single submittable form field — it
@@ -150,7 +152,7 @@ private defaultValueFor;private commit;
150
152
  * exists. The operator remains empty until the user chooses the intended comparison. */
151
153
  addCondition():void;private conditionElement;
152
154
  /** Removes the condition row with the given `id`, if present. */
153
- removeCondition(id:string):void;private setCombinator;private setConditionField;private setConditionOperator;private setConditionValue;private consumeChildEvent;protected updated(changed:PropertyValues):void;private renderCombinator;private renderValueControl;private renderCondition;render():TemplateResult;
155
+ removeCondition(id:string):void;private setCombinator;private setConditionField;private setConditionOperator;private setConditionValue;private consumeChildEvent;private containSelectEvent;protected updated(changed:PropertyValues):void;private renderCombinator;private renderValueControl;private renderCondition;render():TemplateResult;
154
156
  /** `localize()` interpolates with a bare `String(value)`, so a number handed to it renders in
155
157
  * ASCII digits no matter the locale -- mixing two numbering systems inside one translated
156
158
  * sentence. Route every user-facing number through the effective locale instead. */
@@ -1,4 +1,4 @@
1
- import{html,nothing}from"lit";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{hostAriaLabel,nextId}from"../../../internal/a11y.js";import{styles}from"./condition-builder.styles.js";import{activeElementIn}from"../../../internal/active-element.js";import{finiteNumber}from"../../../internal/numbers.js";import{LYRA_DEFAULT_queryBuilderAddCondition,LYRA_DEFAULT_queryBuilderBooleanFalse,LYRA_DEFAULT_queryBuilderBooleanTrue,LYRA_DEFAULT_queryBuilderCombinatorAnd,LYRA_DEFAULT_queryBuilderCombinatorLabel,LYRA_DEFAULT_queryBuilderCombinatorOr,LYRA_DEFAULT_queryBuilderEmpty,LYRA_DEFAULT_queryBuilderFieldLabel,LYRA_DEFAULT_queryBuilderFieldPlaceholder,LYRA_DEFAULT_queryBuilderLabel,LYRA_DEFAULT_queryBuilderNoFields,LYRA_DEFAULT_queryBuilderOperatorAfter,LYRA_DEFAULT_queryBuilderOperatorBefore,LYRA_DEFAULT_queryBuilderOperatorContains,LYRA_DEFAULT_queryBuilderOperatorEndsWith,LYRA_DEFAULT_queryBuilderOperatorEquals,LYRA_DEFAULT_queryBuilderOperatorGreaterThan,LYRA_DEFAULT_queryBuilderOperatorGreaterThanOrEqual,LYRA_DEFAULT_queryBuilderOperatorIn,LYRA_DEFAULT_queryBuilderOperatorIsEmpty,LYRA_DEFAULT_queryBuilderOperatorIsNotEmpty,LYRA_DEFAULT_queryBuilderOperatorLabel,LYRA_DEFAULT_queryBuilderOperatorLessThan,LYRA_DEFAULT_queryBuilderOperatorLessThanOrEqual,LYRA_DEFAULT_queryBuilderOperatorNotEquals,LYRA_DEFAULT_queryBuilderOperatorNotIn,LYRA_DEFAULT_queryBuilderOperatorOnOrAfter,LYRA_DEFAULT_queryBuilderOperatorOnOrBefore,LYRA_DEFAULT_queryBuilderOperatorPlaceholder,LYRA_DEFAULT_queryBuilderOperatorStartsWith,LYRA_DEFAULT_queryBuilderRemoveCondition,LYRA_DEFAULT_queryBuilderValueLabel,LYRA_DEFAULT_queryBuilderValuePlaceholder}from"../../../internal/default-strings.generated.js";function selectValue(el){return Array.isArray(el.value)?el.value[0]??"":el.value}const MAX_FIELDS=200,MAX_CONDITIONS=200,MAX_OPTIONS=500,MAX_TEXT=256,EMPTY_FIELDS=Object.freeze([]),EMPTY_OPTIONS=Object.freeze([]),EMPTY_VALUE=Object.freeze({combinator:"and",conditions:Object.freeze([])}),STRING_OPERATORS=["eq","neq","contains","startsWith","endsWith","isEmpty","isNotEmpty"],NUMBER_OPERATORS=["eq","neq","gt","gte","lt","lte","isEmpty","isNotEmpty"],BOOLEAN_OPERATORS=["eq","neq"],DATE_OPERATORS=["eq","neq","gt","gte","lt","lte","isEmpty","isNotEmpty"],ENUM_OPERATORS=["eq","neq","in","notIn","isEmpty","isNotEmpty"];function defaultOperatorsForType(type){switch(type){case"string":return STRING_OPERATORS;case"number":return NUMBER_OPERATORS;case"boolean":return BOOLEAN_OPERATORS;case"date":return DATE_OPERATORS;case"enum":return ENUM_OPERATORS}}function isUnaryOperator(op){return op==="isEmpty"||op==="isNotEmpty"}function isMultiOperator(op){return op==="in"||op==="notIn"}const FIELD_TYPES=new Set(["string","number","boolean","date","enum"]),OPERATORS=new Set(["eq","neq","gt","gte","lt","lte","contains","startsWith","endsWith","in","notIn","isEmpty","isNotEmpty"]);function ownValue(record,key){try{const descriptor=Object.getOwnPropertyDescriptor(record,key);return descriptor&&"value"in descriptor?descriptor.value:void 0}catch{return}}function boundedString(value){return typeof value=="string"?value.slice(0,MAX_TEXT):""}function optionalFiniteNumber(value,positive=!1){if(typeof value!="number"||!Number.isFinite(value))return;const normalized=finiteNumber(value,0);return!positive||normalized>0?normalized:void 0}function normalizeOptions(value){if(!Array.isArray(value))return EMPTY_OPTIONS;const seen=new Set,result=[];for(const candidate of value.slice(0,MAX_OPTIONS)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const optionValue=boundedString(ownValue(candidate,"value"));if(optionValue.trim().length===0||seen.has(optionValue))continue;seen.add(optionValue);const label=boundedString(ownValue(candidate,"label"));result.push(Object.freeze({value:optionValue,...label?{label}:{}}))}return Object.freeze(result)}function normalizeOperators(value){if(!Array.isArray(value))return;const result=[...new Set(value.slice(0,MAX_OPTIONS).filter(entry=>OPERATORS.has(entry)))];return result.length>0?Object.freeze(result):void 0}function normalizeFields(value){if(!Array.isArray(value))return EMPTY_FIELDS;const names=new Set,result=[];for(const candidate of value.slice(0,MAX_FIELDS)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const name=boundedString(ownValue(candidate,"name")),type=ownValue(candidate,"type");if(name.trim().length===0||names.has(name)||!FIELD_TYPES.has(type))continue;names.add(name);const label=boundedString(ownValue(candidate,"label")),placeholder=boundedString(ownValue(candidate,"placeholder")),options=normalizeOptions(ownValue(candidate,"options")),operators=normalizeOperators(ownValue(candidate,"operators")),min=type==="number"?optionalFiniteNumber(ownValue(candidate,"min")):type==="date"&&boundedString(ownValue(candidate,"min"))||void 0,max=type==="number"?optionalFiniteNumber(ownValue(candidate,"max")):type==="date"&&boundedString(ownValue(candidate,"max"))||void 0,step=type==="number"?optionalFiniteNumber(ownValue(candidate,"step"),!0):void 0;result.push(Object.freeze({name,type,...label?{label}:{},...placeholder?{placeholder}:{},...options.length>0?{options}:{},...operators?{operators}:{},...min!==void 0?{min}:{},...max!==void 0?{max}:{},...step!==void 0?{step}:{}}))}return Object.freeze(result)}function normalizeConditionValue(value){if(typeof value=="string"||typeof value=="boolean"||typeof value=="number")return value;if(Array.isArray(value))return Object.freeze(value.slice(0,MAX_OPTIONS).filter(entry=>typeof entry=="string").map(entry=>boundedString(entry)))}function normalizeConditionBuilderValue(value){const record=value!==null&&typeof value=="object"&&!Array.isArray(value)?value:EMPTY_VALUE,combinator=ownValue(record,"combinator")==="or"?"or":"and",source=ownValue(record,"conditions"),conditions=[],ids=new Set;if(Array.isArray(source))for(const candidate of source.slice(0,MAX_CONDITIONS)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const id=boundedString(ownValue(candidate,"id"));if(id.trim().length===0||ids.has(id))continue;ids.add(id);const field=boundedString(ownValue(candidate,"field")),rawOperator=ownValue(candidate,"operator"),operator=rawOperator===""||OPERATORS.has(rawOperator)?rawOperator:"",normalizedValue=normalizeConditionValue(ownValue(candidate,"value"));conditions.push(Object.freeze({id,field,operator,...normalizedValue!==void 0?{value:normalizedValue}:{}}))}return Object.freeze({combinator,conditions:Object.freeze(conditions)})}class LyraConditionBuilder extends LyraElement{constructor(){super(...arguments),this._fields=EMPTY_FIELDS,this._value=EMPTY_VALUE,this._disabled=!1,this.pendingFocusAdd=!1}static{this.defaultStrings={...super.defaultStrings,queryBuilderAddCondition:LYRA_DEFAULT_queryBuilderAddCondition,queryBuilderBooleanFalse:LYRA_DEFAULT_queryBuilderBooleanFalse,queryBuilderBooleanTrue:LYRA_DEFAULT_queryBuilderBooleanTrue,queryBuilderCombinatorAnd:LYRA_DEFAULT_queryBuilderCombinatorAnd,queryBuilderCombinatorLabel:LYRA_DEFAULT_queryBuilderCombinatorLabel,queryBuilderCombinatorOr:LYRA_DEFAULT_queryBuilderCombinatorOr,queryBuilderEmpty:LYRA_DEFAULT_queryBuilderEmpty,queryBuilderFieldLabel:LYRA_DEFAULT_queryBuilderFieldLabel,queryBuilderFieldPlaceholder:LYRA_DEFAULT_queryBuilderFieldPlaceholder,queryBuilderLabel:LYRA_DEFAULT_queryBuilderLabel,queryBuilderNoFields:LYRA_DEFAULT_queryBuilderNoFields,queryBuilderOperatorAfter:LYRA_DEFAULT_queryBuilderOperatorAfter,queryBuilderOperatorBefore:LYRA_DEFAULT_queryBuilderOperatorBefore,queryBuilderOperatorContains:LYRA_DEFAULT_queryBuilderOperatorContains,queryBuilderOperatorEndsWith:LYRA_DEFAULT_queryBuilderOperatorEndsWith,queryBuilderOperatorEquals:LYRA_DEFAULT_queryBuilderOperatorEquals,queryBuilderOperatorGreaterThan:LYRA_DEFAULT_queryBuilderOperatorGreaterThan,queryBuilderOperatorGreaterThanOrEqual:LYRA_DEFAULT_queryBuilderOperatorGreaterThanOrEqual,queryBuilderOperatorIn:LYRA_DEFAULT_queryBuilderOperatorIn,queryBuilderOperatorIsEmpty:LYRA_DEFAULT_queryBuilderOperatorIsEmpty,queryBuilderOperatorIsNotEmpty:LYRA_DEFAULT_queryBuilderOperatorIsNotEmpty,queryBuilderOperatorLabel:LYRA_DEFAULT_queryBuilderOperatorLabel,queryBuilderOperatorLessThan:LYRA_DEFAULT_queryBuilderOperatorLessThan,queryBuilderOperatorLessThanOrEqual:LYRA_DEFAULT_queryBuilderOperatorLessThanOrEqual,queryBuilderOperatorNotEquals:LYRA_DEFAULT_queryBuilderOperatorNotEquals,queryBuilderOperatorNotIn:LYRA_DEFAULT_queryBuilderOperatorNotIn,queryBuilderOperatorOnOrAfter:LYRA_DEFAULT_queryBuilderOperatorOnOrAfter,queryBuilderOperatorOnOrBefore:LYRA_DEFAULT_queryBuilderOperatorOnOrBefore,queryBuilderOperatorPlaceholder:LYRA_DEFAULT_queryBuilderOperatorPlaceholder,queryBuilderOperatorStartsWith:LYRA_DEFAULT_queryBuilderOperatorStartsWith,queryBuilderRemoveCondition:LYRA_DEFAULT_queryBuilderRemoveCondition,queryBuilderValueLabel:LYRA_DEFAULT_queryBuilderValueLabel,queryBuilderValuePlaceholder:LYRA_DEFAULT_queryBuilderValuePlaceholder}}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-input","lr-add-condition"])}static{this.properties={fields:{attribute:!1,noAccessor:!0},value:{attribute:!1,noAccessor:!0},disabled:{type:Boolean,reflect:!0,noAccessor:!0}}}get fields(){return this._fields}set fields(next){const old=this._fields;this._fields=normalizeFields(next),this.requestUpdate("fields",old)}get value(){return this._value}set value(next){const old=this._value;this._value=normalizeConditionBuilderValue(next),this.requestUpdate("value",old)}get disabled(){return this._disabled}set disabled(next){const old=this._disabled;this._disabled=!!next,this.toggleAttribute("disabled",this._disabled),this.requestUpdate("disabled",old)}operatorsFor(field){return field?field.operators&&field.operators.length>0?field.operators:defaultOperatorsForType(field.type):[]}validationIssueFor(condition){if(condition.field===""&&condition.operator===""&&condition.value===void 0)return;const field=this._fields.find(candidate=>candidate.name===condition.field);if(!field)return"field-unavailable";if(condition.operator==="")return condition.value===void 0?void 0:"operator-arity";if(!this.operatorsFor(field).includes(condition.operator))return"operator-not-allowed";if(isUnaryOperator(condition.operator))return condition.value===void 0?void 0:"operator-arity";if(isMultiOperator(condition.operator))return Array.isArray(condition.value)?void 0:"operator-arity";if(Array.isArray(condition.value))return"operator-arity";if(condition.value!==void 0)switch(field.type){case"number":return typeof condition.value=="number"&&Number.isFinite(condition.value)?void 0:"value-type";case"boolean":return typeof condition.value=="boolean"?void 0:"value-type";case"string":case"date":case"enum":return typeof condition.value=="string"?void 0:"value-type"}}get validationIssues(){const issues=[];for(const condition of this._value.conditions){const code=this.validationIssueFor(condition);code&&issues.push(Object.freeze({conditionId:condition.id,code}))}return Object.freeze(issues)}get invalidConditionIds(){return Object.freeze(this.validationIssues.map(issue=>issue.conditionId))}checkValidity(){return this.validationIssues.length===0}reportValidity(){const issue=this.validationIssues[0];if(!issue)return!0;const row=this.conditionElement(issue.conditionId),part=issue.code==="field-unavailable"?"field-select":issue.code==="operator-not-allowed"?"operator-select":"value";let target=row?.querySelector(`[part="${part}"]`)??null;return(!target||target.matches("span"))&&(target=row?.querySelector('[part="operator-select"]')??null),target?.focus(),!1}operatorLabel(op,type){switch(op){case"eq":return this.localize("queryBuilderOperatorEquals");case"neq":return this.localize("queryBuilderOperatorNotEquals");case"gt":return type==="date"?this.localize("queryBuilderOperatorAfter"):this.localize("queryBuilderOperatorGreaterThan");case"gte":return type==="date"?this.localize("queryBuilderOperatorOnOrAfter"):this.localize("queryBuilderOperatorGreaterThanOrEqual");case"lt":return type==="date"?this.localize("queryBuilderOperatorBefore"):this.localize("queryBuilderOperatorLessThan");case"lte":return type==="date"?this.localize("queryBuilderOperatorOnOrBefore"):this.localize("queryBuilderOperatorLessThanOrEqual");case"contains":return this.localize("queryBuilderOperatorContains");case"startsWith":return this.localize("queryBuilderOperatorStartsWith");case"endsWith":return this.localize("queryBuilderOperatorEndsWith");case"in":return this.localize("queryBuilderOperatorIn");case"notIn":return this.localize("queryBuilderOperatorNotIn");case"isEmpty":return this.localize("queryBuilderOperatorIsEmpty");case"isNotEmpty":return this.localize("queryBuilderOperatorIsNotEmpty")}}defaultValueFor(fieldName,operator){if(operator===""||isUnaryOperator(operator))return;if(isMultiOperator(operator))return[];const field=this._fields.find(f=>f.name===fieldName);if(!(field?.type==="number"||field?.type==="boolean"))return""}commit(next){this.value=next,this.emit("lr-input",Object.freeze({value:this._value}))}addCondition(){const firstField=this._fields[0];if(this.disabled||!firstField||this._value.conditions.length>=MAX_CONDITIONS)return;const condition=Object.freeze({id:nextId("query-condition"),field:firstField.name,operator:""});this.commit({...this._value,conditions:[...this._value.conditions,condition]}),this.emit("lr-add-condition",Object.freeze({condition}))}conditionElement(id){const root=this.shadowRoot;if(!root)return null;const ownerCss=this.ownerDocument.defaultView?.CSS;if(typeof ownerCss?.escape=="function")try{const candidate=root.querySelector(`[part="condition"][data-id="${ownerCss.escape(id)}"]`);if(candidate?.getAttribute("data-id")===id)return candidate}catch{}return Array.from(root.querySelectorAll('[part="condition"][data-id]')).find(candidate=>candidate.getAttribute("data-id")===id)??null}removeCondition(id){if(this.disabled||!this._value.conditions.some(c=>c.id===id))return;const row=this.conditionElement(id),active=activeElementIn(this.shadowRoot);row&&active&&row.contains(active)&&(this.pendingFocusAdd=!0);const conditions=this._value.conditions.filter(c=>c.id!==id);this.commit({...this._value,conditions}),this.emit("lr-remove-condition",Object.freeze({conditionId:id}))}setCombinator(combinator){this.disabled||combinator===this._value.combinator||this.commit({...this._value,combinator})}setConditionField(id,field){if(this.disabled)return;const conditions=this._value.conditions.map(c=>c.id===id?{id:c.id,field,operator:"",value:void 0}:c);this.commit({...this._value,conditions})}setConditionOperator(id,operator){if(this.disabled)return;const conditions=this._value.conditions.map(c=>c.id===id?{...c,operator,value:this.defaultValueFor(c.field,operator)}:c);this.commit({...this._value,conditions})}setConditionValue(id,value){if(this.disabled)return;const conditions=this._value.conditions.map(c=>c.id===id?{...c,value}:c);this.commit({...this._value,conditions})}consumeChildEvent(event,action){event.stopPropagation(),action()}updated(changed){super.updated(changed),this.pendingFocusAdd&&(this.pendingFocusAdd=!1,this.renderRoot.querySelector('[part="add-button"]')?.focus())}renderCombinator(combinator){return html`
1
+ import{html,nothing}from"lit";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{hostAriaLabel,nextId}from"../../../internal/a11y.js";import{styles}from"./condition-builder.styles.js";import{activeElementIn}from"../../../internal/active-element.js";import{finiteNumber}from"../../../internal/numbers.js";import{LYRA_DEFAULT_queryBuilderAddCondition,LYRA_DEFAULT_queryBuilderBooleanFalse,LYRA_DEFAULT_queryBuilderBooleanTrue,LYRA_DEFAULT_queryBuilderCombinatorAnd,LYRA_DEFAULT_queryBuilderCombinatorLabel,LYRA_DEFAULT_queryBuilderCombinatorOr,LYRA_DEFAULT_queryBuilderEmpty,LYRA_DEFAULT_queryBuilderFieldLabel,LYRA_DEFAULT_queryBuilderFieldPlaceholder,LYRA_DEFAULT_queryBuilderLabel,LYRA_DEFAULT_queryBuilderNoFields,LYRA_DEFAULT_queryBuilderOperatorAfter,LYRA_DEFAULT_queryBuilderOperatorBefore,LYRA_DEFAULT_queryBuilderOperatorContains,LYRA_DEFAULT_queryBuilderOperatorEndsWith,LYRA_DEFAULT_queryBuilderOperatorEquals,LYRA_DEFAULT_queryBuilderOperatorGreaterThan,LYRA_DEFAULT_queryBuilderOperatorGreaterThanOrEqual,LYRA_DEFAULT_queryBuilderOperatorIn,LYRA_DEFAULT_queryBuilderOperatorIsEmpty,LYRA_DEFAULT_queryBuilderOperatorIsNotEmpty,LYRA_DEFAULT_queryBuilderOperatorLabel,LYRA_DEFAULT_queryBuilderOperatorLessThan,LYRA_DEFAULT_queryBuilderOperatorLessThanOrEqual,LYRA_DEFAULT_queryBuilderOperatorNotEquals,LYRA_DEFAULT_queryBuilderOperatorNotIn,LYRA_DEFAULT_queryBuilderOperatorOnOrAfter,LYRA_DEFAULT_queryBuilderOperatorOnOrBefore,LYRA_DEFAULT_queryBuilderOperatorPlaceholder,LYRA_DEFAULT_queryBuilderOperatorStartsWith,LYRA_DEFAULT_queryBuilderRemoveCondition,LYRA_DEFAULT_queryBuilderValueLabel,LYRA_DEFAULT_queryBuilderValuePlaceholder}from"../../../internal/default-strings.generated.js";function selectValue(el){return Array.isArray(el.value)?el.value[0]??"":el.value}const MAX_FIELDS=200,MAX_CONDITIONS=200,MAX_OPTIONS=500,MAX_TEXT=256,EMPTY_FIELDS=Object.freeze([]),EMPTY_OPTIONS=Object.freeze([]),EMPTY_VALUE=Object.freeze({combinator:"and",conditions:Object.freeze([])}),STRING_OPERATORS=["eq","neq","contains","startsWith","endsWith","isEmpty","isNotEmpty"],NUMBER_OPERATORS=["eq","neq","gt","gte","lt","lte","isEmpty","isNotEmpty"],BOOLEAN_OPERATORS=["eq","neq"],DATE_OPERATORS=["eq","neq","gt","gte","lt","lte","isEmpty","isNotEmpty"],ENUM_OPERATORS=["eq","neq","in","notIn","isEmpty","isNotEmpty"];function defaultOperatorsForType(type){switch(type){case"string":return STRING_OPERATORS;case"number":return NUMBER_OPERATORS;case"boolean":return BOOLEAN_OPERATORS;case"date":return DATE_OPERATORS;case"enum":return ENUM_OPERATORS}}function isUnaryOperator(op){return op==="isEmpty"||op==="isNotEmpty"}function isMultiOperator(op){return op==="in"||op==="notIn"}const FIELD_TYPES=new Set(["string","number","boolean","date","enum"]),OPERATORS=new Set(["eq","neq","gt","gte","lt","lte","contains","startsWith","endsWith","in","notIn","isEmpty","isNotEmpty"]);function ownValue(record,key){try{const descriptor=Object.getOwnPropertyDescriptor(record,key);return descriptor&&"value"in descriptor?descriptor.value:void 0}catch{return}}function boundedString(value){return typeof value=="string"?value.slice(0,MAX_TEXT):""}function optionalFiniteNumber(value,positive=!1){if(typeof value!="number"||!Number.isFinite(value))return;const normalized=finiteNumber(value,0);return!positive||normalized>0?normalized:void 0}function normalizeOptions(value){if(!Array.isArray(value))return EMPTY_OPTIONS;const seen=new Set,result=[];for(const candidate of value.slice(0,MAX_OPTIONS)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const optionValue=boundedString(ownValue(candidate,"value"));if(optionValue.trim().length===0||seen.has(optionValue))continue;seen.add(optionValue);const label=boundedString(ownValue(candidate,"label"));result.push(Object.freeze({value:optionValue,...label?{label}:{}}))}return Object.freeze(result)}function normalizeOperators(value){if(!Array.isArray(value))return;const result=[...new Set(value.slice(0,MAX_OPTIONS).filter(entry=>OPERATORS.has(entry)))];return result.length>0?Object.freeze(result):void 0}function normalizeFields(value){if(!Array.isArray(value))return EMPTY_FIELDS;const names=new Set,result=[];for(const candidate of value.slice(0,MAX_FIELDS)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const name=boundedString(ownValue(candidate,"name")),type=ownValue(candidate,"type");if(name.trim().length===0||names.has(name)||!FIELD_TYPES.has(type))continue;names.add(name);const label=boundedString(ownValue(candidate,"label")),placeholder=boundedString(ownValue(candidate,"placeholder")),options=normalizeOptions(ownValue(candidate,"options")),operators=normalizeOperators(ownValue(candidate,"operators")),min=type==="number"?optionalFiniteNumber(ownValue(candidate,"min")):type==="date"&&boundedString(ownValue(candidate,"min"))||void 0,max=type==="number"?optionalFiniteNumber(ownValue(candidate,"max")):type==="date"&&boundedString(ownValue(candidate,"max"))||void 0,step=type==="number"?optionalFiniteNumber(ownValue(candidate,"step"),!0):void 0;result.push(Object.freeze({name,type,...label?{label}:{},...placeholder?{placeholder}:{},...options.length>0?{options}:{},...operators?{operators}:{},...min!==void 0?{min}:{},...max!==void 0?{max}:{},...step!==void 0?{step}:{}}))}return Object.freeze(result)}function normalizeConditionValue(value){if(typeof value=="string"||typeof value=="boolean"||typeof value=="number")return value;if(Array.isArray(value))return Object.freeze(value.slice(0,MAX_OPTIONS).filter(entry=>typeof entry=="string").map(entry=>boundedString(entry)))}function normalizeConditionBuilderValue(value){const record=value!==null&&typeof value=="object"&&!Array.isArray(value)?value:EMPTY_VALUE,combinator=ownValue(record,"combinator")==="or"?"or":"and",source=ownValue(record,"conditions"),conditions=[],ids=new Set;if(Array.isArray(source))for(const candidate of source.slice(0,MAX_CONDITIONS)){if(candidate===null||typeof candidate!="object"||Array.isArray(candidate))continue;const id=boundedString(ownValue(candidate,"id"));if(id.trim().length===0||ids.has(id))continue;ids.add(id);const field=boundedString(ownValue(candidate,"field")),rawOperator=ownValue(candidate,"operator"),operator=rawOperator===""||OPERATORS.has(rawOperator)?rawOperator:"",normalizedValue=normalizeConditionValue(ownValue(candidate,"value"));conditions.push(Object.freeze({id,field,operator,...normalizedValue!==void 0?{value:normalizedValue}:{}}))}return Object.freeze({combinator,conditions:Object.freeze(conditions)})}class LyraConditionBuilder extends LyraElement{constructor(){super(...arguments),this._fields=EMPTY_FIELDS,this._value=EMPTY_VALUE,this._disabled=!1,this.pendingFocusAdd=!1}static{this.defaultStrings={...super.defaultStrings,queryBuilderAddCondition:LYRA_DEFAULT_queryBuilderAddCondition,queryBuilderBooleanFalse:LYRA_DEFAULT_queryBuilderBooleanFalse,queryBuilderBooleanTrue:LYRA_DEFAULT_queryBuilderBooleanTrue,queryBuilderCombinatorAnd:LYRA_DEFAULT_queryBuilderCombinatorAnd,queryBuilderCombinatorLabel:LYRA_DEFAULT_queryBuilderCombinatorLabel,queryBuilderCombinatorOr:LYRA_DEFAULT_queryBuilderCombinatorOr,queryBuilderEmpty:LYRA_DEFAULT_queryBuilderEmpty,queryBuilderFieldLabel:LYRA_DEFAULT_queryBuilderFieldLabel,queryBuilderFieldPlaceholder:LYRA_DEFAULT_queryBuilderFieldPlaceholder,queryBuilderLabel:LYRA_DEFAULT_queryBuilderLabel,queryBuilderNoFields:LYRA_DEFAULT_queryBuilderNoFields,queryBuilderOperatorAfter:LYRA_DEFAULT_queryBuilderOperatorAfter,queryBuilderOperatorBefore:LYRA_DEFAULT_queryBuilderOperatorBefore,queryBuilderOperatorContains:LYRA_DEFAULT_queryBuilderOperatorContains,queryBuilderOperatorEndsWith:LYRA_DEFAULT_queryBuilderOperatorEndsWith,queryBuilderOperatorEquals:LYRA_DEFAULT_queryBuilderOperatorEquals,queryBuilderOperatorGreaterThan:LYRA_DEFAULT_queryBuilderOperatorGreaterThan,queryBuilderOperatorGreaterThanOrEqual:LYRA_DEFAULT_queryBuilderOperatorGreaterThanOrEqual,queryBuilderOperatorIn:LYRA_DEFAULT_queryBuilderOperatorIn,queryBuilderOperatorIsEmpty:LYRA_DEFAULT_queryBuilderOperatorIsEmpty,queryBuilderOperatorIsNotEmpty:LYRA_DEFAULT_queryBuilderOperatorIsNotEmpty,queryBuilderOperatorLabel:LYRA_DEFAULT_queryBuilderOperatorLabel,queryBuilderOperatorLessThan:LYRA_DEFAULT_queryBuilderOperatorLessThan,queryBuilderOperatorLessThanOrEqual:LYRA_DEFAULT_queryBuilderOperatorLessThanOrEqual,queryBuilderOperatorNotEquals:LYRA_DEFAULT_queryBuilderOperatorNotEquals,queryBuilderOperatorNotIn:LYRA_DEFAULT_queryBuilderOperatorNotIn,queryBuilderOperatorOnOrAfter:LYRA_DEFAULT_queryBuilderOperatorOnOrAfter,queryBuilderOperatorOnOrBefore:LYRA_DEFAULT_queryBuilderOperatorOnOrBefore,queryBuilderOperatorPlaceholder:LYRA_DEFAULT_queryBuilderOperatorPlaceholder,queryBuilderOperatorStartsWith:LYRA_DEFAULT_queryBuilderOperatorStartsWith,queryBuilderRemoveCondition:LYRA_DEFAULT_queryBuilderRemoveCondition,queryBuilderValueLabel:LYRA_DEFAULT_queryBuilderValueLabel,queryBuilderValuePlaceholder:LYRA_DEFAULT_queryBuilderValuePlaceholder}}static{this.styles=[LyraElement.styles,styles]}static{this.immutableEventDetails=Object.freeze(["lr-input","lr-add-condition"])}static{this.properties={fields:{attribute:!1,noAccessor:!0},value:{attribute:!1,noAccessor:!0},disabled:{type:Boolean,reflect:!0,noAccessor:!0}}}get fields(){return this._fields}set fields(next){const old=this._fields;this._fields=normalizeFields(next),this.requestUpdate("fields",old)}get value(){return this._value}set value(next){const old=this._value;this._value=normalizeConditionBuilderValue(next),this.requestUpdate("value",old)}get disabled(){return this._disabled}set disabled(next){const old=this._disabled;this._disabled=!!next,this.toggleAttribute("disabled",this._disabled),this.requestUpdate("disabled",old)}operatorsFor(field){return field?field.operators&&field.operators.length>0?field.operators:defaultOperatorsForType(field.type):[]}validationIssueFor(condition){if(condition.field===""&&condition.operator===""&&condition.value===void 0)return;const field=this._fields.find(candidate=>candidate.name===condition.field);if(!field)return"field-unavailable";if(condition.operator==="")return condition.value===void 0?void 0:"operator-arity";if(!this.operatorsFor(field).includes(condition.operator))return"operator-not-allowed";if(isUnaryOperator(condition.operator))return condition.value===void 0?void 0:"operator-arity";if(isMultiOperator(condition.operator))return Array.isArray(condition.value)?void 0:"operator-arity";if(Array.isArray(condition.value))return"operator-arity";if(condition.value!==void 0)switch(field.type){case"number":return typeof condition.value=="number"&&Number.isFinite(condition.value)?void 0:"value-type";case"boolean":return typeof condition.value=="boolean"?void 0:"value-type";case"string":case"date":case"enum":return typeof condition.value=="string"?void 0:"value-type"}}get validationIssues(){const issues=[];for(const condition of this._value.conditions){const code=this.validationIssueFor(condition);code&&issues.push(Object.freeze({conditionId:condition.id,code}))}return Object.freeze(issues)}get invalidConditionIds(){return Object.freeze(this.validationIssues.map(issue=>issue.conditionId))}checkValidity(){return this.validationIssues.length===0}reportValidity(){const issue=this.validationIssues[0];if(!issue)return!0;const row=this.conditionElement(issue.conditionId),part=issue.code==="field-unavailable"?"field-select":issue.code==="operator-not-allowed"?"operator-select":"value";let target=row?.querySelector(`[part="${part}"]`)??null;return(!target||target.matches("span"))&&(target=row?.querySelector('[part="operator-select"]')??null),target?.focus(),!1}operatorLabel(op,type){switch(op){case"eq":return this.localize("queryBuilderOperatorEquals");case"neq":return this.localize("queryBuilderOperatorNotEquals");case"gt":return type==="date"?this.localize("queryBuilderOperatorAfter"):this.localize("queryBuilderOperatorGreaterThan");case"gte":return type==="date"?this.localize("queryBuilderOperatorOnOrAfter"):this.localize("queryBuilderOperatorGreaterThanOrEqual");case"lt":return type==="date"?this.localize("queryBuilderOperatorBefore"):this.localize("queryBuilderOperatorLessThan");case"lte":return type==="date"?this.localize("queryBuilderOperatorOnOrBefore"):this.localize("queryBuilderOperatorLessThanOrEqual");case"contains":return this.localize("queryBuilderOperatorContains");case"startsWith":return this.localize("queryBuilderOperatorStartsWith");case"endsWith":return this.localize("queryBuilderOperatorEndsWith");case"in":return this.localize("queryBuilderOperatorIn");case"notIn":return this.localize("queryBuilderOperatorNotIn");case"isEmpty":return this.localize("queryBuilderOperatorIsEmpty");case"isNotEmpty":return this.localize("queryBuilderOperatorIsNotEmpty")}}defaultValueFor(fieldName,operator){if(operator===""||isUnaryOperator(operator))return;if(isMultiOperator(operator))return[];const field=this._fields.find(f=>f.name===fieldName);if(!(field?.type==="number"||field?.type==="boolean"))return""}commit(next){this.value=next,this.emit("lr-input",Object.freeze({value:this._value}))}addCondition(){const firstField=this._fields[0];if(this.disabled||!firstField||this._value.conditions.length>=MAX_CONDITIONS)return;const condition=Object.freeze({id:nextId("query-condition"),field:firstField.name,operator:""});this.commit({...this._value,conditions:[...this._value.conditions,condition]}),this.emit("lr-add-condition",Object.freeze({condition}))}conditionElement(id){const root=this.shadowRoot;if(!root)return null;const ownerCss=this.ownerDocument.defaultView?.CSS;if(typeof ownerCss?.escape=="function")try{const candidate=root.querySelector(`[part="condition"][data-id="${ownerCss.escape(id)}"]`);if(candidate?.getAttribute("data-id")===id)return candidate}catch{}return Array.from(root.querySelectorAll('[part="condition"][data-id]')).find(candidate=>candidate.getAttribute("data-id")===id)??null}removeCondition(id){if(this.disabled||!this._value.conditions.some(c=>c.id===id))return;const row=this.conditionElement(id),active=activeElementIn(this.shadowRoot);row&&active&&row.contains(active)&&(this.pendingFocusAdd=!0);const conditions=this._value.conditions.filter(c=>c.id!==id);this.commit({...this._value,conditions}),this.emit("lr-remove-condition",Object.freeze({conditionId:id}))}setCombinator(combinator){this.disabled||combinator===this._value.combinator||this.commit({...this._value,combinator})}setConditionField(id,field){if(this.disabled)return;const conditions=this._value.conditions.map(c=>c.id===id?{id:c.id,field,operator:"",value:void 0}:c);this.commit({...this._value,conditions})}setConditionOperator(id,operator){if(this.disabled)return;const conditions=this._value.conditions.map(c=>c.id===id?{...c,operator,value:this.defaultValueFor(c.field,operator)}:c);this.commit({...this._value,conditions})}setConditionValue(id,value){if(this.disabled)return;const conditions=this._value.conditions.map(c=>c.id===id?{...c,value}:c);this.commit({...this._value,conditions})}consumeChildEvent(event,action){event.stopPropagation(),action()}containSelectEvent(event){event.stopPropagation()}updated(changed){super.updated(changed),this.pendingFocusAdd&&(this.pendingFocusAdd=!1,this.renderRoot.querySelector('[part="add-button"]')?.focus())}renderCombinator(combinator){return html`
2
2
  <lr-select
3
3
  part="combinator"
4
4
  size="s"
@@ -97,6 +97,13 @@ import{html,nothing}from"lit";import{LyraElement}from"../../../internal/lyra-ele
97
97
  placeholder=${this.localize("queryBuilderFieldPlaceholder")}
98
98
  .value=${condition.field}
99
99
  ?disabled=${this.disabled}
100
+ @input=${this.containSelectEvent}
101
+ @lr-input=${this.containSelectEvent}
102
+ @lr-change=${this.containSelectEvent}
103
+ @lr-show=${this.containSelectEvent}
104
+ @lr-after-show=${this.containSelectEvent}
105
+ @lr-hide=${this.containSelectEvent}
106
+ @lr-after-hide=${this.containSelectEvent}
100
107
  @change=${event=>this.consumeChildEvent(event,()=>this.setConditionField(condition.id,selectValue(event.target)))}
101
108
  >
102
109
  ${this._fields.map(f=>html`<lr-option value=${f.name}>${f.label??f.name}</lr-option>`)}
@@ -109,6 +116,13 @@ import{html,nothing}from"lit";import{LyraElement}from"../../../internal/lyra-ele
109
116
  placeholder=${this.localize("queryBuilderOperatorPlaceholder")}
110
117
  .value=${condition.operator}
111
118
  ?disabled=${this.disabled||!field}
119
+ @input=${this.containSelectEvent}
120
+ @lr-input=${this.containSelectEvent}
121
+ @lr-change=${this.containSelectEvent}
122
+ @lr-show=${this.containSelectEvent}
123
+ @lr-after-show=${this.containSelectEvent}
124
+ @lr-hide=${this.containSelectEvent}
125
+ @lr-after-hide=${this.containSelectEvent}
112
126
  @change=${event=>this.consumeChildEvent(event,()=>this.setConditionOperator(condition.id,event.target.value))}
113
127
  >
114
128
  ${operators.map(op=>html`<lr-option value=${op}>${this.operatorLabel(op,field?.type)}</lr-option>`)}
@@ -1,4 +1,4 @@
1
- var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,svg,nothing}from"lit";import{property}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteNumber}from"../../../internal/numbers.js";import{resolveIntlLocale}from"../../../internal/intl-cache.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./context-meter.styles.js";import{LYRA_DEFAULT_contextMeterLabeledSummary,LYRA_DEFAULT_contextMeterSegmentLabel,LYRA_DEFAULT_contextMeterUsed,LYRA_DEFAULT_contextMeterUsedOfTotal}from"../../../internal/default-strings.generated.js";const RADIUS=40,CENTER=50,STROKE=12,CIRCUMFERENCE=2*Math.PI*RADIUS,MAX_CONTEXT_METER_SEGMENTS=1e4,EMPTY_CONTEXT_METER_SEGMENTS=Object.freeze([]);function projectContextMeterSegments(value){try{if(!Array.isArray(value))return EMPTY_CONTEXT_METER_SEGMENTS;const length=getOwnDataDescriptor(value,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return EMPTY_CONTEXT_METER_SEGMENTS;const segments=[];for(let index=0;index<Math.min(length.value,MAX_CONTEXT_METER_SEGMENTS);index+=1){const entry=getOwnDataDescriptor(value,String(index));if(entry===MISSING_OWN_DATA_DESCRIPTOR||entry===UNSAFE_OWN_DATA_DESCRIPTOR||entry.value===null||typeof entry.value!="object"||Array.isArray(entry.value))continue;const label=getOwnDataDescriptor(entry.value,"label"),segmentValue=getOwnDataDescriptor(entry.value,"value"),tone=getOwnDataDescriptor(entry.value,"tone"),color=getOwnDataDescriptor(entry.value,"color");if(label===MISSING_OWN_DATA_DESCRIPTOR||label===UNSAFE_OWN_DATA_DESCRIPTOR||segmentValue===MISSING_OWN_DATA_DESCRIPTOR||segmentValue===UNSAFE_OWN_DATA_DESCRIPTOR||tone===UNSAFE_OWN_DATA_DESCRIPTOR||color===UNSAFE_OWN_DATA_DESCRIPTOR||typeof label.value!="string"||typeof segmentValue.value!="number"||tone!==MISSING_OWN_DATA_DESCRIPTOR&&typeof tone.value!="string"||color!==MISSING_OWN_DATA_DESCRIPTOR&&typeof color.value!="string")continue;const toneValue=tone===MISSING_OWN_DATA_DESCRIPTOR?void 0:tone.value,colorValue=color===MISSING_OWN_DATA_DESCRIPTOR?void 0:color.value;segments.push(Object.freeze({label:label.value,value:segmentValue.value,...toneValue===void 0?{}:{tone:toneValue},...colorValue===void 0?{}:{color:colorValue}}))}return Object.freeze(segments)}catch{return EMPTY_CONTEXT_METER_SEGMENTS}}function formatCount(n,locale){return Math.round(finiteNumber(n,0)).toLocaleString(resolveIntlLocale(locale))}class LyraContextMeter extends LyraElement{constructor(){super(...arguments),this.segments=[],this.total=0,this._shape="bar",this.label="",this.showLegend=!1,this.projectedSegments=EMPTY_CONTEXT_METER_SEGMENTS}static{this.defaultStrings={...super.defaultStrings,contextMeterLabeledSummary:LYRA_DEFAULT_contextMeterLabeledSummary,contextMeterSegmentLabel:LYRA_DEFAULT_contextMeterSegmentLabel,contextMeterUsed:LYRA_DEFAULT_contextMeterUsed,contextMeterUsedOfTotal:LYRA_DEFAULT_contextMeterUsedOfTotal}}static{this.ownedCollectionProperties=Object.freeze(["segments"])}static{this.styles=[LyraElement.styles,srOnly,styles]}get shape(){return this._shape}set shape(value){const normalized=value==="ring"?"ring":"bar",previous=this._shape;if(previous===normalized){value!==normalized&&this.requestUpdate("shape",previous);return}this._shape=normalized,this.requestUpdate("shape",previous)}get effectiveSegments(){const source=this.segments;return source!==this.projectedSegmentsSource&&(this.projectedSegmentsSource=source,this.projectedSegments=projectContextMeterSegments(source)),this.projectedSegments}normalizedSegmentValue(segment){return Math.max(0,finiteNumber(segment.value,0))}get usedTotal(){return this.effectiveSegments.reduce((sum,segment)=>{const next=sum+this.normalizedSegmentValue(segment);return finiteNumber(next,Number.MAX_VALUE)},0)}ratios(){const total=Math.max(0,finiteNumber(this.total,0));if(total<=0)return[];const out=[];let cumulative=0;for(const segment of this.effectiveSegments){const raw=this.normalizedSegmentValue(segment),available=Math.max(0,1-cumulative),ratio=Math.min(raw/total,available);cumulative+=ratio,out.push({segment,value:raw,ratio})}return out}get clampedUsedTotal(){const total=Math.max(0,finiteNumber(this.total,0));return{used:total>0?Math.min(this.usedTotal,total):this.usedTotal,total}}get summary(){const{used:usedForSummary,total:totalValue}=this.clampedUsedTotal,used=formatCount(usedForSummary,this.effectiveLocale),phrase=totalValue>0?this.localize("contextMeterUsedOfTotal",void 0,{used,total:formatCount(totalValue,this.effectiveLocale)}):this.localize("contextMeterUsed",void 0,{used});return this.label?this.localize("contextMeterLabeledSummary",void 0,{label:this.label,summary:phrase}):phrase}segmentTitle(segment,value=this.normalizedSegmentValue(segment)){return this.localize("contextMeterSegmentLabel",void 0,{label:segment.label,count:formatCount(value,this.effectiveLocale)})}segmentColor(segment){return segment.color?sanitizeCssColor(segment.color):void 0}renderSemantics(){const{used,total}=this.clampedUsedTotal,accessibleName=this.summary;return html`
1
+ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{nativeSvgTitle}from"../../../internal/svg-title.js";import{html,svg,nothing}from"lit";import{property}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteNumber}from"../../../internal/numbers.js";import{resolveIntlLocale}from"../../../internal/intl-cache.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./context-meter.styles.js";import{LYRA_DEFAULT_contextMeterLabeledSummary,LYRA_DEFAULT_contextMeterSegmentLabel,LYRA_DEFAULT_contextMeterUsed,LYRA_DEFAULT_contextMeterUsedOfTotal}from"../../../internal/default-strings.generated.js";const RADIUS=40,CENTER=50,STROKE=12,CIRCUMFERENCE=2*Math.PI*RADIUS,MAX_CONTEXT_METER_SEGMENTS=1e4,EMPTY_CONTEXT_METER_SEGMENTS=Object.freeze([]);function projectContextMeterSegments(value){try{if(!Array.isArray(value))return EMPTY_CONTEXT_METER_SEGMENTS;const length=getOwnDataDescriptor(value,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return EMPTY_CONTEXT_METER_SEGMENTS;const segments=[];for(let index=0;index<Math.min(length.value,MAX_CONTEXT_METER_SEGMENTS);index+=1){const entry=getOwnDataDescriptor(value,String(index));if(entry===MISSING_OWN_DATA_DESCRIPTOR||entry===UNSAFE_OWN_DATA_DESCRIPTOR||entry.value===null||typeof entry.value!="object"||Array.isArray(entry.value))continue;const label=getOwnDataDescriptor(entry.value,"label"),segmentValue=getOwnDataDescriptor(entry.value,"value"),tone=getOwnDataDescriptor(entry.value,"tone"),color=getOwnDataDescriptor(entry.value,"color");if(label===MISSING_OWN_DATA_DESCRIPTOR||label===UNSAFE_OWN_DATA_DESCRIPTOR||segmentValue===MISSING_OWN_DATA_DESCRIPTOR||segmentValue===UNSAFE_OWN_DATA_DESCRIPTOR||tone===UNSAFE_OWN_DATA_DESCRIPTOR||color===UNSAFE_OWN_DATA_DESCRIPTOR||typeof label.value!="string"||typeof segmentValue.value!="number"||tone!==MISSING_OWN_DATA_DESCRIPTOR&&typeof tone.value!="string"||color!==MISSING_OWN_DATA_DESCRIPTOR&&typeof color.value!="string")continue;const toneValue=tone===MISSING_OWN_DATA_DESCRIPTOR?void 0:tone.value,colorValue=color===MISSING_OWN_DATA_DESCRIPTOR?void 0:color.value;segments.push(Object.freeze({label:label.value,value:segmentValue.value,...toneValue===void 0?{}:{tone:toneValue},...colorValue===void 0?{}:{color:colorValue}}))}return Object.freeze(segments)}catch{return EMPTY_CONTEXT_METER_SEGMENTS}}function formatCount(n,locale){return Math.round(finiteNumber(n,0)).toLocaleString(resolveIntlLocale(locale))}class LyraContextMeter extends LyraElement{constructor(){super(...arguments),this.segments=[],this.total=0,this._shape="bar",this.label="",this.showLegend=!1,this.projectedSegments=EMPTY_CONTEXT_METER_SEGMENTS}static{this.defaultStrings={...super.defaultStrings,contextMeterLabeledSummary:LYRA_DEFAULT_contextMeterLabeledSummary,contextMeterSegmentLabel:LYRA_DEFAULT_contextMeterSegmentLabel,contextMeterUsed:LYRA_DEFAULT_contextMeterUsed,contextMeterUsedOfTotal:LYRA_DEFAULT_contextMeterUsedOfTotal}}static{this.ownedCollectionProperties=Object.freeze(["segments"])}static{this.styles=[LyraElement.styles,srOnly,styles]}get shape(){return this._shape}set shape(value){const normalized=value==="ring"?"ring":"bar",previous=this._shape;if(previous===normalized){value!==normalized&&this.requestUpdate("shape",previous);return}this._shape=normalized,this.requestUpdate("shape",previous)}get effectiveSegments(){const source=this.segments;return source!==this.projectedSegmentsSource&&(this.projectedSegmentsSource=source,this.projectedSegments=projectContextMeterSegments(source)),this.projectedSegments}normalizedSegmentValue(segment){return Math.max(0,finiteNumber(segment.value,0))}get usedTotal(){return this.effectiveSegments.reduce((sum,segment)=>{const next=sum+this.normalizedSegmentValue(segment);return finiteNumber(next,Number.MAX_VALUE)},0)}ratios(){const total=Math.max(0,finiteNumber(this.total,0));if(total<=0)return[];const out=[];let cumulative=0;for(const segment of this.effectiveSegments){const raw=this.normalizedSegmentValue(segment),available=Math.max(0,1-cumulative),ratio=Math.min(raw/total,available);cumulative+=ratio,out.push({segment,value:raw,ratio})}return out}get clampedUsedTotal(){const total=Math.max(0,finiteNumber(this.total,0));return{used:total>0?Math.min(this.usedTotal,total):this.usedTotal,total}}get summary(){const{used:usedForSummary,total:totalValue}=this.clampedUsedTotal,used=formatCount(usedForSummary,this.effectiveLocale),phrase=totalValue>0?this.localize("contextMeterUsedOfTotal",void 0,{used,total:formatCount(totalValue,this.effectiveLocale)}):this.localize("contextMeterUsed",void 0,{used});return this.label?this.localize("contextMeterLabeledSummary",void 0,{label:this.label,summary:phrase}):phrase}segmentTitle(segment,value=this.normalizedSegmentValue(segment)){return this.localize("contextMeterSegmentLabel",void 0,{label:segment.label,count:formatCount(value,this.effectiveLocale)})}segmentColor(segment){return segment.color?sanitizeCssColor(segment.color):void 0}renderSemantics(){const{used,total}=this.clampedUsedTotal,accessibleName=this.summary;return html`
2
2
  <div
3
3
  part="semantic"
4
4
  class="sr-only"
@@ -37,7 +37,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
37
37
  stroke-dasharray=${`${segLen} ${CIRCUMFERENCE-segLen}`}
38
38
  stroke-dashoffset=${dashoffset}
39
39
  transform="rotate(-90 ${CENTER} ${CENTER})"
40
- ><title>${this.segmentTitle(segment,value)}</title></circle>
40
+ >${nativeSvgTitle(this.segmentTitle(segment,value))}</circle>
41
41
  `});return html`
42
42
  <svg part="base" viewBox="0 0 100 100" aria-hidden="true">
43
43
  <circle part="track" cx=${CENTER} cy=${CENTER} r=${RADIUS} stroke-width=${STROKE}></circle>
@@ -31,6 +31,8 @@ import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from
31
31
  * page, page-size, and abort-signal state.
32
32
  * @event lr-cell-click - Fired when a data cell is activated with canonical `rowKey` and
33
33
  * `columnId` identity.
34
+ * Clicking a supported interactive descendant, including its inner open-shadow native control,
35
+ * runs that control without also emitting lr-cell-click; passive cell content retains activation.
34
36
  * @event lr-cell-contextmenu - Fired before a native cell context menu. Cancelable; preventing
35
37
  * default suppresses the native menu. Detail includes canonical `rowKey` and `columnId`.
36
38
  * @event lr-column-move - Fired while and after a user column move; `detail.finished` marks commit.
@@ -292,7 +294,8 @@ getColumnFacets(columnId:string):DataGridFacets;
292
294
  getColumnPin(columnId:string):DataGridPinSide;
293
295
  /** Returns processed rows as formula-safe delimited text without downloading. */
294
296
  getDataAsCsv(options?:DataGridCsvOptions):string;
295
- /** Returns all filtered and sorted rows before pagination. */
297
+ /** Returns all filtered and sorted rows before pagination, with each admitted source-row
298
+ * occurrence retained once, matching facets, CSV, and rendered identity. */
296
299
  getProcessedRows():readonly Row[];
297
300
  /** Returns the current page (or all rows when pagination is off). */
298
301
  getVisibleRows():readonly Row[];
@@ -317,7 +320,8 @@ resetState():void;
317
320
  scrollToIndex(index:number,options?:DataGridScrollOptions):void;
318
321
  /** Applies known fields from a partial serialized view state. */
319
322
  setState(state:DataGridState):void;
320
- /** Distributes the available body width across visible columns. */
323
+ /** Reserves visible fixed columns and selection controls, then divides the remaining width
324
+ * proportionally across flexible columns, preserving each column's min/max bounds. */
321
325
  sizeColumnsToFit():void;
322
326
  /** Shows or hides one column without emitting the user-only visibility event. */
323
327
  toggleColumn(columnId:string,visible:boolean):void;private validColumnMap;private delimitedRows;private copyAndReport;private writeClipboard;private setColumnWidth;private cancelRequestTimer;private scheduleServerRequest;private loadServerData;private get selectionMode();private get selectionEnabled();