@bitbaum/chatkit 0.22.1 → 0.23.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/README.md CHANGED
@@ -422,6 +422,68 @@ remembered for 30 days so the next press records immediately. Every failure is
422
422
  shown in words (blocked mic, nothing heard, not available), never as a button
423
423
  that does nothing. `rememberKey: null` stores nothing on the device.
424
424
 
425
+ ### Any other text box — `DictationField` (0.23)
426
+
427
+ A text box that is not a conversation — a note, a title, a bio, a message to a
428
+ seller — is still a place a person would rather speak than type. Every such
429
+ box is this component, not a `<textarea>` made by hand:
430
+
431
+ ```tsx
432
+ <DictationField
433
+ label="Note"
434
+ value={note}
435
+ onValueChange={setNote}
436
+ voice={{ transcribeUrl: "/api/transcribe" }} // the same server leg as Composer
437
+ improve={{ // optional: writing help
438
+ suggestions: ["Make it tighter", "Fix the grammar"],
439
+ run: async (text, instruction) => (await askYourModel(text, instruction)) ?? null,
440
+ }}
441
+ />
442
+ <DictationField label="Title" value={title} onValueChange={setTitle} multiline={false} />
443
+ ```
444
+
445
+ The microphone is `Composer`'s: Web Speech first, recording when the browser's
446
+ recogniser is silent, a take shown with its timer and kept for a retry when
447
+ transcription fails. Dictation appends to what is there. 16px text, 44px
448
+ targets, a visible label wired to the field.
449
+
450
+ `improve` is chatkit's half of writing help only: how a person asks (one tap on
451
+ a suggestion, or say or type what to change), that it is working, that it
452
+ failed — in words, with their text untouched — and **Undo** until the next edit.
453
+ Chatkit ships no model call and no prompt: `run` is yours (or
454
+ `@bitbaum/writingkit`'s `assist`). Return `null` when it could not be done.
455
+
456
+ Single-line fields (`multiline={false}`) keep the controls beside the text. Colour
457
+ and radius follow the same `--ck-*` variables as the composer. The styles are
458
+ in `styles.css` (not in the embedded `styles/chat.css`: this is not a chat
459
+ surface).
460
+
461
+ ### Comments — `CommentThread` (0.23)
462
+
463
+ The conversation under anything: an article, a page, a listing.
464
+
465
+ ```tsx
466
+ <CommentThread
467
+ comments={loaded} // oldest first; re-mount with a key to reload
468
+ viewer={user ? { name: user.name } : null}
469
+ signInHref="/sign-in?next=/articles/1" // a signed-out reader is shown the way in
470
+ canRemove={(c) => c.authorId === user?.id || user?.id === article.authorId}
471
+ transport={{
472
+ post: async (text) => (await api.post(text)), // returns the stored comment
473
+ remove: async (id) => { await api.remove(id); },
474
+ }}
475
+ voice={{ transcribeUrl: "/api/transcribe" }}
476
+ timeZone="Europe/Zurich"
477
+ />
478
+ ```
479
+
480
+ The component owns the list, the optimistic removal (rolled back, in words, if
481
+ it fails) and every failure message; the box is `Composer`, so it has the
482
+ microphone, 16px text and Enter-to-send; a refused post keeps the draft in the
483
+ box. A comment is shown as text, never as markup, with its line breaks. Times
484
+ render in `timeZone` (UTC by default, so the server's and the browser's markup
485
+ agree), or through your own `formatTime`.
486
+
425
487
  ### Suggested replies
426
488
 
427
489
  The two to four things the person is likely to say next, as buttons under the
@@ -850,6 +912,12 @@ on `Composer`, `labels` on `ChatThread`.
850
912
  anatomy, New chat, Temporary chat that writes nothing, the open chat
851
913
  back after a reload, attachments on, a queue behind a running answer.
852
914
 
915
+ 12. Any other text box is `DictationField`: the same microphone, 16px text and
916
+ 44px targets as the composer, and an optional Improve with Undo.
917
+ 13. A conversation under an item is `CommentThread`: oldest first, the same box
918
+ with the microphone, remove your own, a way to sign in for a reader who
919
+ cannot yet write.
920
+
853
921
  `pnpm run verify` proves all of it: unit and render tests, then
854
922
  `test/browser.mjs` drives Chromium through the demo at desktop and 390px, light
855
923
  and dark, and speaks into a fake microphone past a silent recogniser.
@@ -0,0 +1,69 @@
1
+ import { type ComposerVoice } from "./Composer.js";
2
+ export type CommentItem = {
3
+ id: string;
4
+ /** The name readers see. */
5
+ author: string;
6
+ /** Plain text; line breaks are kept. */
7
+ body: string;
8
+ createdAt: string | number | Date;
9
+ };
10
+ /**
11
+ * Where comments go. The component owns the list, the optimistic removal and
12
+ * every failure message; the app owns the database and who may do what.
13
+ */
14
+ export type CommentTransport = {
15
+ /** Store the comment and return it as stored (its id, its author, its time). Throw to refuse. */
16
+ post: (text: string) => Promise<CommentItem>;
17
+ /** Delete one. Omit and nobody gets a Remove button. */
18
+ remove?: (id: string) => Promise<void>;
19
+ };
20
+ export type CommentThreadLabels = {
21
+ /** The heading: "No comments yet", "1 comment", "7 comments". */
22
+ count: (n: number) => string;
23
+ placeholder: string;
24
+ ariaLabel: string;
25
+ send: string;
26
+ signIn: string;
27
+ remove: string;
28
+ postFailed: string;
29
+ removeFailed: string;
30
+ postedAs: (name: string) => string;
31
+ };
32
+ export declare const DEFAULT_COMMENT_THREAD_LABELS: CommentThreadLabels;
33
+ export type CommentThreadProps = {
34
+ /** The comments as loaded, oldest first. Re-mount (a `key`) to load a new set. */
35
+ comments: readonly CommentItem[];
36
+ transport: CommentTransport;
37
+ /** Who is looking. `null`: readers see the thread and a sign-in link, not the box. */
38
+ viewer: {
39
+ name: string;
40
+ } | null;
41
+ /** Where "Sign in to comment" goes. Required for a signed-out reader to have a way forward. */
42
+ signInHref?: string;
43
+ /** Who may remove which comment (its author; the page's owner). Default: nobody. */
44
+ canRemove?: (comment: CommentItem) => boolean;
45
+ /** The microphone of the box. Pass `{ transcribeUrl }` for the server leg. */
46
+ voice?: ComposerVoice | false;
47
+ /**
48
+ * How a time reads. Default: `locale` in `timeZone` (UTC when none is given,
49
+ * so the server's and the browser's markup agree). Pass your own to match
50
+ * the rest of the product.
51
+ */
52
+ formatTime?: (at: Date) => string;
53
+ locale?: string;
54
+ timeZone?: string;
55
+ /** Heading level. Default 2. */
56
+ headingLevel?: 2 | 3 | 4;
57
+ labels?: Partial<CommentThreadLabels>;
58
+ className?: string;
59
+ };
60
+ /**
61
+ * The conversation under anything: an article, a page, a listing. Comments
62
+ * read oldest first, the box is chatkit's `Composer` (so it has the
63
+ * microphone, 16px text and Enter-to-send like every other box in the fleet),
64
+ * and a person can remove what they wrote. Reading needs nothing; writing
65
+ * needs `viewer`, and a signed-out reader is shown the way to sign in on the
66
+ * same screen, never a dead end.
67
+ */
68
+ export declare function CommentThread({ comments, transport, viewer, signInHref, canRemove, voice, formatTime, locale, timeZone, headingLevel, labels: overrides, className, }: CommentThreadProps): import("react").JSX.Element;
69
+ //# sourceMappingURL=CommentThread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentThread.d.ts","sourceRoot":"","sources":["../../src/react/CommentThread.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iGAAiG;IACjG,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,iEAAiE;IACjE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,mBAU3C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kFAAkF;IAClF,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,sFAAsF;IACtF,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChC,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;IAC9C,8EAA8E;IAC9E,KAAK,CAAC,EAAE,aAAa,GAAG,KAAK,CAAC;IAC9B;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,KAAK,MAAM,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAaF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,MAAM,EACN,UAAU,EACV,SAAS,EACT,KAAK,EACL,UAAU,EACV,MAAM,EACN,QAAQ,EACR,YAAgB,EAChB,MAAM,EAAE,SAAS,EACjB,SAAS,GACV,EAAE,kBAAkB,+BA6GpB"}
@@ -0,0 +1,78 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { createElement, useId, useState } from "react";
4
+ import { Composer } from "./Composer.js";
5
+ export const DEFAULT_COMMENT_THREAD_LABELS = {
6
+ count: (n) => (n === 0 ? "No comments yet" : n === 1 ? "1 comment" : `${n} comments`),
7
+ placeholder: "Say something about this…",
8
+ ariaLabel: "Write a comment",
9
+ send: "Comment",
10
+ signIn: "Sign in to comment",
11
+ remove: "Remove",
12
+ postFailed: "The comment could not be posted. Your text is still in the box; try again.",
13
+ removeFailed: "The comment could not be removed. Try again.",
14
+ postedAs: (name) => `Posted as ${name}.`,
15
+ };
16
+ function defaultTime(locale, timeZone) {
17
+ const fmt = new Intl.DateTimeFormat(locale, {
18
+ day: "numeric",
19
+ month: "short",
20
+ hour: "2-digit",
21
+ minute: "2-digit",
22
+ timeZone: timeZone ?? "UTC",
23
+ });
24
+ return (at) => fmt.format(at);
25
+ }
26
+ /**
27
+ * The conversation under anything: an article, a page, a listing. Comments
28
+ * read oldest first, the box is chatkit's `Composer` (so it has the
29
+ * microphone, 16px text and Enter-to-send like every other box in the fleet),
30
+ * and a person can remove what they wrote. Reading needs nothing; writing
31
+ * needs `viewer`, and a signed-out reader is shown the way to sign in on the
32
+ * same screen, never a dead end.
33
+ */
34
+ export function CommentThread({ comments, transport, viewer, signInHref, canRemove, voice, formatTime, locale, timeZone, headingLevel = 2, labels: overrides, className, }) {
35
+ const labels = { ...DEFAULT_COMMENT_THREAD_LABELS, ...overrides };
36
+ const [list, setList] = useState(() => [...comments]);
37
+ const [draft, setDraft] = useState("");
38
+ const [sending, setSending] = useState(false);
39
+ const [error, setError] = useState(null);
40
+ const headingId = useId();
41
+ const time = formatTime ?? defaultTime(locale, timeZone);
42
+ const post = async (text) => {
43
+ setError(null);
44
+ setSending(true);
45
+ try {
46
+ const created = await transport.post(text);
47
+ setList((current) => [...current, created]);
48
+ return true;
49
+ }
50
+ catch {
51
+ setError(labels.postFailed);
52
+ return false;
53
+ }
54
+ finally {
55
+ setSending(false);
56
+ }
57
+ };
58
+ const remove = async (id) => {
59
+ if (!transport.remove)
60
+ return;
61
+ setError(null);
62
+ const before = list;
63
+ setList((current) => current.filter((c) => c.id !== id));
64
+ try {
65
+ await transport.remove(id);
66
+ }
67
+ catch {
68
+ setList(before);
69
+ setError(labels.removeFailed);
70
+ }
71
+ };
72
+ const heading = createElement(`h${headingLevel}`, { id: headingId, className: "ck-comments-title" }, labels.count(list.length));
73
+ return (_jsxs("section", { className: className ? `ck-comments ${className}` : "ck-comments", "aria-labelledby": headingId, children: [heading, list.length > 0 && (_jsx("ol", { className: "ck-comment-list", children: list.map((c) => {
74
+ const at = new Date(c.createdAt);
75
+ return (_jsxs("li", { className: "ck-comment", children: [_jsxs("p", { className: "ck-comment-meta", children: [_jsx("strong", { children: c.author }), _jsx("span", { "aria-hidden": true, children: " \u00B7 " }), _jsx("time", { dateTime: at.toISOString(), children: time(at) }), transport.remove && canRemove?.(c) && (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, children: " \u00B7 " }), _jsx("button", { type: "button", className: "ck-comment-remove", onClick: () => void remove(c.id), children: labels.remove })] }))] }), _jsx("p", { className: "ck-comment-body", children: c.body })] }, c.id));
76
+ }) })), error && (_jsx("p", { className: "ck-problem", role: "alert", children: _jsx("span", { children: error }) })), viewer ? (_jsx("div", { className: "ck-comment-box", children: _jsx(Composer, { onSend: post, placeholder: labels.placeholder, ariaLabel: labels.ariaLabel, sending: sending, value: draft, onValueChange: setDraft, attach: false, voice: voice, labels: { send: labels.send }, hint: labels.postedAs(viewer.name) }) })) : (signInHref && (_jsx("p", { className: "ck-comment-signin", children: _jsx("a", { className: "ck-comment-signin-link", href: signInHref, children: labels.signIn }) })))] }));
77
+ }
78
+ //# sourceMappingURL=CommentThread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentThread.js","sourceRoot":"","sources":["../../src/react/CommentThread.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../src/react/Composer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../src/react/Composer.tsx"],"names":[],"mappings":"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"}
@@ -1,14 +1,15 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useEffect, useImperativeHandle, useRef, useState, } from "react";
4
- import { appendTranscript, composerCanSend, composerOutgoingText, formatElapsed, shouldClearDraft, } from "../composer.js";
4
+ import { appendTranscript, composerCanSend, composerOutgoingText, shouldClearDraft, } from "../composer.js";
5
5
  import { DEFAULT_DICTATION_MESSAGES, isAudioFile } from "../dictation.js";
