@aceshooting/lyra-ui 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +52 -2
  2. package/custom-elements.json +1911 -104
  3. package/dist/ai/index.d.ts +3 -0
  4. package/dist/ai/index.d.ts.map +1 -0
  5. package/dist/ai/index.js +3 -0
  6. package/dist/ai/index.js.map +1 -0
  7. package/dist/ai/types.d.ts +3 -1
  8. package/dist/ai/types.d.ts.map +1 -1
  9. package/dist/components/agent-run/agent-run.class.d.ts +27 -1
  10. package/dist/components/agent-run/agent-run.class.d.ts.map +1 -1
  11. package/dist/components/agent-run/agent-run.class.js +120 -47
  12. package/dist/components/agent-run/agent-run.class.js.map +1 -1
  13. package/dist/components/agent-run/agent-run.styles.d.ts.map +1 -1
  14. package/dist/components/agent-run/agent-run.styles.js +16 -0
  15. package/dist/components/agent-run/agent-run.styles.js.map +1 -1
  16. package/dist/components/agent-workspace/agent-workspace.class.d.ts +146 -0
  17. package/dist/components/agent-workspace/agent-workspace.class.d.ts.map +1 -0
  18. package/dist/components/agent-workspace/agent-workspace.class.js +332 -0
  19. package/dist/components/agent-workspace/agent-workspace.class.js.map +1 -0
  20. package/dist/components/agent-workspace/agent-workspace.d.ts +2 -0
  21. package/dist/components/agent-workspace/agent-workspace.d.ts.map +1 -0
  22. package/dist/components/agent-workspace/agent-workspace.js +5 -0
  23. package/dist/components/agent-workspace/agent-workspace.js.map +1 -0
  24. package/dist/components/agent-workspace/agent-workspace.styles.d.ts +2 -0
  25. package/dist/components/agent-workspace/agent-workspace.styles.d.ts.map +1 -0
  26. package/dist/components/agent-workspace/agent-workspace.styles.js +134 -0
  27. package/dist/components/agent-workspace/agent-workspace.styles.js.map +1 -0
  28. package/dist/components/avatar/avatar.class.d.ts +3 -3
  29. package/dist/components/avatar/avatar.class.d.ts.map +1 -1
  30. package/dist/components/avatar/avatar.class.js +8 -10
  31. package/dist/components/avatar/avatar.class.js.map +1 -1
  32. package/dist/components/chart/chart.class.d.ts +1 -0
  33. package/dist/components/chart/chart.class.d.ts.map +1 -1
  34. package/dist/components/chart/chart.class.js +9 -3
  35. package/dist/components/chart/chart.class.js.map +1 -1
  36. package/dist/components/chat-message/chat-message.class.d.ts +9 -2
  37. package/dist/components/chat-message/chat-message.class.d.ts.map +1 -1
  38. package/dist/components/chat-message/chat-message.class.js +10 -2
  39. package/dist/components/chat-message/chat-message.class.js.map +1 -1
  40. package/dist/components/conversation-item/conversation-item.class.d.ts +8 -0
  41. package/dist/components/conversation-item/conversation-item.class.d.ts.map +1 -1
  42. package/dist/components/conversation-item/conversation-item.class.js +50 -22
  43. package/dist/components/conversation-item/conversation-item.class.js.map +1 -1
  44. package/dist/components/conversation-item/conversation-item.styles.d.ts.map +1 -1
  45. package/dist/components/conversation-item/conversation-item.styles.js +11 -0
  46. package/dist/components/conversation-item/conversation-item.styles.js.map +1 -1
  47. package/dist/components/csv-viewer/csv-viewer.styles.d.ts.map +1 -1
  48. package/dist/components/csv-viewer/csv-viewer.styles.js +8 -2
  49. package/dist/components/csv-viewer/csv-viewer.styles.js.map +1 -1
  50. package/dist/components/dashboard-grid/dashboard-grid.class.d.ts.map +1 -1
  51. package/dist/components/dashboard-grid/dashboard-grid.class.js +5 -6
  52. package/dist/components/dashboard-grid/dashboard-grid.class.js.map +1 -1
  53. package/dist/components/diff-view/diff-view.class.d.ts +20 -2
  54. package/dist/components/diff-view/diff-view.class.d.ts.map +1 -1
  55. package/dist/components/diff-view/diff-view.class.js +107 -13
  56. package/dist/components/diff-view/diff-view.class.js.map +1 -1
  57. package/dist/components/diff-view/diff-view.styles.d.ts.map +1 -1
  58. package/dist/components/diff-view/diff-view.styles.js +5 -0
  59. package/dist/components/diff-view/diff-view.styles.js.map +1 -1
  60. package/dist/components/emoji-picker/emoji-data-loader.d.ts.map +1 -1
  61. package/dist/components/emoji-picker/emoji-data-loader.js +1 -1
  62. package/dist/components/emoji-picker/emoji-data-loader.js.map +1 -1
  63. package/dist/components/emoji-picker/emoji-picker.class.d.ts +18 -1
  64. package/dist/components/emoji-picker/emoji-picker.class.d.ts.map +1 -1
  65. package/dist/components/emoji-picker/emoji-picker.class.js +152 -28
  66. package/dist/components/emoji-picker/emoji-picker.class.js.map +1 -1
  67. package/dist/components/emoji-picker/emoji-picker.styles.d.ts.map +1 -1
  68. package/dist/components/emoji-picker/emoji-picker.styles.js +26 -2
  69. package/dist/components/emoji-picker/emoji-picker.styles.js.map +1 -1
  70. package/dist/components/evaluation-run/evaluation-run.class.d.ts.map +1 -1
  71. package/dist/components/evaluation-run/evaluation-run.class.js +4 -0
  72. package/dist/components/evaluation-run/evaluation-run.class.js.map +1 -1
  73. package/dist/components/heatmap/heatmap.class.d.ts +14 -0
  74. package/dist/components/heatmap/heatmap.class.d.ts.map +1 -1
  75. package/dist/components/heatmap/heatmap.class.js +165 -0
  76. package/dist/components/heatmap/heatmap.class.js.map +1 -1
  77. package/dist/components/markdown/markdown-core.class.d.ts +10 -3
  78. package/dist/components/markdown/markdown-core.class.d.ts.map +1 -1
  79. package/dist/components/markdown/markdown-core.class.js +33 -4
  80. package/dist/components/markdown/markdown-core.class.js.map +1 -1
  81. package/dist/components/markdown/markdown.class.d.ts +10 -3
  82. package/dist/components/markdown/markdown.class.d.ts.map +1 -1
  83. package/dist/components/markdown/markdown.class.js +33 -4
  84. package/dist/components/markdown/markdown.class.js.map +1 -1
  85. package/dist/components/notebook-viewer/notebook-viewer.class.d.ts +9 -2
  86. package/dist/components/notebook-viewer/notebook-viewer.class.d.ts.map +1 -1
  87. package/dist/components/notebook-viewer/notebook-viewer.class.js +27 -4
  88. package/dist/components/notebook-viewer/notebook-viewer.class.js.map +1 -1
  89. package/dist/components/retrieval-search/retrieval-search.class.d.ts.map +1 -1
  90. package/dist/components/retrieval-search/retrieval-search.class.js +1 -0
  91. package/dist/components/retrieval-search/retrieval-search.class.js.map +1 -1
  92. package/dist/components/rubric-form/rubric-form.class.d.ts.map +1 -1
  93. package/dist/components/rubric-form/rubric-form.class.js +1 -0
  94. package/dist/components/rubric-form/rubric-form.class.js.map +1 -1
  95. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.styles.d.ts.map +1 -1
  96. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.styles.js +8 -2
  97. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.styles.js.map +1 -1
  98. package/dist/components/thread-list/thread-list.class.d.ts +20 -2
  99. package/dist/components/thread-list/thread-list.class.d.ts.map +1 -1
  100. package/dist/components/thread-list/thread-list.class.js +33 -5
  101. package/dist/components/thread-list/thread-list.class.js.map +1 -1
  102. package/dist/components/trace-tree/trace-tree.class.d.ts.map +1 -1
  103. package/dist/components/trace-tree/trace-tree.class.js +3 -1
  104. package/dist/components/trace-tree/trace-tree.class.js.map +1 -1
  105. package/dist/internal/localization.d.ts +1 -1
  106. package/dist/internal/localization.d.ts.map +1 -1
  107. package/dist/internal/localization.js +14 -0
  108. package/dist/internal/localization.js.map +1 -1
  109. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  110. package/dist/internal/root-registration-allowlist.d.ts.map +1 -1
  111. package/dist/internal/root-registration-allowlist.js +1 -0
  112. package/dist/internal/root-registration-allowlist.js.map +1 -1
  113. package/dist/lyra.d.ts +3 -0
  114. package/dist/lyra.d.ts.map +1 -1
  115. package/dist/lyra.js +2 -0
  116. package/dist/lyra.js.map +1 -1
  117. package/llms-full.txt +63 -12
  118. package/llms.txt +1 -1
  119. package/package.json +4 -1
  120. package/vscode-html-data.json +143 -8
  121. package/web-types.json +162 -9
