@forgedevstack/ink 1.0.1 → 1.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 (114) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +78 -122
  3. package/dist/components/InkEditor/InkEditor.cjs +1 -1
  4. package/dist/components/InkEditor/InkEditor.d.ts.map +1 -1
  5. package/dist/components/InkEditor/InkEditor.js +495 -156
  6. package/dist/components/InkEditor/components/AiPanel/AiPanel.cjs +1 -0
  7. package/dist/components/InkEditor/components/AiPanel/AiPanel.d.ts +11 -0
  8. package/dist/components/InkEditor/components/AiPanel/AiPanel.d.ts.map +1 -0
  9. package/dist/components/InkEditor/components/AiPanel/AiPanel.js +178 -0
  10. package/dist/components/InkEditor/components/AiPanel/index.d.ts +3 -0
  11. package/dist/components/InkEditor/components/AiPanel/index.d.ts.map +1 -0
  12. package/dist/components/InkEditor/components/BlockHandles/BlockHandles.cjs +1 -0
  13. package/dist/components/InkEditor/components/BlockHandles/BlockHandles.d.ts +9 -0
  14. package/dist/components/InkEditor/components/BlockHandles/BlockHandles.d.ts.map +1 -0
  15. package/dist/components/InkEditor/components/BlockHandles/BlockHandles.js +12 -0
  16. package/dist/components/InkEditor/components/BlockHandles/index.d.ts +3 -0
  17. package/dist/components/InkEditor/components/BlockHandles/index.d.ts.map +1 -0
  18. package/dist/components/InkEditor/components/CommentsPanel/CommentsPanel.cjs +1 -0
  19. package/dist/components/InkEditor/components/CommentsPanel/CommentsPanel.d.ts +11 -0
  20. package/dist/components/InkEditor/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  21. package/dist/components/InkEditor/components/CommentsPanel/CommentsPanel.js +61 -0
  22. package/dist/components/InkEditor/components/CommentsPanel/index.d.ts +3 -0
  23. package/dist/components/InkEditor/components/CommentsPanel/index.d.ts.map +1 -0
  24. package/dist/components/InkEditor/components/SlashMenu/SlashMenu.cjs +1 -0
  25. package/dist/components/InkEditor/components/SlashMenu/SlashMenu.d.ts +10 -0
  26. package/dist/components/InkEditor/components/SlashMenu/SlashMenu.d.ts.map +1 -0
  27. package/dist/components/InkEditor/components/SlashMenu/SlashMenu.js +20 -0
  28. package/dist/components/InkEditor/components/SlashMenu/index.d.ts +3 -0
  29. package/dist/components/InkEditor/components/SlashMenu/index.d.ts.map +1 -0
  30. package/dist/components/InkEditor/components/TrackChangesBar/TrackChangesBar.cjs +1 -0
  31. package/dist/components/InkEditor/components/TrackChangesBar/TrackChangesBar.d.ts +11 -0
  32. package/dist/components/InkEditor/components/TrackChangesBar/TrackChangesBar.d.ts.map +1 -0
  33. package/dist/components/InkEditor/components/TrackChangesBar/TrackChangesBar.js +27 -0
  34. package/dist/components/InkEditor/components/TrackChangesBar/index.d.ts +3 -0
  35. package/dist/components/InkEditor/components/TrackChangesBar/index.d.ts.map +1 -0
  36. package/dist/components/InkEditor/components/index.d.ts +5 -0
  37. package/dist/components/InkEditor/components/index.d.ts.map +1 -1
  38. package/dist/constants/aiModels.const.cjs +1 -0
  39. package/dist/constants/aiModels.const.d.ts +5 -0
  40. package/dist/constants/aiModels.const.d.ts.map +1 -0
  41. package/dist/constants/aiModels.const.js +31 -0
  42. package/dist/constants/defaults.const.cjs +1 -1
  43. package/dist/constants/defaults.const.d.ts +32 -1
  44. package/dist/constants/defaults.const.d.ts.map +1 -1
  45. package/dist/constants/defaults.const.js +124 -20
  46. package/dist/constants/index.d.ts +1 -0
  47. package/dist/constants/index.d.ts.map +1 -1
  48. package/dist/constants/numbers.const.cjs +1 -1
  49. package/dist/constants/numbers.const.d.ts +13 -0
  50. package/dist/constants/numbers.const.d.ts.map +1 -1
  51. package/dist/constants/numbers.const.js +13 -3
  52. package/dist/index.cjs +1 -1
  53. package/dist/index.d.ts +3 -3
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +32 -13
  56. package/dist/plugins/ai/aiPlugin.cjs +1 -1
  57. package/dist/plugins/ai/aiPlugin.d.ts.map +1 -1
  58. package/dist/plugins/ai/aiPlugin.js +40 -18
  59. package/dist/plugins/ai/demoProvider.cjs +1 -0
  60. package/dist/plugins/ai/demoProvider.d.ts +3 -0
  61. package/dist/plugins/ai/demoProvider.d.ts.map +1 -0
  62. package/dist/plugins/ai/demoProvider.js +130 -0
  63. package/dist/plugins/ai/index.cjs +1 -1
  64. package/dist/plugins/ai/index.d.ts +4 -1
  65. package/dist/plugins/ai/index.d.ts.map +1 -1
  66. package/dist/plugins/ai/index.js +15 -3
  67. package/dist/plugins/ai/stubs.cjs +1 -0
  68. package/dist/plugins/ai/stubs.d.ts +7 -0
  69. package/dist/plugins/ai/stubs.d.ts.map +1 -0
  70. package/dist/plugins/ai/stubs.js +23 -0
  71. package/dist/styles.css +464 -19
  72. package/dist/types/ai.types.d.ts +111 -2
  73. package/dist/types/ai.types.d.ts.map +1 -1
  74. package/dist/types/comments.types.d.ts +17 -0
  75. package/dist/types/comments.types.d.ts.map +1 -0
  76. package/dist/types/features.types.d.ts +5 -0
  77. package/dist/types/features.types.d.ts.map +1 -0
  78. package/dist/types/index.d.ts +5 -2
  79. package/dist/types/index.d.ts.map +1 -1
  80. package/dist/types/ink.types.d.ts +26 -1
  81. package/dist/types/ink.types.d.ts.map +1 -1
  82. package/dist/types/trackChanges.types.d.ts +12 -0
  83. package/dist/types/trackChanges.types.d.ts.map +1 -0
  84. package/dist/utils/blocks.utils.cjs +1 -0
  85. package/dist/utils/blocks.utils.d.ts +4 -0
  86. package/dist/utils/blocks.utils.d.ts.map +1 -0
  87. package/dist/utils/blocks.utils.js +41 -0
  88. package/dist/utils/comments.utils.cjs +1 -0
  89. package/dist/utils/comments.utils.d.ts +5 -0
  90. package/dist/utils/comments.utils.d.ts.map +1 -0
  91. package/dist/utils/comments.utils.js +32 -0
  92. package/dist/utils/history.utils.cjs +1 -0
  93. package/dist/utils/history.utils.d.ts +13 -0
  94. package/dist/utils/history.utils.d.ts.map +1 -0
  95. package/dist/utils/history.utils.js +29 -0
  96. package/dist/utils/id.utils.cjs +1 -0
  97. package/dist/utils/id.utils.d.ts +2 -0
  98. package/dist/utils/id.utils.d.ts.map +1 -0
  99. package/dist/utils/id.utils.js +4 -0
  100. package/dist/utils/index.d.ts +7 -0
  101. package/dist/utils/index.d.ts.map +1 -1
  102. package/dist/utils/slash.utils.cjs +1 -0
  103. package/dist/utils/slash.utils.d.ts +4 -0
  104. package/dist/utils/slash.utils.d.ts.map +1 -0
  105. package/dist/utils/slash.utils.js +13 -0
  106. package/dist/utils/table.utils.cjs +1 -0
  107. package/dist/utils/table.utils.d.ts +2 -0
  108. package/dist/utils/table.utils.d.ts.map +1 -0
  109. package/dist/utils/table.utils.js +13 -0
  110. package/dist/utils/trackChanges.utils.cjs +1 -0
  111. package/dist/utils/trackChanges.utils.d.ts +7 -0
  112. package/dist/utils/trackChanges.utils.d.ts.map +1 -0
  113. package/dist/utils/trackChanges.utils.js +34 -0
  114. package/package.json +2 -2
