@milkdown/crepe 7.20.0 → 7.21.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 (173) hide show
  1. package/lib/cjs/builder.js +1 -0
  2. package/lib/cjs/builder.js.map +1 -1
  3. package/lib/cjs/feature/ai/index.js +1492 -0
  4. package/lib/cjs/feature/ai/index.js.map +1 -0
  5. package/lib/cjs/feature/block-edit/index.js +1 -0
  6. package/lib/cjs/feature/block-edit/index.js.map +1 -1
  7. package/lib/cjs/feature/code-mirror/index.js +1 -0
  8. package/lib/cjs/feature/code-mirror/index.js.map +1 -1
  9. package/lib/cjs/feature/cursor/index.js +1 -0
  10. package/lib/cjs/feature/cursor/index.js.map +1 -1
  11. package/lib/cjs/feature/image-block/index.js +1 -0
  12. package/lib/cjs/feature/image-block/index.js.map +1 -1
  13. package/lib/cjs/feature/latex/index.js +2 -0
  14. package/lib/cjs/feature/latex/index.js.map +1 -1
  15. package/lib/cjs/feature/link-tooltip/index.js +1 -0
  16. package/lib/cjs/feature/link-tooltip/index.js.map +1 -1
  17. package/lib/cjs/feature/list-item/index.js +1 -0
  18. package/lib/cjs/feature/list-item/index.js.map +1 -1
  19. package/lib/cjs/feature/placeholder/index.js +1 -0
  20. package/lib/cjs/feature/placeholder/index.js.map +1 -1
  21. package/lib/cjs/feature/table/index.js +1 -0
  22. package/lib/cjs/feature/table/index.js.map +1 -1
  23. package/lib/cjs/feature/toolbar/index.js +488 -3
  24. package/lib/cjs/feature/toolbar/index.js.map +1 -1
  25. package/lib/cjs/feature/top-bar/index.js +1 -0
  26. package/lib/cjs/feature/top-bar/index.js.map +1 -1
  27. package/lib/cjs/index.js +1424 -25
  28. package/lib/cjs/index.js.map +1 -1
  29. package/lib/cjs/llm-providers/anthropic/index.js +147 -0
  30. package/lib/cjs/llm-providers/anthropic/index.js.map +1 -0
  31. package/lib/cjs/llm-providers/openai/index.js +138 -0
  32. package/lib/cjs/llm-providers/openai/index.js.map +1 -0
  33. package/lib/esm/builder.js +1 -0
  34. package/lib/esm/builder.js.map +1 -1
  35. package/lib/esm/feature/ai/index.js +1487 -0
  36. package/lib/esm/feature/ai/index.js.map +1 -0
  37. package/lib/esm/feature/block-edit/index.js +1 -0
  38. package/lib/esm/feature/block-edit/index.js.map +1 -1
  39. package/lib/esm/feature/code-mirror/index.js +1 -0
  40. package/lib/esm/feature/code-mirror/index.js.map +1 -1
  41. package/lib/esm/feature/cursor/index.js +1 -0
  42. package/lib/esm/feature/cursor/index.js.map +1 -1
  43. package/lib/esm/feature/image-block/index.js +1 -0
  44. package/lib/esm/feature/image-block/index.js.map +1 -1
  45. package/lib/esm/feature/latex/index.js +2 -0
  46. package/lib/esm/feature/latex/index.js.map +1 -1
  47. package/lib/esm/feature/link-tooltip/index.js +1 -0
  48. package/lib/esm/feature/link-tooltip/index.js.map +1 -1
  49. package/lib/esm/feature/list-item/index.js +1 -0
  50. package/lib/esm/feature/list-item/index.js.map +1 -1
  51. package/lib/esm/feature/placeholder/index.js +1 -0
  52. package/lib/esm/feature/placeholder/index.js.map +1 -1
  53. package/lib/esm/feature/table/index.js +1 -0
  54. package/lib/esm/feature/table/index.js.map +1 -1
  55. package/lib/esm/feature/toolbar/index.js +490 -5
  56. package/lib/esm/feature/toolbar/index.js.map +1 -1
  57. package/lib/esm/feature/top-bar/index.js +1 -0
  58. package/lib/esm/feature/top-bar/index.js.map +1 -1
  59. package/lib/esm/index.js +1414 -15
  60. package/lib/esm/index.js.map +1 -1
  61. package/lib/esm/llm-providers/anthropic/index.js +145 -0
  62. package/lib/esm/llm-providers/anthropic/index.js.map +1 -0
  63. package/lib/esm/llm-providers/openai/index.js +136 -0
  64. package/lib/esm/llm-providers/openai/index.js.map +1 -0
  65. package/lib/theme/common/ai.css +446 -0
  66. package/lib/theme/common/code-mirror.css +14 -0
  67. package/lib/theme/common/diff.css +177 -0
  68. package/lib/theme/common/style.css +2 -0
  69. package/lib/tsconfig.tsbuildinfo +1 -1
  70. package/lib/types/feature/ai/ai.spec.d.ts +2 -0
  71. package/lib/types/feature/ai/ai.spec.d.ts.map +1 -0
  72. package/lib/types/feature/ai/commands.d.ts +24 -0
  73. package/lib/types/feature/ai/commands.d.ts.map +1 -0
  74. package/lib/types/feature/ai/context.d.ts +4 -0
  75. package/lib/types/feature/ai/context.d.ts.map +1 -0
  76. package/lib/types/feature/ai/diff-actions/index.d.ts +12 -0
  77. package/lib/types/feature/ai/diff-actions/index.d.ts.map +1 -0
  78. package/lib/types/feature/ai/diff-actions/view.d.ts +21 -0
  79. package/lib/types/feature/ai/diff-actions/view.d.ts.map +1 -0
  80. package/lib/types/feature/ai/index.d.ts +7 -0
  81. package/lib/types/feature/ai/index.d.ts.map +1 -0
  82. package/lib/types/feature/ai/instruction-tooltip/component.d.ts +26 -0
  83. package/lib/types/feature/ai/instruction-tooltip/component.d.ts.map +1 -0
  84. package/lib/types/feature/ai/instruction-tooltip/index.d.ts +17 -0
  85. package/lib/types/feature/ai/instruction-tooltip/index.d.ts.map +1 -0
  86. package/lib/types/feature/ai/instruction-tooltip/suggestions.d.ts +50 -0
  87. package/lib/types/feature/ai/instruction-tooltip/suggestions.d.ts.map +1 -0
  88. package/lib/types/feature/ai/instruction-tooltip/view.d.ts +19 -0
  89. package/lib/types/feature/ai/instruction-tooltip/view.d.ts.map +1 -0
  90. package/lib/types/feature/ai/streaming-indicator.d.ts +9 -0
  91. package/lib/types/feature/ai/streaming-indicator.d.ts.map +1 -0
  92. package/lib/types/feature/ai/types.d.ts +58 -0
  93. package/lib/types/feature/ai/types.d.ts.map +1 -0
  94. package/lib/types/feature/index.d.ts +4 -1
  95. package/lib/types/feature/index.d.ts.map +1 -1
  96. package/lib/types/feature/latex/inline-tooltip/inline-tooltip.spec.d.ts +2 -0
  97. package/lib/types/feature/latex/inline-tooltip/inline-tooltip.spec.d.ts.map +1 -0
  98. package/lib/types/feature/latex/inline-tooltip/view.d.ts.map +1 -1
  99. package/lib/types/feature/loader.d.ts.map +1 -1
  100. package/lib/types/feature/toolbar/config.d.ts.map +1 -1
  101. package/lib/types/feature/toolbar/index.d.ts +1 -0
  102. package/lib/types/feature/toolbar/index.d.ts.map +1 -1
  103. package/lib/types/icons/ai.d.ts +2 -0
  104. package/lib/types/icons/ai.d.ts.map +1 -0
  105. package/lib/types/icons/chevron-left.d.ts +2 -0
  106. package/lib/types/icons/chevron-left.d.ts.map +1 -0
  107. package/lib/types/icons/chevron-right.d.ts +2 -0
  108. package/lib/types/icons/chevron-right.d.ts.map +1 -0
  109. package/lib/types/icons/enter-key.d.ts +2 -0
  110. package/lib/types/icons/enter-key.d.ts.map +1 -0
  111. package/lib/types/icons/grammar-check.d.ts +2 -0
  112. package/lib/types/icons/grammar-check.d.ts.map +1 -0
  113. package/lib/types/icons/index.d.ts +11 -0
  114. package/lib/types/icons/index.d.ts.map +1 -1
  115. package/lib/types/icons/longer.d.ts +2 -0
  116. package/lib/types/icons/longer.d.ts.map +1 -0
  117. package/lib/types/icons/retry.d.ts +2 -0
  118. package/lib/types/icons/retry.d.ts.map +1 -0
  119. package/lib/types/icons/send-prompt.d.ts +2 -0
  120. package/lib/types/icons/send-prompt.d.ts.map +1 -0
  121. package/lib/types/icons/send.d.ts +2 -0
  122. package/lib/types/icons/send.d.ts.map +1 -0
  123. package/lib/types/icons/shorter.d.ts +2 -0
  124. package/lib/types/icons/shorter.d.ts.map +1 -0
  125. package/lib/types/icons/translate.d.ts +2 -0
  126. package/lib/types/icons/translate.d.ts.map +1 -0
  127. package/lib/types/llm-providers/anthropic/index.d.ts +21 -0
  128. package/lib/types/llm-providers/anthropic/index.d.ts.map +1 -0
  129. package/lib/types/llm-providers/openai/index.d.ts +15 -0
  130. package/lib/types/llm-providers/openai/index.d.ts.map +1 -0
  131. package/lib/types/llm-providers/providers.spec.d.ts +2 -0
  132. package/lib/types/llm-providers/providers.spec.d.ts.map +1 -0
  133. package/lib/types/llm-providers/shared.d.ts +16 -0
  134. package/lib/types/llm-providers/shared.d.ts.map +1 -0
  135. package/package.json +18 -2
  136. package/src/feature/ai/ai.spec.ts +742 -0
  137. package/src/feature/ai/commands.ts +257 -0
  138. package/src/feature/ai/context.ts +45 -0
  139. package/src/feature/ai/diff-actions/index.ts +95 -0
  140. package/src/feature/ai/diff-actions/view.ts +237 -0
  141. package/src/feature/ai/index.ts +118 -0
  142. package/src/feature/ai/instruction-tooltip/component.tsx +414 -0
  143. package/src/feature/ai/instruction-tooltip/index.ts +101 -0
  144. package/src/feature/ai/instruction-tooltip/suggestions.ts +249 -0
  145. package/src/feature/ai/instruction-tooltip/view.ts +159 -0
  146. package/src/feature/ai/streaming-indicator.ts +183 -0
  147. package/src/feature/ai/types.ts +178 -0
  148. package/src/feature/index.ts +8 -2
  149. package/src/feature/latex/inline-tooltip/inline-tooltip.spec.ts +81 -0
  150. package/src/feature/latex/inline-tooltip/view.ts +2 -0
  151. package/src/feature/loader.ts +4 -0
  152. package/src/feature/toolbar/config.ts +27 -1
  153. package/src/feature/toolbar/index.ts +1 -0
  154. package/src/icons/ai.ts +14 -0
  155. package/src/icons/chevron-left.ts +15 -0
  156. package/src/icons/chevron-right.ts +15 -0
  157. package/src/icons/enter-key.ts +13 -0
  158. package/src/icons/grammar-check.ts +13 -0
  159. package/src/icons/index.ts +11 -0
  160. package/src/icons/longer.ts +13 -0
  161. package/src/icons/retry.ts +13 -0
  162. package/src/icons/send-prompt.ts +13 -0
  163. package/src/icons/send.ts +13 -0
  164. package/src/icons/shorter.ts +13 -0
  165. package/src/icons/translate.ts +13 -0
  166. package/src/llm-providers/anthropic/index.ts +132 -0
  167. package/src/llm-providers/openai/index.ts +109 -0
  168. package/src/llm-providers/providers.spec.ts +472 -0
  169. package/src/llm-providers/shared.ts +160 -0
  170. package/src/theme/common/ai.css +430 -0
  171. package/src/theme/common/code-mirror.css +14 -0
  172. package/src/theme/common/diff.css +196 -0
  173. package/src/theme/common/style.css +2 -0
