@adia-ai/web-modules 0.4.5 → 0.4.7

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 CHANGED
@@ -11,6 +11,25 @@ Built from `@adia-ai/web-components` primitives.
11
11
 
12
12
  _No pending changes._
13
13
 
14
+ ## [0.4.7] - 2026-05-12
15
+
16
+ ### Changed — `chat/chat-thread.yaml` populates `synonyms.tags` (§72)
17
+
18
+ The composite `chat-thread.yaml` picks up the alias array previously held in the retired `@adia-ai/a2ui-corpus/patterns/_components.json` — `chat`, `conversation`, `messages`, `chat-log`, `message-thread`. Sidecar regenerated by `npm run components`. Mirrors the per-component yaml sweep on `@adia-ai/web-components` for §72 (the §65 carry-over from v0.4.6).
19
+
20
+ ## [0.4.6] - 2026-05-12
21
+
22
+ ### Fixed — `<editor-sidebar>` resize-state detection via `:has()`
23
+
24
+ `<editor-sidebar>`'s `[resizing]` host attribute previously tripped on a heuristic regex against `[data-resize], [class*="resize"], [class*="handle"]` matched on the pointerdown's direct target. This caught `admin-sidebar`'s `[data-resize]` grabber but missed `<pane-ui>`'s slot-based `[slot="resize"]` grabber — so the wrapper's `transition: width` collapse animation was never suppressed during a pane drag, causing the wrapper to interpolate widths while pointer events tracked 1:1 (visible "rubber band" + ~16-ms-per-frame stutter).
25
+
26
+ - **`editor-sidebar.js`** — pointerdown detection switched to `closest('[slot="resize"], [data-resize], [class*="handle"]')`, matching both the pane's slot-based handle and the legacy `[data-resize]` shape. Behavior preserved for admin/chat sidebars; pane-ui case now correctly sets `[resizing]`.
27
+ - **`editor-shell.bespoke.css`** — CSS bypass selector widened from `editor-sidebar[resizing]` to `editor-sidebar:is([resizing], :has(pane-ui[data-resizing]))`, so the transition-bypass fires whenever EITHER (a) the wrapper detected pointerdown on a known handle OR (b) any descendant `<pane-ui>` is in an active drag (independent of pointerdown heuristics). Defense-in-depth: covers consumer rules with high specificity that defeat the host-level `[resizing]` attribute.
28
+
29
+ Pairs with the `<pane-ui>` resize tracking fix in `@adia-ai/web-components@[Unreleased]`.
30
+
31
+ See root [CHANGELOG.md `[Unreleased]`](../../CHANGELOG.md) for the cross-cutting arc narrative.
32
+
14
33
  ## [0.4.5] - 2026-05-12
15
34
 
16
35
  ### Added — CSS importable via package specifier (§61)
@@ -76,6 +76,12 @@
76
76
  "messages",
77
77
  "message-stream"
78
78
  ],