@@ -703,7 +703,7 @@
703
703
  "declarations": [
704
704
  {
705
705
  "kind": "class",
706
- "description": "`<lr-agent-run>` — the top-level shell for one `AgentRun`: lifecycle-status badge, elapsed\ntime, current step, model/cost summary, and built-in Cancel/Retry controls in a header, plus\nfour named composition slots (`tasks`/`tools`/`reasoning`/`output`) for the run's actual\ncontent. This is deliberately a SHELL, not a new step-rendering surface — every piece of\nper-step or per-invocation rendering routes through an existing primitive:\n\n- **Elapsed time**: composes `<lr-generation-status>` (`active`/`started-at`, its own built-in\n Stop button hidden via `show-stop=\"false\"` since this component renders its own Cancel/Retry\n pair instead) for the *live, ticking* readout while the run is genuinely in progress\n (`running`/`waiting-input`/`waiting-approval`). `<lr-stream-status>` was considered too (per\n this family's own composition brief) but doesn't fit: its `phase` vocabulary\n (`idle`/`connecting`/`streaming`/`stalled`) models transport/connection health, not an agent\n run's seven-state lifecycle, and it exposes no elapsed-time readout at all — exactly the\n distinction `<lr-generation-status>`'s own class doc already draws between the two. Once the\n run reaches a terminal state (`done`/`error`/`cancelled`) with both a `startedAt` and an\n `endedAt`, this component instead renders a small locally-formatted static duration\n (`endedAt - startedAt`): `<lr-generation-status>`'s freeze-on-`active=false` semantics only\n ever freeze at whatever it last computed *live*, so mounting it directly against a completed\n run loaded from history (e.g. `startedAt` yesterday, `endedAt` five minutes later, loaded\n today) would either show a stale zero or the wrong multi-hour span — it has no way to render a\n fixed historical span on demand. That static fallback reuses the same small `formatDuration()`\n algorithm `<lr-usage-badge>` and `<lr-tool-call-chip>` already duplicate locally for the same\n reason (see this file's own copy).\n- **Model + cost summary**: composes `<lr-usage-badge>`, fed `run.costEstimate` (formatted via\n `formatCost`, or a plain `Intl.NumberFormat` by default — this library never assumes a\n currency, see `<lr-format-number>`'s own explicit `currency` prop) as its `cost-text`.\n `run.model` (a plain string with no analogous `<lr-usage-badge>` property) renders alongside\n as plain text.\n- **Current step**: a single-line summary of whichever `run.steps` entry currently has\n `status.kind === 'running'` (the last such entry, if more than one) — a plain text line, not a\n list, so it doesn't duplicate `<lr-task-list>`'s own per-item rendering.\n- **Tasks slot default content**: when the host doesn't slot anything into `tasks` and\n `run.steps` is non-empty, this component's own `<slot>` fallback renders a `<lr-task-list>`\n populated by mapping every `AgentStep` to a `TaskItem` (see `toTaskItem()`) — a plain data\n adapter between the two existing shapes, not new rendering.\n- **Status badge**: composes `<lr-badge>`. **Empty state**: composes `<lr-empty>` when `run` is\n `null`.\n\n`tools`/`reasoning`/`output` are plain named slots with no default content — entirely the\nhost's own composition (typically `<lr-tool-call-chip>`/`<lr-tool-result-view>` rows,\nreasoning/streaming text, and final output respectively). An `actions` slot adds extra header\ncontrols alongside the built-in Cancel/Retry pair.\n\nThe built-in Cancel button renders while `showCancel` is true and the run's status is one of\n`TICKING_KINDS` (still genuinely in progress); Retry renders while `showRetry` is true and the\nstatus is `error` or `cancelled`. Clicking either fires `lr-cancel`/`lr-retry` with\n`CancelEventDetail`/`RetryEventDetail` from `src/ai/types.ts` — this component never cancels or\nretries anything itself, it only requests. `RetryEventDetail.attempt` is a 1-based counter\nlocal to this component, incremented on every `lr-retry` click and reset to `0` whenever\n`run.id` changes (a genuinely new run replacing the old one, as opposed to the same run's status\nmerely updating in place).\n\nLifecycle transitions into an attention-needing or terminal state (`waiting-input`,\n`waiting-approval`, `done`, `error`, `cancelled`) are announced through an internal\n`<lr-live-region>`, mirroring `<lr-stream-status>`'s own stall/recover announcements —\n`running`/`idle` transitions are frequent and not independently actionable, so they stay\nsilent, and whatever status a freshly-assigned `run` (a new `run.id`) happens to already carry\nis never itself treated as an eventful transition, only a later in-place change is.",
706
+ "description": "`<lr-agent-run>` — the top-level shell for one `AgentRun`: lifecycle-status badge, elapsed\ntime, current step, model/cost summary, and built-in Cancel/Retry controls in a header, plus\nfour named composition slots (`tasks`/`tools`/`reasoning`/`output`) for the run's actual\ncontent. This is deliberately a SHELL, not a new step-rendering surface — every piece of\nper-step or per-invocation rendering routes through an existing primitive:\n\n- **Elapsed time**: composes `<lr-generation-status>` (`active`/`started-at`, its own built-in\n Stop button hidden via `show-stop=\"false\"` since this component renders its own Cancel/Retry\n pair instead) for the *live, ticking* readout while the run is genuinely in progress\n (`running`/`waiting-input`/`waiting-approval`). `<lr-stream-status>` was considered too (per\n this family's own composition brief) but doesn't fit: its `phase` vocabulary\n (`idle`/`connecting`/`streaming`/`stalled`) models transport/connection health, not an agent\n run's seven-state lifecycle, and it exposes no elapsed-time readout at all — exactly the\n distinction `<lr-generation-status>`'s own class doc already draws between the two. Once the\n run reaches a terminal state (`done`/`error`/`cancelled`) with both a `startedAt` and an\n `endedAt`, this component instead renders a small locally-formatted static duration\n (`endedAt - startedAt`): `<lr-generation-status>`'s freeze-on-`active=false` semantics only\n ever freeze at whatever it last computed *live*, so mounting it directly against a completed\n run loaded from history (e.g. `startedAt` yesterday, `endedAt` five minutes later, loaded\n today) would either show a stale zero or the wrong multi-hour span — it has no way to render a\n fixed historical span on demand. That static fallback reuses the same small `formatDuration()`\n algorithm `<lr-usage-badge>` and `<lr-tool-call-chip>` already duplicate locally for the same\n reason (see this file's own copy).\n- **Model + cost summary**: composes `<lr-usage-badge>`, fed `run.costEstimate` (formatted via\n `formatCost`, or a plain `Intl.NumberFormat` by default — this library never assumes a\n currency, see `<lr-format-number>`'s own explicit `currency` prop) as its `cost-text`.\n `run.model` (a plain string with no analogous `<lr-usage-badge>` property) renders alongside\n as plain text.\n- **Current step**: a single-line summary of whichever `run.steps` entry currently has\n `status.kind === 'running'` (the last such entry, if more than one) — a plain text line, not a\n list, so it doesn't duplicate `<lr-task-list>`'s own per-item rendering.\n- **Tasks slot default content**: when the host doesn't slot anything into `tasks` and\n `run.steps` is non-empty, this component's own `<slot>` fallback renders a `<lr-task-list>`\n populated by mapping every `AgentStep` to a `TaskItem` (see `toTaskItem()`) — a plain data\n adapter between the two existing shapes, not new rendering.\n- **Status badge**: composes `<lr-badge>`. **Empty state**: composes `<lr-empty>` when `run` is\n `null`.\n\n`tools`/`reasoning`/`output` are plain named slots with no default content — entirely the\nhost's own composition (typically `<lr-tool-call-chip>`/`<lr-tool-result-view>` rows,\nreasoning/streaming text, and final output respectively). An `actions` slot adds extra header\ncontrols alongside the built-in Cancel/Retry pair. The `header` and `summary` slots replace the\nbuilt-in lifecycle header and model/usage/metrics summary respectively. `statusLabels` and\n`statusVariants` make application-defined lifecycle kinds first-class, while `metrics` renders\narbitrary labeled values such as prompt and completion token counts.\n\nThe built-in Cancel button renders while `showCancel` is true and the run's status is one of\n`TICKING_KINDS` (still genuinely in progress); Retry renders while `showRetry` is true and the\nstatus is `error` or `cancelled`. Clicking either fires `lr-cancel`/`lr-retry` with\n`CancelEventDetail`/`RetryEventDetail` from `src/ai/types.ts` — this component never cancels or\nretries anything itself, it only requests. `RetryEventDetail.attempt` is a 1-based counter\nlocal to this component, incremented on every `lr-retry` click and reset to `0` whenever\n`run.id` changes (a genuinely new run replacing the old one, as opposed to the same run's status\nmerely updating in place).\n\nLifecycle transitions into an attention-needing or terminal state (`waiting-input`,\n`waiting-approval`, `done`, `error`, `cancelled`) are announced through an internal\n`<lr-live-region>`, mirroring `<lr-stream-status>`'s own stall/recover announcements —\n`running`/`idle` transitions are frequent and not independently actionable, so they stay\nsilent, and whatever status a freshly-assigned `run` (a new `run.id`) happens to already carry\nis never itself treated as an eventful transition, only a later in-place change is.",
707
707
  "name": "LyraAgentRun",
708
708
  "cssParts": [
709
709
  {
@@ -750,6 +750,18 @@
750
750
  "description": "The header row wrapping status, elapsed time, current step, summary, and actions.",
751
751
  "name": "header"
752
752
  },
753
+ {
754
+ "description": "One arbitrary metric in the built-in summary.",
755
+ "name": "metric"
756
+ },
757
+ {
758
+ "description": "The metric's label.",
759
+ "name": "metric-label"
760
+ },
761
+ {
762
+ "description": "The metric's value.",
763
+ "name": "metric-value"
764
+ },
753
765
  {
754
766
  "description": "`run.model`, when set.",
755
767
  "name": "model"
@@ -800,6 +812,10 @@
800
812
  "description": "Extra header actions alongside the built-in Cancel/Retry buttons.",
801
813
  "name": "actions"
802
814
  },
815
+ {
816
+ "description": "Replaces the built-in lifecycle header and its built-in actions.",
817
+ "name": "header"
818
+ },
803
819
  {
804
820
  "description": "The run's final output content. No default content.",
805
821
  "name": "output"
@@ -808,6 +824,10 @@
808
824
  "description": "Reasoning/thinking content. No default content.",
809
825
  "name": "reasoning"
810
826
  },
827
+ {
828
+ "description": "Replaces the built-in model, usage, and metrics summary.",
829
+ "name": "summary"
830
+ },
811
831
  {
812
832
  "description": "Task/plan content. Falls back to a `<lr-task-list>` built from `run.steps` when nothing is slotted and `run.steps` is non-empty.",
813
833
  "name": "tasks"
@@ -902,6 +922,24 @@
902
922
  },
903
923
  "description": "Overrides the default plain `Intl.NumberFormat` rendering of `run.costEstimate` fed to the\ncomposed `<lr-usage-badge>`'s `cost-text` -- e.g. to add a currency symbol/code, which this\nlibrary never assumes on a host's behalf."
904
924
  },
925
+ {
926
+ "kind": "field",
927
+ "name": "hasHeaderSlot",
928
+ "type": {
929
+ "text": "boolean"
930
+ },
931
+ "privacy": "private",
932
+ "default": "false"
933
+ },
934
+ {
935
+ "kind": "field",
936
+ "name": "hasSummarySlot",
937
+ "type": {
938
+ "text": "boolean"
939
+ },
940
+ "privacy": "private",
941
+ "default": "false"
942
+ },
905
943
  {
906
944
  "kind": "field",
907
945
  "name": "isTicking",
@@ -947,16 +985,35 @@
947
985
  "module": "src/internal/lyra-element.ts"
948
986
  }
949
987
  },
988
+ {
989
+ "kind": "field",
990
+ "name": "metrics",
991
+ "type": {
992
+ "text": "AgentRunMetric[]"
993
+ },
994
+ "default": "[]",
995
+ "description": "Additional run metrics such as prompt/completion token counts."
996
+ },
950
997
  {
951
998
  "kind": "field",
952
999
  "name": "onCancelClick",
953
1000
  "privacy": "private"
954
1001
  },
1002
+ {
1003
+ "kind": "field",
1004
+ "name": "onHeaderSlotChange",
1005
+ "privacy": "private"
1006
+ },
955
1007
  {
956
1008
  "kind": "field",
957
1009
  "name": "onRetryClick",
958
1010
  "privacy": "private"
959
1011
  },
1012
+ {
1013
+ "kind": "field",
1014
+ "name": "onSummarySlotChange",
1015
+ "privacy": "private"
1016
+ },
960
1017
  {
961
1018
  "kind": "field",
962
1019
  "name": "pendingLoadController",
@@ -1033,6 +1090,24 @@
1033
1090
  "description": "The static formatted duration for a terminal run with both `startedAt` and `endedAt` --\n`undefined` while ticking, not yet terminal, or missing either timestamp (see the class\ndoc's \"elapsed time\" section for why a terminal run doesn't reuse the live ticker).",
1034
1091
  "readonly": true
1035
1092
  },
1093
+ {
1094
+ "kind": "field",
1095
+ "name": "statusLabels",
1096
+ "type": {
1097
+ "text": "Record<string, string>"
1098
+ },
1099
+ "default": "{}",
1100
+ "description": "Labels for application-defined lifecycle kinds. Built-in kinds remain localized by Lyra."
1101
+ },
1102
+ {
1103
+ "kind": "field",
1104
+ "name": "statusVariants",
1105
+ "type": {
1106
+ "text": "Record<string, BadgeVariant>"
1107
+ },
1108
+ "default": "{}",
1109
+ "description": "Badge variants for application-defined lifecycle kinds. Unknown kinds default to `neutral`."
1110
+ },
1036
1111
  {
1037
1112
  "kind": "field",
1038
1113
  "name": "stopLocaleSubscription",
@@ -1172,6 +1247,24 @@
1172
1247
  }
1173
1248
  }
1174
1249
  },
1250
+ {
1251
+ "kind": "method",
1252
+ "name": "hasSlotted",
1253
+ "privacy": "private",
1254
+ "return": {
1255
+ "type": {
1256
+ "text": "boolean"
1257
+ }
1258
+ },
1259
+ "parameters": [
1260
+ {
1261
+ "name": "name",
1262
+ "type": {
1263
+ "text": "string"
1264
+ }
1265
+ }
1266
+ ]
1267
+ },
1175
1268
  {
1176
1269
  "kind": "method",
1177
1270
  "name": "isAttentionKind",
@@ -2039,95 +2132,179 @@
2039
2132
  },
