@particle-academy/react-fancy 6.3.0 → 6.5.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.
Files changed (109) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +1 -0
  3. package/dist/CodeBlock.types-BFMFB4X2.d.cts +53 -0
  4. package/dist/CodeBlock.types-BFMFB4X2.d.ts +53 -0
  5. package/dist/autocomplete.cjs +5 -5
  6. package/dist/autocomplete.js +4 -4
  7. package/dist/card.cjs +8 -8
  8. package/dist/card.js +2 -2
  9. package/dist/chat-thread.cjs +5 -4
  10. package/dist/chat-thread.js +3 -2
  11. package/dist/{chunk-K7JOZQRK.cjs → chunk-2G6TIX5Q.cjs} +4 -4
  12. package/dist/{chunk-K7JOZQRK.cjs.map → chunk-2G6TIX5Q.cjs.map} +1 -1
  13. package/dist/{chunk-TH4JZAMK.js → chunk-5TP642UT.js} +4 -4
  14. package/dist/{chunk-TH4JZAMK.js.map → chunk-5TP642UT.js.map} +1 -1
  15. package/dist/chunk-6BB32POL.js +29 -0
  16. package/dist/chunk-6BB32POL.js.map +1 -0
  17. package/dist/{chunk-XIA2UAVO.js → chunk-6GVOW3UL.js} +4 -4
  18. package/dist/{chunk-XIA2UAVO.js.map → chunk-6GVOW3UL.js.map} +1 -1
  19. package/dist/{chunk-4JT2QANA.cjs → chunk-6H7ZN23X.cjs} +3 -3
  20. package/dist/{chunk-4JT2QANA.cjs.map → chunk-6H7ZN23X.cjs.map} +1 -1
  21. package/dist/chunk-7ZCNZUZK.cjs +183 -0
  22. package/dist/chunk-7ZCNZUZK.cjs.map +1 -0
  23. package/dist/{chunk-MP55W37V.cjs → chunk-BYO5RUDE.cjs} +4 -4
  24. package/dist/{chunk-MP55W37V.cjs.map → chunk-BYO5RUDE.cjs.map} +1 -1
  25. package/dist/{chunk-2XO6EYZ7.js → chunk-EENHSMV2.js} +3 -3
  26. package/dist/{chunk-2XO6EYZ7.js.map → chunk-EENHSMV2.js.map} +1 -1
  27. package/dist/{chunk-7JLKOVHX.cjs → chunk-HLI6RB5V.cjs} +4 -4
  28. package/dist/{chunk-7JLKOVHX.cjs.map → chunk-HLI6RB5V.cjs.map} +1 -1
  29. package/dist/chunk-HZUKPYR3.cjs +31 -0
  30. package/dist/chunk-HZUKPYR3.cjs.map +1 -0
  31. package/dist/chunk-J2BWXCES.js +177 -0
  32. package/dist/chunk-J2BWXCES.js.map +1 -0
  33. package/dist/{chunk-CKO2KCUN.cjs → chunk-MPCZUZ4O.cjs} +7 -175
  34. package/dist/chunk-MPCZUZ4O.cjs.map +1 -0
  35. package/dist/{chunk-FBWUXSKH.js → chunk-PVHZO4T3.js} +6 -24
  36. package/dist/chunk-PVHZO4T3.js.map +1 -0
  37. package/dist/{chunk-3AA2KGZG.js → chunk-QF2FODTG.js} +5 -173
  38. package/dist/chunk-QF2FODTG.js.map +1 -0
  39. package/dist/chunk-QH4YSG7C.cjs +205 -0
  40. package/dist/chunk-QH4YSG7C.cjs.map +1 -0
  41. package/dist/{chunk-SRICSNL4.cjs → chunk-RE4BYTVM.cjs} +12 -12
  42. package/dist/{chunk-SRICSNL4.cjs.map → chunk-RE4BYTVM.cjs.map} +1 -1
  43. package/dist/{chunk-A6NYZ3F5.js → chunk-RWU2MFUL.js} +4 -4
  44. package/dist/{chunk-A6NYZ3F5.js.map → chunk-RWU2MFUL.js.map} +1 -1
  45. package/dist/{chunk-G7227RTY.cjs → chunk-TQL3QW7F.cjs} +5 -23
  46. package/dist/chunk-TQL3QW7F.cjs.map +1 -0
  47. package/dist/{chunk-23KQF47X.js → chunk-UUEAFG6V.js} +3 -3
  48. package/dist/{chunk-23KQF47X.js.map → chunk-UUEAFG6V.js.map} +1 -1
  49. package/dist/chunk-YRI6OFLY.js +203 -0
  50. package/dist/chunk-YRI6OFLY.js.map +1 -0
  51. package/dist/{chunk-WF6AYHOS.js → chunk-YYNUTUJO.js} +4 -4
  52. package/dist/{chunk-WF6AYHOS.js.map → chunk-YYNUTUJO.js.map} +1 -1
  53. package/dist/{chunk-KSSTFLV2.cjs → chunk-Z44A7NPD.cjs} +6 -6
  54. package/dist/{chunk-KSSTFLV2.cjs.map → chunk-Z44A7NPD.cjs.map} +1 -1
  55. package/dist/code-block.cjs +19 -0
  56. package/dist/code-block.cjs.map +1 -0
  57. package/dist/code-block.d.cts +13 -0
  58. package/dist/code-block.d.ts +13 -0
  59. package/dist/code-block.js +10 -0
  60. package/dist/code-block.js.map +1 -0
  61. package/dist/code-view.cjs +3 -2
  62. package/dist/code-view.d.cts +9 -6
  63. package/dist/code-view.d.ts +9 -6
  64. package/dist/code-view.js +2 -1
  65. package/dist/composer.cjs +1 -1
  66. package/dist/composer.js +1 -1
  67. package/dist/content-renderer.cjs +5 -4
  68. package/dist/content-renderer.js +2 -1
  69. package/dist/dropdown.cjs +1 -1
  70. package/dist/dropdown.js +1 -1
  71. package/dist/editor.cjs +10 -8
  72. package/dist/editor.js +8 -6
  73. package/dist/index.cjs +114 -107
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +2 -0
  76. package/dist/index.d.ts +2 -0
  77. package/dist/index.js +28 -25
  78. package/dist/index.js.map +1 -1
  79. package/dist/input.cjs +3 -3
  80. package/dist/input.js +3 -3
  81. package/dist/inputs.cjs +10 -10
  82. package/dist/inputs.js +5 -5
  83. package/dist/json-editor.cjs +16 -16
  84. package/dist/json-editor.js +5 -5
  85. package/dist/magic-wand.cjs +2 -2
  86. package/dist/magic-wand.js +2 -2
  87. package/dist/mobile-menu.cjs +1 -1
  88. package/dist/mobile-menu.js +1 -1
  89. package/dist/paste-pills.cjs +1 -1
  90. package/dist/paste-pills.js +1 -1
  91. package/dist/popover.cjs +1 -1
  92. package/dist/popover.js +1 -1
  93. package/dist/prompt-input.cjs +1 -1
  94. package/dist/prompt-input.js +1 -1
  95. package/dist/reason-tag.cjs +1 -1
  96. package/dist/reason-tag.js +1 -1
  97. package/dist/select.cjs +5 -5
  98. package/dist/select.js +4 -4
  99. package/dist/sidebar.cjs +1 -1
  100. package/dist/sidebar.js +1 -1
  101. package/dist/tooltip.cjs +1 -1
  102. package/dist/tooltip.js +1 -1
  103. package/docs/CodeBlock.md +101 -0
  104. package/docs/CodeView.md +21 -5
  105. package/package.json +12 -2
  106. package/dist/chunk-3AA2KGZG.js.map +0 -1
  107. package/dist/chunk-CKO2KCUN.cjs.map +0 -1
  108. package/dist/chunk-FBWUXSKH.js.map +0 -1
  109. package/dist/chunk-G7227RTY.cjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -11,6 +11,48 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [6.5.0] - 2026-11-02