6
6
  import { DEFAULT_ATTACHMENT_NOTES, } from "../attachments.js";
7
7
  import { useDictation } from "./use-dictation.js";
8
+ import { VoiceBar, VoiceProblem } from "./Voice.js";
8
9
  import { useAttachments } from "./use-attachments.js";
9
10
  import { useAutoGrow } from "./hooks.js";
10
11
  import { AttachMenu, DEFAULT_ATTACH_MENU_LABELS, } from "./AttachMenu.js";
11
- import { IconArrowUp, IconCheck, IconFile, IconMic, IconSpinner, IconStop, IconX, } from "./icons.js";
12
+ import { IconArrowUp, IconFile, IconMic, IconSpinner, IconStop, IconX } from "./icons.js";
12
13
  export const DEFAULT_COMPOSER_LABELS = {
13
14
  send: "Send",
14
15
  stop: "Stop generating",
@@ -39,31 +40,6 @@ function AttachmentStrip({ attachments, labels, }) {
39
40
  return (_jsxs("div", { className: "ck-attach-item", children: [a.kind === "image" && a.previewUrl ? (_jsx("img", { src: a.previewUrl, alt: a.name, className: "ck-attach-thumb" })) : (_jsxs("span", { className: "ck-attach-file", children: [_jsx(IconFile, {}), _jsx("span", { className: "ck-truncate", children: a.name })] })), _jsx("button", { type: "button", className: "ck-attach-remove", onClick: () => attachments.remove(key), "aria-label": labels.remove(a.name), title: labels.remove(a.name), children: _jsx(IconX, {}) })] }, key));
40
41
  }), attachments.note && (_jsx("button", { type: "button", className: "ck-note", onClick: attachments.clearNote, children: attachments.note }))] }));