2040
2133
  {
2041
2134
  "kind": "javascript-module",
2042
- "path": "src/components/animated-image/animated-image.class.ts",
2135
+ "path": "src/components/agent-workspace/agent-workspace.class.ts",
2043
2136
  "declarations": [
2044
2137
  {
2045
2138
  "kind": "class",
2046
- "description": "`<lr-animated-image>` -- displays an animated GIF/APNG/WebP with a\nplay/pause control, defaulting to a frozen first frame both at rest and\nautomatically under `prefers-reduced-motion: reduce` (unless the page\nauthor explicitly opts back in via `respect-reduced-motion=\"false\"`), so\nmotion is never forced on a user who asked for less of it.\n\n**Freeze-frame mechanism.** The live `<img>`'s `load` event handler\nsynchronously draws the just-loaded image to `[part=\"canvas\"]` (a\nDPR-aware `drawImage()`, the same pattern `<lr-heatmap>` uses for its own\ncanvas sizing) before any animation frames have had a chance to advance.\nThat captured frame is what pausing always reverts to -- it is not\nre-captured on every pause, only once per successful `src` load. Both\n`[part=\"image\"]` and `[part=\"canvas\"]` stay mounted at all times (never\n`display: none`/removed) so the browser's native decode loop keeps running\neven while visually covered by the frozen canvas; only opacity and\n`aria-hidden` swap between them, driven by the effective `playing` state.\n\n**`play` vs. `playing`.** `play` is the caller's intent (settable,\nreflects nothing on its own). `playing` is the read-only, reflected effect\nafter reduced-motion arbitration: `play && !(respectReducedMotion &&\n<OS prefers-reduced-motion: reduce>)`. A page can set `.play = true` while\nreduced motion still keeps the visual frozen -- `lr-play`/`lr-pause`\nonly fire on a real transition of the resolved `playing` value, never on a\n`play` assignment that reduced motion blocks from taking visible effect.\n\n**Safety.** `src` is re-validated through `safeMediaSrc()` (the same\nallowlist `<lr-media-card>` uses) before it is ever assigned to the real\n`<img src>`. An empty `src` renders no `src` attribute and is not an\nerror; a non-empty `src` that fails the check is treated exactly like a\nnative image decode failure -- `lr-error` fires and no request is ever\nattempted.\n\n**Decorative-only is not supported.** An explicit `alt=\"\"` still falls\nback to the localized `animatedImageDefaultAlt` string rather than staying\nempty/presentational -- the same deliberate tradeoff `<lr-media-card>`'s\n`imgAlt` getter already makes for its own `alt`/`filename` fallback chain.\n\nDeliberately no label/hint/error chrome -- this is not a form-associated\ncontrol (nothing resembling a value the user submits).",
2047
- "name": "LyraAnimatedImage",
2048
- "cssProperties": [
2139
+ "description": "`<lr-agent-workspace>` a responsive, controlled shell for an AI conversation and its\nsupporting agent state. It renders the transcript and composer in the main pane, and composes\nexisting run, tool, retrieval, grounding, and context primitives in an optional details pane.\n\nThe component performs no network requests, model calls, retrieval, or persistence. Assign new\ndata to the public properties as the host application receives updates. The `messages` fallback\nrenders sanitized Markdown from each message's `text`; applications needing richer message\ncontent can replace that entire region with the `messages` slot. The `details` slot similarly\nreplaces the built-in details pane while keeping the responsive shell.",
2140
+ "name": "LyraAgentWorkspace",
2141
+ "cssParts": [
2049
2142
  {
2050
- "description": "The size of `control-box`. Defaults to `var(--lr-icon-button-size)`.",
2051
- "name": "--lr-animated-image-control-box-size"
2143
+ "description": "The root workspace wrapper.",
2144
+ "name": "base"
2052
2145
  },
2053
2146
  {
2054
- "description": "The size of the play/pause icons. Defaults to `calc(var(--lr-icon-button-size) * 0.35)`.",
2055
- "name": "--lr-animated-image-icon-size"
2147
+ "description": "The main conversation/details layout.",
2148
+ "name": "body"
2056
2149
  },
2057
2150
  {
2058
- "description": "Caps the rendered media's block-size. Defaults to `var(--lr-size-20rem)`.",
2059
- "name": "--lr-animated-image-max-height"
2060
- }
2061
- ],
2062
- "cssParts": [
2151
+ "description": "The composer region.",
2152
+ "name": "composer"
2153
+ },
2063
2154
  {
2064
- "description": "Root wrapper; positioning context for `control-box`.",
2065
- "name": "base"
2155
+ "description": "The built-in `<lr-chat-composer>`.",
2156
+ "name": "composer-input"
2066
2157
  },
2067
2158
  {
2068
- "description": "The frozen-frame `<canvas>`, shown in place of `image` while not playing.",
2069
- "name": "canvas"
2159
+ "description": "The main transcript pane.",
2160
+ "name": "conversation"
2070
2161
  },
2071
2162
  {
2072
- "description": "The container that surrounds and backgrounds the play/pause button. Only rendered once loaded and error-free.",
2073
- "name": "control-box"
2163
+ "description": "The responsive details pane.",
2164
+ "name": "details"
2074
2165
  },
2075
2166
  {
2076
- "description": "The live `<img>`.",
2077
- "name": "image"
2167
+ "description": "The built-in details content wrapper.",
2168
+ "name": "details-content"
2078
2169
  },
2079
2170
  {
2080
- "description": "The `<button type=\"button\">` inside `control-box` that toggles `play`.",
2081
- "name": "play-button"
2171
+ "description": "The workspace heading and header-actions slot.",
2172
+ "name": "header"
2173
+ },
2174
+ {
2175
+ "description": "The header-actions slot wrapper.",
2176
+ "name": "header-actions"
2177
+ },
2178
+ {
2179
+ "description": "The visible workspace heading.",
2180
+ "name": "heading"
2181
+ },
2182
+ {
2183
+ "description": "The transcript message wrapper.",
2184
+ "name": "messages"
2185
+ },
2186
+ {
2187
+ "description": "The empty transcript state.",
2188
+ "name": "messages-empty"
2189
+ },
2190
+ {
2191
+ "description": "A built-in run, tools, retrieval, grounding, or context section.",
2192
+ "name": "section"
2193
+ },
2194
+ {
2195
+ "description": "A built-in details section heading.",
2196
+ "name": "section-heading"
2197
+ },
2198
+ {
2199
+ "description": "The composed `<lr-chat-viewport>`.",
2200
+ "name": "viewport"
2082
2201
  }
2083
2202
  ],
2084
2203
  "slots": [
2085
2204
  {
2086
- "description": "Custom icon shown on `[part=\"play-button\"]` while playing. Defaults to a pause glyph.",
2087
- "name": "pause-icon"
2205
+ "description": "Replaces the built-in `<lr-chat-composer>`.",
2206
+ "name": "composer"
2088
2207
  },
2089
2208
  {
2090
- "description": "Custom icon shown on `[part=\"play-button\"]` while frozen/paused. Defaults to a play glyph.",
2091
- "name": "play-icon"
2209
+ "description": "Replaces the built-in run/tool/retrieval/grounding/context details pane.",
2210
+ "name": "details"
2211
+ },
2212
+ {
2213
+ "description": "Header actions such as model selection, settings, or export controls.",
2214
+ "name": "header-actions"
2215
+ },
2216
+ {
2217
+ "description": "Replaces the data-driven transcript message list.",
2218
+ "name": "messages"
2092
2219
  }
2093
2220
  ],
2094
2221
  "members": [
2095
2222
  {
2096
2223
  "kind": "field",
2097
- "name": "_playing",
2224
+ "name": "accessibleLabel",
2098
2225
  "type": {
2099
- "text": "boolean"
2226
+ "text": "string | null"
2100
2227
  },
2101
- "privacy": "private",
2102
- "default": "false"
2228
+ "default": "null",
2229
+ "description": "Host-level accessible-name override for the internal `role=\"region\"` root.",
2230
+ "attribute": "aria-label"
2103
2231
  },
2104
2232
  {
2105
2233
  "kind": "field",
2106
- "name": "accessibleLabel",
2234
+ "name": "citations",
2235
+ "type": {
2236
+ "text": "Citation[]"
2237
+ },
2238
+ "default": "[]",
2239
+ "description": "Citations displayed with the grounding summary."
2240
+ },
2241
+ {
2242
+ "kind": "field",
2243
+ "name": "composerMaxRows",
2244
+ "type": {
2245
+ "text": "number"
2246
+ },
2247
+ "default": "8",
2248
+ "attribute": "composer-max-rows"
2249
+ },
2250
+ {
2251
+ "kind": "field",
2252
+ "name": "composerMinRows",
2253
+ "type": {
2254
+ "text": "number"
2255
+ },
2256
+ "default": "1",
2257
+ "description": "Minimum and maximum rows for the built-in composer.",
2258
+ "attribute": "composer-min-rows"
2259
+ },
2260
+ {
2261
+ "kind": "field",
2262
+ "name": "composerPlaceholder",
2107
2263
  "type": {
2108
2264
  "text": "string"
2109
2265
  },
2110
2266
  "default": "''",
2111
- "description": "Accessible-name override for `[part=\"play-button\"]`. Maps to the\nhost's `aria-label` attribute and, once set, wins verbatim over the\ncomputed per-state Play/Pause label in both play and pause states --\nit does not itself vary by state. Never touches `[part=\"image\"]`'s\n`alt` / `[part=\"canvas\"]`'s `aria-label`, which stay independently\nsourced from `alt`. A consumer wanting state-sensitive custom wording\nwithout losing the Play/Pause distinction should override the\n`playWithContext`/`pauseWithContext`/`animatedImageDefaultAlt` strings\ninstead.",
2112
- "attribute": "aria-label"
2267
+ "description": "Placeholder for the built-in composer.",
2268
+ "attribute": "composer-placeholder"
2113
2269
  },
2114
2270
  {
2115
2271
  "kind": "field",
2116
- "name": "alt",
2272
+ "name": "composerStatus",
2273
+ "type": {
2274
+ "text": "ChatComposerStatus"
2275
+ },
2276
+ "default": "'idle'",
2277
+ "description": "Status of the built-in composer.",
2278
+ "attribute": "composer-status"
2279
+ },
2280
+ {
2281
+ "kind": "field",
2282
+ "name": "composerValue",
2117
2283
  "type": {
2118
2284
  "text": "string"
2119
2285
  },
2120
2286
  "default": "''",
2121
- "description": "A description of the image used by assistive devices. Falls back to\nthe localized `animatedImageDefaultAlt` when empty -- see the class doc.",
2122
- "attribute": "alt"
2287
+ "description": "Controlled value of the built-in composer.",
2288
+ "attribute": "composer-value"
2123
2289
  },
2124
2290
  {
2125
2291
  "kind": "field",
2126
- "name": "canvasEl",
2292
+ "name": "contextSegments",
2127
2293
  "type": {
2128
- "text": "HTMLCanvasElement | undefined"
2294
+ "text": "ContextInspectorSegment[]"
2129
2295
  },
2130
- "privacy": "private"
2296
+ "default": "[]",
2297
+ "description": "Final model-call context segments."
2298
+ },
2299
+ {
2300
+ "kind": "field",
2301
+ "name": "contextTotal",
2302
+ "type": {
2303
+ "text": "number"
2304
+ },
2305
+ "default": "0",
2306
+ "description": "Overall context-window token total.",
2307
+ "attribute": "context-total"
2131
2308
  },
2132
2309
  {
2133
2310
  "kind": "field",
@@ -2141,15 +2318,6 @@
2141
2318
  "module": "src/internal/lyra-element.ts"
2142
2319
  }
2143
2320
  },
2144
- {
2145
- "kind": "field",
2146
- "name": "effectiveAlt",
2147
- "type": {
2148
- "text": "string"
2149
- },
2150
- "privacy": "private",
2151
- "readonly": true
2152
- },
2153
2321
  {
2154
2322
  "kind": "field",
2155
2323
  "name": "effectiveDirection",
@@ -2180,29 +2348,42 @@
2180
2348
  },
2181
2349
  {
2182
2350
  "kind": "field",
2183
- "name": "hasError",
2351
+ "name": "follow",
2184
2352
  "type": {
2185
2353
  "text": "boolean"
2186
2354
  },
2187
- "privacy": "private",
2188
- "default": "false"
2355
+ "default": "true",
2356
+ "description": "Whether the transcript follows the latest message.",
2357
+ "attribute": "follow",
2358
+ "reflects": true
2189
2359
  },
2190
2360
  {
2191
2361
  "kind": "field",
2192
- "name": "hasLoaded",
2362
+ "name": "groundingAssessment",
2363
+ "type": {
2364
+ "text": "GroundingAssessment | null"
2365
+ },
2366
+ "default": "null",
2367
+ "description": "Grounding assessment for the current assistant answer."
2368
+ },
2369
+ {
2370
+ "kind": "field",
2371
+ "name": "hasBuiltInDetails",
2193
2372
  "type": {
2194
2373
  "text": "boolean"
2195
2374
  },
2196
2375
  "privacy": "private",
2197
- "default": "false"
2376
+ "readonly": true
2198
2377
  },
2199
2378
  {
2200
2379
  "kind": "field",
2201
- "name": "imageEl",
2380
+ "name": "label",
2202
2381
  "type": {
2203
- "text": "HTMLImageElement | undefined"
2382
+ "text": "string"
2204
2383
  },
2205
- "privacy": "private"
2384
+ "default": "''",
2385
+ "description": "Accessible name and visible heading for the workspace.",
2386
+ "attribute": "label"
2206
2387
  },
2207
2388
  {
2208
2389
  "kind": "field",
@@ -2234,40 +2415,40 @@
2234
2415
  },
2235
2416
  {
2236
2417
  "kind": "field",
2237
- "name": "mediaQuery",
2418
+ "name": "messages",
2238
2419
  "type": {
2239
- "text": "MediaQueryList | undefined"
2420
+ "text": "ChatMessage[]"
2240
2421
  },
2241
- "privacy": "private"
2242
- },
2243
- {
2244
- "kind": "field",
2245
- "name": "onControlBlur",
2246
- "privacy": "private"
2422
+ "default": "[]",
2423
+ "description": "Conversation messages. The host owns ordering, updates, and persistence."
2247
2424
  },
2248
2425
  {
2249
2426
  "kind": "field",
2250
- "name": "onControlFocus",
2251
- "privacy": "private"
2427
+ "name": "metrics",
2428
+ "type": {
2429
+ "text": "AgentRunMetric[]"
2430
+ },
2431
+ "default": "[]",
2432
+ "description": "Additional metrics forwarded to `<lr-agent-run>`, such as token counts or latency."
2252
2433
  },
2253
2434
  {
2254
2435
  "kind": "field",
2255
- "name": "onImageError",
2436
+ "name": "onComposerInput",
2256
2437
  "privacy": "private"
2257
2438
  },
2258
2439
  {
2259
2440
  "kind": "field",
2260
- "name": "onImageLoad",
2441
+ "name": "onFollowChange",
2261
2442
  "privacy": "private"
2262
2443
  },
2263
2444
  {
2264
2445
  "kind": "field",
2265
- "name": "onMotionPreferenceChange",
2446
+ "name": "onMessageRetry",
2266
2447
  "privacy": "private"
2267
2448
  },
2268
2449
  {
2269
2450
  "kind": "field",
2270
- "name": "onToggleClick",
2451
+ "name": "onRetrievalSelect",
2271
2452
  "privacy": "private"
2272
2453
  },
2273
2454
  {
@@ -2284,50 +2465,888 @@
2284
2465
  },
2285
2466
  {
2286
2467
  "kind": "field",
2287
- "name": "play",
2468
+ "name": "retrievalChunks",
2469
+ "type": {
2470
+ "text": "RetrievalChunk[]"
2471
+ },
2472
+ "default": "[]",
2473
+ "description": "Retrieval chunks for the current answer or query."
2474
+ },
2475
+ {
2476
+ "kind": "field",
2477
+ "name": "retrievalError",
2478
+ "type": {
2479
+ "text": "string"
2480
+ },
2481
+ "default": "''",
2482
+ "description": "Caller-supplied retrieval error text.",
2483
+ "attribute": "retrieval-error"
2484
+ },
2485
+ {
2486
+ "kind": "field",
2487
+ "name": "retrievalHasMore",
2288
2488
  "type": {
2289
2489
  "text": "boolean"
2290
2490
  },
2291
2491
  "default": "false",
2292
- "description": "Requests animated playback. Distinct from the read-only `playing`\neffect -- see the class doc's \"`play` vs. `playing`\" section.",
2293
- "attribute": "play"
2492
+ "description": "Whether more retrieval results can be requested.",
2493
+ "attribute": "retrieval-has-more"
2294
2494
  },
2295
2495
  {
2296
2496
  "kind": "field",
2297
- "name": "playButtonEl",
2497
+ "name": "retrievalLoading",
2298
2498
  "type": {
2299
- "text": "HTMLButtonElement | undefined"
2499
+ "text": "boolean"
2300
2500
  },
2301
- "privacy": "private"
2501
+ "default": "false",
2502
+ "description": "Loading state for the built-in retrieval result list.",
2503
+ "attribute": "retrieval-loading"
2302
2504
  },
2303
2505
  {
2304
2506
  "kind": "field",
2305
- "name": "playing",
2507
+ "name": "run",
2306
2508
  "type": {
2307
- "text": "boolean"
2509
+ "text": "AgentRun | null"
2308
2510
  },
2309
- "description": "The effective playing state after reduced-motion arbitration -- also\nreflected as a `playing` host attribute. Read-only; control playback\nvia `play`."
2511
+ "default": "null",
2512
+ "description": "Current agent run, rendered in the details pane when set."
2310
2513
  },
2311
2514
  {
2312
2515
  "kind": "field",
2313
- "name": "respectReducedMotion",
2516
+ "name": "selectedRetrievalIds",
2517
+ "type": {
2518
+ "text": "string[]"
2519
+ },
2520
+ "default": "[]",
2521
+ "description": "Controlled retrieval selection, forwarded to `<lr-retrieval-results>`."
2522
+ },
2523
+ {
2524
+ "kind": "field",
2525
+ "name": "showComposer",
2314
2526
  "type": {
2315
2527
  "text": "boolean"
2316
2528
  },
2317
2529
  "default": "true",
2318
- "description": "When `true` (default) and the platform reports\n`prefers-reduced-motion: reduce`, playback stays frozen and\n`[part=\"play-button\"]` is disabled regardless of `play`. Set to `false`\nto let `play` take effect even under a reduced-motion preference -- a\ndeliberate, page-author-level override.",
2319
- "attribute": "respect-reduced-motion",
2530
+ "description": "Whether the built-in composer is available when no `composer` slot is supplied.",
2531
+ "attribute": "show-composer",
2320
2532
  "reflects": true
2321
2533
  },
2322
2534
  {
2323
2535
  "kind": "field",
2324
- "name": "src",
2536
+ "name": "showDetails",
2325
2537
  "type": {
2326
- "text": "string"
2538
+ "text": "boolean"
2327
2539
  },
2328
- "default": "''",
2329
- "description": "The path to the image to load. Always re-validated against a\nsafe-scheme allowlist before use -- see the class doc.",
2330
- "attribute": "src"
2540
+ "default": "true",
2541
+ "description": "Whether the built-in details pane is available when data is present.",
2542
+ "attribute": "show-details",
2543
+ "reflects": true
2544
+ },
2545
+ {
2546
+ "kind": "field",
2547
+ "name": "stopLocaleSubscription",
2548
+ "type": {
2549
+ "text": "() => void | undefined"
2550
+ },
2551
+ "privacy": "private",
2552
+ "inheritedFrom": {
2553
+ "name": "LyraElement",
2554
+ "module": "src/internal/lyra-element.ts"
2555
+ }
2556
+ },
2557
+ {
2558
+ "kind": "field",
2559
+ "name": "strings",
2560
+ "type": {
2561
+ "text": "LyraLocaleStrings"
2562
+ },
2563
+ "default": "{}",
2564
+ "description": "Per-instance message overrides, useful for application-specific wording.",
2565
+ "inheritedFrom": {
2566
+ "name": "LyraElement",
2567
+ "module": "src/internal/lyra-element.ts"
2568
+ }
2569
+ },
2570
+ {
2571
+ "kind": "field",
2572
+ "name": "tools",
2573
+ "type": {
2574
+ "text": "ToolTimelineEntry[]"
2575
+ },
2576
+ "default": "[]",
2577
+ "description": "Tool calls for the current run, rendered through `<lr-tool-timeline>`."
2578
+ },
2579
+ {
2580
+ "kind": "field",
2581
+ "name": "unreadStartIndex",
2582
+ "type": {
2583
+ "text": "number | null"
2584
+ },
2585
+ "default": "null",
2586
+ "description": "First unread message index, forwarded to the transcript viewport.",
2587
+ "attribute": "unread-start-index"
2588
+ },
2589
+ {
2590
+ "kind": "method",
2591
+ "name": "addEventListener",
2592
+ "return": {
2593
+ "type": {
2594
+ "text": "void"
2595
+ }
2596
+ },
2597
+ "parameters": [
2598
+ {
2599
+ "name": "type",
2600
+ "type": {
2601
+ "text": "K"
2602
+ }
2603
+ },
2604
+ {
2605
+ "name": "listener",
2606
+ "type": {
2607
+ "text": "(this: this, event: Events[K]) => unknown"
2608
+ }
2609
+ },
2610
+ {
2611
+ "name": "options",
2612
+ "optional": true,
2613
+ "type": {
2614
+ "text": "boolean | AddEventListenerOptions"
2615
+ }
2616
+ }
2617
+ ],
2618
+ "inheritedFrom": {
2619
+ "name": "LyraElement",
2620
+ "module": "src/internal/lyra-element.ts"
2621
+ }
2622
+ },
2623
+ {
2624
+ "kind": "method",
2625
+ "name": "beginAbortableLoad",
2626
+ "privacy": "protected",
2627
+ "return": {
2628
+ "type": {
2629
+ "text": "AbortSignal | undefined"
2630
+ }
2631
+ },
2632
+ "description": "Starts a component-owned cancellable load and aborts the previous one.",
2633
+ "inheritedFrom": {
2634
+ "name": "LyraElement",
2635
+ "module": "src/internal/lyra-element.ts"
2636
+ }
2637
+ },
2638
+ {
2639
+ "kind": "method",
2640
+ "name": "emit",
2641
+ "privacy": "protected",
2642
+ "return": {
2643
+ "type": {
2644
+ "text": "CustomEvent<T>"
2645
+ }
2646
+ },
2647
+ "parameters": [
2648
+ {
2649
+ "name": "name",
2650
+ "type": {
2651
+ "text": "string"
2652
+ }
2653
+ },
2654
+ {
2655
+ "name": "detail",
2656
+ "optional": true,
2657
+ "type": {
2658
+ "text": "T"
2659
+ }
2660
+ },
2661
+ {
2662
+ "name": "options",
2663
+ "optional": true,
2664
+ "type": {
2665
+ "text": "LyraEmitOptions"
2666
+ }
2667
+ }
2668
+ ],
2669
+ "description": "Dispatch a composed, bubbling custom event; notifications are not veto points by default.",
2670
+ "inheritedFrom": {
2671
+ "name": "LyraElement",
2672
+ "module": "src/internal/lyra-element.ts"
2673
+ }
2674
+ },
2675
+ {
2676
+ "kind": "method",
2677
+ "name": "hasSlotted",
2678
+ "privacy": "private",
2679
+ "return": {
2680
+ "type": {
2681
+ "text": "boolean"
2682
+ }
2683
+ },
2684
+ "parameters": [
2685
+ {
2686
+ "name": "name",
2687
+ "type": {
2688
+ "text": "string"
2689
+ }
2690
+ }
2691
+ ]
2692
+ },
2693
+ {
2694
+ "kind": "method",
2695
+ "name": "localize",
2696
+ "privacy": "protected",
2697
+ "return": {
2698
+ "type": {
2699
+ "text": "string"
2700
+ }
2701
+ },
2702
+ "parameters": [
2703
+ {
2704
+ "name": "key",
2705
+ "type": {
2706
+ "text": "string"
2707
+ }
2708
+ },
2709
+ {
2710
+ "name": "fallback",
2711
+ "optional": true,
2712
+ "type": {
2713
+ "text": "string"
2714
+ }
2715
+ },
2716
+ {
2717
+ "name": "values",
2718
+ "optional": true,
2719
+ "type": {
2720
+ "text": "Record<string, string | number>"
2721
+ }
2722
+ }
2723
+ ],
2724
+ "description": "Resolve a localized message using this component's overrides and locale.",
2725
+ "inheritedFrom": {
2726
+ "name": "LyraElement",
2727
+ "module": "src/internal/lyra-element.ts"
2728
+ }
2729
+ },
2730
+ {
2731
+ "kind": "method",
2732
+ "name": "removeEventListener",
2733
+ "return": {
2734
+ "type": {
2735
+ "text": "void"
2736
+ }
2737
+ },
2738
+ "parameters": [
2739
+ {
2740
+ "name": "type",
2741
+ "type": {
2742
+ "text": "K"
2743
+ }
2744
+ },
2745
+ {
2746
+ "name": "listener",
2747
+ "type": {
2748
+ "text": "(this: this, event: Events[K]) => unknown"
2749
+ }
2750
+ },
2751
+ {
2752
+ "name": "options",
2753
+ "optional": true,
2754
+ "type": {
2755
+ "text": "boolean | EventListenerOptions"
2756
+ }
2757
+ }
2758
+ ],
2759
+ "inheritedFrom": {
2760
+ "name": "LyraElement",
2761
+ "module": "src/internal/lyra-element.ts"
2762
+ }
2763
+ },
2764
+ {
2765
+ "kind": "method",
2766
+ "name": "renderDetails",
2767
+ "privacy": "private",
2768
+ "return": {
2769
+ "type": {
2770
+ "text": "TemplateResult"
2771
+ }
2772
+ }
2773
+ },
2774
+ {
2775
+ "kind": "method",
2776
+ "name": "renderMessage",
2777
+ "privacy": "private",
2778
+ "return": {
2779
+ "type": {
2780
+ "text": "TemplateResult"
2781
+ }
2782
+ },
2783
+ "parameters": [
2784
+ {
2785
+ "name": "message",
2786
+ "type": {
2787
+ "text": "ChatMessage"
2788
+ }
2789
+ }
2790
+ ]
2791
+ },
2792
+ {
2793
+ "kind": "method",
2794
+ "name": "renderMessages",
2795
+ "privacy": "private",
2796
+ "return": {
2797
+ "type": {
2798
+ "text": "TemplateResult"
2799
+ }
2800
+ }
2801
+ },
2802
+ {
2803
+ "kind": "method",
2804
+ "name": "scheduleAfterUpdate",
2805
+ "privacy": "protected",
2806
+ "return": {
2807
+ "type": {
2808
+ "text": "void"
2809
+ }
2810
+ },
2811
+ "parameters": [
2812
+ {
2813
+ "name": "callback",
2814
+ "type": {
2815
+ "text": "() => void"
2816
+ }
2817
+ }
2818
+ ],
2819
+ "description": "Runs one coalesced load callback after the current update completes.\nLit still runs the update cycle while detached, so a load scheduled then is\nheld and replayed on reconnect rather than dropped.",
2820
+ "inheritedFrom": {
2821
+ "name": "LyraElement",
2822
+ "module": "src/internal/lyra-element.ts"
2823
+ }
2824
+ }
2825
+ ],
2826
+ "events": [
2827
+ {
2828
+ "description": "Forwarded from the built-in agent run.",
2829
+ "name": "lr-cancel"
2830
+ },
2831
+ {
2832
+ "description": "Forwarded from the built-in grounding summary. `detail: { citation }`.",
2833
+ "name": "lr-citation-select"
2834
+ },
2835
+ {
2836
+ "description": "Forwarded from the transcript viewport. `detail: { following }`.",
2837
+ "name": "lr-follow-change"
2838
+ },
2839
+ {
2840
+ "description": "Forwarded from the built-in composer. `detail: { value }`.",
2841
+ "name": "lr-input"
2842
+ },
2843
+ {
2844
+ "description": "A data-driven message's retry action was activated. `detail: { messageId }`.",
2845
+ "name": "lr-message-retry"
2846
+ },
2847
+ {
2848
+ "description": "Forwarded from the built-in retrieval results. `detail: { ids, chunks }`.",
2849
+ "name": "lr-retrieval-select"
2850
+ },
2851
+ {
2852
+ "description": "Forwarded from the built-in agent run.",
2853
+ "name": "lr-retry"
2854
+ },
2855
+ {
2856
+ "description": "Forwarded from the built-in composer.",
2857
+ "name": "lr-stop"
2858
+ },
2859
+ {
2860
+ "description": "Forwarded from the built-in composer. `detail: { value }`.",
2861
+ "name": "lr-submit"
2862
+ },
2863
+ {
2864
+ "description": "Forwarded from the built-in tool timeline.",
2865
+ "name": "lr-tool-approval-decide"
2866
+ }
2867
+ ],
2868
+ "attributes": [
2869
+ {
2870
+ "name": "aria-label",
2871
+ "type": {
2872
+ "text": "string | null"
2873
+ },
2874
+ "default": "null",
2875
+ "description": "Host-level accessible-name override for the internal `role=\"region\"` root.",
2876
+ "fieldName": "accessibleLabel"
2877
+ },
2878
+ {
2879
+ "name": "composer-max-rows",
2880
+ "type": {
2881
+ "text": "number"
2882
+ },
2883
+ "default": "8",
2884
+ "fieldName": "composerMaxRows"
2885
+ },
2886
+ {
2887
+ "name": "composer-min-rows",
2888
+ "type": {
2889
+ "text": "number"
2890
+ },
2891
+ "default": "1",
2892
+ "description": "Minimum and maximum rows for the built-in composer.",
2893
+ "fieldName": "composerMinRows"
2894
+ },
2895
+ {
2896
+ "name": "composer-placeholder",
2897
+ "type": {
2898
+ "text": "string"
2899
+ },
2900
+ "default": "''",
2901
+ "description": "Placeholder for the built-in composer.",
2902
+ "fieldName": "composerPlaceholder"
2903
+ },
2904
+ {
2905
+ "name": "composer-status",
2906
+ "type": {
2907
+ "text": "ChatComposerStatus"
2908
+ },
2909
+ "default": "'idle'",
2910
+ "description": "Status of the built-in composer.",
2911
+ "fieldName": "composerStatus"
2912
+ },
2913
+ {
2914
+ "name": "composer-value",
2915
+ "type": {
2916
+ "text": "string"
2917
+ },
2918
+ "default": "''",
2919
+ "description": "Controlled value of the built-in composer.",
2920
+ "fieldName": "composerValue"
2921
+ },
2922
+ {
2923
+ "name": "context-total",
2924
+ "type": {
2925
+ "text": "number"
2926
+ },
2927
+ "default": "0",
2928
+ "description": "Overall context-window token total.",
2929
+ "fieldName": "contextTotal"
2930
+ },
2931
+ {
2932
+ "name": "follow",
2933
+ "type": {
2934
+ "text": "boolean"
2935
+ },
2936
+ "default": "true",
2937
+ "description": "Whether the transcript follows the latest message.",
2938
+ "fieldName": "follow"
2939
+ },
2940
+ {
2941
+ "name": "label",
2942
+ "type": {
2943
+ "text": "string"
2944
+ },
2945
+ "default": "''",
2946
+ "description": "Accessible name and visible heading for the workspace.",
2947
+ "fieldName": "label"
2948
+ },
2949
+ {
2950
+ "name": "locale",
2951
+ "type": {
2952
+ "text": "string"
2953
+ },
2954
+ "default": "''",
2955
+ "description": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.",
2956
+ "fieldName": "locale",
2957
+ "inheritedFrom": {
2958
+ "name": "LyraElement",
2959
+ "module": "src/internal/lyra-element.ts"
2960
+ }
2961
+ },
2962
+ {
2963
+ "name": "retrieval-error",
2964
+ "type": {
2965
+ "text": "string"
2966
+ },
2967
+ "default": "''",
2968
+ "description": "Caller-supplied retrieval error text.",
2969
+ "fieldName": "retrievalError"
2970
+ },
2971
+ {
2972
+ "name": "retrieval-has-more",
2973
+ "type": {
2974
+ "text": "boolean"
2975
+ },
2976
+ "default": "false",
2977
+ "description": "Whether more retrieval results can be requested.",
2978
+ "fieldName": "retrievalHasMore"
2979
+ },
2980
+ {
2981
+ "name": "retrieval-loading",
2982
+ "type": {
2983
+ "text": "boolean"
2984
+ },
2985
+ "default": "false",
2986
+ "description": "Loading state for the built-in retrieval result list.",
2987
+ "fieldName": "retrievalLoading"
2988
+ },
2989
+ {
2990
+ "name": "show-composer",
2991
+ "type": {
2992
+ "text": "boolean"
2993
+ },
2994
+ "default": "true",
2995
+ "description": "Whether the built-in composer is available when no `composer` slot is supplied.",
2996
+ "fieldName": "showComposer"
2997
+ },
2998
+ {
2999
+ "name": "show-details",
3000
+ "type": {
3001
+ "text": "boolean"
3002
+ },
3003
+ "default": "true",
3004
+ "description": "Whether the built-in details pane is available when data is present.",
3005
+ "fieldName": "showDetails"
3006
+ },
3007
+ {
3008
+ "name": "unread-start-index",
3009
+ "type": {
3010
+ "text": "number | null"
3011
+ },
3012
+ "default": "null",
3013
+ "description": "First unread message index, forwarded to the transcript viewport.",
3014
+ "fieldName": "unreadStartIndex"
3015
+ }
3016
+ ],
3017
+ "superclass": {
3018
+ "name": "LyraElement",
3019
+ "module": "/src/internal/lyra-element.js"
3020
+ },
3021
+ "tagName": "lr-agent-workspace",
3022
+ "customElement": true
3023
+ }
3024
+ ],
3025
+ "exports": [
3026
+ {
3027
+ "kind": "js",
3028
+ "name": "LyraAgentWorkspace",
3029
+ "declaration": {
3030
+ "name": "LyraAgentWorkspace",
3031
+ "module": "src/components/agent-workspace/agent-workspace.class.ts"
3032
+ }
3033
+ }
3034
+ ]
3035
+ },
3036
+ {
3037
+ "kind": "javascript-module",
3038
+ "path": "src/components/agent-workspace/agent-workspace.ts",
3039
+ "declarations": [],
3040
+ "exports": [
3041
+ {
3042
+ "kind": "custom-element-definition",
3043
+ "name": "lr-agent-workspace",
3044
+ "declaration": {
3045
+ "name": "LyraAgentWorkspace",
3046
+ "module": "src/components/agent-workspace/agent-workspace.class.ts"
3047
+ }
3048
+ },
3049
+ {
3050
+ "kind": "js",
3051
+ "name": "*",
3052
+ "declaration": {
3053
+ "name": "*",
3054
+ "module": "src/components/agent-workspace/agent-workspace.class.js"
3055
+ }
3056
+ }
3057
+ ]
3058
+ },
3059
+ {
3060
+ "kind": "javascript-module",
3061
+ "path": "src/components/animated-image/animated-image.class.ts",
3062
+ "declarations": [
3063
+ {
3064
+ "kind": "class",
3065
+ "description": "`<lr-animated-image>` -- displays an animated GIF/APNG/WebP with a\nplay/pause control, defaulting to a frozen first frame both at rest and\nautomatically under `prefers-reduced-motion: reduce` (unless the page\nauthor explicitly opts back in via `respect-reduced-motion=\"false\"`), so\nmotion is never forced on a user who asked for less of it.\n\n**Freeze-frame mechanism.** The live `<img>`'s `load` event handler\nsynchronously draws the just-loaded image to `[part=\"canvas\"]` (a\nDPR-aware `drawImage()`, the same pattern `<lr-heatmap>` uses for its own\ncanvas sizing) before any animation frames have had a chance to advance.\nThat captured frame is what pausing always reverts to -- it is not\nre-captured on every pause, only once per successful `src` load. Both\n`[part=\"image\"]` and `[part=\"canvas\"]` stay mounted at all times (never\n`display: none`/removed) so the browser's native decode loop keeps running\neven while visually covered by the frozen canvas; only opacity and\n`aria-hidden` swap between them, driven by the effective `playing` state.\n\n**`play` vs. `playing`.** `play` is the caller's intent (settable,\nreflects nothing on its own). `playing` is the read-only, reflected effect\nafter reduced-motion arbitration: `play && !(respectReducedMotion &&\n<OS prefers-reduced-motion: reduce>)`. A page can set `.play = true` while\nreduced motion still keeps the visual frozen -- `lr-play`/`lr-pause`\nonly fire on a real transition of the resolved `playing` value, never on a\n`play` assignment that reduced motion blocks from taking visible effect.\n\n**Safety.** `src` is re-validated through `safeMediaSrc()` (the same\nallowlist `<lr-media-card>` uses) before it is ever assigned to the real\n`<img src>`. An empty `src` renders no `src` attribute and is not an\nerror; a non-empty `src` that fails the check is treated exactly like a\nnative image decode failure -- `lr-error` fires and no request is ever\nattempted.\n\n**Decorative-only is not supported.** An explicit `alt=\"\"` still falls\nback to the localized `animatedImageDefaultAlt` string rather than staying\nempty/presentational -- the same deliberate tradeoff `<lr-media-card>`'s\n`imgAlt` getter already makes for its own `alt`/`filename` fallback chain.\n\nDeliberately no label/hint/error chrome -- this is not a form-associated\ncontrol (nothing resembling a value the user submits).",
3066
+ "name": "LyraAnimatedImage",
3067
+ "cssProperties": [
3068
+ {
3069
+ "description": "The size of `control-box`. Defaults to `var(--lr-icon-button-size)`.",
3070
+ "name": "--lr-animated-image-control-box-size"
3071
+ },
3072
+ {
3073
+ "description": "The size of the play/pause icons. Defaults to `calc(var(--lr-icon-button-size) * 0.35)`.",
3074
+ "name": "--lr-animated-image-icon-size"
3075
+ },
3076
+ {
3077
+ "description": "Caps the rendered media's block-size. Defaults to `var(--lr-size-20rem)`.",
3078
+ "name": "--lr-animated-image-max-height"
3079
+ }
3080
+ ],
3081
+ "cssParts": [
3082
+ {
3083
+ "description": "Root wrapper; positioning context for `control-box`.",
3084
+ "name": "base"
3085
+ },
3086
+ {
3087
+ "description": "The frozen-frame `<canvas>`, shown in place of `image` while not playing.",
3088
+ "name": "canvas"
3089
+ },
3090
+ {
3091
+ "description": "The container that surrounds and backgrounds the play/pause button. Only rendered once loaded and error-free.",
3092
+ "name": "control-box"
3093
+ },
3094
+ {
3095
+ "description": "The live `<img>`.",
3096
+ "name": "image"
3097
+ },
3098
+ {
3099
+ "description": "The `<button type=\"button\">` inside `control-box` that toggles `play`.",
3100
+ "name": "play-button"
3101
+ }
3102
+ ],
3103
+ "slots": [
3104
+ {
3105
+ "description": "Custom icon shown on `[part=\"play-button\"]` while playing. Defaults to a pause glyph.",
3106
+ "name": "pause-icon"
3107
+ },
3108
+ {
3109
+ "description": "Custom icon shown on `[part=\"play-button\"]` while frozen/paused. Defaults to a play glyph.",
3110
+ "name": "play-icon"
3111
+ }
3112
+ ],
3113
+ "members": [
3114
+ {
3115
+ "kind": "field",
3116
+ "name": "_playing",
3117
+ "type": {
3118
+ "text": "boolean"
3119
+ },
3120
+ "privacy": "private",
3121
+ "default": "false"
3122
+ },
3123
+ {
3124
+ "kind": "field",
3125
+ "name": "accessibleLabel",
3126
+ "type": {
3127
+ "text": "string"
3128
+ },
3129
+ "default": "''",
3130
+ "description": "Accessible-name override for `[part=\"play-button\"]`. Maps to the\nhost's `aria-label` attribute and, once set, wins verbatim over the\ncomputed per-state Play/Pause label in both play and pause states --\nit does not itself vary by state. Never touches `[part=\"image\"]`'s\n`alt` / `[part=\"canvas\"]`'s `aria-label`, which stay independently\nsourced from `alt`. A consumer wanting state-sensitive custom wording\nwithout losing the Play/Pause distinction should override the\n`playWithContext`/`pauseWithContext`/`animatedImageDefaultAlt` strings\ninstead.",
3131
+ "attribute": "aria-label"
3132
+ },
3133
+ {
3134
+ "kind": "field",
3135
+ "name": "alt",
3136
+ "type": {
3137
+ "text": "string"
3138
+ },
3139
+ "default": "''",
3140
+ "description": "A description of the image used by assistive devices. Falls back to\nthe localized `animatedImageDefaultAlt` when empty -- see the class doc.",
3141
+ "attribute": "alt"
3142
+ },
3143
+ {
3144
+ "kind": "field",
3145
+ "name": "canvasEl",
3146
+ "type": {
3147
+ "text": "HTMLCanvasElement | undefined"
3148
+ },
3149
+ "privacy": "private"
3150
+ },
3151
+ {
3152
+ "kind": "field",
3153
+ "name": "deferredLoad",
3154
+ "type": {
3155
+ "text": "() => void | undefined"
3156
+ },
3157
+ "privacy": "private",
3158
+ "inheritedFrom": {
3159
+ "name": "LyraElement",
3160
+ "module": "src/internal/lyra-element.ts"
3161
+ }
3162
+ },
3163
+ {
3164
+ "kind": "field",
3165
+ "name": "effectiveAlt",
3166
+ "type": {
3167
+ "text": "string"
3168
+ },
3169
+ "privacy": "private",
3170
+ "readonly": true
3171
+ },
3172
+ {
3173
+ "kind": "field",
3174
+ "name": "effectiveDirection",
3175
+ "type": {
3176
+ "text": "'ltr' | 'rtl'"
3177
+ },
3178
+ "privacy": "protected",
3179
+ "description": "The effective text direction, including inherited CSS direction.",
3180
+ "readonly": true,
3181
+ "inheritedFrom": {
3182
+ "name": "LyraElement",
3183
+ "module": "src/internal/lyra-element.ts"
3184
+ }
3185
+ },
3186
+ {
3187
+ "kind": "field",
3188
+ "name": "effectiveLocale",
3189
+ "type": {
3190
+ "text": "string"
3191
+ },
3192
+ "privacy": "protected",
3193
+ "description": "The effective locale used by this component.",
3194
+ "readonly": true,
3195
+ "inheritedFrom": {
3196
+ "name": "LyraElement",
3197
+ "module": "src/internal/lyra-element.ts"
3198
+ }
3199
+ },
3200
+ {
3201
+ "kind": "field",
3202
+ "name": "hasError",
3203
+ "type": {
3204
+ "text": "boolean"
3205
+ },
3206
+ "privacy": "private",
3207
+ "default": "false"
3208
+ },
3209
+ {
3210
+ "kind": "field",
3211
+ "name": "hasLoaded",
3212
+ "type": {
3213
+ "text": "boolean"
3214
+ },
3215
+ "privacy": "private",
3216
+ "default": "false"
3217
+ },
3218
+ {
3219
+ "kind": "field",
3220
+ "name": "imageEl",
3221
+ "type": {
3222
+ "text": "HTMLImageElement | undefined"
3223
+ },
3224
+ "privacy": "private"
3225
+ },
3226
+ {
3227
+ "kind": "field",
3228
+ "name": "loadSchedulePending",
3229
+ "type": {
3230
+ "text": "boolean"
3231
+ },
3232
+ "privacy": "private",
3233
+ "default": "false",
3234
+ "inheritedFrom": {
3235
+ "name": "LyraElement",
3236
+ "module": "src/internal/lyra-element.ts"
3237
+ }
3238
+ },
3239
+ {
3240
+ "kind": "field",
3241
+ "name": "locale",
3242
+ "type": {
3243
+ "text": "string"
3244
+ },
3245
+ "default": "''",
3246
+ "description": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.",
3247
+ "attribute": "locale",
3248
+ "reflects": true,
3249
+ "inheritedFrom": {
3250
+ "name": "LyraElement",
3251
+ "module": "src/internal/lyra-element.ts"
3252
+ }
3253
+ },
3254
+ {
3255
+ "kind": "field",
3256
+ "name": "mediaQuery",
3257
+ "type": {
3258
+ "text": "MediaQueryList | undefined"
3259
+ },
3260
+ "privacy": "private"
3261
+ },
3262
+ {
3263
+ "kind": "field",
3264
+ "name": "onControlBlur",
3265
+ "privacy": "private"
3266
+ },
3267
+ {
3268
+ "kind": "field",
3269
+ "name": "onControlFocus",
3270
+ "privacy": "private"
3271
+ },
3272
+ {
3273
+ "kind": "field",
3274
+ "name": "onImageError",
3275
+ "privacy": "private"
3276
+ },
3277
+ {
3278
+ "kind": "field",
3279
+ "name": "onImageLoad",
3280
+ "privacy": "private"
3281
+ },
3282
+ {
3283
+ "kind": "field",
3284
+ "name": "onMotionPreferenceChange",
3285
+ "privacy": "private"
3286
+ },
3287
+ {
3288
+ "kind": "field",
3289
+ "name": "onToggleClick",
3290
+ "privacy": "private"
3291
+ },
3292
+ {
3293
+ "kind": "field",
3294
+ "name": "pendingLoadController",
3295
+ "type": {
3296
+ "text": "AbortController | undefined"
3297
+ },
3298
+ "privacy": "private",
3299
+ "inheritedFrom": {
3300
+ "name": "LyraElement",
3301
+ "module": "src/internal/lyra-element.ts"
3302
+ }
3303
+ },
3304
+ {
3305
+ "kind": "field",
3306
+ "name": "play",
3307
+ "type": {
3308
+ "text": "boolean"
3309
+ },
3310
+ "default": "false",
3311
+ "description": "Requests animated playback. Distinct from the read-only `playing`\neffect -- see the class doc's \"`play` vs. `playing`\" section.",
3312
+ "attribute": "play"
3313
+ },
3314
+ {
3315
+ "kind": "field",
3316
+ "name": "playButtonEl",
3317
+ "type": {
3318
+ "text": "HTMLButtonElement | undefined"
3319
+ },
3320
+ "privacy": "private"
3321
+ },
3322
+ {
3323
+ "kind": "field",
3324
+ "name": "playing",
3325
+ "type": {
3326
+ "text": "boolean"
3327
+ },
3328
+ "description": "The effective playing state after reduced-motion arbitration -- also\nreflected as a `playing` host attribute. Read-only; control playback\nvia `play`."
3329
+ },
3330
+ {
3331
+ "kind": "field",
3332
+ "name": "respectReducedMotion",
3333
+ "type": {
3334
+ "text": "boolean"
3335
+ },
3336
+ "default": "true",
3337
+ "description": "When `true` (default) and the platform reports\n`prefers-reduced-motion: reduce`, playback stays frozen and\n`[part=\"play-button\"]` is disabled regardless of `play`. Set to `false`\nto let `play` take effect even under a reduced-motion preference -- a\ndeliberate, page-author-level override.",
3338
+ "attribute": "respect-reduced-motion",
3339
+ "reflects": true
3340
+ },
3341
+ {
3342
+ "kind": "field",
3343
+ "name": "src",
3344
+ "type": {
3345
+ "text": "string"
3346
+ },
3347
+ "default": "''",
3348
+ "description": "The path to the image to load. Always re-validated against a\nsafe-scheme allowlist before use -- see the class doc.",
3349
+ "attribute": "src"
2331
3350
  },
2332
3351
  {
2333
3352
  "kind": "field",
@@ -10510,16 +11529,15 @@
10510
11529
  },
10511
11530
  {
10512
11531
  "kind": "field",
10513
- "name": "hasIcon",
11532
+ "name": "failedSrc",
10514
11533
  "type": {
10515
- "text": "boolean"
11534
+ "text": "string | undefined"
10516
11535
  },
10517
- "privacy": "private",
10518
- "default": "false"
11536
+ "privacy": "private"
10519
11537
  },
10520
11538
  {
10521
11539
  "kind": "field",
10522
- "name": "imageFailed",
11540
+ "name": "hasIcon",
10523
11541
  "type": {
10524
11542
  "text": "boolean"
10525
11543
  },
@@ -18133,6 +19151,19 @@
18133
19151
  "module": "src/components/chart/chart.class.ts"
18134
19152
  }
18135
19153
  },
19154
+ {
19155
+ "kind": "field",
19156
+ "name": "chartAreaUpdateQueued",
19157
+ "type": {
19158
+ "text": "boolean"
19159
+ },
19160
+ "privacy": "private",
19161
+ "default": "false",
19162
+ "inheritedFrom": {
19163
+ "name": "LyraChart",
19164
+ "module": "src/components/chart/chart.class.ts"
19165
+ }
19166
+ },
18136
19167
  {
18137
19168
  "kind": "field",
18138
19169
  "name": "chartJsModule",
@@ -20291,6 +21322,19 @@
20291
21322
  "module": "src/components/chart/chart.class.ts"
20292
21323
  }
20293
21324
  },
21325
+ {
21326
+ "kind": "field",
21327
+ "name": "chartAreaUpdateQueued",
21328
+ "type": {
21329
+ "text": "boolean"
21330
+ },
21331
+ "privacy": "private",
21332
+ "default": "false",
21333
+ "inheritedFrom": {
21334
+ "name": "LyraChart",
21335
+ "module": "src/components/chart/chart.class.ts"
21336
+ }
21337
+ },
20294
21338
  {
20295
21339
  "kind": "field",
20296
21340
  "name": "chartJsModule",
@@ -21870,6 +22914,15 @@
21870
22914
  "description": "The current Chart.js chart-area geometry in canvas-local coordinates.",
21871
22915
  "readonly": true
21872
22916
  },
22917
+ {
22918
+ "kind": "field",
22919
+ "name": "chartAreaUpdateQueued",
22920
+ "type": {
22921
+ "text": "boolean"
22922
+ },
22923
+ "privacy": "private",
22924
+ "default": "false"
22925
+ },
21873
22926
  {
21874
22927
  "kind": "field",
21875
22928
  "name": "chartJsModule",
@@ -23066,6 +24119,19 @@
23066
24119
  "module": "src/components/chart/chart.class.ts"
23067
24120
  }
23068
24121
  },
24122
+ {
24123
+ "kind": "field",
24124
+ "name": "chartAreaUpdateQueued",
24125
+ "type": {
24126
+ "text": "boolean"
24127
+ },
24128
+ "privacy": "private",
24129
+ "default": "false",
24130
+ "inheritedFrom": {
24131
+ "name": "LyraChart",
24132
+ "module": "src/components/chart/chart.class.ts"
24133
+ }
24134
+ },
23069
24135
  {
23070
24136
  "kind": "field",
23071
24137
  "name": "chartJsModule",
@@ -24645,6 +25711,19 @@
24645
25711
  "module": "src/components/chart/chart.class.ts"
24646
25712
  }
24647
25713
  },
