rapidoc 11.0.1 → 12.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 (96) hide show
  1. package/README.md +171 -54
  2. package/dist/rapidoc-flow-min.js +580 -0
  3. package/dist/rapidoc-flow-min.js.LICENSE.txt +171 -0
  4. package/dist/rapidoc-min.js +645 -202
  5. package/dist/rapidoc-min.js.LICENSE.txt +381 -0
  6. package/package.json +57 -42
  7. package/src/README.md +150 -0
  8. package/src/components/README.md +91 -0
  9. package/src/components/api-request.ts +912 -0
  10. package/src/components/api-response.ts +514 -0
  11. package/src/components/json-tree.ts +171 -0
  12. package/src/components/schema-base-element.ts +329 -0
  13. package/src/components/schema-table.ts +475 -0
  14. package/src/components/schema-tree.ts +393 -0
  15. package/src/components/tag-input.ts +180 -0
  16. package/src/flow.js +3 -0
  17. package/src/index.js +6 -0
  18. package/src/oauth-receiver.ts +29 -0
  19. package/src/rapi-flow.ts +1178 -0
  20. package/src/rapidoc-mini.ts +603 -0
  21. package/src/rapidoc.ts +1854 -0
  22. package/src/styles/README.md +96 -0
  23. package/src/styles/auth-styles.js +318 -0
  24. package/src/styles/border-styles.js +24 -0
  25. package/src/styles/css-bundle.js +129 -0
  26. package/src/styles/custom-styles.js +8 -0
  27. package/src/styles/dialog-box-styles.js +102 -0
  28. package/src/styles/endpoint-styles.js +564 -0
  29. package/src/styles/flex-styles.js +16 -0
  30. package/src/styles/flow-styles.js +248 -0
  31. package/src/styles/font-styles.js +432 -0
  32. package/src/styles/info-styles.js +36 -0
  33. package/src/styles/input-styles.js +555 -0
  34. package/src/styles/layout-styles.js +396 -0
  35. package/src/styles/microlighter-styles.js +99 -0
  36. package/src/styles/nav-styles.js +633 -0
  37. package/src/styles/param-list-styles.js +261 -0
  38. package/src/styles/schema-styles.js +296 -0
  39. package/src/styles/tab-styles.js +106 -0
  40. package/src/styles/theme-tokens.js +582 -0
  41. package/src/templates/README.md +89 -0
  42. package/src/templates/advanced-search-dialog-template.js +94 -0
  43. package/src/templates/api-response-template.js +223 -0
  44. package/src/templates/callback-template.js +86 -0
  45. package/src/templates/code-samples-template.js +52 -0
  46. package/src/templates/components-template.js +86 -0
  47. package/src/templates/downloads-template.js +70 -0
  48. package/src/templates/endpoint-template.js +377 -0
  49. package/src/templates/expanded-endpoint-template.js +270 -0
  50. package/src/templates/focused-endpoint-template.js +146 -0
  51. package/src/templates/header-template.js +92 -0
  52. package/src/templates/logo-template.js +21 -0
  53. package/src/templates/main-body-template.js +102 -0
  54. package/src/templates/navbar-template.js +498 -0
  55. package/src/templates/overview-template.js +104 -0
  56. package/src/templates/request-body-template.js +673 -0
  57. package/src/templates/request-params-template.js +485 -0
  58. package/src/templates/security-scheme-template.js +1272 -0
  59. package/src/templates/server-template.js +153 -0
  60. package/src/utils/README.md +146 -0
  61. package/src/utils/arazzo/README.md +119 -0
  62. package/src/utils/arazzo/components.js +15 -0
  63. package/src/utils/arazzo/graph.js +269 -0
  64. package/src/utils/arazzo/index.js +52 -0
  65. package/src/utils/arazzo/operations.js +106 -0
  66. package/src/utils/arazzo/parse.js +196 -0
  67. package/src/utils/arazzo/refs.js +40 -0
  68. package/src/utils/arazzo/svg.js +707 -0
  69. package/src/utils/auto-color-scheme.js +99 -0
  70. package/src/utils/bind-navbar.js +175 -0
  71. package/src/utils/color-utils.js +59 -0
  72. package/src/utils/common-utils.js +191 -0
  73. package/src/utils/curl-utils.js +126 -0
  74. package/src/utils/highlighter.js +419 -0
  75. package/src/utils/markdown-utils.js +110 -0
  76. package/src/utils/mcp/README.md +155 -0
  77. package/src/utils/mcp/common.js +166 -0
  78. package/src/utils/mcp/manifest.js +382 -0
  79. package/src/utils/mcp/project/server.ts +53 -0
  80. package/src/utils/mcp/project.js +88 -0
  81. package/src/utils/mcp/runtime.js +289 -0
  82. package/src/utils/mcp/schema.js +98 -0
  83. package/src/utils/mcp/workflow-runtime.js +374 -0
  84. package/src/utils/mcp/workflows.js +240 -0
  85. package/src/utils/mcp/zip.js +102 -0
  86. package/src/utils/mcp-generator.js +47 -0
  87. package/src/utils/mock-interceptor.js +557 -0
  88. package/src/utils/oauth-utils.js +87 -0
  89. package/src/utils/request-utils.js +264 -0
  90. package/src/utils/response-utils.js +203 -0
  91. package/src/utils/sanitize.js +57 -0
  92. package/src/utils/schema-utils.js +1954 -0
  93. package/src/utils/slugger.js +187 -0
  94. package/src/utils/spec-parser.js +941 -0
  95. package/src/utils/url-utils.js +246 -0
  96. package/src/utils/xml-utils.js +61 -0
