@adia-ai/web-modules 0.8.31 → 0.8.33
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 +41 -0
- package/chat/chat-composer/chat-composer.d.ts +1 -1
- package/chat/chat-shell/chat-shell.d.ts +5 -5
- package/chat/chat-shell/css/chat-shell.messages.css +18 -0
- package/chat/chat-sidebar/chat-sidebar.d.ts +2 -2
- package/dist/chat/chat-shell.min.css +1 -1
- package/dist/everything.min.js +106 -104
- package/dist/web-modules.min.css +1 -1
- package/dist/web-modules.sheet.js +1 -1
- package/editor/editor-sidebar/editor-sidebar.d.ts +1 -1
- package/editor/editor-toolbar/editor-toolbar.d.ts +1 -1
- package/form/form-popover/form-popover.a2ui.json +4 -1
- package/form/form-popover/form-popover.css +39 -0
- package/form/form-popover/form-popover.js +33 -0
- package/form/form-popover/form-popover.yaml +20 -0
- package/package.json +6 -6
- package/runtime/a2ui-root/a2ui-root.d.ts +5 -5
- package/shell/admin-command/admin-command.d.ts +1 -1
- package/shell/admin-shell/admin-shell.d.ts +3 -3
- package/shell/admin-sidebar/admin-sidebar.d.ts +2 -2
- package/theme/theme-panel/theme-panel.d.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
# Changelog — @adia-ai/web-modules
|
|
2
2
|
|
|
3
|
+
## [0.8.33] — 2026-08-11
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- **`confirm-dialog-ui`'s demo no longer models a destructive "Discard" as ConfirmDialog's cancel action (gh#860, part of; item 2 of the #853 split-off — item 1, combobox/command option semantics, stays open).** CodeRabbit's original PR #851 finding: the "Basic — save changes" example set `cancel-text="Discard"` on `<confirm-dialog-ui>`, directly contradicting the page's own copy ("Do NOT model the cancel option as a 'Discard' action... belongs in AlertDialog") and yaml `a2ui.rules`. Operator ruling (issue #860) picked switching the example's construct over softening its cancel action — a non-destructive cancel-text on the same scenario would have hidden the boundary the demo exists to teach. The section now demonstrates the discard-unsaved-changes flow with `<modal-ui role="alertdialog">` (Cancel / danger-toned Discard / primary Save & close), the same composition `alert-dialog.examples.html`'s "warning-unsaved" section already canonicalizes. Also fixed the page's adjacent "Related" link, which pointed at the nonexistent `/site/components/alertdialog` — the real route is `/site/patterns/alert-dialog` (AlertDialog is a pattern, not a registered primitive tag; there is no `<alert-dialog-ui>` custom element). Regenerated via `node scripts/build/site-a2ui.mjs --page /site/components/confirm-dialog`; `npm run verify:site-a2ui` clean (score 100, no new findings).
|
|
8
|
+
- **8 site-a2ui example previews rendered their empty/default state instead of the documented non-empty ones (gh#853).** Root causes split three ways, all in the SOURCE `.examples.html` fixtures / their yaml contracts — never the generated `.a2ui.json`:
|
|
9
|
+
- **Array/string-prop data was set via a post-upgrade `<script>` JS property assignment** (`el.integrations = …`, `el.invoices = …`, etc.) instead of an inline HTML attribute — invisible to the static HTML→A2UI transpile, which only reads attributes. `integrations-page`, `invoice-history`, `payment-method-list`, `plan-picker`, and `notification-preferences`' `preferences`/`channels` now carry the same demo data as an inline JSON attribute (`integrations='[{...}]'`, mirroring `chart-ui`'s existing `data='[{...}]'` convention) alongside the unchanged `<script>` block (still exercises the real live-DOM property-set path).
|
|
10
|
+
- **`date-range-selector.yaml` never declared `disabled`/`name` in `props:`** even though both are real, reflected `UIFormElement` properties the component already implements (and the demo markup already set) — the catalog-driven extractor only carries attributes a yaml declares. Added, mirroring the sibling `payment-method-form.yaml` pattern.
|
|
11
|
+
- **`invoice-detail.invoice` and `notification-preferences.channelEnabled` are `type: object` props** — the transpiler's catalog-driven extractor had no object branch (only string/boolean/number/array), so these were unreachable via any attribute shape. Fixed at the transpiler (`@adia-ai/a2ui-compose` CHANGELOG); fixtures now set them as JSON-object attributes.
|
|
12
|
+
- **`channelEnabled`'s catalog key is camelCase but HTML attributes lowercase on parse** — also fixed at the transpiler (kebab-case fallback); the fixture uses `channel-enabled='{...}'`.
|
|
13
|
+
- **`payment-method-form`'s `tokenizing` state had no `props:` entry at all** — it's set internally by `tokenize()` via raw `setAttribute`/`removeAttribute`, mirroring the existing "declared despite being externally read-only" precedent already set by `value`/`error` on this same component. Added to `props:` (yaml) AND to `payment-method-form.class.js`'s `static properties` (the latter closes an `audit:static-properties-vs-yaml` critical the yaml-only edit would have introduced — `reflect: true` needs a matching class.js entry or `el.tokenizing = x` silently no-ops).
|
|
14
|
+
- Regenerated via `node scripts/build/site-a2ui.mjs --page <route>` for all 8 routes; never hand-edited the generated `.a2ui.json`.
|
|
15
|
+
- **`form-popover-ui`'s trigger gains select-ui's hover/focus recipe and an aria-expanded/aria-haspopup contract (gh#857, part 1+2 of 3; panel-border token mismatch stays open — see the issue's Findings).** `form-popover.css` re-pointed only the trigger's rest-state `button-ui` tokens (bg/fg/border); hover/focus fell through to `button-ui`'s own uncoordinated default (a heavier neutral fill), unlike `select.css:103-125`'s explicit `--select-bg-hover`/`--select-border-hover`/`--select-focus-ring` recipe. Added the matching `--form-popover-trigger-bg-hover`/`-border-hover`/`-focus-ring` tokens, an explicit hover override, and a `--button-focus-ring` re-point (same consumer-override path the file's rest-state block already uses). Separately, neither `popover.class.js` nor `form-popover.js` ever set `aria-expanded`/`aria-haspopup` on the trigger — `form-popover.js` now stamps `aria-haspopup="dialog"` + `aria-expanded="false"` at construction and keeps `aria-expanded` synced to the internal `popover-ui`'s own `[open]` reflection via a `MutationObserver` (same DOM-is-the-source-of-truth pattern the existing summary observer uses). Scoped to `form-popover-ui` only — `popover-ui` itself stays the documented generic anchored surface with no role/expanded semantics of its own (`popover.yaml`'s decision rule); arrow-key listbox navigation was deliberately NOT added, since the panel holds an arbitrary form fragment (checks/radios/inputs), never an option list — documented in `form-popover.yaml`'s new "Accessibility contract" note.
|
|
16
|
+
- **`payment-method-form.examples.html` used a nonexistent `<option-ui>` tag (gh#848).** `<select-ui>` reads declarative native `<option>` children (FB-79 — `extractSelectOptions` folds them into the `options` prop); `option-ui` is defined nowhere in `packages/`, so the country picker's two options were invisible to the transpiler and the whole form converted to a hollow container. Replaced with native `<option>`; the converted page now renders the real form with "United States" selected (browser-probed).
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- **BREAKING + VISIBLE BEHAVIOR CHANGE — `billing-overview`/`invoice-history`/`plan-picker`/`simple-hero`/`simple-shell` follow `badge-ui`/`tag-ui`/`button-ui`'s `accent` retirement (variant/color/tone convention cut, gh#873, gh#874, gh#875, gh#876).** `plan-picker.class.js`'s "Recommended" pill (`tag-ui`) moves `variant="accent"`→`variant="primary"`; its "Current plan" pill's `setAttribute('variant', 'muted')` is dropped entirely — `muted` was never a valid `tag-ui` `variant` value (a pre-existing invalid-value no-op; the invalid value matched no rule and fell through to the family-less solid base pair every bare tag renders unconditionally, gh#794, so dropping the call is a zero-visual-change edit — not, as first stated, `tone` defaulting to muted). `simple-hero`/`simple-shell`'s CTA examples move `variant="solid" color="accent"` → `variant="primary"` (`button-ui`'s `color="accent"` never had CSS — gh#875's re-confirmed finding — so this is a stated remap of the authored *intent*, not a mechanical rename; the button finally renders the fill it was asking for). Two pre-existing latent bugs surfaced and fixed while sweeping the adjacent vocabulary, both independent of the accent retirement itself: `invoice-history.class.js`'s `STATUS_TO_VARIANT` map used `variant="neutral"` (draft) and a `'neutral'` fallback default on its status `badge-ui` — never a valid badge variant post-cut, now `tone="muted"`; `billing-overview.class.js`'s `STATUS_TO_VARIANT` map used `variant="muted"` (canceled) on its status `tag-ui` — `muted` was never a valid `tag-ui` variant value even before this cut (tag's `variant` enum is the family axis; `muted` only ever existed on `tone`), now `tone="muted"`. Both status badges are DOM elements read across re-renders, so the fix explicitly clears the attribute not taken (`variant`/`tone`) on each branch, not just sets the one taken — a stale attribute from a prior render otherwise survives.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- **18 web-module composites are now reachable from the A2UI wire (gh#848).** Every module listed in `packages/a2ui/runtime/CHANGELOG.md`'s Unreleased entry ships a full contract but had no runtime-registry mapping, so any A2UI document naming them (including the converted docs pages for their own `/site/components/*` routes) rendered a blank shell. No module source changed — this is purely the registry side of the gap.
|
|
25
|
+
|
|
26
|
+
### Maintenance
|
|
27
|
+
- **`dashboard/` touched in this release window** (2 file(s), e.g. `date-range-selector/date-range-selector.a2ui.json`) — carried by the entries above.
|
|
28
|
+
- **`dist/` bundles rebuilt** in this cut's window (3 file(s)) — regenerated from the source changes described above, not independent edits.
|
|
29
|
+
- **`feedback/` touched in this release window** (2 file(s), e.g. `confirm-dialog/confirm-dialog.examples.html`) — carried by the entries above.
|
|
30
|
+
- **`settings/` touched in this release window** (2 file(s), e.g. `integrations-page/integrations-page.examples.html`) — carried by the entries above.
|
|
31
|
+
|
|
32
|
+
## [0.8.32] — 2026-08-09
|
|
33
|
+
|
|
34
|
+
### Maintenance
|
|
35
|
+
- **Every `.d.ts` with a custom `events:` block regenerated — `addEventListener` overload order fixed at the generator** (gh#711 S1 review, `@adia-ai/web-components` CHANGELOG has the root-cause writeup). `scripts/build/dts-codegen.mjs` now emits event-specific overloads before the generic `HTMLElementEventMap` fallback instead of after, so TS overload resolution stops silently shadowing typed custom-event overloads (`change` chief among them, since it's also a literal `HTMLElementEventMap` key). Reordering only — `npm run typecheck` stays clean.
|
|
36
|
+
- **`dist/` bundles rebuilt** in this cut's window (4 file(s)) — regenerated from the source changes described above, not independent edits.
|
|
37
|
+
- **`editor/` touched in this release window** (2 file(s), e.g. `editor-sidebar/editor-sidebar.d.ts`) — carried by the entries above.
|
|
38
|
+
- **`runtime/` touched in this release window** (1 file(s), e.g. `a2ui-root/a2ui-root.d.ts`) — carried by the entries above.
|
|
39
|
+
- **`theme/` touched in this release window** (1 file(s), e.g. `theme-panel/theme-panel.d.ts`) — carried by the entries above.
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
- **`chat-shell` message rows hosting a generated surface no longer inherit the prose reading-width cap (gh#719).** Every `[data-role]` row carried `max-width: var(--chat-message-max-width)` (85%) — right for conversational text bubbles, wrong for rows whose bubble hosts a mounted A2UI surface (a full structured card/form, e.g. a follow-up proposal or working differential). Two mount shapes carry a surface and both are now exempted: `[data-bubble][data-surface]` (a consumer's own attribute-on-bubble convention, e.g. patient-visit's `hydrate.js`) and `[data-bubble]:has(> [data-surface-root])` (`chat-shell`'s own registry mount — `chat-surfaces.js`'s `createSurfaceRegistry#route` appends an "island" div as a direct child of the bubble, with no attribute on the bubble itself; every `agent-chat`/`agent-admin` surface row rides this shape). Follows the file's own existing exemption precedent for `[data-role="error"]`.
|
|
43
|
+
|
|
3
44
|
## [0.8.31] — 2026-08-07
|
|
4
45
|
|
|
5
46
|
### Fixed
|
|
@@ -34,10 +34,10 @@ code. Propagated to the inner input element automatically.
|
|
|
34
34
|
*/
|
|
35
35
|
disabled: boolean;
|
|
36
36
|
|
|
37
|
+
addEventListener(type: 'composer-submit', listener: (ev: ChatComposerComposerSubmitEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
37
38
|
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
38
39
|
type: K,
|
|
39
40
|
listener: (this: ChatComposer, ev: HTMLElementEventMap[K]) => unknown,
|
|
40
41
|
options?: boolean | AddEventListenerOptions,
|
|
41
42
|
): void;
|
|
42
|
-
addEventListener(type: 'composer-submit', listener: (ev: ChatComposerComposerSubmitEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
43
43
|
}
|
|
@@ -79,11 +79,6 @@ export class ChatShell extends UIElement {
|
|
|
79
79
|
/** Enable Anthropic extended-thinking mode. */
|
|
80
80
|
thinking: boolean;
|
|
81
81
|
|
|
82
|
-
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
83
|
-
type: K,
|
|
84
|
-
listener: (this: ChatShell, ev: HTMLElementEventMap[K]) => unknown,
|
|
85
|
-
options?: boolean | AddEventListenerOptions,
|
|
86
|
-
): void;
|
|
87
82
|
addEventListener(type: 'abort', listener: (ev: ChatShellAbortEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
88
83
|
addEventListener(type: 'chunk', listener: (ev: ChatShellChunkEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
89
84
|
addEventListener(type: 'clear', listener: (ev: ChatShellClearEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
@@ -92,4 +87,9 @@ export class ChatShell extends UIElement {
|
|
|
92
87
|
addEventListener(type: 'message', listener: (ev: ChatShellMessageEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
93
88
|
addEventListener(type: 'submit', listener: (ev: ChatShellSubmitEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
94
89
|
addEventListener(type: 'thinking', listener: (ev: ChatShellThinkingEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
90
|
+
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
91
|
+
type: K,
|
|
92
|
+
listener: (this: ChatShell, ev: HTMLElementEventMap[K]) => unknown,
|
|
93
|
+
options?: boolean | AddEventListenerOptions,
|
|
94
|
+
): void;
|
|
95
95
|
}
|
|
@@ -63,6 +63,24 @@ chat-shell [data-role="assistant"] [data-bubble] {
|
|
|
63
63
|
border-bottom-left-radius: var(--chat-assistant-tail-radius);
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
/* Generated-surface row — a mounted A2UI surface (structured card/form,
|
|
67
|
+
not conversational prose) shouldn't inherit the reading-width cap meant
|
|
68
|
+
for text bubbles. Mirrors the [data-role="error"] exemption below: "not
|
|
69
|
+
a conversational text bubble" already has precedent here.
|
|
70
|
+
|
|
71
|
+
Two mount shapes carry a surface, and neither is optional:
|
|
72
|
+
- [data-bubble][data-surface] — the attribute-on-bubble convention a
|
|
73
|
+
consumer (e.g. patient-visit's hydrate.js) applies to its own bubble.
|
|
74
|
+
- [data-bubble]:has(> [data-surface-root]) — chat-shell's OWN registry
|
|
75
|
+
mount (chat-surfaces.js's createSurfaceRegistry#route): an "island"
|
|
76
|
+
div appended as a direct child of the bubble, with no attribute on
|
|
77
|
+
the bubble itself. Every agent-chat / agent-admin surface row rides
|
|
78
|
+
this shape, not the patient-visit one. */
|
|
79
|
+
chat-shell [data-role]:has([data-bubble][data-surface]),
|
|
80
|
+
chat-shell [data-role]:has([data-bubble] > [data-surface-root]) {
|
|
81
|
+
max-width: none;
|
|
82
|
+
}
|
|
83
|
+
|
|
66
84
|
/* Error message */
|
|
67
85
|
chat-shell [data-role="error"] {
|
|
68
86
|
align-self: center;
|
|
@@ -60,11 +60,11 @@ Useful for suppressing transitions while dragging.
|
|
|
60
60
|
*/
|
|
61
61
|
resizing: boolean;
|
|
62
62
|
|
|
63
|
+
addEventListener(type: 'sidebar-resize', listener: (ev: ChatSidebarSidebarResizeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
64
|
+
addEventListener(type: 'sidebar-toggle', listener: (ev: ChatSidebarSidebarToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
63
65
|
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
64
66
|
type: K,
|
|
65
67
|
listener: (this: ChatSidebar, ev: HTMLElementEventMap[K]) => unknown,
|
|
66
68
|
options?: boolean | AddEventListenerOptions,
|
|
67
69
|
): void;
|
|
68
|
-
addEventListener(type: 'sidebar-resize', listener: (ev: ChatSidebarSidebarResizeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
69
|
-
addEventListener(type: 'sidebar-toggle', listener: (ev: ChatSidebarSidebarToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
70
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
:where(chat-shell){--chat-bg:var(--a-canvas-0);--chat-border:unset;--chat-radius:unset;--chat-header-height:var(--a-chrome-app-header-height);--chat-header-px:var(--a-space-4);--chat-header-gap:var(--a-space-2);--chat-header-border:1px solid var(--md-sys-color-neutral-outline-variant);--chat-messages-px:var(--a-space-4);--chat-messages-py:var(--a-space-4);--chat-messages-gap:var(--a-space-3);--chat-message-max-width:85%;--chat-user-bg:var(--md-sys-color-primary);--chat-user-fg:var(--md-sys-color-primary-on-primary);--chat-user-radius:var(--a-radius-md);--chat-user-tail-radius:var(--a-radius-sm);--chat-user-px:var(--a-space-3);--chat-user-py:var(--a-space-1);--chat-assistant-bg:var(--a-canvas-2);--chat-assistant-fg:var(--md-sys-color-neutral-on-surface);--chat-assistant-radius:var(--a-radius-lg);--chat-assistant-tail-radius:var(--a-radius-sm);--chat-assistant-px:var(--a-space-3);--chat-assistant-py:var(--a-space-1);--chat-avatar-size:1.75rem;--chat-avatar-bg:var(--chat-assistant-bg);--chat-avatar-fg:var(--chat-assistant-fg);--chat-avatar-font:var(--a-ui-sm);--chat-avatar-weight:var(--a-weight-semibold);--chat-cursor-width:2px;--chat-cursor-color:currentColor;--chat-cursor-speed:.8s;--chat-footer-px:var(--a-space-3);--chat-footer-py:var(--a-space-3);--chat-actions-gap:var(--a-space-1);--chat-code-bg:var(--a-canvas-2);--chat-code-radius:var(--a-radius-md);--chat-font-size:var(--a-ui-size);--chat-line-height:var(--a-leading-normal);--chat-weight-semibold:var(--a-weight-semibold);--chat-header-name-font:var(--a-ui-lg);--chat-header-status-font:var(--a-ui-md);--chat-header-status-fg:var(--a-fg-muted);--chat-error-gap:var(--a-space-2);--chat-error-fg:var(--a-danger-strong);--chat-error-font:var(--a-ui-sm);--chat-actions-duration:var(--a-duration-fast);--chat-actions-easing:var(--a-easing);--chat-avatar-radius:var(--a-radius-full);--chat-thinking-fg:var(--a-fg-muted);--chat-code-inline-radius:var(--a-radius-sm);--chat-code-inline-family:var(--a-font-family-code);--chat-code-block-px:var(--a-space-3);--chat-code-block-my:var(--a-space-2);--chat-code-block-font:var(--a-ui-sm)}chat-shell{box-sizing:border-box;border:var(--chat-border);border-radius:var(--chat-radius);background:var(--chat-bg);flex-direction:column;height:100%;display:flex;overflow:hidden}chat-shell>header{align-items:center;gap:var(--chat-header-gap);min-height:var(--chat-header-height);padding:0 var(--chat-header-px);border-bottom:var(--chat-header-border);flex-shrink:0;display:flex}chat-shell>header [data-chat-name]{font-weight:var(--chat-weight-semibold);font-size:var(--chat-header-name-font)}chat-shell>header chat-status{font-size:var(--chat-header-status-font);color:var(--chat-header-status-fg);margin-inline-start:auto}chat-shell>chat-thread,chat-shell>section{padding:var(--chat-messages-py) var(--chat-messages-px);gap:var(--chat-messages-gap);flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}chat-shell>footer{padding:var(--chat-footer-py) var(--chat-footer-px);flex-shrink:0;align-items:center;display:flex}chat-shell>footer chat-input-ui{flex:1}chat-shell [data-role]{gap:var(--chat-header-gap);max-width:var(--chat-message-max-width);align-items:flex-end;display:flex}chat-shell [data-role=user]{flex-direction:row-reverse;align-self:flex-end}chat-shell [data-role=assistant]{align-self:flex-start}chat-shell [data-role] [data-avatar]{width:var(--chat-avatar-size);height:var(--chat-avatar-size);border-radius:var(--chat-avatar-radius);background:var(--chat-avatar-bg);color:var(--chat-avatar-fg);font-size:var(--chat-avatar-font);font-weight:var(--chat-avatar-weight);flex-shrink:0;justify-content:center;align-items:center;display:flex}chat-shell [data-role] [data-bubble]{padding:var(--chat-assistant-py) var(--chat-assistant-px);border-radius:var(--chat-assistant-radius);font-size:var(--chat-font-size);line-height:var(--chat-line-height);white-space:pre-wrap;word-break:break-word}chat-shell [data-role] [data-bubble]>:first-child{margin-block-start:0}chat-shell [data-role] [data-bubble]>:last-child{margin-block-end:0}chat-shell [data-role=user] [data-bubble]{background:var(--chat-user-bg);color:var(--chat-user-fg);padding:var(--chat-user-py) var(--chat-user-px);border-radius:var(--chat-user-radius);border-bottom-right-radius:var(--chat-user-tail-radius)}chat-shell [data-role=assistant] [data-bubble]{background:var(--chat-assistant-bg);color:var(--chat-assistant-fg);border-bottom-left-radius:var(--chat-assistant-tail-radius)}chat-shell [data-role=error]{align-self:center;align-items:center;gap:var(--chat-error-gap);max-width:none;color:var(--chat-error-fg);font-size:var(--chat-error-font);display:flex}chat-shell [data-role] [data-actions]{gap:var(--chat-actions-gap);opacity:0;transition:opacity var(--chat-actions-duration) var(--chat-actions-easing);display:flex}chat-shell [data-role]:hover [data-actions]{opacity:1}chat-shell [data-cursor]{width:var(--chat-cursor-width);background:var(--chat-cursor-color);vertical-align:text-bottom;height:1em;animation:chat-shell-blink var(--chat-cursor-speed) step-end infinite;margin-inline-start:1px;display:inline-block}@keyframes chat-shell-blink{50%{opacity:0}}@media (prefers-reduced-motion:reduce){chat-shell [data-cursor]{opacity:.7;animation:none}}chat-shell [data-role=assistant][data-thinking] [data-bubble]{color:var(--chat-thinking-fg)}chat-shell [data-bubble] [data-content]{white-space:normal}chat-shell [data-bubble] [data-content] p{margin:0 0 .5em}chat-shell [data-bubble] [data-content] p:last-child{margin-bottom:0}chat-shell [data-bubble] [data-content] strong{font-weight:var(--chat-weight-semibold)}chat-shell [data-bubble] [data-content] code{background:var(--chat-code-bg);border-radius:var(--chat-code-inline-radius);font-family:var(--chat-code-inline-family);padding:.1em .15em;font-size:.875em}chat-shell [data-bubble] [data-content] pre{background:var(--chat-code-bg);border-radius:var(--chat-code-radius);padding:var(--chat-code-block-px);margin:var(--chat-code-block-my) 0;font-size:var(--chat-code-block-font);line-height:1.5;overflow-x:auto}chat-shell [data-bubble] [data-content] pre code{font-size:inherit;background:0 0;border-radius:0;padding:0}chat-shell [data-bubble] [data-content] ul,chat-shell [data-bubble] [data-content] ol{margin:.25em 0;padding-inline-start:1.25em}chat-shell [data-bubble] [data-content] li{margin-bottom:.15em}chat-shell [data-bubble] [data-content] a{color:inherit;text-underline-offset:2px;text-decoration:underline}chat-shell [data-bubble] [data-content] h1,chat-shell [data-bubble] [data-content] h2,chat-shell [data-bubble] [data-content] h3,chat-shell [data-bubble] [data-content] h4{font-weight:var(--chat-weight-semibold);margin:.75em 0 .25em}chat-shell [data-bubble] [data-content] h1:first-child,chat-shell [data-bubble] [data-content] h2:first-child,chat-shell [data-bubble] [data-content] h3:first-child{margin-top:0}chat-shell chat-empty{margin:auto}chat-shell[streaming] chat-empty,chat-shell:has([data-role]) chat-empty{display:none}chat-shell>chat-header,chat-sidebar>chat-header[slot=header],chat-sidebar>chat-header:first-child{align-items:center;gap:var(--chat-header-gap,var(--a-space-2));padding:0 var(--chat-header-px,var(--a-space-3));height:var(--chat-header-height,var(--a-size-lg));font-size:var(--chat-header-font,var(--a-ui-size));border-bottom:var(--chat-border,1px solid var(--md-sys-color-neutral-outline-variant));background:var(--chat-bg,var(--md-sys-color-neutral-background));flex-shrink:0;display:flex}chat-header>[slot=name]{font-weight:var(--a-weight-medium,500);color:var(--md-sys-color-neutral-on-surface)}chat-header>[slot=status]{margin-inline-start:var(--a-space-2)}chat-header>[slot=action]:first-of-type{margin-inline-start:auto}chat-header>[slot=action-leading]{margin-inline-end:var(--a-space-2)}chat-status{align-items:center;gap:var(--a-space-1);font-size:var(--a-ui-sm);color:var(--a-fg-muted);display:inline-flex}chat-shell>chat-thread{overscroll-behavior:contain;gap:var(--chat-message-gap,var(--a-space-3));min-height:0;padding:var(--chat-thread-py,var(--a-space-4)) var(--chat-thread-px,var(--a-space-4));background:var(--chat-thread-bg,var(--md-sys-color-neutral-background));flex-direction:column;flex:1;display:flex;overflow-y:auto}chat-thread:not([empty])>chat-empty{display:none}chat-thread[empty]>chat-empty{padding:var(--a-space-6);flex:1;justify-content:center;align-items:center;display:flex}chat-shell>chat-composer{align-items:stretch;gap:var(--a-space-2);padding:var(--chat-composer-py,var(--a-space-3)) var(--chat-composer-px,var(--a-space-3));border-top:var(--chat-border,1px solid var(--md-sys-color-neutral-outline-variant));background:var(--chat-bg,var(--md-sys-color-neutral-background));flex-shrink:0;display:flex}chat-composer>[slot=leading],chat-composer>[slot=attach],chat-composer>[slot=trailing]{align-items:center;gap:var(--a-space-1);flex-shrink:0;display:inline-flex}chat-composer>:is(chat-input-ui,input-ui,textarea-ui){flex:1;min-width:0}chat-composer[disabled]{opacity:.6;pointer-events:none}:is(chat-sidebar[slot=leading],chat-sidebar[slot=trailing]){min-width:var(--chat-sidebar-min-width,48px);max-width:var(--chat-sidebar-max-width,480px);min-height:0;font-size:var(--chat-sidebar-font,var(--a-ui-size));transition:width var(--chat-duration,var(--a-duration,.2s)) var(--chat-easing,var(--a-easing,ease));background:var(--chat-bg,var(--md-sys-color-neutral-background));flex-direction:column;flex-shrink:0;display:flex;position:relative;container:sidebar/inline-size}chat-sidebar[slot=leading]{width:var(--chat-sidebar-width-leading,240px);border-right:var(--chat-border,1px solid var(--md-sys-color-neutral-outline-variant))}chat-sidebar[slot=trailing]{width:var(--chat-sidebar-width-trailing,320px);border-left:var(--chat-border,1px solid var(--md-sys-color-neutral-outline-variant))}:is(chat-sidebar[slot=leading],chat-sidebar[slot=trailing])>[data-resize]{cursor:col-resize;z-index:1;-webkit-user-select:none;user-select:none;width:6px;position:absolute;top:0;bottom:0}chat-sidebar[slot=leading]>[data-resize]{right:-3px}chat-sidebar[slot=trailing]>[data-resize]{left:-3px}:is(chat-sidebar[slot=leading],chat-sidebar[slot=trailing])>[data-resize]:hover{background:var(--md-sys-color-primary);opacity:.5}chat-sidebar[resizing]{transition:none}chat-sidebar[resizing]>[data-resize]{background:var(--md-sys-color-primary);opacity:.8}chat-shell:has(>chat-sidebar){flex-direction:row;display:flex}chat-shell:has(>chat-sidebar)>:not(chat-sidebar){display:contents}
|
|
1
|
+
:where(chat-shell){--chat-bg:var(--a-canvas-0);--chat-border:unset;--chat-radius:unset;--chat-header-height:var(--a-chrome-app-header-height);--chat-header-px:var(--a-space-4);--chat-header-gap:var(--a-space-2);--chat-header-border:1px solid var(--md-sys-color-neutral-outline-variant);--chat-messages-px:var(--a-space-4);--chat-messages-py:var(--a-space-4);--chat-messages-gap:var(--a-space-3);--chat-message-max-width:85%;--chat-user-bg:var(--md-sys-color-primary);--chat-user-fg:var(--md-sys-color-primary-on-primary);--chat-user-radius:var(--a-radius-md);--chat-user-tail-radius:var(--a-radius-sm);--chat-user-px:var(--a-space-3);--chat-user-py:var(--a-space-1);--chat-assistant-bg:var(--a-canvas-2);--chat-assistant-fg:var(--md-sys-color-neutral-on-surface);--chat-assistant-radius:var(--a-radius-lg);--chat-assistant-tail-radius:var(--a-radius-sm);--chat-assistant-px:var(--a-space-3);--chat-assistant-py:var(--a-space-1);--chat-avatar-size:1.75rem;--chat-avatar-bg:var(--chat-assistant-bg);--chat-avatar-fg:var(--chat-assistant-fg);--chat-avatar-font:var(--a-ui-sm);--chat-avatar-weight:var(--a-weight-semibold);--chat-cursor-width:2px;--chat-cursor-color:currentColor;--chat-cursor-speed:.8s;--chat-footer-px:var(--a-space-3);--chat-footer-py:var(--a-space-3);--chat-actions-gap:var(--a-space-1);--chat-code-bg:var(--a-canvas-2);--chat-code-radius:var(--a-radius-md);--chat-font-size:var(--a-ui-size);--chat-line-height:var(--a-leading-normal);--chat-weight-semibold:var(--a-weight-semibold);--chat-header-name-font:var(--a-ui-lg);--chat-header-status-font:var(--a-ui-md);--chat-header-status-fg:var(--a-fg-muted);--chat-error-gap:var(--a-space-2);--chat-error-fg:var(--a-danger-strong);--chat-error-font:var(--a-ui-sm);--chat-actions-duration:var(--a-duration-fast);--chat-actions-easing:var(--a-easing);--chat-avatar-radius:var(--a-radius-full);--chat-thinking-fg:var(--a-fg-muted);--chat-code-inline-radius:var(--a-radius-sm);--chat-code-inline-family:var(--a-font-family-code);--chat-code-block-px:var(--a-space-3);--chat-code-block-my:var(--a-space-2);--chat-code-block-font:var(--a-ui-sm)}chat-shell{box-sizing:border-box;border:var(--chat-border);border-radius:var(--chat-radius);background:var(--chat-bg);flex-direction:column;height:100%;display:flex;overflow:hidden}chat-shell>header{align-items:center;gap:var(--chat-header-gap);min-height:var(--chat-header-height);padding:0 var(--chat-header-px);border-bottom:var(--chat-header-border);flex-shrink:0;display:flex}chat-shell>header [data-chat-name]{font-weight:var(--chat-weight-semibold);font-size:var(--chat-header-name-font)}chat-shell>header chat-status{font-size:var(--chat-header-status-font);color:var(--chat-header-status-fg);margin-inline-start:auto}chat-shell>chat-thread,chat-shell>section{padding:var(--chat-messages-py) var(--chat-messages-px);gap:var(--chat-messages-gap);flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}chat-shell>footer{padding:var(--chat-footer-py) var(--chat-footer-px);flex-shrink:0;align-items:center;display:flex}chat-shell>footer chat-input-ui{flex:1}chat-shell [data-role]{gap:var(--chat-header-gap);max-width:var(--chat-message-max-width);align-items:flex-end;display:flex}chat-shell [data-role=user]{flex-direction:row-reverse;align-self:flex-end}chat-shell [data-role=assistant]{align-self:flex-start}chat-shell [data-role] [data-avatar]{width:var(--chat-avatar-size);height:var(--chat-avatar-size);border-radius:var(--chat-avatar-radius);background:var(--chat-avatar-bg);color:var(--chat-avatar-fg);font-size:var(--chat-avatar-font);font-weight:var(--chat-avatar-weight);flex-shrink:0;justify-content:center;align-items:center;display:flex}chat-shell [data-role] [data-bubble]{padding:var(--chat-assistant-py) var(--chat-assistant-px);border-radius:var(--chat-assistant-radius);font-size:var(--chat-font-size);line-height:var(--chat-line-height);white-space:pre-wrap;word-break:break-word}chat-shell [data-role] [data-bubble]>:first-child{margin-block-start:0}chat-shell [data-role] [data-bubble]>:last-child{margin-block-end:0}chat-shell [data-role=user] [data-bubble]{background:var(--chat-user-bg);color:var(--chat-user-fg);padding:var(--chat-user-py) var(--chat-user-px);border-radius:var(--chat-user-radius);border-bottom-right-radius:var(--chat-user-tail-radius)}chat-shell [data-role=assistant] [data-bubble]{background:var(--chat-assistant-bg);color:var(--chat-assistant-fg);border-bottom-left-radius:var(--chat-assistant-tail-radius)}chat-shell [data-role]:has([data-bubble][data-surface]),chat-shell [data-role]:has([data-bubble]>[data-surface-root]){max-width:none}chat-shell [data-role=error]{align-self:center;align-items:center;gap:var(--chat-error-gap);max-width:none;color:var(--chat-error-fg);font-size:var(--chat-error-font);display:flex}chat-shell [data-role] [data-actions]{gap:var(--chat-actions-gap);opacity:0;transition:opacity var(--chat-actions-duration) var(--chat-actions-easing);display:flex}chat-shell [data-role]:hover [data-actions]{opacity:1}chat-shell [data-cursor]{width:var(--chat-cursor-width);background:var(--chat-cursor-color);vertical-align:text-bottom;height:1em;animation:chat-shell-blink var(--chat-cursor-speed) step-end infinite;margin-inline-start:1px;display:inline-block}@keyframes chat-shell-blink{50%{opacity:0}}@media (prefers-reduced-motion:reduce){chat-shell [data-cursor]{opacity:.7;animation:none}}chat-shell [data-role=assistant][data-thinking] [data-bubble]{color:var(--chat-thinking-fg)}chat-shell [data-bubble] [data-content]{white-space:normal}chat-shell [data-bubble] [data-content] p{margin:0 0 .5em}chat-shell [data-bubble] [data-content] p:last-child{margin-bottom:0}chat-shell [data-bubble] [data-content] strong{font-weight:var(--chat-weight-semibold)}chat-shell [data-bubble] [data-content] code{background:var(--chat-code-bg);border-radius:var(--chat-code-inline-radius);font-family:var(--chat-code-inline-family);padding:.1em .15em;font-size:.875em}chat-shell [data-bubble] [data-content] pre{background:var(--chat-code-bg);border-radius:var(--chat-code-radius);padding:var(--chat-code-block-px);margin:var(--chat-code-block-my) 0;font-size:var(--chat-code-block-font);line-height:1.5;overflow-x:auto}chat-shell [data-bubble] [data-content] pre code{font-size:inherit;background:0 0;border-radius:0;padding:0}chat-shell [data-bubble] [data-content] ul,chat-shell [data-bubble] [data-content] ol{margin:.25em 0;padding-inline-start:1.25em}chat-shell [data-bubble] [data-content] li{margin-bottom:.15em}chat-shell [data-bubble] [data-content] a{color:inherit;text-underline-offset:2px;text-decoration:underline}chat-shell [data-bubble] [data-content] h1,chat-shell [data-bubble] [data-content] h2,chat-shell [data-bubble] [data-content] h3,chat-shell [data-bubble] [data-content] h4{font-weight:var(--chat-weight-semibold);margin:.75em 0 .25em}chat-shell [data-bubble] [data-content] h1:first-child,chat-shell [data-bubble] [data-content] h2:first-child,chat-shell [data-bubble] [data-content] h3:first-child{margin-top:0}chat-shell chat-empty{margin:auto}chat-shell[streaming] chat-empty,chat-shell:has([data-role]) chat-empty{display:none}chat-shell>chat-header,chat-sidebar>chat-header[slot=header],chat-sidebar>chat-header:first-child{align-items:center;gap:var(--chat-header-gap,var(--a-space-2));padding:0 var(--chat-header-px,var(--a-space-3));height:var(--chat-header-height,var(--a-size-lg));font-size:var(--chat-header-font,var(--a-ui-size));border-bottom:var(--chat-border,1px solid var(--md-sys-color-neutral-outline-variant));background:var(--chat-bg,var(--md-sys-color-neutral-background));flex-shrink:0;display:flex}chat-header>[slot=name]{font-weight:var(--a-weight-medium,500);color:var(--md-sys-color-neutral-on-surface)}chat-header>[slot=status]{margin-inline-start:var(--a-space-2)}chat-header>[slot=action]:first-of-type{margin-inline-start:auto}chat-header>[slot=action-leading]{margin-inline-end:var(--a-space-2)}chat-status{align-items:center;gap:var(--a-space-1);font-size:var(--a-ui-sm);color:var(--a-fg-muted);display:inline-flex}chat-shell>chat-thread{overscroll-behavior:contain;gap:var(--chat-message-gap,var(--a-space-3));min-height:0;padding:var(--chat-thread-py,var(--a-space-4)) var(--chat-thread-px,var(--a-space-4));background:var(--chat-thread-bg,var(--md-sys-color-neutral-background));flex-direction:column;flex:1;display:flex;overflow-y:auto}chat-thread:not([empty])>chat-empty{display:none}chat-thread[empty]>chat-empty{padding:var(--a-space-6);flex:1;justify-content:center;align-items:center;display:flex}chat-shell>chat-composer{align-items:stretch;gap:var(--a-space-2);padding:var(--chat-composer-py,var(--a-space-3)) var(--chat-composer-px,var(--a-space-3));border-top:var(--chat-border,1px solid var(--md-sys-color-neutral-outline-variant));background:var(--chat-bg,var(--md-sys-color-neutral-background));flex-shrink:0;display:flex}chat-composer>[slot=leading],chat-composer>[slot=attach],chat-composer>[slot=trailing]{align-items:center;gap:var(--a-space-1);flex-shrink:0;display:inline-flex}chat-composer>:is(chat-input-ui,input-ui,textarea-ui){flex:1;min-width:0}chat-composer[disabled]{opacity:.6;pointer-events:none}:is(chat-sidebar[slot=leading],chat-sidebar[slot=trailing]){min-width:var(--chat-sidebar-min-width,48px);max-width:var(--chat-sidebar-max-width,480px);min-height:0;font-size:var(--chat-sidebar-font,var(--a-ui-size));transition:width var(--chat-duration,var(--a-duration,.2s)) var(--chat-easing,var(--a-easing,ease));background:var(--chat-bg,var(--md-sys-color-neutral-background));flex-direction:column;flex-shrink:0;display:flex;position:relative;container:sidebar/inline-size}chat-sidebar[slot=leading]{width:var(--chat-sidebar-width-leading,240px);border-right:var(--chat-border,1px solid var(--md-sys-color-neutral-outline-variant))}chat-sidebar[slot=trailing]{width:var(--chat-sidebar-width-trailing,320px);border-left:var(--chat-border,1px solid var(--md-sys-color-neutral-outline-variant))}:is(chat-sidebar[slot=leading],chat-sidebar[slot=trailing])>[data-resize]{cursor:col-resize;z-index:1;-webkit-user-select:none;user-select:none;width:6px;position:absolute;top:0;bottom:0}chat-sidebar[slot=leading]>[data-resize]{right:-3px}chat-sidebar[slot=trailing]>[data-resize]{left:-3px}:is(chat-sidebar[slot=leading],chat-sidebar[slot=trailing])>[data-resize]:hover{background:var(--md-sys-color-primary);opacity:.5}chat-sidebar[resizing]{transition:none}chat-sidebar[resizing]>[data-resize]{background:var(--md-sys-color-primary);opacity:.8}chat-shell:has(>chat-sidebar){flex-direction:row;display:flex}chat-shell:has(>chat-sidebar)>:not(chat-sidebar){display:contents}
|