@aleph-alpha/chat-kit 6.0.0 → 6.1.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 (164) hide show
  1. package/dist/{CkHistory.vue_vue_type_script_setup_true_lang-D9Ph9eYp.js → CkHistory.vue_vue_type_script_setup_true_lang-Cr8vF94e.js} +214 -107
  2. package/dist/apl-fqmucPXA.js +140 -0
  3. package/dist/asciiarmor-DucZyvP0.js +56 -0
  4. package/dist/asn1-BnOEsgAm.js +144 -0
  5. package/dist/asterisk-QAlztEwS.js +345 -0
  6. package/dist/brainfuck-DZVCuF_t.js +53 -0
  7. package/dist/chat-kit.css +1166 -1
  8. package/dist/clike-CTYGlS6x.js +799 -0
  9. package/dist/clojure-BhXMqnxz.js +849 -0
  10. package/dist/cmake-BGaNd9E7.js +71 -0
  11. package/dist/cobol-4yqQntpt.js +120 -0
  12. package/dist/coffeescript-D2dXvhEc.js +308 -0
  13. package/dist/commonlisp-CF_VNHQR.js +130 -0
  14. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.stories.d.ts +41 -0
  15. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.stories.d.ts.map +1 -0
  16. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.vue.d.ts +26 -0
  17. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.vue.d.ts.map +1 -0
  18. package/dist/components/base/CkMilkdownEditor/codeMirrorTheme.d.ts +20 -0
  19. package/dist/components/base/CkMilkdownEditor/codeMirrorTheme.d.ts.map +1 -0
  20. package/dist/components/base/CkMilkdownEditor/createCrepeEditor.d.ts +42 -0
  21. package/dist/components/base/CkMilkdownEditor/createCrepeEditor.d.ts.map +1 -0
  22. package/dist/components/base/CkMilkdownEditor/crepeIcons.d.ts +33 -0
  23. package/dist/components/base/CkMilkdownEditor/crepeIcons.d.ts.map +1 -0
  24. package/dist/components/base/CkMilkdownEditor/index.d.ts +3 -0
  25. package/dist/components/base/CkMilkdownEditor/index.d.ts.map +1 -0
  26. package/dist/components/base/CkMilkdownEditor/markdownClassAttrs.d.ts +16 -0
  27. package/dist/components/base/CkMilkdownEditor/markdownClassAttrs.d.ts.map +1 -0
  28. package/dist/components/base/CkMilkdownEditor/types.d.ts +98 -0
  29. package/dist/components/base/CkMilkdownEditor/types.d.ts.map +1 -0
  30. package/dist/components/base/index.d.ts +2 -0
  31. package/dist/components/base/index.d.ts.map +1 -1
  32. package/dist/components/index.d.ts +2 -2
  33. package/dist/components/index.d.ts.map +1 -1
  34. package/dist/components/index.js +12 -11
  35. package/dist/createCrepeEditor-CFbvSH3s.js +74141 -0
  36. package/dist/crystal-DyuLTqLs.js +398 -0
  37. package/dist/css-DkSyTW67.js +1772 -0
  38. package/dist/cypher-Dlu_3r4V.js +121 -0
  39. package/dist/d-UURgV0Ux.js +179 -0
  40. package/dist/diff-B_Bi2Crb.js +25 -0
  41. package/dist/dockerfile-Bvk733Ga.js +201 -0
  42. package/dist/dtd-Dy74G54E.js +114 -0
  43. package/dist/dylan-TSb-Nfix.js +314 -0
  44. package/dist/ebnf-4fKAGW3a.js +140 -0
  45. package/dist/ecl-B59qGGVg.js +178 -0
  46. package/dist/eiffel-Dze7nlu3.js +134 -0
  47. package/dist/elm-DG7jkhNZ.js +176 -0
  48. package/dist/erlang-BO6gOnGA.js +674 -0
  49. package/dist/factor-CMxFHDqz.js +65 -0
  50. package/dist/fcl-CDDUNjTj.js +141 -0
  51. package/dist/forth-B9D2JCeE.js +116 -0
  52. package/dist/fortran-CAG2BFbe.js +467 -0
  53. package/dist/gas-0Aw8zDr5.js +293 -0
  54. package/dist/gherkin-DhZlEZiy.js +115 -0
  55. package/dist/groovy-CpwJiBl7.js +223 -0
  56. package/dist/handlers/index.js +1 -1
  57. package/dist/handlers/useChatKitLabels.d.ts +27 -0
  58. package/dist/handlers/useChatKitLabels.d.ts.map +1 -1
  59. package/dist/haskell-ySd-OUo8.js +459 -0
  60. package/dist/haxe-7MlzfeYV.js +514 -0
  61. package/dist/http-BqypyemW.js +79 -0
  62. package/dist/idl-4HIGJlDI.js +985 -0
  63. package/dist/index-A5rWjRtZ.js +689 -0
  64. package/dist/index-B0ldhzaj.js +385 -0
  65. package/dist/index-BVOjyn3y.js +2490 -0
  66. package/dist/index-BWvkps_G.js +309 -0
  67. package/dist/index-BaS8OW8V.js +151 -0
  68. package/dist/index-BlHHEbV-.js +406 -0
  69. package/dist/index-BoqzHVNB.js +82 -0
  70. package/dist/index-C6zYjwIQ.js +704 -0
  71. package/dist/index-CMJGuXap.js +330 -0
  72. package/dist/index-CRfGWVdQ.js +116 -0
  73. package/dist/index-C_gTb50u.js +81 -0
  74. package/dist/index-DSU7cBGz.js +178 -0
  75. package/dist/index-DSq3gvqU.js +1767 -0
  76. package/dist/index-Da3777l2.js +289 -0
  77. package/dist/index-DdlzabmR.js +1021 -0
  78. package/dist/index-DhY_9bdS.js +61 -0
  79. package/dist/index-Dm6C1blN.js +1052 -0
  80. package/dist/index-Tj3pzx-E.js +327 -0
  81. package/dist/index-ZeRS5rER.js +97 -0
  82. package/dist/index-gzleljO6.js +157 -0
  83. package/dist/index-naWlQpaL.js +642 -0
  84. package/dist/index-sKO1lHHC.js +312 -0
  85. package/dist/index.d.ts +2 -2
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +14 -13
  88. package/dist/javascript-Bt8B7yTi.js +992 -0
  89. package/dist/julia-Bs6JJhYG.js +407 -0
  90. package/dist/livescript-DmzgM3Yt.js +296 -0
  91. package/dist/lua-Cvg8VrAA.js +256 -0
  92. package/dist/mathematica-DNLOL9PQ.js +110 -0
  93. package/dist/mbox-Ga7d4MMN.js +117 -0
  94. package/dist/mirc-Dma3B8rS.js +107 -0
  95. package/dist/mllike-DHn7xckP.js +334 -0
  96. package/dist/modelica-0d55jYY0.js +147 -0
  97. package/dist/mscgen-DdqZYINH.js +135 -0
  98. package/dist/mumps-Btr8VblO.js +93 -0
  99. package/dist/nginx-DTDtBDVN.js +141 -0
  100. package/dist/nsis-CyKBdPWp.js +62 -0
  101. package/dist/ntriples-CvgOYMpL.js +153 -0
  102. package/dist/octave-DYBj3-tl.js +200 -0
  103. package/dist/oz-R_e8WMIi.js +231 -0
  104. package/dist/pascal-GD8iposT.js +105 -0
  105. package/dist/perl-DL9mHpoi.js +1105 -0
  106. package/dist/pig-C_4T4YIV.js +101 -0
  107. package/dist/powershell-B0suO7Vd.js +328 -0
  108. package/dist/properties-BR-vP1aU.js +58 -0
  109. package/dist/protobuf-BxgpyhoW.js +77 -0
  110. package/dist/pug-vHnWR0UE.js +405 -0
  111. package/dist/puppet-Bdao66PW.js +137 -0
  112. package/dist/python-BFGRmuZ9.js +426 -0
  113. package/dist/q-CrbCVq4a.js +131 -0
  114. package/dist/r-V7nswm59.js +170 -0
  115. package/dist/rpm-C-DLY-If.js +109 -0
  116. package/dist/ruby-CQTpZw6f.js +331 -0
  117. package/dist/sas-D2UG-yhZ.js +207 -0
  118. package/dist/scheme-BKzrkGJD.js +222 -0
  119. package/dist/shell-BlsXDxCn.js +222 -0
  120. package/dist/sieve-CjwBwOY5.js +135 -0
  121. package/dist/simple-mode-DMneyfDu.js +130 -0
  122. package/dist/smalltalk-BOIGQuhN.js +121 -0
  123. package/dist/solr-CwD7U71z.js +69 -0
  124. package/dist/sparql-DYskk2vE.js +249 -0
  125. package/dist/spreadsheet-Bgtt3oLP.js +87 -0
  126. package/dist/sql-Cei9CMfk.js +342 -0
  127. package/dist/stex-C1nZSzAw.js +230 -0
  128. package/dist/stylus-BkS-boTH.js +565 -0
  129. package/dist/swift-FRZi1uvB.js +291 -0
  130. package/dist/tcl-CUcaCdmq.js +114 -0
  131. package/dist/textile-BnFpjsrl.js +414 -0
  132. package/dist/tiddlywiki-CjprD-Qp.js +218 -0
  133. package/dist/tiki-DK9DOeWn.js +268 -0
  134. package/dist/toml-BOuWGMcf.js +76 -0
  135. package/dist/troff-E1bJ0PPL.js +61 -0
  136. package/dist/ttcn-cfg-Dc39-fIP.js +133 -0
  137. package/dist/ttcn-tKd4HLu4.js +192 -0
  138. package/dist/turtle-Dq7-1WAf.js +124 -0
  139. package/dist/{useChatKitLabels-368lodS5.js → useChatKitLabels-Ww1Q7xUr.js} +25 -2
  140. package/dist/vb-Dp90gtsv.js +196 -0
  141. package/dist/vbscript-Bfn8O8I7.js +478 -0
  142. package/dist/velocity-BwIZK1TH.js +149 -0
  143. package/dist/verilog-CnT9bMk0.js +429 -0
  144. package/dist/vhdl-DCkMIyT9.js +158 -0
  145. package/dist/webidl-BTLTThCm.js +204 -0
  146. package/dist/xquery-BrBUuxMR.js +525 -0
  147. package/dist/yacas-b5lAVEIl.js +130 -0
  148. package/dist/z80-ClgwfNdB.js +92 -0
  149. package/package.json +10 -4
  150. package/src/components/base/CkMilkdownEditor/CkMilkdownEditor.spec.ts +221 -0
  151. package/src/components/base/CkMilkdownEditor/CkMilkdownEditor.stories.ts +274 -0
  152. package/src/components/base/CkMilkdownEditor/CkMilkdownEditor.vue +151 -0
  153. package/src/components/base/CkMilkdownEditor/codeMirrorTheme.ts +132 -0
  154. package/src/components/base/CkMilkdownEditor/createCrepeEditor.ts +192 -0
  155. package/src/components/base/CkMilkdownEditor/crepeIcons.ts +77 -0
  156. package/src/components/base/CkMilkdownEditor/index.ts +2 -0
  157. package/src/components/base/CkMilkdownEditor/markdownClassAttrs.ts +64 -0
  158. package/src/components/base/CkMilkdownEditor/milkdown-theme.css +441 -0
  159. package/src/components/base/CkMilkdownEditor/types.ts +100 -0
  160. package/src/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.stories.ts +2 -2
  161. package/src/components/base/index.ts +6 -0
  162. package/src/components/index.ts +4 -0
  163. package/src/handlers/useChatKitLabels.ts +27 -0
  164. package/src/index.ts +4 -0