41
42
  }
42
- /**
43
- * The words as they are heard, one line, always showing its end: the
44
- * newest words are what the person is checking. Scrolled by hand rather
45
- * than laid out right-to-left, so punctuation stays where the language
46
- * puts it.
47
- */
48
- function LiveWords({ text, dim }) {
49
- const ref = useRef(null);
50
- useEffect(() => {
51
- const el = ref.current;
52
- if (el)
53
- el.scrollLeft = el.scrollWidth;
54
- }, [text]);
55
- return (_jsx("span", { ref: ref, className: dim ? "ck-voice-live ck-voice-live-dim" : "ck-voice-live", children: text }));
56
- }
57
- function Elapsed({ since }) {
58
- const [now, setNow] = useState(() => Date.now());
59
- useEffect(() => {
60
- if (since === null)
61
- return;
62
- const t = setInterval(() => setNow(Date.now()), 250);
63
- return () => clearInterval(t);
64
- }, [since]);
65
- return (_jsx("span", { className: "ck-voice-timer", children: formatElapsed(since === null ? 0 : (now - since) / 1000) }));
66
- }
67
43
  /**
68
44
  * THE composer: write words — or say them, or paste a screenshot — and send
69
45
  * them. Enter sends, Shift+Enter breaks the line, an IME composition never
@@ -176,7 +152,7 @@ export function Composer({ onSend, placeholder, ariaLabel, disabled = false, sen
176
152
  })();
177
153
  }
178
154
  };
179
- return (_jsxs("div", { className: "ck-composer-wrap", children: [above, _jsxs("div", { className: "ck-composer-frame", children: [(listening || transcribing) && (_jsx("div", { className: "ck-voice-bar", role: "status", "aria-live": "polite", children: listening ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "ck-voice-dot", "aria-hidden": true }), dictation.liveText ? (_jsx(LiveWords, { text: dictation.liveText })) : (_jsx("span", { className: "ck-voice-wave", "aria-hidden": true, children: Array.from({ length: 9 }).map((_, i) => (_jsx("span", {}, i))) })), _jsx(Elapsed, { since: dictation.startedAt }), _jsx("button", { type: "button", className: "ck-icon-btn", onClick: dictation.cancel, "aria-label": labels.cancelRecording, title: labels.cancelRecording, children: _jsx(IconX, {}) }), _jsx("button", { type: "button", className: "ck-voice-confirm", onClick: dictation.stop, "aria-label": labels.confirmRecording, title: labels.confirmRecording, children: _jsx(IconCheck, {}) })] })) : (_jsxs(_Fragment, { children: [_jsx(IconSpinner, {}), dictation.liveText ? (_jsx(LiveWords, { text: dictation.liveText, dim: true })) : (_jsx("span", { className: "ck-voice-timer", children: labels.transcribing }))] })) })), _jsxs("div", { className: density === "compact" ? "ck-composer ck-composer-compact" : "ck-composer", children: [showModes && (_jsx("div", { className: "ck-modes", role: "group", children: modes.map((m) => (_jsx("button", { type: "button", className: "ck-mode", "aria-pressed": m.id === mode, title: m.hint, onClick: () => onModeChange?.(m.id), children: m.label }, m.id))) })), header, attachOn && stagedPosition === "above" && (_jsx(AttachmentStrip, { attachments: attachments, labels: labels })), _jsx("textarea", { ref: textareaRef, className: "ck-input", rows: 1, value: text, autoFocus: autoFocus, disabled: disabled || transcribing, placeholder: listening ? labels.listening : sending && queue ? labels.queue : placeholder, "aria-label": ariaLabel ?? placeholder, enterKeyHint: "send", onChange: (e) => {
155
+ return (_jsxs("div", { className: "ck-composer-wrap", children: [above, _jsxs("div", { className: "ck-composer-frame", children: [_jsx(VoiceBar, { dictation: dictation, labels: labels }), _jsxs("div", { className: density === "compact" ? "ck-composer ck-composer-compact" : "ck-composer", children: [showModes && (_jsx("div", { className: "ck-modes", role: "group", children: modes.map((m) => (_jsx("button", { type: "button", className: "ck-mode", "aria-pressed": m.id === mode, title: m.hint, onClick: () => onModeChange?.(m.id), children: m.label }, m.id))) })), header, attachOn && stagedPosition === "above" && (_jsx(AttachmentStrip, { attachments: attachments, labels: labels })), _jsx("textarea", { ref: textareaRef, className: "ck-input", rows: 1, value: text, autoFocus: autoFocus, disabled: disabled || transcribing, placeholder: listening ? labels.listening : sending && queue ? labels.queue : placeholder, "aria-label": ariaLabel ?? placeholder, enterKeyHint: "send", onChange: (e) => {
180
156
  const next = e.target.value;
181
157
  if (onEmptySlash && next === "/" && text === "") {
182
158
  onEmptySlash();
@@ -191,6 +167,6 @@ export function Composer({ onSend, placeholder, ariaLabel, disabled = false, sen
191
167
  e.preventDefault();
192
168
  void submit();
193
169
  }
194
- } }), attachOn && stagedPosition === "below" && (_jsx(AttachmentStrip, { attachments: attachments, labels: labels })), _jsxs("div", { className: "ck-actions", children: [_jsxs("div", { className: "ck-tools", children: [(attachOn || extras.length > 0) && (_jsx(AttachMenu, { onFiles: onFiles, disabled: disabled || (attachments.full && extras.length === 0), labels: { attach: labels.attach, ...labels.attachMenu }, sources: attachOn ? undefined : [], rows: extras })), voiceOn && (_jsx("button", { type: "button", className: listening ? "ck-icon-btn ck-mic ck-mic-on" : "ck-icon-btn ck-mic", onClick: dictation.toggle, disabled: disabled || transcribing, "aria-label": listening ? labels.voiceStop : labels.voice, "aria-pressed": listening, title: listening ? labels.voiceStop : labels.voice, children: transcribing ? _jsx(IconSpinner, {}) : _jsx(IconMic, {}) })), tools, hint && _jsx("span", { className: "ck-hint", children: hint })] }), _jsxs("div", { className: "ck-submit", children: [trailing, sending && onStop ? (_jsxs(_Fragment, { children: [queue && canSend && (_jsx("button", { type: "button", className: "ck-send", onClick: () => void submit(), "aria-label": labels.send, title: labels.send, children: _jsx(IconArrowUp, {}) })), _jsx("button", { type: "button", className: "ck-send ck-send-stop", onClick: onStop, "aria-label": labels.stop, title: labels.stop, children: _jsx(IconStop, {}) })] })) : (!listening && (_jsx("button", { type: "button", className: "ck-send", disabled: !canSend, onClick: () => void submit(), "aria-label": labels.send, title: sendBlockedReason ?? labels.send, children: sending ? _jsx(IconSpinner, {}) : _jsx(IconArrowUp, {}) })))] })] }), footer] })] }), dictation.problem && (_jsxs("p", { className: "ck-problem", role: "status", children: [_jsxs("span", { children: [labels.dictation[dictation.problem], dictation.problemDetail && (_jsxs("span", { className: "ck-problem-detail", children: [" ", dictation.problemDetail] }))] }), dictation.canRetry && (_jsx("button", { type: "button", className: "ck-problem-retry", onClick: () => void dictation.retry(), disabled: dictation.status !== "idle", children: labels.retryTake })), _jsx("button", { type: "button", className: "ck-problem-x", onClick: dictation.clearProblem, "aria-label": labels.dismiss, children: _jsx(IconX, {}) })] }))] }));
170
+ } }), attachOn && stagedPosition === "below" && (_jsx(AttachmentStrip, { attachments: attachments, labels: labels })), _jsxs("div", { className: "ck-actions", children: [_jsxs("div", { className: "ck-tools", children: [(attachOn || extras.length > 0) && (_jsx(AttachMenu, { onFiles: onFiles, disabled: disabled || (attachments.full && extras.length === 0), labels: { attach: labels.attach, ...labels.attachMenu }, sources: attachOn ? undefined : [], rows: extras })), voiceOn && (_jsx("button", { type: "button", className: listening ? "ck-icon-btn ck-mic ck-mic-on" : "ck-icon-btn ck-mic", onClick: dictation.toggle, disabled: disabled || transcribing, "aria-label": listening ? labels.voiceStop : labels.voice, "aria-pressed": listening, title: listening ? labels.voiceStop : labels.voice, children: transcribing ? _jsx(IconSpinner, {}) : _jsx(IconMic, {}) })), tools, hint && _jsx("span", { className: "ck-hint", children: hint })] }), _jsxs("div", { className: "ck-submit", children: [trailing, sending && onStop ? (_jsxs(_Fragment, { children: [queue && canSend && (_jsx("button", { type: "button", className: "ck-send", onClick: () => void submit(), "aria-label": labels.send, title: labels.send, children: _jsx(IconArrowUp, {}) })), _jsx("button", { type: "button", className: "ck-send ck-send-stop", onClick: onStop, "aria-label": labels.stop, title: labels.stop, children: _jsx(IconStop, {}) })] })) : (!listening && (_jsx("button", { type: "button", className: "ck-send", disabled: !canSend, onClick: () => void submit(), "aria-label": labels.send, title: sendBlockedReason ?? labels.send, children: sending ? _jsx(IconSpinner, {}) : _jsx(IconArrowUp, {}) })))] })] }), footer] })] }), _jsx(VoiceProblem, { dictation: dictation, labels: labels })] }));
195
171
  }
196
172
  //# sourceMappingURL=Composer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../src/react/Composer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../src/react/Composer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { type ReactNode, type Ref } from "react";
2
+ import { type DictationProblem } from "../dictation.js";
3
+ import type { ComposerVoice } from "./Composer.js";
4
+ export type DictationFieldLabels = {
5
+ voice: string;
6
+ voiceStop: string;
7
+ cancelRecording: string;
8
+ confirmRecording: string;
9
+ transcribing: string;
10
+ listening: string;
11
+ retryTake: string;
12
+ dismiss: string;
13
+ dictation: Record<DictationProblem, string>;
14
+ /** The button that opens the improve panel. */
15
+ improve: string;
16
+ /** Placeholder of the "what should change?" box. */
17
+ improveWhat: string;
18
+ improveApply: string;
19
+ improveWorking: string;
20
+ improveFailed: string;
21
+ /** Shown after a change, beside Undo. */
22
+ improved: string;
23
+ undo: string;
24
+ };
25
+ export declare const DEFAULT_DICTATION_FIELD_LABELS: DictationFieldLabels;
26
+ /**
27
+ * Writing help for a field: given the text and what the person asked for,
28
+ * resolve to the new text, or to `null` when it could not be done. Chatkit
29
+ * ships no model call and no prompt — the app (or `@bitbaum/writingkit`)
30
+ * owns those — only the way a person asks, sees and takes it back.
31
+ */
32
+ export type ImproveRun = (text: string, instruction: string) => Promise<string | null | undefined>;
33
+ export type DictationFieldProps = {
34
+ value: string;
35
+ onValueChange: (next: string) => void;
36
+ /** Visible label. Without one, `ariaLabel` is required for assistive tech. */
37
+ label?: ReactNode;
38
+ ariaLabel?: string;
39
+ id?: string;
40
+ placeholder?: string;
41
+ /** `false`: a one-line field (a title, a summary). Default: a growing text area. */
42
+ multiline?: boolean;
43
+ /** Fewest rows a multiline field shows. Default 3. */
44
+ rows?: number;
45
+ maxLength?: number;
46
+ disabled?: boolean;
47
+ required?: boolean;
48
+ /** The microphone. Pass `{ transcribeUrl }` for the server leg; `false` hides it. */
49
+ voice?: ComposerVoice | false;
50
+ /** Give it, and a non-empty field offers "Improve". */
51
+ improve?: {
52
+ run: ImproveRun;
53
+ suggestions?: readonly string[];
54
+ };
55
+ /** Under the field: a count, a rule, an example. */
56
+ hint?: ReactNode;
57
+ inputRef?: Ref<HTMLTextAreaElement | HTMLInputElement>;
58
+ labels?: Partial<Omit<DictationFieldLabels, "dictation">> & {
59
+ dictation?: Partial<DictationFieldLabels["dictation"]>;
60
+ };
61
+ className?: string;
62
+ };
63
+ /**
64
+ * ANY text box a person types words into: the microphone is part of it.
65
+ *
66
+ * This is the rule from AGENTS.md ("The experience belongs to the package")
67
+ * made a component: a field made by hand in an app has no microphone, 14px
68
+ * text that makes iOS zoom the page, and no way to take a failed take back —
69
+ * so there is one, and it is this. `Composer` is the same thing for a
70
+ * conversation (it also sends); this is for everything else: a note, a title,
71
+ * a bio, a message to a seller.
72
+ *
73
+ * Controlled. Dictation appends to what is there. With `improve`, a field that
74
+ * has text offers one more control: pick a suggestion or say or type what to
75
+ * change, the text is replaced, and Undo puts it back until the next edit.
76
+ */
77
+ export declare function DictationField({ value, onValueChange, label, ariaLabel, id, placeholder, multiline, rows, maxLength, disabled, required, voice, improve, hint, inputRef, labels: overrides, className, }: DictationFieldProps): import("react").JSX.Element;
78
+ //# sourceMappingURL=DictationField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DictationField.d.ts","sourceRoot":"","sources":["../../src/react/DictationField.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAErF,OAAO,EAA8B,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC5C,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,oBAkB5C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAEnG,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,8EAA8E;IAC9E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qFAAqF;IACrF,KAAK,CAAC,EAAE,aAAa,GAAG,KAAK,CAAC;IAC9B,uDAAuD;IACvD,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC/D,oDAAoD;IACpD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,GAAG,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,CAAC;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,GAAG;QAC1D,SAAS,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;KACxD,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,aAAa,EACb,KAAK,EACL,SAAS,EACT,EAAE,EACF,WAAW,EACX,SAAgB,EAChB,IAAQ,EACR,SAAS,EACT,QAAgB,EAChB,QAAQ,EACR,KAAU,EACV,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,MAAM,EAAE,SAAS,EACjB,SAAS,GACV,EAAE,mBAAmB,+BAwMrB"}
@@ -0,0 +1,128 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useId, useRef, useState } from "react";
4
+ import { appendTranscript } from "../composer.js";
5
+ import { DEFAULT_DICTATION_MESSAGES } from "../dictation.js";
6
+ import { useDictation } from "./use-dictation.js";
7
+ import { useAutoGrow } from "./hooks.js";
8
+ import { VoiceBar, VoiceProblem } from "./Voice.js";
9
+ import { IconMic, IconSpinner } from "./icons.js";
10
+ export const DEFAULT_DICTATION_FIELD_LABELS = {
11
+ voice: "Speak instead of typing",
12
+ voiceStop: "Stop recording",
13
+ cancelRecording: "Cancel recording",
14
+ confirmRecording: "Done — use what I said",
15
+ transcribing: "Transcribing…",
16
+ listening: "Listening…",
17
+ retryTake: "Try again",
18
+ dismiss: "Dismiss",
19
+ dictation: DEFAULT_DICTATION_MESSAGES,
20
+ improve: "Improve",
21
+ improveWhat: "What should change?",
22
+ improveApply: "Change it",
23
+ improveWorking: "Working on it…",
24
+ improveFailed: "That did not work just now. Your text is unchanged; try again, or edit it by hand.",
25
+ improved: "Changed by writing help.",
26
+ undo: "Undo",
27
+ };
28
+ /**
29
+ * ANY text box a person types words into: the microphone is part of it.
30
+ *
31
+ * This is the rule from AGENTS.md ("The experience belongs to the package")
32
+ * made a component: a field made by hand in an app has no microphone, 14px
33
+ * text that makes iOS zoom the page, and no way to take a failed take back —
34
+ * so there is one, and it is this. `Composer` is the same thing for a
35
+ * conversation (it also sends); this is for everything else: a note, a title,
36
+ * a bio, a message to a seller.
37
+ *
38
+ * Controlled. Dictation appends to what is there. With `improve`, a field that
39
+ * has text offers one more control: pick a suggestion or say or type what to
40
+ * change, the text is replaced, and Undo puts it back until the next edit.
41
+ */
42
+ export function DictationField({ value, onValueChange, label, ariaLabel, id, placeholder, multiline = true, rows = 3, maxLength, disabled = false, required, voice = {}, improve, hint, inputRef, labels: overrides, className, }) {
43
+ const labels = {
44
+ ...DEFAULT_DICTATION_FIELD_LABELS,
45
+ ...overrides,
46
+ dictation: { ...DEFAULT_DICTATION_FIELD_LABELS.dictation, ...overrides?.dictation },
47
+ };
48
+ const autoId = useId();
49
+ const fieldId = id ?? `ck-field-${autoId}`;
50
+ // The latest text, for a take that finishes after more typing.
51
+ const valueRef = useRef(value);
52
+ useEffect(() => {
53
+ valueRef.current = value;
54
+ });
55
+ const set = (next) => {
56
+ valueRef.current = next;
57
+ onValueChange(next);
58
+ };
59
+ const areaRef = useRef(null);
60
+ useAutoGrow(areaRef, multiline ? value : "");
61
+ const dictation = useDictation({
62
+ ...(voice || {}),
63
+ onText: (said) => {
64
+ setUndo(null);
65
+ set(appendTranscript(valueRef.current, said));
66
+ },
67
+ });
68
+ const voiceOn = voice !== false && dictation.supported;
69
+ const listening = dictation.status === "listening";
70
+ const transcribing = dictation.status === "transcribing";
71
+ const [open, setOpen] = useState(false);
72
+ const [working, setWorking] = useState(false);
73
+ const [failed, setFailed] = useState(false);
74
+ const [instruction, setInstruction] = useState("");
75
+ const [undo, setUndo] = useState(null);
76
+ const run = async (what) => {
77
+ if (!improve || working || !what.trim())
78
+ return;
79
+ setWorking(true);
80
+ setFailed(false);
81
+ const before = valueRef.current;
82
+ try {
83
+ const next = await improve.run(before, what.trim());
84
+ if (typeof next === "string" && next.trim()) {
85
+ setUndo(before);
86
+ set(next);
87
+ setOpen(false);
88
+ setInstruction("");
89
+ }
90
+ else
91
+ setFailed(true);
92
+ }
93
+ catch {
94
+ setFailed(true);
95
+ }
96
+ finally {
97
+ setWorking(false);
98
+ }
99
+ };
100
+ const canImprove = Boolean(improve) && value.trim().length > 0;
101
+ const common = {
102
+ id: fieldId,
103
+ className: "ck-field-input",
104
+ value,
105
+ placeholder: listening ? labels.listening : placeholder,
106
+ maxLength,
107
+ required,
108
+ disabled: disabled || transcribing,
109
+ "aria-label": label ? undefined : (ariaLabel ?? placeholder),
110
+ };
111
+ const onChange = (next) => {
112
+ setUndo(null);
113
+ set(next);
114
+ };
115
+ const setRefs = (el) => {
116
+ if (multiline)
117
+ areaRef.current = el;
118
+ if (typeof inputRef === "function")
119
+ inputRef(el);
120
+ else if (inputRef)
121
+ inputRef.current = el;
122
+ };
123
+ return (_jsxs("div", { className: className ? `ck-field-wrap ${className}` : "ck-field-wrap", children: [label && (_jsx("label", { className: "ck-field-label", htmlFor: fieldId, children: label })), _jsxs("div", { className: "ck-field-frame", children: [_jsx(VoiceBar, { dictation: dictation, labels: labels }), _jsxs("div", { className: multiline ? "ck-field" : "ck-field ck-field-single", children: [multiline ? (_jsx("textarea", { ...common, ref: setRefs, rows: rows, onChange: (e) => onChange(e.target.value) })) : (_jsx("input", { ...common, ref: setRefs, type: "text", enterKeyHint: "done", onChange: (e) => onChange(e.target.value) })), _jsxs("div", { className: "ck-field-actions", children: [canImprove && (_jsx("button", { type: "button", className: "ck-field-improve", "aria-expanded": open, disabled: disabled || working, onClick: () => setOpen((o) => !o), children: labels.improve })), voiceOn && (_jsx("button", { type: "button", className: listening ? "ck-icon-btn ck-mic ck-mic-on" : "ck-icon-btn ck-mic", onClick: dictation.toggle, disabled: disabled || transcribing, "aria-label": listening ? labels.voiceStop : labels.voice, "aria-pressed": listening, title: listening ? labels.voiceStop : labels.voice, children: transcribing ? _jsx(IconSpinner, {}) : _jsx(IconMic, {}) }))] })] })] }), open && improve && (_jsxs("div", { className: "ck-field-improve-panel", children: [improve.suggestions && improve.suggestions.length > 0 && (_jsx("div", { className: "ck-field-suggestions", role: "group", children: improve.suggestions.map((s) => (_jsx("button", { type: "button", className: "ck-field-suggestion", disabled: working, onClick: () => void run(s), children: s }, s))) })), _jsxs("div", { className: "ck-field-improve-row", children: [_jsx(DictationField, { value: instruction, onValueChange: setInstruction, multiline: false, placeholder: labels.improveWhat, ariaLabel: labels.improveWhat, voice: voice, disabled: working, labels: overrides }), _jsx("button", { type: "button", className: "ck-field-apply", disabled: working || !instruction.trim(), onClick: () => void run(instruction), children: working ? labels.improveWorking : labels.improveApply })] }), failed && (_jsx("p", { className: "ck-problem", role: "alert", children: _jsx("span", { children: labels.improveFailed }) }))] })), undo !== null && (_jsxs("p", { className: "ck-field-undo", role: "status", children: [_jsx("span", { children: labels.improved }), _jsx("button", { type: "button", className: "ck-problem-retry", onClick: () => {
124
+ set(undo);
125
+ setUndo(null);
126
+ }, children: labels.undo })] })), _jsx(VoiceProblem, { dictation: dictation, labels: labels }), hint && _jsx("div", { className: "ck-field-hint", children: hint })] }));
127
+ }
128
+ //# sourceMappingURL=DictationField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DictationField.js","sourceRoot":"","sources":["../../src/react/DictationField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { DictationProblem } from "../dictation.js";
2
+ import type { DictationController } from "./use-dictation.js";
3
+ /**
4
+ * The microphone's two visible states, drawn once. `Composer` and
5
+ * `DictationField` both put them over / under their box, so a take looks and
6
+ * behaves the same in a chat, in a comment and in a title field — the same
7
+ * "every control the same everywhere" rule as the rest of the package.
8
+ */
9
+ export type VoiceLabels = {
10
+ cancelRecording: string;
11
+ confirmRecording: string;
12
+ transcribing: string;
13
+ retryTake: string;
14
+ dismiss: string;
15
+ dictation: Record<DictationProblem, string>;
16
+ };
17
+ /** Covers its positioned parent while a take is live or being written down. */
18
+ export declare function VoiceBar({ dictation, labels, }: {
19
+ dictation: DictationController;
20
+ labels: VoiceLabels;
21
+ }): import("react").JSX.Element | null;
22
+ /** A mic failure, in words, with the way forward: try the kept take again, or dismiss. */
23
+ export declare function VoiceProblem({ dictation, labels, }: {
24
+ dictation: DictationController;
25
+ labels: VoiceLabels;
26
+ }): import("react").JSX.Element | null;
27
+ //# sourceMappingURL=Voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Voice.d.ts","sourceRoot":"","sources":["../../src/react/Voice.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GAAG;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;CAC7C,CAAC;AAiCF,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,MAAM,GACP,EAAE;IACD,SAAS,EAAE,mBAAmB,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC;CACrB,sCAkDA;AAED,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,MAAM,GACP,EAAE;IACD,SAAS,EAAE,mBAAmB,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC;CACrB,sCA8BA"}
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import { formatElapsed } from "../composer.js";
5
+ import { IconCheck, IconSpinner, IconX } from "./icons.js";
6
+ /**
7
+ * What has been heard so far, as one line that follows the end of the words:
8
+ * a long sentence scrolls with the speaker instead of freezing on its start.
9
+ */
10
+ function LiveWords({ text, dim }) {
11
+ const ref = useRef(null);
12
+ useEffect(() => {
13
+ const el = ref.current;
14
+ if (el)
15
+ el.scrollLeft = el.scrollWidth;
16
+ }, [text]);
17
+ return (_jsx("span", { ref: ref, className: dim ? "ck-voice-live ck-voice-live-dim" : "ck-voice-live", children: text }));
18
+ }
19
+ function Elapsed({ since }) {
20
+ const [now, setNow] = useState(() => Date.now());
21
+ useEffect(() => {
22
+ if (since === null)
23
+ return;
24
+ const t = setInterval(() => setNow(Date.now()), 250);
25
+ return () => clearInterval(t);
26
+ }, [since]);
27
+ return (_jsx("span", { className: "ck-voice-timer", children: formatElapsed(since === null ? 0 : (now - since) / 1000) }));
28
+ }
29
+ /** Covers its positioned parent while a take is live or being written down. */
30
+ export function VoiceBar({ dictation, labels, }) {
31
+ const listening = dictation.status === "listening";
32
+ const transcribing = dictation.status === "transcribing";
33
+ if (!listening && !transcribing)
34
+ return null;
35
+ return (_jsx("div", { className: "ck-voice-bar", role: "status", "aria-live": "polite", children: listening ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "ck-voice-dot", "aria-hidden": true }), dictation.liveText ? (_jsx(LiveWords, { text: dictation.liveText })) : (_jsx("span", { className: "ck-voice-wave", "aria-hidden": true, children: Array.from({ length: 9 }).map((_, i) => (_jsx("span", {}, i))) })), _jsx(Elapsed, { since: dictation.startedAt }), _jsx("button", { type: "button", className: "ck-icon-btn", onClick: dictation.cancel, "aria-label": labels.cancelRecording, title: labels.cancelRecording, children: _jsx(IconX, {}) }), _jsx("button", { type: "button", className: "ck-voice-confirm", onClick: dictation.stop, "aria-label": labels.confirmRecording, title: labels.confirmRecording, children: _jsx(IconCheck, {}) })] })) : (_jsxs(_Fragment, { children: [_jsx(IconSpinner, {}), dictation.liveText ? (_jsx(LiveWords, { text: dictation.liveText, dim: true })) : (_jsx("span", { className: "ck-voice-timer", children: labels.transcribing }))] })) }));
36
+ }
37
+ /** A mic failure, in words, with the way forward: try the kept take again, or dismiss. */
38
+ export function VoiceProblem({ dictation, labels, }) {
39
+ if (!dictation.problem)
40
+ return null;
41
+ return (_jsxs("p", { className: "ck-problem", role: "status", children: [_jsxs("span", { children: [labels.dictation[dictation.problem], dictation.problemDetail && (_jsxs("span", { className: "ck-problem-detail", children: [" ", dictation.problemDetail] }))] }), dictation.canRetry && (_jsx("button", { type: "button", className: "ck-problem-retry", onClick: () => void dictation.retry(), disabled: dictation.status !== "idle", children: labels.retryTake })), _jsx("button", { type: "button", className: "ck-problem-x", onClick: dictation.clearProblem, "aria-label": labels.dismiss, children: _jsx(IconX, {}) })] }));
42
+ }
43
+ //# sourceMappingURL=Voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Voice.js","sourceRoot":"","sources":["../../src/react/Voice.tsx"],"names":[],"mappings":"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"}
@@ -11,6 +11,10 @@ export { Composer, DEFAULT_COMPOSER_LABELS } from "./Composer.js";
11
11
  export type { ComposerProps, ComposerLabels, ComposerLabelOverrides, ComposerVoice, ComposerHandle, } from "./Composer.js";