79
+ "tags": [
80
+ "Chat",
81
+ "conversation",
82
+ "chat-log",
83
+ "message-thread"
84
+ ],
79
85
  "thread": [
80
86
  "conversation",
81
87
  "dialogue",
@@ -1,89 +1,98 @@
1
- # Edit this file; run `npm run build:components` to regenerate a2ui.json.
2
1
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
3
2
  name: ChatThread
4
3
  tag: chat-thread
5
4
  component: ChatThread
6
5
  category: container
7
6
  version: 1
8
- description: |
9
- Module-tier chat message thread container — replaces legacy
7
+ description: 'Module-tier chat message thread container — replaces legacy
8
+
10
9
  <section data-chat-messages> per ADR-0023. Owns scroll-to-bottom
10
+
11
11
  on new message (with user-scroll-up suspension), [streaming] and
12
- [empty] reflected attributes, and a stable target for the host's
12
+
13
+ [empty] reflected attributes, and a stable target for the host''s
14
+
13
15
  message rendering pipeline.
14
16
 
17
+
15
18
  Sits inside <chat-shell> as the central scroll surface. Authors
19
+
16
20
  compose <chat-empty> as an optional first child for the empty
21
+
17
22
  state; message children are appended dynamically by the host.
18
23
 
24
+
19
25
  Backwards compat — <chat-shell> still recognizes the legacy
26
+
20
27
  <section data-chat-messages> shape via :is() selector. New code
28
+
21
29
  should prefer <chat-thread>.
22
30
 
31
+ '
23
32
  props:
24
33
  streaming:
25
- description: |
26
- Reflected — set by the host while an LLM response is streaming.
34
+ description: 'Reflected — set by the host while an LLM response is streaming.
35
+
27
36
  Consumers can style streaming-mode (e.g. cursor blink) via
37
+
28
38
  :has(chat-thread[streaming]) or attribute selectors.
39
+
40
+ '
29
41
  type: boolean
30
42
  default: false
31
43
  reflect: true
32
-
33
44
  empty:
34
- description: |
35
- Reflected — set when zero message children. Drives the
45
+ description: 'Reflected — set when zero message children. Drives the
46
+
36
47
  <chat-empty> visibility via CSS — no JS toggling needed.
48
+
49
+ '
37
50
  type: boolean
38
51
  default: true
39
52
  reflect: true
40
-
41
53
  events: {}
42
-
43
54
  slots:
44
55
  default:
45
- description: >-
46
- Default message children (typically appended dynamically by
47
- <chat-shell>'s rendering pipeline) plus an optional first
48
- <chat-empty> sibling for the empty state.
49
-
56
+ description: Default — message children (typically appended dynamically by <chat-shell>'s rendering pipeline) plus an
57
+ optional first <chat-empty> sibling for the empty state.
50
58
  states:
51
- - name: idle
52
- description: Default, no streaming.
53
- - name: streaming
54
- attribute: streaming
55
- description: Host is actively streaming an LLM response.
56
- - name: empty
57
- attribute: empty
58
- description: Zero message children — empty state visible.
59
-
59
+ - name: idle
60
+ description: Default, no streaming.
61
+ - name: streaming
62
+ attribute: streaming
63
+ description: Host is actively streaming an LLM response.
64
+ - name: empty
65
+ attribute: empty
66
+ description: Zero message children — empty state visible.
60
67
  traits: []
61
-
62
68
  a2ui:
63
69
  rules:
64
- - >-
65
- chat-thread is the bespoke replacement for legacy
66
- <section data-chat-messages> inside <chat-shell>. Use it for
67
- the message scroll surface; the host appends dynamic message
68
- divs as children.
69
- - >-
70
- Place <chat-empty> as an optional first child for the empty
71
- state; the [empty] reflected attribute drives its visibility
72
- via CSS (no JS toggling).
73
-
70
+ - chat-thread is the bespoke replacement for legacy <section data-chat-messages> inside <chat-shell>. Use it for the message
71
+ scroll surface; the host appends dynamic message divs as children.
72
+ - Place <chat-empty> as an optional first child for the empty state; the [empty] reflected attribute drives its visibility
73
+ via CSS (no JS toggling).
74
74
  keywords:
75
- - chat-thread
76
- - message-list
77
- - conversation
78
- - thread
79
- - scroll-surface
80
-
75
+ - chat-thread
76
+ - message-list
77
+ - conversation
78
+ - thread
79
+ - scroll-surface
81
80
  synonyms:
82
- thread: [conversation, dialogue, chat-log, transcript]
83
- message-list: [messages, message-stream]
84
-
81
+ thread:
82
+ - conversation
83
+ - dialogue
84
+ - chat-log
85
+ - transcript
86
+ message-list:
87
+ - messages
88
+ - message-stream
89
+ tags:
90
+ - Chat
91
+ - conversation
92
+ - chat-log
93
+ - message-thread
85
94
  related:
86
- - ChatShell
87
- - ChatEmpty
88
- - ChatComposer
89
- - ChatSidebar
95
+ - ChatShell
96
+ - ChatEmpty
97
+ - ChatComposer
98
+ - ChatSidebar
@@ -198,11 +198,17 @@ editor-sidebar[collapsed] {
198
198
  /* Children can hide labels / shrink icons via [data-narrow] */
199
199
  }
200
200
 
201
- /* When resizing — disable transitions to feel responsive */
202
- editor-sidebar[resizing] {
201
+ /* When resizing — disable transitions to feel responsive.
202
+ `:has(pane-ui[data-resizing])` makes the bypass independent of the
203
+ wrapper's pointerdown heuristic: as long as the inner pane is in an
204
+ active drag, the wrapper's `transition: width` is suppressed. The
205
+ inner-pane rule is redundant (pane.css owns its own bypass) but is
206
+ kept for defense-in-depth against consumer rules with high
207
+ specificity. */
208
+ editor-sidebar:is([resizing], :has(pane-ui[data-resizing])) {
203
209
  transition: none;
204
210
  }
205
- editor-sidebar[resizing] > pane-ui {
211
+ editor-sidebar:is([resizing], :has(pane-ui[data-resizing])) > pane-ui {
206
212
  transition: none;
207
213
  }
208
214
 
@@ -97,10 +97,11 @@ class EditorSidebar extends UIElement {
97
97
  // (pane-ui's drag-handle is internal; we listen on the pane and let
98
98
  // pointerup on document terminate)
99
99
  this.#onPointerDown = (e) => {
100
- // Heuristic pointerdown inside pane that targets a drag-handle
101
- // (covers pane-ui's internal handle classes + [data-resize])
100
+ // pane-ui's resize grabber is `[slot="resize"]`; admin-sidebar and
101
+ // chat-sidebar use `[data-resize]`. Match both so this wrapper's
102
+ // `[resizing]` attribute reflects whichever primitive is composed.
102
103
  const target = e.target;
103
- if (target?.matches?.('[data-resize], [class*="resize"], [class*="handle"]')) {
104
+ if (target?.closest?.('[slot="resize"], [data-resize], [class*="handle"]')) {
104
105
  this.resizing = true;
105
106
  }
106
107
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adia-ai/web-modules",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "description": "AdiaUI composite custom elements — shell, chat, editor, runtime clusters built from @adia-ai/web-components primitives. Subpath exports per cluster.",
5
5
  "type": "module",
6
6
  "exports": {