@@ -0,0 +1,441 @@
1
+ /*
2
+ * Theme for CkMilkdownEditor.
3
+ *
4
+ * Crepe's colours, fonts and shadows are all CSS custom properties, so this
5
+ * file maps them to the design tokens ui-library emits on `:root` (oklch
6
+ * component triples, hence `oklch(var(--token))`). Because the tokens flip
7
+ * under `html.dark`, the accessible theme and the brand theme, the editor
8
+ * follows every theme without separate Crepe theme files.
9
+ *
10
+ * It also replaces Crepe's `reset.css`, which is not imported: that file
11
+ * styles headings, paragraphs, code, links and quotes with two-class selectors
12
+ * that would beat the utility classes `applyMarkdownClasses` puts on the nodes
13
+ * (the very classes CkMarkdownRenderer uses), forces a 60px/120px document
14
+ * padding and removes every focus outline.
15
+ *
16
+ * Selectors are written with at least the `.ck-milkdown .milkdown` prefix so
17
+ * they beat Crepe's own `.milkdown …` rules regardless of stylesheet order.
18
+ */
19
+
20
+ .ck-milkdown {
21
+ /* Crepe colour variables → design tokens */
22
+ --crepe-color-background: oklch(var(--background-surface-primary));
23
+ --crepe-color-on-background: oklch(var(--content-on-surface-primary));
24
+ --crepe-color-surface: oklch(var(--background-surface-floating));
25
+ --crepe-color-surface-low: oklch(var(--background-surface-muted));
26
+ --crepe-color-on-surface: oklch(var(--content-on-surface-primary));
27
+ --crepe-color-on-surface-variant: oklch(var(--content-on-surface-secondary));
28
+ /* "outline" drives icon colours and (mixed to 20%) hairline borders. */
29
+ --crepe-color-outline: oklch(var(--content-on-surface-secondary));
30
+ --crepe-color-primary: oklch(var(--content-on-surface-link));
31
+ --crepe-color-secondary: oklch(var(--background-accent-soft));
32
+ --crepe-color-on-secondary: oklch(var(--content-on-accent-soft));
33
+ --crepe-color-inverse: oklch(var(--content-on-surface-primary));
34
+ --crepe-color-on-inverse: oklch(var(--background-surface-primary));
35
+ --crepe-color-inline-code: oklch(var(--content-on-surface-primary));
36
+ --crepe-color-error: oklch(var(--border-input-error));
37
+ --crepe-color-hover: oklch(var(--overlay-hover-subtle));
38
+ --crepe-color-selected: oklch(var(--background-accent-soft));
39
+ --crepe-color-inline-area: oklch(var(--background-surface-muted-subtle));
40
+
41
+ --crepe-base-font-size: 1rem;
42
+ --crepe-font-default: var(--font-sans, inherit);
43
+ /* CkMarkdownRenderer headings use the body font, so the editor does too. */
44
+ --crepe-font-title: var(--font-sans, inherit);
45
+ --crepe-font-code:
46
+ ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono',
47
+ monospace;
48
+
49
+ --crepe-shadow-1: var(--shadow-md);
50
+ --crepe-shadow-2: var(--shadow-lg);
51
+
52
+ /* CodeMirror palette ≈ Shiki `github-light` (what UiCodeBlock renders). */
53
+ --ck-cm-bg: #ffffff;
54
+ --ck-cm-foreground: #24292f;
55
+ --ck-cm-keyword: #cf222e;
56
+ --ck-cm-string: #0a3069;
57
+ --ck-cm-comment: #6e7781;
58
+ --ck-cm-function: #8250df;
59
+ --ck-cm-constant: #0550ae;
60
+ /* UiCodeBlock rewrites Shiki's orange entity colour to the primary text token. */
61
+ --ck-cm-entity: oklch(var(--content-on-surface-primary));
62
+ --ck-cm-tag: #116329;
63
+ --ck-cm-error: #82071e;
64
+ --ck-cm-selection: oklch(var(--background-accent-soft));
65
+
66
+ position: relative;
67
+ }
68
+
69
+ /* CodeMirror palette ≈ Shiki `github-dark`. */
70
+ html.dark .ck-milkdown {
71
+ --ck-cm-bg: #24292e;
72
+ --ck-cm-foreground: #c9d1d9;
73
+ --ck-cm-keyword: #ff7b72;
74
+ --ck-cm-string: #a5d6ff;
75
+ --ck-cm-comment: #8b949e;
76
+ --ck-cm-function: #d2a8ff;
77
+ --ck-cm-constant: #79c0ff;
78
+ --ck-cm-tag: #7ee787;
79
+ --ck-cm-error: #ffa198;
80
+ }
81
+
82
+ /* ------------------------------------------------------------------------ */
83
+ /* Minimal reset (replaces Crepe's reset.css) */
84
+ /* ------------------------------------------------------------------------ */
85
+
86
+ .ck-milkdown .milkdown {
87
+ position: relative;
88
+ /* Inherit like CkMarkdownRenderer does: the parent sets font and colour. */
89
+ font: inherit;
90
+ color: inherit;
91
+ background: transparent;
92
+ }
93
+
94
+ .ck-milkdown .milkdown button,
95
+ .ck-milkdown .milkdown input {
96
+ margin: 0;
97
+ border: none;
98
+ background: none;
99
+ box-shadow: none;
100
+ font: inherit;
101
+ color: inherit;
102
+ }
103
+
104
+ .ck-milkdown .milkdown button:focus-visible,
105
+ .ck-milkdown .milkdown input:focus-visible,
106
+ .ck-milkdown .milkdown [role='option']:focus-visible {
107
+ outline: 2px solid oklch(var(--border-surface-focus-ring));
108
+ outline-offset: 1px;
109
+ }
110
+
111
+ .ck-milkdown .milkdown .milkdown-icon {
112
+ display: inline-flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ }
116
+
117
+ .ck-milkdown .milkdown .ProseMirror {
118
+ padding: 0;
119
+ min-height: 1lh;
120
+ outline: none;
121
+ }
122
+
123
+ .ck-milkdown .milkdown .ProseMirror .ProseMirror-selectednode {
124
+ outline: none;
125
+ background: color-mix(in srgb, var(--crepe-color-selected), transparent 60%);
126
+ }
127
+
128
+ .ck-milkdown .milkdown .ProseMirror img {
129
+ max-width: 100%;
130
+ vertical-align: bottom;
131
+ }
132
+
133
+ .ck-milkdown .milkdown .crepe-placeholder::before {
134
+ color: oklch(var(--content-on-surface-muted));
135
+ }
136
+
137
+ /* ------------------------------------------------------------------------ */
138
+ /* Lists — Crepe renders `li` through a node view with an SVG marker. */
139
+ /* Reproduce `li: 'my-0.5'` and hang the marker into the `ml-6` gutter the */
140
+ /* `ul`/`ol` classes create, so text starts where the renderer's text does. */
141
+ /* ------------------------------------------------------------------------ */
142
+
143
+ .ck-milkdown .milkdown .milkdown-list-item-block {
144
+ display: block;
145
+ margin: 0.125rem 0;
146
+ padding: 0;
147
+ }
148
+
149
+ .ck-milkdown .milkdown .milkdown-list-item-block > li.list-item {
150
+ display: flex;
151
+ align-items: flex-start;
152
+ gap: 0;
153
+ margin: 0;
154
+ padding: 0;
155
+ list-style: none;
156
+ }
157
+
158
+ .ck-milkdown .milkdown .milkdown-list-item-block li .label-wrapper {
159
+ flex: none;
160
+ display: flex;
161
+ align-items: center;
162
+ justify-content: flex-end;
163
+ box-sizing: border-box;
164
+ width: 1.5rem;
165
+ height: 1.75rem; /* = leading-7, the renderer's body line height */
166
+ margin-left: -1.5rem;
167
+ padding-right: 0.375rem;
168
+ color: inherit;
169
+ }
170
+
171
+ .ck-milkdown .milkdown .milkdown-list-item-block li .label-wrapper .label {
172
+ width: auto;
173
+ height: auto;
174
+ padding: 0;
175
+ font-variant-numeric: tabular-nums;
176
+ text-align: right;
177
+ }
178
+
179
+ .ck-milkdown .milkdown .milkdown-list-item-block li .label-wrapper svg {
180
+ width: 1.125rem;
181
+ height: 1.125rem;
182
+ color: inherit;
183
+ fill: none;
184
+ }
185
+
186
+ .ck-milkdown
187
+ .milkdown
188
+ .milkdown-list-item-block
189
+ li
190
+ .label-wrapper
191
+ svg.ck-icon--bullet {
192
+ width: 1.5rem;
193
+ height: 1.5rem;
194
+ fill: currentColor;
195
+ }
196
+
197
+ .ck-milkdown .milkdown .milkdown-list-item-block li .label-wrapper .checked,
198
+ .ck-milkdown .milkdown .milkdown-list-item-block li .label-wrapper .unchecked {
199
+ color: oklch(var(--content-on-surface-secondary));
200
+ }
201
+
202
+ /* Task-list boxes: about the size of the native checkbox the renderer shows. */
203
+ .ck-milkdown .milkdown .milkdown-list-item-block li .label-wrapper .checked svg,
204
+ .ck-milkdown
205
+ .milkdown
206
+ .milkdown-list-item-block
207
+ li
208
+ .label-wrapper
209
+ .unchecked
210
+ svg {
211
+ width: 0.875rem;
212
+ height: 0.875rem;
213
+ }
214
+
215
+ /* The disc marker sits closer to the text, like the browser's own `list-disc`. */
216
+ .ck-milkdown
217
+ .milkdown
218
+ .milkdown-list-item-block
219
+ li
220
+ .label-wrapper:has(.ck-icon--bullet) {
221
+ padding-right: 0;
222
+ }
223
+
224
+ .ck-milkdown .milkdown .milkdown-list-item-block > li.list-item > .children {
225
+ flex: 1;
226
+ min-width: 0;
227
+ }
228
+
229
+ /* Milkdown always wraps list-item text in <p>; remark only does so for loose
230
+ * lists. Zero the paragraph margin so tight lists match the renderer. */
231
+ .ck-milkdown .milkdown .milkdown-list-item-block > li.list-item > .children p {
232
+ margin-top: 0;
233
+ margin-bottom: 0;
234
+ }
235
+
236
+ /* ------------------------------------------------------------------------ */
237
+ /* Code blocks — mirror UiCodeBlock: rounded-lg border, muted header with */
238
+ /* the language label and an always-visible copy button, github palette. */
239
+ /* ------------------------------------------------------------------------ */
240
+
241
+ .ck-milkdown .milkdown .milkdown-code-block {
242
+ position: relative;
243
+ display: block;
244
+ margin: 0.5rem 0; /* = pre: 'my-2' */
245
+ padding: 0;
246
+ max-width: 100%;
247
+ overflow: hidden;
248
+ border: 1px solid oklch(var(--border-surface-default));
249
+ border-radius: 0.5rem;
250
+ background: var(--ck-cm-bg);
251
+ color: var(--ck-cm-foreground);
252
+ }
253
+
254
+ .ck-milkdown .milkdown .milkdown-code-block.selected {
255
+ outline: 2px solid oklch(var(--border-surface-focus-ring));
256
+ outline-offset: 1px;
257
+ }
258
+
259
+ .ck-milkdown .milkdown .milkdown-code-block .tools {
260
+ display: flex;
261
+ align-items: center;
262
+ justify-content: space-between;
263
+ gap: 0.5rem;
264
+ padding: 0.5rem 1rem;
265
+ border-bottom: 1px solid oklch(var(--border-surface-default));
266
+ background: oklch(var(--background-surface-muted));
267
+ }
268
+
269
+ .ck-milkdown .milkdown .milkdown-code-block .tools .language-button {
270
+ display: inline-flex;
271
+ align-items: center;
272
+ gap: 0.25rem;
273
+ margin: 0;
274
+ padding: 0.125rem 0.375rem;
275
+ border-radius: 0.375rem;
276
+ background: transparent;
277
+ opacity: 1;
278
+ font-family: var(--crepe-font-code);
279
+ font-size: 0.875rem;
280
+ font-weight: 400;
281
+ line-height: 1.25rem;
282
+ color: oklch(var(--content-on-surface-secondary));
283
+ cursor: pointer;
284
+ }
285
+
286
+ .ck-milkdown .milkdown .milkdown-code-block .tools .language-button:hover {
287
+ background: oklch(var(--overlay-hover-subtle));
288
+ }
289
+
290
+ .ck-milkdown
291
+ .milkdown
292
+ .milkdown-code-block
293
+ .tools
294
+ .language-button
295
+ .expand-icon
296
+ svg {
297
+ width: 0.875rem;
298
+ height: 0.875rem;
299
+ color: inherit;
300
+ }
301
+
302
+ .ck-milkdown .milkdown .milkdown-code-block .tools .tools-button-group {
303
+ display: flex;
304
+ gap: 0.25rem;
305
+ }
306
+
307
+ .ck-milkdown .milkdown .milkdown-code-block .tools .tools-button-group button {
308
+ display: inline-flex;
309
+ align-items: center;
310
+ justify-content: center;
311
+ gap: 0.25rem;
312
+ height: 1.75rem;
313
+ min-width: 1.75rem;
314
+ padding: 0 0.5rem;
315
+ border-radius: 0.375rem;
316
+ background: transparent;
317
+ opacity: 1;
318
+ font-family: var(--crepe-font-default);
319
+ font-size: 0.75rem;
320
+ font-weight: 500;
321
+ line-height: 1rem;
322
+ color: oklch(var(--content-on-surface-secondary));
323
+ cursor: pointer;
324
+ }
325
+
326
+ .ck-milkdown
327
+ .milkdown
328
+ .milkdown-code-block
329
+ .tools
330
+ .tools-button-group
331
+ button:first-child,
332
+ .ck-milkdown
333
+ .milkdown
334
+ .milkdown-code-block
335
+ .tools
336
+ .tools-button-group
337
+ button:last-child {
338
+ border-radius: 0.375rem;
339
+ }
340
+
341
+ .ck-milkdown
342
+ .milkdown
343
+ .milkdown-code-block
344
+ .tools
345
+ .tools-button-group
346
+ button:hover {
347
+ background: oklch(var(--overlay-hover-subtle));
348
+ }
349
+
350
+ .ck-milkdown
351
+ .milkdown
352
+ .milkdown-code-block
353
+ .tools
354
+ .tools-button-group
355
+ button
356
+ svg {
357
+ width: 0.875rem;
358
+ height: 0.875rem;
359
+ color: inherit;
360
+ fill: none;
361
+ }
362
+
363
+ /* Language picker dropdown: a floating surface like UiPopover. */
364
+ .ck-milkdown .milkdown .milkdown-code-block .list-wrapper {
365
+ border: 1px solid oklch(var(--border-surface-default));
366
+ border-radius: 0.5rem;
367
+ background: oklch(var(--background-surface-floating));
368
+ box-shadow: var(--shadow-md);
369
+ color: oklch(var(--content-on-surface-primary));
370
+ }
371
+
372
+ .ck-milkdown .milkdown .milkdown-code-block .search-box {
373
+ outline-color: oklch(var(--border-surface-default));
374
+ }
375
+
376
+ .ck-milkdown .milkdown .milkdown-code-block .search-box:has(input:focus) {
377
+ outline: 2px solid oklch(var(--border-surface-focus-ring));
378
+ }
379
+
380
+ .ck-milkdown .milkdown .milkdown-code-block .language-list-item {
381
+ font-weight: 400;
382
+ }
383
+
384
+ /* The CodeMirror surface. `EditorView.theme` emits single-class rules that
385
+ * lose to Crepe's `.milkdown .milkdown-code-block .cm-editor`, so repeat the
386
+ * palette here. */
387
+ .ck-milkdown .milkdown .milkdown-code-block .cm-editor {
388
+ background: var(--ck-cm-bg);
389
+ color: var(--ck-cm-foreground);
390
+ }
391
+
392
+ .ck-milkdown .milkdown .milkdown-code-block .cm-gutters {
393
+ display: none;
394
+ }
395
+
396
+ /* Shown while the CodeMirror instance is still mounting. */
397
+ .ck-milkdown .milkdown .milkdown-code-block .milkdown-code-block-placeholder {
398
+ margin: 0;
399
+ padding: 1rem;
400
+ font-family: var(--crepe-font-code);
401
+ font-size: 0.875rem;
402
+ line-height: 1.625;
403
+ }
404
+
405
+ /* ------------------------------------------------------------------------ */
406
+ /* Floating toolbar and link tooltip */
407
+ /* ------------------------------------------------------------------------ */
408
+
409
+ .ck-milkdown .milkdown .milkdown-toolbar,
410
+ .ck-milkdown .milkdown .milkdown-link-preview > .link-preview,
411
+ .ck-milkdown .milkdown .milkdown-link-edit > .link-edit {
412
+ border: 1px solid oklch(var(--border-surface-default));
413
+ color: oklch(var(--content-on-surface-primary));
414
+ }
415
+
416
+ .ck-milkdown .milkdown .milkdown-toolbar .toolbar-item svg {
417
+ width: 1.125rem;
418
+ height: 1.125rem;
419
+ fill: none;
420
+ }
421
+
422
+ .ck-milkdown .milkdown .milkdown-link-preview svg,
423
+ .ck-milkdown .milkdown .milkdown-link-edit svg {
424
+ fill: none;
425
+ }
426
+
427
+ .ck-milkdown .milkdown .milkdown-link-preview > .link-preview > .link-display {
428
+ color: oklch(var(--content-on-surface-link));
429
+ }
430
+
431
+ .ck-milkdown .milkdown .milkdown-link-edit > .link-edit > .input-area {
432
+ color: oklch(var(--content-on-surface-primary));
433
+ }
434
+
435
+ .ck-milkdown
436
+ .milkdown
437
+ .milkdown-link-edit
438
+ > .link-edit
439
+ > .input-area::placeholder {
440
+ color: oklch(var(--content-on-surface-muted));
441
+ }
@@ -0,0 +1,100 @@
1
+ import type { CkMarkdownElementClasses } from '../CkMarkdownRenderer';
2
+
3
+ /**
4
+ * Markdown WYSIWYG editor built on [Milkdown Crepe](https://milkdown.dev/docs/guide/using-crepe).
5
+ * Its content is styled with the very same per-tag class map that
6
+ * {@link CkMarkdownRenderer} uses, so a message edited here looks identical to
7
+ * the rendered reply — no visual jump between reading and editing.
8
+ *
9
+ * The feature set is deliberately small and chat-oriented: a floating toolbar
10
+ * (bold, italic, strikethrough, inline code, link), bullet / ordered / task
11
+ * lists, blockquotes, links with a hover tooltip, fenced code blocks with syntax
12
+ * highlighting and a copy button, and an empty-document placeholder. Tables,
13
+ * images, LaTeX, slash menus and drag handles are intentionally not enabled.
14
+ *
15
+ * The editor itself loads lazily on mount, so importing this component does not
16
+ * pull ProseMirror / CodeMirror into the consumer's initial bundle.
17
+ *
18
+ * @category Form Inputs
19
+ * @useCases edit an assistant reply before sending, compose a rich prompt, edit a saved note in markdown, inline WYSIWYG editing of a user message
20
+ * @keywords markdown, editor, wysiwyg, milkdown, crepe, prosemirror, rich text, v-model, compose
21
+ * @related CkMarkdownRenderer, CkPromptInput, CkEditableUserMessage
22
+ */
23
+ export interface CkMilkdownEditorProps {
24
+ /**
25
+ * Markdown source of the document. Supports `v-model`.
26
+ *
27
+ * Changes made in the editor are emitted through `update:modelValue` after
28
+ * Milkdown's ~200 ms debounce. External changes are applied by replacing the
29
+ * whole document; the editor may then emit the same content once in its
30
+ * normalised form (e.g. `*x*` becomes `_x_`).
31
+ *
32
+ * @default ''
33
+ */
34
+ modelValue?: string;
35
+ /**
36
+ * Text shown when the document is empty. Read once when the editor is
37
+ * created; later changes are ignored.
38
+ */
39
+ placeholder?: string;
40
+ /**
41
+ * Render the content without allowing edits. The floating toolbar is not
42
+ * shown and the caret is hidden.
43
+ *
44
+ * @default false
45
+ */
46
+ readonly?: boolean;
47
+ /**
48
+ * Like `readonly`, but also mutes the content and marks the editor as
49
+ * `aria-disabled`.
50
+ *
51
+ * @default false
52
+ */
53
+ disabled?: boolean;
54
+ /**
55
+ * Accessible name of the editable region (`role="textbox"`). Read once when
56
+ * the editor is created.
57
+ */
58
+ ariaLabel?: string;
59
+ /**
60
+ * Per-tag class overrides, merged over the same defaults
61
+ * {@link CkMarkdownRenderer} uses. Pass the same object to both components to
62
+ * keep them in sync.
63
+ *
64
+ * `li` and `pre` are rendered by Crepe's own node views and are styled by the
65
+ * editor stylesheet instead, so overrides for those two tags are ignored.
66
+ */
67
+ classes?: CkMarkdownElementClasses;
68
+ /**
69
+ * Move focus into the editor once it has been created.
70
+ *
71
+ * @default false
72
+ */
73
+ autofocus?: boolean;
74
+ }
75
+
76
+ /** Events emitted by {@link CkMilkdownEditor}. */
77
+ export interface CkMilkdownEditorEmits {
78
+ /**
79
+ * Emitted when the document changes. Debounced by Milkdown (~200 ms), so a
80
+ * consumer that submits on a key press should read the exposed
81
+ * `getMarkdown()` instead of relying on the last emitted value.
82
+ */
83
+ 'update:modelValue': [value: string];
84
+ /** Emitted when focus enters the editor (including its toolbar). */
85
+ focus: [];
86
+ /** Emitted when focus leaves the editor and its toolbar entirely. */
87
+ blur: [];
88
+ }
89
+
90
+ /** Methods exposed by {@link CkMilkdownEditor} through a template ref. */
91
+ export interface CkMilkdownEditorExposed {
92
+ /** Focus the editable region. No-op until the editor has been created. */
93
+ focus: () => void;
94
+ /**
95
+ * Serialise the current document to markdown synchronously, bypassing the
96
+ * `update:modelValue` debounce. Returns the `modelValue` prop until the
97
+ * editor has been created.
98
+ */
99
+ getMarkdown: () => string;
100
+ }
@@ -29,7 +29,7 @@ import { CkPromptInputDisclaimer } from '@aleph-alpha/chat-kit';
29
29
 
