inline-chat-kit 0.59.2 → 0.60.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 CHANGED
@@ -8,6 +8,80 @@ The versions before 1.0 follow the pre-release convention: **a breaking change
8
8
  or new public API bumps the minor**, and the patch is for fixes. Anything that would break an
9
9
  existing install is called out under **Breaking**, with what to do about it.
10
10
 
11
+ ## 0.60.0 — 2026-10-15
12
+
13
+ Reported from a host running the kit in production, each one worked around
14
+ outside the kit there. Each was reproduced here before it was changed.
15
+
16
+ ### Fixed
17
+
18
+ - **The header's "…" menu closes when "…" is pressed again.** The press
19
+ moved focus from the menu to the button, the menu closed on that blur, and
20
+ the click toggled it straight back open. Measured in Chromium and WebKit, by
21
+ mouse and by touch: it could not be closed that way at all.
22
+ - **And on a press anywhere outside it.** It closed only on a blur, and on iOS
23
+ a tap on something that takes no focus moves none — so the menu stayed open
24
+ over whatever was touched next.
25
+ - **`ChatExperience` fits its container on a page with no `box-sizing`
26
+ reset.** It was `width: 100%` plus 64px of padding, so in a 400px side
27
+ panel the end of every sent message sat under the panel's edge. A host
28
+ with a reset saw nothing change; one without now gets the column the
29
+ playground was designed with — 720px overall, not 784.
30
+ - **A short message is no longer faded, with "Read more" on it, because of
31
+ the width it had for one frame.** Whether a sent message is long was
32
+ measured once, a frame after the answer settled. In a host's side panel
33
+ still opening under an instant answer, that frame had the bubble 27px wide:
34
+ a one-line message measured 269px tall and stayed faded at 201×25. It is
35
+ measured again whenever it reflows, and the fade and the button go when it
36
+ is no longer long. A resting message mounted from history is measured too,
37
+ so it is clamped the same way a freshly sent one is.
38
+ - **An empty composer is never two lines.** Mounted a few pixels wide in the
39
+ same panel, the fresh composer decided it needed a second line, and the way
40
+ back compared against that width, so it never returned: 68px tall, its "+"
41
+ on a line of its own, for the rest of the session.
42
+ - **A docked composer no longer jumps on a send.** The fresh composer arrived
43
+ like any new turn — rising 16px into place — so the box at the bottom went
44
+ up and back every time a message was sent (840 → 824 → 840). It fades in
45
+ where it is now. A sent message still goes to the top, as before.
46
+ - **Docked, the question lands before its answer starts.** The answer's "…"
47
+ appeared at the top the moment a message was sent, while the message was
48
+ still travelling up from the composer — two things moving in opposite
49
+ directions, an answer begun above a question that had not arrived. The
50
+ answer now waits, still taking its room so the anchor does not move, until
51
+ the bubble has stopped: about 0.45s, measured at 1120×700 and 390×844, and
52
+ for a model that is silent first. Read off the screen rather than from the
53
+ spring, which rests at 1.2s, and including the scroll that carries a second
54
+ message most of its way. `ChatTurnRow` takes it as `answerAfterTravel`;
55
+ `ChatInput` reports it through `onLanded`.
56
+
57
+ ### Added
58
+
59
+ - **`ChatTurnRow` takes `entrance`** — `"rise"` or `"fade"`.
60
+ - **A host's own buttons.** A host matched the kit's buttons by hashed class
61
+ name (`[class*='ick-primary-']`), by position (the button in the
62
+ composer's surface is the send) and by `aria-label` (the stop is the one
63
+ labelled "Zaustavi"), so translating a label changed its colour.
64
+ - Every variant is painted from `--ick-btn-<variant>-*` tokens, with
65
+ `--ick-btn-radius` and `--ick-btn-weight`. The defaults are the values
66
+ the variants had: compared in both themes, at rest and on hover, 60
67
+ samples, no difference.
68
+ - Every button the kit draws says what it is for in `data-ick-role` and
69
+ what it is in `data-ick-variant`. `send`, `stop` and `save` are three
70
+ roles, not one button with three labels. A test fails on a `<Button>`
71
+ drawn without a role.
72
+ - `ChatHeaderAction` takes `variant`, so one action can be the host's
73
+ primary.
74
+ - `HostButtons` story; the tokens and the roles are listed in
75
+ `theming.md`.
76
+
77
+ Not a `components={{ Button }}` slot, though that was asked for: the kit's
78
+ buttons carry the composer's morphing glyph and its layout animation, and
79
+ a host component would have to take all of it on to stand in for one.
80
+ - **`OpensWithTheMessage` story**, and `npm run panel-check` in the gate: a
81
+ card's button opens a side panel and sends from it, the answer is ready at
82
+ once. Four failures against 0.59.2, none now — and a long message is
83
+ checked to still be clamped.
84
+
11
85
  ## 0.59.2 — 2026-09-24
12
86
 
13
87
  ### Fixed
package/README.md CHANGED
@@ -211,6 +211,8 @@ input that morphs into its own bubble rather than a record of what was typed.
211
211
  | `placeholder` | `string` | | |
212
212
  | `animationConfig` | `InlineAnimConfig` | | Passed to the input |
213
213
  | `entranceDelay` | `number` | `0` | Stagger, in seconds |
214
+ | `entrance` | `"rise" \| "fade"` | `"rise"` | How the row arrives — a docked composer fades in place |
215
+ | `answerAfterTravel` | `boolean` | `false` | The answer waits until the sent question has landed — docked, set by `ChatExperience` |
214
216
  | `selectionMode` | `"marker" \| "precise"` | `"marker"` | Passed to the highlighter |
215
217
  | `questionAlign` | `"end" \| "stretch"` | `"end"` | Where the composer sits — see below |
216
218
  | `onDraft` | `(id, value) => void` | | |
@@ -1393,7 +1395,9 @@ handful of things you can do to the whole thread.
1393
1395
  | `landmark` | `boolean` | `true` | `false` inside a panel, where `banner` would be a lie |
1394
1396
  | `children` | `ReactNode` | | Anything the kit should not manage. Never collapses |
1395
1397
 
1396
- Each action is `{ id, label, icon, onClick?, href?, count?, active?, disabled?, pinned? }`.
1398
+ Each action is `{ id, label, icon, onClick?, href?, count?, active?, disabled?, pinned?, variant? }`.
1399
+ `variant` is how one action stands out — `"primary"` for the host's own — and
1400
+ only applies while it is in the header rather than folded into the menu.
1397
1401
  `label` is required because an icon has no name of its own, and `count` is
1398
1402
  folded into that name — the badge is decorative, so a reader who cannot see it
1399
1403
  still hears "Saved highlights, 3".