package/dist/styles.css CHANGED
@@ -1,17 +1,28 @@
1
1
  .Ink-Editor {
2
2
  --ink-border: #e5e7eb;
3
3
  --ink-bg: #ffffff;
4
- --ink-toolbar: #f9fafb;
5
- --ink-text: #111827;
6
- --ink-muted: #6b7280;
7
- --ink-accent: #0f766e;
4
+ --ink-toolbar: #f8fafc;
5
+ --ink-text: #0f172a;
6
+ --ink-muted: #64748b;
7
+ --ink-accent: #0d9488;
8
8
  --ink-accent-soft: #ccfbf1;
9
+ --ink-shadow: 0 10px 40px rgb(15 23 42 / 0.08);
10
+ --ink-radius: 1rem;
11
+ --ink-ai-accent: var(--ink-accent);
12
+ --ink-ai-surface: #f8fafc;
13
+ --ink-ai-border: var(--ink-border);
9
14
  border: 1px solid var(--ink-border);
10
- border-radius: 0.75rem;
15
+ border-radius: var(--ink-radius);
11
16
  overflow: hidden;
12
17
  background: var(--ink-bg);
13
18
  color: var(--ink-text);
14
- box-shadow: 0 1px 2px rgb(0 0 0 / 0.04);
19
+ box-shadow: var(--ink-shadow);
20
+ font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;
21
+ }
22
+
23
+ .Ink-Editor[data-variant='document'] {
24
+ --ink-toolbar: #ffffff;
25
+ box-shadow: 0 4px 24px rgb(15 23 42 / 0.06);
15
26
  }