15
+
16
+ ### Added
17
+
18
+ - **`CodeBlock` and `CodeView` highlight ten languages, not just HTML.** TypeScript (`ts`, `tsx`), JavaScript (`js`, `jsx`), JSON (`json`), PHP (`php`), Python (`py`), Go (`go`), Markdown (`md`), shell (`sh`, `bash`, `zsh`, `shell`), dotenv (`env`, `dotenv`) and HTML (`html`, `htm`, `xml`, `xhtml`), case-insensitively, through `@particle-academy/fancy-file-commons`' new `tokenize(code, language)` lookup. The grammars are the ones `fancy-code`'s `CodeEditor` uses, now shared from commons, so a snippet highlights the same way in both. Unknown languages still render as plain text. A new `CodeLanguage` type lists the known ids and still accepts any string.
19
+ - **No new colours.** Both components keep the existing light/dark palette; shell flags and dotenv keys use the `attribute` colour, shell command words `function`, and `$VAR` / `${VAR}` `variable`.
20
+
21
+ ### Changed
22
+
23
+ - **A `CodeBlock` or `CodeView` whose `language` is now recognised gains colour spans** where it used to render plain text: `bash`, `json`, `env`, `typescript`, `markdown` and the rest above. The text, its escaping and the copy behaviour are unchanged; only `<span style="color:...">` wrappers are added. **Consumer action:** none, unless a test asserted that such a block had no spans. The `Editor`'s Source view is unchanged: it passes `"html"` or `"plaintext"`.
24
+ - **The `@particle-academy/fancy-file-commons` range floor rose from `>=0.2` to `>=0.4`** (still `<2.0`): 0.4 is the first release with these grammars and `tokenize`. npm installs it for you. **Consumer action:** none.
25
+
26
+ ### Security
27
+
28
+ - **The escaping guarantee is now tested in every language.** The `<script>` / `<img onerror>` payload test runs across all ten grammars plus plain text, in `CodeBlock` with and without line numbers and in `CodeView`; the code always renders as text and nothing executes.
29
+
30
+ ## [6.4.0] - 2026-11-01
31
+
32
+ ### Added
33
+
34
+ - **`CodeBlock`: a display-only, copyable code block (requested by Prism).**
35
+ `<pre><code>` with an optional react-fancy `Button` that copies the raw
36
+ `code` prop exactly (never the highlight markup or line numbers), with visible
37
+ "Copied" / "Copy failed" feedback. **It contains no `textarea`, `input`,
38
+ `select` or `contenteditable` element**, so it is safe on pages that must not
39
+ accept input; `CodeView`, which overlays a textarea even when `readOnly`, is
40
+ unchanged. Props: `code`, `language`, `copyable` (default `true`), `title`
41
+ header, `showLineNumbers`, `wrap`, `copyLabels`, `onCopyCode`, plus every
42
+ `<div>` attribute. A missing Clipboard API (insecure context, server) reports
43
+ failure instead of throwing. Same light/dark palette as `CodeView`; server-
44
+ renders with no `window`, `document` or `navigator`. **Only HTML is
45
+ highlighted**: it is the one grammar `fancy-file-commons` ships, so shell,
46
+ JSON, env, PHP, TypeScript and Python render as plain text for now. Handles:
47
+ `data-react-fancy-code-block`, `-copy` with `data-copy-state`, `-title`,
48
+ `-line`. Subpath: `@particle-academy/react-fancy/code-block`.
49
+
50
+ ### Fixed
51
+
52
+ - **`CodeView` no longer throws where `window.matchMedia` is missing** (jsdom,
53
+ so any consumer's component tests). It now falls back to the `.dark` class
54
+ signal alone. Nothing for you to do.
55
+
14
56
  ## [6.3.0] - 2026-11-01
15
57
 
16
58
  ### Added
package/README.md CHANGED
@@ -166,6 +166,7 @@ npx vite build # Build demo app (verifies imports work)
166
166
  | Chart | SVG-based Bar, Line, Area, Pie, Donut, and Sparkline charts | [docs](docs/Chart.md) |
167
167
  | Editor | Toolbar chrome wrapper for contentEditable, with a Source toggle to edit raw HTML/Markdown | [docs](docs/Editor.md) |
168
168
  | CodeView | Lightweight syntax-highlighted source view (HTML highlighted; fills height) | [docs](docs/CodeView.md) |
169
+ | CodeBlock | Display-only code block with a copy button: no textarea, input or contenteditable; HTML highlighted, other languages plain | [docs](docs/CodeBlock.md) |
169
170
  | Kanban | Drag-and-drop board with columns and cards | [docs](docs/Kanban.md) |
170
171
  | ReorderableGrid | Row-major grid of cells reordered in place by pointer or keyboard, with pinned cells and a pure `moveItem` for agents | [docs](docs/ReorderableGrid.md) |
171
172
  | ContentRenderer | Markdown/HTML content renderer | [docs](docs/ContentRenderer.md) |
@@ -0,0 +1,53 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+
3
+ /**
4
+ * Language ids `CodeBlock` and `CodeView` highlight (aliases included). Any
5
+ * other string is accepted and renders as plain text.
6
+ */
7
+ type CodeLanguage = "typescript" | "ts" | "tsx" | "javascript" | "js" | "jsx" | "json" | "php" | "python" | "py" | "go" | "markdown" | "md" | "shell" | "sh" | "bash" | "zsh" | "dotenv" | "env" | "html" | "htm" | "xml" | "xhtml" | "plaintext" | (string & {});
8
+ /** Words on the copy button, for translation. */
9
+ interface CodeBlockCopyLabels {
10
+ /** Idle label (aria-label and tooltip). @default "Copy code" */
11
+ copy?: string;
12
+ /** Shown, visibly and to screen readers, after a successful copy. @default "Copied" */
13
+ copied?: string;
14
+ /** Shown after a copy that could not be written. @default "Copy failed" */
15
+ failed?: string;
16
+ }
17
+ /** Reported through `onCopyCode` after every copy attempt. */
18
+ interface CodeBlockCopyEvent {
19
+ /** Exactly the `code` prop: the raw source, never the highlighted HTML. */
20
+ text: string;
21
+ /** Whether the clipboard accepted it. */
22
+ ok: boolean;
23
+ }
24
+ interface CodeBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, "children" | "title"> {
25
+ /** The source to show. Rendered as text; never parsed as HTML. */
26
+ code: string;
27
+ /**
28
+ * Language id or alias, case-insensitive. Highlighted: TypeScript (`ts`,
29
+ * `tsx`), JavaScript (`js`, `jsx`), JSON (`json`), PHP (`php`), Python
30
+ * (`py`), Go (`go`), Markdown (`md`), shell (`sh`, `bash`, `zsh`, `shell`),
31
+ * dotenv (`env`, `dotenv`) and HTML (`html`, `htm`, `xml`, `xhtml`), via
32
+ * `fancy-file-commons`' `tokenize`. Any other value renders as plain text.
33
+ * Reflected as `data-language` either way.
34
+ * @default "plaintext"
35
+ */
36
+ language?: CodeLanguage;
37
+ /** Show a copy button. It copies `code` exactly. @default true */
38
+ copyable?: boolean;
39
+ /** Header above the code: a filename, or a short label like "Terminal". */
40
+ title?: ReactNode;
41
+ /** Number each line in a gutter that is not part of the code text. @default false */
42
+ showLineNumbers?: boolean;
43
+ /** Wrap long lines instead of scrolling horizontally. @default false */
44
+ wrap?: boolean;
45
+ /** Words on the copy button. */
46
+ copyLabels?: CodeBlockCopyLabels;
47
+ /** Called after every copy attempt, successful or not. */
48
+ onCopyCode?: (event: CodeBlockCopyEvent) => void;
49
+ /** Additional classes on the root element. */
50
+ className?: string;
51
+ }
52
+
53
+ export type { CodeBlockCopyEvent as C, CodeBlockCopyLabels as a, CodeBlockProps as b, CodeLanguage as c };
@@ -0,0 +1,53 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+
3
+ /**
4
+ * Language ids `CodeBlock` and `CodeView` highlight (aliases included). Any
5
+ * other string is accepted and renders as plain text.
6
+ */
7
+ type CodeLanguage = "typescript" | "ts" | "tsx" | "javascript" | "js" | "jsx" | "json" | "php" | "python" | "py" | "go" | "markdown" | "md" | "shell" | "sh" | "bash" | "zsh" | "dotenv" | "env" | "html" | "htm" | "xml" | "xhtml" | "plaintext" | (string & {});
8
+ /** Words on the copy button, for translation. */
9
+ interface CodeBlockCopyLabels {
10
+ /** Idle label (aria-label and tooltip). @default "Copy code" */
11
+ copy?: string;
12
+ /** Shown, visibly and to screen readers, after a successful copy. @default "Copied" */
13
+ copied?: string;
14
+ /** Shown after a copy that could not be written. @default "Copy failed" */
15
+ failed?: string;
16
+ }
17
+ /** Reported through `onCopyCode` after every copy attempt. */
18
+ interface CodeBlockCopyEvent {
19
+ /** Exactly the `code` prop: the raw source, never the highlighted HTML. */
20
+ text: string;
21
+ /** Whether the clipboard accepted it. */
22
+ ok: boolean;
23
+ }
24
+ interface CodeBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, "children" | "title"> {
25
+ /** The source to show. Rendered as text; never parsed as HTML. */
26
+ code: string;
27
+ /**
28
+ * Language id or alias, case-insensitive. Highlighted: TypeScript (`ts`,
29
+ * `tsx`), JavaScript (`js`, `jsx`), JSON (`json`), PHP (`php`), Python
30
+ * (`py`), Go (`go`), Markdown (`md`), shell (`sh`, `bash`, `zsh`, `shell`),
31
+ * dotenv (`env`, `dotenv`) and HTML (`html`, `htm`, `xml`, `xhtml`), via
32
+ * `fancy-file-commons`' `tokenize`. Any other value renders as plain text.
33
+ * Reflected as `data-language` either way.
34
+ * @default "plaintext"
35
+ */
36
+ language?: CodeLanguage;
37
+ /** Show a copy button. It copies `code` exactly. @default true */
38
+ copyable?: boolean;
39
+ /** Header above the code: a filename, or a short label like "Terminal". */
40
+ title?: ReactNode;
41
+ /** Number each line in a gutter that is not part of the code text. @default false */
42
+ showLineNumbers?: boolean;
43
+ /** Wrap long lines instead of scrolling horizontally. @default false */
44
+ wrap?: boolean;
45
+ /** Words on the copy button. */
46
+ copyLabels?: CodeBlockCopyLabels;
47
+ /** Called after every copy attempt, successful or not. */
48
+ onCopyCode?: (event: CodeBlockCopyEvent) => void;
49
+ /** Additional classes on the root element. */
50
+ className?: string;
51
+ }
52
+
53
+ export type { CodeBlockCopyEvent as C, CodeBlockCopyLabels as a, CodeBlockProps as b, CodeLanguage as c };
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkMP55W37V_cjs = require('./chunk-MP55W37V.cjs');
4
- require('./chunk-J2DI6RMR.cjs');
5
- require('./chunk-KJ22KE56.cjs');
6
- require('./chunk-L3V3BYVS.cjs');
3
+ var chunkBYO5RUDE_cjs = require('./chunk-BYO5RUDE.cjs');
7
4
  require('./chunk-6V44RRSB.cjs');
8
5
  require('./chunk-MKHYENKR.cjs');
6
+ require('./chunk-J2DI6RMR.cjs');
9
7
  require('./chunk-TI7D4QDM.cjs');
8
+ require('./chunk-KJ22KE56.cjs');
9
+ require('./chunk-L3V3BYVS.cjs');
10
10
  require('./chunk-57FQGQJK.cjs');
11
11
  require('./chunk-OUYC6EIL.cjs');
12
12
  require('./chunk-SNHU2AI4.cjs');
@@ -16,7 +16,7 @@ require('./chunk-ZU5Q77OT.cjs');
16
16
 
17
17
  Object.defineProperty(exports, "Autocomplete", {
18
18
  enumerable: true,
19
- get: function () { return chunkMP55W37V_cjs.Autocomplete; }
19
+ get: function () { return chunkBYO5RUDE_cjs.Autocomplete; }
20
20
  });
21
21
  //# sourceMappingURL=autocomplete.cjs.map
22
22
  //# sourceMappingURL=autocomplete.cjs.map
@@ -1,10 +1,10 @@
1
- export { Autocomplete } from './chunk-A6NYZ3F5.js';
2
- import './chunk-MQ6VGG62.js';
3
- import './chunk-OL53XYHF.js';
4
- import './chunk-NRXK42LO.js';
1
+ export { Autocomplete } from './chunk-RWU2MFUL.js';
5
2
  import './chunk-S42OGG43.js';
6
3
  import './chunk-5VMILVWD.js';
4
+ import './chunk-MQ6VGG62.js';
7
5
  import './chunk-RBCMKPBX.js';
6
+ import './chunk-OL53XYHF.js';
7
+ import './chunk-NRXK42LO.js';
8
8
  import './chunk-RGANGU7X.js';
9
9
  import './chunk-YX6FTJ6N.js';
10
10
  import './chunk-EDYAXGUM.js';
package/dist/card.cjs CHANGED
@@ -1,35 +1,35 @@
1
1
  'use strict';
2
2
 
3
- var chunk4JT2QANA_cjs = require('./chunk-4JT2QANA.cjs');
4
- require('./chunk-4XMBXG4K.cjs');
3
+ var chunk6H7ZN23X_cjs = require('./chunk-6H7ZN23X.cjs');
5
4
  require('./chunk-TTZJ2KXK.cjs');
5
+ require('./chunk-4XMBXG4K.cjs');
6
6
  require('./chunk-ZU5Q77OT.cjs');
7
7
 
8
8
 
9
9
 
10
10
  Object.defineProperty(exports, "Card", {
11
11
  enumerable: true,
12
- get: function () { return chunk4JT2QANA_cjs.Card; }
12
+ get: function () { return chunk6H7ZN23X_cjs.Card; }
13
13
  });
14
14
  Object.defineProperty(exports, "CardBleed", {
15
15
  enumerable: true,
16
- get: function () { return chunk4JT2QANA_cjs.CardBleed; }
16
+ get: function () { return chunk6H7ZN23X_cjs.CardBleed; }
17
17
  });
18
18
  Object.defineProperty(exports, "CardBody", {
19
19
  enumerable: true,
20
- get: function () { return chunk4JT2QANA_cjs.CardBody; }
20
+ get: function () { return chunk6H7ZN23X_cjs.CardBody; }
21
21
  });
22
22
  Object.defineProperty(exports, "CardFooter", {
23
23
  enumerable: true,
24
- get: function () { return chunk4JT2QANA_cjs.CardFooter; }
24
+ get: function () { return chunk6H7ZN23X_cjs.CardFooter; }
25
25
  });
26
26
  Object.defineProperty(exports, "CardHeader", {
27
27
  enumerable: true,
28
- get: function () { return chunk4JT2QANA_cjs.CardHeader; }
28
+ get: function () { return chunk6H7ZN23X_cjs.CardHeader; }
29
29
  });
30
30
  Object.defineProperty(exports, "CardMedia", {
31
31
  enumerable: true,
32
- get: function () { return chunk4JT2QANA_cjs.CardMedia; }
32
+ get: function () { return chunk6H7ZN23X_cjs.CardMedia; }
33
33
  });
34
34
  //# sourceMappingURL=card.cjs.map
35
35
  //# sourceMappingURL=card.cjs.map
package/dist/card.js CHANGED
@@ -1,6 +1,6 @@
1
- export { Card, CardBleed, CardBody, CardFooter, CardHeader, CardMedia } from './chunk-2XO6EYZ7.js';
2
- import './chunk-XM3V3RSU.js';
1
+ export { Card, CardBleed, CardBody, CardFooter, CardHeader, CardMedia } from './chunk-EENHSMV2.js';
3
2
  import './chunk-QPM4CZ4G.js';
3
+ import './chunk-XM3V3RSU.js';
4
4
  import './chunk-MMW2JGKZ.js';
5
5
  //# sourceMappingURL=card.js.map
6
6
  //# sourceMappingURL=card.js.map
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkK7JOZQRK_cjs = require('./chunk-K7JOZQRK.cjs');
3
+ var chunk2G6TIX5Q_cjs = require('./chunk-2G6TIX5Q.cjs');
4
4
  require('./chunk-S3TRSECD.cjs');
5
- require('./chunk-CKO2KCUN.cjs');
5
+ require('./chunk-MPCZUZ4O.cjs');
6
+ require('./chunk-7ZCNZUZK.cjs');
6
7
  require('./chunk-2C64OVOZ.cjs');
7
8
  require('./chunk-BJL3VDRK.cjs');
8
9
  require('./chunk-VBWRH4UW.cjs');
@@ -18,11 +19,11 @@ require('./chunk-ZU5Q77OT.cjs');
18
19
 
19
20
  Object.defineProperty(exports, "ChatMessage", {
20
21
  enumerable: true,
21
- get: function () { return chunkK7JOZQRK_cjs.ChatMessage; }
22
+ get: function () { return chunk2G6TIX5Q_cjs.ChatMessage; }
22
23
  });
23
24
  Object.defineProperty(exports, "ChatThread", {
24
25
  enumerable: true,
25
- get: function () { return chunkK7JOZQRK_cjs.ChatThread; }
26
+ get: function () { return chunk2G6TIX5Q_cjs.ChatThread; }
26
27
  });
27
28
  //# sourceMappingURL=chat-thread.cjs.map
28
29
  //# sourceMappingURL=chat-thread.cjs.map
@@ -1,6 +1,7 @@
1
- export { ChatMessage, ChatThread } from './chunk-23KQF47X.js';
1
+ export { ChatMessage, ChatThread } from './chunk-UUEAFG6V.js';
2
2
  import './chunk-AUTW5O4W.js';
3
- import './chunk-3AA2KGZG.js';
3
+ import './chunk-QF2FODTG.js';
4
+ import './chunk-J2BWXCES.js';
4
5
  import './chunk-I3LAFKJU.js';
5
6
  import './chunk-UZCR7DK5.js';
6
7
  import './chunk-IQ4KQJAO.js';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkCKO2KCUN_cjs = require('./chunk-CKO2KCUN.cjs');
3
+ var chunkMPCZUZ4O_cjs = require('./chunk-MPCZUZ4O.cjs');
4
4
  var chunkBJL3VDRK_cjs = require('./chunk-BJL3VDRK.cjs');
5
5
  var chunkOCHUZ7J3_cjs = require('./chunk-OCHUZ7J3.cjs');
6
6
  var chunkNZHVDWOM_cjs = require('./chunk-NZHVDWOM.cjs');
@@ -237,7 +237,7 @@ function ChatMessage({
237
237
  }, ctx);
238
238
  };
