inline-chat-kit 0.54.3 → 0.55.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.
@@ -19,85 +19,49 @@ kit uses whatever copy your app already has. React 18 or 19.
19
19
  ## The whole thing
20
20
 
21
21
  ```tsx
22
- import { useCallback, useState } from "react";
23
- import { ChatTurnRow, Conversation, useChatTurns } from "inline-chat-kit";
22
+ import { ChatExperience } from "inline-chat-kit";
24
23
  import "inline-chat-kit/styles.css";
25
24
 
26
- /** How far below the top edge a sent message comes to rest. */
27
- const ANCHOR = 24;
28
-
29
25
  export function MinimalChat() {
30
- /* Which turn to hold at the top. Kept here rather than inside the kit
31
- because "which message am I looking at" is the host's question: you may
32
- want it to follow a regenerate, a jump from a sidebar, or nothing at all. */
33
- const [anchored, setAnchored] = useState<string | null>(null);
34
-
35
- const { turns, setDraft, submit, stop, beginEdit, cancelEdit } = useChatTurns({
36
- /* Return a string, a promise of one, or an async iterable of deltas. The
37
- kit has no answers of its own — return nothing and nothing appears. */
38
- onSend: async (message) => `You said: ${message}`,
39
- });
40
-
41
- const send = useCallback(
42
- (id: string, value: string) => {
43
- setAnchored(id);
44
- submit(id, value);
45
- },
46
- [submit]
47
- );
48
-
49
- /* Held while the answer is arriving, let go when it settles — otherwise the
50
- question stays pinned to the top for ever and the composer, which is the
51
- last turn, sits below the fold. */
52
- const holding = turns.find((turn) => turn.id === anchored);
53
- const anchorId =
54
- holding && holding.state !== "resting" ? `turn-${holding.id}` : undefined;
55
-
56
26
  return (
57
- <div style={{ display: "flex", flexDirection: "column", height: "100dvh" }}>
58
- <Conversation
59
- anchorId={anchorId}
60
- /* Match whatever padding sits above the conversation, or a turn
61
- brought to the top lands underneath it. */
62
- anchorOffset={ANCHOR}
63
- /* Room left under the composer when an answer settles. */
64
- endOffset={ANCHOR}
65
- style={{ padding: ANCHOR }}
66
- >
67
- {turns.map((turn, i) => (
68
- <ChatTurnRow
69
- key={turn.id}
70
- turn={turn}
71
- /* The last turn is the composer: this is what makes it one. */
72
- isActiveInput={
73
- i === turns.length - 1 &&
74
- (turn.state === "idle" || turn.state === "typing")
75
- }
76
- /* Pass the hook's own functions straight through — they are stable,
77
- and `ChatTurnRow` is memoised on them. An arrow made during
78
- render hands the memo a new prop every time. */
79
- onDraft={setDraft}
80
- onSubmit={send}
81
- onStop={stop}
82
- onEdit={beginEdit}
83
- onCancelEdit={cancelEdit}
84
- placeholder="Ask anything…"
85
- />
86
- ))}
87
- </Conversation>
88
- </div>
27
+ <ChatExperience
28
+ /* The one thing that has to be yours. Return a string, a promise of one,
29
+ or an async iterable of deltas — the kit has no answers of its own. */
30
+ onSend={async (message) => `You said: ${message}`}
31
+ /* Shown in the header until a question has been asked; after that the
32
+ header carries the first question, so somebody arriving at a
33
+ conversation in progress can see what it is about. */
34
+ title="Chat"
35
+ placeholder="Ask anything…"
36
+ /* Before anybody has asked. The openers are sent rather than typed into
37
+ the box: one that only fills the input asks somebody to press send on
38
+ a sentence they did not write. */
39
+ empty={{
40
+ title: "Ask me anything",
41
+ description: "Or press one of these.",
42
+ suggestions: ["What can you do?", "Write me a haiku"],
43
+ }}
44
+ />
89
45
  );
90
46
  }
91
47
  ```
92
48
 
93
- That is a working chat: type, press enter, the pill you typed into becomes the
94
- bubble holding your message, it travels to the top, and the answer is revealed
95
- underneath it at reading pace. The last turn is always the composer for the
96
- next message that is what `isActiveInput` marks, and it is the whole idea.
49
+ That is a working chat. Type, press enter, and the pill you typed into becomes
50
+ the bubble holding your message; it travels to the top of the view and stays
51
+ there while the answer is written underneath it, then lets go so the composer
52
+ for your next message is back on screen. The last turn is always that composer
53
+ — which is the whole idea, and the reason a message does not appear to move so
54
+ much as to *become* the thing that was sent.
55
+
56
+ `ChatExperience` is the assembly. Everything it draws is also exported on its
57
+ own — `Conversation`, `ChatHeader`, `ChatTurnRow`, `useChatTurns` — so you can
58
+ put the pieces together yourself when your app needs a shape this one does not
59
+ have. Reach for that second; there is more to remember than it looks, and the
60
+ kit has already been caught getting it wrong in a page that did.
97
61
 
98
62
  **This file is compiled on every build of this package and a test asserts it
99
- matches this page character for character.** If it does not work, that is a
100
- bug here, not a mistake you made.
63
+ matches this page character for character.** If it does not work, that is a bug
64
+ here, not a mistake you made.
101
65
 
102
66
  ## Point it at your model
103
67
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "inline-chat-kit",
3
- "version": "0.54.3",
4
- "description": "An inline AI chat experience for React. The input is the message: it morphs into the bubble, the answer streams beneath it, and the parts around it tool calls, reasoning, questions, artifacts, dictation come with it.",
3
+ "version": "0.55.0",
4
+ "description": "An inline AI chat experience for React. The input is the message: it morphs into the bubble, the answer streams beneath it, and the parts around it \u2014 tool calls, reasoning, questions, artifacts, dictation \u2014 come with it.",
5
5
  "keywords": [
6
6
  "react",
7
7
  "chat",
@@ -45,7 +45,11 @@
45
45
  "import": "./dist/inline-chat-kit.js"
46
46
  },
47
47
  "./styles.css": "./dist/inline-chat-kit.css",
48
- "./package.json": "./package.json"
48
+ "./package.json": "./package.json",
49
+ "./demo": {
50
+ "types": "./dist/demo/index.d.ts",
51
+ "import": "./dist/demo.js"
52
+ }
49
53
  },
50
54
  "publishConfig": {
51
55
  "access": "public"