@bitbaum/chatkit 0.2.1

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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/dist/attachments.d.ts +72 -0
  4. package/dist/attachments.d.ts.map +1 -0
  5. package/dist/attachments.js +64 -0
  6. package/dist/attachments.js.map +1 -0
  7. package/dist/composer.d.ts +34 -0
  8. package/dist/composer.d.ts.map +1 -0
  9. package/dist/composer.js +41 -0
  10. package/dist/composer.js.map +1 -0
  11. package/dist/dictation.d.ts +60 -0
  12. package/dist/dictation.d.ts.map +1 -0
  13. package/dist/dictation.js +93 -0
  14. package/dist/dictation.js.map +1 -0
  15. package/dist/index.d.ts +11 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +11 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/markdown.d.ts +64 -0
  20. package/dist/markdown.d.ts.map +1 -0
  21. package/dist/markdown.js +129 -0
  22. package/dist/markdown.js.map +1 -0
  23. package/dist/react/Composer.d.ts +85 -0
  24. package/dist/react/Composer.d.ts.map +1 -0
  25. package/dist/react/Composer.js +132 -0
  26. package/dist/react/Composer.js.map +1 -0
  27. package/dist/react/Markdown.d.ts +27 -0
  28. package/dist/react/Markdown.d.ts.map +1 -0
  29. package/dist/react/Markdown.js +62 -0
  30. package/dist/react/Markdown.js.map +1 -0
  31. package/dist/react/Thread.d.ts +90 -0
  32. package/dist/react/Thread.d.ts.map +1 -0
  33. package/dist/react/Thread.js +64 -0
  34. package/dist/react/Thread.js.map +1 -0
  35. package/dist/react/hooks.d.ts +40 -0
  36. package/dist/react/hooks.d.ts.map +1 -0
  37. package/dist/react/hooks.js +99 -0
  38. package/dist/react/hooks.js.map +1 -0
  39. package/dist/react/icons.d.ts +12 -0
  40. package/dist/react/icons.d.ts.map +1 -0
  41. package/dist/react/icons.js +21 -0
  42. package/dist/react/icons.js.map +1 -0
  43. package/dist/react/index.d.ts +21 -0
  44. package/dist/react/index.d.ts.map +1 -0
  45. package/dist/react/index.js +16 -0
  46. package/dist/react/index.js.map +1 -0
  47. package/dist/react/use-attachments.d.ts +26 -0
  48. package/dist/react/use-attachments.d.ts.map +1 -0
  49. package/dist/react/use-attachments.js +202 -0
  50. package/dist/react/use-attachments.js.map +1 -0
  51. package/dist/react/use-dictation.d.ts +49 -0
  52. package/dist/react/use-dictation.d.ts.map +1 -0
  53. package/dist/react/use-dictation.js +365 -0
  54. package/dist/react/use-dictation.js.map +1 -0
  55. package/dist/scroll.d.ts +13 -0
  56. package/dist/scroll.d.ts.map +1 -0
  57. package/dist/scroll.js +11 -0
  58. package/dist/scroll.js.map +1 -0
  59. package/package.json +83 -0
  60. package/styles.css +689 -0