12
12
  export { ChatThread, ChatMessage, ChatReplies, ChatStarters, starterParts, ThinkingRow, formatThinkingDuration, DEFAULT_THREAD_LABELS, } from "./Thread.js";
13
13
  export type { ChatMessageData, ChatFailure, FooterInfo, MessageChip, ChatSpeaker, LiveTurn, Starter, Thinking, ThinkingStep, ThreadLabels, } from "./Thread.js";
14
+ export { DictationField, DEFAULT_DICTATION_FIELD_LABELS } from "./DictationField.js";
15
+ export type { DictationFieldProps, DictationFieldLabels, ImproveRun } from "./DictationField.js";
16
+ export { CommentThread, DEFAULT_COMMENT_THREAD_LABELS } from "./CommentThread.js";
17
+ export type { CommentItem, CommentTransport, CommentThreadProps, CommentThreadLabels, } from "./CommentThread.js";
14
18
  export { ChatScreen } from "./Screen.js";
15
19
  export { Markdown, SourcesRow, defaultRenderLink, defaultRenderCitation } from "./Markdown.js";
16
20
  export { AnswerActions, DEFAULT_ANSWER_ACTIONS_LABELS } from "./AnswerActions.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EACV,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,eAAe,EACf,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAClF,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC9F,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,iBAAiB,GAClB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@
