@blaaiz/docs-core 0.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/chunk-3ZX4WIE3.js +2984 -0
  4. package/dist/chunk-3ZX4WIE3.js.map +1 -0
  5. package/dist/chunk-JCYR6RPE.js +31 -0
  6. package/dist/chunk-JCYR6RPE.js.map +1 -0
  7. package/dist/chunk-ZKOOKLZ3.js +124 -0
  8. package/dist/chunk-ZKOOKLZ3.js.map +1 -0
  9. package/dist/cli.js +534 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/generator.cjs +508 -0
  12. package/dist/generator.cjs.map +1 -0
  13. package/dist/generator.d.cts +122 -0
  14. package/dist/generator.d.ts +122 -0
  15. package/dist/generator.js +177 -0
  16. package/dist/generator.js.map +1 -0
  17. package/dist/index.cjs +3024 -0
  18. package/dist/index.cjs.map +1 -0
  19. package/dist/index.d.cts +1182 -0
  20. package/dist/index.d.ts +1182 -0
  21. package/dist/index.js +3 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/navigation-CGqFIPlP.d.cts +498 -0
  24. package/dist/navigation-CGqFIPlP.d.ts +498 -0
  25. package/dist/openapi-types-CJ6p5Cux.d.cts +78 -0
  26. package/dist/openapi-types-CJ6p5Cux.d.ts +78 -0
  27. package/dist/ui/api-try-it.cjs +654 -0
  28. package/dist/ui/api-try-it.cjs.map +1 -0
  29. package/dist/ui/api-try-it.d.cts +78 -0
  30. package/dist/ui/api-try-it.d.ts +78 -0
  31. package/dist/ui/api-try-it.js +509 -0
  32. package/dist/ui/api-try-it.js.map +1 -0
  33. package/dist/ui/ask-ai.cjs +810 -0
  34. package/dist/ui/ask-ai.cjs.map +1 -0
  35. package/dist/ui/ask-ai.d.cts +57 -0
  36. package/dist/ui/ask-ai.d.ts +57 -0
  37. package/dist/ui/ask-ai.js +808 -0
  38. package/dist/ui/ask-ai.js.map +1 -0
  39. package/dist/ui/copy-page.cjs +312 -0
  40. package/dist/ui/copy-page.cjs.map +1 -0
  41. package/dist/ui/copy-page.d.cts +33 -0
  42. package/dist/ui/copy-page.d.ts +33 -0
  43. package/dist/ui/copy-page.js +183 -0
  44. package/dist/ui/copy-page.js.map +1 -0
  45. package/dist/ui/mermaid.cjs +363 -0
  46. package/dist/ui/mermaid.cjs.map +1 -0
  47. package/dist/ui/mermaid.d.cts +13 -0
  48. package/dist/ui/mermaid.d.ts +13 -0
  49. package/dist/ui/mermaid.js +361 -0
  50. package/dist/ui/mermaid.js.map +1 -0
  51. package/dist/ui.cjs +661 -0
  52. package/dist/ui.cjs.map +1 -0
  53. package/dist/ui.d.cts +428 -0
  54. package/dist/ui.d.ts +428 -0
  55. package/dist/ui.js +537 -0
  56. package/dist/ui.js.map +1 -0
  57. package/package.json +145 -0
  58. package/patches/fumadocs-openapi.patch +173 -0
  59. package/skills/AGENTS-section.md +36 -0
  60. package/skills/SKILL.md +363 -0
  61. package/styles/api-reference.css +1417 -0
  62. package/styles/ask-ai.css +563 -0
  63. package/styles/auth.css +462 -0
  64. package/styles/docs.css +247 -0
  65. package/styles/home.css +376 -0
  66. package/templates/init/content/docs/index.mdx.tmpl +52 -0
  67. package/templates/init/content/docs/meta.json.tmpl +3 -0
  68. package/templates/init/content/docs.json.tmpl +12 -0
  69. package/templates/init/content/nav.json.tmpl +7 -0
  70. package/templates/init/docs.config.ts.tmpl +36 -0
  71. package/templates/init/env.example.tmpl +15 -0
