@veluai/velu 0.2.25 → 0.2.28

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/README.md +80 -80
  2. package/dist/cli.js +44 -44
  3. package/package.json +64 -64
  4. package/runtime/velu-ui/base.css +320 -320
  5. package/runtime/velu-ui/components/Accordion.jsx +64 -64
  6. package/runtime/velu-ui/components/ApiClient.jsx +207 -207
  7. package/runtime/velu-ui/components/ApiField.jsx +87 -87
  8. package/runtime/velu-ui/components/ApiPath.jsx +63 -63
  9. package/runtime/velu-ui/components/ApiReferencePage.jsx +384 -384
  10. package/runtime/velu-ui/components/ApiSamples.jsx +36 -36
  11. package/runtime/velu-ui/components/ApiSidebar.jsx +125 -125
  12. package/runtime/velu-ui/components/AskBar.jsx +71 -71
  13. package/runtime/velu-ui/components/Callout.jsx +114 -114
  14. package/runtime/velu-ui/components/Card.jsx +131 -131
  15. package/runtime/velu-ui/components/ChangelogFilters.jsx +75 -75
  16. package/runtime/velu-ui/components/Chatbot.jsx +972 -972
  17. package/runtime/velu-ui/components/CodeBlock.jsx +375 -375
  18. package/runtime/velu-ui/components/Columns.jsx +56 -56
  19. package/runtime/velu-ui/components/ContextMenu.jsx +327 -327
  20. package/runtime/velu-ui/components/ErrorCard.jsx +138 -138
  21. package/runtime/velu-ui/components/Field.jsx +81 -81
  22. package/runtime/velu-ui/components/Image.jsx +163 -163
  23. package/runtime/velu-ui/components/Logo.jsx +31 -31
  24. package/runtime/velu-ui/components/MethodBadge.jsx +31 -31
  25. package/runtime/velu-ui/components/NavSelect.jsx +108 -108
  26. package/runtime/velu-ui/components/NotFound.jsx +63 -63
  27. package/runtime/velu-ui/components/PageFeedback.jsx +219 -219
  28. package/runtime/velu-ui/components/PageFooter.jsx +145 -145
  29. package/runtime/velu-ui/components/PageHeader.jsx +422 -422
  30. package/runtime/velu-ui/components/PageNav.jsx +77 -77
  31. package/runtime/velu-ui/components/PoweredBy.jsx +51 -51
  32. package/runtime/velu-ui/components/Prompt.jsx +115 -115
  33. package/runtime/velu-ui/components/Search.jsx +460 -460
  34. package/runtime/velu-ui/components/Sidebar.jsx +246 -246
  35. package/runtime/velu-ui/components/SocialLinks.jsx +90 -90
  36. package/runtime/velu-ui/components/Steps.jsx +65 -65
  37. package/runtime/velu-ui/components/ThemeToggle.jsx +48 -48
  38. package/runtime/velu-ui/components/Toc.jsx +537 -537
  39. package/runtime/velu-ui/components/TocBar.jsx +195 -195
  40. package/runtime/velu-ui/components/Tree.jsx +87 -87
  41. package/runtime/velu-ui/components/TryItBar.jsx +102 -102
  42. package/runtime/velu-ui/components/Update.jsx +92 -92
  43. package/runtime/velu-ui/components/accordion.css +92 -92
  44. package/runtime/velu-ui/components/api-page.css +208 -208
  45. package/runtime/velu-ui/components/api.css +635 -635
  46. package/runtime/velu-ui/components/ask-bar.css +103 -103
  47. package/runtime/velu-ui/components/card.css +105 -105
  48. package/runtime/velu-ui/components/changelog-filters.css +43 -43
  49. package/runtime/velu-ui/components/chatbot.css +687 -687
  50. package/runtime/velu-ui/components/code-block.css +263 -263
  51. package/runtime/velu-ui/components/context-menu.css +199 -199
  52. package/runtime/velu-ui/components/docs-layout.css +822 -822
  53. package/runtime/velu-ui/components/field.css +82 -82
  54. package/runtime/velu-ui/components/image.css +237 -237
  55. package/runtime/velu-ui/components/nav-select.css +157 -157
  56. package/runtime/velu-ui/components/not-found.css +94 -94
  57. package/runtime/velu-ui/components/page-feedback.css +261 -261
  58. package/runtime/velu-ui/components/page-footer.css +130 -130
  59. package/runtime/velu-ui/components/page-header.css +558 -558
  60. package/runtime/velu-ui/components/page-nav.css +50 -50
  61. package/runtime/velu-ui/components/powered-by.css +92 -92
  62. package/runtime/velu-ui/components/prompt.css +99 -99
  63. package/runtime/velu-ui/components/search.css +307 -307
  64. package/runtime/velu-ui/components/sidebar.css +205 -205
  65. package/runtime/velu-ui/components/steps.css +77 -77
  66. package/runtime/velu-ui/components/theme-toggle.css +102 -102
  67. package/runtime/velu-ui/components/toc-bar.css +234 -234
  68. package/runtime/velu-ui/components/tree.css +49 -49
  69. package/runtime/velu-ui/components/update.css +111 -111
  70. package/runtime/velu-ui/index.js +58 -58
  71. package/runtime/velu-ui/lib/api-send.js +118 -118
  72. package/runtime/velu-ui/lib/brand-icons.jsx +103 -103
  73. package/runtime/velu-ui/lib/component-schemas.js +100 -100
  74. package/runtime/velu-ui/lib/copyText.js +64 -64
  75. package/runtime/velu-ui/lib/docs-assistant.js +273 -273
  76. package/runtime/velu-ui/lib/lang-icons.jsx +147 -147
  77. package/runtime/velu-ui/lib/page-feedback.js +72 -72
  78. package/runtime/velu-ui/lib/pagefind.js +116 -116
  79. package/runtime/velu-ui/lib/prism-langs.js +957 -957
  80. package/runtime/velu-ui/lib/prism-loader.js +74 -74
  81. package/runtime/velu-ui/lib/resolveIcon.jsx +29 -29
  82. package/runtime/velu-ui/lib/scrollIntoNearestView.js +66 -66
  83. package/runtime/velu-ui/mdx-components.jsx +107 -107
  84. package/runtime/velu-ui/primitives/Cluster.jsx +49 -49
  85. package/runtime/velu-ui/primitives/Stack.jsx +63 -63
  86. package/runtime/velu-ui/primitives/Switcher.jsx +57 -57
  87. package/runtime/velu-ui/primitives/stack.css +3 -3
  88. package/runtime/velu-ui/primitives/switcher.css +25 -25
  89. package/runtime/velu-ui/styles.css +48 -48
  90. package/runtime/velu-ui/tokens.css +4 -4
  91. package/schema/velu.schema.json +419 -419
  92. package/src/lib/extract-mdx-error.js +170 -170
  93. package/src/lib/issues.js +159 -159
  94. package/src/lib/known-components.js +35 -35
  95. package/src/navigation.js +459 -459
  96. package/src/runtime/App.jsx +1754 -1754
  97. package/src/runtime/ErrorBoundary.jsx +54 -54
  98. package/src/runtime/client-entry.jsx +27 -27
  99. package/src/runtime/server-entry.jsx +24 -24
  100. package/src/template.html +48 -48
  101. package/templates/starter/ai-tools/claude-code.mdx +26 -26
  102. package/templates/starter/ai-tools/cursor.mdx +17 -17
  103. package/templates/starter/api-reference/introduction.mdx +43 -43
  104. package/templates/starter/development.mdx +19 -19
  105. package/templates/starter/essentials/code.mdx +29 -29
  106. package/templates/starter/essentials/images.mdx +29 -29
  107. package/templates/starter/essentials/markdown.mdx +25 -25
  108. package/templates/starter/essentials/navigation.mdx +39 -39
  109. package/templates/starter/essentials/settings.mdx +30 -30
  110. package/templates/starter/favicon.svg +6 -6
  111. package/templates/starter/index.mdx +31 -31
  112. package/templates/starter/openapi.json +160 -160
  113. package/templates/starter/quickstart.mdx +31 -31
  114. package/templates/starter/velu.json +40 -40