16
27
 
17
28
  .Ink-Editor[data-disabled='true'] {
@@ -23,8 +34,8 @@
23
34
  display: flex;
24
35
  flex-wrap: wrap;
25
36
  align-items: center;
26
- gap: 0.25rem;
27
- padding: 0.5rem;
37
+ gap: 0.2rem;
38
+ padding: 0.55rem 0.65rem;
28
39
  border-bottom: 1px solid var(--ink-border);
29
40
  background: var(--ink-toolbar);
30
41
  }
@@ -34,7 +45,7 @@
34
45
  border: 0;
35
46
  background: transparent;
36
47
  color: inherit;
37
- border-radius: 0.375rem;
48
+ border-radius: 0.45rem;
38
49
  cursor: pointer;
39
50
  }
40
51
 
@@ -42,12 +53,13 @@
42
53
  min-width: 2rem;
43
54
  height: 2rem;
44
55
  padding: 0 0.4rem;
45
- font-weight: 700;
56
+ font-weight: 650;
57
+ font-size: 0.85rem;
46
58
  }
47
59
 
48
60
  .Ink-Editor__button:hover,
49
61
  .Ink-Editor__select:hover {
50
- background: rgb(0 0 0 / 0.06);
62
+ background: rgb(15 23 42 / 0.05);
51
63
  }
52
64
 
53
65
  .Ink-Editor__button--active {
@@ -58,12 +70,19 @@
58
70
  .Ink-Editor__select {
59
71
  height: 2rem;
60
72
  padding: 0 0.5rem;
73
+ border: 1px solid transparent;
74
+ }
75
+
76
+ .Ink-Editor__select:focus {
77
+ outline: none;
78
+ border-color: var(--ink-accent);
79
+ background: #fff;
61
80
  }
62
81
 
63
82
  .Ink-Editor__divider {
64
83
  width: 1px;
65
84
  height: 1.25rem;
66
- margin: 0 0.25rem;
85
+ margin: 0 0.3rem;
67
86
  background: var(--ink-border);
68
87
  }
69
88
 
@@ -91,12 +110,31 @@
91
110
  border: 1px solid var(--ink-border);
92
111
  }
93
112
 
113
+ .Ink-Editor__shell {
114
+ position: relative;
115
+ display: flex;
116
+ align-items: stretch;
117
+ min-height: 0;
118
+ }
119
+
120
+ .Ink-Editor__body {
121
+ position: relative;
122
+ flex: 1 1 auto;
123
+ min-width: 0;
124
+ }
125
+
94
126
  .Ink-Editor__content {
95
127
  min-height: 150px;
96
- padding: 1rem;
128
+ padding: 1.1rem 1.25rem 1.1rem 2.5rem;
97
129
  outline: none;
98
130
  overflow: auto;
99
- line-height: 1.6;
131
+ line-height: 1.65;
132
+ }
133
+
134
+ .Ink-Editor[data-variant='document'] .Ink-Editor__content {
135
+ padding: 2rem 2.5rem 2rem 3rem;
136
+ max-width: 48rem;
137
+ margin: 0 auto;
100
138
  }
101
139
 