@@ -0,0 +1,633 @@
1
+ import { css } from "lit";
2
+
3
+ export default css`
4
+ #advanced-search-btn {
5
+ display: none;
6
+ margin-left: 5px;
7
+ width: 75px;
8
+ }
9
+ .btn-clear-filter {
10
+ margin-left: 5px;
11
+ color: var(--foreground);
12
+ width: 75px;
13
+ }
14
+ .nav-bar-header {
15
+ position: sticky;
16
+ top: 0;
17
+ z-index: 10;
18
+ display: flex;
19
+ flex-direction: column;
20
+ box-sizing: border-box;
21
+ width: 100%;
22
+ backdrop-filter: blur(12px);
23
+ -webkit-backdrop-filter: blur(12px);
24
+ transition:
25
+ box-shadow 0.2s ease,
26
+ background 0.2s ease;
27
+ }
28
+ @container scroll-state(scrollable: top) {
29
+ .nav-bar-header {
30
+ box-shadow:
31
+ 0 4px 12px -2px rgba(0, 0, 0, 0.25),
32
+ 0 2px 4px -1px rgba(0, 0, 0, 0.15);
33
+ }
34
+ }
35
+ .nav-bar-search-container {
36
+ display: flex;
37
+ flex-direction: row;
38
+ justify-content: center;
39
+ align-items: stretch;
40
+ padding: 8px 16px 12px 16px;
41
+ box-sizing: border-box;
42
+ width: 100%;
43
+ }
44
+ .nav-bar-search-container.has-bottom-border {
45
+ border-bottom: 1px solid var(--muted);
46
+ }
47
+ .nav-bar-search-input-wrapper {
48
+ display: flex;
49
+ flex: 1;
50
+ position: relative;
51
+ line-height: 22px;
52
+ }
53
+ /* Wrapper in the selector so it outranks input-styles' input[type='text'] padding (room for the icon) */
54
+ .nav-bar-search-input-wrapper .nav-bar-search-input {
55
+ width: 100%;
56
+ line-height: 1.25;
57
+ padding: 0.45em 28px 0.45em 10px;
58
+ color: var(--foreground);
59
+ border: 1px solid var(--input);
60
+ border-radius: var(--radius);
61
+ background: var(--input-background);
62
+ /* Inputs do not inherit the page font; getNavCss() puts this on a page, outside the element's input styles. */
63
+ font-family: inherit;
64
+ font-size: calc(var(--font-size-small) + 1px);
65
+ box-sizing: border-box;
66
+ transition:
67
+ border-color 0.2s,
68
+ box-shadow 0.2s;
69
+ }
70
+ .nav-bar-search-input:focus {
71
+ outline: none;
72
+ border-color: var(--sidebar-ring);
73
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--sidebar-ring) 25%, transparent);
74
+ }
75
+ .nav-bar-search-icon {
76
+ position: absolute;
77
+ right: 8px;
78
+ top: 50%;
79
+ transform: translateY(-50%);
80
+ font-size: var(--font-size-regular);
81
+ cursor: pointer;
82
+ color: var(--foreground);
83
+ opacity: 0.6;
84
+ user-select: none;
85
+ }
86
+ /* The static nav's filter icon is a single-colour SVG (magnifying glass), not a glyph. */
87
+ svg.nav-bar-search-icon {
88
+ cursor: default;
89
+ pointer-events: none;
90
+ }
91
+ .nav-bar-search-icon:hover {
92
+ opacity: 1;
93
+ color: var(--foreground);
94
+ }
95
+ #nav-bar-btn {
96
+ position: absolute;
97
+ top: 16px;
98
+ right: 16px;
99
+ font-size: 36px;
100
+ line-height: 30px;
101
+ width: 50px;
102
+ height: 50px;
103
+ background: var(--card);
104
+ color: var(--foreground);
105
+ border: 1px solid var(--border);
106
+ border-radius: var(--radius);
107
+ cursor: pointer;
108
+ z-index: 10;
109
+ box-shadow:
110
+ 0 12px 16px 0 rgba(0, 0, 0, 0.24),
111
+ 0 17px 50px 0 rgba(0, 0, 0, 0.19);
112
+ &:hover {
113
+ border-color: var(--primary);
114
+ color: var(--primary);
115
+ }
116
+ }
117
+ .nav-bar {
118
+ width: 0;
119
+ height: 100%;
120
+ overflow: hidden;
121
+ color: var(--sidebar-foreground);
122
+ background: var(--sidebar);
123
+ background-blend-mode: multiply;
124
+ border-right: 1px solid var(--sidebar-border);
125
+ /* Same size as body text (14px by default), like most API references; 20px line height at that size. */
126
+ font-size: var(--font-size-regular);
127
+ line-height: calc(var(--font-size-regular) + 6px);
128
+ position: relative;
129
+ flex-direction: column;
130
+ flex-wrap: nowrap;
131
+ word-break: break-word;
132
+ &.floating-nav {
133
+ position: absolute;
134
+ top: 0;
135
+ left: 0;
136
+ width: 330px;
137
+ overflow: scroll;
138
+ z-index: 5;
139
+ }
140
+ }
141
+
142
+ .nav-bar-info:focus-visible,
143
+ .nav-bar-tag:focus-visible,
144
+ .nav-bar-path:focus-visible {
145
+ outline: 1px solid;
146
+ box-shadow: none;
147
+ outline-offset: -4px;
148
+ }
149
+ .nav-bar-expand-all:focus-visible,
150
+ .nav-bar-collapse-all:focus-visible,
151
+ .nav-bar-tag-icon:focus-visible {
152
+ outline: 1px solid;
153
+ box-shadow: none;
154
+ outline-offset: 2px;
155
+ }
156
+ ::slotted([slot='nav-logo']) {
157
+ max-height: var(--sidebar-logo-max-height);
158
+ overflow: hidden;
159
+ box-sizing: border-box;
160
+ width: auto;
161
+ padding: 16px 16px 0 16px;
162
+ object-fit: contain;
163
+ }
164
+ .nav-scroll {
165
+ overflow-x: hidden;
166
+ overflow-y: auto;
167
+ overflow-y: overlay;
168
+ scrollbar-width: thin;
169
+ scrollbar-color: var(--muted) transparent;
170
+ scroll-padding-top: 60px;
171
+ container-type: scroll-state;
172
+ }
173
+
174
+ .nav-bar-tag {
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: space-between;
178
+ flex-direction: row;
179
+ }
180
+ /* Collapsing a tag or tag group slides its body shut: height auto -> 0 (interpolate-size lets the
181
+ keyword animate; browsers without it switch at once). The body goes visibility: hidden once
182
+ closed, so its links leave the tab order; opening shows it at once. */
183
+ .nav-bar-paths-under-tag,
184
+ .nav-bar-tags-under-group {
185
+ interpolate-size: allow-keywords;
186
+ height: auto;
187
+ overflow: hidden;
188
+ transition:
189
+ height 0.25s ease,
190
+ visibility 0s;
191
+ }
192
+ .nav-bar-tag-and-paths.collapsed .nav-bar-paths-under-tag,
193
+ .nav-bar-tag-group.collapsed .nav-bar-tags-under-group {
194
+ height: 0;
195
+ visibility: hidden;
196
+ transition:
197
+ height 0.25s ease,
198
+ visibility 0s linear 0.25s;
199
+ }
200
+ @media (prefers-reduced-motion: reduce) {
201
+ .nav-bar-paths-under-tag,
202
+ .nav-bar-tags-under-group {
203
+ transition: none;
204
+ }
205
+ }
206
+ .nav-bar-paths-under-tag {
207
+ padding-left: 10px;
208
+ }
209
+
210
+ .nav-bar-expand-all {
211
+ transform: rotate(90deg);
212
+ cursor: pointer;
213
+ margin-inline-end: 10px;
214
+ }
215
+ .nav-bar-collapse-all {
216
+ transform: rotate(270deg);
217
+ cursor: pointer;
218
+ }
219
+ .nav-bar-expand-all:hover,
220
+ .nav-bar-collapse-all:hover {
221
+ color: var(--primary);
222
+ }
223
+
224
+ .nav-bar-tag-icon,
225
+ .nav-bar-tag-group-icon {
226
+ font-size: 14px;
227
+ color: var(--foreground);
228
+ cursor: pointer;
229
+ display: inline-flex;
230
+ align-items: center;
231
+ justify-content: center;
232
+ width: 16px;
233
+ height: 16px;
234
+ line-height: 1;
235
+ user-select: none;
236
+ transition: color 0.15s ease;
237
+ }
238
+ .nav-bar-tag-icon:hover,
239
+ .nav-bar-tag-group-icon:hover {
240
+ color: var(--foreground);
241
+ }
242
+
243
+ .nav-bar-tag-icon::after,
244
+ .nav-bar-tag-group-icon::after {
245
+ content: '';
246
+ width: 14px;
247
+ height: 14px;
248
+ display: inline-block;
249
+ background-color: currentColor;
250
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
251
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
252
+ -webkit-mask-size: 14px 14px;
253
+ mask-size: 14px 14px;
254
+ -webkit-mask-repeat: no-repeat;
255
+ mask-repeat: no-repeat;
256
+ -webkit-mask-position: center;
257
+ mask-position: center;
258
+ transition: transform 0.2s ease-out 0s;
259
+ transform-origin: center;
260
+ }
261
+
262
+ .nav-bar-tag-and-paths.collapsed .nav-bar-tag-icon::after,
263
+ .nav-bar-tag-group.collapsed .nav-bar-tag-group-icon::after {
264
+ transform: rotate(-90deg);
265
+ }
266
+
267
+ .nav-bar-tag-and-paths.expanded .nav-bar-tag-icon::after,
268
+ .nav-bar-tag-group.expanded .nav-bar-tag-group-icon::after {
269
+ transform: rotate(0deg);
270
+ }
271
+ .nav-scroll::-webkit-scrollbar {
272
+ width: 8px;
273
+ }
274
+ .nav-scroll::-webkit-scrollbar-track {
275
+ background: transparent;
276
+ }
277
+ .nav-scroll::-webkit-scrollbar-thumb {
278
+ background: var(--muted);
279
+ }
280
+ .nav-bar-tag-group {
281
+ margin-top: 6px;
282
+ margin-bottom: 2px;
283
+ }
284
+ .nav-bar-tag-group-header {
285
+ display: flex;
286
+ align-items: center;
287
+ justify-content: space-between;
288
+ padding: 8px 15px 4px 6px;
289
+ font-weight: 700;
290
+ text-transform: uppercase;
291
+ letter-spacing: 0.05em;
292
+ color: var(--sidebar-foreground);
293
+ cursor: pointer;
294
+ user-select: none;
295
+ border-inline-start: 4px solid transparent;
296
+ transition:
297
+ border-color 0.15s ease,
298
+ color 0.15s ease;
299
+ }
300
+ .nav-bar-tag-group-header:hover {
301
+ color: var(--sidebar-accent-foreground);
302
+ }
303
+ .nav-bar-tag-group-title {
304
+ flex: 1;
305
+ min-width: 0;
306
+ }
307
+ .nav-bar-tags-under-group {
308
+ border-inline-start: 1px solid var(--border);
309
+ margin-inline-start: 10px;
310
+ }
311
+
312
+ .nav-bar-tag {
313
+ color: var(--primary);
314
+ border-inline-start: 4px solid transparent;
315
+ font-weight: 600;
316
+ padding: 10px 15px 10px 10px;
317
+ text-transform: capitalize;
318
+ min-width: 0;
319
+ }
320
+ .nav-bar-tag a,
321
+ .nav-bar-tag-title,
322
+ a.nav-bar-tag-title {
323
+ color: inherit;
324
+ text-decoration: none;
325
+ flex: 1;
326
+ min-width: 0;
327
+ }
328
+ .nav-bar-tag a:hover,
329
+ .nav-bar-tag-title:hover,
330
+ a.nav-bar-tag-title:hover {
331
+ color: inherit;
332
+ text-decoration: none;
333
+ }
334
+ /* a description-only tag (show-unused-tags) is itself the link */
335
+ a.nav-bar-tag {
336
+ text-decoration: none;
337
+ }
338
+
339
+ .nav-bar-components,
340
+ .nav-bar-h1,
341
+ .nav-bar-h2,
342
+ .nav-bar-info,
343
+ .nav-bar-tag,
344
+ .nav-bar-path {
345
+ display: flex;
346
+ cursor: pointer;
347
+ /* Border-box and no underline here too: getNavCss() (@rapidoc/prerender) styles these on a page
348
+ without the component's global box-sizing reset and link styles */
349
+ box-sizing: border-box;
350
+ width: 100%;
351
+ border: none;
352
+ color: var(--sidebar-foreground);
353
+ background: transparent;
354
+ border-inline-start: 4px solid transparent;
355
+ text-decoration: none;
356
+ transition:
357
+ background 0.15s ease,
358
+ color 0.15s ease;
359
+ }
360
+
361
+ .nav-bar-path,
362
+ a.nav-bar-path {
363
+ align-items: center;
364
+ justify-content: space-between;
365
+ gap: 8px;
366
+ min-width: 0;
367
+ }
368
+
369
+ a.nav-bar-info:hover,
370
+ a.nav-bar-path:hover {
371
+ text-decoration: none;
372
+ }
373
+
374
+ .nav-bar-path > * {
375
+ pointer-events: none;
376
+ }
377
+
378
+ .nav-bar-path.deprecated {
379
+ filter: opacity(0.5);
380
+ }
381
+
382
+ .portal-sidebar-footer-link {
383
+ padding: 16px 12px;
384
+ }
385
+
386
+ .nav-bar-path-label {
387
+ display: flex;
388
+ align-items: baseline;
389
+ min-width: 0;
390
+ flex: 1;
391
+ }
392
+
393
+ .nav-bar-webhook {
394
+ font-weight: bold;
395
+ margin-right: 8px;
396
+ font-size: var(--font-size-xs);
397
+ flex-shrink: 0;
398
+ }
399
+
400
+ /* A path in place of the summary (use-path-in-nav-bar); also in the static navigation, which has no font styles */
401
+ .nav-bar-path-label .mono-font {
402
+ font-family: var(--font-mono);
403
+ }
404
+
405
+ .nav-method {
406
+ font-weight: bold;
407
+ margin-inline-start: auto;
408
+ flex-shrink: 0;
409
+ font-size: var(--font-size-xs);
410
+ white-space: nowrap;
411
+
412
+ &.false {
413
+ display: none;
414
+ }
415
+ }
416
+
417
+ .nav-method.as-colored-text {
418
+ color: var(--method-default);
419
+ }
420
+ .nav-method.as-colored-text.get {
421
+ color: var(--method-get);
422
+ }
423
+ .nav-method.as-colored-text.put {
424
+ color: var(--method-put);
425
+ }
426
+ .nav-method.as-colored-text.post {
427
+ color: var(--method-post);
428
+ }
429
+ .nav-method.as-colored-text.delete {
430
+ color: var(--method-delete);
431
+ }
432
+ .nav-method.as-colored-text.head {
433
+ color: var(--method-head);
434
+ }
435
+ .nav-method.as-colored-text.patch {
436
+ color: var(--method-patch);
437
+ }
438
+ .nav-method.as-colored-text.options {
439
+ color: var(--method-options);
440
+ }
441
+ .nav-method.as-colored-text.trace {
442
+ color: var(--method-trace);
443
+ }
444
+ .nav-method.as-colored-text.query {
445
+ color: var(--method-query);
446
+ }
447
+ .nav-method.as-colored-text.copy {
448
+ color: var(--method-default);
449
+ }
450
+ .nav-method.as-colored-text.purge {
451
+ color: var(--method-default);
452
+ }
453
+
454
+ .nav-method.as-colored-block {
455
+ padding: 1px 4px;
456
+ min-width: 32px;
457
+ text-align: center;
458
+ border-radius: 4px;
459
+ color: var(--method-badge-fg);
460
+ background: var(--method-default);
461
+ font-weight: 600;
462
+ }
463
+ :host([color-scheme='light']) .nav-method.as-colored-block {
464
+ color: var(--method-badge-fg);
465
+ }
466
+ @media (prefers-color-scheme: light) {
467
+ :host([color-scheme='system']) .nav-method.as-colored-block {
468
+ color: var(--method-badge-fg);
469
+ }
470
+ }
471
+ .colored-block .nav-method.as-colored-block {
472
+ outline: 1px solid;
473
+ }
474
+
475
+ .nav-method.as-colored-block.get {
476
+ background: var(--method-get);
477
+ }
478
+ .nav-method.as-colored-block.put {
479
+ background: var(--method-put);
480
+ }
481
+ .nav-method.as-colored-block.post {
482
+ background: var(--method-post);
483
+ }
484
+ .nav-method.as-colored-block.delete {
485
+ background: var(--method-delete);
486
+ }
487
+ .nav-method.as-colored-block.head {
488
+ background: var(--method-head);
489
+ }
490
+ .nav-method.as-colored-block.patch {
491
+ background: var(--method-patch);
492
+ }
493
+ .nav-method.as-colored-block.options {
494
+ background: var(--method-options);
495
+ }
496
+ .nav-method.as-colored-block.trace {
497
+ background: var(--method-trace);
498
+ }
499
+ .nav-method.as-colored-block.query {
500
+ background: var(--method-query);
501
+ }
502
+ .nav-method.as-colored-block.copy {
503
+ background: var(--method-default);
504
+ }
505
+ .nav-method.as-colored-block.purge {
506
+ background: var(--method-default);
507
+ }
508
+
509
+ .nav-bar-h1,
510
+ .nav-bar-h2,
511
+ .nav-bar-path {
512
+ font-weight: 400;
513
+ padding: var(--sidebar-item-padding);
514
+ }
515
+
516
+ .nav-bar-info {
517
+ padding: 12px 10px;
518
+ font-weight: 600;
519
+ }
520
+ .nav-bar-section {
521
+ display: flex;
522
+ flex-direction: row;
523
+ justify-content: space-between;
524
+ color: var(--foreground);
525
+ padding: var(--sidebar-item-padding);
526
+ font-weight: 700;
527
+ }
528
+ .nav-bar-section.operations {
529
+ display: none !important;
530
+ }
531
+
532
+ .nav-bar-section:first-child {
533
+ display: none;
534
+ }
535
+ .nav-bar-h2 {
536
+ padding-inline-start: 28px;
537
+ }
538
+
539
+ /* Active item indicator - always left-bar style */
540
+ .nav-bar-h1.active,
541
+ .nav-bar-h2.active,
542
+ .nav-bar-info.active,
543
+ .nav-bar-tag.active,
544
+ .nav-bar-path.active,
545
+ .nav-bar-section.operations.active,
546
+ .nav-bar-h1.left-bar.active,
547
+ .nav-bar-h2.left-bar.active,
548
+ .nav-bar-info.left-bar.active,
549
+ .nav-bar-tag.left-bar.active,
550
+ .nav-bar-path.left-bar.active,
551
+ .nav-bar-section.left-bar.operations.active {
552
+ border-inline-start: 4px solid var(--sidebar-primary);
553
+ color: var(--sidebar-primary);
554
+ }
555
+
556
+ .nav-bar-h1.active:hover,
557
+ .nav-bar-h2.active:hover,
558
+ .nav-bar-info.active:hover,
559
+ .nav-bar-tag.active:hover,
560
+ .nav-bar-path.active:hover,
561
+ .nav-bar-section.operations.active:hover,
562
+ .nav-bar-h1.left-bar.active:hover,
563
+ .nav-bar-h2.left-bar.active:hover,
564
+ .nav-bar-info.left-bar.active:hover,
565
+ .nav-bar-tag.left-bar.active:hover,
566
+ .nav-bar-path.left-bar.active:hover,
567
+ .nav-bar-section.left-bar.operations.active:hover {
568
+ color: var(--sidebar-primary);
569
+ }
570
+
571
+ /* Highlight collapsed parents using modern CSS :has() */
572
+ .nav-bar-tag-and-paths.collapsed:has(.nav-bar-path.active) > .nav-bar-tag {
573
+ border-inline-start-color: var(--sidebar-primary);
574
+ color: var(--sidebar-primary);
575
+ }
576
+
577
+ .nav-bar-tag-group.collapsed:has(.active) > .nav-bar-tag-group-header {
578
+ border-inline-start-color: var(--sidebar-primary);
579
+ color: var(--sidebar-primary);
580
+ }
581
+
582
+ .nav-bar-tag-and-paths.collapsed:has(.nav-bar-path.active) > .nav-bar-tag:hover,
583
+ .nav-bar-tag-group.collapsed:has(.active) > .nav-bar-tag-group-header:hover {
584
+ color: var(--sidebar-primary);
585
+ }
586
+
587
+ .nav-bar-h1:hover,
588
+ .nav-bar-h2:hover,
589
+ .nav-bar-info:hover,
590
+ .nav-bar-tag:hover,
591
+ .nav-bar-path:hover {
592
+ color: var(--sidebar-accent-foreground);
593
+ background: var(--sidebar-accent);
594
+ }
595
+
596
+ /* nav-item-overflow: ellipsis (default) vs wrap */
597
+ :host([nav-item-overflow='ellipsis']) .nav-bar-tag-group-title,
598
+ :host(:not([nav-item-overflow])) .nav-bar-tag-group-title,
599
+ .overflow-ellipsis .nav-bar-tag-group-title,
600
+ :host([nav-item-overflow='ellipsis']) .nav-bar-tag-title,
601
+ :host(:not([nav-item-overflow])) .nav-bar-tag-title,
602
+ .overflow-ellipsis .nav-bar-tag-title,
603
+ :host([nav-item-overflow='ellipsis']) .nav-bar-path-label,
604
+ :host(:not([nav-item-overflow])) .nav-bar-path-label,
605
+ .overflow-ellipsis .nav-bar-path-label,
606
+ :host([nav-item-overflow='ellipsis']) .nav-bar-info,
607
+ :host(:not([nav-item-overflow])) .nav-bar-info,
608
+ .overflow-ellipsis .nav-bar-info,
609
+ :host([nav-item-overflow='ellipsis']) .nav-bar-section-title,
610
+ :host(:not([nav-item-overflow])) .nav-bar-section-title,
611
+ .overflow-ellipsis .nav-bar-section-title {
612
+ white-space: nowrap;
613
+ overflow: hidden;
614
+ text-overflow: ellipsis;
615
+ display: block;
616
+ }
617
+
618
+ :host([nav-item-overflow='wrap']) .nav-bar-tag-group-title,
619
+ .overflow-wrap .nav-bar-tag-group-title,
620
+ :host([nav-item-overflow='wrap']) .nav-bar-tag-title,
621
+ .overflow-wrap .nav-bar-tag-title,
622
+ :host([nav-item-overflow='wrap']) .nav-bar-path-label,
623
+ .overflow-wrap .nav-bar-path-label,
624
+ :host([nav-item-overflow='wrap']) .nav-bar-info,
625
+ .overflow-wrap .nav-bar-info,
626
+ :host([nav-item-overflow='wrap']) .nav-bar-section-title,
627
+ .overflow-wrap .nav-bar-section-title {
628
+ white-space: normal;
629
+ overflow: visible;
630
+ text-overflow: clip;
631
+ word-break: break-word;
632
+ }
633
+ `;