25714
+ {
25715
+ "kind": "field",
25716
+ "name": "chartAreaUpdateQueued",
25717
+ "type": {
25718
+ "text": "boolean"
25719
+ },
25720
+ "privacy": "private",
25721
+ "default": "false",
25722
+ "inheritedFrom": {
25723
+ "name": "LyraChart",
25724
+ "module": "src/components/chart/chart.class.ts"
25725
+ }
25726
+ },
24648
25727
  {
24649
25728
  "kind": "field",
24650
25729
  "name": "chartJsModule",
@@ -26193,6 +27272,19 @@
26193
27272
  "module": "src/components/chart/chart.class.ts"
26194
27273
  }
26195
27274
  },
27275
+ {
27276
+ "kind": "field",
27277
+ "name": "chartAreaUpdateQueued",
27278
+ "type": {
27279
+ "text": "boolean"
27280
+ },
27281
+ "privacy": "private",
27282
+ "default": "false",
27283
+ "inheritedFrom": {
27284
+ "name": "LyraChart",
27285
+ "module": "src/components/chart/chart.class.ts"
27286
+ }
27287
+ },
26196
27288
  {
26197
27289
  "kind": "field",
26198
27290
  "name": "chartJsModule",
@@ -29001,6 +30093,19 @@
29001
30093
  "module": "src/components/chart/chart.class.ts"
29002
30094
  }