239
239
  const body = message.format === "text" ? /* @__PURE__ */ jsxRuntime.jsx("div", { "data-chat-content": "", className: "whitespace-pre-wrap break-words", children: message.content }) : /* @__PURE__ */ jsxRuntime.jsx("div", { "data-chat-content": "", className: "min-w-0 break-words", children: /* @__PURE__ */ jsxRuntime.jsx(
240
- chunkCKO2KCUN_cjs.ContentRenderer,
240
+ chunkMPCZUZ4O_cjs.ContentRenderer,
241
241
  {
242
242
  ...contentOptions,
243
243
  value: message.content,
@@ -619,5 +619,5 @@ ChatThread.displayName = "ChatThread";
619
619
 
620
620
  exports.ChatMessage = ChatMessage;
621
621
  exports.ChatThread = ChatThread;
622
- //# sourceMappingURL=chunk-K7JOZQRK.cjs.map
623
- //# sourceMappingURL=chunk-K7JOZQRK.cjs.map
622
+ //# sourceMappingURL=chunk-2G6TIX5Q.cjs.map
623
+ //# sourceMappingURL=chunk-2G6TIX5Q.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ChatThread/chat-utils.ts","../src/components/ChatThread/ChatMessage.tsx","../src/components/ChatThread/ChatThread.tsx"],"names":["useState","useRef","useEffect","useCallback","sanitizeComponentHref","jsxs","cn","jsx","Badge","Button","ContentRenderer","Fragment","Avatar","TEXT_MUTED","BORDER","useLayoutEffect","useId","useImperativeHandle"],"mappings":"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","file":"chunk-K7JOZQRK.cjs","sourcesContent":["import type { ChatMessageData, ChatThreadLabels } from \"./ChatThread.types\";\n\nexport const DEFAULT_LABELS: ChatThreadLabels = {\n log: \"Conversation\",\n loadEarlier: \"Load earlier messages\",\n loadingEarlier: \"Loading earlier messages...\",\n newMessages: (n) => (n === 1 ? \"1 new message\" : `${n} new messages`),\n internal: \"Internal note\",\n pending: \"Sending...\",\n failed: \"Not sent\",\n proposal: \"Proposed\",\n accept: \"Accept\",\n reject: \"Reject\",\n accepted: \"Accepted\",\n rejected: \"Rejected\",\n withdrawn: \"Withdrawn\",\n attachments: \"Attachments\",\n roles: {\n user: \"You\",\n assistant: \"Assistant\",\n system: \"System\",\n agent: \"Agent\",\n staff: \"Staff\",\n customer: \"Customer\",\n },\n};\n\nexport function mergeLabels(labels?: Partial<ChatThreadLabels>): ChatThreadLabels {\n if (!labels) return DEFAULT_LABELS;\n return {\n ...DEFAULT_LABELS,\n ...labels,\n roles: { ...DEFAULT_LABELS.roles, ...labels.roles },\n };\n}\n\n/** `null` for a missing or unparseable time: no time renders rather than \"Invalid Date\". */\nexport function toDate(value: string | number | undefined): Date | null {\n if (value === undefined || value === null || value === \"\") return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\n/** Local calendar day, `YYYY-MM-DD`. */\nexport function dayKey(d: Date): string {\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\nexport function defaultFormatTime(d: Date): string {\n return d.toLocaleTimeString(undefined, { hour: \"2-digit\", minute: \"2-digit\" });\n}\n\nexport function defaultFormatDay(d: Date): string {\n return d.toLocaleDateString(undefined, { dateStyle: \"medium\" });\n}\n\nexport function roleLabel(role: string, labels: ChatThreadLabels): string {\n const known = labels.roles[role];\n if (known) return known;\n return role ? role.charAt(0).toUpperCase() + role.slice(1) : \"\";\n}\n\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n const first = parts[0][0] ?? \"\";\n const last = parts.length > 1 ? (parts[parts.length - 1][0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n}\n\nexport function isOwn(message: ChatMessageData, ownRoles: string[]): boolean {\n return message.own ?? ownRoles.includes(message.role);\n}\n\nexport const DEFAULT_GROUP_WINDOW_MS = 5 * 60 * 1000;\n\n/** Does `curr` continue `prev`'s group? Same role, same author, same visibility, within the window. */\nexport function continuesGroup(\n prev: ChatMessageData | undefined,\n curr: ChatMessageData,\n windowMs: number,\n): boolean {\n if (!prev) return false;\n if (prev.role !== curr.role) return false;\n if ((prev.author?.name ?? \"\") !== (curr.author?.name ?? \"\")) return false;\n if ((prev.visibility ?? \"public\") !== (curr.visibility ?? \"public\")) return false;\n if (prev.proposal || curr.proposal) return false;\n if (curr.role === \"system\") return false;\n const a = toDate(prev.createdAt);\n const b = toDate(curr.createdAt);\n if (!a || !b) return false;\n const gap = b.getTime() - a.getTime();\n return gap >= 0 && gap <= windowMs;\n}\n\nexport function formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeComponentHref } from \"../../utils/sanitize\";\nimport { Avatar } from \"../Avatar\";\nimport { Badge } from \"../Badge\";\nimport { Button } from \"../Button\";\nimport { ContentRenderer } from \"../ContentRenderer\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatMessageData,\n ChatMessageProps,\n ChatThreadActionContext,\n ChatThreadLabels,\n} from \"./ChatThread.types\";\nimport {\n defaultFormatTime,\n formatBytes,\n initials,\n isOwn,\n mergeLabels,\n roleLabel,\n toDate,\n} from \"./chat-utils\";\n\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\nconst SURFACE =\n \"bg-[color:var(--fancy-surface,var(--color-white))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\nconst SURFACE_MUTED =\n \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\";\nconst TEXT =\n \"text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\";\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\n\n/**\n * Run a host callback that may return a Promise. While it is pending the\n * control is busy and a second run is refused. A rejection goes to\n * `onActionError`, or is left unhandled so it still reaches the console.\n *\n * @internal shared by ChatMessage (proposal decisions) and ChatThread (load earlier)\n */\nexport function useAcknowledgedAction(\n onActionError?: (error: unknown, action: ChatThreadActionContext) => void,\n): [busy: boolean, run: (fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => void] {\n const [busy, setBusy] = useState(false);\n const busyRef = useRef(false);\n const mounted = useRef(true);\n const onErrorRef = useRef(onActionError);\n onErrorRef.current = onActionError;\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const run = useCallback((fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => {\n if (busyRef.current) return;\n const result = fn();\n if (!result || typeof (result as Promise<unknown>).then !== \"function\") return;\n\n busyRef.current = true;\n setBusy(true);\n const settle = () => {\n busyRef.current = false;\n if (mounted.current) setBusy(false);\n };\n void Promise.resolve(result).then(settle, (error: unknown) => {\n settle();\n const onError = onErrorRef.current;\n if (onError) onError(error, ctx);\n else throw error;\n });\n }, []);\n\n return [busy, run];\n}\n\nfunction AttachmentItem({\n attachment,\n message,\n renderAttachment,\n}: {\n attachment: ChatAttachment;\n message: ChatMessageData;\n renderAttachment?: ChatMessageProps[\"renderAttachment\"];\n}) {\n let body: ReactNode;\n if (renderAttachment) {\n body = renderAttachment(attachment, message);\n } else {\n const href = sanitizeComponentHref(\"ChatMessage\", attachment.url);\n const size = typeof attachment.size === \"number\" ? (\n <span className={cn(\"ml-1\", TEXT_MUTED)}>({formatBytes(attachment.size)})</span>\n ) : null;\n body = href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2 break-all\">\n {attachment.name}\n {size}\n </a>\n ) : (\n <span className=\"break-all\">\n {attachment.name}\n {size}\n </span>\n );\n }\n\n return (\n <li data-chat-attachment={attachment.id} className=\"text-sm\">\n {body}\n </li>\n );\n}\n\nfunction ProposalFooter({\n message,\n labels,\n busy,\n onAccept,\n onReject,\n}: {\n message: ChatMessageData;\n labels: ChatThreadLabels;\n busy: boolean;\n onAccept?: () => void;\n onReject?: () => void;\n}) {\n const proposal = message.proposal!;\n const state = proposal.state ?? \"pending\";\n\n if (state !== \"pending\") {\n const text = state === \"accepted\" ? labels.accepted : state === \"rejected\" ? labels.rejected : labels.withdrawn;\n const color = state === \"accepted\" ? \"emerald\" : state === \"rejected\" ? \"red\" : \"zinc\";\n return (\n <div className=\"mt-2\">\n <Badge color={color} variant=\"soft\" size=\"sm\" data-chat-proposal-status={state}>\n {text}\n </Badge>\n </div>\n );\n }\n\n if (!onAccept && !onReject) return null;\n\n return (\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {onAccept && (\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"emerald\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"accept\"\n onClick={onAccept}\n >\n {proposal.acceptLabel ?? labels.accept}\n </Button>\n )}\n {onReject && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"reject\"\n onClick={onReject}\n >\n {proposal.rejectLabel ?? labels.reject}\n </Button>\n )}\n </div>\n );\n}\n\n/**\n * ChatMessage — one message of a `ChatThread`, usable on its own.\n *\n * Content is markdown through `ContentRenderer`, always sanitised (there is no\n * `unsafe` here on purpose: message bodies are text the host did not author).\n * `format: \"text\"` renders it literally. A message with a `proposal` is an\n * approval card: the host owns its state and decides it through\n * `onProposalAccept` / `onProposalReject`; the card never acts on its own.\n */\nexport function ChatMessage({\n message,\n actions,\n grouped = false,\n className,\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime = defaultFormatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n classNames,\n}: ChatMessageProps) {\n const labels = mergeLabels(labelsProp);\n const [busy, run] = useAcknowledgedAction(onActionError);\n\n const status = message.status ?? \"sent\";\n const visibility = message.visibility ?? \"public\";\n const internal = visibility === \"internal\";\n const own = isOwn(message, ownRoles);\n const system = message.role === \"system\";\n const proposal = message.proposal;\n const date = toDate(message.createdAt);\n // Always a name: the author's, else the role's (\"Assistant\", or the host's own role capitalised).\n const name = message.author?.name || roleLabel(message.role, labels);\n\n const decide = (kind: \"accept\" | \"reject\") => {\n if (!proposal) return;\n const cb = kind === \"accept\" ? onProposalAccept : onProposalReject;\n if (!cb) return;\n const ctx: ChatThreadActionContext = {\n type: kind === \"accept\" ? \"proposal-accept\" : \"proposal-reject\",\n messageId: message.id,\n proposalId: proposal.id,\n };\n run(() => {\n onActivity?.(ctx);\n return cb(message);\n }, ctx);\n };\n\n const body =\n message.format === \"text\" ? (\n <div data-chat-content=\"\" className=\"whitespace-pre-wrap break-words\">\n {message.content}\n </div>\n ) : (\n <div data-chat-content=\"\" className=\"min-w-0 break-words\">\n <ContentRenderer\n {...contentOptions}\n value={message.content}\n format=\"markdown\"\n streaming={status === \"streaming\" ? streaming : false}\n />\n </div>\n );\n\n const attachments =\n message.attachments && message.attachments.length > 0 ? (\n <ul data-chat-attachments=\"\" aria-label={labels.attachments} className=\"mt-2 flex flex-col gap-1\">\n {message.attachments.map((a) => (\n <AttachmentItem key={a.id} attachment={a} message={message} renderAttachment={renderAttachment} />\n ))}\n </ul>\n ) : null;\n\n const statusText =\n status === \"pending\" ? (\n <div data-chat-status-text=\"pending\" className={cn(\"mt-1 text-xs\", TEXT_MUTED)}>\n {labels.pending}\n </div>\n ) : status === \"failed\" ? (\n <div data-chat-status-text=\"failed\" className=\"mt-1 text-xs text-red-600 dark:text-red-400\">\n {labels.failed}\n </div>\n ) : null;\n\n const actionsSlot =\n actions !== undefined && actions !== null && actions !== false ? (\n <div data-chat-message-actions=\"\" className={cn(\"mt-1 flex flex-wrap items-center gap-1\", classNames?.actions)}>\n {actions}\n </div>\n ) : null;\n\n const rootAttrs = {\n \"data-chat-message\": message.id,\n \"data-chat-role\": message.role,\n \"data-chat-status\": status,\n \"data-chat-visibility\": visibility,\n \"data-chat-own\": own ? \"\" : undefined,\n \"data-chat-grouped\": grouped ? \"\" : undefined,\n \"aria-busy\": status === \"streaming\" ? true : undefined,\n };\n\n if (system && !proposal) {\n return (\n <article\n {...rootAttrs}\n className={cn(\"flex flex-col items-center px-4 py-1 text-center text-xs\", TEXT_MUTED, className, classNames?.message)}\n >\n {internal && (\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n )}\n <div className={cn(\"max-w-prose\", classNames?.bubble)}>{body}</div>\n {attachments}\n {actionsSlot}\n </article>\n );\n }\n\n const bubbleClass = cn(\n \"rounded-2xl px-3.5 py-2.5 text-sm\",\n TEXT,\n internal\n ? \"border border-dashed border-amber-400 bg-amber-50 dark:border-amber-500/60 dark:bg-amber-950/30\"\n : proposal\n ? cn(\"border-2 border-violet-300 dark:border-violet-500/60\", SURFACE)\n : own\n ? cn(\"border\", BORDER, SURFACE)\n : SURFACE_MUTED,\n status === \"failed\" && \"ring-1 ring-red-400/70\",\n classNames?.bubble,\n proposal && classNames?.proposal,\n );\n\n const bubbleInner = (\n <>\n {internal && (\n <div className=\"mb-1.5\">\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n </div>\n )}\n {proposal && (\n <div data-chat-proposal-header=\"\" className=\"mb-1.5 flex flex-wrap items-center gap-2\">\n <Badge color=\"violet\" variant=\"soft\" size=\"sm\">\n {labels.proposal}\n </Badge>\n {proposal.title && <span className=\"font-medium\">{proposal.title}</span>}\n </div>\n )}\n {body}\n {attachments}\n {proposal && (\n <ProposalFooter\n message={message}\n labels={labels}\n busy={busy}\n onAccept={onProposalAccept ? () => decide(\"accept\") : undefined}\n onReject={onProposalReject ? () => decide(\"reject\") : undefined}\n />\n )}\n </>\n );\n\n return (\n <article\n {...rootAttrs}\n className={cn(\n \"flex gap-2.5 px-3\",\n grouped ? \"pt-0.5\" : \"pt-3\",\n own && \"flex-row-reverse\",\n className,\n classNames?.message,\n )}\n >\n <div className=\"w-8 shrink-0\" aria-hidden={grouped || undefined}>\n {!grouped && (\n <Avatar size=\"sm\" src={message.author?.avatar} alt=\"\" fallback={initials(name)} />\n )}\n </div>\n <div className={cn(\"flex min-w-0 max-w-[85%] flex-col\", own ? \"items-end\" : \"items-start\")}>\n {!grouped && (\n <div\n data-chat-header=\"\"\n className={cn(\"mb-1 flex items-baseline gap-2 text-xs\", own && \"flex-row-reverse\", classNames?.header)}\n >\n <span data-chat-author=\"\" className={cn(\"font-medium\", TEXT)}>\n {name}\n </span>\n {date && (\n <time dateTime={date.toISOString()} className={TEXT_MUTED}>\n {formatTime(date)}\n </time>\n )}\n </div>\n )}\n {proposal ? (\n <div\n data-chat-proposal={proposal.id}\n data-chat-proposal-state={proposal.state ?? \"pending\"}\n aria-busy={busy || undefined}\n className={cn(\"min-w-0 max-w-full\", bubbleClass)}\n >\n {bubbleInner}\n </div>\n ) : (\n <div data-chat-bubble=\"\" className={cn(\"min-w-0 max-w-full\", bubbleClass)}>\n {bubbleInner}\n </div>\n )}\n {statusText}\n {actionsSlot}\n </div>\n </article>\n );\n}\n\nChatMessage.displayName = \"ChatMessage\";\n","import {\n Fragment,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n type UIEvent,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button\";\nimport { ChatMessage, useAcknowledgedAction } from \"./ChatMessage\";\nimport type { ChatMessageData, ChatThreadProps } from \"./ChatThread.types\";\nimport {\n DEFAULT_GROUP_WINDOW_MS,\n continuesGroup,\n dayKey,\n defaultFormatDay,\n isOwn,\n mergeLabels,\n toDate,\n} from \"./chat-utils\";\n\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\n\n// The isomorphic layout effect: scroll work must happen before paint in the\n// browser, and must not warn during SSR.\nconst useIsoLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\ninterface Seen {\n ids: Set<string>;\n first?: string;\n last?: string;\n scrollHeight: number;\n /** The reader's position as of the last render or scroll event, before any browser adjustment. */\n scrollTop: number;\n}\n\n/**\n * ChatThread — a controlled message list for agent and support conversations.\n *\n * - **Controlled.** It renders exactly `messages`, oldest first. Loading\n * earlier history and deciding a proposal go through callbacks; nothing is\n * held internally that an agent would need to read or write.\n * - **Stick to the bottom without yanking.** New messages are followed only\n * while the reader is at the bottom. A reader who scrolled up stays put and\n * gets an \"N new messages\" jump control. Prepended history keeps the\n * reader's place. Only the log's own `scrollTop` is ever set, and focus moves\n * with `preventScroll`, so no ancestor (or the page) scrolls (the 5.69 rule).\n * - **Visibility is the host's.** `visibility: \"internal\"` is labelled and\n * styled, never filtered: pass only what the viewer may see.\n * - **Handles:** `data-react-fancy-chat-thread`, `data-chat-message=\"<id>\"`,\n * `data-chat-role`, `data-chat-status`, `data-chat-visibility`,\n * `data-chat-proposal=\"<id>\"`, `data-chat-proposal-action`.\n * - **Observable:** `onActivity` reports every interaction as one stream.\n *\n * Pair it with `Composer` or `PromptInput` in the `composer` slot (both have\n * acknowledged send). It does not ship an input of its own.\n */\nexport function ChatThread({\n ref,\n messages,\n heading,\n headingLevel = 2,\n onLoadEarlier,\n hasEarlier,\n loadingEarlier = false,\n stickToBottom = true,\n bottomThreshold = 48,\n onAtBottomChange,\n separators = \"none\",\n formatDay = defaultFormatDay,\n groupConsecutive = false,\n renderActions,\n composer,\n empty,\n classNames,\n className,\n // message display\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n onScroll: onScrollProp,\n ...rest\n}: ChatThreadProps) {\n const labels = mergeLabels(labelsProp);\n const headingId = useId();\n const logRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const atBottomRef = useRef(true);\n const seenRef = useRef<Seen | null>(null);\n const [atBottom, setAtBottom] = useState(true);\n const [unseen, setUnseen] = useState(0);\n const [loadBusy, runLoad] = useAcknowledgedAction(onActionError);\n\n const onAtBottomChangeRef = useRef(onAtBottomChange);\n onAtBottomChangeRef.current = onAtBottomChange;\n\n const measure = useCallback(\n (el: HTMLElement) => el.scrollHeight - el.scrollTop - el.clientHeight <= bottomThreshold,\n [bottomThreshold],\n );\n\n const commitAtBottom = useCallback((value: boolean) => {\n const changed = atBottomRef.current !== value;\n atBottomRef.current = value;\n setAtBottom(value);\n if (value) setUnseen(0);\n if (changed) onAtBottomChangeRef.current?.(value);\n }, []);\n\n const scrollLogToBottom = useCallback(() => {\n const el = logRef.current;\n if (!el) return;\n // The log's own scrollTop only. Never scrollIntoView: that scrolls every\n // scrollable ancestor too, up to the page.\n el.scrollTop = el.scrollHeight;\n }, []);\n\n // Follow, hold, or keep place, every time the messages change.\n useIsoLayoutEffect(() => {\n const el = logRef.current;\n if (!el) return;\n\n const ids = messages.map((m) => m.id);\n const first = ids[0];\n const last = ids[ids.length - 1];\n const prev = seenRef.current;\n\n if (!prev) {\n if (stickToBottom) scrollLogToBottom();\n } else {\n const prepended =\n prev.last !== undefined &&\n prev.last === last &&\n prev.first !== undefined &&\n prev.first !== first &&\n ids.includes(prev.first);\n\n if (prepended) {\n if (stickToBottom && atBottomRef.current) scrollLogToBottom();\n // From the position BEFORE the change, never the current one: the\n // browser's scroll anchoring (overflow-anchor) may already have moved\n // scrollTop by the inserted height, and adding it again overshoots.\n else el.scrollTop = prev.scrollTop + (el.scrollHeight - prev.scrollHeight);\n } else {\n const lastIndex = prev.last === undefined ? -1 : ids.indexOf(prev.last);\n const appended: ChatMessageData[] = [];\n for (let i = lastIndex + 1; i < messages.length; i++) {\n if (!prev.ids.has(messages[i].id)) appended.push(messages[i]);\n }\n\n if (stickToBottom && atBottomRef.current) {\n scrollLogToBottom();\n } else if (stickToBottom && appended.some((m) => isOwn(m, ownRoles))) {\n // The viewer's own send: show it, wherever they were reading.\n scrollLogToBottom();\n } else if (appended.length > 0) {\n setUnseen((n) => n + appended.length);\n }\n }\n }\n\n seenRef.current = { ids: new Set(ids), first, last, scrollHeight: el.scrollHeight, scrollTop: el.scrollTop };\n const nowAtBottom = measure(el);\n if (nowAtBottom !== atBottomRef.current || nowAtBottom) commitAtBottom(nowAtBottom);\n // ownRoles is compared by content inside; a new array each render must not re-run this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages, stickToBottom, measure, commitAtBottom, scrollLogToBottom]);\n\n // Content that grows without a messages change (images, fonts, a\n // ContentRenderer extension resolving) keeps a reader at the bottom there.\n useEffect(() => {\n const content = contentRef.current;\n if (!content || !stickToBottom || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => {\n if (atBottomRef.current) scrollLogToBottom();\n });\n ro.observe(content);\n return () => ro.disconnect();\n }, [stickToBottom, scrollLogToBottom]);\n\n const onScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n onScrollProp?.(e);\n if (seenRef.current) seenRef.current.scrollTop = e.currentTarget.scrollTop;\n const now = measure(e.currentTarget);\n if (now !== atBottomRef.current || now) commitAtBottom(now);\n },\n [measure, commitAtBottom, onScrollProp],\n );\n\n const jumpToLatest = useCallback(() => {\n onActivity?.({ type: \"jump-to-latest\", unseen });\n scrollLogToBottom();\n commitAtBottom(true);\n // The jump control is about to unmount; keep focus in the conversation\n // without scrolling anything (genie#1290).\n logRef.current?.focus({ preventScroll: true });\n }, [onActivity, unseen, scrollLogToBottom, commitAtBottom]);\n\n useImperativeHandle(\n ref,\n () => ({\n scrollToLatest() {\n scrollLogToBottom();\n const el = logRef.current;\n if (el) commitAtBottom(measure(el));\n },\n scrollToMessage(id: string) {\n const el = logRef.current;\n if (!el) return false;\n const target = [...el.querySelectorAll<HTMLElement>(\"[data-chat-message]\")].find(\n (n) => n.getAttribute(\"data-chat-message\") === id,\n );\n if (!target) return false;\n el.scrollTop = target.offsetTop;\n commitAtBottom(measure(el));\n return true;\n },\n get element() {\n return logRef.current;\n },\n }),\n [scrollLogToBottom, commitAtBottom, measure],\n );\n\n const showLoadEarlier = Boolean(onLoadEarlier) && (hasEarlier ?? true);\n const earlierBusy = loadingEarlier || loadBusy;\n const showJump = unseen > 0 && !atBottom;\n const groupWindow =\n groupConsecutive === true ? DEFAULT_GROUP_WINDOW_MS : typeof groupConsecutive === \"number\" ? groupConsecutive : 0;\n\n const items: ReactNode[] = [];\n let prevDay: string | undefined;\n messages.forEach((m, i) => {\n const date = toDate(m.createdAt);\n let separator: ReactNode = null;\n if (separators === \"day\" && date) {\n const key = dayKey(date);\n if (key !== prevDay) {\n separator = (\n <div\n data-chat-day-separator={key}\n className={cn(\"flex items-center gap-3 px-4 pt-4 text-xs\", TEXT_MUTED, classNames?.separator)}\n >\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n <span>{formatDay(date)}</span>\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n </div>\n );\n prevDay = key;\n }\n }\n const grouped = groupWindow > 0 && !separator && continuesGroup(messages[i - 1], m, groupWindow);\n\n items.push(\n <Fragment key={m.id}>\n {separator}\n <ChatMessage\n message={m}\n grouped={grouped}\n actions={renderActions?.(m)}\n ownRoles={ownRoles}\n streaming={streaming}\n contentOptions={contentOptions}\n labels={labelsProp}\n formatTime={formatTime}\n renderAttachment={renderAttachment}\n onProposalAccept={onProposalAccept}\n onProposalReject={onProposalReject}\n onActivity={onActivity}\n onActionError={onActionError}\n classNames={classNames}\n />\n </Fragment>,\n );\n });\n\n const H = `h${headingLevel}` as \"h2\";\n\n return (\n <div\n data-react-fancy-chat-thread=\"\"\n {...rest}\n className={cn(\"flex min-h-0 flex-col\", className, classNames?.root)}\n >\n {heading !== undefined && heading !== null && (\n <H\n id={headingId}\n data-react-fancy-chat-thread-heading=\"\"\n className={cn(\"shrink-0 px-4 py-3 text-sm font-semibold\", classNames?.heading)}\n >\n {heading}\n </H>\n )}\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={logRef}\n data-react-fancy-chat-thread-log=\"\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n aria-label={heading ? undefined : labels.log}\n aria-labelledby={heading ? headingId : undefined}\n tabIndex={0}\n onScroll={onScroll}\n className={cn(\n \"relative min-h-0 flex-1 overflow-y-auto overscroll-contain focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[color:var(--fancy-focus,var(--color-blue-500))]\",\n classNames?.log,\n )}\n >\n <div ref={contentRef} className=\"flex flex-col pb-3\">\n {showLoadEarlier && (\n <div className=\"flex justify-center pt-3\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n data-react-fancy-chat-thread-load-earlier=\"\"\n disabled={earlierBusy}\n aria-busy={earlierBusy || undefined}\n onClick={() =>\n runLoad(() => {\n onActivity?.({ type: \"load-earlier\" });\n return onLoadEarlier!();\n }, { type: \"load-earlier\" })\n }\n >\n {earlierBusy ? labels.loadingEarlier : labels.loadEarlier}\n </Button>\n </div>\n )}\n {messages.length === 0 && empty !== undefined && (\n <div data-react-fancy-chat-thread-empty=\"\" className={cn(\"px-4 py-8 text-center text-sm\", TEXT_MUTED)}>\n {empty}\n </div>\n )}\n {items}\n </div>\n </div>\n {showJump && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-3 flex justify-center\">\n <Button\n type=\"button\"\n size=\"sm\"\n data-react-fancy-chat-thread-jump=\"\"\n data-unseen={unseen}\n iconTrailing=\"chevron-down\"\n className={cn(\"pointer-events-auto shadow-md\", classNames?.jump)}\n onClick={jumpToLatest}\n >\n {labels.newMessages(unseen)}\n </Button>\n </div>\n )}\n </div>\n {composer !== undefined && composer !== null && (\n <div data-react-fancy-chat-thread-composer=\"\" className={cn(\"shrink-0\", classNames?.composer)}>\n {composer}\n </div>\n )}\n </div>\n );\n}\n\nChatThread.displayName = \"ChatThread\";\n"]}
1
+ {"version":3,"sources":["../src/components/ChatThread/chat-utils.ts","../src/components/ChatThread/ChatMessage.tsx","../src/components/ChatThread/ChatThread.tsx"],"names":["useState","useRef","useEffect","useCallback","sanitizeComponentHref","jsxs","cn","jsx","Badge","Button","ContentRenderer","Fragment","Avatar","TEXT_MUTED","BORDER","useLayoutEffect","useId","useImperativeHandle"],"mappings":"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","file":"chunk-2G6TIX5Q.cjs","sourcesContent":["import type { ChatMessageData, ChatThreadLabels } from \"./ChatThread.types\";\n\nexport const DEFAULT_LABELS: ChatThreadLabels = {\n log: \"Conversation\",\n loadEarlier: \"Load earlier messages\",\n loadingEarlier: \"Loading earlier messages...\",\n newMessages: (n) => (n === 1 ? \"1 new message\" : `${n} new messages`),\n internal: \"Internal note\",\n pending: \"Sending...\",\n failed: \"Not sent\",\n proposal: \"Proposed\",\n accept: \"Accept\",\n reject: \"Reject\",\n accepted: \"Accepted\",\n rejected: \"Rejected\",\n withdrawn: \"Withdrawn\",\n attachments: \"Attachments\",\n roles: {\n user: \"You\",\n assistant: \"Assistant\",\n system: \"System\",\n agent: \"Agent\",\n staff: \"Staff\",\n customer: \"Customer\",\n },\n};\n\nexport function mergeLabels(labels?: Partial<ChatThreadLabels>): ChatThreadLabels {\n if (!labels) return DEFAULT_LABELS;\n return {\n ...DEFAULT_LABELS,\n ...labels,\n roles: { ...DEFAULT_LABELS.roles, ...labels.roles },\n };\n}\n\n/** `null` for a missing or unparseable time: no time renders rather than \"Invalid Date\". */\nexport function toDate(value: string | number | undefined): Date | null {\n if (value === undefined || value === null || value === \"\") return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\n/** Local calendar day, `YYYY-MM-DD`. */\nexport function dayKey(d: Date): string {\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\nexport function defaultFormatTime(d: Date): string {\n return d.toLocaleTimeString(undefined, { hour: \"2-digit\", minute: \"2-digit\" });\n}\n\nexport function defaultFormatDay(d: Date): string {\n return d.toLocaleDateString(undefined, { dateStyle: \"medium\" });\n}\n\nexport function roleLabel(role: string, labels: ChatThreadLabels): string {\n const known = labels.roles[role];\n if (known) return known;\n return role ? role.charAt(0).toUpperCase() + role.slice(1) : \"\";\n}\n\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n const first = parts[0][0] ?? \"\";\n const last = parts.length > 1 ? (parts[parts.length - 1][0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n}\n\nexport function isOwn(message: ChatMessageData, ownRoles: string[]): boolean {\n return message.own ?? ownRoles.includes(message.role);\n}\n\nexport const DEFAULT_GROUP_WINDOW_MS = 5 * 60 * 1000;\n\n/** Does `curr` continue `prev`'s group? Same role, same author, same visibility, within the window. */\nexport function continuesGroup(\n prev: ChatMessageData | undefined,\n curr: ChatMessageData,\n windowMs: number,\n): boolean {\n if (!prev) return false;\n if (prev.role !== curr.role) return false;\n if ((prev.author?.name ?? \"\") !== (curr.author?.name ?? \"\")) return false;\n if ((prev.visibility ?? \"public\") !== (curr.visibility ?? \"public\")) return false;\n if (prev.proposal || curr.proposal) return false;\n if (curr.role === \"system\") return false;\n const a = toDate(prev.createdAt);\n const b = toDate(curr.createdAt);\n if (!a || !b) return false;\n const gap = b.getTime() - a.getTime();\n return gap >= 0 && gap <= windowMs;\n}\n\nexport function formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeComponentHref } from \"../../utils/sanitize\";\nimport { Avatar } from \"../Avatar\";\nimport { Badge } from \"../Badge\";\nimport { Button } from \"../Button\";\nimport { ContentRenderer } from \"../ContentRenderer\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatMessageData,\n ChatMessageProps,\n ChatThreadActionContext,\n ChatThreadLabels,\n} from \"./ChatThread.types\";\nimport {\n defaultFormatTime,\n formatBytes,\n initials,\n isOwn,\n mergeLabels,\n roleLabel,\n toDate,\n} from \"./chat-utils\";\n\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\nconst SURFACE =\n \"bg-[color:var(--fancy-surface,var(--color-white))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\nconst SURFACE_MUTED =\n \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\";\nconst TEXT =\n \"text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\";\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\n\n/**\n * Run a host callback that may return a Promise. While it is pending the\n * control is busy and a second run is refused. A rejection goes to\n * `onActionError`, or is left unhandled so it still reaches the console.\n *\n * @internal shared by ChatMessage (proposal decisions) and ChatThread (load earlier)\n */\nexport function useAcknowledgedAction(\n onActionError?: (error: unknown, action: ChatThreadActionContext) => void,\n): [busy: boolean, run: (fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => void] {\n const [busy, setBusy] = useState(false);\n const busyRef = useRef(false);\n const mounted = useRef(true);\n const onErrorRef = useRef(onActionError);\n onErrorRef.current = onActionError;\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const run = useCallback((fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => {\n if (busyRef.current) return;\n const result = fn();\n if (!result || typeof (result as Promise<unknown>).then !== \"function\") return;\n\n busyRef.current = true;\n setBusy(true);\n const settle = () => {\n busyRef.current = false;\n if (mounted.current) setBusy(false);\n };\n void Promise.resolve(result).then(settle, (error: unknown) => {\n settle();\n const onError = onErrorRef.current;\n if (onError) onError(error, ctx);\n else throw error;\n });\n }, []);\n\n return [busy, run];\n}\n\nfunction AttachmentItem({\n attachment,\n message,\n renderAttachment,\n}: {\n attachment: ChatAttachment;\n message: ChatMessageData;\n renderAttachment?: ChatMessageProps[\"renderAttachment\"];\n}) {\n let body: ReactNode;\n if (renderAttachment) {\n body = renderAttachment(attachment, message);\n } else {\n const href = sanitizeComponentHref(\"ChatMessage\", attachment.url);\n const size = typeof attachment.size === \"number\" ? (\n <span className={cn(\"ml-1\", TEXT_MUTED)}>({formatBytes(attachment.size)})</span>\n ) : null;\n body = href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2 break-all\">\n {attachment.name}\n {size}\n </a>\n ) : (\n <span className=\"break-all\">\n {attachment.name}\n {size}\n </span>\n );\n }\n\n return (\n <li data-chat-attachment={attachment.id} className=\"text-sm\">\n {body}\n </li>\n );\n}\n\nfunction ProposalFooter({\n message,\n labels,\n busy,\n onAccept,\n onReject,\n}: {\n message: ChatMessageData;\n labels: ChatThreadLabels;\n busy: boolean;\n onAccept?: () => void;\n onReject?: () => void;\n}) {\n const proposal = message.proposal!;\n const state = proposal.state ?? \"pending\";\n\n if (state !== \"pending\") {\n const text = state === \"accepted\" ? labels.accepted : state === \"rejected\" ? labels.rejected : labels.withdrawn;\n const color = state === \"accepted\" ? \"emerald\" : state === \"rejected\" ? \"red\" : \"zinc\";\n return (\n <div className=\"mt-2\">\n <Badge color={color} variant=\"soft\" size=\"sm\" data-chat-proposal-status={state}>\n {text}\n </Badge>\n </div>\n );\n }\n\n if (!onAccept && !onReject) return null;\n\n return (\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {onAccept && (\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"emerald\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"accept\"\n onClick={onAccept}\n >\n {proposal.acceptLabel ?? labels.accept}\n </Button>\n )}\n {onReject && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"reject\"\n onClick={onReject}\n >\n {proposal.rejectLabel ?? labels.reject}\n </Button>\n )}\n </div>\n );\n}\n\n/**\n * ChatMessage — one message of a `ChatThread`, usable on its own.\n *\n * Content is markdown through `ContentRenderer`, always sanitised (there is no\n * `unsafe` here on purpose: message bodies are text the host did not author).\n * `format: \"text\"` renders it literally. A message with a `proposal` is an\n * approval card: the host owns its state and decides it through\n * `onProposalAccept` / `onProposalReject`; the card never acts on its own.\n */\nexport function ChatMessage({\n message,\n actions,\n grouped = false,\n className,\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime = defaultFormatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n classNames,\n}: ChatMessageProps) {\n const labels = mergeLabels(labelsProp);\n const [busy, run] = useAcknowledgedAction(onActionError);\n\n const status = message.status ?? \"sent\";\n const visibility = message.visibility ?? \"public\";\n const internal = visibility === \"internal\";\n const own = isOwn(message, ownRoles);\n const system = message.role === \"system\";\n const proposal = message.proposal;\n const date = toDate(message.createdAt);\n // Always a name: the author's, else the role's (\"Assistant\", or the host's own role capitalised).\n const name = message.author?.name || roleLabel(message.role, labels);\n\n const decide = (kind: \"accept\" | \"reject\") => {\n if (!proposal) return;\n const cb = kind === \"accept\" ? onProposalAccept : onProposalReject;\n if (!cb) return;\n const ctx: ChatThreadActionContext = {\n type: kind === \"accept\" ? \"proposal-accept\" : \"proposal-reject\",\n messageId: message.id,\n proposalId: proposal.id,\n };\n run(() => {\n onActivity?.(ctx);\n return cb(message);\n }, ctx);\n };\n\n const body =\n message.format === \"text\" ? (\n <div data-chat-content=\"\" className=\"whitespace-pre-wrap break-words\">\n {message.content}\n </div>\n ) : (\n <div data-chat-content=\"\" className=\"min-w-0 break-words\">\n <ContentRenderer\n {...contentOptions}\n value={message.content}\n format=\"markdown\"\n streaming={status === \"streaming\" ? streaming : false}\n />\n </div>\n );\n\n const attachments =\n message.attachments && message.attachments.length > 0 ? (\n <ul data-chat-attachments=\"\" aria-label={labels.attachments} className=\"mt-2 flex flex-col gap-1\">\n {message.attachments.map((a) => (\n <AttachmentItem key={a.id} attachment={a} message={message} renderAttachment={renderAttachment} />\n ))}\n </ul>\n ) : null;\n\n const statusText =\n status === \"pending\" ? (\n <div data-chat-status-text=\"pending\" className={cn(\"mt-1 text-xs\", TEXT_MUTED)}>\n {labels.pending}\n </div>\n ) : status === \"failed\" ? (\n <div data-chat-status-text=\"failed\" className=\"mt-1 text-xs text-red-600 dark:text-red-400\">\n {labels.failed}\n </div>\n ) : null;\n\n const actionsSlot =\n actions !== undefined && actions !== null && actions !== false ? (\n <div data-chat-message-actions=\"\" className={cn(\"mt-1 flex flex-wrap items-center gap-1\", classNames?.actions)}>\n {actions}\n </div>\n ) : null;\n\n const rootAttrs = {\n \"data-chat-message\": message.id,\n \"data-chat-role\": message.role,\n \"data-chat-status\": status,\n \"data-chat-visibility\": visibility,\n \"data-chat-own\": own ? \"\" : undefined,\n \"data-chat-grouped\": grouped ? \"\" : undefined,\n \"aria-busy\": status === \"streaming\" ? true : undefined,\n };\n\n if (system && !proposal) {\n return (\n <article\n {...rootAttrs}\n className={cn(\"flex flex-col items-center px-4 py-1 text-center text-xs\", TEXT_MUTED, className, classNames?.message)}\n >\n {internal && (\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n )}\n <div className={cn(\"max-w-prose\", classNames?.bubble)}>{body}</div>\n {attachments}\n {actionsSlot}\n </article>\n );\n }\n\n const bubbleClass = cn(\n \"rounded-2xl px-3.5 py-2.5 text-sm\",\n TEXT,\n internal\n ? \"border border-dashed border-amber-400 bg-amber-50 dark:border-amber-500/60 dark:bg-amber-950/30\"\n : proposal\n ? cn(\"border-2 border-violet-300 dark:border-violet-500/60\", SURFACE)\n : own\n ? cn(\"border\", BORDER, SURFACE)\n : SURFACE_MUTED,\n status === \"failed\" && \"ring-1 ring-red-400/70\",\n classNames?.bubble,\n proposal && classNames?.proposal,\n );\n\n const bubbleInner = (\n <>\n {internal && (\n <div className=\"mb-1.5\">\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n </div>\n )}\n {proposal && (\n <div data-chat-proposal-header=\"\" className=\"mb-1.5 flex flex-wrap items-center gap-2\">\n <Badge color=\"violet\" variant=\"soft\" size=\"sm\">\n {labels.proposal}\n </Badge>\n {proposal.title && <span className=\"font-medium\">{proposal.title}</span>}\n </div>\n )}\n {body}\n {attachments}\n {proposal && (\n <ProposalFooter\n message={message}\n labels={labels}\n busy={busy}\n onAccept={onProposalAccept ? () => decide(\"accept\") : undefined}\n onReject={onProposalReject ? () => decide(\"reject\") : undefined}\n />\n )}\n </>\n );\n\n return (\n <article\n {...rootAttrs}\n className={cn(\n \"flex gap-2.5 px-3\",\n grouped ? \"pt-0.5\" : \"pt-3\",\n own && \"flex-row-reverse\",\n className,\n classNames?.message,\n )}\n >\n <div className=\"w-8 shrink-0\" aria-hidden={grouped || undefined}>\n {!grouped && (\n <Avatar size=\"sm\" src={message.author?.avatar} alt=\"\" fallback={initials(name)} />\n )}\n </div>\n <div className={cn(\"flex min-w-0 max-w-[85%] flex-col\", own ? \"items-end\" : \"items-start\")}>\n {!grouped && (\n <div\n data-chat-header=\"\"\n className={cn(\"mb-1 flex items-baseline gap-2 text-xs\", own && \"flex-row-reverse\", classNames?.header)}\n >\n <span data-chat-author=\"\" className={cn(\"font-medium\", TEXT)}>\n {name}\n </span>\n {date && (\n <time dateTime={date.toISOString()} className={TEXT_MUTED}>\n {formatTime(date)}\n </time>\n )}\n </div>\n )}\n {proposal ? (\n <div\n data-chat-proposal={proposal.id}\n data-chat-proposal-state={proposal.state ?? \"pending\"}\n aria-busy={busy || undefined}\n className={cn(\"min-w-0 max-w-full\", bubbleClass)}\n >\n {bubbleInner}\n </div>\n ) : (\n <div data-chat-bubble=\"\" className={cn(\"min-w-0 max-w-full\", bubbleClass)}>\n {bubbleInner}\n </div>\n )}\n {statusText}\n {actionsSlot}\n </div>\n </article>\n );\n}\n\nChatMessage.displayName = \"ChatMessage\";\n","import {\n Fragment,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n type UIEvent,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button\";\nimport { ChatMessage, useAcknowledgedAction } from \"./ChatMessage\";\nimport type { ChatMessageData, ChatThreadProps } from \"./ChatThread.types\";\nimport {\n DEFAULT_GROUP_WINDOW_MS,\n continuesGroup,\n dayKey,\n defaultFormatDay,\n isOwn,\n mergeLabels,\n toDate,\n} from \"./chat-utils\";\n\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\n\n// The isomorphic layout effect: scroll work must happen before paint in the\n// browser, and must not warn during SSR.\nconst useIsoLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\ninterface Seen {\n ids: Set<string>;\n first?: string;\n last?: string;\n scrollHeight: number;\n /** The reader's position as of the last render or scroll event, before any browser adjustment. */\n scrollTop: number;\n}\n\n/**\n * ChatThread — a controlled message list for agent and support conversations.\n *\n * - **Controlled.** It renders exactly `messages`, oldest first. Loading\n * earlier history and deciding a proposal go through callbacks; nothing is\n * held internally that an agent would need to read or write.\n * - **Stick to the bottom without yanking.** New messages are followed only\n * while the reader is at the bottom. A reader who scrolled up stays put and\n * gets an \"N new messages\" jump control. Prepended history keeps the\n * reader's place. Only the log's own `scrollTop` is ever set, and focus moves\n * with `preventScroll`, so no ancestor (or the page) scrolls (the 5.69 rule).\n * - **Visibility is the host's.** `visibility: \"internal\"` is labelled and\n * styled, never filtered: pass only what the viewer may see.\n * - **Handles:** `data-react-fancy-chat-thread`, `data-chat-message=\"<id>\"`,\n * `data-chat-role`, `data-chat-status`, `data-chat-visibility`,\n * `data-chat-proposal=\"<id>\"`, `data-chat-proposal-action`.\n * - **Observable:** `onActivity` reports every interaction as one stream.\n *\n * Pair it with `Composer` or `PromptInput` in the `composer` slot (both have\n * acknowledged send). It does not ship an input of its own.\n */\nexport function ChatThread({\n ref,\n messages,\n heading,\n headingLevel = 2,\n onLoadEarlier,\n hasEarlier,\n loadingEarlier = false,\n stickToBottom = true,\n bottomThreshold = 48,\n onAtBottomChange,\n separators = \"none\",\n formatDay = defaultFormatDay,\n groupConsecutive = false,\n renderActions,\n composer,\n empty,\n classNames,\n className,\n // message display\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n onScroll: onScrollProp,\n ...rest\n}: ChatThreadProps) {\n const labels = mergeLabels(labelsProp);\n const headingId = useId();\n const logRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const atBottomRef = useRef(true);\n const seenRef = useRef<Seen | null>(null);\n const [atBottom, setAtBottom] = useState(true);\n const [unseen, setUnseen] = useState(0);\n const [loadBusy, runLoad] = useAcknowledgedAction(onActionError);\n\n const onAtBottomChangeRef = useRef(onAtBottomChange);\n onAtBottomChangeRef.current = onAtBottomChange;\n\n const measure = useCallback(\n (el: HTMLElement) => el.scrollHeight - el.scrollTop - el.clientHeight <= bottomThreshold,\n [bottomThreshold],\n );\n\n const commitAtBottom = useCallback((value: boolean) => {\n const changed = atBottomRef.current !== value;\n atBottomRef.current = value;\n setAtBottom(value);\n if (value) setUnseen(0);\n if (changed) onAtBottomChangeRef.current?.(value);\n }, []);\n\n const scrollLogToBottom = useCallback(() => {\n const el = logRef.current;\n if (!el) return;\n // The log's own scrollTop only. Never scrollIntoView: that scrolls every\n // scrollable ancestor too, up to the page.\n el.scrollTop = el.scrollHeight;\n }, []);\n\n // Follow, hold, or keep place, every time the messages change.\n useIsoLayoutEffect(() => {\n const el = logRef.current;\n if (!el) return;\n\n const ids = messages.map((m) => m.id);\n const first = ids[0];\n const last = ids[ids.length - 1];\n const prev = seenRef.current;\n\n if (!prev) {\n if (stickToBottom) scrollLogToBottom();\n } else {\n const prepended =\n prev.last !== undefined &&\n prev.last === last &&\n prev.first !== undefined &&\n prev.first !== first &&\n ids.includes(prev.first);\n\n if (prepended) {\n if (stickToBottom && atBottomRef.current) scrollLogToBottom();\n // From the position BEFORE the change, never the current one: the\n // browser's scroll anchoring (overflow-anchor) may already have moved\n // scrollTop by the inserted height, and adding it again overshoots.\n else el.scrollTop = prev.scrollTop + (el.scrollHeight - prev.scrollHeight);\n } else {\n const lastIndex = prev.last === undefined ? -1 : ids.indexOf(prev.last);\n const appended: ChatMessageData[] = [];\n for (let i = lastIndex + 1; i < messages.length; i++) {\n if (!prev.ids.has(messages[i].id)) appended.push(messages[i]);\n }\n\n if (stickToBottom && atBottomRef.current) {\n scrollLogToBottom();\n } else if (stickToBottom && appended.some((m) => isOwn(m, ownRoles))) {\n // The viewer's own send: show it, wherever they were reading.\n scrollLogToBottom();\n } else if (appended.length > 0) {\n setUnseen((n) => n + appended.length);\n }\n }\n }\n\n seenRef.current = { ids: new Set(ids), first, last, scrollHeight: el.scrollHeight, scrollTop: el.scrollTop };\n const nowAtBottom = measure(el);\n if (nowAtBottom !== atBottomRef.current || nowAtBottom) commitAtBottom(nowAtBottom);\n // ownRoles is compared by content inside; a new array each render must not re-run this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages, stickToBottom, measure, commitAtBottom, scrollLogToBottom]);\n\n // Content that grows without a messages change (images, fonts, a\n // ContentRenderer extension resolving) keeps a reader at the bottom there.\n useEffect(() => {\n const content = contentRef.current;\n if (!content || !stickToBottom || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => {\n if (atBottomRef.current) scrollLogToBottom();\n });\n ro.observe(content);\n return () => ro.disconnect();\n }, [stickToBottom, scrollLogToBottom]);\n\n const onScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n onScrollProp?.(e);\n if (seenRef.current) seenRef.current.scrollTop = e.currentTarget.scrollTop;\n const now = measure(e.currentTarget);\n if (now !== atBottomRef.current || now) commitAtBottom(now);\n },\n [measure, commitAtBottom, onScrollProp],\n );\n\n const jumpToLatest = useCallback(() => {\n onActivity?.({ type: \"jump-to-latest\", unseen });\n scrollLogToBottom();\n commitAtBottom(true);\n // The jump control is about to unmount; keep focus in the conversation\n // without scrolling anything (genie#1290).\n logRef.current?.focus({ preventScroll: true });\n }, [onActivity, unseen, scrollLogToBottom, commitAtBottom]);\n\n useImperativeHandle(\n ref,\n () => ({\n scrollToLatest() {\n scrollLogToBottom();\n const el = logRef.current;\n if (el) commitAtBottom(measure(el));\n },\n scrollToMessage(id: string) {\n const el = logRef.current;\n if (!el) return false;\n const target = [...el.querySelectorAll<HTMLElement>(\"[data-chat-message]\")].find(\n (n) => n.getAttribute(\"data-chat-message\") === id,\n );\n if (!target) return false;\n el.scrollTop = target.offsetTop;\n commitAtBottom(measure(el));\n return true;\n },\n get element() {\n return logRef.current;\n },\n }),\n [scrollLogToBottom, commitAtBottom, measure],\n );\n\n const showLoadEarlier = Boolean(onLoadEarlier) && (hasEarlier ?? true);\n const earlierBusy = loadingEarlier || loadBusy;\n const showJump = unseen > 0 && !atBottom;\n const groupWindow =\n groupConsecutive === true ? DEFAULT_GROUP_WINDOW_MS : typeof groupConsecutive === \"number\" ? groupConsecutive : 0;\n\n const items: ReactNode[] = [];\n let prevDay: string | undefined;\n messages.forEach((m, i) => {\n const date = toDate(m.createdAt);\n let separator: ReactNode = null;\n if (separators === \"day\" && date) {\n const key = dayKey(date);\n if (key !== prevDay) {\n separator = (\n <div\n data-chat-day-separator={key}\n className={cn(\"flex items-center gap-3 px-4 pt-4 text-xs\", TEXT_MUTED, classNames?.separator)}\n >\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n <span>{formatDay(date)}</span>\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n </div>\n );\n prevDay = key;\n }\n }\n const grouped = groupWindow > 0 && !separator && continuesGroup(messages[i - 1], m, groupWindow);\n\n items.push(\n <Fragment key={m.id}>\n {separator}\n <ChatMessage\n message={m}\n grouped={grouped}\n actions={renderActions?.(m)}\n ownRoles={ownRoles}\n streaming={streaming}\n contentOptions={contentOptions}\n labels={labelsProp}\n formatTime={formatTime}\n renderAttachment={renderAttachment}\n onProposalAccept={onProposalAccept}\n onProposalReject={onProposalReject}\n onActivity={onActivity}\n onActionError={onActionError}\n classNames={classNames}\n />\n </Fragment>,\n );\n });\n\n const H = `h${headingLevel}` as \"h2\";\n\n return (\n <div\n data-react-fancy-chat-thread=\"\"\n {...rest}\n className={cn(\"flex min-h-0 flex-col\", className, classNames?.root)}\n >\n {heading !== undefined && heading !== null && (\n <H\n id={headingId}\n data-react-fancy-chat-thread-heading=\"\"\n className={cn(\"shrink-0 px-4 py-3 text-sm font-semibold\", classNames?.heading)}\n >\n {heading}\n </H>\n )}\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={logRef}\n data-react-fancy-chat-thread-log=\"\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n aria-label={heading ? undefined : labels.log}\n aria-labelledby={heading ? headingId : undefined}\n tabIndex={0}\n onScroll={onScroll}\n className={cn(\n \"relative min-h-0 flex-1 overflow-y-auto overscroll-contain focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[color:var(--fancy-focus,var(--color-blue-500))]\",\n classNames?.log,\n )}\n >\n <div ref={contentRef} className=\"flex flex-col pb-3\">\n {showLoadEarlier && (\n <div className=\"flex justify-center pt-3\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n data-react-fancy-chat-thread-load-earlier=\"\"\n disabled={earlierBusy}\n aria-busy={earlierBusy || undefined}\n onClick={() =>\n runLoad(() => {\n onActivity?.({ type: \"load-earlier\" });\n return onLoadEarlier!();\n }, { type: \"load-earlier\" })\n }\n >\n {earlierBusy ? labels.loadingEarlier : labels.loadEarlier}\n </Button>\n </div>\n )}\n {messages.length === 0 && empty !== undefined && (\n <div data-react-fancy-chat-thread-empty=\"\" className={cn(\"px-4 py-8 text-center text-sm\", TEXT_MUTED)}>\n {empty}\n </div>\n )}\n {items}\n </div>\n </div>\n {showJump && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-3 flex justify-center\">\n <Button\n type=\"button\"\n size=\"sm\"\n data-react-fancy-chat-thread-jump=\"\"\n data-unseen={unseen}\n iconTrailing=\"chevron-down\"\n className={cn(\"pointer-events-auto shadow-md\", classNames?.jump)}\n onClick={jumpToLatest}\n >\n {labels.newMessages(unseen)}\n </Button>\n </div>\n )}\n </div>\n {composer !== undefined && composer !== null && (\n <div data-react-fancy-chat-thread-composer=\"\" className={cn(\"shrink-0\", classNames?.composer)}>\n {composer}\n </div>\n )}\n </div>\n );\n}\n\nChatThread.displayName = \"ChatThread\";\n"]}
@@ -1,4 +1,4 @@
1
- import { Select } from './chunk-XIA2UAVO.js';
1
+ import { Select } from './chunk-6GVOW3UL.js';
2
2
  import { Switch } from './chunk-DXZCKDYS.js';
3
3
  import { DatePicker } from './chunk-2UTN3EFK.js';
4
4
  import { Input } from './chunk-PJNUGSKI.js';
@@ -7,8 +7,8 @@ import { DisplayValue } from './chunk-WX5XYDVN.js';
7
7
  import { resolveOption } from './chunk-USWQAMI3.js';
8
8
  import { Text } from './chunk-XM3V3RSU.js';
9
9
  import { ColorPicker } from './chunk-SVSQXKFL.js';
10
- import { useInlineEdit } from './chunk-OL53XYHF.js';
11
10
  import { isImeComposing } from './chunk-S42OGG43.js';
11
+ import { useInlineEdit } from './chunk-OL53XYHF.js';
12
12
  import { Badge } from './chunk-OZ4QFJ7N.js';
13
13
  import { Button } from './chunk-4GPH7HOR.js';
14
14
  import { Callout } from './chunk-KPRSRWNM.js';
@@ -1338,5 +1338,5 @@ function buildItems({
1338
1338
  }
1339
1339
 
1340
1340
  export { JSON_FIELD_TYPES, JsonEditor, applyJsonEdit, describeEdit, findJsonConflicts, getAtPath, inferType, parseKeyMap, parsePath, pathToString, resolveKeyRule, typeMatches };
1341
- //# sourceMappingURL=chunk-TH4JZAMK.js.map
1342
- //# sourceMappingURL=chunk-TH4JZAMK.js.map
1341
+ //# sourceMappingURL=chunk-5TP642UT.js.map
1342
+ //# sourceMappingURL=chunk-5TP642UT.js.map