102
140
  .Ink-Editor__content:empty::before {
@@ -108,6 +146,7 @@
108
146
  .Ink-Editor__content img {
109
147
  max-width: 100%;
110
148
  height: auto;
149
+ border-radius: 0.35rem;
111
150
  }
112
151
 
113
152
  .Ink-Editor__content h1,
@@ -116,7 +155,7 @@
116
155
  .Ink-Editor__content h4,
117
156
  .Ink-Editor__content h5,
118
157
  .Ink-Editor__content h6 {
119
- margin: 0.75rem 0 0.5rem;
158
+ margin: 0.85rem 0 0.45rem;
120
159
  line-height: 1.25;
121
160
  }
122
161
 
@@ -125,7 +164,50 @@
125
164
  .Ink-Editor__content ol,
126
165
  .Ink-Editor__content blockquote,
127
166
  .Ink-Editor__content pre {
128
- margin: 0.5rem 0;
167
+ margin: 0.55rem 0;
168
+ }
169
+
170
+ .Ink-Editor__content .Ink-block--active {
171
+ outline: 1px solid rgb(13 148 136 / 0.35);
172
+ border-radius: 0.35rem;
173
+ background: rgb(13 148 136 / 0.03);
174
+ }
175
+
176
+ .Ink-Editor__content .Ink-table {
177
+ width: 100%;
178
+ border-collapse: collapse;
179
+ margin: 0.75rem 0;
180
+ font-size: 0.95rem;
181
+ }
182
+
183
+ .Ink-Editor__content .Ink-table th,
184
+ .Ink-Editor__content .Ink-table td {
185
+ border: 1px solid var(--ink-border);
186
+ padding: 0.45rem 0.6rem;
187
+ min-width: 4rem;
188
+ }
189
+
190
+ .Ink-Editor__content .Ink-table th {
191
+ background: #f1f5f9;
192
+ font-weight: 650;
193
+ text-align: left;
194
+ }
195
+
196
+ .Ink-Editor__content .Ink-tc-insert {
197
+ background: rgb(34 197 94 / 0.18);
198
+ text-decoration: none;
199
+ color: inherit;
200
+ }
201
+
202
+ .Ink-Editor__content .Ink-tc-delete {
203
+ background: rgb(239 68 68 / 0.14);
204
+ color: #991b1b;
205
+ }
206
+
207
+ .Ink-Editor__content .Ink-comment-mark {
208
+ background: #fde047;
209
+ border-radius: 0.15rem;
210
+ padding: 0 0.1rem;
129
211
  }
130
212
 
131
213
  .Ink-Editor__footer {
@@ -136,6 +218,368 @@
136
218
  text-align: right;
137
219
  }
138
220
 
221
+ .Ink-BlockHandles {
222
+ position: absolute;
223
+ left: 0.25rem;
224
+ z-index: 2;
225
+ display: flex;
226
+ flex-direction: column;
227
+ gap: 0.1rem;
228
+ }
229
+
230
+ .Ink-BlockHandles__grip,
231
+ .Ink-BlockHandles__btn {
232
+ width: 1.5rem;
233
+ height: 1.35rem;
234
+ border: 0;
235
+ border-radius: 0.3rem;
236
+ background: #fff;
237
+ box-shadow: 0 1px 3px rgb(15 23 42 / 0.12);
238
+ color: var(--ink-muted);
239
+ cursor: pointer;
240
+ font-size: 0.7rem;
241
+ line-height: 1;
242
+ }
243
+
244
+ .Ink-BlockHandles__btn:hover,
245
+ .Ink-BlockHandles__grip:hover {
246
+ color: var(--ink-accent);
247
+ background: var(--ink-accent-soft);
248
+ }
249
+
250
+ .Ink-Slash {
251
+ position: absolute;
252
+ z-index: 5;
253
+ min-width: 12rem;
254
+ background: #fff;
255
+ border: 1px solid var(--ink-border);
256
+ border-radius: 0.65rem;
257
+ box-shadow: 0 12px 32px rgb(15 23 42 / 0.12);
258
+ padding: 0.3rem;
259
+ }
260
+
261
+ .Ink-Slash__item {
262
+ display: block;
263
+ width: 100%;
264
+ text-align: left;
265
+ border: 0;
266
+ background: transparent;
267
+ padding: 0.45rem 0.6rem;
268
+ border-radius: 0.4rem;
269
+ cursor: pointer;
270
+ color: inherit;
271
+ }
272
+
273
+ .Ink-Slash__item:hover {
274
+ background: var(--ink-accent-soft);
275
+ color: var(--ink-accent);
276
+ }
277
+
278
+ .Ink-TrackBar {
279
+ display: flex;
280
+ flex-wrap: wrap;
281
+ align-items: center;
282
+ gap: 0.5rem;
283
+ padding: 0.45rem 0.75rem;
284
+ border-bottom: 1px solid var(--ink-border);
285
+ background: #fffbeb;
286
+ font-size: 0.8rem;
287
+ }
288
+
289
+ .Ink-TrackBar__label {
290
+ font-weight: 650;
291
+ color: #92400e;
292
+ }
293
+
294
+ .Ink-TrackBar__actions {
295
+ display: flex;
296
+ gap: 0.25rem;
297
+ }
298
+
299
+ .Ink-TrackBar__list {
300
+ list-style: none;
301
+ margin: 0;
302
+ padding: 0;
303
+ display: flex;
304
+ flex-wrap: wrap;
305
+ gap: 0.35rem;
306
+ width: 100%;
307
+ }
308
+
309
+ .Ink-TrackBar__list li {
310
+ display: flex;
311
+ align-items: center;
312
+ gap: 0.25rem;
313
+ background: #fff;
314
+ border: 1px solid #fde68a;
315
+ border-radius: 0.45rem;
316
+ padding: 0.2rem 0.35rem;
317
+ }
318
+
319
+ .Ink-Comments {
320
+ width: 300px;
321
+ flex: 0 0 300px;
322
+ border-left: 1px solid var(--ink-border);
323
+ background: #fcfcfd;
324
+ display: flex;
325
+ flex-direction: column;
326
+ max-height: 100%;
327
+ }
328
+
329
+ .Ink-Comments__header,
330
+ .Ink-Ai__header {
331
+ display: flex;
332
+ align-items: center;
333
+ justify-content: space-between;
334
+ padding: 0.65rem 0.75rem;
335
+ border-bottom: 1px solid var(--ink-border);
336
+ font-size: 0.9rem;
337
+ }
338
+
339
+ .Ink-Comments__list {
340
+ overflow: auto;
341
+ padding: 0.65rem;
342
+ display: flex;
343
+ flex-direction: column;
344
+ gap: 0.65rem;
345
+ }
346
+
347
+ .Ink-Comments__empty,
348
+ .Ink-Ai__empty,
349
+ .Ink-Ai__hint {
350
+ color: var(--ink-muted);
351
+ font-size: 0.85rem;
352
+ line-height: 1.45;
353
+ }
354
+
355
+ .Ink-Comments__thread {
356
+ border: 1px solid var(--ink-border);
357
+ border-radius: 0.65rem;
358
+ padding: 0.65rem;
359
+ background: #fff;
360
+ box-shadow: 0 1px 2px rgb(15 23 42 / 0.04);
361
+ }
362
+
363
+ .Ink-Comments__thread--resolved {
364
+ opacity: 0.65;
365
+ }
366
+
367
+ .Ink-Comments__meta {
368
+ display: flex;
369
+ justify-content: space-between;
370
+ gap: 0.5rem;
371
+ font-size: 0.72rem;
372
+ color: var(--ink-muted);
373
+ margin-bottom: 0.35rem;
374
+ }
375
+
376
+ .Ink-Comments__body {
377
+ margin: 0;
378
+ font-size: 0.88rem;
379
+ }
380
+
381
+ .Ink-Comments__reply {
382
+ margin-top: 0.5rem;
383
+ padding-left: 0.65rem;
384
+ border-left: 2px solid var(--ink-accent-soft);
385
+ }
386
+
387
+ .Ink-Comments__form {
388
+ display: flex;
389
+ flex-wrap: wrap;
390
+ gap: 0.3rem;
391
+ margin-top: 0.55rem;
392
+ }
393
+
394
+ .Ink-Comments__form input,
395
+ .Ink-Ai__form input,
396
+ .Ink-Ai__translate select {
397
+ flex: 1 1 auto;
398
+ min-width: 0;
399
+ border: 1px solid var(--ink-border);
400
+ border-radius: 0.45rem;
401
+ padding: 0.4rem 0.5rem;
402
+ font: inherit;
403
+ }
404
+
405
+ .Ink-Comments__resolved {
406
+ margin: 0.4rem 0 0;
407
+ font-size: 0.75rem;
408
+ color: var(--ink-muted);
409
+ }
410
+
411
+ .Ink-Ai {
412
+ width: 320px;
413
+ flex: 0 0 320px;
414
+ border-left: 1px solid var(--ink-ai-border, var(--ink-border));
415
+ background: var(--ink-ai-surface, #f8fafc);
416
+ display: flex;
417
+ flex-direction: column;
418
+ max-height: 100%;
419
+ }
420
+
421
+ .Ink-Ai[data-placement='floating'] {
422
+ position: absolute;
423
+ right: 1rem;
424
+ top: 3.5rem;
425
+ z-index: 6;
426
+ border: 1px solid var(--ink-ai-border, var(--ink-border));
427
+ border-radius: 0.85rem;
428
+ box-shadow: 0 16px 40px rgb(15 23 42 / 0.14);
429
+ max-height: min(28rem, 70vh);
430
+ }
431
+
432
+ .Ink-Ai[data-placement='drawer'] {
433
+ position: absolute;
434
+ inset: 0 0 0 auto;
435
+ z-index: 6;
436
+ box-shadow: -8px 0 24px rgb(15 23 42 / 0.08);
437
+ }
438
+
439
+ .Ink-Ai__tabs {
440
+ display: flex;
441
+ flex-wrap: wrap;
442
+ gap: 0.2rem;
443
+ padding: 0.4rem 0.55rem;
444
+ border-bottom: 1px solid var(--ink-ai-border, var(--ink-border));
445
+ }
446
+
447
+ .Ink-Ai__body {
448
+ flex: 1 1 auto;
449
+ overflow: auto;
450
+ padding: 0.65rem;
451
+ display: flex;
452
+ flex-direction: column;
453
+ gap: 0.65rem;
454
+ }
455
+
456
+ .Ink-Ai__history {
457
+ display: flex;
458
+ flex-direction: column;
459
+ gap: 0.45rem;
460
+ min-height: 8rem;
461
+ }
462
+
463
+ .Ink-Ai__turn {
464
+ border-radius: 0.55rem;
465
+ padding: 0.5rem 0.6rem;
466
+ background: #fff;
467
+ border: 1px solid var(--ink-border);
468
+ font-size: 0.85rem;
469
+ }
470
+
471
+ .Ink-Ai__turn span {
472
+ display: block;
473
+ font-size: 0.68rem;
474
+ text-transform: uppercase;
475
+ letter-spacing: 0.04em;
476
+ color: var(--ink-muted);
477
+ margin-bottom: 0.2rem;
478
+ }
479
+
480
+ .Ink-Ai__turn p {
481
+ margin: 0;
482
+ }
483
+
484
+ .Ink-Ai__turn--user {
485
+ border-color: rgb(13 148 136 / 0.35);
486
+ background: rgb(13 148 136 / 0.06);
487
+ }
488
+
489
+ .Ink-Ai__form,
490
+ .Ink-Ai__diff-actions,
491
+ .Ink-Ai__actions {
492
+ display: flex;
493
+ flex-wrap: wrap;
494
+ gap: 0.35rem;
495
+ }
496
+
497
+ .Ink-Ai__action {
498
+ width: 100%;
499
+ justify-content: flex-start;
500
+ text-align: left;
501
+ background: #fff;
502
+ border: 1px solid var(--ink-border) !important;
503
+ }
504
+
505
+ .Ink-Ai__suggestion {
506
+ border: 1px solid var(--ink-border);
507
+ border-radius: 0.55rem;
508
+ padding: 0.55rem;
509
+ background: #fff;
510
+ font-size: 0.85rem;
511
+ }
512
+
513
+ .Ink-Ai__suggestion--warning {
514
+ border-color: #fbbf24;
515
+ }
516
+
517
+ .Ink-Ai__suggestion--error {
518
+ border-color: #f87171;
519
+ }
520
+
521
+ .Ink-Ai__suggestion p {
522
+ margin: 0.25rem 0;
523
+ }
524
+
525
+ .Ink-Ai__suggestion code {
526
+ display: block;
527
+ font-size: 0.75rem;
528
+ color: var(--ink-muted);
529
+ }
530
+
531
+ .Ink-Ai__translate label {
532
+ display: flex;
533
+ flex-direction: column;
534
+ gap: 0.3rem;
535
+ font-size: 0.8rem;
536
+ color: var(--ink-muted);
537
+ }
538
+
539
+ .Ink-Ai__diff {
540
+ border: 1px solid rgb(13 148 136 / 0.35);
541
+ border-radius: 0.65rem;
542
+ padding: 0.65rem;
543
+ background: #fff;
544
+ }
545
+
546
+ .Ink-Ai__diff-preview {
547
+ margin: 0.4rem 0;
548
+ padding: 0.45rem;
549
+ border-radius: 0.4rem;
550
+ background: rgb(13 148 136 / 0.06);
551
+ font-size: 0.85rem;
552
+ }
553
+
554
+ .Ink-Ai__footer {
555
+ padding: 0.4rem 0.75rem;
556
+ border-top: 1px solid var(--ink-ai-border, var(--ink-border));
557
+ font-size: 0.7rem;
558
+ color: var(--ink-muted);
559
+ }
560
+
561
+ @media (max-width: 900px) {
562
+ .Ink-Editor__shell {
563
+ flex-direction: column;
564
+ }
565
+
566
+ .Ink-Comments,
567
+ .Ink-Ai {
568
+ width: 100%;
569
+ flex: none;
570
+ border-left: 0;
571
+ border-top: 1px solid var(--ink-border);
572
+ max-height: 16rem;
573
+ }
574
+
575
+ .Ink-Ai[data-placement='floating'],
576
+ .Ink-Ai[data-placement='drawer'] {
577
+ position: static;
578
+ box-shadow: none;
579
+ max-height: 16rem;
580
+ }
581
+ }
582
+
139
583
  @media (prefers-color-scheme: dark) {
140
584
  .Ink-Editor {
141
585
  --ink-border: #3f3f46;
@@ -145,6 +589,7 @@
145
589
  --ink-muted: #a1a1aa;
146
590
  --ink-accent: #2dd4bf;
147
591
  --ink-accent-soft: rgb(45 212 191 / 0.15);
592
+ --ink-shadow: 0 10px 40px rgb(0 0 0 / 0.35);
148
593
  }
149
594
  }
150
595
 
@@ -157,7 +602,7 @@
157
602
  --ink-muted: #6b7280;
158
603
  --ink-accent: #0f766e;
159
604
  --ink-accent-soft: #ccfbf1;
160
- border-radius: 0.25rem;
605
+ border-radius: 0.75rem;
161
606
  }
162
607
 
163
608
  .ink-theme-bubble .Ink-Editor,
@@ -198,6 +643,6 @@
198
643
  }