29003
30095
  },
30096
+ {
30097
+ "kind": "field",
30098
+ "name": "chartAreaUpdateQueued",
30099
+ "type": {
30100
+ "text": "boolean"
30101
+ },
30102
+ "privacy": "private",
30103
+ "default": "false",
30104
+ "inheritedFrom": {
30105
+ "name": "LyraChart",
30106
+ "module": "src/components/chart/chart.class.ts"
30107
+ }
30108
+ },
29004
30109
  {
29005
30110
  "kind": "field",
29006
30111
  "name": "chartJsModule",
@@ -30489,6 +31594,19 @@
30489
31594
  "module": "src/components/chart/chart.class.ts"
30490
31595
  }
30491
31596
  },
31597
+ {
31598
+ "kind": "field",
31599
+ "name": "chartAreaUpdateQueued",
31600
+ "type": {
31601
+ "text": "boolean"
31602
+ },
31603
+ "privacy": "private",
31604
+ "default": "false",
31605
+ "inheritedFrom": {
31606
+ "name": "LyraChart",
31607
+ "module": "src/components/chart/chart.class.ts"
31608
+ }
31609
+ },
30492
31610
  {
30493
31611
  "kind": "field",
30494
31612
  "name": "chartJsModule",
@@ -31977,6 +33095,19 @@
31977
33095
  "module": "src/components/chart/chart.class.ts"
31978
33096
  }
31979
33097
  },
33098
+ {
33099
+ "kind": "field",
33100
+ "name": "chartAreaUpdateQueued",
33101
+ "type": {
33102
+ "text": "boolean"
33103
+ },
33104
+ "privacy": "private",
33105
+ "default": "false",
33106
+ "inheritedFrom": {
33107
+ "name": "LyraChart",
33108
+ "module": "src/components/chart/chart.class.ts"
33109
+ }
33110
+ },
31980
33111
  {
31981
33112
  "kind": "field",
31982
33113
  "name": "chartJsModule",
@@ -33465,6 +34596,19 @@
33465
34596
  "module": "src/components/chart/chart.class.ts"
33466
34597
  }