@@ -1,103 +1,103 @@
1
- /* AskBar — "ask a question" input card. All values are tokens;
2
- light/dark via [data-theme]. The component itself only owns the
3
- card visuals — the CONSUMER places it (the docs page pins it to the
4
- bottom of the scrolling article so content scrolls behind it). */
5
-
6
- /* Hidden at mobile widths — too crowded on a 375px column, and the
7
- header's Ask AI icon already opens the same chatbot. */
8
- @container docs (max-width: 640px) {
9
- .velu-ask-bar {
10
- display: none;
11
- }
12
- }
13
-
14
- .velu-ask-bar {
15
- /* `relative` establishes the containing block for the absolute send
16
- button. Actual page placement (absolute / sticky / fixed) is set
17
- by the consumer. */
18
- position: relative;
19
- z-index: 20;
20
- background: var(--page-bg);
21
- border: var(--border-width) solid var(--border-color);
22
- border-radius: var(--radius-md);
23
- /* Soft lift so it reads as floating above the scrolling article. */
24
- box-shadow:
25
- 0 var(--s-1) var(--s1) color-mix(in srgb, #000 14%, transparent),
26
- 0 0 var(--s0) color-mix(in srgb, #000 6%, transparent);
27
- transition:
28
- border-color 0.15s ease,
29
- box-shadow 0.15s ease;
30
- }
31
-
32
- /* Dark mode only: the page bg is near-black and the default border sits
33
- right on top of it, so the card visually merged into the article. Lift the
34
- card onto a slightly elevated grey and give it a clearly visible border so
35
- the "ask a question" control always reads as attached. Light mode unchanged. */
36
- :root[data-theme="dark"] .velu-ask-bar {
37
- background: #15171a;
38
- border-color: #41444a;
39
- }
40
-
41
- /* Cursor in the input → accent border + accent glow ring. */
42
- .velu-ask-bar:focus-within {
43
- border-color: var(--accent-color);
44
- box-shadow:
45
- 0 0 0 var(--border-width) var(--accent-color),
46
- 0 0 var(--s1) color-mix(in srgb, var(--accent-color) 40%, transparent);
47
- }
48
-
49
- /* Multi-line input. padding-inline-end clears the send button so typed
50
- text never runs under it. */
51
- .velu-ask-bar__input {
52
- display: block;
53
- inline-size: 100%;
54
- box-sizing: border-box;
55
- padding: var(--s0);
56
- padding-inline-end: calc(var(--s0) + 2.5em);
57
- border: 0;
58
- background: transparent;
59
- resize: none;
60
- font: inherit;
61
- font-size: var(--f-body);
62
- line-height: var(--lh-body);
63
- color: var(--text-color);
64
- }
65
- .velu-ask-bar__input:focus {
66
- outline: none;
67
- }
68
- .velu-ask-bar__input::placeholder {
69
- color: var(--muted-color);
70
- }
71
-
72
- /* Circular accent send button, pinned to the bottom-inline-end corner. */
73
- .velu-ask-bar__send {
74
- position: absolute;
75
- inset-block-end: var(--s-1);
76
- inset-inline-end: var(--s-1);
77
- display: inline-flex;
78
- align-items: center;
79
- justify-content: center;
80
- inline-size: 2.5em;
81
- block-size: 2.5em;
82
- padding: 0;
83
- border: 0;
84
- border-radius: 50%;
85
- background: var(--accent-color);
86
- color: #fff;
87
- cursor: pointer;
88
- }
89
- .velu-ask-bar__send:hover {
90
- background: color-mix(in srgb, var(--accent-color) 88%, #000);
91
- }
92
- .velu-ask-bar__send:focus-visible {
93
- outline: var(--border-width) solid var(--text-color);
94
- outline-offset: 2px;
95
- }
96
- /* Disabled (input empty) — a dimmed accent (still in the brand
97
- palette) so the button reads as "not yet ready" rather than a
98
- different control entirely. No pointer events / hover affordance. */
99
- .velu-ask-bar__send:disabled {
100
- background: color-mix(in srgb, var(--accent-color) 35%, transparent);
101
- cursor: not-allowed;
102
- pointer-events: none;
103
- }
1
+ /* AskBar — "ask a question" input card. All values are tokens;
2
+ light/dark via [data-theme]. The component itself only owns the
3
+ card visuals — the CONSUMER places it (the docs page pins it to the
4
+ bottom of the scrolling article so content scrolls behind it). */
5
+
6
+ /* Hidden at mobile widths — too crowded on a 375px column, and the
7
+ header's Ask AI icon already opens the same chatbot. */
8
+ @container docs (max-width: 640px) {
9
+ .velu-ask-bar {
10
+ display: none;
11
+ }
12
+ }
13
+
14
+ .velu-ask-bar {
15
+ /* `relative` establishes the containing block for the absolute send
16
+ button. Actual page placement (absolute / sticky / fixed) is set
17
+ by the consumer. */
18
+ position: relative;
19
+ z-index: 20;
20
+ background: var(--page-bg);
21
+ border: var(--border-width) solid var(--border-color);
22
+ border-radius: var(--radius-md);
23
+ /* Soft lift so it reads as floating above the scrolling article. */
24
+ box-shadow:
25
+ 0 var(--s-1) var(--s1) color-mix(in srgb, #000 14%, transparent),
26
+ 0 0 var(--s0) color-mix(in srgb, #000 6%, transparent);
27
+ transition:
28
+ border-color 0.15s ease,
29
+ box-shadow 0.15s ease;
30
+ }
31
+
32
+ /* Dark mode only: the page bg is near-black and the default border sits
33
+ right on top of it, so the card visually merged into the article. Lift the
34
+ card onto a slightly elevated grey and give it a clearly visible border so
35
+ the "ask a question" control always reads as attached. Light mode unchanged. */
36
+ :root[data-theme="dark"] .velu-ask-bar {
37
+ background: rgb(38, 40, 39);
38
+ border-color: #41444a;
39
+ }
40
+
41
+ /* Cursor in the input → accent border + accent glow ring. */
42
+ .velu-ask-bar:focus-within {
43
+ border-color: var(--accent-color);
44
+ box-shadow:
45
+ 0 0 0 var(--border-width) var(--accent-color),
46
+ 0 0 var(--s1) color-mix(in srgb, var(--accent-color) 40%, transparent);
47
+ }
48
+
49
+ /* Multi-line input. padding-inline-end clears the send button so typed
50
+ text never runs under it. */
51
+ .velu-ask-bar__input {
52
+ display: block;
53
+ inline-size: 100%;
54
+ box-sizing: border-box;
55
+ padding: var(--s0);
56
+ padding-inline-end: calc(var(--s0) + 2.5em);
57
+ border: 0;
58
+ background: transparent;
59
+ resize: none;
60
+ font: inherit;
61
+ font-size: var(--f-body);
62
+ line-height: var(--lh-body);
63
+ color: var(--text-color);
64
+ }
65
+ .velu-ask-bar__input:focus {
66
+ outline: none;
67
+ }
68
+ .velu-ask-bar__input::placeholder {
69
+ color: var(--muted-color);
70
+ }
71
+
72
+ /* Circular accent send button, pinned to the bottom-inline-end corner. */
73
+ .velu-ask-bar__send {
74
+ position: absolute;
75
+ inset-block-end: var(--s-1);
76
+ inset-inline-end: var(--s-1);
77
+ display: inline-flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ inline-size: 2.5em;
81
+ block-size: 2.5em;
82
+ padding: 0;
83
+ border: 0;
84
+ border-radius: 50%;
85
+ background: var(--accent-color);
86
+ color: #fff;
87
+ cursor: pointer;
88
+ }
89
+ .velu-ask-bar__send:hover {
90
+ background: color-mix(in srgb, var(--accent-color) 88%, #000);
91
+ }
92
+ .velu-ask-bar__send:focus-visible {
93
+ outline: var(--border-width) solid var(--text-color);
94
+ outline-offset: 2px;
95
+ }
96
+ /* Disabled (input empty) — a dimmed accent (still in the brand
97
+ palette) so the button reads as "not yet ready" rather than a
98
+ different control entirely. No pointer events / hover affordance. */
99
+ .velu-ask-bar__send:disabled {
100
+ background: color-mix(in srgb, var(--accent-color) 35%, transparent);
101
+ cursor: not-allowed;
102
+ pointer-events: none;
103
+ }
@@ -1,105 +1,105 @@
1
- /* Card — all values tokens; light/dark via [data-theme]. Selectors required
2
- (cta hover, image clip, group grid) so this has CSS. Namespaced. */
3
-
4
- .velu-card {
5
- display: flex;
6
- flex-direction: column;
7
- border: var(--border-width) solid var(--border-color);
8
- border-radius: var(--radius-md);
9
- overflow: hidden; /* clips the image to the rounded corners */
10
- background: var(--page-bg);
11
- color: var(--text-color);
12
- text-decoration: none;
13
- }
14
-
15
- /* CTA card: the whole card is the click target (stretched-link pattern —
16
- the CTA stays the single real <a>; a ::after overlay makes the entire
17
- card clickable, valid + accessible, no JS). Hover highlights border+CTA. */
18
- .velu-card--cta {
19
- position: relative;
20
- cursor: pointer;
21
- transition: border-color 0.15s ease;
22
- }
23
- .velu-card--cta .velu-card__cta::after {
24
- content: '';
25
- position: absolute;
26
- inset: 0;
27
- }
28
- .velu-card--cta:hover {
29
- border-color: var(--accent-color);
30
- }
31
- .velu-card--cta:hover .velu-card__cta {
32
- color: var(--accent-color);
33
- }
34
-
35
- .velu-card__body {
36
- display: flex;
37
- flex-direction: column;
38
- gap: var(--s-2);
39
- padding: var(--s0) var(--s3);
40
- }
41
- .velu-card--horizontal .velu-card__body {
42
- flex-direction: row;
43
- align-items: center; /* icon vertically centered against the content */
44
- gap: var(--s0);
45
- }
46
- .velu-card__content {
47
- display: flex;
48
- flex-direction: column;
49
- gap: var(--s-2);
50
- min-width: 0;
51
- }
52
-
53
- .velu-card__icon {
54
- display: inline-flex;
55
- flex: none;
56
- align-items: center;
57
- inline-size: var(--f-h2);
58
- block-size: var(--f-h2);
59
- color: var(--accent-color);
60
- font-size: var(--f-h2);
61
- }
62
- .velu-card__title {
63
- font-size: var(--f-h4);
64
- line-height: var(--lh-h4);
65
- font-weight: 500;
66
- }
67
- .velu-card__text {
68
- font-size: var(--f-body);
69
- line-height: var(--lh-body);
70
- }
71
- .velu-card__cta {
72
- display: inline-flex;
73
- align-items: center;
74
- gap: var(--s-3);
75
- margin-block-start: var(--s-2);
76
- font-weight: 500;
77
- color: var(--text-color);
78
- text-decoration: none;
79
- cursor: pointer;
80
- width: fit-content; /* only the link itself is the click target */
81
- transition: color 0.15s ease;
82
- }
83
- .velu-card__cta:hover {
84
- color: var(--accent-color);
85
- }
86
- .velu-card__cta-icon {
87
- display: inline-flex;
88
- flex: none;
89
- }
90
-
91
- .velu-card__media {
92
- display: block;
93
- }
94
- .velu-card__media img {
95
- display: block;
96
- inline-size: 100%;
97
- block-size: auto;
98
- object-fit: cover;
99
- }
100
-
101
- /* CardGroup layout is the Switcher primitive (composed in Card.jsx). Its
102
- threshold is computed count-aware in Card.jsx so the row flips to a full
103
- vertical stack the moment any one card would fall below --card-min — true
104
- Switcher behaviour (all-or-nothing), not multi-row wrap. No rule needed
105
- here; Switcher owns row↔column + gap via switcher.css. */
1
+ /* Card — all values tokens; light/dark via [data-theme]. Selectors required
2
+ (cta hover, image clip, group grid) so this has CSS. Namespaced. */
3
+
4
+ .velu-card {
5
+ display: flex;
6
+ flex-direction: column;
7
+ border: var(--border-width) solid var(--border-color);
8
+ border-radius: var(--radius-md);
9
+ overflow: hidden; /* clips the image to the rounded corners */
10
+ background: var(--page-bg);
11
+ color: var(--text-color);
12
+ text-decoration: none;
13
+ }
14
+
15
+ /* CTA card: the whole card is the click target (stretched-link pattern —
16
+ the CTA stays the single real <a>; a ::after overlay makes the entire
17
+ card clickable, valid + accessible, no JS). Hover highlights border+CTA. */
18
+ .velu-card--cta {
19
+ position: relative;
20
+ cursor: pointer;
21
+ transition: border-color 0.15s ease;
22
+ }
23
+ .velu-card--cta .velu-card__cta::after {
24
+ content: '';
25
+ position: absolute;
26
+ inset: 0;
27
+ }
28
+ .velu-card--cta:hover {
29
+ border-color: var(--accent-color);
30
+ }
31
+ .velu-card--cta:hover .velu-card__cta {
32
+ color: var(--accent-color);
33
+ }
34
+
35
+ .velu-card__body {
36
+ display: flex;
37
+ flex-direction: column;
38
+ gap: var(--s-2);
39
+ padding: var(--s0) var(--s3);
40
+ }
41
+ .velu-card--horizontal .velu-card__body {
42
+ flex-direction: row;
43
+ align-items: center; /* icon vertically centered against the content */
44
+ gap: var(--s0);
45
+ }
46
+ .velu-card__content {
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: var(--s-2);
50
+ min-width: 0;
51
+ }
52
+
53
+ .velu-card__icon {
54
+ display: inline-flex;
55
+ flex: none;
56
+ align-items: center;
57
+ inline-size: var(--f-h2);
58
+ block-size: var(--f-h2);
59
+ color: var(--accent-color);
60
+ font-size: var(--f-h2);
61
+ }
62
+ .velu-card__title {
63
+ font-size: var(--f-h4);
64
+ line-height: var(--lh-h4);
65
+ font-weight: 500;
66
+ }
67
+ .velu-card__text {
68
+ font-size: var(--f-body);
69
+ line-height: var(--lh-body);
70
+ }
71
+ .velu-card__cta {
72
+ display: inline-flex;
73
+ align-items: center;
74
+ gap: var(--s-3);
75
+ margin-block-start: var(--s-2);
76
+ font-weight: 500;
77
+ color: var(--text-color);
78
+ text-decoration: none;
79
+ cursor: pointer;
80
+ width: fit-content; /* only the link itself is the click target */
81
+ transition: color 0.15s ease;
82
+ }
83
+ .velu-card__cta:hover {
84
+ color: var(--accent-color);
85
+ }
86
+ .velu-card__cta-icon {
87
+ display: inline-flex;
88
+ flex: none;
89
+ }
90
+
91
+ .velu-card__media {
92
+ display: block;
93
+ }
94
+ .velu-card__media img {
95
+ display: block;
96
+ inline-size: 100%;
97
+ block-size: auto;
98
+ object-fit: cover;
99
+ }
100
+
101
+ /* CardGroup layout is the Switcher primitive (composed in Card.jsx). Its
102
+ threshold is computed count-aware in Card.jsx so the row flips to a full
103
+ vertical stack the moment any one card would fall below --card-min — true
104
+ Switcher behaviour (all-or-nothing), not multi-row wrap. No rule needed
105
+ here; Switcher owns row↔column + gap via switcher.css. */
@@ -1,43 +1,43 @@
1
- /* Changelog tag filters — shown in the right rail in place of the TOC on
2
- changelog pages. Tokenized; light/dark via [data-theme]. */
3
-
4
- .velu-changelog-filters {
5
- display: flex;
6
- flex-direction: column;
7
- gap: var(--s-1);
8
- }
9
-
10
- .velu-changelog-filters__heading {
11
- font-size: var(--f-h6);
12
- font-weight: var(--weight-semibold);
13
- color: var(--accent-color);
14
- }
15
-
16
- .velu-changelog-filters__list {
17
- display: flex;
18
- flex-wrap: wrap;
19
- gap: var(--s-2);
20
- }
21
-
22
- .velu-changelog-filter {
23
- cursor: pointer;
24
- border-radius: 999px;
25
- padding: 0.22rem 0.65rem;
26
- font-size: var(--f-h6);
27
- font-weight: var(--weight-medium);
28
- color: var(--text-color);
29
- background: color-mix(in srgb, var(--muted-color) 14%, transparent);
30
- border: var(--border-width) solid transparent;
31
- transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
32
- }
33
-
34
- .velu-changelog-filter:hover {
35
- border-color: color-mix(in srgb, var(--accent-color) 40%, var(--border-color));
36
- background: color-mix(in srgb, var(--accent-color) 8%, transparent);
37
- }
38
-
39
- .velu-changelog-filter--active {
40
- color: var(--accent-color);
41
- border-color: color-mix(in srgb, var(--accent-color) 55%, transparent);
42
- background: color-mix(in srgb, var(--accent-color) 12%, transparent);
43
- }
1
+ /* Changelog tag filters — shown in the right rail in place of the TOC on
2
+ changelog pages. Tokenized; light/dark via [data-theme]. */
3
+
4
+ .velu-changelog-filters {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: var(--s-1);
8
+ }
9
+
10
+ .velu-changelog-filters__heading {
11
+ font-size: var(--f-h6);
12
+ font-weight: var(--weight-semibold);
13
+ color: var(--accent-color);
14
+ }
15
+
16
+ .velu-changelog-filters__list {
17
+ display: flex;
18
+ flex-wrap: wrap;
19
+ gap: var(--s-2);
20
+ }
21
+
22
+ .velu-changelog-filter {
23
+ cursor: pointer;
24
+ border-radius: 999px;
25
+ padding: 0.22rem 0.65rem;
26
+ font-size: var(--f-h6);
27
+ font-weight: var(--weight-medium);
28
+ color: var(--text-color);
29
+ background: color-mix(in srgb, var(--muted-color) 14%, transparent);
30
+ border: var(--border-width) solid transparent;
31
+ transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
32
+ }
33
+
34
+ .velu-changelog-filter:hover {
35
+ border-color: color-mix(in srgb, var(--accent-color) 40%, var(--border-color));
36
+ background: color-mix(in srgb, var(--accent-color) 8%, transparent);
37
+ }
38
+
39
+ .velu-changelog-filter--active {
40
+ color: var(--accent-color);
41
+ border-color: color-mix(in srgb, var(--accent-color) 55%, transparent);
42
+ background: color-mix(in srgb, var(--accent-color) 12%, transparent);
43
+ }