package/styles.css ADDED
@@ -0,0 +1,689 @@
1
+ /*
2
+ * @bitbaum/chatkit — the look of the one chat.
3
+ *
4
+ * Every colour, radius and face is a --ck-* variable. By default they read
5
+ * @bitbaum/design-tokens' HSL-triplet variables, so apps on those tokens match
6
+ * without doing anything. An app whose variables are full colours (loki's are
7
+ * OKLCH under the same names) maps them once — `:root { --ck-bg:
8
+ * var(--surface-base); … }` — and any other app sets --ck-* to keep its own
9
+ * look. The BEHAVIOUR is what is shared, and it is not configurable.
10
+ *
11
+ * Non-negotiable, and why:
12
+ * - 16px text in the input and the messages: under 16px iOS zooms the whole
13
+ * page when the input is focused (loki globals.css).
14
+ * - 44px touch targets on every control (WCAG 2.5.8, loki's audit).
15
+ * - Nothing wider than its container at 320px (min-width: 0 on flex rows —
16
+ * heidi composer.tsx).
17
+ */
18
+
19
+ :where(:root) {
20
+ /* Defaults at ZERO specificity on the root: an app's own :root (or any
21
+ container) rule setting a --ck-* variable always wins. Declaring these on
22
+ the chat's elements instead would silently override the app. */
23
+ --ck-bg: hsl(var(--surface-base, 0 0% 100%));
24
+ --ck-raised: hsl(var(--surface-raised, 0 0% 96%));
25
+ --ck-overlay: hsl(var(--surface-overlay, 0 0% 98%));
26
+ --ck-fg: hsl(var(--text-primary, 0 0% 10%));
27
+ --ck-fg-2: hsl(var(--text-secondary, 0 0% 30%));
28
+ --ck-fg-3: hsl(var(--text-tertiary, 0 0% 42%));
29
+ --ck-muted: hsl(var(--text-muted, 0 0% 50%));
30
+ --ck-line: hsl(var(--border-subtle, 0 0% 90%));
31
+ --ck-line-2: hsl(var(--border-default, 0 0% 82%));
32
+ --ck-accent: var(--accent-primary, #ff5c00);
33
+ --ck-on-accent: hsl(var(--on-accent, 0 0% 8%));
34
+ --ck-accent-soft: color-mix(in srgb, var(--ck-accent) 14%, transparent);
35
+ --ck-danger: hsl(var(--status-negative, 0 65% 50%));
36
+ --ck-danger-soft: color-mix(in srgb, var(--ck-danger) 12%, transparent);
37
+ --ck-on-danger: #fff;
38
+ --ck-warning: hsl(var(--status-warning, 38 92% 45%));
39
+ --ck-radius: 1rem;
40
+ --ck-radius-sm: var(--radius-control, 0.5rem);
41
+ --ck-font: var(--font-sans, system-ui, -apple-system, "Segoe UI", sans-serif);
42
+ --ck-mono: var(--font-mono, ui-monospace, "SF Mono", Menlo, monospace);
43
+ --ck-text: 1rem;
44
+ --ck-leading: 1.6;
45
+ --ck-target: 2.75rem;
46
+ }
47
+
48
+ .ck-composer-wrap,
49
+ .ck-thread-wrap,
50
+ .ck-starters {
51
+ font-family: var(--ck-font);
52
+ color: var(--ck-fg);
53
+ }
54
+
55
+ .ck-composer-wrap *,
56
+ .ck-thread-wrap *,
57
+ .ck-starters * {
58
+ box-sizing: border-box;
59
+ }
60
+
61
+ /* ── composer ───────────────────────────────────────────────────────────── */
62
+ .ck-composer-wrap {
63
+ display: flex;
64
+ flex-direction: column;
65
+ gap: 0.5rem;
66
+ min-width: 0;
67
+ }
68
+ .ck-composer-frame {
69
+ position: relative;
70
+ min-width: 0;
71
+ }
72
+ .ck-composer {
73
+ display: flex;
74
+ flex-direction: column;
75
+ gap: 0.5rem;
76
+ min-width: 0;
77
+ padding: 0.75rem 0.75rem 0.625rem;
78
+ border: 1px solid var(--ck-line);
79
+ border-radius: var(--ck-radius);
80
+ background: var(--ck-bg);
81
+ transition: border-color 0.15s ease;
82
+ }
83
+ .ck-composer:focus-within {
84
+ border-color: var(--ck-line-2);
85
+ }
86
+ .ck-composer-compact {
87
+ gap: 0.375rem;
88
+ padding: 0.5rem;
89
+ border-radius: calc(var(--ck-radius) * 0.75);
90
+ }
91
+ .ck-input {
92
+ display: block;
93
+ width: 100%;
94
+ min-height: 2.5rem;
95
+ max-height: 15rem;
96
+ resize: none;
97
+ overflow-y: auto;
98
+ padding: 0.375rem 0.25rem;
99
+ border: 0;
100
+ outline: none;
101
+ background: transparent;
102
+ color: var(--ck-fg);
103
+ font: inherit;
104
+ font-size: max(16px, var(--ck-text));
105
+ line-height: var(--ck-leading);
106
+ }
107
+ .ck-input::placeholder {
108
+ color: var(--ck-muted);
109
+ }
110
+ .ck-actions {
111
+ display: flex;
112
+ align-items: center;
113
+ justify-content: space-between;
114
+ gap: 0.5rem;
115
+ min-width: 0;
116
+ }
117
+ .ck-tools {
118
+ display: flex;
119
+ flex-wrap: wrap;
120
+ align-items: center;
121
+ gap: 0.375rem;
122
+ min-width: 0;
123
+ }
124
+ .ck-submit {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: 0.5rem;
128
+ flex-shrink: 0;
129
+ }
130
+ .ck-hint {
131
+ min-width: 0;
132
+ overflow: hidden;
133
+ text-overflow: ellipsis;
134
+ white-space: nowrap;
135
+ color: var(--ck-muted);
136
+ font-size: 0.8125rem;
137
+ }
138
+ @media (max-width: 480px) {
139
+ .ck-hint {
140
+ display: none;
141
+ }
142
+ }
143
+ .ck-icon-btn,
144
+ .ck-send {
145
+ display: inline-flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ flex-shrink: 0;
149
+ min-width: var(--ck-target);
150
+ min-height: var(--ck-target);
151
+ padding: 0;
152
+ border-radius: 999px;
153
+ font-size: 1.125rem;
154
+ cursor: pointer;
155
+ transition:
156
+ background 0.15s ease,
157
+ color 0.15s ease,
158
+ border-color 0.15s ease,
159
+ opacity 0.15s ease;
160
+ }
161
+ .ck-icon-btn {
162
+ border: 1px solid var(--ck-line);
163
+ background: var(--ck-raised);
164
+ color: var(--ck-fg-2);
165
+ }
166
+ .ck-icon-btn:hover:not(:disabled) {
167
+ border-color: var(--ck-line-2);
168
+ color: var(--ck-fg);
169
+ }
170
+ .ck-mic-on {
171
+ border-color: var(--ck-danger);
172
+ background: var(--ck-danger-soft);
173
+ color: var(--ck-danger);
174
+ }
175
+ .ck-send {
176
+ border: 0;
177
+ background: var(--ck-accent);
178
+ color: var(--ck-on-accent);
179
+ }
180
+ .ck-send:hover:not(:disabled) {
181
+ opacity: 0.9;
182
+ }
183
+ .ck-send:disabled,
184
+ .ck-icon-btn:disabled {
185
+ cursor: not-allowed;
186
+ opacity: 0.45;
187
+ }
188
+ .ck-send:disabled {
189
+ background: var(--ck-raised);
190
+ color: var(--ck-muted);
191
+ opacity: 1;
192
+ }
193
+ .ck-send-stop {
194
+ background: var(--ck-raised);
195
+ color: var(--ck-fg);
196
+ border: 1px solid var(--ck-line-2);
197
+ }
198
+ :where(.ck-composer-wrap, .ck-thread-wrap, .ck-starters) button:focus-visible,
199
+ .ck-input:focus-visible {
200
+ outline: 2px solid var(--ck-accent);
201
+ outline-offset: 2px;
202
+ }
203
+ .ck-input:focus-visible {
204
+ outline: none;
205
+ }
206
+ .ck-modes {
207
+ display: flex;
208
+ flex-wrap: wrap;
209
+ gap: 0.25rem;
210
+ }
211
+ .ck-mode {
212
+ min-height: 2rem;
213
+ padding: 0 0.75rem;
214
+ border: 1px solid var(--ck-line);
215
+ border-radius: 999px;
216
+ background: transparent;
217
+ color: var(--ck-fg-2);
218
+ font: inherit;
219
+ font-size: 0.875rem;
220
+ cursor: pointer;
221
+ }
222
+ .ck-mode[aria-pressed="true"] {
223
+ border-color: var(--ck-accent);
224
+ background: var(--ck-accent-soft);
225
+ color: var(--ck-fg);
226
+ }
227
+
228
+ /* voice: the bar covers the box while a take is live, so what is happening —
229
+ and how to keep or throw it away — is unmissable */
230
+ .ck-voice-bar {
231
+ position: absolute;
232
+ inset: 0;
233
+ z-index: 2;
234
+ display: flex;
235
+ align-items: center;
236
+ gap: 0.75rem;
237
+ padding: 0 0.75rem;
238
+ border: 1px solid var(--ck-line-2);
239
+ border-radius: var(--ck-radius);
240
+ background: var(--ck-bg);
241
+ color: var(--ck-fg-2);
242
+ }
243
+ .ck-voice-dot {
244
+ width: 0.625rem;
245
+ height: 0.625rem;
246
+ flex-shrink: 0;
247
+ border-radius: 999px;
248
+ background: var(--ck-danger);
249
+ animation: ck-pulse 1.2s ease-in-out infinite;
250
+ }
251
+ .ck-voice-wave {
252
+ display: flex;
253
+ flex: 1;
254
+ align-items: center;
255
+ justify-content: center;
256
+ gap: 0.25rem;
257
+ height: 1.75rem;
258
+ min-width: 0;
259
+ overflow: hidden;
260
+ }
261
+ .ck-voice-wave > span {
262
+ width: 0.25rem;
263
+ height: 100%;
264
+ border-radius: 999px;
265
+ background: var(--ck-accent);
266
+ transform: scaleY(0.3);
267
+ animation: ck-wave 1s ease-in-out infinite;
268
+ }
269
+ .ck-voice-wave > span:nth-child(2n) {
270
+ animation-delay: -0.3s;
271
+ }
272
+ .ck-voice-wave > span:nth-child(3n) {
273
+ animation-delay: -0.6s;
274
+ }
275
+ .ck-voice-wave > span:nth-child(5n) {
276
+ animation-delay: -0.8s;
277
+ }
278
+ .ck-voice-timer {
279
+ flex-shrink: 0;
280
+ font-size: 0.9375rem;
281
+ font-variant-numeric: tabular-nums;
282
+ }
283
+ .ck-voice-confirm {
284
+ display: inline-flex;
285
+ align-items: center;
286
+ justify-content: center;
287
+ min-width: var(--ck-target);
288
+ min-height: var(--ck-target);
289
+ border: 0;
290
+ border-radius: 999px;
291
+ background: var(--ck-danger);
292
+ color: var(--ck-on-danger);
293
+ font-size: 1.125rem;
294
+ cursor: pointer;
295
+ }
296
+ .ck-problem {
297
+ display: flex;
298
+ align-items: flex-start;
299
+ gap: 0.5rem;
300
+ margin: 0;
301
+ padding: 0.5rem 0.625rem;
302
+ border: 1px solid color-mix(in srgb, var(--ck-warning) 40%, transparent);
303
+ border-radius: var(--ck-radius-sm);
304
+ color: var(--ck-fg-2);
305
+ font-size: 0.9375rem;
306
+ line-height: 1.45;
307
+ }
308
+ .ck-problem > span {
309
+ flex: 1;
310
+ min-width: 0;
311
+ }
312
+ .ck-problem-x {
313
+ display: inline-flex;
314
+ flex-shrink: 0;
315
+ padding: 0.125rem;
316
+ border: 0;
317
+ background: transparent;
318
+ color: var(--ck-muted);
319
+ cursor: pointer;
320
+ }
321
+
322
+ /* attachments */
323
+ .ck-attach-strip {
324
+ display: flex;
325
+ flex-wrap: wrap;
326
+ align-items: center;
327
+ gap: 0.5rem;
328
+ }
329
+ .ck-attach-item {
330
+ position: relative;
331
+ }
332
+ .ck-attach-thumb {
333
+ display: block;
334
+ width: 3.5rem;
335
+ height: 3.5rem;
336
+ object-fit: cover;
337
+ border: 1px solid var(--ck-line);
338
+ border-radius: var(--ck-radius-sm);
339
+ }
340
+ .ck-attach-file {
341
+ display: flex;
342
+ align-items: center;
343
+ gap: 0.375rem;
344
+ max-width: 11rem;
345
+ height: 3.5rem;
346
+ padding: 0 0.5rem;
347
+ border: 1px solid var(--ck-line);
348
+ border-radius: var(--ck-radius-sm);
349
+ background: var(--ck-raised);
350
+ color: var(--ck-fg-2);
351
+ font-size: 0.8125rem;
352
+ }
353
+ .ck-attach-remove {
354
+ position: absolute;
355
+ top: -0.5rem;
356
+ right: -0.5rem;
357
+ display: inline-flex;
358
+ align-items: center;
359
+ justify-content: center;
360
+ width: 1.5rem;
361
+ height: 1.5rem;
362
+ border: 1px solid var(--ck-line-2);
363
+ border-radius: 999px;
364
+ background: var(--ck-overlay);
365
+ color: var(--ck-fg-2);
366
+ font-size: 0.75rem;
367
+ cursor: pointer;
368
+ }
369
+ .ck-attach-remove::after {
370
+ content: "";
371
+ position: absolute;
372
+ inset: -0.625rem;
373
+ }
374
+ .ck-note {
375
+ border: 0;
376
+ background: transparent;
377
+ color: var(--ck-warning);
378
+ font: inherit;
379
+ font-size: 0.8125rem;
380
+ text-align: left;
381
+ cursor: pointer;
382
+ }
383
+ .ck-truncate {
384
+ min-width: 0;
385
+ overflow: hidden;
386
+ text-overflow: ellipsis;
387
+ white-space: nowrap;
388
+ }
389
+
390
+ /* ── thread ─────────────────────────────────────────────────────────────── */
391
+ .ck-thread-wrap {
392
+ position: relative;
393
+ display: flex;
394
+ flex: 1;
395
+ flex-direction: column;
396
+ min-height: 0;
397
+ min-width: 0;
398
+ }
399
+ .ck-thread {
400
+ display: flex;
401
+ flex: 1;
402
+ flex-direction: column;
403
+ min-height: 0;
404
+ overflow-y: auto;
405
+ overscroll-behavior: contain;
406
+ padding: 0.5rem 0;
407
+ }
408
+ .ck-thread-inner {
409
+ display: flex;
410
+ flex-direction: column;
411
+ gap: 1.25rem;
412
+ margin-top: auto;
413
+ min-width: 0;
414
+ }
415
+ .ck-thread-loading {
416
+ display: flex;
417
+ flex: 1;
418
+ align-items: center;
419
+ justify-content: center;
420
+ color: var(--ck-muted);
421
+ }
422
+ .ck-turn {
423
+ display: flex;
424
+ flex-direction: column;
425
+ min-width: 0;
426
+ }
427
+ .ck-turn-user {
428
+ align-items: flex-end;
429
+ }
430
+ .ck-bubble {
431
+ max-width: min(85%, 42rem);
432
+ padding: 0.625rem 1rem;
433
+ border-radius: calc(var(--ck-radius) * 1.25);
434
+ background: var(--ck-accent-soft);
435
+ color: var(--ck-fg);
436
+ font-size: var(--ck-text);
437
+ line-height: var(--ck-leading);
438
+ white-space: pre-wrap;
439
+ overflow-wrap: anywhere;
440
+ }
441
+ .ck-speaker {
442
+ margin-bottom: 0.25rem;
443
+ color: var(--ck-fg-3);
444
+ font-family: var(--ck-mono);
445
+ font-size: 0.75rem;
446
+ letter-spacing: 0.08em;
447
+ text-transform: uppercase;
448
+ }
449
+ .ck-turn-actions {
450
+ display: flex;
451
+ gap: 0.25rem;
452
+ margin-top: 0.25rem;
453
+ }
454
+ .ck-action {
455
+ display: inline-flex;
456
+ align-items: center;
457
+ gap: 0.375rem;
458
+ min-height: 2.25rem;
459
+ padding: 0 0.5rem;
460
+ border: 0;
461
+ border-radius: var(--ck-radius-sm);
462
+ background: transparent;
463
+ color: var(--ck-muted);
464
+ font: inherit;
465
+ font-size: 0.875rem;
466
+ cursor: pointer;
467
+ }
468
+ .ck-action:hover {
469
+ background: var(--ck-raised);
470
+ color: var(--ck-fg-2);
471
+ }
472
+ @media (hover: hover) {
473
+ .ck-turn-answer .ck-turn-actions {
474
+ opacity: 0;
475
+ transition: opacity 0.15s ease;
476
+ }
477
+ .ck-turn-answer:hover .ck-turn-actions,
478
+ .ck-turn-answer:focus-within .ck-turn-actions,
479
+ .ck-turn-pinned .ck-turn-actions {
480
+ opacity: 1;
481
+ }
482
+ }
483
+ .ck-failed {
484
+ margin: 0;
485
+ padding: 0.625rem 0.875rem;
486
+ border: 1px solid color-mix(in srgb, var(--ck-danger) 35%, transparent);
487
+ border-radius: var(--ck-radius-sm);
488
+ background: var(--ck-danger-soft);
489
+ color: var(--ck-fg);
490
+ font-size: var(--ck-text);
491
+ }
492
+ .ck-live {
493
+ display: flex;
494
+ align-items: center;
495
+ gap: 0.5rem;
496
+ margin: 0;
497
+ color: var(--ck-fg-3);
498
+ font-size: var(--ck-text);
499
+ }
500
+ .ck-dots {
501
+ display: inline-flex;
502
+ gap: 0.25rem;
503
+ }
504
+ .ck-dots > span {
505
+ width: 0.375rem;
506
+ height: 0.375rem;
507
+ border-radius: 999px;
508
+ background: var(--ck-muted);
509
+ animation: ck-dot 1.2s ease-in-out infinite;
510
+ }
511
+ .ck-dots > span:nth-child(2) {
512
+ animation-delay: 0.15s;
513
+ }
514
+ .ck-dots > span:nth-child(3) {
515
+ animation-delay: 0.3s;
516
+ }
517
+ .ck-stop {
518
+ display: inline-flex;
519
+ align-items: center;
520
+ gap: 0.375rem;
521
+ align-self: flex-start;
522
+ min-height: 2.25rem;
523
+ margin-top: 0.5rem;
524
+ padding: 0 0.875rem;
525
+ border: 1px solid var(--ck-line);
526
+ border-radius: 999px;
527
+ background: transparent;
528
+ color: var(--ck-fg-3);
529
+ font: inherit;
530
+ font-size: 0.875rem;
531
+ cursor: pointer;
532
+ }
533
+ .ck-stopped {
534
+ margin: 0;
535
+ color: var(--ck-muted);
536
+ }
537
+ .ck-jump {
538
+ position: absolute;
539
+ bottom: 0.75rem;
540
+ left: 50%;
541
+ transform: translateX(-50%);
542
+ display: inline-flex;
543
+ align-items: center;
544
+ justify-content: center;
545
+ width: var(--ck-target);
546
+ height: var(--ck-target);
547
+ border: 1px solid var(--ck-line-2);
548
+ border-radius: 999px;
549
+ background: var(--ck-overlay);
550
+ color: var(--ck-fg-2);
551
+ font-size: 1.125rem;
552
+ cursor: pointer;
553
+ box-shadow: 0 6px 20px -8px rgb(0 0 0 / 0.35);
554
+ }
555
+
556
+ /* markdown: 16px, readable measure, no leaked ** or > */
557
+ .ck-md {
558
+ min-width: 0;
559
+ color: var(--ck-fg);
560
+ font-size: var(--ck-text);
561
+ line-height: var(--ck-leading);
562
+ overflow-wrap: anywhere;
563
+ }
564
+ .ck-md > * {
565
+ margin: 0;
566
+ }
567
+ .ck-md > * + * {
568
+ margin-top: 0.75em;
569
+ }
570
+ .ck-md ul,
571
+ .ck-md ol {
572
+ padding-left: 1.25em;
573
+ }
574
+ .ck-md li + li {
575
+ margin-top: 0.25em;
576
+ }
577
+ .ck-md-h {
578
+ font-weight: 650;
579
+ }
580
+ .ck-md blockquote {
581
+ padding-left: 0.875em;
582
+ border-left: 3px solid var(--ck-line-2);
583
+ color: var(--ck-fg-2);
584
+ }
585
+ .ck-md strong {
586
+ font-weight: 650;
587
+ }
588
+ .ck-code {
589
+ padding: 0.1em 0.35em;
590
+ border-radius: 0.3em;
591
+ background: var(--ck-raised);
592
+ font-family: var(--ck-mono);
593
+ font-size: 0.875em;
594
+ }
595
+ .ck-pre {
596
+ overflow-x: auto;
597
+ padding: 0.75rem 0.875rem;
598
+ border: 1px solid var(--ck-line);
599
+ border-radius: var(--ck-radius-sm);
600
+ background: var(--ck-raised);
601
+ font-family: var(--ck-mono);
602
+ font-size: 0.875rem;
603
+ line-height: 1.55;
604
+ }
605
+ .ck-pre code {
606
+ white-space: pre;
607
+ }
608
+ .ck-link {
609
+ color: inherit;
610
+ text-decoration: underline;
611
+ text-decoration-color: var(--ck-accent);
612
+ text-underline-offset: 0.18em;
613
+ }
614
+ .ck-cite {
615
+ margin-left: 0.15em;
616
+ color: var(--ck-muted);
617
+ font-size: 0.7em;
618
+ cursor: help;
619
+ }
620
+
621
+ /* starters */
622
+ .ck-starters {
623
+ display: flex;
624
+ flex-direction: column;
625
+ gap: 0.75rem;
626
+ min-width: 0;
627
+ }
628
+ .ck-starters-title {
629
+ color: var(--ck-fg-2);
630
+ font-size: var(--ck-text);
631
+ }
632
+ .ck-starters-list {
633
+ display: flex;
634
+ flex-wrap: wrap;
635
+ gap: 0.5rem;
636
+ }
637
+ .ck-starter {
638
+ min-height: var(--ck-target);
639
+ padding: 0.5rem 0.875rem;
640
+ border: 1px solid var(--ck-line);
641
+ border-radius: calc(var(--ck-radius) * 0.75);
642
+ background: var(--ck-bg);
643
+ color: var(--ck-fg-2);
644
+ font: inherit;
645
+ font-size: 0.9375rem;
646
+ text-align: left;
647
+ cursor: pointer;
648
+ }
649
+ .ck-starter:hover {
650
+ border-color: var(--ck-accent);
651
+ color: var(--ck-fg);
652
+ }
653
+
654
+ .ck-spin {
655
+ animation: ck-spin 0.9s linear infinite;
656
+ }
657
+ @keyframes ck-spin {
658
+ to {
659
+ transform: rotate(360deg);
660
+ }
661
+ }
662
+ @keyframes ck-pulse {
663
+ 50% {
664
+ opacity: 0.35;
665
+ }
666
+ }
667
+ @keyframes ck-wave {
668
+ 50% {
669
+ transform: scaleY(1);
670
+ }
671
+ }
672
+ @keyframes ck-dot {
673
+ 0%,
674
+ 80%,
675
+ 100% {
676
+ opacity: 0.3;
677
+ }
678
+ 40% {
679
+ opacity: 1;
680
+ }
681
+ }
682
+ @media (prefers-reduced-motion: reduce) {
683
+ .ck-spin,
684
+ .ck-voice-dot,
685
+ .ck-voice-wave > span,
686
+ .ck-dots > span {
687
+ animation: none;
688
+ }
689
+ }