33467
34598
  },
34599
+ {
34600
+ "kind": "field",
34601
+ "name": "chartAreaUpdateQueued",
34602
+ "type": {
34603
+ "text": "boolean"
34604
+ },
34605
+ "privacy": "private",
34606
+ "default": "false",
34607
+ "inheritedFrom": {
34608
+ "name": "LyraChart",
34609
+ "module": "src/components/chart/chart.class.ts"
34610
+ }
34611
+ },
33468
34612
  {
33469
34613
  "kind": "field",
33470
34614
  "name": "chartJsModule",
@@ -36191,6 +37335,17 @@
36191
37335
  "module": "src/internal/lyra-element.ts"
36192
37336
  }
36193
37337
  },
37338
+ {
37339
+ "kind": "field",
37340
+ "name": "messageId",
37341
+ "type": {
37342
+ "text": "string"
37343
+ },
37344
+ "default": "''",
37345
+ "description": "Optional stable application-defined identifier for this message. Included in `lr-retry`\ndetail when set.",
37346
+ "attribute": "message-id",
37347
+ "reflects": true
37348
+ },
36194
37349
  {
36195
37350
  "kind": "field",
36196
37351
  "name": "normalizedTimestamp",
@@ -36555,7 +37710,7 @@
36555
37710
  "name": "lr-collapse-toggle"
36556
37711
  },
36557
37712
  {
36558
- "description": "Fired by the built-in retry button, only rendered when `status=\"failed\"` and the `failure` slot is empty. A host using the `failure` slot owns its own retry control and is not required to use this event at all — but nothing stops that control from dispatching its own `new CustomEvent('lr-retry', { bubbles: true, composed: true })` to stay consistent with the same event contract a listener further up a conversation surface already relies on for every other message.",
37713
+ "description": "Fired by the built-in retry button, only rendered when `status=\"failed\"` and the `failure` slot is empty. `detail: { messageId?: string }` includes this element's stable `messageId` when supplied, so a conversation surface can identify the message without a closure around each row. A host using the `failure` slot owns its own retry control and is not required to use this event at all — but nothing stops that control from dispatching its own `new CustomEvent('lr-retry', { bubbles: true, composed: true })` to stay consistent with the same event contract a listener further up a conversation surface already relies on for every other message.",
36559
37714
  "name": "lr-retry"
36560
37715
  }
36561
37716
  ],
@@ -36618,6 +37773,15 @@
36618
37773
  "module": "src/internal/lyra-element.ts"
36619
37774
  }
36620
37775
  },
37776
+ {
37777
+ "name": "message-id",
37778
+ "type": {
37779
+ "text": "string"
37780
+ },
37781
+ "default": "''",
37782
+ "description": "Optional stable application-defined identifier for this message. Included in `lr-retry`\ndetail when set.",
37783
+ "fieldName": "messageId"
37784
+ },
36621
37785
  {
36622
37786
  "name": "status",
36623
37787
  "type": {
@@ -53144,10 +54308,18 @@
53144
54308
  "description": "Overflow/icon-button controls (for example a pin/delete button or a `lr-menu` trigger) rendered at the trailing edge of the row.",
53145
54309
  "name": "actions"
53146
54310
  },
54311
+ {
54312
+ "description": "Replaces the built-in title, excerpt, and meta content area with host-supplied non-interactive row content.",
54313
+ "name": "content"
54314
+ },
53147
54315
  {
53148
54316
  "description": "Full override of the excerpt presentation (e.g. a search-hit snippet with `<mark>` highlighting). Wins over the `excerpt` property whenever it has assigned content, even if `excerpt` is also set. Only non-focusable content should be slotted here — see the `excerpt` property's own doc for why.",
53149
54317
  "name": "excerpt"
53150
54318
  },
54319
+ {
54320
+ "description": "Non-interactive leading content such as an avatar, purpose icon, or status indicator. It is rendered inside the selectable region before the title/excerpt content.",
54321
+ "name": "leading"
54322
+ },
53151
54323
  {
53152
54324
  "description": "Small, non-focusable structured fields for the row (e.g. a day label, cost, request count) rendered below the title/excerpt. Entirely app-supplied; this component computes none of it. Only non-focusable content should be slotted here, for the same `nested-interactive` reason as `excerpt`.",
53153
54325
  "name": "meta"
@@ -53272,6 +54444,15 @@
53272
54444
  "privacy": "private",
53273
54445
  "default": "false"
53274
54446
  },
54447
+ {
54448
+ "kind": "field",
54449
+ "name": "hasContentSlot",
54450
+ "type": {
54451
+ "text": "boolean"
54452
+ },
54453
+ "privacy": "private",
54454
+ "default": "false"
54455
+ },
53275
54456
  {
53276
54457
  "kind": "field",
53277
54458
  "name": "hasExcerptSlot",
@@ -53281,6 +54462,15 @@
53281
54462
  "privacy": "private",
53282
54463
  "default": "false"
53283
54464
  },
54465
+ {
54466
+ "kind": "field",
54467
+ "name": "hasLeadingSlot",
54468
+ "type": {
54469
+ "text": "boolean"
54470
+ },
54471
+ "privacy": "private",
54472
+ "default": "false"
54473
+ },
53284
54474
  {
53285
54475
  "kind": "field",
53286
54476
  "name": "hasMetaSlot",
@@ -53332,11 +54522,21 @@
53332
54522
  "name": "onActionsSlotChange",
53333
54523
  "privacy": "private"
53334
54524
  },
54525
+ {
54526
+ "kind": "field",
54527
+ "name": "onContentSlotChange",
54528
+ "privacy": "private"
54529
+ },
53335
54530
  {
53336
54531
  "kind": "field",
53337
54532
  "name": "onExcerptSlotChange",
53338
54533
  "privacy": "private"
53339
54534
  },
54535
+ {
54536
+ "kind": "field",
54537
+ "name": "onLeadingSlotChange",
54538
+ "privacy": "private"
54539
+ },
53340
54540
  {
53341
54541
  "kind": "field",
53342
54542
  "name": "onMetaSlotChange",
@@ -62980,7 +64180,7 @@
62980
64180
  "name": "copy-button"
62981
64181
  },
62982
64182
  {
62983
- "description": "A single line. Carries `data-type=\"equal\"|\"add\"|\"remove\"|\"empty\"` (`\"empty\"` is an unbalanced-replace placeholder cell in `layout=\"split\"` and never carries a `+`/`-` prefix).",
64183
+ "description": "A single line. Carries `data-type=\"equal\"|\"add\"|\"remove\"|\"empty\"|\"fold\"` (`\"empty\"` is an unbalanced-replace placeholder cell in `layout=\"split\"` and never carries a `+`/`-` prefix; `\"fold\"` is the collapsed-unchanged-lines marker `contextLines` produces).",
62984
64184
  "name": "line"
62985
64185
  },
62986
64186
  {
@@ -62989,6 +64189,15 @@
62989
64189
  }
62990
64190
  ],
62991
64191
  "members": [
64192
+ {
64193
+ "kind": "field",
64194
+ "name": "contextLines",
64195
+ "type": {
64196
+ "text": "number | undefined"
64197
+ },
64198
+ "description": "How many unchanged lines to keep visible immediately before/after each change. Default\n`undefined` renders every line unconditionally, exactly like before this property existed. Set\nto a finite number `>= 0` to collapse a longer run of unchanged lines behind a single fold\nmarker reporting how many lines it hides -- the same context-window convention unified diffs\nand `git diff`'s `-U<n>` use. A negative or non-finite value is treated as unset (no folding).",
64199
+ "attribute": "context-lines"
64200
+ },
62992
64201
  {
62993
64202
  "kind": "field",
62994
64203
  "name": "copyTimeoutId",
@@ -63276,6 +64485,17 @@
63276
64485
  "module": "src/internal/lyra-element.ts"
63277
64486
  }
63278
64487
  },
64488
+ {
64489
+ "kind": "method",
64490
+ "name": "computeFolds",
64491
+ "privacy": "private",
64492
+ "return": {
64493
+ "type": {
64494
+ "text": "{ visible: Set<DiffOp>; foldBefore: Map<DiffOp, number>; trailingFold: number }"
64495
+ }
64496
+ },
64497
+ "description": "Computes which `equal` ops a fold marker should hide, keyed by object identity (not array\nindex) so the same result works for both `renderUnified()`'s flat op sequence and\n`renderSplit()`'s `pairOpsForSplit()` rows -- an equal op's `DiffOp` object is the exact same\nreference in both places. `foldBefore` maps the first visible op *after* a hidden run to how\nmany lines that run hid (the marker renders immediately before that op); a run hidden all the\nway to the end of the diff has no \"next op\" to key off, so its count surfaces separately as\n`trailingFold`. Only maximal `equal` runs are ever folded -- `add`/`remove` ops are always\nvisible. A run that is both the very first and very last thing in the diff (i.e. `oldText` and\n`newText` are identical) is never folded: there is no adjacent change to give context around."
64498
+ },
63279
64499
  {
63280
64500
  "kind": "method",
63281
64501
  "name": "emit",
@@ -63313,6 +64533,24 @@
63313
64533
  "module": "src/internal/lyra-element.ts"
63314
64534
  }
63315
64535
  },
64536
+ {
64537
+ "kind": "method",
64538
+ "name": "foldMarker",
64539
+ "privacy": "private",
64540
+ "return": {
64541
+ "type": {
64542
+ "text": "TemplateResult"
64543
+ }
64544
+ },
64545
+ "parameters": [
64546
+ {
64547
+ "name": "count",
64548
+ "type": {
64549
+ "text": "number"
64550
+ }
64551
+ }
64552
+ ]
64553
+ },
63316
64554
  {
63317
64555
  "kind": "method",
63318
64556
  "name": "localize",
@@ -63506,6 +64744,14 @@
63506
64744
  }
63507
64745
  ],
63508
64746
  "attributes": [
64747
+ {
64748
+ "name": "context-lines",
64749
+ "type": {
64750
+ "text": "number | undefined"
64751
+ },
64752
+ "description": "How many unchanged lines to keep visible immediately before/after each change. Default\n`undefined` renders every line unconditionally, exactly like before this property existed. Set\nto a finite number `>= 0` to collapse a longer run of unchanged lines behind a single fold\nmarker reporting how many lines it hides -- the same context-window convention unified diffs\nand `git diff`'s `-U<n>` use. A negative or non-finite value is treated as unset (no folding).",
64753
+ "fieldName": "contextLines"
64754
+ },
63509
64755
  {
63510
64756
  "name": "copyable",
63511
64757
  "type": {
@@ -72025,7 +73271,7 @@
72025
73271
  "parameters": [
72026
73272
  {
72027
73273
  "name": "importData",
72028
- "default": "() =>\n import('emoji-picker-element-data/en/emojibase/data.json') as Promise<OptionalPeerApi>",
73274
+ "default": "() =>\n import('emoji-picker-element-data/en/emojibase/data.json', { with: { type: 'json' } }) as Promise<OptionalPeerApi>",
72029
73275
  "type": {
72030
73276
  "text": "() => Promise<OptionalPeerApi>"
72031
73277
  }
@@ -72069,7 +73315,7 @@
72069
73315
  "declarations": [
72070
73316
  {
72071
73317
  "kind": "class",
72072
- "description": "`<lr-emoji-picker>` — a searchable, keyboard-navigable, form-associated emoji picker. In the\nsame \"zero/optional-peer dependency\" spirit as `<lr-lite-chart>`/`<lr-heatmap>`: `groups` is\nfully consumer-suppliable (this component ships no emoji data of its own), with an *optional*\nconvenience auto-loader for a default set — see `emoji-data-loader.ts` and the class doc there for\nexactly what that covers.\n\nKeyboard model: the grid is a roving-tabindex listbox (a single Tab stop — only the active emoji\nis tabbable). Arrow keys move the active option (Left/Right follow reading direction and swap\nunder RTL; Up/Down move by one visual row, measured from the live wrap layout), Home/End jump to\nthe first/last option, and Enter/Space picks. The search input doubles as a `role=\"combobox\"`\nover the same listbox: the arrow keys and Enter also work there while focus stays in the input,\nwith `aria-activedescendant` tracking the active option.",
73318
+ "description": "`<lr-emoji-picker>` — a searchable, keyboard-navigable, form-associated emoji picker. In the\nsame \"zero/optional-peer dependency\" spirit as `<lr-lite-chart>`/`<lr-heatmap>`: `groups` is\nfully consumer-suppliable (this component ships no emoji data of its own), with an *optional*\nconvenience auto-loader for a default set — see `emoji-data-loader.ts` and the class doc there for\nexactly what that covers.\n\nKeyboard model: the grid is a roving-tabindex listbox (a single Tab stop — only the active emoji\nis tabbable). Arrow keys move the active option (Left/Right follow reading direction and swap\nunder RTL; Up/Down move by one visual row, measured from the live wrap layout), Home/End jump to\nthe first/last option, and Enter/Space picks. The search input doubles as a `role=\"combobox\"`\nover the same listbox: the arrow keys and Enter also work there while focus stays in the input,\nwith `aria-activedescendant` tracking the active option. Large data sets automatically window\ntheir visible rows so scrolling does not create one button per supplied emoji in the DOM.",
72073
73319
  "name": "LyraEmojiPicker",
72074
73320
  "cssParts": [
72075
73321
  {
@@ -72181,6 +73427,14 @@
72181
73427
  "privacy": "private",
72182
73428
  "readonly": true
72183
73429
  },
73430
+ {
73431
+ "kind": "field",
73432
+ "name": "gridResizeObserver",
73433
+ "type": {
73434
+ "text": "ResizeObserver | undefined"
73435
+ },
73436
+ "privacy": "private"
73437
+ },
72184
73438
  {
72185
73439
  "kind": "field",
72186
73440
  "name": "groups",
@@ -72197,6 +73451,15 @@
72197
73451
  "readonly": true,
72198
73452
  "default": "new WeakMap<EmojiPickerItem, string>()"
72199
73453
  },
73454
+ {
73455
+ "kind": "field",
73456
+ "name": "isVirtualized",
73457
+ "type": {
73458
+ "text": "boolean"
73459
+ },
73460
+ "privacy": "private",
73461
+ "readonly": true
73462
+ },
72200
73463
  {
72201
73464
  "kind": "field",
72202
73465
  "name": "loadGroups",
@@ -72235,11 +73498,33 @@
72235
73498
  "module": "src/internal/lyra-element.ts"
72236
73499
  }
72237
73500
  },
73501
+ {
73502
+ "kind": "field",
73503
+ "name": "observedGrid",
73504
+ "type": {
73505
+ "text": "HTMLElement | undefined"
73506
+ },
73507
+ "privacy": "private"
73508
+ },
73509
+ {
73510
+ "kind": "field",
73511
+ "name": "observedGridVirtualized",
73512
+ "type": {
73513
+ "text": "boolean"
73514
+ },
73515
+ "privacy": "private",
73516
+ "default": "false"
73517
+ },
72238
73518
  {
72239
73519
  "kind": "field",
72240
73520
  "name": "onGridFocusIn",
72241
73521
  "privacy": "private"
72242
73522
  },
73523
+ {
73524
+ "kind": "field",
73525
+ "name": "onGridScroll",
73526
+ "privacy": "private"
73527
+ },
72243
73528
  {
72244
73529
  "kind": "field",
72245
73530
  "name": "onNavigationKeyDown",
@@ -72304,6 +73589,24 @@
72304
73589
  "module": "src/internal/lyra-element.ts"
72305
73590
  }
72306
73591
  },
73592
+ {
73593
+ "kind": "field",
73594
+ "name": "virtualScrollRaf",
73595
+ "type": {
73596
+ "text": "number | undefined"
73597
+ },
73598
+ "privacy": "private"
73599
+ },
73600
+ {
73601
+ "kind": "field",
73602
+ "name": "virtualScrollTop",
73603
+ "type": {
73604
+ "text": "number"
73605
+ },
73606
+ "privacy": "private",
73607
+ "default": "0",
73608
+ "description": "The large-data path keeps only visible rows in the DOM. The regular path remains unchanged\nfor small sets so consumers keep the simple grouped light-DOM shape they already receive."
73609
+ },
72307
73610
  {
72308
73611
  "kind": "method",
72309
73612
  "name": "addEventListener",
@@ -72364,6 +73667,30 @@
72364
73667
  },
72365
73668
  "description": "Options in the first rendered row. Measured from live layout at call time because the\nflex-wrap column count is fluid (container width, emoji font metrics)."
72366
73669
  },
73670
+ {
73671
+ "kind": "method",
73672
+ "name": "cssPixelValue",
73673
+ "privacy": "private",
73674
+ "return": {
73675
+ "type": {
73676
+ "text": "number"
73677
+ }
73678
+ },
73679
+ "parameters": [
73680
+ {
73681
+ "name": "name",
73682
+ "type": {
73683
+ "text": "string"
73684
+ }
73685
+ },
73686
+ {
73687
+ "name": "fallback",
73688
+ "type": {
73689
+ "text": "number"
73690
+ }
73691
+ }
73692
+ ]
73693
+ },
72367
73694
  {
72368
73695
  "kind": "method",
72369
73696
  "name": "emit",
@@ -72518,6 +73845,46 @@
72518
73845
  "module": "src/internal/lyra-element.ts"
72519
73846
  }
72520
73847
  },
73848
+ {
73849
+ "kind": "method",
73850
+ "name": "renderEmojiButton",
73851
+ "privacy": "private",
73852
+ "return": {
73853
+ "type": {
73854
+ "text": "TemplateResult"
73855
+ }
73856
+ },
73857
+ "parameters": [
73858
+ {
73859
+ "name": "item",
73860
+ "type": {
73861
+ "text": "EmojiPickerItem"
73862
+ }
73863
+ },
73864
+ {
73865
+ "name": "itemIndex",
73866
+ "type": {
73867
+ "text": "number"
73868
+ }
73869
+ },
73870
+ {
73871
+ "name": "total",
73872
+ "type": {
73873
+ "text": "number"
73874
+ }
73875
+ }
73876
+ ]
73877
+ },
73878
+ {
73879
+ "kind": "method",
73880
+ "name": "renderVirtualRows",
73881
+ "privacy": "private",
73882
+ "return": {
73883
+ "type": {
73884
+ "text": "TemplateResult"
73885
+ }
73886
+ }
73887
+ },
72521
73888
  {
72522
73889
  "kind": "method",
72523
73890
  "name": "scheduleAfterUpdate",
@@ -72565,6 +73932,36 @@
72565
73932
  }
72566
73933
  ],
72567
73934
  "description": "Moves the active option (clamped), updating only the affected buttons plus the combobox's\n`aria-activedescendant` — no re-render. `focusTarget` distinguishes the grid's roving-focus\nidiom (focus follows the active option) from the search input's combobox idiom (focus stays\nin the input)."
73935
+ },
73936
+ {
73937
+ "kind": "method",
73938
+ "name": "syncGridObserver",
73939
+ "privacy": "private",
73940
+ "return": {
73941
+ "type": {
73942
+ "text": "void"
73943
+ }
73944
+ }
73945
+ },
73946
+ {
73947
+ "kind": "method",
73948
+ "name": "virtualRowHeight",
73949
+ "privacy": "private",
73950
+ "return": {
73951
+ "type": {
73952
+ "text": "number"
73953
+ }
73954
+ }
73955
+ },
73956
+ {
73957
+ "kind": "method",
73958
+ "name": "virtualRows",
73959
+ "privacy": "private",
73960
+ "return": {
73961
+ "type": {
73962
+ "text": "VirtualEmojiRow[]"
73963
+ }
73964
+ }
72568
73965
  }
72569
73966
  ],
72570
73967
  "events": [
@@ -95783,6 +97180,16 @@
95783
97180
  "default": "new Map<string, string>()",
95784
97181
  "description": "Cache of resolved colors for the current draw pass, cleared at the top\nof drawCalendar()/drawMatrix() so a theme change is always picked up on\nthe very next full redraw, while repeated identical cellColor() outputs\nwithin the same pass resolve only once."
95785
97182
  },
97183
+ {
97184
+ "kind": "field",
97185
+ "name": "canvasHasContent",
97186
+ "type": {
97187
+ "text": "boolean"
97188
+ },
97189
+ "privacy": "private",
97190
+ "default": "false",
97191
+ "description": "Set after a complete canvas pass. Focus movement can then repaint only the old/new cell\nrectangles instead of clearing and repainting an entire dense heatmap."
97192
+ },
95786
97193
  {
95787
97194
  "kind": "field",
95788
97195
  "name": "cellColor",
@@ -97029,6 +98436,198 @@
97029
98436
  }
97030
98437
  ]
