@djangocfg/ui-tools 2.1.390 → 2.1.394

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 (184) hide show
  1. package/README.md +7 -10
  2. package/dist/chunk-PAWJFY3S.mjs +6 -0
  3. package/dist/{chunk-N2XQF2OL.mjs.map → chunk-PAWJFY3S.mjs.map} +1 -1
  4. package/dist/chunk-PK6SKIKE.cjs +8 -0
  5. package/dist/{chunk-OLISEQHS.cjs.map → chunk-PK6SKIKE.cjs.map} +1 -1
  6. package/dist/file-icon/index.cjs +6 -6
  7. package/dist/file-icon/index.d.cts +1 -1
  8. package/dist/file-icon/index.d.ts +1 -1
  9. package/dist/file-icon/index.mjs +1 -1
  10. package/dist/tree/index.cjs +1372 -143
  11. package/dist/tree/index.cjs.map +1 -1
  12. package/dist/tree/index.d.cts +2 -2
  13. package/dist/tree/index.d.ts +2 -2
  14. package/dist/tree/index.mjs +1322 -3
  15. package/dist/tree/index.mjs.map +1 -1
  16. package/dist/{types-CevSbyfD.d.cts → types-B_zhyAqR.d.cts} +1 -1
  17. package/dist/{types-CevSbyfD.d.ts → types-B_zhyAqR.d.ts} +1 -1
  18. package/package.json +6 -14
  19. package/src/tools/AudioPlayer/README.md +4 -4
  20. package/src/tools/Chat/README.md +6 -6
  21. package/src/tools/CronScheduler/index.tsx +1 -1
  22. package/src/tools/CronScheduler/lazy.tsx +1 -1
  23. package/src/tools/ImageViewer/README.md +1 -1
  24. package/src/tools/JsonForm/README.md +2 -2
  25. package/src/tools/MarkdownEditor/README.md +3 -3
  26. package/src/tools/MarkdownMessage/README.md +2 -2
  27. package/src/tools/OpenapiViewer/components/DocsLayout/grouping.ts +5 -1
  28. package/src/tools/PrettyCode/lazy.tsx +6 -0
  29. package/src/tools/SpeechRecognition/README.md +1 -1
  30. package/dist/ChatRoot-EFNXQXXN.cjs +0 -15
  31. package/dist/ChatRoot-EFNXQXXN.cjs.map +0 -1
  32. package/dist/ChatRoot-FITF5RVP.mjs +0 -6
  33. package/dist/ChatRoot-FITF5RVP.mjs.map +0 -1
  34. package/dist/ChatRoot-PNNGQCYF.css +0 -7
  35. package/dist/ChatRoot-PNNGQCYF.css.map +0 -1
  36. package/dist/CronScheduler.client-DLMXCPAJ.mjs +0 -67
  37. package/dist/CronScheduler.client-DLMXCPAJ.mjs.map +0 -1
  38. package/dist/CronScheduler.client-WEJF4PWQ.cjs +0 -72
  39. package/dist/CronScheduler.client-WEJF4PWQ.cjs.map +0 -1
  40. package/dist/DictationField-AS2F33WI.cjs +0 -13
  41. package/dist/DictationField-AS2F33WI.cjs.map +0 -1
  42. package/dist/DictationField-WPONUCYE.mjs +0 -4
  43. package/dist/DictationField-WPONUCYE.mjs.map +0 -1
  44. package/dist/DocsLayout-EKASBSP7.mjs +0 -3448
  45. package/dist/DocsLayout-EKASBSP7.mjs.map +0 -1
  46. package/dist/DocsLayout-MBFIB4NO.css +0 -7
  47. package/dist/DocsLayout-MBFIB4NO.css.map +0 -1
  48. package/dist/DocsLayout-OURFYWQE.cjs +0 -3455
  49. package/dist/DocsLayout-OURFYWQE.cjs.map +0 -1
  50. package/dist/JsonSchemaForm-DD7CLRIG.cjs +0 -13
  51. package/dist/JsonSchemaForm-DD7CLRIG.cjs.map +0 -1
  52. package/dist/JsonSchemaForm-XKUIVELK.mjs +0 -4
  53. package/dist/JsonSchemaForm-XKUIVELK.mjs.map +0 -1
  54. package/dist/JsonTree-43PQAJKY.mjs +0 -5
  55. package/dist/JsonTree-43PQAJKY.mjs.map +0 -1
  56. package/dist/JsonTree-MLET23ZA.css +0 -7
  57. package/dist/JsonTree-MLET23ZA.css.map +0 -1
  58. package/dist/JsonTree-X6W5YEVY.cjs +0 -11
  59. package/dist/JsonTree-X6W5YEVY.cjs.map +0 -1
  60. package/dist/LottiePlayer.client-2S7ISJ2S.cjs +0 -168
  61. package/dist/LottiePlayer.client-2S7ISJ2S.cjs.map +0 -1
  62. package/dist/LottiePlayer.client-5LDSSJWS.mjs +0 -161
  63. package/dist/LottiePlayer.client-5LDSSJWS.mjs.map +0 -1
  64. package/dist/MapContainer-AKIPABJK.mjs +0 -4
  65. package/dist/MapContainer-AKIPABJK.mjs.map +0 -1
  66. package/dist/MapContainer-STVDMC36.cjs +0 -17
  67. package/dist/MapContainer-STVDMC36.cjs.map +0 -1
  68. package/dist/Mermaid.client-DDXWXZXY.css +0 -7
  69. package/dist/Mermaid.client-DDXWXZXY.css.map +0 -1
  70. package/dist/Mermaid.client-NL4SVR7F.mjs +0 -481
  71. package/dist/Mermaid.client-NL4SVR7F.mjs.map +0 -1
  72. package/dist/Mermaid.client-NNTI6DFX.cjs +0 -487
  73. package/dist/Mermaid.client-NNTI6DFX.cjs.map +0 -1
  74. package/dist/Player-BRV7XTWR.mjs +0 -4
  75. package/dist/Player-BRV7XTWR.mjs.map +0 -1
  76. package/dist/Player-PM7F7DD7.cjs +0 -13
  77. package/dist/Player-PM7F7DD7.cjs.map +0 -1
  78. package/dist/Player-ZGQKKOWI.css +0 -66
  79. package/dist/Player-ZGQKKOWI.css.map +0 -1
  80. package/dist/PrettyCode.client-GWFAIVFN.css +0 -7
  81. package/dist/PrettyCode.client-GWFAIVFN.css.map +0 -1
  82. package/dist/PrettyCode.client-KOHDVPPN.cjs +0 -285
  83. package/dist/PrettyCode.client-KOHDVPPN.cjs.map +0 -1
  84. package/dist/PrettyCode.client-ZGYGKE7G.mjs +0 -283
  85. package/dist/PrettyCode.client-ZGYGKE7G.mjs.map +0 -1
  86. package/dist/TreeRoot-5COOOSWG.mjs +0 -4
  87. package/dist/TreeRoot-5COOOSWG.mjs.map +0 -1
  88. package/dist/TreeRoot-AABP2J6Y.cjs +0 -19
  89. package/dist/TreeRoot-AABP2J6Y.cjs.map +0 -1
  90. package/dist/chunk-2NG4SXEP.mjs +0 -743
  91. package/dist/chunk-2NG4SXEP.mjs.map +0 -1
  92. package/dist/chunk-4LFB7I5K.cjs +0 -1387
  93. package/dist/chunk-4LFB7I5K.cjs.map +0 -1
  94. package/dist/chunk-5D2OCOPQ.cjs +0 -222
  95. package/dist/chunk-5D2OCOPQ.cjs.map +0 -1
  96. package/dist/chunk-5I5QNGUG.cjs +0 -611
  97. package/dist/chunk-5I5QNGUG.cjs.map +0 -1
  98. package/dist/chunk-6ZX2G25W.mjs +0 -1361
  99. package/dist/chunk-6ZX2G25W.mjs.map +0 -1
  100. package/dist/chunk-76NNDZH6.cjs +0 -1061
  101. package/dist/chunk-76NNDZH6.cjs.map +0 -1
  102. package/dist/chunk-7CWGZPO3.mjs +0 -214
  103. package/dist/chunk-7CWGZPO3.mjs.map +0 -1
  104. package/dist/chunk-7EYHNP3E.cjs +0 -965
  105. package/dist/chunk-7EYHNP3E.cjs.map +0 -1
  106. package/dist/chunk-7IYXZUJO.cjs +0 -769
  107. package/dist/chunk-7IYXZUJO.cjs.map +0 -1
  108. package/dist/chunk-ADEN3UA4.cjs +0 -892
  109. package/dist/chunk-ADEN3UA4.cjs.map +0 -1
  110. package/dist/chunk-B6IR5KSC.mjs +0 -59
  111. package/dist/chunk-B6IR5KSC.mjs.map +0 -1
  112. package/dist/chunk-C6GXVH5J.mjs +0 -338
  113. package/dist/chunk-C6GXVH5J.mjs.map +0 -1
  114. package/dist/chunk-DMX7W4XZ.mjs +0 -1113
  115. package/dist/chunk-DMX7W4XZ.mjs.map +0 -1
  116. package/dist/chunk-ECONRHIG.mjs +0 -212
  117. package/dist/chunk-ECONRHIG.mjs.map +0 -1
  118. package/dist/chunk-FEN5S772.cjs +0 -1227
  119. package/dist/chunk-FEN5S772.cjs.map +0 -1
  120. package/dist/chunk-FP2RLYQZ.cjs +0 -187
  121. package/dist/chunk-FP2RLYQZ.cjs.map +0 -1
  122. package/dist/chunk-FVVF7VCD.cjs +0 -1325
  123. package/dist/chunk-FVVF7VCD.cjs.map +0 -1
  124. package/dist/chunk-GYIO7W7M.mjs +0 -1197
  125. package/dist/chunk-GYIO7W7M.mjs.map +0 -1
  126. package/dist/chunk-KNDLV4PI.cjs +0 -1356
  127. package/dist/chunk-KNDLV4PI.cjs.map +0 -1
  128. package/dist/chunk-KNEQRUBA.mjs +0 -181
  129. package/dist/chunk-KNEQRUBA.mjs.map +0 -1
  130. package/dist/chunk-N2XQF2OL.mjs +0 -14
  131. package/dist/chunk-N4MZYNR4.mjs +0 -1342
  132. package/dist/chunk-N4MZYNR4.mjs.map +0 -1
  133. package/dist/chunk-NTVBIIUD.mjs +0 -1439
  134. package/dist/chunk-NTVBIIUD.mjs.map +0 -1
  135. package/dist/chunk-OBRSGM64.mjs +0 -607
  136. package/dist/chunk-OBRSGM64.mjs.map +0 -1
  137. package/dist/chunk-ODO4GMW7.mjs +0 -79
  138. package/dist/chunk-ODO4GMW7.mjs.map +0 -1
  139. package/dist/chunk-OLISEQHS.cjs +0 -18
  140. package/dist/chunk-PVAX67JG.mjs +0 -1041
  141. package/dist/chunk-PVAX67JG.mjs.map +0 -1
  142. package/dist/chunk-QJ6GTUCO.cjs +0 -81
  143. package/dist/chunk-QJ6GTUCO.cjs.map +0 -1
  144. package/dist/chunk-T3MWM23F.cjs +0 -214
  145. package/dist/chunk-T3MWM23F.cjs.map +0 -1
  146. package/dist/chunk-TBSHZO5R.cjs +0 -1134
  147. package/dist/chunk-TBSHZO5R.cjs.map +0 -1
  148. package/dist/chunk-UNCS5V5F.mjs +0 -887
  149. package/dist/chunk-UNCS5V5F.mjs.map +0 -1
  150. package/dist/chunk-VWQ5WOIL.mjs +0 -2059
  151. package/dist/chunk-VWQ5WOIL.mjs.map +0 -1
  152. package/dist/chunk-W75B7Y6C.cjs +0 -1478
  153. package/dist/chunk-W75B7Y6C.cjs.map +0 -1
  154. package/dist/chunk-Y6UTOBF6.mjs +0 -938
  155. package/dist/chunk-Y6UTOBF6.mjs.map +0 -1
  156. package/dist/chunk-YDPDTOSP.cjs +0 -2061
  157. package/dist/chunk-YDPDTOSP.cjs.map +0 -1
  158. package/dist/chunk-YW5IVWHQ.cjs +0 -346
  159. package/dist/chunk-YW5IVWHQ.cjs.map +0 -1
  160. package/dist/chunk-YXZ6GU7H.cjs +0 -63
  161. package/dist/chunk-YXZ6GU7H.cjs.map +0 -1
  162. package/dist/chunk-ZL7FH4NW.mjs +0 -1274
  163. package/dist/chunk-ZL7FH4NW.mjs.map +0 -1
  164. package/dist/components-EHOGXATG.cjs +0 -22
  165. package/dist/components-EHOGXATG.cjs.map +0 -1
  166. package/dist/components-MQ6DR7TX.cjs +0 -26
  167. package/dist/components-MQ6DR7TX.cjs.map +0 -1
  168. package/dist/components-XRX7QGLB.mjs +0 -5
  169. package/dist/components-XRX7QGLB.mjs.map +0 -1
  170. package/dist/components-YATKRWLH.mjs +0 -5
  171. package/dist/components-YATKRWLH.mjs.map +0 -1
  172. package/dist/index.cjs +0 -3674
  173. package/dist/index.cjs.map +0 -1
  174. package/dist/index.css +0 -234
  175. package/dist/index.css.map +0 -1
  176. package/dist/index.d.cts +0 -4929
  177. package/dist/index.d.ts +0 -4929
  178. package/dist/index.mjs +0 -2912
  179. package/dist/index.mjs.map +0 -1
  180. package/dist/launcher-5Y42OBSN.mjs +0 -6
  181. package/dist/launcher-5Y42OBSN.mjs.map +0 -1
  182. package/dist/launcher-PMW2YB24.cjs +0 -59
  183. package/dist/launcher-PMW2YB24.cjs.map +0 -1
  184. package/src/index.ts +0 -157