9
9
  */
10
10
  export { Composer, DEFAULT_COMPOSER_LABELS } from "./Composer.js";
11
11
  export { ChatThread, ChatMessage, ChatReplies, ChatStarters, starterParts, ThinkingRow, formatThinkingDuration, DEFAULT_THREAD_LABELS, } from "./Thread.js";
12
+ export { DictationField, DEFAULT_DICTATION_FIELD_LABELS } from "./DictationField.js";
13
+ export { CommentThread, DEFAULT_COMMENT_THREAD_LABELS } from "./CommentThread.js";
12
14
  export { ChatScreen } from "./Screen.js";
13
15
  export { Markdown, SourcesRow, defaultRenderLink, defaultRenderCitation } from "./Markdown.js";
14
16
  export { AnswerActions, DEFAULT_ANSWER_ACTIONS_LABELS } from "./AnswerActions.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAQlE,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAarB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQ9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAQlE,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAarB,OAAO,EAAE,cAAc,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAErF,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAOlF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQ9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitbaum/chatkit",
3
- "version": "0.22.1",
3
+ "version": "0.23.0",
4
4
  "description": "One chat for every product: a composer with a microphone that always works, a thread that does not fight the reader, messages with copy and retry, and LLM markdown — the fleet's chat standard as a package.",
