@aceshooting/lyra-ui 7.4.0 → 7.6.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.
- package/CHANGELOG.md +12 -0
- package/custom-elements.json +63 -3
- package/dist/components/conversation/thread-list/thread-list.class.d.ts +11 -2
- package/dist/components/conversation/thread-list/thread-list.class.d.ts.map +1 -1
- package/dist/components/conversation/thread-list/thread-list.class.js +43 -25
- package/dist/components/conversation/thread-list/thread-list.class.js.map +1 -1
- package/dist/components/forms/textarea/textarea.class.d.ts +6 -0
- package/dist/components/forms/textarea/textarea.class.d.ts.map +1 -1
- package/dist/components/forms/textarea/textarea.class.js +16 -1
- package/dist/components/forms/textarea/textarea.class.js.map +1 -1
- package/dist/components/layout/filter-bar/filter-bar.class.d.ts +56 -11
- package/dist/components/layout/filter-bar/filter-bar.class.d.ts.map +1 -1
- package/dist/components/layout/filter-bar/filter-bar.class.js +57 -3
- package/dist/components/layout/filter-bar/filter-bar.class.js.map +1 -1
- package/dist/components/layout/virtual-list/virtual-list.styles.d.ts.map +1 -1
- package/dist/components/layout/virtual-list/virtual-list.styles.js +27 -7
- package/dist/components/layout/virtual-list/virtual-list.styles.js.map +1 -1
- package/llms/components/lr-filter-bar.md +45 -0
- package/llms/components/lr-textarea.md +5 -0
- package/llms/components/lr-thread-list.md +16 -4
- package/llms/components/lr-virtual-list.md +8 -7
- package/llms-full.txt +73 -10
- package/package.json +1 -1
- package/vscode-css-data.json +28 -0
- package/vscode-html-data.json +10 -3
- package/web-types.json +29 -4
package/llms-full.txt
CHANGED
|
@@ -1321,6 +1321,7 @@ submission/validation/reset via `name`/`value`/`disabled`/`required`/`checkValid
|
|
|
1321
1321
|
| `rows` | `rows` | `number` | `3` | Visible text rows. |
|
|
1322
1322
|
| `resize` | `resize` | `'none' \| 'vertical' \| 'both' \| 'auto'` | `'vertical'` | Native CSS `resize` behavior, plus `'auto'` (`ResizeObserver`-driven grow-to-content, no manual handle). |
|
|
1323
1323
|
| `placeholder` | `placeholder` | `string` | `''` | Placeholder text. |
|
|
1324
|
+
| `readonly` | `readonly` | `boolean` | `false` | Native read-only behavior: prevents user edits while preserving focus, selection/copy, form submission, and silent programmatic editing methods. Reflected. |
|
|
1324
1325
|
| `label` | `label` | `string` | `''` | Visible label text. Unset: no label chrome renders. |
|
|
1325
1326
|
| `hint` | `hint` | `string` | `''` | Hint text below the field. |
|
|
1326
1327
|
| `errorText` | `error-text` | `string` | `''` | Error text below the field (overridden by slotted `error` content). |
|
|
@@ -1344,6 +1345,10 @@ submission/validation/reset via `name`/`value`/`disabled`/`required`/`checkValid
|
|
|
1344
1345
|
(from `maxlength`) — the complete set a native `<textarea>` can produce. Leaving `minlength` and
|
|
1345
1346
|
`maxlength` unset constrains nothing, exactly as before they existed.
|
|
1346
1347
|
|
|
1348
|
+
While `readonly`, all three constraint flags are suspended and `checkValidity()` succeeds, matching
|
|
1349
|
+
native textarea behavior. The value remains a successful form value and is restored by form reset;
|
|
1350
|
+
unsetting `readonly` restores the applicable required and length constraints.
|
|
1351
|
+
|
|
1347
1352
|
Two behaviors are worth knowing, both inherited from the platform and both shared with `lr-input`:
|
|
1348
1353
|
|
|
1349
1354
|
- **An empty value is never `tooShort`.** Native `minlength` only applies to a non-empty value, so
|
|
@@ -6094,19 +6099,20 @@ history sidebar); it is not the right approach for a hundred-thousand-row list w
|
|
|
6094
6099
|
- A sticky band only appears when `renderStickyGroup` *and* at least one valid `groups` entry are
|
|
6095
6100
|
both present; `groups` alone renders positioned markers with nothing pinned, and
|
|
6096
6101
|
`renderStickyGroup` alone renders no overlay element at all.
|
|
6097
|
-
- **A row that renders a popup needs the
|
|
6102
|
+
- **A row that renders a popup needs the active-row lift, and this is why `[part='row']` has one.**
|
|
6098
6103
|
Each row carries `will-change: transform` (a compositor hint for the per-frame translate), which
|
|
6099
6104
|
makes every row its own stacking context. Rows otherwise carry no `z-index`, so they paint in DOM
|
|
6100
6105
|
order and each one paints over the previous. Anything a row renders that overflows its own box —
|
|
6101
6106
|
an `<lr-menu>` popup in a row-action menu, a tooltip, an outward focus ring — is therefore painted
|
|
6102
6107
|
*underneath* every following row, no matter how high its own `z-index` is: that `z-index` only
|
|
6103
6108
|
orders siblings inside the row's own context. The last row always looks correct, which is exactly
|
|
6104
|
-
why a short fixture never catches it.
|
|
6105
|
-
|
|
6106
|
-
|
|
6107
|
-
|
|
6108
|
-
|
|
6109
|
-
|
|
6109
|
+
why a short fixture never catches it. A row lifts to `--lr-layer-content` while something inside
|
|
6110
|
+
it holds focus or while it contains an open `lr-menu`. The explicit menu-open branch covers
|
|
6111
|
+
imperative opening and virtual measurement/render cycles, where focus can temporarily return to
|
|
6112
|
+
the document while the popup remains visible. The value deliberately *matches*
|
|
6113
|
+
`[part='group']`'s rather than exceeding it, so the two land on the same layer and DOM order
|
|
6114
|
+
decides: groups render before the rows, so an active row wins while (and only while) it needs to,
|
|
6115
|
+
which is right — a group header is a non-interactive `pointer-events: none` label.
|
|
6110
6116
|
|
|
6111
6117
|
---
|
|
6112
6118
|
|
|
@@ -7050,6 +7056,51 @@ value means no debounce at all: every keystroke commits immediately. A pending d
|
|
|
7050
7056
|
keystroke can never overwrite a reset or fire after teardown. `debounce` is ignored for every other
|
|
7051
7057
|
`type`, whose commits are discrete choices with nothing to debounce.
|
|
7052
7058
|
|
|
7059
|
+
### Custom controls
|
|
7060
|
+
|
|
7061
|
+
Use `type: 'custom'` when an existing Lyra control does not fit the built-in filter types. Provide a
|
|
7062
|
+
`custom` object with a `render(context)` function and an `adapter`. The renderer owns the control's
|
|
7063
|
+
markup and should bind the context's `value`, `disabled`, `required`, and `errorText` as appropriate;
|
|
7064
|
+
`context.onValueChange` (or its `onInput`/`onChange` aliases) reads the event through
|
|
7065
|
+
`adapter.valueFromEvent` and commits it to the filter bar. `context.setValue(value)` is available for
|
|
7066
|
+
controls that expose a value without an event payload, and `context.onFocusout` marks the filter
|
|
7067
|
+
touched for required validation.
|
|
7068
|
+
|
|
7069
|
+
The adapter's optional `emptyValue` is used when the active chip is removed, and its optional
|
|
7070
|
+
`formatValue` controls the chip's display text. Custom values may be strings, string arrays,
|
|
7071
|
+
booleans, or `undefined`, so controls such as `lr-time-range`, `lr-checkbox`, and an async-backed
|
|
7072
|
+
`lr-combobox` can participate in the same controlled `value`, active-chip, reset, disabled, and
|
|
7073
|
+
validation contract:
|
|
7074
|
+
|
|
7075
|
+
```ts
|
|
7076
|
+
const filters: FilterBarFilterDefinition[] = [
|
|
7077
|
+
{
|
|
7078
|
+
id: 'archived',
|
|
7079
|
+
label: 'Include archived',
|
|
7080
|
+
type: 'custom',
|
|
7081
|
+
custom: {
|
|
7082
|
+
adapter: {
|
|
7083
|
+
valueFromEvent: (event) =>
|
|
7084
|
+
(event as CustomEvent<{ checked: boolean }>).detail.checked,
|
|
7085
|
+
emptyValue: false,
|
|
7086
|
+
formatValue: (value) => value === true ? 'Enabled' : 'Disabled',
|
|
7087
|
+
},
|
|
7088
|
+
render: (context) => html`
|
|
7089
|
+
<lr-checkbox
|
|
7090
|
+
?checked=${context.value === true}
|
|
7091
|
+
?disabled=${context.disabled}
|
|
7092
|
+
@lr-change=${context.onValueChange}
|
|
7093
|
+
@focusout=${context.onFocusout}
|
|
7094
|
+
>${context.label}</lr-checkbox>
|
|
7095
|
+
`,
|
|
7096
|
+
},
|
|
7097
|
+
},
|
|
7098
|
+
];
|
|
7099
|
+
```
|
|
7100
|
+
|
|
7101
|
+
The custom renderer returns a Lit `TemplateResult`; the filter bar places it in its
|
|
7102
|
+
`filter-control` part and re-renders it whenever the controlled value or validation state changes.
|
|
7103
|
+
|
|
7053
7104
|
# Overlays, status & feedback (`components/overlays/`)
|
|
7054
7105
|
|
|
7055
7106
|
## `lr-toast` / `lr-toast-item` / `toast()`
|
|
@@ -14117,13 +14168,17 @@ icon — the item has no default slot to receive one); unset renders the built-i
|
|
|
14117
14168
|
`renderActions?: (thread: ChatThread) => TemplateResult` (attribute: false) — data mode only:
|
|
14118
14169
|
appends host-supplied content (re-invoked per row on every render, e.g. a `lr-menu` with custom
|
|
14119
14170
|
actions) after the built-in `rowActions` output in each row's `actions` slot; events it fires reach
|
|
14120
|
-
the host normally and never trigger `lr-select`.
|
|
14171
|
+
the host normally and never trigger `lr-select`. An open nested `lr-menu` keeps its virtual row
|
|
14172
|
+
above later rows even if focus temporarily leaves the menu. Unset renders only the built-in
|
|
14173
|
+
`rowActions`.
|
|
14121
14174
|
`renderLeading?: (thread: ChatThread) => TemplateResult` (attribute: false) — renders non-interactive
|
|
14122
14175
|
leading content in each virtualized row. `renderExcerpt?: (thread: ChatThread) => TemplateResult`
|
|
14123
14176
|
(attribute: false) — renders rich content into the row item's own `excerpt` slot, winning over the
|
|
14124
14177
|
plain-string `excerpt` property (e.g. a server-highlighted search-match snippet), while leaving the
|
|
14125
|
-
built-in title layout and inline-rename affordance untouched.
|
|
14126
|
-
|
|
14178
|
+
built-in title layout and inline-rename affordance untouched. `<mark>` descendants returned by this
|
|
14179
|
+
hook receive the default, component-themeable highlight treatment documented below.
|
|
14180
|
+
`renderMeta?: (thread: ChatThread) => TemplateResult` (attribute: false) — appends structured
|
|
14181
|
+
metadata in the row's meta region.
|
|
14127
14182
|
`renderRowContent?: (thread: ChatThread) => TemplateResult` (attribute: false) — replaces the
|
|
14128
14183
|
conversation item's title/excerpt/meta content area with custom non-interactive row content.
|
|
14129
14184
|
`formatGroupLabel?: (key: ThreadBucketKey, date?: Date) => string` (attribute: false) — overrides
|
|
@@ -14166,6 +14221,14 @@ prefix: `row-item-base`, `row-item-active-indicator`, `row-item-option`, `row-it
|
|
|
14166
14221
|
`row-item-title`, `row-item-title-input`, `row-item-rename-button`, `row-item-excerpt`,
|
|
14167
14222
|
`row-item-meta`, `row-item-timestamp`, `row-item-actions`.
|
|
14168
14223
|
|
|
14224
|
+
**Themeable excerpt highlights:** `<mark>` descendants returned by `renderExcerpt` use
|
|
14225
|
+
`--lr-thread-list-excerpt-highlight-background` (default `var(--lr-color-warning-quiet)`),
|
|
14226
|
+
`--lr-thread-list-excerpt-highlight-foreground` (default `inherit`),
|
|
14227
|
+
`--lr-thread-list-excerpt-highlight-radius` (default `var(--lr-radius-xs)`), and
|
|
14228
|
+
`--lr-thread-list-excerpt-highlight-padding` (default `0`). These properties inherit through the
|
|
14229
|
+
internal virtual-list shadow tree, so set them on `lr-thread-list` or any ancestor. They do not style
|
|
14230
|
+
marks returned by `renderRowContent` or any other hook.
|
|
14231
|
+
|
|
14169
14232
|
**Keep the two prefixes straight — they are different surfaces.** The `row-*` parts wrap *this*
|
|
14170
14233
|
component's own render-callback output (`wrapRow`, `renderLeading`, `renderExcerpt`,
|
|
14171
14234
|
`renderRowContent`, `renderMeta`, `renderActions`); the `row-item-*` parts are the row item's
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aceshooting/lyra-ui",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.6.0",
|
|
4
4
|
"description": "Free, independent Lit web components: an open-source alternative to Shoelace and Web Awesome with accessible forms, dashboards, charts, and agent UI.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"web-components",
|
package/vscode-css-data.json
CHANGED
|
@@ -4460,6 +4460,34 @@
|
|
|
4460
4460
|
"value": "**`<lr-thinking-panel>`** (default: `var(--lr-size-16rem)`) — Cap on how tall the expanded reasoning transcript grows before `[part=\"body\"]` scrolls internally."
|
|
4461
4461
|
}
|
|
4462
4462
|
},
|
|
4463
|
+
{
|
|
4464
|
+
"name": "--lr-thread-list-excerpt-highlight-background",
|
|
4465
|
+
"description": {
|
|
4466
|
+
"kind": "markdown",
|
|
4467
|
+
"value": "**`<lr-thread-list>`** (default: `var(--lr-color-warning-quiet)`) — Background of `<mark>` descendants returned by `renderExcerpt`."
|
|
4468
|
+
}
|
|
4469
|
+
},
|
|
4470
|
+
{
|
|
4471
|
+
"name": "--lr-thread-list-excerpt-highlight-foreground",
|
|
4472
|
+
"description": {
|
|
4473
|
+
"kind": "markdown",
|
|
4474
|
+
"value": "**`<lr-thread-list>`** (default: `inherit`) — Foreground of `<mark>` descendants returned by `renderExcerpt`."
|
|
4475
|
+
}
|
|
4476
|
+
},
|
|
4477
|
+
{
|
|
4478
|
+
"name": "--lr-thread-list-excerpt-highlight-padding",
|
|
4479
|
+
"description": {
|
|
4480
|
+
"kind": "markdown",
|
|
4481
|
+
"value": "**`<lr-thread-list>`** (default: `0`) — Padding of `<mark>` descendants returned by `renderExcerpt`."
|
|
4482
|
+
}
|
|
4483
|
+
},
|
|
4484
|
+
{
|
|
4485
|
+
"name": "--lr-thread-list-excerpt-highlight-radius",
|
|
4486
|
+
"description": {
|
|
4487
|
+
"kind": "markdown",
|
|
4488
|
+
"value": "**`<lr-thread-list>`** (default: `var(--lr-radius-xs)`) — Corner radius of `<mark>` descendants returned by `renderExcerpt`."
|
|
4489
|
+
}
|
|
4490
|
+
},
|
|
4463
4491
|
{
|
|
4464
4492
|
"name": "--lr-time-range-base-size",
|
|
4465
4493
|
"description": {
|
package/vscode-html-data.json
CHANGED
|
@@ -6346,7 +6346,7 @@
|
|
|
6346
6346
|
"name": "lr-filter-bar",
|
|
6347
6347
|
"description": {
|
|
6348
6348
|
"kind": "markdown",
|
|
6349
|
-
"value": "`<lr-filter-bar>` — a row of dashboard filters, each declared by the host (`filters`) rather\nthan invented by this component: every filter composes an existing Lyra input --\n`<lr-select>`/`<lr-combobox>` for closed choice sets, `<lr-date-input>` (single or `mode=\"range\"`)\nfor dates, `<lr-input>` for a free-text query -- plus a `<lr-chip-group>` of removable\n`<lr-chip>`s summarizing the currently-active filters, an `<lr-button>` that resets every\nfilter, and (while `loading`) an `<lr-spinner>` status indicator.\n\nA `'text'` filter is the one control that is *not* a fully controlled `.value=` binding: a text\nfield re-rendered from `value` mid-typing would push a stale value back into the field and drop\nthe caret to the end, so the field owns its own value while the user types and an external\n`value` write is synced back in only once no edit is in flight (see `syncTextControls()`). Its\noptional per-filter `debounce` (ms) is the only behaviour this component adds on top of the\ncomposed control itself -- flushed by that field's own `change`/blur, cancelled by `reset()`, a\nchip removal, and `disconnectedCallback`, so a stale keystroke can never overwrite a reset or\nfire after teardown.\n\nControlled, like every other Lyra data component: `value` is a plain, JSON-serializable object\n(`FilterBarValue`) the host reads/writes directly -- this component never touches\n`location`/`history`/storage itself, so turning `value` into (and back out of) a URL\nquerystring or an app state store is entirely the host's own concern. Every edit -- picking an\noption, committing a date, removing an active-filter chip, or clicking reset -- goes through\nthe same `setFilterValue()` path and emits a single `lr-input` carrying the *full* resulting\n`value`, not just the changed filter's own value, mirroring `<lr-tool-param-form>`'s identical\n\"always the whole object\" event contract.\n\nValidation is scoped to each filter definition's own `required` flag: `invalidFilterIds`/\n`checkValidity()` are always live (plain getters over `filters`/`value`, not cached), and\n`reportValidity()` additionally reveals every currently-invalid filter's inline error (rendered\nby that filter's own composed control, via its `errorText`/`required` props -- this component\nnever renders a second, duplicate label/hint/error chrome of its own around an already-chromed\ncontrol) the same way a blur naturally would. `lr-validity-change` fires whenever the computed\n`{ valid, invalidFilterIds }` actually changes.\n\nDeliberately not form-associated: a dashboard filter bar's state is not a submitted form field,\nand every value it holds already round-trips through `value` directly -- see `disabled` below,\na plain property with no `<fieldset disabled>` cascade, for the same reason.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `active-filters` | The `role=\"group\"` wrapper around the active-filter chip row, only rendered while any filter is set. |\n| `base` | The root `role=\"group\"` wrapper. |\n| `chip` | One active-filter `<lr-chip>`. |\n| `chips` | The `<lr-chip-group>` inside `active-filters`. |\n| `controls` | The row holding every filter control, the reset button, and the loading status. |\n| `filter-control` | One filter's composed
|
|
6349
|
+
"value": "`<lr-filter-bar>` — a row of dashboard filters, each declared by the host (`filters`) rather\nthan invented by this component: every filter composes an existing Lyra input --\n`<lr-select>`/`<lr-combobox>` for closed choice sets, `<lr-date-input>` (single or `mode=\"range\"`)\nfor dates, `<lr-input>` for a free-text query -- plus a `<lr-chip-group>` of removable\n`<lr-chip>`s summarizing the currently-active filters, an `<lr-button>` that resets every\nfilter, and (while `loading`) an `<lr-spinner>` status indicator.\n\nA `'text'` filter is the one control that is *not* a fully controlled `.value=` binding: a text\nfield re-rendered from `value` mid-typing would push a stale value back into the field and drop\nthe caret to the end, so the field owns its own value while the user types and an external\n`value` write is synced back in only once no edit is in flight (see `syncTextControls()`). Its\noptional per-filter `debounce` (ms) is the only behaviour this component adds on top of the\ncomposed control itself -- flushed by that field's own `change`/blur, cancelled by `reset()`, a\nchip removal, and `disconnectedCallback`, so a stale keystroke can never overwrite a reset or\nfire after teardown.\n\nControlled, like every other Lyra data component: `value` is a plain, JSON-serializable object\n(`FilterBarValue`) the host reads/writes directly -- this component never touches\n`location`/`history`/storage itself, so turning `value` into (and back out of) a URL\nquerystring or an app state store is entirely the host's own concern. Every edit -- picking an\noption, committing a date, removing an active-filter chip, or clicking reset -- goes through\nthe same `setFilterValue()` path and emits a single `lr-input` carrying the *full* resulting\n`value`, not just the changed filter's own value, mirroring `<lr-tool-param-form>`'s identical\n\"always the whole object\" event contract.\n\nValidation is scoped to each filter definition's own `required` flag: `invalidFilterIds`/\n`checkValidity()` are always live (plain getters over `filters`/`value`, not cached), and\n`reportValidity()` additionally reveals every currently-invalid filter's inline error (rendered\nby that filter's own composed control, via its `errorText`/`required` props -- this component\nnever renders a second, duplicate label/hint/error chrome of its own around an already-chromed\ncontrol) the same way a blur naturally would. `lr-validity-change` fires whenever the computed\n`{ valid, invalidFilterIds }` actually changes.\n\nDeliberately not form-associated: a dashboard filter bar's state is not a submitted form field,\nand every value it holds already round-trips through `value` directly -- see `disabled` below,\na plain property with no `<fieldset disabled>` cascade, for the same reason.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `active-filters` | The `role=\"group\"` wrapper around the active-filter chip row, only rendered while any filter is set. |\n| `base` | The root `role=\"group\"` wrapper. |\n| `chip` | One active-filter `<lr-chip>`. |\n| `chips` | The `<lr-chip-group>` inside `active-filters`. |\n| `controls` | The row holding every filter control, the reset button, and the loading status. |\n| `filter-control` | One filter's composed built-in control, or the wrapper around a custom renderer's control. |\n| `reset-button` | The reset `<lr-button>`. |\n| `status` | The loading `<lr-spinner>`, only rendered while `loading`. |"
|
|
6350
6350
|
},
|
|
6351
6351
|
"attributes": [
|
|
6352
6352
|
{
|
|
@@ -14773,7 +14773,7 @@
|
|
|
14773
14773
|
"name": "lr-textarea",
|
|
14774
14774
|
"description": {
|
|
14775
14775
|
"kind": "markdown",
|
|
14776
|
-
"value": "`<lr-textarea>` — a multiline plain-text input primitive, form-associated via the\n`FormAssociated` mixin (see `<lr-chat-composer>`/`<lr-date-input>` for the same shape), so it\nparticipates in native `<form>` submission/validation/reset like any other text control --\n`name`/`value`/`disabled`/`required`/`checkValidity()`/`reportValidity()` all come from that mixin.\n\nShips an opt-in `label`/`hint`/`errorText` form-control chrome (props + matching named slots +\n`form-control-label`/`hint`/`error` parts), mirroring `<lr-select>`'s exact pattern -- left\nunset, the chrome remains hidden. A consumer preferring their own form-field layout can still\nignore these and wrap the element. A host `aria-label` is forwarded to the internal textbox;\nexternal `aria-labelledby`/`aria-describedby` idrefs are not copied across the shadow boundary.\n\n`minlength`/`maxlength` are forwarded to the internal native `<textarea>` and bridged into this\nelement's own `ElementInternals` as `tooShort`/`tooLong` by `updateValidity()`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, textarea, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `textarea` | The native `<textarea>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-textarea-max-block-size` (default: `none`) — Maximum auto-grown block size before the textarea scrolls."
|
|
14776
|
+
"value": "`<lr-textarea>` — a multiline plain-text input primitive, form-associated via the\n`FormAssociated` mixin (see `<lr-chat-composer>`/`<lr-date-input>` for the same shape), so it\nparticipates in native `<form>` submission/validation/reset like any other text control --\n`name`/`value`/`disabled`/`required`/`checkValidity()`/`reportValidity()` all come from that mixin.\n\nShips an opt-in `label`/`hint`/`errorText` form-control chrome (props + matching named slots +\n`form-control-label`/`hint`/`error` parts), mirroring `<lr-select>`'s exact pattern -- left\nunset, the chrome remains hidden. A consumer preferring their own form-field layout can still\nignore these and wrap the element. A host `aria-label` is forwarded to the internal textbox;\nexternal `aria-labelledby`/`aria-describedby` idrefs are not copied across the shadow boundary.\n\n`minlength`/`maxlength` are forwarded to the internal native `<textarea>` and bridged into this\nelement's own `ElementInternals` as `tooShort`/`tooLong` by `updateValidity()`.\n`readonly` keeps the value focusable, selectable, copyable, and form-submittable while barring\nuser edits and constraint validation, matching the native textarea contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, textarea, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `textarea` | The native `<textarea>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-textarea-max-block-size` (default: `none`) — Maximum auto-grown block size before the textarea scrolls."
|
|
14777
14777
|
},
|
|
14778
14778
|
"attributes": [
|
|
14779
14779
|
{
|
|
@@ -14881,6 +14881,13 @@
|
|
|
14881
14881
|
"value": "Type: `string` \nDefault: `''`"
|
|
14882
14882
|
}
|
|
14883
14883
|
},
|
|
14884
|
+
{
|
|
14885
|
+
"name": "readonly",
|
|
14886
|
+
"description": {
|
|
14887
|
+
"kind": "markdown",
|
|
14888
|
+
"value": "Forwards native read-only behavior to the internal textarea. The value remains focusable,\nselectable, copyable, and form-submittable; constraint validation is suspended until the\nproperty is unset.\n\nType: `boolean` \nDefault: `false`"
|
|
14889
|
+
}
|
|
14890
|
+
},
|
|
14884
14891
|
{
|
|
14885
14892
|
"name": "required",
|
|
14886
14893
|
"description": {
|
|
@@ -14966,7 +14973,7 @@
|
|
|
14966
14973
|
"name": "lr-thread-list",
|
|
14967
14974
|
"description": {
|
|
14968
14975
|
"kind": "markdown",
|
|
14969
|
-
"value": "`<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`, `renderExcerpt`, `renderMeta`, and `renderRowContent`\nprovide focused virtualized render hooks -- `renderExcerpt` renders into the row item's own\n`excerpt` slot (winning over the plain-string `excerpt` property) for rich per-row content such\nas a highlighted search snippet. 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.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Slotted mode only: host-supplied `lr-conversation-item`s, rendered in order. Each top-level assigned element that doesn't already carry an explicit `role` is given `role=\"listitem\"`, since `[part=\"list\"]` is `role=\"list\"` in this mode and `lr-conversation-item` deliberately doesn't self-apply that role (see its own class doc). |\n| `empty` | Replaces the built-in empty state. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root. |\n| `empty` | The empty/no-matches state. |\n| `group-header` | A date/custom group header in data mode. |\n| `group-icon` | The decorative expand/collapse glyph. |\n| `group-label` | The group label inside `group-toggle`. |\n| `group-sticky` | `sticky-groups` only: the pinned copy of the current group's header, exported from the internal `lr-virtual-list`'s sticky layer. It wraps a full copy of the `group-header`/`group-toggle`/`group-label`/`group-icon` markup (which therefore styles both the real header row and the pinned copy), and carries `aria-hidden` — style it for the pinned band itself, e.g. a shadow or a border under the band. |\n| `group-toggle` | The controlled group expand/collapse button. |\n| `list` | The list region. |\n| `pin-glyph` | The small pin indicator shown in a pinned row's `meta` slot (data mode). |\n| `row` | Exported from the internal `lr-virtual-list`'s `row` part (data mode). |\n| `row-action` | A built-in pin/archive/delete icon button (data mode, when `rowActions` includes it). |\n| `row-actions` | The wrapper around built-in and `renderActions` output. |\n| `row-content` | The wrapper around `renderRowContent` output. |\n| `row-excerpt` | The wrapper around `renderExcerpt` output, slotted into the row item's own `excerpt` slot. |\n| `row-item-actions` | Data mode: the row item's `actions` wrapper. |\n| `row-item-active-indicator` | Data mode: the row item's decorative active indicator, exported from `lr-conversation-item`. |\n| `row-item-base` | Data mode: the row `<lr-conversation-item>`'s own `base` part — the box whose padding sets row height. `row-item-*` parts are the item's *internals*; the `row-*` parts above wrap this component's own callback output and are a different surface. Styling row density here replaces the older `::part(row) { --lr-theme-*: … }` workaround, which retheme'd the whole row subtree (`renderActions` popups included). |\n| `row-item-content` | Data mode: the row item's title/excerpt content column. |\n| `row-item-excerpt` | Data mode: the row item's excerpt line. |\n| `row-item-leading` | Data mode: the row item's `leading` wrapper. |\n| `row-item-meta` | Data mode: the row item's `meta` wrapper. |\n| `row-item-option` | Data mode: the row item's selectable `option` region. |\n| `row-item-rename-button` | Data mode: the row item's pencil/rename affordance. |\n| `row-item-timestamp` | Data mode: the row item's `<time>` element. |\n| `row-item-title` | Data mode: the row item's title text. |\n| `row-item-title-input` | Data mode: the row item's in-place rename `<input>`. |\n| `row-leading` | The wrapper around `renderLeading` output. |\n| `row-meta` | A wrapper around built-in or `renderMeta` metadata. |\n| `row-wrapper` | The wrapper around `wrapRow` output (data mode, only when `wrapRow` is set). Row-only: group headers are never passed through `wrapRow`, so they never carry it. |\n| `search` | The search field wrapper. |\n| `search-input` | The `<input type=\"search\">`. |\n| `viewport` | The real scroll container, exported from the internal `lr-virtual-list`. It fills this component's height with no consumer CSS (and falls back to `lr-virtual-list`'s own 24rem `--lr-virtual-list-height` default when the container has no resolvable height).
|
|
14976
|
+
"value": "`<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`, `renderExcerpt`, `renderMeta`, and `renderRowContent`\nprovide focused virtualized render hooks -- `renderExcerpt` renders into the row item's own\n`excerpt` slot (winning over the plain-string `excerpt` property) for rich per-row content such\nas a highlighted search snippet. 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.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Slotted mode only: host-supplied `lr-conversation-item`s, rendered in order. Each top-level assigned element that doesn't already carry an explicit `role` is given `role=\"listitem\"`, since `[part=\"list\"]` is `role=\"list\"` in this mode and `lr-conversation-item` deliberately doesn't self-apply that role (see its own class doc). |\n| `empty` | Replaces the built-in empty state. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root. |\n| `empty` | The empty/no-matches state. |\n| `group-header` | A date/custom group header in data mode. |\n| `group-icon` | The decorative expand/collapse glyph. |\n| `group-label` | The group label inside `group-toggle`. |\n| `group-sticky` | `sticky-groups` only: the pinned copy of the current group's header, exported from the internal `lr-virtual-list`'s sticky layer. It wraps a full copy of the `group-header`/`group-toggle`/`group-label`/`group-icon` markup (which therefore styles both the real header row and the pinned copy), and carries `aria-hidden` — style it for the pinned band itself, e.g. a shadow or a border under the band. |\n| `group-toggle` | The controlled group expand/collapse button. |\n| `list` | The list region. |\n| `pin-glyph` | The small pin indicator shown in a pinned row's `meta` slot (data mode). |\n| `row` | Exported from the internal `lr-virtual-list`'s `row` part (data mode). |\n| `row-action` | A built-in pin/archive/delete icon button (data mode, when `rowActions` includes it). |\n| `row-actions` | The wrapper around built-in and `renderActions` output. |\n| `row-content` | The wrapper around `renderRowContent` output. |\n| `row-excerpt` | The wrapper around `renderExcerpt` output, slotted into the row item's own `excerpt` slot. |\n| `row-item-actions` | Data mode: the row item's `actions` wrapper. |\n| `row-item-active-indicator` | Data mode: the row item's decorative active indicator, exported from `lr-conversation-item`. |\n| `row-item-base` | Data mode: the row `<lr-conversation-item>`'s own `base` part — the box whose padding sets row height. `row-item-*` parts are the item's *internals*; the `row-*` parts above wrap this component's own callback output and are a different surface. Styling row density here replaces the older `::part(row) { --lr-theme-*: … }` workaround, which retheme'd the whole row subtree (`renderActions` popups included). |\n| `row-item-content` | Data mode: the row item's title/excerpt content column. |\n| `row-item-excerpt` | Data mode: the row item's excerpt line. |\n| `row-item-leading` | Data mode: the row item's `leading` wrapper. |\n| `row-item-meta` | Data mode: the row item's `meta` wrapper. |\n| `row-item-option` | Data mode: the row item's selectable `option` region. |\n| `row-item-rename-button` | Data mode: the row item's pencil/rename affordance. |\n| `row-item-timestamp` | Data mode: the row item's `<time>` element. |\n| `row-item-title` | Data mode: the row item's title text. |\n| `row-item-title-input` | Data mode: the row item's in-place rename `<input>`. |\n| `row-leading` | The wrapper around `renderLeading` output. |\n| `row-meta` | A wrapper around built-in or `renderMeta` metadata. |\n| `row-wrapper` | The wrapper around `wrapRow` output (data mode, only when `wrapRow` is set). Row-only: group headers are never passed through `wrapRow`, so they never carry it. |\n| `search` | The search field wrapper. |\n| `search-input` | The `<input type=\"search\">`. |\n| `viewport` | The real scroll container, exported from the internal `lr-virtual-list`. It fills this component's height with no consumer CSS (and falls back to `lr-virtual-list`'s own 24rem `--lr-virtual-list-height` default when the container has no resolvable height). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-thread-list-excerpt-highlight-background` (default: `var(--lr-color-warning-quiet)`) — Background of `<mark>` descendants returned by `renderExcerpt`.\n- `--lr-thread-list-excerpt-highlight-foreground` (default: `inherit`) — Foreground of `<mark>` descendants returned by `renderExcerpt`.\n- `--lr-thread-list-excerpt-highlight-radius` (default: `var(--lr-radius-xs)`) — Corner radius of `<mark>` descendants returned by `renderExcerpt`.\n- `--lr-thread-list-excerpt-highlight-padding` (default: `0`) — Padding of `<mark>` descendants returned by `renderExcerpt`."
|
|
14970
14977
|
},
|
|
14971
14978
|
"attributes": [
|
|
14972
14979
|
{
|
package/web-types.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/web-types",
|
|
3
3
|
"name": "@aceshooting/lyra-ui",
|
|
4
|
-
"version": "7.
|
|
4
|
+
"version": "7.6.0",
|
|
5
5
|
"description-markup": "markdown",
|
|
6
6
|
"contributions": {
|
|
7
7
|
"html": {
|
|
@@ -7190,7 +7190,7 @@
|
|
|
7190
7190
|
},
|
|
7191
7191
|
{
|
|
7192
7192
|
"name": "lr-filter-bar",
|
|
7193
|
-
"description": "`<lr-filter-bar>` — a row of dashboard filters, each declared by the host (`filters`) rather\nthan invented by this component: every filter composes an existing Lyra input --\n`<lr-select>`/`<lr-combobox>` for closed choice sets, `<lr-date-input>` (single or `mode=\"range\"`)\nfor dates, `<lr-input>` for a free-text query -- plus a `<lr-chip-group>` of removable\n`<lr-chip>`s summarizing the currently-active filters, an `<lr-button>` that resets every\nfilter, and (while `loading`) an `<lr-spinner>` status indicator.\n\nA `'text'` filter is the one control that is *not* a fully controlled `.value=` binding: a text\nfield re-rendered from `value` mid-typing would push a stale value back into the field and drop\nthe caret to the end, so the field owns its own value while the user types and an external\n`value` write is synced back in only once no edit is in flight (see `syncTextControls()`). Its\noptional per-filter `debounce` (ms) is the only behaviour this component adds on top of the\ncomposed control itself -- flushed by that field's own `change`/blur, cancelled by `reset()`, a\nchip removal, and `disconnectedCallback`, so a stale keystroke can never overwrite a reset or\nfire after teardown.\n\nControlled, like every other Lyra data component: `value` is a plain, JSON-serializable object\n(`FilterBarValue`) the host reads/writes directly -- this component never touches\n`location`/`history`/storage itself, so turning `value` into (and back out of) a URL\nquerystring or an app state store is entirely the host's own concern. Every edit -- picking an\noption, committing a date, removing an active-filter chip, or clicking reset -- goes through\nthe same `setFilterValue()` path and emits a single `lr-input` carrying the *full* resulting\n`value`, not just the changed filter's own value, mirroring `<lr-tool-param-form>`'s identical\n\"always the whole object\" event contract.\n\nValidation is scoped to each filter definition's own `required` flag: `invalidFilterIds`/\n`checkValidity()` are always live (plain getters over `filters`/`value`, not cached), and\n`reportValidity()` additionally reveals every currently-invalid filter's inline error (rendered\nby that filter's own composed control, via its `errorText`/`required` props -- this component\nnever renders a second, duplicate label/hint/error chrome of its own around an already-chromed\ncontrol) the same way a blur naturally would. `lr-validity-change` fires whenever the computed\n`{ valid, invalidFilterIds }` actually changes.\n\nDeliberately not form-associated: a dashboard filter bar's state is not a submitted form field,\nand every value it holds already round-trips through `value` directly -- see `disabled` below,\na plain property with no `<fieldset disabled>` cascade, for the same reason.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `active-filters` | The `role=\"group\"` wrapper around the active-filter chip row, only rendered while any filter is set. |\n| `base` | The root `role=\"group\"` wrapper. |\n| `chip` | One active-filter `<lr-chip>`. |\n| `chips` | The `<lr-chip-group>` inside `active-filters`. |\n| `controls` | The row holding every filter control, the reset button, and the loading status. |\n| `filter-control` | One filter's composed
|
|
7193
|
+
"description": "`<lr-filter-bar>` — a row of dashboard filters, each declared by the host (`filters`) rather\nthan invented by this component: every filter composes an existing Lyra input --\n`<lr-select>`/`<lr-combobox>` for closed choice sets, `<lr-date-input>` (single or `mode=\"range\"`)\nfor dates, `<lr-input>` for a free-text query -- plus a `<lr-chip-group>` of removable\n`<lr-chip>`s summarizing the currently-active filters, an `<lr-button>` that resets every\nfilter, and (while `loading`) an `<lr-spinner>` status indicator.\n\nA `'text'` filter is the one control that is *not* a fully controlled `.value=` binding: a text\nfield re-rendered from `value` mid-typing would push a stale value back into the field and drop\nthe caret to the end, so the field owns its own value while the user types and an external\n`value` write is synced back in only once no edit is in flight (see `syncTextControls()`). Its\noptional per-filter `debounce` (ms) is the only behaviour this component adds on top of the\ncomposed control itself -- flushed by that field's own `change`/blur, cancelled by `reset()`, a\nchip removal, and `disconnectedCallback`, so a stale keystroke can never overwrite a reset or\nfire after teardown.\n\nControlled, like every other Lyra data component: `value` is a plain, JSON-serializable object\n(`FilterBarValue`) the host reads/writes directly -- this component never touches\n`location`/`history`/storage itself, so turning `value` into (and back out of) a URL\nquerystring or an app state store is entirely the host's own concern. Every edit -- picking an\noption, committing a date, removing an active-filter chip, or clicking reset -- goes through\nthe same `setFilterValue()` path and emits a single `lr-input` carrying the *full* resulting\n`value`, not just the changed filter's own value, mirroring `<lr-tool-param-form>`'s identical\n\"always the whole object\" event contract.\n\nValidation is scoped to each filter definition's own `required` flag: `invalidFilterIds`/\n`checkValidity()` are always live (plain getters over `filters`/`value`, not cached), and\n`reportValidity()` additionally reveals every currently-invalid filter's inline error (rendered\nby that filter's own composed control, via its `errorText`/`required` props -- this component\nnever renders a second, duplicate label/hint/error chrome of its own around an already-chromed\ncontrol) the same way a blur naturally would. `lr-validity-change` fires whenever the computed\n`{ valid, invalidFilterIds }` actually changes.\n\nDeliberately not form-associated: a dashboard filter bar's state is not a submitted form field,\nand every value it holds already round-trips through `value` directly -- see `disabled` below,\na plain property with no `<fieldset disabled>` cascade, for the same reason.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `active-filters` | The `role=\"group\"` wrapper around the active-filter chip row, only rendered while any filter is set. |\n| `base` | The root `role=\"group\"` wrapper. |\n| `chip` | One active-filter `<lr-chip>`. |\n| `chips` | The `<lr-chip-group>` inside `active-filters`. |\n| `controls` | The row holding every filter control, the reset button, and the loading status. |\n| `filter-control` | One filter's composed built-in control, or the wrapper around a custom renderer's control. |\n| `reset-button` | The reset `<lr-button>`. |\n| `status` | The loading `<lr-spinner>`, only rendered while `loading`. |",
|
|
7194
7194
|
"attributes": [
|
|
7195
7195
|
{
|
|
7196
7196
|
"name": "disabled",
|
|
@@ -16422,7 +16422,7 @@
|
|
|
16422
16422
|
},
|
|
16423
16423
|
{
|
|
16424
16424
|
"name": "lr-textarea",
|
|
16425
|
-
"description": "`<lr-textarea>` — a multiline plain-text input primitive, form-associated via the\n`FormAssociated` mixin (see `<lr-chat-composer>`/`<lr-date-input>` for the same shape), so it\nparticipates in native `<form>` submission/validation/reset like any other text control --\n`name`/`value`/`disabled`/`required`/`checkValidity()`/`reportValidity()` all come from that mixin.\n\nShips an opt-in `label`/`hint`/`errorText` form-control chrome (props + matching named slots +\n`form-control-label`/`hint`/`error` parts), mirroring `<lr-select>`'s exact pattern -- left\nunset, the chrome remains hidden. A consumer preferring their own form-field layout can still\nignore these and wrap the element. A host `aria-label` is forwarded to the internal textbox;\nexternal `aria-labelledby`/`aria-describedby` idrefs are not copied across the shadow boundary.\n\n`minlength`/`maxlength` are forwarded to the internal native `<textarea>` and bridged into this\nelement's own `ElementInternals` as `tooShort`/`tooLong` by `updateValidity()`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, textarea, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `textarea` | The native `<textarea>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-textarea-max-block-size` (default: `none`) — Maximum auto-grown block size before the textarea scrolls.",
|
|
16425
|
+
"description": "`<lr-textarea>` — a multiline plain-text input primitive, form-associated via the\n`FormAssociated` mixin (see `<lr-chat-composer>`/`<lr-date-input>` for the same shape), so it\nparticipates in native `<form>` submission/validation/reset like any other text control --\n`name`/`value`/`disabled`/`required`/`checkValidity()`/`reportValidity()` all come from that mixin.\n\nShips an opt-in `label`/`hint`/`errorText` form-control chrome (props + matching named slots +\n`form-control-label`/`hint`/`error` parts), mirroring `<lr-select>`'s exact pattern -- left\nunset, the chrome remains hidden. A consumer preferring their own form-field layout can still\nignore these and wrap the element. A host `aria-label` is forwarded to the internal textbox;\nexternal `aria-labelledby`/`aria-describedby` idrefs are not copied across the shadow boundary.\n\n`minlength`/`maxlength` are forwarded to the internal native `<textarea>` and bridged into this\nelement's own `ElementInternals` as `tooShort`/`tooLong` by `updateValidity()`.\n`readonly` keeps the value focusable, selectable, copyable, and form-submittable while barring\nuser edits and constraint validation, matching the native textarea contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, textarea, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `textarea` | The native `<textarea>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-textarea-max-block-size` (default: `none`) — Maximum auto-grown block size before the textarea scrolls.",
|
|
16426
16426
|
"attributes": [
|
|
16427
16427
|
{
|
|
16428
16428
|
"name": "aria-label",
|
|
@@ -16544,6 +16544,15 @@
|
|
|
16544
16544
|
]
|
|
16545
16545
|
}
|
|
16546
16546
|
},
|
|
16547
|
+
{
|
|
16548
|
+
"name": "readonly",
|
|
16549
|
+
"description": "Forwards native read-only behavior to the internal textarea. The value remains focusable,\nselectable, copyable, and form-submittable; constraint validation is suspended until the\nproperty is unset.\n\nType: `boolean` \nDefault: `false`",
|
|
16550
|
+
"value": {
|
|
16551
|
+
"type": [
|
|
16552
|
+
"boolean"
|
|
16553
|
+
]
|
|
16554
|
+
}
|
|
16555
|
+
},
|
|
16547
16556
|
{
|
|
16548
16557
|
"name": "required",
|
|
16549
16558
|
"description": "Type: `boolean`",
|
|
@@ -16639,7 +16648,7 @@
|
|
|
16639
16648
|
},
|
|
16640
16649
|
{
|
|
16641
16650
|
"name": "lr-thread-list",
|
|
16642
|
-
"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`, `renderExcerpt`, `renderMeta`, and `renderRowContent`\nprovide focused virtualized render hooks -- `renderExcerpt` renders into the row item's own\n`excerpt` slot (winning over the plain-string `excerpt` property) for rich per-row content such\nas a highlighted search snippet. 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.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Slotted mode only: host-supplied `lr-conversation-item`s, rendered in order. Each top-level assigned element that doesn't already carry an explicit `role` is given `role=\"listitem\"`, since `[part=\"list\"]` is `role=\"list\"` in this mode and `lr-conversation-item` deliberately doesn't self-apply that role (see its own class doc). |\n| `empty` | Replaces the built-in empty state. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root. |\n| `empty` | The empty/no-matches state. |\n| `group-header` | A date/custom group header in data mode. |\n| `group-icon` | The decorative expand/collapse glyph. |\n| `group-label` | The group label inside `group-toggle`. |\n| `group-sticky` | `sticky-groups` only: the pinned copy of the current group's header, exported from the internal `lr-virtual-list`'s sticky layer. It wraps a full copy of the `group-header`/`group-toggle`/`group-label`/`group-icon` markup (which therefore styles both the real header row and the pinned copy), and carries `aria-hidden` — style it for the pinned band itself, e.g. a shadow or a border under the band. |\n| `group-toggle` | The controlled group expand/collapse button. |\n| `list` | The list region. |\n| `pin-glyph` | The small pin indicator shown in a pinned row's `meta` slot (data mode). |\n| `row` | Exported from the internal `lr-virtual-list`'s `row` part (data mode). |\n| `row-action` | A built-in pin/archive/delete icon button (data mode, when `rowActions` includes it). |\n| `row-actions` | The wrapper around built-in and `renderActions` output. |\n| `row-content` | The wrapper around `renderRowContent` output. |\n| `row-excerpt` | The wrapper around `renderExcerpt` output, slotted into the row item's own `excerpt` slot. |\n| `row-item-actions` | Data mode: the row item's `actions` wrapper. |\n| `row-item-active-indicator` | Data mode: the row item's decorative active indicator, exported from `lr-conversation-item`. |\n| `row-item-base` | Data mode: the row `<lr-conversation-item>`'s own `base` part — the box whose padding sets row height. `row-item-*` parts are the item's *internals*; the `row-*` parts above wrap this component's own callback output and are a different surface. Styling row density here replaces the older `::part(row) { --lr-theme-*: … }` workaround, which retheme'd the whole row subtree (`renderActions` popups included). |\n| `row-item-content` | Data mode: the row item's title/excerpt content column. |\n| `row-item-excerpt` | Data mode: the row item's excerpt line. |\n| `row-item-leading` | Data mode: the row item's `leading` wrapper. |\n| `row-item-meta` | Data mode: the row item's `meta` wrapper. |\n| `row-item-option` | Data mode: the row item's selectable `option` region. |\n| `row-item-rename-button` | Data mode: the row item's pencil/rename affordance. |\n| `row-item-timestamp` | Data mode: the row item's `<time>` element. |\n| `row-item-title` | Data mode: the row item's title text. |\n| `row-item-title-input` | Data mode: the row item's in-place rename `<input>`. |\n| `row-leading` | The wrapper around `renderLeading` output. |\n| `row-meta` | A wrapper around built-in or `renderMeta` metadata. |\n| `row-wrapper` | The wrapper around `wrapRow` output (data mode, only when `wrapRow` is set). Row-only: group headers are never passed through `wrapRow`, so they never carry it. |\n| `search` | The search field wrapper. |\n| `search-input` | The `<input type=\"search\">`. |\n| `viewport` | The real scroll container, exported from the internal `lr-virtual-list`. It fills this component's height with no consumer CSS (and falls back to `lr-virtual-list`'s own 24rem `--lr-virtual-list-height` default when the container has no resolvable height).
|
|
16651
|
+
"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`, `renderExcerpt`, `renderMeta`, and `renderRowContent`\nprovide focused virtualized render hooks -- `renderExcerpt` renders into the row item's own\n`excerpt` slot (winning over the plain-string `excerpt` property) for rich per-row content such\nas a highlighted search snippet. 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.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Slotted mode only: host-supplied `lr-conversation-item`s, rendered in order. Each top-level assigned element that doesn't already carry an explicit `role` is given `role=\"listitem\"`, since `[part=\"list\"]` is `role=\"list\"` in this mode and `lr-conversation-item` deliberately doesn't self-apply that role (see its own class doc). |\n| `empty` | Replaces the built-in empty state. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root. |\n| `empty` | The empty/no-matches state. |\n| `group-header` | A date/custom group header in data mode. |\n| `group-icon` | The decorative expand/collapse glyph. |\n| `group-label` | The group label inside `group-toggle`. |\n| `group-sticky` | `sticky-groups` only: the pinned copy of the current group's header, exported from the internal `lr-virtual-list`'s sticky layer. It wraps a full copy of the `group-header`/`group-toggle`/`group-label`/`group-icon` markup (which therefore styles both the real header row and the pinned copy), and carries `aria-hidden` — style it for the pinned band itself, e.g. a shadow or a border under the band. |\n| `group-toggle` | The controlled group expand/collapse button. |\n| `list` | The list region. |\n| `pin-glyph` | The small pin indicator shown in a pinned row's `meta` slot (data mode). |\n| `row` | Exported from the internal `lr-virtual-list`'s `row` part (data mode). |\n| `row-action` | A built-in pin/archive/delete icon button (data mode, when `rowActions` includes it). |\n| `row-actions` | The wrapper around built-in and `renderActions` output. |\n| `row-content` | The wrapper around `renderRowContent` output. |\n| `row-excerpt` | The wrapper around `renderExcerpt` output, slotted into the row item's own `excerpt` slot. |\n| `row-item-actions` | Data mode: the row item's `actions` wrapper. |\n| `row-item-active-indicator` | Data mode: the row item's decorative active indicator, exported from `lr-conversation-item`. |\n| `row-item-base` | Data mode: the row `<lr-conversation-item>`'s own `base` part — the box whose padding sets row height. `row-item-*` parts are the item's *internals*; the `row-*` parts above wrap this component's own callback output and are a different surface. Styling row density here replaces the older `::part(row) { --lr-theme-*: … }` workaround, which retheme'd the whole row subtree (`renderActions` popups included). |\n| `row-item-content` | Data mode: the row item's title/excerpt content column. |\n| `row-item-excerpt` | Data mode: the row item's excerpt line. |\n| `row-item-leading` | Data mode: the row item's `leading` wrapper. |\n| `row-item-meta` | Data mode: the row item's `meta` wrapper. |\n| `row-item-option` | Data mode: the row item's selectable `option` region. |\n| `row-item-rename-button` | Data mode: the row item's pencil/rename affordance. |\n| `row-item-timestamp` | Data mode: the row item's `<time>` element. |\n| `row-item-title` | Data mode: the row item's title text. |\n| `row-item-title-input` | Data mode: the row item's in-place rename `<input>`. |\n| `row-leading` | The wrapper around `renderLeading` output. |\n| `row-meta` | A wrapper around built-in or `renderMeta` metadata. |\n| `row-wrapper` | The wrapper around `wrapRow` output (data mode, only when `wrapRow` is set). Row-only: group headers are never passed through `wrapRow`, so they never carry it. |\n| `search` | The search field wrapper. |\n| `search-input` | The `<input type=\"search\">`. |\n| `viewport` | The real scroll container, exported from the internal `lr-virtual-list`. It fills this component's height with no consumer CSS (and falls back to `lr-virtual-list`'s own 24rem `--lr-virtual-list-height` default when the container has no resolvable height). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-thread-list-excerpt-highlight-background` (default: `var(--lr-color-warning-quiet)`) — Background of `<mark>` descendants returned by `renderExcerpt`.\n- `--lr-thread-list-excerpt-highlight-foreground` (default: `inherit`) — Foreground of `<mark>` descendants returned by `renderExcerpt`.\n- `--lr-thread-list-excerpt-highlight-radius` (default: `var(--lr-radius-xs)`) — Corner radius of `<mark>` descendants returned by `renderExcerpt`.\n- `--lr-thread-list-excerpt-highlight-padding` (default: `0`) — Padding of `<mark>` descendants returned by `renderExcerpt`.",
|
|
16643
16652
|
"attributes": [
|
|
16644
16653
|
{
|
|
16645
16654
|
"name": "active-id",
|
|
@@ -21230,6 +21239,22 @@
|
|
|
21230
21239
|
"name": "--lr-thinking-panel-max-block-size",
|
|
21231
21240
|
"description": "**`<lr-thinking-panel>`** (default: `var(--lr-size-16rem)`) — Cap on how tall the expanded reasoning transcript grows before `[part=\"body\"]` scrolls internally."
|
|
21232
21241
|
},
|
|
21242
|
+
{
|
|
21243
|
+
"name": "--lr-thread-list-excerpt-highlight-background",
|
|
21244
|
+
"description": "**`<lr-thread-list>`** (default: `var(--lr-color-warning-quiet)`) — Background of `<mark>` descendants returned by `renderExcerpt`."
|
|
21245
|
+
},
|
|
21246
|
+
{
|
|
21247
|
+
"name": "--lr-thread-list-excerpt-highlight-foreground",
|
|
21248
|
+
"description": "**`<lr-thread-list>`** (default: `inherit`) — Foreground of `<mark>` descendants returned by `renderExcerpt`."
|
|
21249
|
+
},
|
|
21250
|
+
{
|
|
21251
|
+
"name": "--lr-thread-list-excerpt-highlight-padding",
|
|
21252
|
+
"description": "**`<lr-thread-list>`** (default: `0`) — Padding of `<mark>` descendants returned by `renderExcerpt`."
|
|
21253
|
+
},
|
|
21254
|
+
{
|
|
21255
|
+
"name": "--lr-thread-list-excerpt-highlight-radius",
|
|
21256
|
+
"description": "**`<lr-thread-list>`** (default: `var(--lr-radius-xs)`) — Corner radius of `<mark>` descendants returned by `renderExcerpt`."
|
|
21257
|
+
},
|
|
21233
21258
|
{
|
|
21234
21259
|
"name": "--lr-time-range-base-size",
|
|
21235
21260
|
"description": "**`<lr-time-range>`** (default: `1.5rem*scale`) — Brush baseline block size."
|