@@ -1,769 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkOLISEQHS_cjs = require('./chunk-OLISEQHS.cjs');
4
- var React8 = require('react');
5
- require('@djangocfg/ui-core/styles/palette');
6
- var jsxRuntime = require('react/jsx-runtime');
7
- var ReactMarkdown = require('react-markdown');
8
- var rehypeExternalLinks = require('rehype-external-links');
9
- var rehypeRaw = require('rehype-raw');
10
- var rehypeSanitize = require('rehype-sanitize');
11
- var remarkBreaks = require('remark-breaks');
12
- var remarkEmoji = require('remark-emoji');
13
- var remarkGfm = require('remark-gfm');
14
- var remarkSmartypants = require('remark-smartypants');
15
- var components = require('@djangocfg/ui-core/components');
16
- var hooks = require('@djangocfg/ui-core/hooks');
17
-
18
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
19
-
20
- var React8__default = /*#__PURE__*/_interopDefault(React8);
21
- var ReactMarkdown__default = /*#__PURE__*/_interopDefault(ReactMarkdown);
22
- var rehypeExternalLinks__default = /*#__PURE__*/_interopDefault(rehypeExternalLinks);
23
- var rehypeRaw__default = /*#__PURE__*/_interopDefault(rehypeRaw);
24
- var rehypeSanitize__default = /*#__PURE__*/_interopDefault(rehypeSanitize);
25
- var remarkBreaks__default = /*#__PURE__*/_interopDefault(remarkBreaks);
26
- var remarkEmoji__default = /*#__PURE__*/_interopDefault(remarkEmoji);
27
- var remarkGfm__default = /*#__PURE__*/_interopDefault(remarkGfm);
28
- var remarkSmartypants__default = /*#__PURE__*/_interopDefault(remarkSmartypants);
29
-
30
- function smartTruncate(content, maxLength) {
31
- if (content.length <= maxLength) {
32
- return content;
33
- }
34
- let breakPoint = maxLength;
35
- while (breakPoint > maxLength - 50 && breakPoint > 0) {
36
- const char = content[breakPoint];
37
- if (char === " " || char === "\n" || char === " ") {
38
- break;
39
- }
40
- breakPoint--;
41
- }
42
- if (breakPoint <= maxLength - 50) {
43
- breakPoint = maxLength;
44
- }
45
- let truncated = content.slice(0, breakPoint).trimEnd();
46
- truncated = fixUnclosedMarkdown(truncated);
47
- return truncated;
48
- }
49
- chunkOLISEQHS_cjs.__name(smartTruncate, "smartTruncate");
50
- function truncateByLines(content, maxLines) {
51
- const lines = content.split("\n");
52
- if (lines.length <= maxLines) {
53
- return content;
54
- }
55
- let truncated = lines.slice(0, maxLines).join("\n").trimEnd();
56
- truncated = fixUnclosedMarkdown(truncated);
57
- return truncated;
58
- }
59
- chunkOLISEQHS_cjs.__name(truncateByLines, "truncateByLines");
60
- function fixUnclosedMarkdown(content) {
61
- let result = content;
62
- const countOccurrences = /* @__PURE__ */ chunkOLISEQHS_cjs.__name((str, marker) => {
63
- const escaped = marker.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
64
- const matches = str.match(new RegExp(escaped, "g"));
65
- return matches ? matches.length : 0;
66
- }, "countOccurrences");
67
- const boldCount = countOccurrences(result, "**");
68
- if (boldCount % 2 !== 0) {
69
- result += "**";
70
- }
71
- const withoutBold = result.replace(/\*\*/g, "");
72
- const italicCount = countOccurrences(withoutBold, "*");
73
- if (italicCount % 2 !== 0) {
74
- result += "*";
75
- }
76
- const codeCount = countOccurrences(result, "`");
77
- const tripleCount = countOccurrences(result, "```");
78
- const singleCodeCount = codeCount - tripleCount * 3;
79
- if (singleCodeCount % 2 !== 0) {
80
- result += "`";
81
- }
82
- if (tripleCount % 2 !== 0) {
83
- result += "\n```";
84
- }
85
- const strikeCount = countOccurrences(result, "~~");
86
- if (strikeCount % 2 !== 0) {
87
- result += "~~";
88
- }
89
- const underlineBoldCount = countOccurrences(result, "__");
90
- if (underlineBoldCount % 2 !== 0) {
91
- result += "__";
92
- }
93
- const withoutUnderlineBold = result.replace(/__/g, "");
94
- const underlineItalicCount = countOccurrences(withoutUnderlineBold, "_");
95
- if (underlineItalicCount % 2 !== 0) {
96
- result += "_";
97
- }
98
- return result;
99
- }
100
- chunkOLISEQHS_cjs.__name(fixUnclosedMarkdown, "fixUnclosedMarkdown");
101
- function useCollapsibleContent(content, options = {}) {
102
- const { maxLength, maxLines, defaultExpanded = false } = options;
103
- const [isCollapsed, setIsCollapsed] = React8.useState(!defaultExpanded);
104
- const originalLength = content.length;
105
- const originalLineCount = content.split("\n").length;
106
- const { shouldCollapse, truncatedContent } = React8.useMemo(() => {
107
- if (maxLength === void 0 && maxLines === void 0) {
108
- return { shouldCollapse: false, truncatedContent: content };
109
- }
110
- let needsCollapse = false;
111
- let result = content;
112
- if (maxLines !== void 0 && originalLineCount > maxLines) {
113
- needsCollapse = true;
114
- result = truncateByLines(result, maxLines);
115
- }
116
- if (maxLength !== void 0 && result.length > maxLength) {
117
- needsCollapse = true;
118
- result = smartTruncate(result, maxLength);
119
- }
120
- return { shouldCollapse: needsCollapse, truncatedContent: result };
121
- }, [content, maxLength, maxLines, originalLineCount]);
122
- const displayContent = React8.useMemo(() => {
123
- if (!shouldCollapse || !isCollapsed) {
124
- return content;
125
- }
126
- return truncatedContent;
127
- }, [content, truncatedContent, shouldCollapse, isCollapsed]);
128
- const toggleCollapsed = React8.useCallback(() => {
129
- setIsCollapsed((prev) => !prev);
130
- }, []);
131
- const setCollapsed = React8.useCallback((collapsed) => {
132
- setIsCollapsed(collapsed);
133
- }, []);
134
- return {
135
- isCollapsed,
136
- toggleCollapsed,
137
- setCollapsed,
138
- displayContent,
139
- shouldCollapse,
140
- originalLength,
141
- originalLineCount
142
- };
143
- }
144
- chunkOLISEQHS_cjs.__name(useCollapsibleContent, "useCollapsibleContent");
145
- function extractTextFromChildren(children) {
146
- if (typeof children === "string") return children;
147
- if (typeof children === "number") return String(children);
148
- if (React8__default.default.isValidElement(children)) {
149
- const props = children.props;
150
- return extractTextFromChildren(props.children);
151
- }
152
- if (Array.isArray(children)) {
153
- return children.map(extractTextFromChildren).join("");
154
- }
155
- return "";
156
- }
157
- chunkOLISEQHS_cjs.__name(extractTextFromChildren, "extractTextFromChildren");
158
- function looksLikePlainProse(text) {
159
- const trimmed = text.trim();
160
- if (trimmed.length === 0) return true;
161
- if (trimmed.length > 500) return false;
162
- if (/\n\s*\n/.test(trimmed)) return false;
163
- const newlineCount = (trimmed.match(/\n/g) || []).length;
164
- if (newlineCount > 4) return false;
165
- if (hasMarkdownSyntax(trimmed)) return false;
166
- return true;
167
- }
168
- chunkOLISEQHS_cjs.__name(looksLikePlainProse, "looksLikePlainProse");
169
- function hasMarkdownSyntax(text) {
170
- if (text.trim().includes("\n")) return true;
171
- if (/<\/?[a-zA-Z][a-zA-Z0-9-]*(\s[^>]*)?\/?>/.test(text)) return true;
172
- const patterns = [
173
- /^#{1,6}\s/m,
174
- // Headers
175
- /\*\*[^*]+\*\*/,
176
- // Bold
177
- /\*[^*]+\*/,
178
- // Italic
179
- /__[^_]+__/,
180
- // Bold (underscore)
181
- /_[^_]+_/,
182
- // Italic (underscore)
183
- /\[.+\]\(.+\)/,
184
- // Links
185
- /!\[.*\]\(.+\)/,
186
- // Images
187
- /```[\s\S]*```/,
188
- // Code blocks
189
- /`[^`]+`/,
190
- // Inline code
191
- /^\s*[-*+]\s/m,
192
- // Unordered lists
193
- /^\s*\d+\.\s/m,
194
- // Ordered lists
195
- /^\s*>/m,
196
- // Blockquotes
197
- /\|.+\|/,
198
- // Tables
199
- /^---+$/m,
200
- // Horizontal rules
201
- /~~[^~]+~~/
202
- // Strikethrough
203
- ];
204
- return patterns.some((p) => p.test(text));
205
- }
206
- chunkOLISEQHS_cjs.__name(hasMarkdownSyntax, "hasMarkdownSyntax");
207
- var MermaidClient = React8.lazy(() => import('./Mermaid.client-NNTI6DFX.cjs'));
208
- var LoadingFallback = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(() => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center items-center min-h-[100px]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "animate-spin rounded-full h-6 w-6 border-b-2 border-primary" }) }), "LoadingFallback");
209
- var Mermaid = /* @__PURE__ */ chunkOLISEQHS_cjs.__name((props) => {
210
- return /* @__PURE__ */ jsxRuntime.jsx(React8.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(LoadingFallback, {}), children: /* @__PURE__ */ jsxRuntime.jsx(MermaidClient, { ...props }) });
211
- }, "Mermaid");
212
- var Mermaid_default = Mermaid;
213
-
214
- // src/tools/Chat/styles/bubbleTokens.ts
215
- var BUBBLE_SURFACE = {
216
- /** User-authored bubble — solid brand color. */
217
- user: "bg-primary text-primary-foreground rounded-tr-md",
218
- /** Assistant bubble in normal state — neutral muted surface. */
219
- assistant: "bg-muted text-foreground rounded-tl-md",
220
- /** Assistant bubble when the turn failed — destructive tint. */
221
- error: "bg-destructive/10 text-destructive rounded-tl-md border border-destructive/30"
222
- };
223
- var ANCHOR = {
224
- user: "text-primary-foreground underline decoration-primary-foreground/60 underline-offset-2 hover:decoration-primary-foreground transition-colors break-all",
225
- assistant: "text-primary underline hover:text-primary/80 transition-colors break-all"
226
- };
227
- var TOGGLE = {
228
- user: "text-primary-foreground/80 hover:text-primary-foreground",
229
- assistant: "text-primary hover:text-primary/80"
230
- };
231
- var DESTRUCTIVE_SURFACE = {
232
- /** Banner / card variant: border + tint + text. */
233
- banner: "border border-destructive/40 bg-destructive/10 text-destructive",
234
- /** Subtle hover for destructive buttons inside the banner / menu. */
235
- hover: "hover:bg-destructive/15",
236
- /** Strong-hover variant (e.g. trash overlay on attachments). */
237
- hoverStrong: "hover:bg-destructive hover:text-destructive-foreground",
238
- /** Inline destructive text utility. */
239
- text: "text-destructive",
240
- /** Hover style for menu items that delete data. */
241
- menuItem: "text-destructive focus:text-destructive hover:bg-destructive/15 hover:text-destructive"
242
- };
243
- var TOOL_CALL = {
244
- errorText: "text-destructive"
245
- };
246
- var PrettyCodeClient = React8.lazy(() => import('./PrettyCode.client-KOHDVPPN.cjs'));
247
- var LoadingFallback2 = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(() => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
248
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20" }),
249
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Loading code..." })
250
- ] }) }) }), "LoadingFallback");
251
- var PrettyCode = /* @__PURE__ */ chunkOLISEQHS_cjs.__name((props) => {
252
- return /* @__PURE__ */ jsxRuntime.jsx(React8.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(LoadingFallback2, {}), children: /* @__PURE__ */ jsxRuntime.jsx(PrettyCodeClient, { ...props }) });
253
- }, "PrettyCode");
254
- var PrettyCode_default = PrettyCode;
255
- var HTML_SCHEMA_BASE = {
256
- ...rehypeSanitize.defaultSchema,
257
- tagNames: [
258
- ...rehypeSanitize.defaultSchema.tagNames ?? [],
259
- "br",
260
- "b",
261
- "i",
262
- "u",
263
- "s",
264
- "sub",
265
- "sup",
266
- "small",
267
- "mark",
268
- "kbd",
269
- "code",
270
- "pre",
271
- "details",
272
- "summary"
273
- ]
274
- };
275
- function buildSchema(extraProtocols) {
276
- if (!extraProtocols || extraProtocols.length === 0) return HTML_SCHEMA_BASE;
277
- const baseProtocols = HTML_SCHEMA_BASE.protocols ?? rehypeSanitize.defaultSchema.protocols ?? {};
278
- const baseHref = baseProtocols.href ?? ["http", "https", "mailto", "xmpp", "irc", "ircs"];
279
- return {
280
- ...HTML_SCHEMA_BASE,
281
- protocols: {
282
- ...baseProtocols,
283
- href: [...baseHref, ...extraProtocols]
284
- }
285
- };
286
- }
287
- chunkOLISEQHS_cjs.__name(buildSchema, "buildSchema");
288
- function buildUrlTransform(extraProtocols) {
289
- if (!extraProtocols || extraProtocols.length === 0) return void 0;
290
- const lower = extraProtocols.map((p) => p.toLowerCase() + ":");
291
- return (url) => {
292
- const u = url.trim().toLowerCase();
293
- for (const p of lower) {
294
- if (u.startsWith(p)) return url;
295
- }
296
- if (/^(https?:|mailto:|tel:|xmpp:|irc:|ircs:|#|\/|\.\/|\.\.\/|\?)/i.test(u) || /^[a-z0-9._~!$&'()*+,;=:@%-]+$/i.test(u)) {
297
- return url;
298
- }
299
- return "";
300
- };
301
- }
302
- chunkOLISEQHS_cjs.__name(buildUrlTransform, "buildUrlTransform");
303
- function CodeBlockRaw({ code, language }) {
304
- const theme = hooks.useResolvedTheme();
305
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-2", children: /* @__PURE__ */ jsxRuntime.jsx(
306
- PrettyCode_default,
307
- {
308
- data: code,
309
- language,
310
- className: "text-xs",
311
- customBg: "bg-code",
312
- mode: theme,
313
- isCompact: true,
314
- scrollIsolation: false
315
- }
316
- ) });
317
- }
318
- chunkOLISEQHS_cjs.__name(CodeBlockRaw, "CodeBlockRaw");
319
- var CodeBlock = React8.memo(CodeBlockRaw);
320
- function CodeBlockFallbackRaw({ code, isUser }) {
321
- const copyHoverClass = isUser ? "hover:bg-white/20 text-white" : "hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground";
322
- const copyButtonClass = `absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity h-8 w-8 ${copyHoverClass}`;
323
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative group my-3", children: [
324
- /* @__PURE__ */ jsxRuntime.jsx(
325
- components.CopyButton,
326
- {
327
- value: code,
328
- variant: "ghost",
329
- className: copyButtonClass,
330
- title: "Copy code"
331
- }
332
- ),
333
- /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "p-3 rounded text-xs font-mono overflow-x-auto bg-code text-code-foreground border border-code-border", children: /* @__PURE__ */ jsxRuntime.jsx("code", { children: code }) })
334
- ] });
335
- }
336
- chunkOLISEQHS_cjs.__name(CodeBlockFallbackRaw, "CodeBlockFallbackRaw");
337
- var CodeBlockFallback = React8.memo(CodeBlockFallbackRaw);
338
- function createMarkdownComponents(isUser = false, isCompact = false) {
339
- const textSize = isCompact ? "text-xs" : "text-sm";
340
- const headingBase = isCompact ? "text-sm" : "text-base";
341
- const headingSm = isCompact ? "text-xs" : "text-sm";
342
- return {
343
- h1: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("h1", { className: `${headingBase} font-semibold mb-2 mt-3 first:mt-0`, children }), "h1"),
344
- h2: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("h2", { className: `${headingSm} font-semibold mb-2 mt-3 first:mt-0`, children }), "h2"),
345
- h3: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("h3", { className: `${headingSm} font-semibold mb-1 mt-2 first:mt-0`, children }), "h3"),
346
- h4: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("h4", { className: `${headingSm} font-semibold mb-1 mt-2 first:mt-0`, children }), "h4"),
347
- h5: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("h5", { className: `${headingSm} font-medium mb-1 mt-2 first:mt-0`, children }), "h5"),
348
- h6: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("h6", { className: `${headingSm} font-medium mb-1 mt-2 first:mt-0`, children }), "h6"),
349
- p: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("p", { className: `${textSize} mb-4 last:mb-0 leading-relaxed break-words`, children }), "p"),
350
- ul: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("ul", { className: `list-disc list-inside mb-2 space-y-1 ${textSize}`, children }), "ul"),
351
- ol: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("ol", { className: `list-decimal list-inside mb-2 space-y-1 ${textSize}`, children }), "ol"),
352
- li: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "break-words", children }), "li"),
353
- // `target` / `rel` for external links are NOT set here — the
354
- // rehype-external-links plugin tags them on the rehype side, so
355
- // every `<a>` that sanitize let through gets the same security
356
- // treatment regardless of which renderer (default vs linkRules
357
- // override) emitted it. Doing it twice here would just duplicate
358
- // attributes; doing it only here would miss the linkRules path.
359
- a: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ href, children, ...rest }) => /* @__PURE__ */ jsxRuntime.jsx(
360
- "a",
361
- {
362
- ...rest,
363
- href,
364
- className: `${textSize} ${isUser ? ANCHOR.user : ANCHOR.assistant}`,
365
- children
366
- }
367
- ), "a"),
368
- pre: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => {
369
- let codeContent = "";
370
- let language = "plaintext";
371
- if (React8__default.default.isValidElement(children)) {
372
- const child = children;
373
- if (child.type === "code" || typeof child.type === "function" && child.type.name === "code") {
374
- const codeProps = child.props;
375
- const rawClassName = codeProps.className;
376
- language = rawClassName?.replace(/language-/, "").trim() || "plaintext";
377
- codeContent = extractTextFromChildren(codeProps.children).trim();
378
- } else {
379
- codeContent = extractTextFromChildren(children).trim();
380
- }
381
- } else {
382
- codeContent = extractTextFromChildren(children).trim();
383
- }
384
- if (!codeContent) {
385
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-3 p-3 bg-muted rounded text-sm text-muted-foreground", children: "No content available" });
386
- }
387
- if (language === "mermaid") {
388
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-3 w-full", children: /* @__PURE__ */ jsxRuntime.jsx(Mermaid_default, { chart: codeContent, isCompact }) });
389
- }
390
- try {
391
- return /* @__PURE__ */ jsxRuntime.jsx(CodeBlock, { code: codeContent, language, isUser, isCompact });
392
- } catch (error) {
393
- console.warn("CodeBlock failed, using fallback:", error);
394
- return /* @__PURE__ */ jsxRuntime.jsx(CodeBlockFallback, { code: codeContent, language, isUser, isCompact });
395
- }
396
- }, "pre"),
397
- code: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children, className }) => {
398
- if (className?.includes("language-")) {
399
- return /* @__PURE__ */ jsxRuntime.jsx("code", { className, children });
400
- }
401
- const inlineCodeClass = isUser ? "bg-primary-foreground/15 text-primary-foreground" : "bg-code-inline text-code-inline-foreground";
402
- return /* @__PURE__ */ jsxRuntime.jsx("code", { className: `px-1 py-0.5 rounded font-mono text-[0.875em] ${inlineCodeClass} break-all`, children: extractTextFromChildren(children) });
403
- }, "code"),
404
- // Modern chat convention drops italic on blockquotes — italic +
405
- // tight bubble = hard to read. Border-left at 2px (4px reads
406
- // heavy in a 320–480px bubble). On the saturated user bubble we
407
- // use a primary-foreground tint; on the assistant bubble we use
408
- // the muted-foreground role for de-emphasis.
409
- blockquote: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => {
410
- const cls = isUser ? "border-primary-foreground/40 text-primary-foreground/80" : "border-border text-muted-foreground";
411
- return /* @__PURE__ */ jsxRuntime.jsx("blockquote", { className: `${textSize} border-l-2 pl-3 my-3 break-words ${cls}`, children });
412
- }, "blockquote"),
413
- // Tables: outer wrapper handles overflow, inner `<table>`
414
- // inherits the chat-density text size. Borders / header use
415
- // semantic tokens — `border-code-border` for the assistant
416
- // (matches the code-fence panel for visual cohesion when both
417
- // appear in the same reply); primary-foreground/N for the user
418
- // bubble so lines read against the saturated `bg-primary`.
419
- table: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto my-3", children: /* @__PURE__ */ jsxRuntime.jsx("table", { className: `min-w-full ${textSize} border-collapse`, children }) }), "table"),
420
- thead: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("thead", { className: isUser ? "bg-primary-foreground/10" : "bg-muted/40", children }), "thead"),
421
- tbody: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("tbody", { children }), "tbody"),
422
- tr: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("tr", { className: isUser ? "border-b border-primary-foreground/15" : "border-b border-border", children }), "tr"),
423
- th: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => {
424
- const borderCls = isUser ? "border-primary-foreground/25" : "border-border";
425
- return /* @__PURE__ */ jsxRuntime.jsx("th", { className: `px-2 py-1.5 text-left font-semibold border-b ${borderCls} break-words`, children });
426
- }, "th"),
427
- td: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-2 py-1.5 break-words", children }), "td"),
428
- // Soft separator. ChatGPT / Slack / Linear strip the visible
429
- // line, Claude.ai keeps a hairline. We follow Claude — present
430
- // but quiet. Palette switches by role so the hairline reads on
431
- // both surfaces.
432
- hr: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(() => /* @__PURE__ */ jsxRuntime.jsx(
433
- "hr",
434
- {
435
- className: `my-4 border-0 h-px ${isUser ? "bg-primary-foreground/20" : "bg-border"}`
436
- }
437
- ), "hr"),
438
- strong: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("strong", { className: "font-semibold", children }), "strong"),
439
- em: /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({ children }) => /* @__PURE__ */ jsxRuntime.jsx("em", { className: "italic", children }), "em")
440
- };
441
- }
442
- chunkOLISEQHS_cjs.__name(createMarkdownComponents, "createMarkdownComponents");
443
- function CollapseToggleRaw({
444
- isCollapsed,
445
- onClick,
446
- readMoreLabel,
447
- showLessLabel,
448
- isUser,
449
- isCompact
450
- }) {
451
- const textSize = isCompact ? "text-xs" : "text-sm";
452
- return /* @__PURE__ */ jsxRuntime.jsx(
453
- "button",
454
- {
455
- type: "button",
456
- onClick,
457
- className: `
458
- ${textSize} font-medium cursor-pointer
459
- transition-colors duration-200
460
- ${isUser ? TOGGLE.user : TOGGLE.assistant}
461
- inline-flex items-center gap-1
462
- mt-1
463
- `,
464
- children: isCollapsed ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
465
- readMoreLabel,
466
- /* @__PURE__ */ jsxRuntime.jsx(Chevron, { direction: "down" })
467
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
468
- showLessLabel,
469
- /* @__PURE__ */ jsxRuntime.jsx(Chevron, { direction: "up" })
470
- ] })
471
- }
472
- );
473
- }
474
- chunkOLISEQHS_cjs.__name(CollapseToggleRaw, "CollapseToggleRaw");
475
- var Chevron = React8.memo(/* @__PURE__ */ chunkOLISEQHS_cjs.__name(function Chevron2({ direction }) {
476
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntime.jsx(
477
- "path",
478
- {
479
- strokeLinecap: "round",
480
- strokeLinejoin: "round",
481
- strokeWidth: 2,
482
- d: direction === "down" ? "M19 9l-7 7-7-7" : "M5 15l7-7 7 7"
483
- }
484
- ) });
485
- }, "Chevron"));
486
- var CollapseToggle = React8.memo(CollapseToggleRaw);
487
- function applyPreprocess(source, rules) {
488
- if (!rules || rules.length === 0) return source;
489
- let s = source;
490
- for (const rule of rules) {
491
- if (!rule.preprocess) continue;
492
- try {
493
- s = rule.preprocess(s);
494
- } catch (err) {
495
- console.warn(
496
- `[MarkdownMessage] linkRule "${rule.name ?? "(anonymous)"}" preprocess threw; skipping`,
497
- err
498
- );
499
- }
500
- }
501
- return s;
502
- }
503
- chunkOLISEQHS_cjs.__name(applyPreprocess, "applyPreprocess");
504
- function collectProtocols(extraHrefProtocols, rules) {
505
- const set = /* @__PURE__ */ new Set();
506
- if (extraHrefProtocols) for (const p of extraHrefProtocols) set.add(p);
507
- if (rules) {
508
- for (const r of rules) {
509
- if (r.protocols) for (const p of r.protocols) set.add(p);
510
- }
511
- }
512
- return set.size === 0 ? void 0 : Array.from(set);
513
- }
514
- chunkOLISEQHS_cjs.__name(collectProtocols, "collectProtocols");
515
- function buildLinkRulesComponent(rules, isUser, callerA) {
516
- const Renderer = /* @__PURE__ */ chunkOLISEQHS_cjs.__name((props) => {
517
- const { href, children } = props;
518
- if (typeof href === "string") {
519
- for (const rule of rules) {
520
- if (rule.match(href)) {
521
- return React8__default.default.createElement(
522
- React8__default.default.Fragment,
523
- null,
524
- rule.render({ href, children, isUser })
525
- );
526
- }
527
- }
528
- }
529
- if (callerA && typeof callerA === "function") {
530
- const Caller = callerA;
531
- return React8__default.default.createElement(Caller, props);
532
- }
533
- return React8__default.default.createElement("a", props, children);
534
- }, "Renderer");
535
- return Renderer;
536
- }
537
- chunkOLISEQHS_cjs.__name(buildLinkRulesComponent, "buildLinkRulesComponent");
538
- function MarkdownMessageRaw({
539
- content,
540
- className = "",
541
- isUser = false,
542
- isCompact = false,
543
- plainText,
544
- customComponents,
545
- extraHrefProtocols,
546
- linkRules,
547
- collapsible = false,
548
- maxLength,
549
- maxLines,
550
- readMoreLabel = "Read more...",
551
- showLessLabel = "Show less",
552
- defaultExpanded = false,
553
- onCollapseChange
554
- }) {
555
- const preprocessed = React8__default.default.useMemo(
556
- () => applyPreprocess(content, linkRules),
557
- [content, linkRules]
558
- );
559
- const effectiveProtocols = React8__default.default.useMemo(
560
- () => collectProtocols(extraHrefProtocols, linkRules),
561
- [extraHrefProtocols, linkRules]
562
- );
563
- const effectiveCustomComponents = React8__default.default.useMemo(() => {
564
- if (!linkRules || linkRules.length === 0) return customComponents;
565
- const callerA = customComponents?.a;
566
- const aRenderer = buildLinkRulesComponent(linkRules, isUser, callerA);
567
- return { ...customComponents ?? {}, a: aRenderer };
568
- }, [customComponents, linkRules, isUser]);
569
- const trimmedContent = preprocessed.trim();
570
- const collapsibleOptions = React8__default.default.useMemo(() => {
571
- if (!collapsible) return {};
572
- return {
573
- maxLength: maxLength ?? 1e3,
574
- maxLines: maxLines ?? 10,
575
- defaultExpanded
576
- };
577
- }, [collapsible, maxLength, maxLines, defaultExpanded]);
578
- const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } = useCollapsibleContent(trimmedContent, collapsible ? collapsibleOptions : {});
579
- React8__default.default.useEffect(() => {
580
- if (collapsible && shouldCollapse && onCollapseChange) {
581
- onCollapseChange(isCollapsed);
582
- }
583
- }, [isCollapsed, collapsible, shouldCollapse, onCollapseChange]);
584
- const components = React8__default.default.useMemo(() => {
585
- const base = createMarkdownComponents(isUser, isCompact);
586
- return effectiveCustomComponents ? { ...base, ...effectiveCustomComponents } : base;
587
- }, [isUser, isCompact, effectiveCustomComponents]);
588
- const schema = React8__default.default.useMemo(() => buildSchema(effectiveProtocols), [effectiveProtocols]);
589
- const urlTransform = React8__default.default.useMemo(
590
- () => buildUrlTransform(effectiveProtocols),
591
- [effectiveProtocols]
592
- );
593
- const textSizeClass = isCompact ? "text-xs" : "text-sm";
594
- const proseClass = isCompact ? "prose-xs" : "prose-sm";
595
- const customComponentsBeyondLinks = React8__default.default.useMemo(() => {
596
- if (!customComponents) return false;
597
- return Object.keys(customComponents).some((k) => k !== "a");
598
- }, [customComponents]);
599
- const isPlainText = plainText !== void 0 ? plainText : !customComponentsBeyondLinks && looksLikePlainProse(displayContent);
600
- if (isPlainText) {
601
- return /* @__PURE__ */ jsxRuntime.jsxs(
602
- "div",
603
- {
604
- className: `${textSizeClass} font-normal antialiased leading-snug break-words whitespace-pre-wrap ${className}`,
605
- children: [
606
- displayContent,
607
- collapsible && shouldCollapse && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
608
- isCollapsed && "... ",
609
- /* @__PURE__ */ jsxRuntime.jsx(
610
- CollapseToggle,
611
- {
612
- isCollapsed,
613
- onClick: toggleCollapsed,
614
- readMoreLabel,
615
- showLessLabel,
616
- isUser,
617
- isCompact
618
- }
619
- )
620
- ] })
621
- ]
622
- }
623
- );
624
- }
625
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
626
- /* @__PURE__ */ jsxRuntime.jsx(
627
- "div",
628
- {
629
- className: `
630
- prose ${proseClass} max-w-none break-words overflow-hidden ${textSizeClass} font-normal antialiased
631
- ${isUser ? "prose-invert" : "dark:prose-invert"}
632
- [&>*]:leading-relaxed
633
- [&>*:first-child]:mt-0 [&>*:last-child]:mb-0
634
- [&_p]:my-2
635
- [&_ul]:my-2 [&_ol]:my-2 [&_ul]:pl-5 [&_ol]:pl-5
636
- [&_li]:my-1 [&_li>p]:my-0
637
- [&_h1]:mt-4 [&_h1]:mb-2 [&_h1]:text-base [&_h1]:font-semibold
638
- [&_h2]:mt-3.5 [&_h2]:mb-1.5 [&_h2]:text-[15px] [&_h2]:font-semibold
639
- [&_h3]:mt-3 [&_h3]:mb-1 [&_h3]:text-sm [&_h3]:font-medium
640
- [&_h4]:mt-3 [&_h4]:mb-1 [&_h4]:text-sm [&_h4]:font-medium
641
- `,
642
- style: {
643
- // Inherit colors from parent — fixes issues with external
644
- // CSS variables overriding prose tokens.
645
- "--tw-prose-body": "inherit",
646
- "--tw-prose-headings": "inherit",
647
- "--tw-prose-bold": "inherit",
648
- "--tw-prose-links": "inherit",
649
- color: "inherit"
650
- },
651
- children: /* @__PURE__ */ jsxRuntime.jsx(
652
- ReactMarkdown__default.default,
653
- {
654
- remarkPlugins: [remarkGfm__default.default, remarkBreaks__default.default, remarkSmartypants__default.default, remarkEmoji__default.default],
655
- rehypePlugins: [
656
- rehypeRaw__default.default,
657
- [rehypeSanitize__default.default, schema],
658
- [rehypeExternalLinks__default.default, { target: "_blank", rel: ["noopener", "noreferrer"] }]
659
- ],
660
- components,
661
- urlTransform,
662
- children: displayContent
663
- }
664
- )
665
- }
666
- ),
667
- collapsible && shouldCollapse && /* @__PURE__ */ jsxRuntime.jsx(
668
- CollapseToggle,
669
- {
670
- isCollapsed,
671
- onClick: toggleCollapsed,
672
- readMoreLabel,
673
- showLessLabel,
674
- isUser,
675
- isCompact
676
- }
677
- )
678
- ] });
679
- }
680
- chunkOLISEQHS_cjs.__name(MarkdownMessageRaw, "MarkdownMessageRaw");
681
- var MarkdownMessage = React8.memo(MarkdownMessageRaw);
682
- var MarkdownMessage_default = MarkdownMessage;
683
- function ActionRowRaw({ value, isUser, visible }) {
684
- return /* @__PURE__ */ jsxRuntime.jsx(
685
- "div",
686
- {
687
- className: `flex ${isUser ? "justify-end" : "justify-start"}
688
- transition-opacity duration-150
689
- ${visible ? "opacity-100 pointer-events-auto" : "opacity-0 pointer-events-none"}`,
690
- children: /* @__PURE__ */ jsxRuntime.jsx(
691
- components.CopyButton,
692
- {
693
- value,
694
- size: "icon",
695
- variant: "ghost",
696
- iconClassName: "h-3.5 w-3.5",
697
- className: "h-7 w-7 text-muted-foreground hover:text-foreground",
698
- tabIndex: visible ? 0 : -1,
699
- "aria-hidden": !visible
700
- }
701
- )
702
- }
703
- );
704
- }
705
- chunkOLISEQHS_cjs.__name(ActionRowRaw, "ActionRowRaw");
706
- var ActionRow = React8.memo(ActionRowRaw);
707
- function ChatMessageRowRaw({
708
- isUser,
709
- children,
710
- actions,
711
- closeDelayMs = 250,
712
- className = ""
713
- }) {
714
- const isTouch = hooks.useMediaQuery("(hover: none), (pointer: coarse)");
715
- const [hovered, setHovered] = React8.useState(false);
716
- const closeTimer = React8.useRef(null);
717
- const cancelClose = React8.useCallback(() => {
718
- if (closeTimer.current) {
719
- clearTimeout(closeTimer.current);
720
- closeTimer.current = null;
721
- }
722
- }, []);
723
- const open = React8.useCallback(() => {
724
- cancelClose();
725
- setHovered(true);
726
- }, [cancelClose]);
727
- const scheduleClose = React8.useCallback(() => {
728
- cancelClose();
729
- closeTimer.current = setTimeout(() => setHovered(false), closeDelayMs);
730
- }, [cancelClose, closeDelayMs]);
731
- React8.useEffect(() => () => cancelClose(), [cancelClose]);
732
- const visible = isTouch || hovered;
733
- const rowPositionClass = isTouch ? "static mt-1" : "absolute top-full";
734
- const rowSideClass = isUser ? "right-0" : "left-0";
735
- return /* @__PURE__ */ jsxRuntime.jsxs(
736
- "div",
737
- {
738
- className: `relative flex flex-col ${isUser ? "items-end" : "items-start"} ${className}`,
739
- onPointerEnter: isTouch ? void 0 : open,
740
- onPointerLeave: isTouch ? void 0 : scheduleClose,
741
- onFocusCapture: open,
742
- onBlurCapture: (e) => {
743
- if (!e.currentTarget.contains(e.relatedTarget)) scheduleClose();
744
- },
745
- children: [
746
- children,
747
- actions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${rowPositionClass} ${rowSideClass}`, children: actions(visible, isUser) })
748
- ]
749
- }
750
- );
751
- }
752
- chunkOLISEQHS_cjs.__name(ChatMessageRowRaw, "ChatMessageRowRaw");
753
- var ChatMessageRow = React8.memo(ChatMessageRowRaw);
754
-
755
- exports.ANCHOR = ANCHOR;
756
- exports.ActionRow = ActionRow;
757
- exports.BUBBLE_SURFACE = BUBBLE_SURFACE;
758
- exports.ChatMessageRow = ChatMessageRow;
759
- exports.DESTRUCTIVE_SURFACE = DESTRUCTIVE_SURFACE;
760
- exports.MarkdownMessage = MarkdownMessage;
761
- exports.MarkdownMessage_default = MarkdownMessage_default;
762
- exports.Mermaid_default = Mermaid_default;
763
- exports.PrettyCode_default = PrettyCode_default;
764
- exports.TOGGLE = TOGGLE;
765
- exports.TOOL_CALL = TOOL_CALL;
766
- exports.extractTextFromChildren = extractTextFromChildren;
767
- exports.useCollapsibleContent = useCollapsibleContent;
768
- //# sourceMappingURL=chunk-7IYXZUJO.cjs.map
769
- //# sourceMappingURL=chunk-7IYXZUJO.cjs.map