97031
98438
  },
98439
+ {
98440
+ "kind": "method",
98441
+ "name": "paintCalendarCell",
98442
+ "privacy": "private",
98443
+ "return": {
98444
+ "type": {
98445
+ "text": "void"
98446
+ }
98447
+ },
98448
+ "parameters": [
98449
+ {
98450
+ "name": "ctx",
98451
+ "type": {
98452
+ "text": "CanvasRenderingContext2D"
98453
+ }
98454
+ },
98455
+ {
98456
+ "name": "week",
98457
+ "type": {
98458
+ "text": "number"
98459
+ }
98460
+ },
98461
+ {
98462
+ "name": "weekday",
98463
+ "type": {
98464
+ "text": "number"
98465
+ }
98466
+ },
98467
+ {
98468
+ "name": "cellSize",
98469
+ "type": {
98470
+ "text": "number"
98471
+ }
98472
+ },
98473
+ {
98474
+ "name": "cs",
98475
+ "type": {
98476
+ "text": "CSSStyleDeclaration"
98477
+ }
98478
+ },
98479
+ {
98480
+ "name": "ramp",
98481
+ "type": {
98482
+ "text": "string[]"
98483
+ }
98484
+ },
98485
+ {
98486
+ "name": "noDataFill",
98487
+ "type": {
98488
+ "text": "string"
98489
+ }
98490
+ }
98491
+ ]
98492
+ },
98493
+ {
98494
+ "kind": "method",
98495
+ "name": "paintCalendarFocusOverlays",
98496
+ "privacy": "private",
98497
+ "return": {
98498
+ "type": {
98499
+ "text": "void"
98500
+ }
98501
+ },
98502
+ "parameters": [
98503
+ {
98504
+ "name": "ctx",
98505
+ "type": {
98506
+ "text": "CanvasRenderingContext2D"
98507
+ }
98508
+ },
98509
+ {
98510
+ "name": "week",
98511
+ "type": {
98512
+ "text": "number"
98513
+ }
98514
+ },
98515
+ {
98516
+ "name": "weekday",
98517
+ "type": {
98518
+ "text": "number"
98519
+ }
98520
+ },
98521
+ {
98522
+ "name": "cellSize",
98523
+ "type": {
98524
+ "text": "number"
98525
+ }
98526
+ },
98527
+ {
98528
+ "name": "cs",
98529
+ "type": {
98530
+ "text": "CSSStyleDeclaration"
98531
+ }
98532
+ }
98533
+ ]
98534
+ },
98535
+ {
98536
+ "kind": "method",
98537
+ "name": "paintMatrixCell",
98538
+ "privacy": "private",
98539
+ "return": {
98540
+ "type": {
98541
+ "text": "void"
98542
+ }
98543
+ },
98544
+ "parameters": [
98545
+ {
98546
+ "name": "ctx",
98547
+ "type": {
98548
+ "text": "CanvasRenderingContext2D"
98549
+ }
98550
+ },
98551
+ {
98552
+ "name": "row",
98553
+ "type": {
98554
+ "text": "number"
98555
+ }
98556
+ },
98557
+ {
98558
+ "name": "col",
98559
+ "type": {
98560
+ "text": "number"
98561
+ }
98562
+ },
98563
+ {
98564
+ "name": "cellSize",
98565
+ "type": {
98566
+ "text": "number"
98567
+ }
98568
+ },
98569
+ {
98570
+ "name": "cs",
98571
+ "type": {
98572
+ "text": "CSSStyleDeclaration"
98573
+ }
98574
+ },
98575
+ {
98576
+ "name": "rampData",
98577
+ "type": {
98578
+ "text": "ReturnType<LyraHeatmap['colorRamp']>"
98579
+ }
98580
+ },
98581
+ {
98582
+ "name": "noDataFill",
98583
+ "type": {
98584
+ "text": "string"
98585
+ }
98586
+ }
98587
+ ]
98588
+ },
98589
+ {
98590
+ "kind": "method",
98591
+ "name": "paintMatrixFocusOverlays",
98592
+ "privacy": "private",
98593
+ "return": {
98594
+ "type": {
98595
+ "text": "void"
98596
+ }
98597
+ },
98598
+ "parameters": [
98599
+ {
98600
+ "name": "ctx",
98601
+ "type": {
98602
+ "text": "CanvasRenderingContext2D"
98603
+ }
98604
+ },
98605
+ {
98606
+ "name": "row",
98607
+ "type": {
98608
+ "text": "number"
98609
+ }
98610
+ },
98611
+ {
98612
+ "name": "col",
98613
+ "type": {
98614
+ "text": "number"
98615
+ }
98616
+ },
98617
+ {
98618
+ "name": "cellSize",
98619
+ "type": {
98620
+ "text": "number"
98621
+ }
98622
+ },
98623
+ {
98624
+ "name": "cs",
98625
+ "type": {
98626
+ "text": "CSSStyleDeclaration"
98627
+ }
98628
+ }
98629
+ ]
98630
+ },
97032
98631
  {
97033
98632
  "kind": "method",
97034
98633
  "name": "refreshTheme",
@@ -97083,6 +98682,61 @@
97083
98682
  }
97084
98683
  }
97085
98684
  },
98685
+ {
98686
+ "kind": "method",
98687
+ "name": "repaintCalendarFocusCell",
98688
+ "privacy": "private",
98689
+ "return": {
98690
+ "type": {
98691
+ "text": "void"
98692
+ }
98693
+ },
98694
+ "parameters": [
98695
+ {
98696
+ "name": "pos",
98697
+ "type": {
98698
+ "text": "CalendarCellPos | null"
98699
+ }
98700
+ }
98701
+ ]
98702
+ },
98703
+ {
98704
+ "kind": "method",
98705
+ "name": "repaintFocusRing",
98706
+ "privacy": "private",
98707
+ "return": {
98708
+ "type": {
98709
+ "text": "boolean"
98710
+ }
98711
+ },
98712
+ "parameters": [
98713
+ {
98714
+ "name": "previous",
98715
+ "type": {
98716
+ "text": "CellPos | null | undefined"
98717
+ }
98718
+ }
98719
+ ],
98720
+ "description": "Repaints the old and new focus-ring cells after keyboard/click navigation. The underlying\ncell fill plus annotation/selection rings are restored before the new focus ring is stroked,\nso clearing a dirty rectangle never erases persistent data. Returns false when a complete draw\nis still required (for example before the first canvas pass or after a mode change)."
98721
+ },
98722
+ {
98723
+ "kind": "method",
98724
+ "name": "repaintMatrixFocusCell",
98725
+ "privacy": "private",
98726
+ "return": {
98727
+ "type": {
98728
+ "text": "void"
98729
+ }
98730
+ },
98731
+ "parameters": [
98732
+ {
98733
+ "name": "pos",
98734
+ "type": {
98735
+ "text": "MatrixCellPos | null"
98736
+ }
98737
+ }
98738
+ ]
98739
+ },
97086
98740
  {
97087
98741
  "kind": "method",
97088
98742
  "name": "resolveCanvasColor",
@@ -112132,10 +113786,19 @@
112132
113786
  "text": "boolean"
112133
113787
  },
112134
113788
  "default": "false",
112135
- "description": "Signals that `content` is still arriving incrementally. Content changes\ncontinue to render immediately; while this is `true`, the host remains\n`aria-busy=\"true\"` so assistive technology knows the rendered document\nis not final. Set it back to `false` with the final content update.\nReflects so a consumer can also target `lr-markdown[streaming]`.",
113789
+ "description": "Signals that `content` is still arriving incrementally. Content changes\nare coalesced to at most one parse per animation frame while this is\n`true`; the host remains `aria-busy=\"true\"` so assistive technology knows\nthe rendered document is not final. Set it back to `false` with the final\ncontent update to flush the latest content immediately.\nReflects so a consumer can also target `lr-markdown[streaming]`.",
112136
113790
  "attribute": "streaming",
112137
113791
  "reflects": true
112138
113792
  },
113793
+ {
113794
+ "kind": "field",
113795
+ "name": "streamingRenderRaf",
113796
+ "type": {
113797
+ "text": "number | undefined"
113798
+ },
113799
+ "privacy": "private",
113800
+ "description": "Coalesces rapid streaming content assignments so a token burst cannot start one full\nMarkdown parse per assignment. The final `streaming = false` update cancels this frame and\nrenders synchronously, so consumers never lose the last chunk."
113801
+ },
112139
113802
  {
112140
113803
  "kind": "field",
112141
113804
  "name": "strings",
@@ -112412,6 +114075,16 @@
112412
114075
  },
112413
114076
  "description": "A document-ordered, flattened heading outline -- computed on every parse regardless of\n`headingAnchors` (see that property's own doc). A caller building a table of contents can rely\non this even while `heading-anchors` is off."
112414
114077
  },
114078
+ {
114079
+ "kind": "method",
114080
+ "name": "getUpdateComplete",
114081
+ "privacy": "protected",
114082
+ "return": {
114083
+ "type": {
114084
+ "text": "Promise<boolean>"
114085
+ }
114086
+ }
114087
+ },
112415
114088
  {
112416
114089
  "kind": "method",
112417
114090
  "name": "highlightPending",
@@ -112642,6 +114315,16 @@
112642
114315
  "module": "src/internal/lyra-element.ts"
112643
114316
  }
112644
114317
  },
114318
+ {
114319
+ "kind": "method",
114320
+ "name": "scheduleStreamingRender",
114321
+ "privacy": "private",
114322
+ "return": {
114323
+ "type": {
114324
+ "text": "void"
114325
+ }
114326
+ }
114327
+ },
112645
114328
  {
112646
114329
  "kind": "method",
112647
114330
  "name": "setCachedHighlight",
@@ -112808,7 +114491,7 @@
112808
114491
  "text": "boolean"
112809
114492
  },
112810
114493
  "default": "false",
112811
- "description": "Signals that `content` is still arriving incrementally. Content changes\ncontinue to render immediately; while this is `true`, the host remains\n`aria-busy=\"true\"` so assistive technology knows the rendered document\nis not final. Set it back to `false` with the final content update.\nReflects so a consumer can also target `lr-markdown[streaming]`.",
114494
+ "description": "Signals that `content` is still arriving incrementally. Content changes\nare coalesced to at most one parse per animation frame while this is\n`true`; the host remains `aria-busy=\"true\"` so assistive technology knows\nthe rendered document is not final. Set it back to `false` with the final\ncontent update to flush the latest content immediately.\nReflects so a consumer can also target `lr-markdown[streaming]`.",
112812
114495
  "fieldName": "streaming"
