docyard 1.0.2 → 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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -1
  3. data/lib/docyard/build/asset_bundler.rb +7 -33
  4. data/lib/docyard/build/file_copier.rb +7 -15
  5. data/lib/docyard/build/llms_txt_generator.rb +0 -2
  6. data/lib/docyard/build/sitemap_generator.rb +1 -1
  7. data/lib/docyard/build/static_generator.rb +30 -32
  8. data/lib/docyard/build/step_runner.rb +88 -0
  9. data/lib/docyard/build/validator.rb +98 -0
  10. data/lib/docyard/builder.rb +82 -55
  11. data/lib/docyard/cli.rb +36 -4
  12. data/lib/docyard/components/aliases.rb +0 -4
  13. data/lib/docyard/components/processors/callout_processor.rb +1 -1
  14. data/lib/docyard/components/processors/code_block_diff_preprocessor.rb +1 -1
  15. data/lib/docyard/components/processors/code_block_focus_preprocessor.rb +1 -1
  16. data/lib/docyard/components/processors/code_block_options_preprocessor.rb +2 -2
  17. data/lib/docyard/components/processors/code_group_processor.rb +1 -1
  18. data/lib/docyard/components/processors/icon_processor.rb +2 -2
  19. data/lib/docyard/components/processors/tabs_processor.rb +1 -1
  20. data/lib/docyard/config/schema/definition.rb +29 -0
  21. data/lib/docyard/config/schema/sections.rb +63 -0
  22. data/lib/docyard/config/schema/simple_sections.rb +78 -0
  23. data/lib/docyard/config/schema.rb +28 -31
  24. data/lib/docyard/config/type_validators.rb +121 -0
  25. data/lib/docyard/config/validator.rb +136 -61
  26. data/lib/docyard/config.rb +1 -13
  27. data/lib/docyard/diagnostic.rb +89 -0
  28. data/lib/docyard/diagnostic_context.rb +48 -0
  29. data/lib/docyard/doctor/code_block_checker.rb +136 -0
  30. data/lib/docyard/doctor/component_checker.rb +49 -0
  31. data/lib/docyard/doctor/component_checkers/abbreviation_checker.rb +74 -0
  32. data/lib/docyard/doctor/component_checkers/badge_checker.rb +71 -0
  33. data/lib/docyard/doctor/component_checkers/base.rb +111 -0
  34. data/lib/docyard/doctor/component_checkers/callout_checker.rb +34 -0
  35. data/lib/docyard/doctor/component_checkers/cards_checker.rb +57 -0
  36. data/lib/docyard/doctor/component_checkers/code_group_checker.rb +47 -0
  37. data/lib/docyard/doctor/component_checkers/details_checker.rb +51 -0
  38. data/lib/docyard/doctor/component_checkers/icon_checker.rb +36 -0
  39. data/lib/docyard/doctor/component_checkers/image_attrs_checker.rb +46 -0
  40. data/lib/docyard/doctor/component_checkers/space_after_colons_checker.rb +45 -0
  41. data/lib/docyard/doctor/component_checkers/steps_checker.rb +35 -0
  42. data/lib/docyard/doctor/component_checkers/tabs_checker.rb +35 -0
  43. data/lib/docyard/doctor/component_checkers/tooltip_checker.rb +67 -0
  44. data/lib/docyard/doctor/component_checkers/unknown_type_checker.rb +34 -0
  45. data/lib/docyard/doctor/config_checker.rb +19 -0
  46. data/lib/docyard/doctor/config_fixer.rb +87 -0
  47. data/lib/docyard/doctor/content_checker.rb +164 -0
  48. data/lib/docyard/doctor/file_scanner.rb +113 -0
  49. data/lib/docyard/doctor/image_checker.rb +103 -0
  50. data/lib/docyard/doctor/link_checker.rb +91 -0
  51. data/lib/docyard/doctor/markdown_fixer.rb +62 -0
  52. data/lib/docyard/doctor/orphan_checker.rb +82 -0
  53. data/lib/docyard/doctor/reporter.rb +152 -0
  54. data/lib/docyard/doctor/sidebar_checker.rb +127 -0
  55. data/lib/docyard/doctor/sidebar_fixer.rb +47 -0
  56. data/lib/docyard/doctor.rb +178 -0
  57. data/lib/docyard/editor_launcher.rb +119 -0
  58. data/lib/docyard/errors.rb +0 -49
  59. data/lib/docyard/initializer.rb +32 -39
  60. data/lib/docyard/navigation/sidebar/local_config_loader.rb +44 -21
  61. data/lib/docyard/rendering/icon_helpers.rb +1 -3
  62. data/lib/docyard/search/build_indexer.rb +39 -24
  63. data/lib/docyard/search/dev_indexer.rb +9 -23
  64. data/lib/docyard/server/dev_server.rb +55 -13
  65. data/lib/docyard/server/error_overlay.rb +73 -0
  66. data/lib/docyard/server/file_watcher.rb +0 -1
  67. data/lib/docyard/server/page_diagnostics.rb +27 -0
  68. data/lib/docyard/server/preview_server.rb +17 -13
  69. data/lib/docyard/server/rack_application.rb +64 -3
  70. data/lib/docyard/server/resolution_result.rb +0 -4
  71. data/lib/docyard/templates/assets/css/error-overlay.css +669 -0
  72. data/lib/docyard/templates/assets/css/variables.css +1 -1
  73. data/lib/docyard/templates/assets/fonts/Inter-Variable.woff2 +0 -0
  74. data/lib/docyard/templates/assets/js/components/relative-time.js +42 -0
  75. data/lib/docyard/templates/assets/js/error-overlay.js +547 -0
  76. data/lib/docyard/templates/assets/js/hot-reload.js +35 -7
  77. data/lib/docyard/templates/errors/404.html.erb +1 -1
  78. data/lib/docyard/templates/errors/500.html.erb +1 -1
  79. data/lib/docyard/templates/partials/_head.html.erb +1 -1
  80. data/lib/docyard/templates/partials/_page_actions.html.erb +1 -1
  81. data/lib/docyard/ui.rb +80 -0
  82. data/lib/docyard/utils/logging.rb +5 -1
  83. data/lib/docyard/utils/text_formatter.rb +0 -6
  84. data/lib/docyard/version.rb +1 -1
  85. data/lib/docyard.rb +4 -0
  86. metadata +47 -25
  87. data/lib/docyard/config/key_validator.rb +0 -30
  88. data/lib/docyard/config/validation_helpers.rb +0 -83
  89. data/lib/docyard/config/validators/navigation.rb +0 -43
  90. data/lib/docyard/config/validators/section.rb +0 -114
  91. data/lib/docyard/templates/assets/fonts/Inter-Variable.ttf +0 -0