5
5
  "license": "MIT",
6
6
  "author": "Cato",
@@ -79,10 +79,10 @@
79
79
  "format": "prettier --write .",
80
80
  "format:check": "prettier --check .",
81
81
  "demo": "esbuild demo/demo.tsx --bundle --jsx=automatic --format=iife --define:process.env.NODE_ENV='\"production\"' --outfile=demo/dist/demo.js --log-level=warning",
82
- "test:browser": "pnpm run demo && node test/browser.mjs && node test/browser-scroll.mjs && node test/browser-app.mjs && node test/browser-pdf.mjs"
82
+ "test:browser": "pnpm run demo && node test/browser.mjs && node test/browser-scroll.mjs && node test/browser-app.mjs && node test/browser-pdf.mjs && node test/browser-field.mjs"
83
83
  },
84
84
  "devDependencies": {
85
- "@bitbaum/design-tokens": "^1.2.0",
85
+ "@bitbaum/design-tokens": "^1.5.2",
86
86
  "@eslint/js": "^10.0.1",
87
87
  "@types/node": "^26.4.0",
88
88
  "@types/react": "^19.2.18",
package/styles.css CHANGED
@@ -2426,3 +2426,235 @@ a.ck-turn-chip:hover {
2426
2426
  animation: none;
2427
2427
  }
2428
2428
  }