112813
114496
  }
112814
114497
  ],
@@ -113315,10 +114998,19 @@
113315
114998
  "text": "boolean"
113316
114999
  },
113317
115000
  "default": "false",
113318
- "description": "Signals that `content` is still arriving incrementally. Content changes\ncontinue to render immediately; while this is `true`, the host remains\n`aria-busy=\"true\"` so assistive technology knows the rendered document\nis not final. Set it back to `false` with the final content update.\nReflects so a consumer can also target `lr-markdown[streaming]`.",
115001
+ "description": "Signals that `content` is still arriving incrementally. Content changes\nare coalesced to at most one parse per animation frame while this is\n`true`; the host remains `aria-busy=\"true\"` so assistive technology knows\nthe rendered document is not final. Set it back to `false` with the final\ncontent update to flush the latest content immediately.\nReflects so a consumer can also target `lr-markdown[streaming]`.",
113319
115002
  "attribute": "streaming",
113320
115003
  "reflects": true
113321
115004
  },
115005
+ {
115006
+ "kind": "field",
115007
+ "name": "streamingRenderRaf",
115008
+ "type": {
115009
+ "text": "number | undefined"
115010
+ },
115011
+ "privacy": "private",
115012
+ "description": "Coalesces rapid streaming content assignments so a token burst cannot start one full\nMarkdown parse per assignment. The final `streaming = false` update cancels this frame and\nrenders synchronously, so consumers never lose the last chunk."
115013
+ },
113322
115014
  {
113323
115015
  "kind": "field",
113324
115016
  "name": "strings",
@@ -113595,6 +115287,16 @@
113595
115287
  },
113596
115288
  "description": "A document-ordered, flattened heading outline -- computed on every parse regardless of\n`headingAnchors` (see that property's own doc). A caller building a table of contents can rely\non this even while `heading-anchors` is off."
113597
115289
  },
115290
+ {
115291
+ "kind": "method",
115292
+ "name": "getUpdateComplete",
115293
+ "privacy": "protected",
115294
+ "return": {
115295
+ "type": {
115296
+ "text": "Promise<boolean>"
115297
+ }
115298
+ }
115299
+ },
113598
115300
  {
113599
115301
  "kind": "method",
113600
115302
  "name": "highlightPending",
@@ -113825,6 +115527,16 @@
113825
115527
  "module": "src/internal/lyra-element.ts"
113826
115528
  }
113827
115529
  },
115530
+ {
115531
+ "kind": "method",
115532
+ "name": "scheduleStreamingRender",
115533
+ "privacy": "private",
115534
+ "return": {
115535
+ "type": {
115536
+ "text": "void"
115537
+ }
115538
+ }
115539
+ },
113828
115540
  {
113829
115541
  "kind": "method",
113830
115542
  "name": "setCachedHighlight",
@@ -114000,7 +115712,7 @@
114000
115712
  "text": "boolean"
114001
115713
  },
114002
115714
  "default": "false",
114003
- "description": "Signals that `content` is still arriving incrementally. Content changes\ncontinue to render immediately; while this is `true`, the host remains\n`aria-busy=\"true\"` so assistive technology knows the rendered document\nis not final. Set it back to `false` with the final content update.\nReflects so a consumer can also target `lr-markdown[streaming]`.",
115715
+ "description": "Signals that `content` is still arriving incrementally. Content changes\nare coalesced to at most one parse per animation frame while this is\n`true`; the host remains `aria-busy=\"true\"` so assistive technology knows\nthe rendered document is not final. Set it back to `false` with the final\ncontent update to flush the latest content immediately.\nReflects so a consumer can also target `lr-markdown[streaming]`.",
114004
115716
  "fieldName": "streaming"
114005
115717
  }
114006
115718
  ],
@@ -123901,7 +125613,7 @@
123901
125613
  "declarations": [
123902
125614
  {
123903
125615
  "kind": "class",
123904
- "description": "`<lr-notebook-viewer>` — read-only Jupyter notebook (nbformat 4.x) renderer, composing existing\ncomponents per cell. Execution is a hard non-goal.\n\nMarkdown cells render through `<lr-markdown>`, code cells through `<lr-code-block>` (using the\nnotebook's kernel language for syntax highlighting), and raw cells as plain preformatted text. A\ncode cell's `execute_result`/`display_data` outputs prefer, in order, `image/png`, `image/jpeg`,\n`image/svg+xml` (sanitized), `text/html` (sanitized), `application/json` (via `<lr-json-viewer>`),\nthen `text/plain`. Stream/error outputs render as plain preformatted text this round (tinted\n`danger` for stderr/tracebacks) rather than interpreting ANSI escapes. Sanitizing raw HTML/SVG\noutput markup lazy-loads the optional peer dependency `dompurify` via `dompurify-loader.ts`; when\nthat peer isn't installed, the output renders a localized notice instead of raw markup.\n\nCells are virtualized through `<lr-virtual-list>` so a notebook with many cells stays cheap to\nscroll. `node-path` anchors resolve `path[0]` as a cell index; `fragment` anchors resolve a cell's\nown `id`.",
125616
+ "description": "`<lr-notebook-viewer>` — read-only Jupyter notebook (nbformat 4.x) renderer, composing existing\ncomponents per cell. Execution is a hard non-goal.\n\nMarkdown cells render through `<lr-markdown>`, code cells through `<lr-code-block>` (using the\nnotebook's kernel language for syntax highlighting), and raw cells as plain preformatted text. A\ncode cell's `execute_result`/`display_data` outputs prefer, in order, `image/png`, `image/jpeg`,\n`image/svg+xml` (sanitized), `text/html` (sanitized), `application/json` (via `<lr-json-viewer>`),\nthen `text/plain`. Stream/error outputs (tinted `danger` for stderr/tracebacks) interpret embedded\nANSI SGR color/style escapes via the shared `internal/ansi.ts` parser, same as `<lr-terminal>`.\nSanitizing raw HTML/SVG\noutput markup lazy-loads the optional peer dependency `dompurify` via `dompurify-loader.ts`; when\nthat peer isn't installed, the output renders a localized notice instead of raw markup.\n\nCells are virtualized through `<lr-virtual-list>` so a notebook with many cells stays cheap to\nscroll. `node-path` anchors resolve `path[0]` as a cell index; `fragment` anchors resolve a cell's\nown `id`.",
123905
125617
  "name": "LyraNotebookViewer",
123906
125618
  "cssProperties": [
123907
125619
  {
@@ -124450,6 +126162,25 @@
124450
126162
  "module": "src/internal/lyra-element.ts"
124451
126163
  }
124452
126164
  },
126165
+ {
126166
+ "kind": "method",
126167
+ "name": "renderAnsiText",
126168
+ "privacy": "private",
126169
+ "return": {
126170
+ "type": {
126171
+ "text": "TemplateResult"
126172
+ }
126173
+ },
126174
+ "parameters": [
126175
+ {
126176
+ "name": "text",
126177
+ "type": {
126178
+ "text": "string"
126179
+ }
126180
+ }
126181
+ ],
126182
+ "description": "Feeds `text` through a fresh, one-shot ANSI parser (this is always a complete, already-final\nstring -- never a live stream chunk -- so there is no parser state to persist across renders,\nunlike `<lr-terminal>`'s incremental `push()` usage) and renders the resulting segments as\nstyled spans, same color/style token mapping `<lr-terminal>` uses."
126183
+ },
124453
126184
  {
124454
126185
  "kind": "method",
124455
126186
  "name": "renderOutput",
@@ -124594,6 +126325,24 @@
124594
126325
  }
124595
126326
  }
124596
126327
  },
126328
+ {
126329
+ "kind": "method",
126330
+ "name": "segmentStyle",
126331
+ "privacy": "private",
126332
+ "return": {
126333
+ "type": {
126334
+ "text": "Record<string, string>"
126335
+ }
126336
+ },
126337
+ "parameters": [
126338
+ {
126339
+ "name": "s",
126340
+ "type": {
126341
+ "text": "AnsiStyles"
126342
+ }
126343
+ }
126344
+ ]
126345
+ },
124597
126346
  {
124598
126347
  "kind": "method",
124599
126348
  "name": "setDoc",
@@ -166861,7 +168610,7 @@
166861
168610
  "declarations": [
166862
168611
  {
166863
168612
  "kind": "class",
166864
- "description": "`<lr-thread-list>` — the conversation sidebar: a grouped, searchable list of chat sessions with\npin/archive/delete/rename affordances. *Data mode* (non-empty `threads`, or empty `threads` with\nnothing slotted) renders every row as a `<lr-conversation-item>` inside an internal\n`<lr-virtual-list>` — virtualized by construction, scroll position and per-row state survive a\n`threads` replacement; zero rows renders the built-in empty state. *Slotted mode* (empty `threads`\n*and* real slotted content) renders host-supplied `<lr-conversation-item>`s from the default slot\nas-is: no grouping, virtualization, or row actions in that mode — those are data-mode-only by design\n(shadow DOM cannot inject group headers between slotted children).\n\nNo thread CRUD or persistence: every mutation (`lr-thread-pin`/`-archive`/`-delete`/`-rename`) is\na controlled event carrying the *requested* new state — the host mutates `threads`.\n\nData mode: a host needing content with no home in `lr-conversation-item`'s own\n`title`/`excerpt`/`meta`/`actions` surface (e.g. a leading purpose icon — the item has no default\nslot to receive one) sets `wrapRow` to wrap the already-built row. A host needing a fully custom\n`actions` surface itself — beyond `rowActions`'s closed `pin | archive | delete` set, e.g. a\n`<lr-menu>` with Rename/Delete — sets `renderActions` instead; its content is appended after any\nbuilt-in `rowActions` output in the same slot, and `wrapRow` continues to compose around the result.",
168613
+ "description": "`<lr-thread-list>` — the conversation sidebar: a grouped, searchable list of chat sessions with\npin/archive/delete/rename affordances. *Data mode* (non-empty `threads`, or empty `threads` with\nnothing slotted) renders every row as a `<lr-conversation-item>` inside an internal\n`<lr-virtual-list>` — virtualized by construction, scroll position and per-row state survive a\n`threads` replacement; zero rows renders the built-in empty state. *Slotted mode* (empty `threads`\n*and* real slotted content) renders host-supplied `<lr-conversation-item>`s from the default slot\nas-is: no grouping, virtualization, or row actions in that mode — those are data-mode-only by design\n(shadow DOM cannot inject group headers between slotted children).\n\nNo thread CRUD or persistence: every mutation (`lr-thread-pin`/`-archive`/`-delete`/`-rename`) is\na controlled event carrying the *requested* new state — the host mutates `threads`.\n\nData mode: a host needing content with no home in `lr-conversation-item`'s own\n`title`/`excerpt`/`meta`/`actions` surface sets `wrapRow` to wrap the already-built row. For\ncommon row composition, `renderLeading`, `renderMeta`, and `renderRowContent` provide focused\nvirtualized render hooks. A host needing a fully custom\n`actions` surface itself — beyond `rowActions`'s closed `pin | archive | delete` set, e.g. a\n`<lr-menu>` with Rename/Delete — sets `renderActions` instead; its content is appended after any\nbuilt-in `rowActions` output in the same slot, and `wrapRow` continues to compose around the result.",
166865
168614
  "name": "LyraThreadList",
166866
168615
  "cssParts": [
166867
168616
  {
@@ -166990,6 +168739,22 @@
166990
168739
  },
166991
168740
  "description": "Overrides the default case-insensitive `title` + `excerpt` substring match."
166992
168741
  },
168742
+ {
168743
+ "kind": "field",
168744
+ "name": "formatDate",
168745
+ "type": {
168746
+ "text": "(date: Date) => string | undefined"
168747
+ },
168748
+ "description": "Overrides the default locale-aware formatting used for month group dates."
168749
+ },
168750
+ {
168751
+ "kind": "field",
168752
+ "name": "formatGroupLabel",
168753
+ "type": {
168754
+ "text": "(key: ThreadBucketKey, date?: Date) => string | undefined"
168755
+ },
168756
+ "description": "Overrides the localized label for a date group. The date argument is present for month\ngroups and omitted for semantic groups such as `today` or `archived`."
168757
+ },
166993
168758
  {
166994
168759
  "kind": "field",
166995
168760
  "name": "grouping",
@@ -167109,11 +168874,35 @@
167109
168874
  },
167110
168875
  "description": "Data mode only: appended after any built-in `rowActions` buttons in the same row's `actions`\nslot -- the escape hatch for a fully custom per-row action surface (e.g. a `<lr-menu>` with\nRename/Delete, mirroring an app's own richer row-action menu) that `rowActions`'s closed\n`pin | archive | delete` set can't express. Additive, not a replacement: both render together\nwhen `rowActions` is also non-empty, the same composition direction `wrapRow` already takes\nelsewhere on the row (it only ever adds content, never removes built-in output) -- set\n`rowActions` to `[]` (its default) to omit the built-in buttons and use only the callback's\ncontent. Receives the *current* thread on every render, re-invoked per row through the\nvirtualized `renderItem` path exactly like `wrapRow` -- never memoized or stale. Rendered as a\nDOM sibling of the row's own selectable region (`lr-conversation-item`'s `[part=\"option\"]`),\nthe same structural reason the built-in `rowActions` buttons don't also trigger `lr-select` --\nso ordinary Lyra controls returned here (`lr-menu`, `lr-icon-button`, etc.) fire their own\nevents normally without also selecting the row. Unset (the default) leaves `rowActions`'\noutput byte-for-byte unchanged."
167111
168876
  },
168877
+ {
168878
+ "kind": "field",
168879
+ "name": "renderLeading",
168880
+ "type": {
168881
+ "text": "(thread: ChatThread) => TemplateResult | undefined"
168882
+ },
168883
+ "description": "Data mode only: renders non-interactive content in the row's leading slot, before its title\nand excerpt. The callback runs during the virtualized row render."
168884
+ },
168885
+ {
168886
+ "kind": "field",
168887
+ "name": "renderMeta",
168888
+ "type": {
168889
+ "text": "(thread: ChatThread) => TemplateResult | undefined"
168890
+ },
168891
+ "description": "Data mode only: renders the row's meta content. Built-in pin metadata remains available when\npresent, and this result is appended in the same meta region."
168892
+ },
167112
168893
  {
167113
168894
  "kind": "field",
167114
168895
  "name": "renderRow",
167115
168896
  "privacy": "private"
167116
168897
  },
168898
+ {
168899
+ "kind": "field",
168900
+ "name": "renderRowContent",
168901
+ "type": {
168902
+ "text": "(thread: ChatThread) => TemplateResult | undefined"
168903
+ },
168904
+ "description": "Data mode only: replaces the conversation item's title/excerpt/meta content area with a\nhost-rendered row body. Use this for structured, non-interactive row content while keeping\nthe selectable row and timestamp semantics supplied by `<lr-conversation-item>`."
168905
+ },
167117
168906
  {
167118
168907
  "kind": "field",
167119
168908
  "name": "rowActionButtonStyle",
@@ -167346,6 +169135,24 @@
167346
169135
  }
167347
169136
  ]
167348
169137
  },
169138
+ {
169139
+ "kind": "method",
169140
+ "name": "dateForBucket",
169141
+ "privacy": "private",
169142
+ "return": {
169143
+ "type": {
169144
+ "text": "Date | undefined"
169145
+ }
169146
+ },
169147
+ "parameters": [
169148
+ {
169149
+ "name": "key",
169150
+ "type": {
169151
+ "text": "ThreadBucketKey"
169152
+ }
169153
+ }
169154
+ ]
169155
+ },
167349
169156
  {
167350
169157
  "kind": "method",
167351
169158
  "name": "emit",