199
644
 
200
645
  .ink-theme-minimal .Ink-Editor__toolbar,
201
- .Ink-Editor.ink-theme-minimal .Ink-Editor__toolbar {
202
- border-bottom-style: dashed;
646
+ .ink-theme-minimal.Ink-Editor .Ink-Editor__toolbar {
647
+ border-bottom: 1px solid var(--ink-border);
203
648
  }
@@ -1,13 +1,67 @@
1
- export type InkAiCapability = 'rewrite' | 'summarize' | 'expand' | 'tone' | 'translate';
1
+ import { InkAiPlacement } from './features.types';
2
+ export type InkAiCapability = 'chat' | 'rewrite' | 'summarize' | 'expand' | 'tone' | 'translate' | 'review' | 'quickAction' | 'suggestDiff';
3
+ export interface InkAiChatTurn {
4
+ id: string;
5
+ role: 'user' | 'assistant' | 'system';
6
+ content: string;
7
+ timestamp: number;
8
+ capability?: InkAiCapability;
9
+ }
10
+ export interface InkAiDiffSuggestion {
11
+ id: string;
12
+ originalHtml: string;
13
+ suggestedHtml: string;
14
+ summary: string;
15
+ }
16
+ export interface InkAiReviewSuggestion {
17
+ id: string;
18
+ message: string;
19
+ severity: 'info' | 'warning' | 'error';
20
+ originalText: string;
21
+ suggestedText: string;
22
+ }
2
23
  export interface InkAiRequest {
3
24
  capability: InkAiCapability;
4
25
  html: string;
5
26
  selectionHtml?: string;
27
+ prompt?: string;
28
+ history?: InkAiChatTurn[];
6
29
  options?: Record<string, string>;
30
+ modelId?: string;
31
+ contextFiles?: InkAiContextFile[];
32
+ documentSnapshot?: InkAiDocumentSnapshot;
7
33
  }
8
34
  export interface InkAiResponse {
9
- html: string;
35
+ html?: string;
36
+ text?: string;
10
37
  meta?: Record<string, string>;
38
+ diff?: InkAiDiffSuggestion;
39
+ reviewSuggestions?: InkAiReviewSuggestion[];
40
+ turns?: InkAiChatTurn[];
41
+ }
42
+ export interface InkAiContextFile {
43
+ id: string;
44
+ name: string;
45
+ mimeType: string;
46
+ content: string;
47
+ }
48
+ export interface InkAiDocumentSnapshot {
49
+ html: string;
50
+ selectionHtml?: string;
51
+ commentCount?: number;
52
+ trackChangeCount?: number;
53
+ }
54
+ export interface InkAiModelCatalogEntry {
55
+ id: string;
56
+ provider: 'anthropic' | 'google' | 'openai' | 'custom' | 'demo';
57
+ label: string;
58
+ family: string;
59
+ }
60
+ export interface InkAiProvider {
61
+ id: string;
62
+ name: string;
63
+ models: InkAiModelCatalogEntry[];
64
+ run: (request: InkAiRequest) => Promise<InkAiResponse>;
11
65
  }
12
66
  export interface InkAiAgent {
13
67
  id: string;
@@ -15,11 +69,66 @@ export interface InkAiAgent {
15
69
  capabilities: InkAiCapability[];
16
70
  run: (request: InkAiRequest) => Promise<InkAiResponse>;
17
71
  }
72
+ export interface InkAiCostControlHooks {
73
+ cacheGet?: (key: string) => Promise<InkAiResponse | undefined>;
74
+ cacheSet?: (key: string, value: InkAiResponse) => Promise<void>;
75
+ rateLimitCheck?: (key: string) => Promise<boolean>;
76
+ preferCheaperModel?: (capability: InkAiCapability, modelId?: string) => string | undefined;
77
+ }
78
+ export interface InkAiModerationHook {
79
+ screen: (request: InkAiRequest) => Promise<{
80
+ allowed: boolean;
81
+ reason?: string;
82
+ }>;
83
+ }
84
+ export interface InkAiPermissionsHook {
85
+ canUse: (capability: InkAiCapability, modelId?: string) => boolean;
86
+ }
87
+ export interface InkAiExternalKnowledgeHook {
88
+ retrieve: (query: string) => Promise<string[]>;
89
+ }
90
+ export interface InkAiQualityEvalHook {
91
+ evaluate: (request: InkAiRequest, response: InkAiResponse) => Promise<{
92
+ score: number;
93
+ notes?: string;
94
+ }>;
95
+ }
96
+ export interface InkAiFallbackChain {
97
+ providerIds: string[];
98
+ }
99
+ export interface InkAiUiTheme {
100
+ accent?: string;
101
+ surface?: string;
102
+ border?: string;
103
+ className?: string;
104
+ }
105
+ export interface InkAiConfig {
106
+ enabled?: boolean;
107
+ placement?: InkAiPlacement;
108
+ openOnInit?: boolean;
109
+ providerId?: string;
110
+ modelId?: string;
111
+ uiTheme?: InkAiUiTheme;
112
+ className?: string;
113
+ showHistory?: boolean;
114
+ costControl?: InkAiCostControlHooks;
115
+ moderation?: InkAiModerationHook;
116
+ permissions?: InkAiPermissionsHook;
117
+ externalKnowledge?: InkAiExternalKnowledgeHook;
118
+ qualityEval?: InkAiQualityEvalHook;
119
+ fallbackChain?: InkAiFallbackChain;
120
+ }
18
121
  export interface InkAiPlugin {
19
122
  register: (agent: InkAiAgent) => void;
20
123
  unregister: (agentId: string) => void;
21
124
  getAgent: (agentId: string) => InkAiAgent | undefined;
22
125
  listAgents: () => InkAiAgent[];
23
126
  run: (agentId: string, request: InkAiRequest) => Promise<InkAiResponse>;
127
+ registerProvider: (provider: InkAiProvider) => void;
128
+ unregisterProvider: (providerId: string) => void;
129
+ getProvider: (providerId: string) => InkAiProvider | undefined;
130
+ listProviders: () => InkAiProvider[];
131
+ runProvider: (providerId: string, request: InkAiRequest) => Promise<InkAiResponse>;
132
+ exportHistory: (turns: InkAiChatTurn[]) => string;
24
133
  }
25
134
  //# sourceMappingURL=ai.types.d.ts.map