@@ -0,0 +1,563 @@
1
+ /*
2
+ * @blaaiz/docs-core — the Ask AI trigger and panel.
3
+ *
4
+ * Import after docs.css:
5
+ * @import '@blaaiz/docs-core/styles/ask-ai.css';
6
+ *
7
+ * Pairs with <AskAi /> from @blaaiz/docs-core/ui/ask-ai. Every colour is an
8
+ * `--color-fd-*` token, so the panel inherits the site's palette from
9
+ * docs.config; only shadows and the code surfaces get a `.dark` variant, where
10
+ * a token alone cannot carry the weight. No focus rings: docs.css removes them
11
+ * site-wide (house rule), so nothing here adds one back.
12
+ */
13
+
14
+ .askai-root {
15
+ --askai-width: 400px;
16
+ --askai-radius: 12px;
17
+ font-size: 14px;
18
+ line-height: 1.65;
19
+ }
20
+
21
+ /* --- The trigger pill ---------------------------------------------------- */
22
+
23
+ /* Bottom-right, so it clears the top bar, the sidebar, and the API rail on
24
+ every layout the framework ships. */
25
+ .askai-trigger {
26
+ position: fixed;
27
+ right: 1.5rem;
28
+ bottom: 1.5rem;
29
+ z-index: 9990;
30
+ display: inline-flex;
31
+ align-items: center;
32
+ gap: 9px;
33
+ height: 42px;
34
+ padding: 0 8px 0 14px;
35
+ border: 1px solid var(--color-fd-border);
36
+ border-radius: 999px;
37
+ background: var(--color-fd-card);
38
+ color: var(--color-fd-foreground);
39
+ font: inherit;
40
+ font-size: 13.5px;
41
+ font-weight: 500;
42
+ cursor: pointer;
43
+ box-shadow:
44
+ 0 1px 2px rgba(0, 0, 0, 0.05),
45
+ 0 10px 26px -10px rgba(0, 0, 0, 0.28);
46
+ transition:
47
+ border-color 0.15s ease,
48
+ box-shadow 0.15s ease,
49
+ transform 0.15s ease;
50
+ }
51
+
52
+ .askai-trigger:hover {
53
+ border-color: color-mix(in oklab, var(--color-fd-primary) 45%, var(--color-fd-border));
54
+ box-shadow:
55
+ 0 1px 2px rgba(0, 0, 0, 0.06),
56
+ 0 14px 30px -10px rgba(0, 0, 0, 0.32);
57
+ }
58
+
59
+ .dark .askai-trigger {
60
+ box-shadow:
61
+ 0 1px 2px rgba(0, 0, 0, 0.4),
62
+ 0 12px 30px -12px rgba(0, 0, 0, 0.7);
63
+ }
64
+
65
+ .askai-trigger-icon {
66
+ display: inline-flex;
67
+ color: var(--color-fd-primary);
68
+ }
69
+
70
+ .askai-trigger-icon svg {
71
+ width: 16px;
72
+ height: 16px;
73
+ }
74
+
75
+ .askai-trigger-label {
76
+ white-space: nowrap;
77
+ }
78
+
79
+ .askai-kbd {
80
+ padding: 2px 7px;
81
+ border: 1px solid var(--color-fd-border);
82
+ border-radius: 7px;
83
+ background: color-mix(in oklab, var(--color-fd-muted-foreground) 8%, transparent);
84
+ color: var(--color-fd-muted-foreground);
85
+ font-family: inherit;
86
+ font-size: 11.5px;
87
+ line-height: 1.4;
88
+ letter-spacing: 0.01em;
89
+ }
90
+
91
+ @media (max-width: 520px) {
92
+ .askai-trigger-label,
93
+ .askai-kbd {
94
+ display: none;
95
+ }
96
+
97
+ .askai-trigger {
98
+ width: 46px;
99
+ height: 46px;
100
+ padding: 0;
101
+ justify-content: center;
102
+ }
103
+ }
104
+
105
+ /* --- The panel ----------------------------------------------------------- */
106
+
107
+ /* Above the try-it modal (9999) and its portalled popups (10001), so a reader
108
+ can ask a question with the playground open. */
109
+ .askai-panel {
110
+ position: fixed;
111
+ top: 0;
112
+ right: 0;
113
+ z-index: 10010;
114
+ display: flex;
115
+ flex-direction: column;
116
+ width: var(--askai-width);
117
+ max-width: 100vw;
118
+ height: 100dvh;
119
+ border-left: 1px solid var(--color-fd-border);
120
+ background: var(--color-fd-background);
121
+ color: var(--color-fd-foreground);
122
+ box-shadow: -18px 0 48px -24px rgba(0, 0, 0, 0.3);
123
+ }
124
+
125
+ .dark .askai-panel {
126
+ box-shadow: -18px 0 48px -20px rgba(0, 0, 0, 0.75);
127
+ }
128
+
129
+ @media (max-width: 480px) {
130
+ .askai-panel {
131
+ width: 100vw;
132
+ border-left: none;
133
+ }
134
+ }
135
+
136
+ @media (prefers-reduced-motion: no-preference) {
137
+ .askai-panel {
138
+ animation: askai-slide-in 0.24s cubic-bezier(0.22, 0.61, 0.36, 1);
139
+ }
140
+ }
141
+
142
+ @keyframes askai-slide-in {
143
+ from {
144
+ transform: translateX(18px);
145
+ opacity: 0;
146
+ }
147
+
148
+ to {
149
+ transform: translateX(0);
150
+ opacity: 1;
151
+ }
152
+ }
153
+
154
+ /* --- Header -------------------------------------------------------------- */
155
+
156
+ .askai-head {
157
+ flex: none;
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 9px;
161
+ height: 3.5rem;
162
+ padding: 0 0.75rem 0 1.1rem;
163
+ border-bottom: 1px solid var(--color-fd-border);
164
+ }
165
+
166
+ .askai-head-icon {
167
+ display: inline-flex;
168
+ color: var(--color-fd-primary);
169
+ }
170
+
171
+ .askai-head-icon svg {
172
+ width: 16px;
173
+ height: 16px;
174
+ }
175
+
176
+ .askai-head-title {
177
+ flex: 1;
178
+ min-width: 0;
179
+ margin: 0;
180
+ font-size: 14px;
181
+ font-weight: 600;
182
+ letter-spacing: -0.005em;
183
+ }
184
+
185
+ .askai-head-hint {
186
+ padding: 2px 7px;
187
+ border: 1px solid var(--color-fd-border);
188
+ border-radius: 6px;
189
+ color: var(--color-fd-muted-foreground);
190
+ font-size: 11px;
191
+ }
192
+
193
+ .askai-head-btn {
194
+ display: inline-flex;
195
+ align-items: center;
196
+ justify-content: center;
197
+ width: 28px;
198
+ height: 28px;
199
+ border: none;
200
+ border-radius: 8px;
201
+ background: transparent;
202
+ color: var(--color-fd-muted-foreground);
203
+ cursor: pointer;
204
+ transition:
205
+ background 0.15s ease,
206
+ color 0.15s ease;
207
+ }
208
+
209
+ .askai-head-btn svg {
210
+ width: 15px;
211
+ height: 15px;
212
+ }
213
+
214
+ .askai-head-btn:hover:not(:disabled) {
215
+ background: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
216
+ color: var(--color-fd-foreground);
217
+ }
218
+
219
+ .askai-head-btn:disabled {
220
+ opacity: 0.35;
221
+ cursor: default;
222
+ }
223
+
224
+ /* --- Thread -------------------------------------------------------------- */
225
+
226
+ .askai-thread {
227
+ flex: 1;
228
+ min-height: 0;
229
+ overflow-y: auto;
230
+ overscroll-behavior: contain;
231
+ scrollbar-width: thin;
232
+ padding: 1.1rem 1.1rem 1.4rem;
233
+ }
234
+
235
+ .askai-thread > * + * {
236
+ margin-top: 1.1rem;
237
+ }
238
+
239
+ /* Empty state: one friendly line, then the starters. */
240
+ .askai-empty-line {
241
+ margin: 0.25rem 0 0.9rem;
242
+ color: var(--color-fd-muted-foreground);
243
+ font-size: 13.5px;
244
+ }
245
+
246
+ .askai-chips {
247
+ display: flex;
248
+ flex-direction: column;
249
+ gap: 8px;
250
+ }
251
+
252
+ .askai-chip {
253
+ padding: 9px 12px;
254
+ border: 1px solid var(--color-fd-border);
255
+ border-radius: 10px;
256
+ background: var(--color-fd-card);
257
+ color: var(--color-fd-foreground);
258
+ font: inherit;
259
+ font-size: 13px;
260
+ text-align: left;
261
+ cursor: pointer;
262
+ transition:
263
+ border-color 0.15s ease,
264
+ background 0.15s ease;
265
+ }
266
+
267
+ .askai-chip:hover {
268
+ border-color: color-mix(in oklab, var(--color-fd-primary) 40%, var(--color-fd-border));
269
+ background: color-mix(in oklab, var(--color-fd-primary) 7%, var(--color-fd-card));
270
+ }
271
+
272
+ /* The reader's question: compact, right-aligned. */
273
+ .askai-question {
274
+ display: flex;
275
+ justify-content: flex-end;
276
+ }
277
+
278
+ .askai-bubble {
279
+ max-width: 85%;
280
+ padding: 8px 12px;
281
+ border-radius: var(--askai-radius) var(--askai-radius) 4px var(--askai-radius);
282
+ background: color-mix(in oklab, var(--color-fd-primary) 12%, transparent);
283
+ color: var(--color-fd-foreground);
284
+ font-size: 13.5px;
285
+ white-space: pre-wrap;
286
+ overflow-wrap: anywhere;
287
+ }
288
+
289
+ /* The answer: full width, quiet typography. */
290
+ .askai-answer {
291
+ font-size: 14px;
292
+ line-height: 1.7;
293
+ }
294
+
295
+ .askai-paragraph {
296
+ margin: 0 0 0.7rem;
297
+ overflow-wrap: anywhere;
298
+ }
299
+
300
+ .askai-answer > :last-child {
301
+ margin-bottom: 0;
302
+ }
303
+
304
+ .askai-answer-heading {
305
+ margin: 1rem 0 0.45rem;
306
+ font-weight: 600;
307
+ color: var(--color-fd-foreground);
308
+ }
309
+
310
+ .askai-answer-heading:first-child {
311
+ margin-top: 0;
312
+ }
313
+
314
+ .askai-strong {
315
+ font-weight: 600;
316
+ }
317
+
318
+ .askai-list {
319
+ margin: 0 0 0.7rem;
320
+ padding-left: 1.15rem;
321
+ }
322
+
323
+ .askai-list li {
324
+ margin: 0.2rem 0;
325
+ overflow-wrap: anywhere;
326
+ }
327
+
328
+ .askai-link {
329
+ color: var(--color-fd-primary);
330
+ text-decoration: underline;
331
+ text-decoration-color: color-mix(in oklab, var(--color-fd-primary) 40%, transparent);
332
+ text-underline-offset: 2px;
333
+ }
334
+
335
+ .askai-link:hover {
336
+ text-decoration-color: var(--color-fd-primary);
337
+ }
338
+
339
+ .askai-inline-code {
340
+ padding: 1px 5px;
341
+ border-radius: 5px;
342
+ background: color-mix(in oklab, var(--color-fd-muted-foreground) 14%, transparent);
343
+ font-family: ui-monospace, 'SF Mono', 'Menlo', monospace;
344
+ font-size: 12.5px;
345
+ }
346
+
347
+ .askai-codeblock {
348
+ margin: 0.6rem 0 0.8rem;
349
+ padding: 10px 12px;
350
+ border: 1px solid var(--color-fd-border);
351
+ border-radius: 10px;
352
+ background: color-mix(in oklab, var(--color-fd-card) 92%, black);
353
+ overflow-x: auto;
354
+ scrollbar-width: thin;
355
+ font-family: ui-monospace, 'SF Mono', 'Menlo', monospace;
356
+ font-size: 12.5px;
357
+ line-height: 1.65;
358
+ white-space: pre;
359
+ }
360
+
361
+ .dark .askai-codeblock {
362
+ background: color-mix(in oklab, var(--color-fd-card) 78%, black);
363
+ }
364
+
365
+ .askai-codeblock code {
366
+ font: inherit;
367
+ background: none;
368
+ color: var(--color-fd-foreground);
369
+ }
370
+
371
+ /* The streaming caret. */
372
+ .askai-caret {
373
+ display: inline-block;
374
+ width: 2px;
375
+ height: 1em;
376
+ margin-left: 2px;
377
+ vertical-align: text-bottom;
378
+ background: var(--color-fd-primary);
379
+ }
380
+
381
+ @media (prefers-reduced-motion: no-preference) {
382
+ .askai-caret {
383
+ animation: askai-blink 1.1s steps(2, start) infinite;
384
+ }
385
+ }
386
+
387
+ @keyframes askai-blink {
388
+ to {
389
+ visibility: hidden;
390
+ }
391
+ }
392
+
393
+ /* --- Sources ------------------------------------------------------------- */
394
+
395
+ .askai-sources {
396
+ margin-top: 0.85rem;
397
+ padding-top: 0.7rem;
398
+ border-top: 1px solid var(--color-fd-border);
399
+ }
400
+
401
+ .askai-sources-label {
402
+ display: block;
403
+ margin-bottom: 0.45rem;
404
+ color: var(--color-fd-muted-foreground);
405
+ font-size: 11px;
406
+ font-weight: 600;
407
+ letter-spacing: 0.06em;
408
+ text-transform: uppercase;
409
+ }
410
+
411
+ .askai-sources-chips {
412
+ display: flex;
413
+ flex-wrap: wrap;
414
+ gap: 6px;
415
+ }
416
+
417
+ .askai-source {
418
+ max-width: 100%;
419
+ padding: 4px 10px;
420
+ border: 1px solid var(--color-fd-border);
421
+ border-radius: 999px;
422
+ background: var(--color-fd-card);
423
+ color: var(--color-fd-muted-foreground);
424
+ font-size: 12px;
425
+ text-decoration: none;
426
+ white-space: nowrap;
427
+ overflow: hidden;
428
+ text-overflow: ellipsis;
429
+ transition:
430
+ border-color 0.15s ease,
431
+ color 0.15s ease;
432
+ }
433
+
434
+ .askai-source:hover {
435
+ border-color: color-mix(in oklab, var(--color-fd-primary) 45%, var(--color-fd-border));
436
+ color: var(--color-fd-foreground);
437
+ }
438
+
439
+ /* --- Errors -------------------------------------------------------------- */
440
+
441
+ .askai-error {
442
+ display: flex;
443
+ align-items: flex-start;
444
+ gap: 10px;
445
+ margin-top: 0.7rem;
446
+ padding: 9px 11px;
447
+ border: 1px solid rgba(217, 119, 6, 0.38);
448
+ border-radius: 10px;
449
+ background: rgba(217, 119, 6, 0.09);
450
+ color: #b45309;
451
+ font-size: 13px;
452
+ line-height: 1.55;
453
+ }
454
+
455
+ .dark .askai-error {
456
+ border-color: rgba(245, 158, 11, 0.3);
457
+ background: rgba(245, 158, 11, 0.1);
458
+ color: #f2c261;
459
+ }
460
+
461
+ .askai-error-text {
462
+ flex: 1;
463
+ min-width: 0;
464
+ overflow-wrap: anywhere;
465
+ }
466
+
467
+ .askai-retry {
468
+ flex: none;
469
+ padding: 3px 9px;
470
+ border: 1px solid currentColor;
471
+ border-radius: 7px;
472
+ background: transparent;
473
+ color: inherit;
474
+ font: inherit;
475
+ font-size: 12px;
476
+ font-weight: 500;
477
+ cursor: pointer;
478
+ transition: background 0.15s ease;
479
+ }
480
+
481
+ .askai-retry:hover:not(:disabled) {
482
+ background: color-mix(in oklab, currentColor 12%, transparent);
483
+ }
484
+
485
+ .askai-retry:disabled {
486
+ opacity: 0.45;
487
+ cursor: default;
488
+ }
489
+
490
+ /* --- Composer ------------------------------------------------------------ */
491
+
492
+ .askai-composer {
493
+ flex: none;
494
+ display: flex;
495
+ align-items: flex-end;
496
+ gap: 8px;
497
+ padding: 0.75rem 0.9rem calc(0.9rem + env(safe-area-inset-bottom, 0px));
498
+ border-top: 1px solid var(--color-fd-border);
499
+ background: var(--color-fd-background);
500
+ }
501
+
502
+ .askai-input {
503
+ flex: 1;
504
+ min-width: 0;
505
+ min-height: 40px;
506
+ max-height: 132px;
507
+ padding: 9px 12px;
508
+ border: 1px solid var(--color-fd-border);
509
+ border-radius: 11px;
510
+ background: var(--color-fd-card);
511
+ color: var(--color-fd-foreground);
512
+ font: inherit;
513
+ font-size: 13.5px;
514
+ line-height: 1.5;
515
+ resize: none;
516
+ overflow-y: auto;
517
+ scrollbar-width: thin;
518
+ transition: border-color 0.15s ease;
519
+ }
520
+
521
+ .askai-input::placeholder {
522
+ color: var(--color-fd-muted-foreground);
523
+ }
524
+
525
+ .askai-input:hover:not(:disabled),
526
+ .askai-input:focus {
527
+ border-color: color-mix(in oklab, var(--color-fd-primary) 40%, var(--color-fd-border));
528
+ }
529
+
530
+ .askai-input:disabled {
531
+ opacity: 0.6;
532
+ }
533
+
534
+ .askai-send {
535
+ flex: none;
536
+ display: inline-flex;
537
+ align-items: center;
538
+ justify-content: center;
539
+ width: 40px;
540
+ height: 40px;
541
+ border: none;
542
+ border-radius: 11px;
543
+ background: var(--color-fd-primary);
544
+ color: var(--color-fd-primary-foreground, #fff);
545
+ cursor: pointer;
546
+ transition:
547
+ filter 0.15s ease,
548
+ opacity 0.15s ease;
549
+ }
550
+
551
+ .askai-send svg {
552
+ width: 17px;
553
+ height: 17px;
554
+ }
555
+
556
+ .askai-send:hover:not(:disabled) {
557
+ filter: brightness(1.08);
558
+ }
559
+
560
+ .askai-send:disabled {
561
+ opacity: 0.4;
562
+ cursor: default;
563
+ }