@@ -0,0 +1,669 @@
1
+ .docyard-error-overlay {
2
+ --error-overlay-bg: var(--background);
3
+ --error-overlay-border: var(--border);
4
+ --error-overlay-text: var(--foreground);
5
+ --error-overlay-muted: var(--muted-foreground);
6
+ --error-overlay-primary: var(--primary);
7
+ --error-overlay-error: var(--error, #dc2626);
8
+ --error-overlay-warning: var(--warning, #ca8a04);
9
+ --error-overlay-code-bg: var(--code-block-bg);
10
+ --error-overlay-code-border: var(--code-block-border);
11
+ --error-overlay-code-header: var(--code-block-header-bg);
12
+ --error-overlay-highlight-bg: var(--code-error-background);
13
+ --error-overlay-highlight-border: var(--code-error-border);
14
+
15
+ position: fixed;
16
+ z-index: 99999;
17
+ font-family: var(--font-sans);
18
+ }
19
+
20
+ .docyard-error-backdrop {
21
+ position: fixed;
22
+ inset: 0;
23
+ background: oklch(0% 0 0 / 20%);
24
+ backdrop-filter: blur(2px);
25
+ -webkit-backdrop-filter: blur(2px);
26
+ z-index: 99998;
27
+ opacity: 0;
28
+ pointer-events: none;
29
+ transition: opacity 200ms cubic-bezier(0.23, 1, 0.32, 1);
30
+ }
31
+
32
+ .docyard-error-backdrop.is-visible {
33
+ opacity: 1;
34
+ pointer-events: auto;
35
+ }
36
+
37
+ .docyard-error-sheet {
38
+ position: fixed;
39
+ bottom: 0;
40
+ left: 0;
41
+ right: 0;
42
+ background: var(--error-overlay-bg);
43
+ border-top: 1px solid var(--error-overlay-border);
44
+ border-radius: var(--radius-2xl) var(--radius-2xl) 0 0;
45
+ z-index: 99999;
46
+ transform: translateY(100%);
47
+ transition: transform 200ms cubic-bezier(0.23, 1, 0.32, 1);
48
+ max-height: 55vh;
49
+ display: flex;
50
+ flex-direction: column;
51
+ box-shadow: var(--shadow-xl);
52
+ }
53
+
54
+ .docyard-error-sheet.is-expanded {
55
+ transform: translateY(0);
56
+ }
57
+
58
+ .docyard-error-sheet.is-dismissing {
59
+ transition-duration: 150ms;
60
+ }
61
+
62
+ .docyard-error-sheet__header {
63
+ padding: var(--spacing-4) var(--spacing-6);
64
+ border-bottom: 1px solid var(--error-overlay-border);
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: space-between;
68
+ flex-shrink: 0;
69
+ }
70
+
71
+ .docyard-error-sheet__counts {
72
+ display: flex;
73
+ align-items: center;
74
+ gap: var(--spacing-4);
75
+ font-size: var(--text-sm);
76
+ }
77
+
78
+ .docyard-error-sheet__count {
79
+ display: flex;
80
+ align-items: center;
81
+ gap: 6px;
82
+ color: var(--error-overlay-muted);
83
+ font-weight: 500;
84
+ }
85
+
86
+ .docyard-error-sheet__count.has-errors {
87
+ color: var(--error-overlay-error);
88
+ }
89
+
90
+ .docyard-error-sheet__count.has-warnings {
91
+ color: var(--error-overlay-warning);
92
+ }
93
+
94
+ .docyard-error-sheet__count i {
95
+ font-size: 16px;
96
+ }
97
+
98
+ .docyard-error-sheet__close {
99
+ background: none;
100
+ border: none;
101
+ color: var(--error-overlay-muted);
102
+ padding: var(--spacing-2);
103
+ border-radius: var(--radius-md);
104
+ cursor: pointer;
105
+ display: flex;
106
+ align-items: center;
107
+ justify-content: center;
108
+ transition: color 150ms ease, background 150ms ease;
109
+ }
110
+
111
+ .docyard-error-sheet__close:hover {
112
+ color: var(--error-overlay-text);
113
+ background: var(--muted);
114
+ }
115
+
116
+ .docyard-error-sheet__close i {
117
+ font-size: 18px;
118
+ }
119
+
120
+ .docyard-error-tabs {
121
+ position: relative;
122
+ display: flex;
123
+ padding: 0 var(--spacing-6);
124
+ border-bottom: 1px solid var(--error-overlay-border);
125
+ flex-shrink: 0;
126
+ gap: var(--spacing-1);
127
+ }
128
+
129
+ .docyard-error-tabs__tab {
130
+ padding: var(--spacing-3) var(--spacing-4);
131
+ font-size: var(--text-sm);
132
+ font-weight: 500;
133
+ color: var(--error-overlay-muted);
134
+ background: none;
135
+ border: none;
136
+ cursor: pointer;
137
+ position: relative;
138
+ font-family: var(--font-sans);
139
+ transition: color 150ms ease;
140
+ white-space: nowrap;
141
+ }
142
+
143
+ .docyard-error-tabs__tab:hover {
144
+ color: var(--error-overlay-text);
145
+ }
146
+
147
+ .docyard-error-tabs__tab.is-active {
148
+ color: var(--error-overlay-text);
149
+ }
150
+
151
+ .docyard-error-tabs__tab-count {
152
+ margin-left: 6px;
153
+ color: var(--error-overlay-muted);
154
+ }
155
+
156
+ .docyard-error-tabs__tab.is-active .docyard-error-tabs__tab-count {
157
+ color: var(--error-overlay-text);
158
+ }
159
+
160
+ .docyard-error-tabs__indicator {
161
+ position: absolute;
162
+ bottom: -1px;
163
+ left: 0;
164
+ height: 2px;
165
+ background: var(--error-overlay-primary);
166
+ border-radius: 1px 1px 0 0;
167
+ pointer-events: none;
168
+ z-index: 1;
169
+ opacity: 0;
170
+ transition:
171
+ transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1),
172
+ width 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
173
+ opacity 0.15s ease;
174
+ will-change: transform, width;
175
+ }
176
+
177
+ .docyard-error-tabs__indicator.is-ready {
178
+ opacity: 1;
179
+ }
180
+
181
+ .docyard-error-sheet__content {
182
+ flex: 1;
183
+ overflow-y: auto;
184
+ overscroll-behavior: contain;
185
+ }
186
+
187
+ .docyard-error-section {
188
+ display: none;
189
+ }
190
+
191
+ .docyard-error-section.is-active {
192
+ display: block;
193
+ animation: errorContentFadeIn 200ms cubic-bezier(0.23, 1, 0.32, 1);
194
+ }
195
+
196
+ .docyard-error-section[data-direction="left"].is-active {
197
+ animation: errorContentSlideFromLeft 200ms cubic-bezier(0.23, 1, 0.32, 1);
198
+ }
199
+
200
+ .docyard-error-section[data-direction="right"].is-active {
201
+ animation: errorContentSlideFromRight 200ms cubic-bezier(0.23, 1, 0.32, 1);
202
+ }
203
+
204
+ @keyframes errorContentFadeIn {
205
+ from {
206
+ opacity: 0;
207
+ transform: translateY(4px);
208
+ }
209
+ to {
210
+ opacity: 1;
211
+ transform: translateY(0);
212
+ }
213
+ }
214
+
215
+ @keyframes errorContentSlideFromLeft {
216
+ from {
217
+ opacity: 0;
218
+ transform: translateX(-8px);
219
+ }
220
+ to {
221
+ opacity: 1;
222
+ transform: translateX(0);
223
+ }
224
+ }
225
+
226
+ @keyframes errorContentSlideFromRight {
227
+ from {
228
+ opacity: 0;
229
+ transform: translateX(8px);
230
+ }
231
+ to {
232
+ opacity: 1;
233
+ transform: translateX(0);
234
+ }
235
+ }
236
+
237
+ .docyard-error-section__header {
238
+ padding: var(--spacing-2) var(--spacing-6);
239
+ background: var(--muted);
240
+ font-size: var(--text-xs);
241
+ font-weight: 500;
242
+ color: var(--error-overlay-muted);
243
+ display: flex;
244
+ align-items: center;
245
+ gap: var(--spacing-2);
246
+ position: sticky;
247
+ top: 0;
248
+ z-index: 1;
249
+ text-transform: uppercase;
250
+ letter-spacing: 0.025em;
251
+ }
252
+
253
+ .docyard-error-section__scope {
254
+ font-weight: 400;
255
+ text-transform: none;
256
+ letter-spacing: normal;
257
+ opacity: 0.8;
258
+ }
259
+
260
+ .docyard-error-item {
261
+ border-bottom: 1px solid var(--error-overlay-border);
262
+ }
263
+
264
+ .docyard-error-item:last-child {
265
+ border-bottom: none;
266
+ }
267
+
268
+ .docyard-error-item__header {
269
+ padding: var(--spacing-4) var(--spacing-6);
270
+ display: flex;
271
+ align-items: flex-start;
272
+ gap: var(--spacing-3);
273
+ }
274
+
275
+ .docyard-error-item__indicator {
276
+ flex-shrink: 0;
277
+ margin-top: 1px;
278
+ font-size: 16px;
279
+ }
280
+
281
+ .docyard-error-item__indicator.is-error {
282
+ color: var(--error-overlay-error);
283
+ }
284
+
285
+ .docyard-error-item__indicator.is-warning {
286
+ color: var(--error-overlay-warning);
287
+ }
288
+
289
+ .docyard-error-item__info {
290
+ flex: 1;
291
+ min-width: 0;
292
+ }
293
+
294
+ .docyard-error-item__title {
295
+ font-size: var(--text-sm);
296
+ font-weight: 500;
297
+ color: var(--error-overlay-text);
298
+ margin-bottom: 4px;
299
+ line-height: 1.4;
300
+ }
301
+
302
+ .docyard-error-item__title code {
303
+ background: var(--muted);
304
+ padding: 2px 6px;
305
+ border-radius: var(--radius-md);
306
+ font-family: var(--font-mono);
307
+ font-size: 0.8125rem;
308
+ font-weight: 400;
309
+ }
310
+
311
+ .docyard-error-item__meta {
312
+ display: flex;
313
+ align-items: center;
314
+ gap: var(--spacing-4);
315
+ flex-wrap: wrap;
316
+ margin-top: var(--spacing-2);
317
+ }
318
+
319
+ .docyard-error-item__location {
320
+ font-size: var(--text-sm);
321
+ color: var(--error-overlay-primary);
322
+ font-family: var(--font-mono);
323
+ text-decoration: none;
324
+ transition: opacity 150ms ease;
325
+ }
326
+
327
+ .docyard-error-item__location:hover {
328
+ opacity: 0.8;
329
+ }
330
+
331
+ .docyard-error-item__doc-link {
332
+ font-size: var(--text-xs);
333
+ color: var(--error-overlay-primary);
334
+ text-decoration: none;
335
+ display: flex;
336
+ align-items: center;
337
+ gap: 4px;
338
+ padding: 3px 8px;
339
+ background: oklch(from var(--primary) l c h / 10%);
340
+ border-radius: var(--radius-md);
341
+ transition: background 150ms ease;
342
+ }
343
+
344
+ .docyard-error-item__doc-link:hover {
345
+ background: oklch(from var(--primary) l c h / 15%);
346
+ }
347
+
348
+ .docyard-error-item__doc-link i {
349
+ font-size: 12px;
350
+ }
351
+
352
+ .docyard-error-item__actions {
353
+ display: flex;
354
+ gap: var(--spacing-2);
355
+ flex-shrink: 0;
356
+ }
357
+
358
+ .docyard-error-item__action {
359
+ background: transparent;
360
+ border: 1px solid var(--error-overlay-border);
361
+ color: var(--error-overlay-muted);
362
+ padding: 6px 10px;
363
+ border-radius: var(--radius-md);
364
+ font-size: var(--text-xs);
365
+ font-family: var(--font-sans);
366
+ cursor: pointer;
367
+ display: flex;
368
+ align-items: center;
369
+ gap: 5px;
370
+ white-space: nowrap;
371
+ transition: all 150ms ease;
372
+ }
373
+
374
+ .docyard-error-item__action:hover {
375
+ border-color: var(--error-overlay-muted);
376
+ color: var(--error-overlay-text);
377
+ }
378
+
379
+ .docyard-error-item__action i {
380
+ font-size: 14px;
381
+ }
382
+
383
+ .docyard-error-code-frame {
384
+ background: var(--error-overlay-code-bg);
385
+ border: 1px solid var(--error-overlay-code-border);
386
+ margin: 0 var(--spacing-6) var(--spacing-4) calc(var(--spacing-6) + 16px + var(--spacing-3));
387
+ border-radius: var(--radius-xl);
388
+ overflow: hidden;
389
+ font-family: var(--font-mono);
390
+ font-size: var(--text-sm);
391
+ line-height: 1.6;
392
+ }
393
+
394
+ .docyard-error-code-frame__header {
395
+ padding: var(--spacing-2) var(--spacing-4);
396
+ background: var(--error-overlay-code-header);
397
+ border-bottom: 1px solid var(--error-overlay-code-border);
398
+ color: var(--error-overlay-muted);
399
+ font-size: var(--text-xs);
400
+ }
401
+
402
+ .docyard-error-code-frame__lines {
403
+ padding: var(--spacing-3) 0;
404
+ overflow-x: auto;
405
+ }
406
+
407
+ .docyard-error-code-frame__line {
408
+ display: flex;
409
+ padding: 0 var(--spacing-4);
410
+ }
411
+
412
+ .docyard-error-code-frame__line.is-highlighted {
413
+ background: var(--error-overlay-highlight-bg);
414
+ border-left: 3px solid var(--error-overlay-highlight-border);
415
+ padding-left: calc(var(--spacing-4) - 3px);
416
+ }
417
+
418
+ .docyard-error-code-frame__line-number {
419
+ width: 2.5rem;
420
+ color: var(--error-overlay-muted);
421
+ text-align: right;
422
+ padding-right: var(--spacing-4);
423
+ user-select: none;
424
+ flex-shrink: 0;
425
+ opacity: 0.6;
426
+ }
427
+
428
+ .docyard-error-code-frame__line.is-highlighted .docyard-error-code-frame__line-number {
429
+ color: var(--error-overlay-error);
430
+ opacity: 1;
431
+ }
432
+
433
+ .docyard-error-code-frame__line-content {
434
+ color: var(--error-overlay-text);
435
+ white-space: pre;
436
+ }
437
+
438
+ .docyard-error-sheet__footer {
439
+ padding: var(--spacing-3) var(--spacing-6);
440
+ background: var(--muted);
441
+ border-top: 1px solid var(--error-overlay-border);
442
+ flex-shrink: 0;
443
+ }
444
+
445
+ .docyard-error-sheet__hint {
446
+ font-size: var(--text-xs);
447
+ color: var(--error-overlay-muted);
448
+ }
449
+
450
+ .docyard-error-sheet__hint kbd {
451
+ background: var(--background);
452
+ border: 1px solid var(--error-overlay-border);
453
+ padding: 2px 6px;
454
+ border-radius: var(--radius-md);
455
+ font-family: var(--font-mono);
456
+ font-size: 10px;
457
+ font-weight: 500;
458
+ }
459
+
460
+ .docyard-error-toast {
461
+ position: fixed;
462
+ bottom: var(--spacing-5);
463
+ left: 50%;
464
+ transform: translateX(-50%) translateY(80px);
465
+ background: var(--error-overlay-bg);
466
+ border: 1px solid var(--error-overlay-border);
467
+ border-radius: 9999px;
468
+ padding: var(--spacing-2) var(--spacing-4);
469
+ display: flex;
470
+ align-items: center;
471
+ gap: var(--spacing-3);
472
+ cursor: pointer;
473
+ z-index: 99999;
474
+ box-shadow:
475
+ 0 4px 12px oklch(0% 0 0 / 15%),
476
+ 0 2px 4px oklch(0% 0 0 / 10%);
477
+ opacity: 0;
478
+ transition: all 200ms cubic-bezier(0.23, 1, 0.32, 1);
479
+ }
480
+
481
+ .docyard-error-toast.is-visible {
482
+ transform: translateX(-50%) translateY(0);
483
+ opacity: 1;
484
+ }
485
+
486
+ .docyard-error-toast:hover {
487
+ box-shadow:
488
+ 0 8px 24px oklch(0% 0 0 / 18%),
489
+ 0 4px 8px oklch(0% 0 0 / 12%);
490
+ border-color: var(--error-overlay-muted);
491
+ }
492
+
493
+ .docyard-error-toast__content {
494
+ display: flex;
495
+ align-items: center;
496
+ gap: var(--spacing-3);
497
+ font-size: var(--text-sm);
498
+ font-weight: 500;
499
+ }
500
+
501
+ .docyard-error-toast__item {
502
+ display: flex;
503
+ align-items: center;
504
+ gap: 6px;
505
+ }
506
+
507
+ .docyard-error-toast__item.has-errors {
508
+ color: var(--error-overlay-error);
509
+ }
510
+
511
+ .docyard-error-toast__item.has-warnings {
512
+ color: var(--error-overlay-warning);
513
+ }
514
+
515
+ .docyard-error-toast__item i {
516
+ font-size: 14px;
517
+ }
518
+
519
+ .docyard-error-toast__separator {
520
+ color: var(--error-overlay-border);
521
+ font-weight: 300;
522
+ }
523
+
524
+ .docyard-error-toast__hint {
525
+ font-size: var(--text-xs);
526
+ color: var(--error-overlay-muted);
527
+ font-weight: 400;
528
+ }
529
+
530
+ .docyard-error-empty {
531
+ padding: var(--spacing-6);
532
+ text-align: center;
533
+ color: var(--error-overlay-muted);
534
+ font-size: var(--text-sm);
535
+ }
536
+
537
+ @media (prefers-reduced-motion: reduce) {
538
+ .docyard-error-backdrop,
539
+ .docyard-error-sheet,
540
+ .docyard-error-tabs__indicator,
541
+ .docyard-error-toast,
542
+ .docyard-error-section.is-active {
543
+ transition-duration: 0.01ms !important;
544
+ animation-duration: 0.01ms !important;
545
+ }
546
+ }
547
+
548
+ .docyard-error-sheet__drag-handle {
549
+ display: none;
550
+ }
551
+
552
+ @media (max-width: 640px) {
553
+ .docyard-error-sheet {
554
+ max-height: 70vh;
555
+ border-radius: var(--radius-xl) var(--radius-xl) 0 0;
556
+ }
557
+
558
+ .docyard-error-sheet__drag-handle {
559
+ display: flex;
560
+ justify-content: center;
561
+ padding: var(--spacing-2) 0;
562
+ cursor: grab;
563
+ touch-action: none;
564
+ }
565
+
566
+ .docyard-error-sheet__drag-handle::before {
567
+ content: '';
568
+ width: 36px;
569
+ height: 4px;
570
+ background: var(--error-overlay-border);
571
+ border-radius: 2px;
572
+ }
573
+
574
+ .docyard-error-sheet__drag-handle:active {
575
+ cursor: grabbing;
576
+ }
577
+
578
+ .docyard-error-sheet__header {
579
+ padding: var(--spacing-1) var(--spacing-4) var(--spacing-2);
580
+ border-bottom: none;
581
+ }
582
+
583
+ .docyard-error-sheet__close {
584
+ display: none;
585
+ }
586
+
587
+ .docyard-error-sheet__counts {
588
+ font-size: var(--text-xs);
589
+ }
590
+
591
+ .docyard-error-tabs {
592
+ padding: 0 var(--spacing-4);
593
+ }
594
+
595
+ .docyard-error-tabs__tab {
596
+ padding: var(--spacing-2) var(--spacing-3);
597
+ font-size: var(--text-xs);
598
+ }
599
+
600
+ .docyard-error-section__header {
601
+ padding: var(--spacing-2) var(--spacing-4);
602
+ font-size: 10px;
603
+ }
604
+
605
+ .docyard-error-section__scope {
606
+ display: none;
607
+ }
608
+
609
+ .docyard-error-item__header {
610
+ padding: var(--spacing-3) var(--spacing-4);
611
+ }
612
+
613
+ .docyard-error-item__actions {
614
+ display: none;
615
+ }
616
+
617
+ .docyard-error-item__title {
618
+ font-size: var(--text-xs);
619
+ }
620
+
621
+ .docyard-error-item__meta {
622
+ gap: var(--spacing-2);
623
+ margin-top: var(--spacing-1);
624
+ }
625
+
626
+ .docyard-error-item__location {
627
+ font-size: var(--text-xs);
628
+ }
629
+
630
+ .docyard-error-item__doc-link {
631
+ font-size: 10px;
632
+ padding: 2px 6px;
633
+ }
634
+
635
+ .docyard-error-code-frame {
636
+ margin: 0 var(--spacing-4) var(--spacing-3) var(--spacing-4);
637
+ font-size: 11px;
638
+ }
639
+
640
+ .docyard-error-code-frame__header {
641
+ display: none;
642
+ }
643
+
644
+ .docyard-error-code-frame__line-number {
645
+ width: 1.75rem;
646
+ padding-right: var(--spacing-2);
647
+ }
648
+
649
+ .docyard-error-sheet__footer {
650
+ display: none;
651
+ }
652
+
653
+ .docyard-error-toast {
654
+ bottom: var(--spacing-4);
655
+ padding: var(--spacing-2) var(--spacing-3);
656
+ }
657
+
658
+ .docyard-error-toast__hint {
659
+ display: none;
660
+ }
661
+
662
+ .docyard-error-toast__content {
663
+ font-size: var(--text-xs);
664
+ }
665
+
666
+ .docyard-error-toast__label {
667
+ display: none;
668
+ }
669
+ }
@@ -1,6 +1,6 @@
1
1
  @font-face {
2
2
  font-family: 'Inter';
3
- src: url('/_docyard/fonts/Inter-Variable.ttf') format('truetype');
3
+ src: url('/_docyard/fonts/Inter-Variable.woff2') format('woff2');
4
4
  font-weight: 100 900;
5
5
  font-style: normal;
6
6
  font-display: swap;
@@ -0,0 +1,42 @@
1
+ function initializeRelativeTime() {
2
+ const elements = document.querySelectorAll('.page-actions__last-updated time[datetime]');
3
+ if (elements.length === 0) return;
4
+
5
+ const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
6
+ elements.forEach(el => updateRelativeTime(el, rtf));
7
+ }
8
+
9
+ function updateRelativeTime(element, rtf) {
10
+ const datetime = element.getAttribute('datetime');
11
+ if (!datetime) return;
12
+
13
+ const date = new Date(datetime);
14
+ if (isNaN(date.getTime())) return;
15
+
16
+ const seconds = (date.getTime() - Date.now()) / 1000;
17
+ const absSeconds = Math.abs(seconds);
18
+
19
+ const units = [
20
+ [31536000, 'year'],
21
+ [2592000, 'month'],
22
+ [604800, 'week'],
23
+ [86400, 'day'],
24
+ [3600, 'hour'],
25
+ [60, 'minute']
26
+ ];
27
+
28
+ for (const [threshold, unit] of units) {
29
+ if (absSeconds >= threshold) {
30
+ element.textContent = rtf.format(Math.round(seconds / threshold), unit);
31
+ return;
32
+ }
33
+ }
34
+
35
+ element.textContent = rtf.format(Math.round(seconds), 'second');
36
+ }
37
+
38
+ if (document.readyState === 'loading') {
39
+ document.addEventListener('DOMContentLoaded', initializeRelativeTime);
40
+ } else {
41
+ initializeRelativeTime();
42
+ }