30
30
  <template>
31
31
  <CkPromptInputDisclaimer
32
- text="Assistant Chat may occasionally make mistakes. Please, make sure to double-check important information."
32
+ text="Chat is an AI system and can make mistakes. Verify answers before you act on them."
33
33
  />
34
34
  </template>`;
35
35
 
@@ -60,7 +60,7 @@ export const Default: Story = {
60
60
  components: { CkPromptInputDisclaimer },
61
61
  template: `
62
62
  <CkPromptInputDisclaimer
63
- text="Assistant Chat may occasionally make mistakes. Please, make sure to double-check important information."
63
+ text="Chat is an AI system and can make mistakes. Verify answers before you act on them."
64
64
  />
65
65
  `,
66
66
  }),
@@ -80,3 +80,9 @@ export type {
80
80
  CkEditableUserMessageEmits,
81
81
  CkEditableUserMessageProps,
82
82
  } from './CkEditableUserMessage';
83
+ export { CkMilkdownEditor } from './CkMilkdownEditor';
84
+ export type {
85
+ CkMilkdownEditorEmits,
86
+ CkMilkdownEditorExposed,
87
+ CkMilkdownEditorProps,
88
+ } from './CkMilkdownEditor';
@@ -27,6 +27,7 @@ export {
27
27
  CkStopIcon,
28
28
  CkUserMessage,
29
29
  CkEditableUserMessage,
30
+ CkMilkdownEditor,
30
31
  } from './base';
31
32
  export type {
32
33
  CkAgentMessageHeaderProps,
@@ -66,6 +67,9 @@ export type {
66
67
  CkUserMessageProps,
67
68
  CkEditableUserMessageProps,
68
69
  CkEditableUserMessageEmits,
70
+ CkMilkdownEditorEmits,
71
+ CkMilkdownEditorExposed,
72
+ CkMilkdownEditorProps,
69
73
  } from './base';
70
74
 
71
75
  // Composed (pattern) components
@@ -111,6 +111,24 @@ export type ChatKitLabels = {
111
111
  * set and more conversations exist than the limit.
112
112
  */
113
113
  historyShowAll?: string;
114
+ /** Accessible name of the "Bold" button in the `CkMilkdownEditor` toolbar. */
115
+ markdownEditorBold?: string;
116
+ /** Accessible name of the "Italic" button in the `CkMilkdownEditor` toolbar. */
117
+ markdownEditorItalic?: string;
118
+ /** Accessible name of the "Strikethrough" button in the `CkMilkdownEditor` toolbar. */
119
+ markdownEditorStrikethrough?: string;
120
+ /** Accessible name of the "Inline code" button in the `CkMilkdownEditor` toolbar. */
121
+ markdownEditorInlineCode?: string;
122
+ /** Accessible name of the "Link" button in the `CkMilkdownEditor` toolbar. */
123
+ markdownEditorLink?: string;
124
+ /** Placeholder of the URL input in the `CkMilkdownEditor` link tooltip. */
125
+ markdownEditorLinkPlaceholder?: string;
126
+ /** Label of the copy button on a `CkMilkdownEditor` code block. */
127
+ markdownEditorCopyCode?: string;
128
+ /** Placeholder of the language search input on a `CkMilkdownEditor` code block. */
129
+ markdownEditorSearchLanguage?: string;
130
+ /** Empty-state text of the language search on a `CkMilkdownEditor` code block. */
131
+ markdownEditorNoLanguageFound?: string;
114
132
  };
115
133
 
116
134
  /** English defaults used when no labels are provided by the consumer. */
@@ -150,6 +168,15 @@ export const defaultChatKitLabels = {
150
168
  historyItemEditAction: 'Edit',
151
169
  historyItemDeleteAction: 'Delete',
152
170
  historyShowAll: 'Show all',
171
+ markdownEditorBold: 'Bold',
172
+ markdownEditorItalic: 'Italic',
173
+ markdownEditorStrikethrough: 'Strikethrough',
174
+ markdownEditorInlineCode: 'Inline code',
175
+ markdownEditorLink: 'Link',
176
+ markdownEditorLinkPlaceholder: 'Paste or type a link…',
177
+ markdownEditorCopyCode: 'Copy code',
178
+ markdownEditorSearchLanguage: 'Search language…',
179
+ markdownEditorNoLanguageFound: 'No language found',
153
180
  } satisfies Required<ChatKitLabels>;
154
181
 
155
182
  /** Vue injection key for ChatKit labels. */
package/src/index.ts CHANGED
@@ -99,6 +99,7 @@ export {
99
99
  CkStopIcon,
100
100
  CkUserMessage,
101
101
  CkEditableUserMessage,
102
+ CkMilkdownEditor,
102
103
  } from './components';
103
104
  export type {
104
105
  CkAgentMessageHeaderProps,
@@ -141,6 +142,9 @@ export type {
141
142
  CkUserMessageProps,
142
143
  CkEditableUserMessageProps,
143
144
  CkEditableUserMessageEmits,
145
+ CkMilkdownEditorEmits,
146
+ CkMilkdownEditorExposed,
147
+ CkMilkdownEditorProps,
144
148
  } from './components';
145
149
 
146
150
  // Helpers