@@ -0,0 +1,446 @@
1
+ /* Every selector lives under `.milkdown` so the AI feature's class names
2
+ (which include generic ones like `.ai-instruction-*`) can't leak into
3
+ host applications that happen to reuse the same names. Mirrors the
4
+ pattern used by the other Crepe theme files. */
5
+
6
+ /* AI Instruction Tooltip */
7
+ .milkdown .milkdown-ai-instruction {
8
+ position: absolute;
9
+ z-index: 10;
10
+ }
11
+
12
+ .milkdown .milkdown-ai-instruction[data-show='false'] {
13
+ display: none;
14
+ }
15
+
16
+ .milkdown .milkdown-ai-instruction > .ai-instruction {
17
+ width: 360px;
18
+ background: var(--crepe-color-surface);
19
+ border-radius: 12px;
20
+ box-shadow: var(--crepe-shadow-2);
21
+ font-family: var(--crepe-font-default);
22
+ font-size: 14px;
23
+ color: var(--crepe-color-on-background);
24
+ overflow: hidden;
25
+ }
26
+
27
+ .milkdown .ai-instruction-input {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 8px;
31
+ margin: 8px;
32
+ padding: 4px 4px 4px 12px;
33
+ background: var(--crepe-color-background);
34
+ border: 1px solid
35
+ color-mix(in srgb, var(--crepe-color-primary) 35%, transparent);
36
+ border-radius: 999px;
37
+ }
38
+
39
+ .milkdown .ai-instruction-input-prefix {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ flex-shrink: 0;
43
+ color: var(--crepe-color-primary);
44
+ }
45
+
46
+ .milkdown .ai-instruction-input-prefix svg {
47
+ width: 18px;
48
+ height: 18px;
49
+ color: var(--crepe-color-primary);
50
+ fill: var(--crepe-color-primary);
51
+ }
52
+
53
+ .milkdown .ai-instruction-input-field {
54
+ flex: 1;
55
+ min-width: 0;
56
+ outline: none;
57
+ border: none;
58
+ background: transparent;
59
+ font-family: inherit;
60
+ font-size: 14px;
61
+ line-height: 20px;
62
+ color: var(--crepe-color-on-background);
63
+ padding: 4px 0;
64
+ }
65
+
66
+ .milkdown .ai-instruction-input-field::-moz-placeholder {
67
+ color: var(--crepe-color-outline);
68
+ }
69
+
70
+ .milkdown .ai-instruction-input-field::placeholder {
71
+ color: var(--crepe-color-outline);
72
+ }
73
+
74
+ .milkdown .ai-instruction-submit {
75
+ display: inline-flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ width: 28px;
79
+ height: 28px;
80
+ border-radius: 50%;
81
+ background: var(--crepe-color-primary);
82
+ color: var(--crepe-color-on-inverse);
83
+ border: none;
84
+ cursor: pointer;
85
+ flex-shrink: 0;
86
+ padding: 0;
87
+ }
88
+
89
+ .milkdown .ai-instruction-submit svg {
90
+ width: 16px;
91
+ height: 16px;
92
+ color: var(--crepe-color-on-inverse);
93
+ fill: var(--crepe-color-on-inverse);
94
+ }
95
+
96
+ .milkdown .ai-instruction-submit:hover:not(:disabled) {
97
+ background: color-mix(in srgb, var(--crepe-color-primary) 85%, white);
98
+ }
99
+
100
+ .milkdown .ai-instruction-submit:disabled {
101
+ opacity: 0.4;
102
+ cursor: not-allowed;
103
+ }
104
+
105
+ .milkdown .ai-instruction-list {
106
+ max-height: 320px;
107
+ overflow-y: auto;
108
+ padding-bottom: 6px;
109
+ }
110
+
111
+ .milkdown .ai-instruction-back {
112
+ /* Rendered as a real <button> for keyboard / screen-reader access;
113
+ reset the user-agent button styling so it visually matches the
114
+ surrounding palette chrome. */
115
+ -webkit-appearance: none;
116
+ -moz-appearance: none;
117
+ appearance: none;
118
+ background: transparent;
119
+ border: none;
120
+ width: 100%;
121
+ text-align: left;
122
+ font-family: inherit;
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 6px;
126
+ padding: 6px 12px 4px;
127
+ cursor: pointer;
128
+ color: var(--crepe-color-outline);
129
+ font-size: 12px;
130
+ font-weight: 500;
131
+ -webkit-user-select: none;
132
+ -moz-user-select: none;
133
+ user-select: none;
134
+ }
135
+
136
+ .milkdown .ai-instruction-back:hover {
137
+ color: var(--crepe-color-on-background);
138
+ }
139
+
140
+ .milkdown .ai-instruction-back-icon {
141
+ display: inline-flex;
142
+ }
143
+
144
+ .milkdown .ai-instruction-back-icon svg {
145
+ width: 16px;
146
+ height: 16px;
147
+ stroke: currentColor;
148
+ }
149
+
150
+ .milkdown .ai-instruction-section {
151
+ display: flex;
152
+ flex-direction: column;
153
+ }
154
+
155
+ .milkdown .ai-instruction-section-header {
156
+ padding: 6px 16px 4px;
157
+ font-size: 11px;
158
+ font-weight: 600;
159
+ letter-spacing: 0.08em;
160
+ color: var(--crepe-color-outline);
161
+ text-transform: uppercase;
162
+ -webkit-user-select: none;
163
+ -moz-user-select: none;
164
+ user-select: none;
165
+ }
166
+
167
+ .milkdown .ai-instruction-item {
168
+ display: flex;
169
+ align-items: center;
170
+ gap: 12px;
171
+ padding: 8px 16px;
172
+ cursor: pointer;
173
+ -webkit-user-select: none;
174
+ -moz-user-select: none;
175
+ user-select: none;
176
+ color: var(--crepe-color-on-background);
177
+ }
178
+
179
+ .milkdown .ai-instruction-item.active {
180
+ background: var(--crepe-color-hover);
181
+ }
182
+
183
+ .milkdown .ai-instruction-item-icon {
184
+ display: inline-flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ flex-shrink: 0;
188
+ width: 20px;
189
+ height: 20px;
190
+ }
191
+
192
+ .milkdown .ai-instruction-item-icon svg {
193
+ width: 18px;
194
+ height: 18px;
195
+ color: var(--crepe-color-on-surface-variant);
196
+ fill: var(--crepe-color-on-surface-variant);
197
+ stroke: var(--crepe-color-on-surface-variant);
198
+ }
199
+
200
+ .milkdown .ai-instruction-item-label {
201
+ flex: 1;
202
+ font-size: 14px;
203
+ line-height: 20px;
204
+ overflow: hidden;
205
+ text-overflow: ellipsis;
206
+ white-space: nowrap;
207
+ }
208
+
209
+ .milkdown .ai-instruction-item-label mark {
210
+ background: var(--crepe-color-secondary);
211
+ color: inherit;
212
+ border-radius: 2px;
213
+ padding: 0 1px;
214
+ }
215
+
216
+ .milkdown .ai-instruction-item-arrow {
217
+ display: inline-flex;
218
+ flex-shrink: 0;
219
+ color: var(--crepe-color-outline);
220
+ }
221
+
222
+ .milkdown .ai-instruction-item-arrow svg {
223
+ width: 14px;
224
+ height: 14px;
225
+ stroke: currentColor;
226
+ }
227
+
228
+ .milkdown .ai-instruction-item-prompt .ai-instruction-item-label {
229
+ color: var(--crepe-color-primary);
230
+ }
231
+
232
+ .milkdown .ai-instruction-item-prompt .ai-instruction-item-icon svg {
233
+ color: var(--crepe-color-primary);
234
+ fill: var(--crepe-color-primary);
235
+ }
236
+
237
+ .milkdown .ai-instruction-item-quote {
238
+ font-weight: 500;
239
+ }
240
+
241
+ .milkdown .ai-instruction-item-shortcut {
242
+ display: inline-flex;
243
+ align-items: center;
244
+ justify-content: center;
245
+ min-width: 24px;
246
+ height: 20px;
247
+ padding: 0 4px;
248
+ border-radius: 4px;
249
+ background: var(--crepe-color-surface-low);
250
+ color: var(--crepe-color-outline);
251
+ flex-shrink: 0;
252
+ }
253
+
254
+ .milkdown .ai-instruction-item-shortcut svg {
255
+ width: 14px;
256
+ height: 14px;
257
+ color: var(--crepe-color-outline);
258
+ fill: var(--crepe-color-outline);
259
+ }
260
+
261
+ /* Streaming Indicator */
262
+ .milkdown .milkdown-ai-streaming-indicator {
263
+ display: inline-flex;
264
+ align-items: center;
265
+ gap: 8px;
266
+ padding: 4px 6px 4px 12px;
267
+ margin: 4px 0;
268
+ border-radius: 999px;
269
+ border: 1px solid
270
+ color-mix(in srgb, var(--crepe-color-primary) 20%, transparent);
271
+ background: var(--crepe-color-surface);
272
+ vertical-align: middle;
273
+ white-space: nowrap;
274
+ -webkit-user-select: none;
275
+ -moz-user-select: none;
276
+ user-select: none;
277
+ font-family: var(--crepe-font-default);
278
+ }
279
+
280
+ .milkdown .milkdown-ai-streaming-spinner {
281
+ width: 14px;
282
+ height: 14px;
283
+ border-radius: 50%;
284
+ border: 1.5px solid
285
+ color-mix(in srgb, var(--crepe-color-primary) 25%, transparent);
286
+ border-top-color: var(--crepe-color-primary);
287
+ flex-shrink: 0;
288
+ /* Rotation is driven by requestAnimationFrame in JS so it survives
289
+ DOM re-mounts when the indicator's position advances. */
290
+ will-change: transform;
291
+ }
292
+
293
+ .milkdown .milkdown-ai-streaming-label {
294
+ font-size: 13px;
295
+ line-height: 18px;
296
+ color: var(--crepe-color-on-background);
297
+ }
298
+
299
+ .milkdown .milkdown-ai-streaming-esc {
300
+ font-family: var(--crepe-font-code, ui-monospace, monospace);
301
+ font-size: 11px;
302
+ line-height: 1;
303
+ padding: 4px 8px;
304
+ border-radius: 999px;
305
+ background: var(--crepe-color-surface-low);
306
+ color: var(--crepe-color-outline);
307
+ }
308
+
309
+ /* Diff Actions Panel — appended to the editor's `.milkdown` host so the
310
+ descendant selector below matches even though `position: fixed` takes
311
+ the panel out of normal flow. */
312
+ .milkdown .milkdown-ai-diff-actions {
313
+ position: fixed;
314
+ bottom: 24px;
315
+ left: 50%;
316
+ transform: translateX(-50%);
317
+ z-index: 11;
318
+ display: flex;
319
+ align-items: center;
320
+ gap: 4px;
321
+ padding: 6px;
322
+ background: var(--crepe-color-surface);
323
+ border: 1px solid
324
+ color-mix(in srgb, var(--crepe-color-primary) 18%, transparent);
325
+ border-radius: 999px;
326
+ box-shadow: var(--crepe-shadow-2);
327
+ font-family: var(--crepe-font-default);
328
+ -webkit-user-select: none;
329
+ -moz-user-select: none;
330
+ user-select: none;
331
+ }
332
+
333
+ .milkdown .milkdown-ai-diff-actions[data-show='false'] {
334
+ display: none;
335
+ }
336
+
337
+ .milkdown .milkdown-ai-diff-actions-btn {
338
+ display: inline-flex;
339
+ align-items: center;
340
+ gap: 6px;
341
+ padding: 8px 14px;
342
+ border: none;
343
+ border-radius: 999px;
344
+ background: transparent;
345
+ font-family: inherit;
346
+ font-size: 13px;
347
+ font-weight: 500;
348
+ line-height: 1;
349
+ color: var(--crepe-color-on-background);
350
+ cursor: pointer;
351
+ white-space: nowrap;
352
+ }
353
+
354
+ .milkdown .milkdown-ai-diff-actions-btn:hover {
355
+ background: var(--crepe-color-hover);
356
+ }
357
+
358
+ .milkdown .milkdown-ai-diff-actions-btn:disabled {
359
+ opacity: 0.4;
360
+ cursor: not-allowed;
361
+ }
362
+
363
+ .milkdown .milkdown-ai-diff-actions-btn:disabled:hover {
364
+ background: transparent;
365
+ }
366
+
367
+ .milkdown .milkdown-ai-diff-actions-icon {
368
+ display: inline-flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ width: 18px;
372
+ height: 18px;
373
+ }
374
+
375
+ .milkdown .milkdown-ai-diff-actions-icon svg {
376
+ width: 16px;
377
+ height: 16px;
378
+ color: currentColor;
379
+ fill: currentColor;
380
+ }
381
+
382
+ .milkdown .milkdown-ai-diff-actions-btn-retry {
383
+ color: var(--crepe-color-on-surface-variant);
384
+ }
385
+
386
+ .milkdown .milkdown-ai-diff-actions-btn-reject {
387
+ color: var(--crepe-color-diff-removed-text, #ba1a1a);
388
+ background: color-mix(
389
+ in srgb,
390
+ var(--crepe-color-diff-removed, #ef4444) 8%,
391
+ transparent
392
+ );
393
+ }
394
+
395
+ .milkdown .milkdown-ai-diff-actions-btn-reject:hover {
396
+ background: color-mix(
397
+ in srgb,
398
+ var(--crepe-color-diff-removed, #ef4444) 16%,
399
+ transparent
400
+ );
401
+ }
402
+
403
+ .milkdown .milkdown-ai-diff-actions-btn-accept {
404
+ color: var(--crepe-color-diff-added-text, #166534);
405
+ background: color-mix(
406
+ in srgb,
407
+ var(--crepe-color-diff-added, #22c55e) 12%,
408
+ transparent
409
+ );
410
+ }
411
+
412
+ .milkdown .milkdown-ai-diff-actions-btn-accept:hover {
413
+ background: color-mix(
414
+ in srgb,
415
+ var(--crepe-color-diff-added, #22c55e) 22%,
416
+ transparent
417
+ );
418
+ }
419
+
420
+ .milkdown .milkdown-ai-diff-actions-shortcut {
421
+ display: inline-flex;
422
+ align-items: center;
423
+ gap: 2px;
424
+ margin-left: 4px;
425
+ padding: 3px 6px;
426
+ border-radius: 4px;
427
+ background: color-mix(
428
+ in srgb,
429
+ var(--crepe-color-diff-added, #22c55e) 14%,
430
+ transparent
431
+ );
432
+ font-family: var(--crepe-font-code, ui-monospace, monospace);
433
+ font-size: 11px;
434
+ color: inherit;
435
+ }
436
+
437
+ .milkdown .milkdown-ai-diff-actions-shortcut-icon {
438
+ display: inline-flex;
439
+ }
440
+
441
+ .milkdown .milkdown-ai-diff-actions-shortcut-icon svg {
442
+ width: 12px;
443
+ height: 12px;
444
+ color: currentColor;
445
+ fill: currentColor;
446
+ }
@@ -22,6 +22,20 @@
22
22
  outline: 1px solid var(--crepe-color-primary);
23
23
  }
24
24
 
25
+ .milkdown .milkdown-code-block .milkdown-code-block-placeholder {
26
+ margin: 0;
27
+ padding: 4px 0;
28
+ font-family: var(--crepe-font-code, monospace);
29
+ font-size: 14px;
30
+ line-height: 1.5;
31
+ white-space: pre-wrap;
32
+ word-break: break-all;
33
+ }
34
+
35
+ .milkdown .milkdown-code-block .milkdown-code-block-placeholder code {
36
+ font-family: inherit;
37
+ }
38
+
25
39
  .milkdown .milkdown-code-block .cm-editor {
26
40
  outline: none !important;
27
41
  background: var(--crepe-color-surface);
@@ -0,0 +1,177 @@
1
+ .milkdown {
2
+ --crepe-color-diff-added: #22c55e;
3
+ --crepe-color-diff-removed: #ef4444;
4
+
5
+ --crepe-color-diff-added-bg: color-mix(
6
+ in srgb,
7
+ var(--crepe-color-diff-added),
8
+ transparent 88%
9
+ );
10
+ --crepe-color-diff-added-text: color-mix(
11
+ in srgb,
12
+ var(--crepe-color-diff-added),
13
+ var(--crepe-color-on-background) 40%
14
+ );
15
+ --crepe-color-diff-removed-bg: color-mix(
16
+ in srgb,
17
+ var(--crepe-color-diff-removed),
18
+ transparent 88%
19
+ );
20
+ --crepe-color-diff-removed-text: color-mix(
21
+ in srgb,
22
+ var(--crepe-color-diff-removed),
23
+ var(--crepe-color-on-background) 40%
24
+ );
25
+ }
26
+
27
+ /* Inline deletion: strikethrough */
28
+ .milkdown .milkdown-diff-removed {
29
+ text-decoration: line-through;
30
+ background-color: var(--crepe-color-diff-removed-bg);
31
+ color: var(--crepe-color-diff-removed-text);
32
+ }
33
+ /* Block deletion: node-level overlay for custom node views */
34
+ .milkdown .milkdown-diff-removed-block {
35
+ position: relative;
36
+ opacity: 0.45;
37
+ outline: 2px dashed var(--crepe-color-diff-removed) !important;
38
+ outline-offset: 2px;
39
+ border-radius: 4px;
40
+ background-color: var(--crepe-color-diff-removed-bg);
41
+ }
42
+ /* Inline insertion */
43
+ .milkdown .milkdown-diff-added {
44
+ background-color: var(--crepe-color-diff-added-bg);
45
+ color: var(--crepe-color-diff-added-text);
46
+ padding: 0 2px;
47
+ border-radius: 2px;
48
+ }
49
+ /* Block insertion */
50
+ .milkdown .milkdown-diff-added-block {
51
+ display: block;
52
+ background-color: var(--crepe-color-diff-added-bg);
53
+ border-left: 3px solid var(--crepe-color-diff-added);
54
+ border-radius: 4px;
55
+ padding: 8px 12px;
56
+ margin: 8px 0;
57
+ }
58
+ .milkdown .milkdown-diff-added-block h1,
59
+ .milkdown .milkdown-diff-added-block h2,
60
+ .milkdown .milkdown-diff-added-block h3,
61
+ .milkdown .milkdown-diff-added-block h4,
62
+ .milkdown .milkdown-diff-added-block h5,
63
+ .milkdown .milkdown-diff-added-block h6 {
64
+ color: var(--crepe-color-diff-added-text);
65
+ margin: 4px 0;
66
+ }
67
+ .milkdown .milkdown-diff-added-block p {
68
+ color: var(--crepe-color-diff-added-text);
69
+ margin: 4px 0;
70
+ }
71
+ .milkdown .milkdown-diff-added-block ul,
72
+ .milkdown .milkdown-diff-added-block ol {
73
+ color: var(--crepe-color-diff-added-text);
74
+ margin: 4px 0;
75
+ padding-left: 20px;
76
+ }
77
+ .milkdown .milkdown-diff-added-block li {
78
+ margin: 2px 0;
79
+ }
80
+ .milkdown .milkdown-diff-added-block table {
81
+ border-collapse: collapse;
82
+ width: 100%;
83
+ margin: 4px 0;
84
+ }
85
+ .milkdown .milkdown-diff-added-block th,
86
+ .milkdown .milkdown-diff-added-block td {
87
+ border: 1px solid
88
+ color-mix(in srgb, var(--crepe-color-diff-added), transparent 50%);
89
+ padding: 6px 12px;
90
+ text-align: left;
91
+ }
92
+ .milkdown .milkdown-diff-added-block th {
93
+ font-weight: 600;
94
+ }
95
+ .milkdown .milkdown-diff-added-block img {
96
+ max-width: 100%;
97
+ border-radius: 4px;
98
+ }
99
+ .milkdown .milkdown-diff-added-block pre,
100
+ .milkdown .milkdown-diff-added-block code {
101
+ background: color-mix(
102
+ in srgb,
103
+ var(--crepe-color-diff-added),
104
+ transparent 94%
105
+ );
106
+ border-radius: 4px;
107
+ padding: 8px 12px;
108
+ font-family: var(--crepe-font-code);
109
+ font-size: 13px;
110
+ overflow-x: auto;
111
+ display: block;
112
+ white-space: pre;
113
+ }
114
+ /* Inline controls */
115
+ .milkdown .milkdown-diff-controls {
116
+ display: inline-flex;
117
+ gap: 3px;
118
+ margin: 0 4px;
119
+ vertical-align: middle;
120
+ white-space: nowrap;
121
+ }
122
+ .milkdown .milkdown-diff-controls button {
123
+ font-family: var(--crepe-font-default);
124
+ font-size: 11px;
125
+ line-height: 1;
126
+ padding: 2px 6px;
127
+ border-radius: 3px;
128
+ cursor: pointer;
129
+ border: 1px solid;
130
+ font-weight: 500;
131
+ }
132
+ /* Block controls */
133
+ .milkdown .milkdown-diff-controls-block {
134
+ display: flex;
135
+ gap: 4px;
136
+ margin: 4px 0;
137
+ }
138
+ .milkdown .milkdown-diff-accept {
139
+ background-color: color-mix(
140
+ in srgb,
141
+ var(--crepe-color-diff-added),
142
+ var(--crepe-color-background) 85%
143
+ );
144
+ color: var(--crepe-color-diff-added-text);
145
+ border-color: color-mix(
146
+ in srgb,
147
+ var(--crepe-color-diff-added),
148
+ transparent 50%
149
+ );
150
+ }
151
+ .milkdown .milkdown-diff-accept:hover {
152
+ background-color: color-mix(
153
+ in srgb,
154
+ var(--crepe-color-diff-added),
155
+ var(--crepe-color-background) 75%
156
+ );
157
+ }
158
+ .milkdown .milkdown-diff-reject {
159
+ background-color: color-mix(
160
+ in srgb,
161
+ var(--crepe-color-diff-removed),
162
+ var(--crepe-color-background) 85%
163
+ );
164
+ color: var(--crepe-color-diff-removed-text);
165
+ border-color: color-mix(
166
+ in srgb,
167
+ var(--crepe-color-diff-removed),
168
+ transparent 50%
169
+ );
170
+ }
171
+ .milkdown .milkdown-diff-reject:hover {
172
+ background-color: color-mix(
173
+ in srgb,
174
+ var(--crepe-color-diff-removed),
175
+ var(--crepe-color-background) 75%
176
+ );
177
+ }
@@ -11,3 +11,5 @@
11
11
  @import './table.css';
12
12
  @import './latex.css';
13
13
  @import './top-bar.css';
14
+ @import './diff.css';
15
+ @import './ai.css';