2429
+
2430
+ /* ── field and comments: after the ChatApp boundary on purpose ─────────────
2431
+ DictationField and CommentThread. Not a chat surface, so not in the
2432
+ embedded styles/chat.css (the widget's budget is for the chat). The same
2433
+ frame, 16px text, mic and voice bar as the composer, for everything that is
2434
+ not a conversation. */
2435
+ .ck-field-wrap,
2436
+ .ck-comments {
2437
+ font-family: var(--ck-font);
2438
+ color: var(--ck-fg);
2439
+ min-width: 0;
2440
+ }
2441
+ .ck-field-wrap *,
2442
+ .ck-comments * {
2443
+ box-sizing: border-box;
2444
+ }
2445
+ .ck-field-wrap {
2446
+ display: flex;
2447
+ flex-direction: column;
2448
+ gap: 0.375rem;
2449
+ }
2450
+ .ck-field-label {
2451
+ font-size: 0.875rem;
2452
+ font-weight: 600;
2453
+ color: var(--ck-fg-2);
2454
+ }
2455
+ .ck-field-frame {
2456
+ position: relative;
2457
+ min-width: 0;
2458
+ }
2459
+ .ck-field {
2460
+ display: flex;
2461
+ flex-direction: column;
2462
+ min-width: 0;
2463
+ padding: 0.5rem 0.625rem 0.5rem;
2464
+ border: 1px solid var(--ck-line);
2465
+ border-radius: var(--ck-radius-sm);
2466
+ background: var(--ck-bg);
2467
+ transition: border-color 0.15s ease;
2468
+ }
2469
+ .ck-field:focus-within {
2470
+ border-color: var(--ck-line-2);
2471
+ outline: 2px solid var(--ck-accent);
2472
+ outline-offset: 1px;
2473
+ }
2474
+ .ck-field-input {
2475
+ display: block;
2476
+ width: 100%;
2477
+ min-width: 0;
2478
+ min-height: 2.5rem;
2479
+ resize: none;
2480
+ padding: 0.25rem 0.125rem;
2481
+ border: 0;
2482
+ outline: none;
2483
+ background: transparent;
2484
+ color: var(--ck-fg);
2485
+ font: inherit;
2486
+ font-size: max(16px, var(--ck-text));
2487
+ line-height: var(--ck-leading);
2488
+ }
2489
+ .ck-field-input::placeholder {
2490
+ color: var(--ck-muted);
2491
+ }
2492
+ .ck-field-input:disabled {
2493
+ opacity: 0.6;
2494
+ }
2495
+ /* A multiline field: the controls sit under the text, on the right. */
2496
+ .ck-field-actions {
2497
+ display: flex;
2498
+ align-items: center;
2499
+ justify-content: flex-end;
2500
+ gap: 0.375rem;
2501
+ min-height: 0;
2502
+ }
2503
+ .ck-field-actions:empty {
2504
+ display: none;
2505
+ }
2506
+ /* A one-line field: the controls sit beside the text. */
2507
+ .ck-field-single {
2508
+ flex-direction: row;
2509
+ align-items: center;
2510
+ gap: 0.375rem;
2511
+ }
2512
+ .ck-field-single .ck-field-input {
2513
+ flex: 1;
2514
+ }
2515
+ .ck-field-improve,
2516
+ .ck-field-apply,
2517
+ .ck-field-suggestion {
2518
+ min-height: var(--ck-target);
2519
+ padding: 0 0.875rem;
2520
+ border: 1px solid var(--ck-line-2);
2521
+ border-radius: 999px;
2522
+ background: var(--ck-raised);
2523
+ color: var(--ck-fg);
2524
+ font: inherit;
2525
+ font-size: 0.9375rem;
2526
+ font-weight: 600;
2527
+ cursor: pointer;
2528
+ }
2529
+ .ck-field-improve[aria-expanded="true"] {
2530
+ border-color: var(--ck-accent);
2531
+ background: var(--ck-accent-soft);
2532
+ }
2533
+ .ck-field-improve:disabled,
2534
+ .ck-field-apply:disabled,
2535
+ .ck-field-suggestion:disabled {
2536
+ opacity: 0.5;
2537
+ cursor: default;
2538
+ }
2539
+ .ck-field-improve-panel {
2540
+ display: flex;
2541
+ flex-direction: column;
2542
+ gap: 0.5rem;
2543
+ padding: 0.625rem;
2544
+ border: 1px solid var(--ck-line);
2545
+ border-radius: var(--ck-radius-sm);
2546
+ background: var(--ck-overlay);
2547
+ }
2548
+ /* Suggestions are a few choices: an even grid, never wrapping pills. */
2549
+ .ck-field-suggestions {
2550
+ display: grid;
2551
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2552
+ gap: 0.375rem;
2553
+ }
2554
+ .ck-field-suggestion {
2555
+ min-width: 0;
2556
+ text-align: center;
2557
+ line-height: 1.25;
2558
+ padding-block: 0.5rem;
2559
+ }
2560
+ .ck-field-improve-row {
2561
+ display: flex;
2562
+ align-items: flex-start;
2563
+ gap: 0.375rem;
2564
+ }
2565
+ .ck-field-improve-row > .ck-field-wrap {
2566
+ flex: 1;
2567
+ }
2568
+ .ck-field-undo {
2569
+ display: flex;
2570
+ align-items: center;
2571
+ gap: 0.5rem;
2572
+ margin: 0;
2573
+ font-size: 0.9375rem;
2574
+ color: var(--ck-fg-2);
2575
+ }
2576
+ .ck-field-hint {
2577
+ font-size: 0.875rem;
2578
+ color: var(--ck-muted);
2579
+ }
2580
+ :where(.ck-field-wrap, .ck-comments) button:focus-visible,
2581
+ .ck-comment-signin-link:focus-visible {
2582
+ outline: 2px solid var(--ck-accent);
2583
+ outline-offset: 2px;
2584
+ }
2585
+
2586
+ /* ── comments: the conversation under anything ──────────────────────────── */
2587
+ .ck-comments {
2588
+ display: flex;
2589
+ flex-direction: column;
2590
+ gap: 0.75rem;
2591
+ }
2592
+ .ck-comments-title {
2593
+ margin: 0;
2594
+ font-size: 1.25rem;
2595
+ font-weight: 600;
2596
+ line-height: 1.3;
2597
+ }
2598
+ .ck-comment-list {
2599
+ list-style: none;
2600
+ margin: 0;
2601
+ padding: 0;
2602
+ }
2603
+ .ck-comment {
2604
+ padding: 0.75rem 0;
2605
+ border-top: 1px solid var(--ck-line);
2606
+ }
2607
+ .ck-comment:first-child {
2608
+ border-top: 0;
2609
+ }
2610
+ .ck-comment-meta {
2611
+ margin: 0 0 0.25rem;
2612
+ font-size: 0.875rem;
2613
+ color: var(--ck-muted);
2614
+ }
2615
+ .ck-comment-meta strong {
2616
+ color: var(--ck-fg);
2617
+ }
2618
+ .ck-comment-body {
2619
+ margin: 0;
2620
+ font-size: max(16px, var(--ck-text));
2621
+ line-height: var(--ck-leading);
2622
+ white-space: pre-wrap;
2623
+ overflow-wrap: anywhere;
2624
+ }
2625
+ .ck-comment-remove {
2626
+ min-height: 2rem;
2627
+ padding: 0;
2628
+ border: 0;
2629
+ background: none;
2630
+ color: var(--ck-accent);
2631
+ font: inherit;
2632
+ font-weight: 600;
2633
+ cursor: pointer;
2634
+ }
2635
+ .ck-comment-signin {
2636
+ margin: 0;
2637
+ }
2638
+ .ck-comment-signin-link {
2639
+ display: inline-flex;
2640
+ align-items: center;
2641
+ min-height: var(--ck-target);
2642
+ padding: 0 1rem;
2643
+ border: 1px solid var(--ck-line-2);
2644
+ border-radius: 999px;
2645
+ background: var(--ck-raised);
2646
+ color: var(--ck-fg);
2647
+ font-weight: 600;
2648
+ text-decoration: none;
2649
+ }
2650
+ @media (max-width: 380px) {
2651
+ .ck-field-suggestions {
2652
+ grid-template-columns: minmax(0, 1fr);
2653
+ }
2654
+ .ck-field-improve-row {
2655
+ flex-direction: column;
2656
+ }
2657
+ .ck-field-improve-row > .ck-field-wrap {
2658
+ width: 100%;
2659
+ }
2660
+ }