vocs 2.0.17 → 2.1.2

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 (306) hide show
  1. package/dist/config.d.ts +1 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +1 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/globals.d.ts +16 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/internal/config.d.ts +28 -0
  11. package/dist/internal/config.d.ts.map +1 -1
  12. package/dist/internal/config.js +10 -2
  13. package/dist/internal/config.js.map +1 -1
  14. package/dist/internal/llms.d.ts +21 -2
  15. package/dist/internal/llms.d.ts.map +1 -1
  16. package/dist/internal/llms.js +41 -1
  17. package/dist/internal/llms.js.map +1 -1
  18. package/dist/internal/markdown-negotiation.d.ts +36 -0
  19. package/dist/internal/markdown-negotiation.d.ts.map +1 -0
  20. package/dist/internal/markdown-negotiation.js +81 -0
  21. package/dist/internal/markdown-negotiation.js.map +1 -0
  22. package/dist/internal/markdown.d.ts.map +1 -1
  23. package/dist/internal/markdown.js +5 -0
  24. package/dist/internal/markdown.js.map +1 -1
  25. package/dist/internal/openapi/anchors.d.ts +25 -0
  26. package/dist/internal/openapi/anchors.d.ts.map +1 -0
  27. package/dist/internal/openapi/anchors.js +37 -0
  28. package/dist/internal/openapi/anchors.js.map +1 -0
  29. package/dist/internal/openapi/app.d.ts +89 -0
  30. package/dist/internal/openapi/app.d.ts.map +1 -0
  31. package/dist/internal/openapi/app.js +62 -0
  32. package/dist/internal/openapi/app.js.map +1 -0
  33. package/dist/internal/openapi/index.d.ts +8 -0
  34. package/dist/internal/openapi/index.d.ts.map +1 -0
  35. package/dist/internal/openapi/index.js +5 -0
  36. package/dist/internal/openapi/index.js.map +1 -0
  37. package/dist/internal/openapi/markdown.d.ts +42 -0
  38. package/dist/internal/openapi/markdown.d.ts.map +1 -0
  39. package/dist/internal/openapi/markdown.js +235 -0
  40. package/dist/internal/openapi/markdown.js.map +1 -0
  41. package/dist/internal/openapi/openapi.d.ts +187 -0
  42. package/dist/internal/openapi/openapi.d.ts.map +1 -0
  43. package/dist/internal/openapi/openapi.js +44 -0
  44. package/dist/internal/openapi/openapi.js.map +1 -0
  45. package/dist/internal/openapi/openrpc.d.ts +90 -0
  46. package/dist/internal/openapi/openrpc.d.ts.map +1 -0
  47. package/dist/internal/openapi/openrpc.js +213 -0
  48. package/dist/internal/openapi/openrpc.js.map +1 -0
  49. package/dist/internal/openapi/parser.d.ts +181 -0
  50. package/dist/internal/openapi/parser.d.ts.map +1 -0
  51. package/dist/internal/openapi/parser.js +329 -0
  52. package/dist/internal/openapi/parser.js.map +1 -0
  53. package/dist/internal/openapi/registry.d.ts +36 -0
  54. package/dist/internal/openapi/registry.d.ts.map +1 -0
  55. package/dist/internal/openapi/registry.js +79 -0
  56. package/dist/internal/openapi/registry.js.map +1 -0
  57. package/dist/internal/openapi/sample.d.ts +115 -0
  58. package/dist/internal/openapi/sample.d.ts.map +1 -0
  59. package/dist/internal/openapi/sample.js +434 -0
  60. package/dist/internal/openapi/sample.js.map +1 -0
  61. package/dist/internal/openapi/search.d.ts +19 -0
  62. package/dist/internal/openapi/search.d.ts.map +1 -0
  63. package/dist/internal/openapi/search.js +98 -0
  64. package/dist/internal/openapi/search.js.map +1 -0
  65. package/dist/internal/openapi/sidebar.d.ts +30 -0
  66. package/dist/internal/openapi/sidebar.d.ts.map +1 -0
  67. package/dist/internal/openapi/sidebar.js +67 -0
  68. package/dist/internal/openapi/sidebar.js.map +1 -0
  69. package/dist/internal/openapi/union.d.ts +36 -0
  70. package/dist/internal/openapi/union.d.ts.map +1 -0
  71. package/dist/internal/openapi/union.js +69 -0
  72. package/dist/internal/openapi/union.js.map +1 -0
  73. package/dist/internal/search.d.ts.map +1 -1
  74. package/dist/internal/search.js +20 -0
  75. package/dist/internal/search.js.map +1 -1
  76. package/dist/internal/vite-plugins.d.ts +12 -0
  77. package/dist/internal/vite-plugins.d.ts.map +1 -1
  78. package/dist/internal/vite-plugins.js +102 -11
  79. package/dist/internal/vite-plugins.js.map +1 -1
  80. package/dist/react/Badge.d.ts +2 -3
  81. package/dist/react/Badge.d.ts.map +1 -1
  82. package/dist/react/Layout.client.d.ts.map +1 -1
  83. package/dist/react/Layout.client.js +2 -2
  84. package/dist/react/Layout.client.js.map +1 -1
  85. package/dist/react/OpenApi.d.ts +6 -0
  86. package/dist/react/OpenApi.d.ts.map +1 -0
  87. package/dist/react/OpenApi.js +6 -0
  88. package/dist/react/OpenApi.js.map +1 -0
  89. package/dist/react/internal/CodeToHtml.client.d.ts +53 -2
  90. package/dist/react/internal/CodeToHtml.client.d.ts.map +1 -1
  91. package/dist/react/internal/CodeToHtml.client.js +154 -21
  92. package/dist/react/internal/CodeToHtml.client.js.map +1 -1
  93. package/dist/react/internal/Sidebar.d.ts.map +1 -1
  94. package/dist/react/internal/Sidebar.js +99 -2
  95. package/dist/react/internal/Sidebar.js.map +1 -1
  96. package/dist/react/internal/openapi/CodeSample.client.d.ts +21 -0
  97. package/dist/react/internal/openapi/CodeSample.client.d.ts.map +1 -0
  98. package/dist/react/internal/openapi/CodeSample.client.js +134 -0
  99. package/dist/react/internal/openapi/CodeSample.client.js.map +1 -0
  100. package/dist/react/internal/openapi/CollapsibleChildren.client.d.ts +17 -0
  101. package/dist/react/internal/openapi/CollapsibleChildren.client.d.ts.map +1 -0
  102. package/dist/react/internal/openapi/CollapsibleChildren.client.js +18 -0
  103. package/dist/react/internal/openapi/CollapsibleChildren.client.js.map +1 -0
  104. package/dist/react/internal/openapi/Disclosure.client.d.ts +28 -0
  105. package/dist/react/internal/openapi/Disclosure.client.d.ts.map +1 -0
  106. package/dist/react/internal/openapi/Disclosure.client.js +38 -0
  107. package/dist/react/internal/openapi/Disclosure.client.js.map +1 -0
  108. package/dist/react/internal/openapi/Endpoints.d.ts +26 -0
  109. package/dist/react/internal/openapi/Endpoints.d.ts.map +1 -0
  110. package/dist/react/internal/openapi/Endpoints.js +33 -0
  111. package/dist/react/internal/openapi/Endpoints.js.map +1 -0
  112. package/dist/react/internal/openapi/EndpointsView.d.ts +24 -0
  113. package/dist/react/internal/openapi/EndpointsView.d.ts.map +1 -0
  114. package/dist/react/internal/openapi/EndpointsView.js +26 -0
  115. package/dist/react/internal/openapi/EndpointsView.js.map +1 -0
  116. package/dist/react/internal/openapi/EnumValues.client.d.ts +14 -0
  117. package/dist/react/internal/openapi/EnumValues.client.d.ts.map +1 -0
  118. package/dist/react/internal/openapi/EnumValues.client.js +20 -0
  119. package/dist/react/internal/openapi/EnumValues.client.js.map +1 -0
  120. package/dist/react/internal/openapi/HeadingAnchor.d.ts +15 -0
  121. package/dist/react/internal/openapi/HeadingAnchor.d.ts.map +1 -0
  122. package/dist/react/internal/openapi/HeadingAnchor.js +12 -0
  123. package/dist/react/internal/openapi/HeadingAnchor.js.map +1 -0
  124. package/dist/react/internal/openapi/OpenApiPage.d.ts +79 -0
  125. package/dist/react/internal/openapi/OpenApiPage.d.ts.map +1 -0
  126. package/dist/react/internal/openapi/OpenApiPage.js +72 -0
  127. package/dist/react/internal/openapi/OpenApiPage.js.map +1 -0
  128. package/dist/react/internal/openapi/Operation.d.ts +25 -0
  129. package/dist/react/internal/openapi/Operation.d.ts.map +1 -0
  130. package/dist/react/internal/openapi/Operation.js +101 -0
  131. package/dist/react/internal/openapi/Operation.js.map +1 -0
  132. package/dist/react/internal/openapi/Playground.client.d.ts +33 -0
  133. package/dist/react/internal/openapi/Playground.client.d.ts.map +1 -0
  134. package/dist/react/internal/openapi/Playground.client.js +170 -0
  135. package/dist/react/internal/openapi/Playground.client.js.map +1 -0
  136. package/dist/react/internal/openapi/PropertyExample.client.d.ts +17 -0
  137. package/dist/react/internal/openapi/PropertyExample.client.d.ts.map +1 -0
  138. package/dist/react/internal/openapi/PropertyExample.client.js +21 -0
  139. package/dist/react/internal/openapi/PropertyExample.client.js.map +1 -0
  140. package/dist/react/internal/openapi/Reference.d.ts +55 -0
  141. package/dist/react/internal/openapi/Reference.d.ts.map +1 -0
  142. package/dist/react/internal/openapi/Reference.js +42 -0
  143. package/dist/react/internal/openapi/Reference.js.map +1 -0
  144. package/dist/react/internal/openapi/Schema.d.ts +110 -0
  145. package/dist/react/internal/openapi/Schema.d.ts.map +1 -0
  146. package/dist/react/internal/openapi/Schema.js +239 -0
  147. package/dist/react/internal/openapi/Schema.js.map +1 -0
  148. package/dist/react/internal/openapi/SchemaUnion.client.d.ts +25 -0
  149. package/dist/react/internal/openapi/SchemaUnion.client.d.ts.map +1 -0
  150. package/dist/react/internal/openapi/SchemaUnion.client.js +48 -0
  151. package/dist/react/internal/openapi/SchemaUnion.client.js.map +1 -0
  152. package/dist/react/internal/openapi/anchor-navigation.client.d.ts +47 -0
  153. package/dist/react/internal/openapi/anchor-navigation.client.d.ts.map +1 -0
  154. package/dist/react/internal/openapi/anchor-navigation.client.js +120 -0
  155. package/dist/react/internal/openapi/anchor-navigation.client.js.map +1 -0
  156. package/dist/react/internal/openapi/auth.d.ts +28 -0
  157. package/dist/react/internal/openapi/auth.d.ts.map +1 -0
  158. package/dist/react/internal/openapi/auth.js +75 -0
  159. package/dist/react/internal/openapi/auth.js.map +1 -0
  160. package/dist/react/useLayout.d.ts +2 -0
  161. package/dist/react/useLayout.d.ts.map +1 -1
  162. package/dist/react/useLayout.js +2 -0
  163. package/dist/react/useLayout.js.map +1 -1
  164. package/dist/server/handlers.d.ts +1 -1
  165. package/dist/server/handlers.d.ts.map +1 -1
  166. package/dist/server/handlers.js +26 -5
  167. package/dist/server/handlers.js.map +1 -1
  168. package/dist/server/og-assets.d.ts +5 -0
  169. package/dist/server/og-assets.d.ts.map +1 -0
  170. package/dist/server/og-assets.js +11 -0
  171. package/dist/server/og-assets.js.map +1 -0
  172. package/dist/server/openapi/assets.d.ts +33 -0
  173. package/dist/server/openapi/assets.d.ts.map +1 -0
  174. package/dist/server/openapi/assets.generated.d.ts +9 -0
  175. package/dist/server/openapi/assets.generated.d.ts.map +1 -0
  176. package/dist/server/openapi/assets.generated.js +1091 -0
  177. package/dist/server/openapi/assets.generated.js.map +1 -0
  178. package/dist/server/openapi/assets.js +32 -0
  179. package/dist/server/openapi/assets.js.map +1 -0
  180. package/dist/server/openapi/handler.d.ts +103 -0
  181. package/dist/server/openapi/handler.d.ts.map +1 -0
  182. package/dist/server/openapi/handler.js +198 -0
  183. package/dist/server/openapi/handler.js.map +1 -0
  184. package/dist/server/openapi/handler.test.d.ts +2 -0
  185. package/dist/server/openapi/handler.test.d.ts.map +1 -0
  186. package/dist/server/openapi/handler.test.js +203 -0
  187. package/dist/server/openapi/handler.test.js.map +1 -0
  188. package/dist/server/openapi/html.d.ts +16 -0
  189. package/dist/server/openapi/html.d.ts.map +1 -0
  190. package/dist/server/openapi/html.js +75 -0
  191. package/dist/server/openapi/html.js.map +1 -0
  192. package/dist/server/openapi/pages.d.ts +33 -0
  193. package/dist/server/openapi/pages.d.ts.map +1 -0
  194. package/dist/server/openapi/pages.js +130 -0
  195. package/dist/server/openapi/pages.js.map +1 -0
  196. package/dist/server/openapi/pages.test.d.ts +2 -0
  197. package/dist/server/openapi/pages.test.d.ts.map +1 -0
  198. package/dist/server/openapi/pages.test.js +94 -0
  199. package/dist/server/openapi/pages.test.js.map +1 -0
  200. package/dist/server/openapi/state.d.ts +42 -0
  201. package/dist/server/openapi/state.d.ts.map +1 -0
  202. package/dist/server/openapi/state.js +101 -0
  203. package/dist/server/openapi/state.js.map +1 -0
  204. package/dist/styles/index.css +16 -0
  205. package/dist/styles/markdown.css +9 -7
  206. package/dist/styles/openapi-playground.css +80 -0
  207. package/dist/styles/openapi.css +660 -0
  208. package/dist/vite.d.ts.map +1 -1
  209. package/dist/vite.js +1 -0
  210. package/dist/vite.js.map +1 -1
  211. package/dist/waku/internal/middleware/md-router.d.ts +0 -4
  212. package/dist/waku/internal/middleware/md-router.d.ts.map +1 -1
  213. package/dist/waku/internal/middleware/md-router.js +3 -48
  214. package/dist/waku/internal/middleware/md-router.js.map +1 -1
  215. package/dist/waku/internal/patches/adapters/vercel-build-enhancer.js +1 -1
  216. package/dist/waku/internal/patches/adapters/vercel-build-enhancer.js.map +1 -1
  217. package/dist/waku/internal/patches/router.d.ts.map +1 -1
  218. package/dist/waku/internal/patches/router.js +114 -1
  219. package/dist/waku/internal/patches/router.js.map +1 -1
  220. package/package.json +5 -1
  221. package/src/config.ts +1 -0
  222. package/src/globals.d.ts +16 -0
  223. package/src/index.ts +1 -0
  224. package/src/internal/config.ts +40 -1
  225. package/src/internal/llms.ts +51 -1
  226. package/src/internal/markdown-negotiation.test.ts +42 -0
  227. package/src/internal/markdown-negotiation.ts +95 -0
  228. package/src/internal/markdown.ts +5 -0
  229. package/src/internal/openapi/anchors.ts +44 -0
  230. package/src/internal/openapi/app.ts +127 -0
  231. package/src/internal/openapi/index.ts +24 -0
  232. package/src/internal/openapi/markdown.test.ts +115 -0
  233. package/src/internal/openapi/markdown.ts +275 -0
  234. package/src/internal/openapi/openapi.ts +212 -0
  235. package/src/internal/openapi/openrpc.test.ts +239 -0
  236. package/src/internal/openapi/openrpc.ts +295 -0
  237. package/src/internal/openapi/parser.test.ts +203 -0
  238. package/src/internal/openapi/parser.ts +613 -0
  239. package/src/internal/openapi/registry.test.ts +89 -0
  240. package/src/internal/openapi/registry.ts +89 -0
  241. package/src/internal/openapi/sample.test.ts +283 -0
  242. package/src/internal/openapi/sample.ts +562 -0
  243. package/src/internal/openapi/search.test.ts +62 -0
  244. package/src/internal/openapi/search.ts +108 -0
  245. package/src/internal/openapi/sidebar.test.ts +131 -0
  246. package/src/internal/openapi/sidebar.ts +94 -0
  247. package/src/internal/openapi/union.test.ts +51 -0
  248. package/src/internal/openapi/union.ts +74 -0
  249. package/src/internal/search.ts +20 -0
  250. package/src/internal/test/virtual-config.stub.ts +14 -0
  251. package/src/internal/vite-plugins.ts +106 -11
  252. package/src/openapi-app/App.tsx +64 -0
  253. package/src/openapi-app/blocks.tsx +33 -0
  254. package/src/openapi-app/client.tsx +25 -0
  255. package/src/openapi-app/links.test.ts +84 -0
  256. package/src/openapi-app/links.ts +66 -0
  257. package/src/openapi-app/payload.ts +20 -0
  258. package/src/openapi-app/virtual/config.ts +7 -0
  259. package/src/openapi-app/virtual/group-icons.ts +2 -0
  260. package/src/openapi-app/virtual/langs.ts +6 -0
  261. package/src/openapi-app/virtual/openapi.ts +10 -0
  262. package/src/openapi-app/virtual/search-index.ts +21 -0
  263. package/src/openapi-app/virtual/slots.ts +4 -0
  264. package/src/openapi-app/virtual/user-styles.ts +2 -0
  265. package/src/openapi-app/waku.tsx +154 -0
  266. package/src/react/Badge.tsx +2 -3
  267. package/src/react/Layout.client.tsx +17 -4
  268. package/src/react/OpenApi.tsx +5 -0
  269. package/src/react/internal/CodeToHtml.client.tsx +283 -22
  270. package/src/react/internal/Sidebar.tsx +126 -22
  271. package/src/react/internal/openapi/CodeSample.client.tsx +294 -0
  272. package/src/react/internal/openapi/CollapsibleChildren.client.tsx +41 -0
  273. package/src/react/internal/openapi/Disclosure.client.tsx +67 -0
  274. package/src/react/internal/openapi/Endpoints.tsx +58 -0
  275. package/src/react/internal/openapi/EndpointsView.tsx +76 -0
  276. package/src/react/internal/openapi/EnumValues.client.tsx +49 -0
  277. package/src/react/internal/openapi/HeadingAnchor.tsx +28 -0
  278. package/src/react/internal/openapi/OpenApiPage.tsx +173 -0
  279. package/src/react/internal/openapi/Operation.test.tsx +101 -0
  280. package/src/react/internal/openapi/Operation.tsx +335 -0
  281. package/src/react/internal/openapi/Playground.client.tsx +234 -0
  282. package/src/react/internal/openapi/PropertyExample.client.tsx +55 -0
  283. package/src/react/internal/openapi/Reference.tsx +120 -0
  284. package/src/react/internal/openapi/Schema.tsx +467 -0
  285. package/src/react/internal/openapi/SchemaUnion.client.tsx +123 -0
  286. package/src/react/internal/openapi/anchor-navigation.client.ts +154 -0
  287. package/src/react/internal/openapi/auth.ts +69 -0
  288. package/src/react/useLayout.ts +4 -0
  289. package/src/server/handlers.ts +31 -6
  290. package/src/server/og-assets.ts +14 -0
  291. package/src/server/openapi/assets.generated.ts +1093 -0
  292. package/src/server/openapi/assets.ts +57 -0
  293. package/src/server/openapi/handler.test.ts +244 -0
  294. package/src/server/openapi/handler.ts +277 -0
  295. package/src/server/openapi/html.ts +84 -0
  296. package/src/server/openapi/pages.test.ts +111 -0
  297. package/src/server/openapi/pages.ts +153 -0
  298. package/src/server/openapi/state.ts +136 -0
  299. package/src/styles/index.css +16 -0
  300. package/src/styles/markdown.css +9 -7
  301. package/src/styles/openapi-playground.css +80 -0
  302. package/src/styles/openapi.css +660 -0
  303. package/src/vite.ts +1 -0
  304. package/src/waku/internal/middleware/md-router.ts +8 -52
  305. package/src/waku/internal/patches/adapters/vercel-build-enhancer.ts +1 -1
  306. package/src/waku/internal/patches/router.ts +131 -1
@@ -0,0 +1,660 @@
1
+ /* Styling for the auto-generated OpenAPI reference.
2
+
3
+ Every visually-styled element in `src/react/internal/openapi/` carries a
4
+ stable `data-v-openapi-*` attribute instead of inline Tailwind classes, and
5
+ all styling lives here via `@apply`. This keeps the markup declarative and
6
+ lets consumers override any part of the reference UI by targeting the same
7
+ attributes from their own CSS. State is expressed with attribute selectors
8
+ (`[data-active]`, `[data-selected]`, `[data-static]`, `[data-separator]`,
9
+ `[data-visible]`, `[data-copied]`) and the Base UI `[data-panel-open]`
10
+ attribute set on disclosure triggers. */
11
+
12
+ /* Sidebar method badges (GET/POST/…) are a touch smaller than the default
13
+ badge so they sit more compactly beside endpoint labels. */
14
+ [data-v-sidebar-item-badge] {
15
+ @apply vocs:text-[10px] vocs:px-1.5 vocs:py-0.5;
16
+ }
17
+
18
+ /* #region Page layout */
19
+
20
+ /* Both the landing and group pages use the full-bleed layout (left gutter
21
+ collapsed to the sidebar so content sits flush after it). Group pages span the
22
+ full available width to give the two-column operation layout (docs + sticky
23
+ playground) room; the landing page caps itself to content width below. */
24
+ [data-v-openapi] {
25
+ @apply vocs:flex vocs:flex-col vocs:gap-6;
26
+ }
27
+ [data-v-openapi-landing] {
28
+ @apply vocs:max-w-content;
29
+ }
30
+
31
+ /* A category section (single-page layout) / categories list (overview). */
32
+ [data-v-openapi-group] {
33
+ @apply vocs:flex vocs:flex-col vocs:gap-2 vocs:pt-6;
34
+ }
35
+
36
+ /* Spec / category header. Mirrors the markdown `hgroup` page header: `text-h1`
37
+ on the container scopes the `0.75em` bottom padding to the heading size, and
38
+ the description uses the same subtitle styling as a markdown page subtitle. */
39
+ [data-v-openapi-header] {
40
+ @apply vocs:flex vocs:flex-col vocs:max-w-content vocs:text-h1 vocs:border-b vocs:border-primary vocs:pb-[0.75em];
41
+ }
42
+ [data-v-openapi-h1],
43
+ [data-v-openapi-h2] {
44
+ @apply vocs:!mt-0;
45
+ }
46
+ [data-v-openapi-info-title] {
47
+ @apply vocs:!mt-0;
48
+ }
49
+ [data-v-openapi-description] {
50
+ @apply vocs:text-secondary vocs:text-subtitle vocs:font-[450] vocs:leading-base vocs:mt-[0.25em];
51
+ }
52
+ /* Overview landing page: categories as accordions whose panels list every
53
+ endpoint as a GET-badge + path row (primary background, not surface). The
54
+ whole list is encapsulated in a card-styled pane (matching the `Card`
55
+ component); row dividers inset via the horizontal padding. (Width is capped
56
+ to content width by the shared `[data-v-openapi]` rule.) */
57
+ [data-v-openapi-overview] {
58
+ @apply vocs:flex vocs:flex-col vocs:overflow-hidden vocs:rounded-md vocs:border vocs:border-primary vocs:bg-surfaceTint/70 vocs:px-4;
59
+ }
60
+ [data-v-openapi-overview-category] {
61
+ @apply vocs:border-t vocs:border-primary;
62
+ }
63
+ [data-v-openapi-overview-category]:first-child {
64
+ @apply vocs:border-t-0;
65
+ }
66
+ [data-v-openapi-overview] [data-v-openapi-disclosure-trigger] {
67
+ @apply vocs:flex vocs:items-center vocs:gap-2 vocs:py-3 vocs:text-left vocs:cursor-pointer;
68
+ /* Bleed into the card's `px-4` padding so the hover highlight spans the full
69
+ width (edge to edge), inset only by the card border. The width must grow by
70
+ the bleed on both sides (`100% + 2rem`) so it also reaches the right edge —
71
+ a negative margin alone shifts the box without widening it. */
72
+ @apply vocs:-mx-4 vocs:w-[calc(100%+2rem)] vocs:px-4 vocs:transition-colors;
73
+ }
74
+ [data-v-openapi-overview] [data-v-openapi-disclosure-trigger]:hover {
75
+ background-color: light-dark(var(--vocs-color-gray12), var(--vocs-color-gray4));
76
+ }
77
+ [data-v-openapi-overview-chevron] {
78
+ @apply vocs:size-4 vocs:shrink-0 vocs:text-secondary vocs:transition-transform;
79
+ }
80
+ [data-v-openapi-disclosure-trigger][data-panel-open] [data-v-openapi-overview-chevron] {
81
+ @apply vocs:rotate-90;
82
+ }
83
+ [data-v-openapi-overview-category-head] {
84
+ @apply vocs:flex vocs:flex-col vocs:gap-0.5 vocs:min-w-0 vocs:flex-1;
85
+ }
86
+ [data-v-openapi-overview-category-name] {
87
+ @apply vocs:text-primary vocs:font-medium;
88
+ }
89
+ [data-v-openapi-overview-category-description] {
90
+ @apply vocs:text-[13px] vocs:text-secondary;
91
+ }
92
+ [data-v-openapi-overview] [data-v-openapi-disclosure-panel] {
93
+ @apply vocs:pt-1 vocs:pb-3;
94
+ }
95
+ [data-v-openapi-overview-endpoints] {
96
+ @apply vocs:flex vocs:flex-col vocs:gap-2;
97
+ }
98
+ [data-v-openapi-overview-endpoint] {
99
+ @apply vocs:flex vocs:items-center vocs:gap-3 vocs:bg-primary vocs:border vocs:border-primary vocs:rounded-lg vocs:px-3 vocs:py-2;
100
+ }
101
+ [data-v-openapi-overview-endpoint]:hover {
102
+ background-color: light-dark(var(--vocs-color-gray12), var(--vocs-color-gray4));
103
+ }
104
+ [data-v-openapi-overview-endpoint-title] {
105
+ @apply vocs:text-[14px] vocs:text-primary vocs:truncate vocs:min-w-0 vocs:flex-1;
106
+ }
107
+ [data-v-openapi-overview-endpoint-chevron] {
108
+ @apply vocs:size-4 vocs:shrink-0 vocs:text-secondary;
109
+ }
110
+
111
+ /* Nested markdown containers (property descriptions, prose) reuse
112
+ `data-v-content` purely for typography. The top-level article's
113
+ `data-v-content` centering rule (`margin-inline: auto`) must not leak into
114
+ them: on the flex-column parents used here, auto cross-axis margins make the
115
+ flex item shrink-to-content and center instead of stretching, which shows up
116
+ as stray left padding below the `lg` breakpoint. Reset the margins. */
117
+ [data-v-openapi] [data-v-content] {
118
+ margin-left: unset;
119
+ margin-right: unset;
120
+ }
121
+
122
+ /* Consumer "override" intro: render authored MDX exactly like a regular page.
123
+ The page article supplies its block rhythm via a `space-y-6` className that
124
+ the nested intro doesn't inherit, so reapply it here; the heading treatment
125
+ (h1 border, h2/h3 spacing) comes from the shared `article[data-v-content]`
126
+ rules in markdown.css, which are extended to match `[data-v-openapi-intro]`.
127
+ Cap to content width to match the auto-generated header (`data-v-openapi-header`)
128
+ — on group pages the markdown intro reads at content width while the
129
+ operations below span the full page. */
130
+ [data-v-openapi-intro] {
131
+ @apply vocs:space-y-6 vocs:max-w-content;
132
+ }
133
+
134
+ /* Consumer-authored guide page (e.g. `pages/api/auth.mdx`). Rendered inside the
135
+ full-bleed article (gutter collapsed to the sidebar, like the rest of the
136
+ section) but capped to content width so it reads like a regular markdown page.
137
+ Block rhythm + heading treatment come from the shared `article[data-v-content]`
138
+ markdown rules, which are extended to match `[data-v-openapi-guide]`. */
139
+ [data-v-openapi-guide] {
140
+ @apply vocs:space-y-6 vocs:max-w-content;
141
+ }
142
+
143
+ /* #endregion */
144
+
145
+ /* #region Operation layout
146
+ On small screens the operation stacks header → playground → body, so the
147
+ interactive sample sits directly under the title. On large screens it becomes
148
+ two columns with the playground sticky on the right, spanning the header and
149
+ body rows. */
150
+
151
+ [data-v-openapi-operation] {
152
+ display: grid;
153
+ row-gap: 2rem;
154
+ column-gap: 4rem;
155
+ grid-template-columns: minmax(0, 1fr);
156
+ grid-template-areas:
157
+ "header"
158
+ "aside"
159
+ "body";
160
+ }
161
+ [data-v-openapi-operation][data-separator] {
162
+ @apply vocs:border-t vocs:border-primary vocs:mt-20 vocs:pt-20;
163
+ }
164
+ [data-v-openapi-operation]:not([data-separator]) {
165
+ @apply vocs:pt-8;
166
+ }
167
+ [data-v-openapi-operation-header] {
168
+ grid-area: header;
169
+ @apply vocs:flex vocs:flex-col vocs:gap-3 vocs:min-w-0;
170
+ }
171
+ [data-v-openapi-operation-body] {
172
+ grid-area: body;
173
+ @apply vocs:flex vocs:flex-col vocs:gap-8 vocs:min-w-0;
174
+ }
175
+ [data-v-openapi-operation-aside] {
176
+ grid-area: aside;
177
+ top: calc(var(--vocs-spacing-topNav) + var(--vocs-spacing-banner) + 1rem);
178
+ @apply vocs:flex vocs:flex-col vocs:min-w-0 vocs:self-start vocs:lg:sticky vocs:lg:max-h-[calc(100dvh-var(--vocs-spacing-topNav)-var(--vocs-spacing-banner)-2rem)] vocs:lg:overflow-hidden;
179
+ }
180
+ @media (min-width: 64rem) {
181
+ [data-v-openapi-operation] {
182
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
183
+ grid-template-areas:
184
+ "header aside"
185
+ "body aside";
186
+ align-items: start;
187
+ }
188
+ }
189
+
190
+ [data-v-openapi-operation-title] {
191
+ @apply vocs:!mt-0 vocs:flex vocs:items-center vocs:gap-2 vocs:scroll-mt-0!;
192
+ }
193
+ [data-v-openapi-endpoint] {
194
+ @apply vocs:flex vocs:items-center vocs:gap-3 vocs:bg-code-block vocs:border vocs:border-primary vocs:rounded-lg vocs:px-3 vocs:py-2;
195
+ }
196
+ [data-v-openapi-endpoint-path] {
197
+ @apply vocs:!px-0 vocs:text-[13px] vocs:text-secondary vocs:break-all;
198
+ }
199
+ [data-v-openapi-prose] {
200
+ @apply vocs:text-[15px] vocs:text-secondary;
201
+ }
202
+
203
+ /* #endregion */
204
+
205
+ /* #region Sections, parameters & schema */
206
+
207
+ [data-v-openapi-section] {
208
+ @apply vocs:flex vocs:flex-col vocs:gap-3;
209
+ }
210
+ [data-v-openapi-section-title] {
211
+ @apply vocs:flex vocs:items-center vocs:gap-2;
212
+ }
213
+ [data-v-openapi-params],
214
+ [data-v-openapi-schema],
215
+ [data-v-openapi-responses] {
216
+ @apply vocs:flex vocs:flex-col;
217
+ }
218
+ [data-v-openapi-children] {
219
+ @apply vocs:border-l vocs:border-primary vocs:pl-4;
220
+ }
221
+ [data-v-openapi-content] {
222
+ @apply vocs:flex vocs:flex-col vocs:gap-3;
223
+ }
224
+ [data-v-openapi-media] {
225
+ @apply vocs:flex vocs:flex-col vocs:gap-2;
226
+ }
227
+ [data-v-openapi-media-type] {
228
+ @apply vocs:text-[12px] vocs:text-secondary;
229
+ }
230
+ [data-v-openapi-variant] {
231
+ @apply vocs:flex vocs:flex-col vocs:gap-2;
232
+ }
233
+
234
+ /* A single parameter/property row. */
235
+ [data-v-openapi-property] {
236
+ @apply vocs:flex vocs:flex-col vocs:gap-1.5 vocs:py-3;
237
+ }
238
+ [data-v-openapi-property-head] {
239
+ @apply vocs:flex vocs:items-center vocs:gap-2 vocs:flex-wrap;
240
+ }
241
+ [data-v-openapi-property-name] {
242
+ @apply vocs:font-mono vocs:text-[13px];
243
+ }
244
+ [data-v-openapi-property-prefix] {
245
+ @apply vocs:font-normal vocs:text-secondary;
246
+ }
247
+ [data-v-openapi-property-label] {
248
+ @apply vocs:font-semibold vocs:text-primary;
249
+ }
250
+ [data-v-openapi-property-required] {
251
+ @apply vocs:!text-[10px] vocs:!px-1.5 vocs:!py-0.5;
252
+ }
253
+ [data-v-openapi-property-head] .heading-anchor {
254
+ @apply vocs:!ml-0;
255
+ }
256
+ /* Reveal the copy-link anchor when hovering a property row. Property labels are
257
+ spans (not headings), so the shared heading hover rule in markdown.css does
258
+ not apply — mirror it here, scoped to the property container. */
259
+ [data-v-openapi-property]:hover .heading-anchor {
260
+ @apply vocs:opacity-100;
261
+ }
262
+ [data-v-openapi-property-meta] {
263
+ @apply vocs:flex vocs:flex-wrap vocs:items-center vocs:gap-x-2 vocs:gap-y-0.5 vocs:font-mono vocs:text-[12px];
264
+ }
265
+ [data-v-openapi-type] {
266
+ @apply vocs:!text-[12px];
267
+ }
268
+ [data-v-openapi-meta-label],
269
+ [data-v-openapi-meta-sep] {
270
+ @apply vocs:text-secondary;
271
+ }
272
+ [data-v-openapi-meta-value] {
273
+ @apply vocs:text-primary;
274
+ }
275
+ [data-v-openapi-property-description] {
276
+ @apply vocs:text-[13px] vocs:text-secondary;
277
+ }
278
+ [data-v-openapi-property-example] {
279
+ @apply vocs:flex vocs:flex-col vocs:text-[12px];
280
+ }
281
+ [data-v-openapi-property-example-label] {
282
+ @apply vocs:text-secondary;
283
+ }
284
+ [data-v-openapi-property-example-value] {
285
+ @apply vocs:font-mono vocs:text-primary vocs:break-all vocs:text-left;
286
+ }
287
+ /* When the sibling code sample renders a matching response example line, the
288
+ example value becomes a button that reveals/flashes that line on click. */
289
+ button[data-v-openapi-property-example-value] {
290
+ @apply vocs:cursor-pointer vocs:underline vocs:decoration-dotted vocs:underline-offset-2 vocs:transition-colors;
291
+ text-decoration-color: var(--vocs-text-color-secondary);
292
+ }
293
+ button[data-v-openapi-property-example-value]:hover {
294
+ text-decoration-color: var(--vocs-text-color-primary);
295
+ }
296
+
297
+ /* Briefly highlight a property row when navigated to via an anchor link
298
+ (`:target`) or programmatically from a response example line / union reveal
299
+ (`data-v-openapi-flash`, toggled by `revealAnchor`). */
300
+ [data-v-openapi-property]:target,
301
+ [data-v-openapi-property][data-v-openapi-flash] {
302
+ @apply vocs:rounded-xs;
303
+ animation: vocs-openapi-target-flash 1.6s ease-out;
304
+ }
305
+ /* Shared "shimmer" color for anchor/example flashes: a prominent gray that
306
+ stands out against both the page (light) and code-block (dark) backgrounds. */
307
+ :root {
308
+ --vocs-openapi-flash-bg: light-dark(var(--vocs-color-gray10), var(--vocs-color-gray7));
309
+ }
310
+ /* The box-shadow spread bleeds the highlight a few pixels past the row so it
311
+ reads as a padded, rounded region rather than a flush background fill. */
312
+ @keyframes vocs-openapi-target-flash {
313
+ 0%,
314
+ 30% {
315
+ background-color: var(--vocs-openapi-flash-bg);
316
+ box-shadow: 0 0 0 8px var(--vocs-openapi-flash-bg);
317
+ }
318
+ 100% {
319
+ background-color: transparent;
320
+ box-shadow: 0 0 0 8px transparent;
321
+ }
322
+ }
323
+
324
+ /* #endregion */
325
+
326
+ /* #region Enum values */
327
+
328
+ [data-v-openapi-values] {
329
+ @apply vocs:flex vocs:flex-col;
330
+ }
331
+ [data-v-openapi-values-label] {
332
+ @apply vocs:text-[12px] vocs:text-secondary;
333
+ }
334
+ [data-v-openapi-values-list] {
335
+ @apply vocs:flex vocs:flex-col vocs:border-l vocs:border-primary vocs:pl-3;
336
+ }
337
+ [data-v-openapi-values-item] {
338
+ @apply vocs:font-mono vocs:!px-0 vocs:text-[12.5px] vocs:text-primary vocs:break-all;
339
+ }
340
+
341
+ /* #endregion */
342
+
343
+ /* #region Disclosure & pill toggles */
344
+
345
+ [data-v-openapi-disclosure] {
346
+ @apply vocs:w-full;
347
+ }
348
+ [data-v-openapi-disclosure-header] {
349
+ @apply vocs:!m-0 vocs:!p-0;
350
+ }
351
+
352
+ /* The rounded "Show/Hide" pill: the EnumValues toggle button and the
353
+ CollapsibleChildren disclosure trigger share one look. */
354
+ [data-v-openapi-pill],
355
+ [data-v-openapi-collapse] [data-v-openapi-disclosure-header] [data-v-openapi-disclosure-trigger] {
356
+ @apply vocs:inline-flex vocs:items-center vocs:gap-1.5 vocs:w-fit vocs:rounded-md vocs:border vocs:border-primary vocs:px-2 vocs:py-0.5 vocs:text-[12px] vocs:font-medium vocs:text-secondary vocs:transition-colors;
357
+ }
358
+ [data-v-openapi-pill]:hover,
359
+ [data-v-openapi-collapse] [data-v-openapi-disclosure-trigger]:hover {
360
+ @apply vocs:text-primary vocs:bg-surfaceTint;
361
+ }
362
+ [data-v-openapi-values] [data-v-openapi-pill] {
363
+ @apply vocs:mt-2;
364
+ }
365
+ [data-v-openapi-pill-icon],
366
+ [data-v-openapi-collapse-icon-show],
367
+ [data-v-openapi-collapse-icon-hide] {
368
+ @apply vocs:size-3;
369
+ }
370
+ [data-v-openapi-collapse] [data-v-openapi-disclosure-panel] {
371
+ @apply vocs:mt-2;
372
+ }
373
+
374
+ /* Show/Hide label + icon swap, driven by the trigger's open state. */
375
+ [data-v-openapi-collapse-icon-hide],
376
+ [data-v-openapi-collapse-label-hide] {
377
+ @apply vocs:hidden;
378
+ }
379
+ [data-v-openapi-disclosure-trigger][data-panel-open] [data-v-openapi-collapse-icon-show],
380
+ [data-v-openapi-disclosure-trigger][data-panel-open] [data-v-openapi-collapse-label-show] {
381
+ @apply vocs:hidden;
382
+ }
383
+ [data-v-openapi-disclosure-trigger][data-panel-open] [data-v-openapi-collapse-icon-hide],
384
+ [data-v-openapi-disclosure-trigger][data-panel-open] [data-v-openapi-collapse-label-hide] {
385
+ @apply vocs:inline;
386
+ }
387
+
388
+ /* #endregion */
389
+
390
+ /* #region Responses */
391
+
392
+ [data-v-openapi-response] {
393
+ @apply vocs:border-t vocs:border-primary;
394
+ }
395
+ [data-v-openapi-response]:first-child {
396
+ @apply vocs:border-t-0;
397
+ }
398
+ [data-v-openapi-response][data-static] {
399
+ @apply vocs:flex vocs:items-center vocs:gap-2 vocs:py-2;
400
+ }
401
+ [data-v-openapi-response] [data-v-openapi-disclosure-trigger] {
402
+ @apply vocs:flex vocs:items-center vocs:gap-2 vocs:w-full vocs:py-2 vocs:text-left vocs:cursor-pointer;
403
+ }
404
+ [data-v-openapi-response] [data-v-openapi-disclosure-panel] {
405
+ @apply vocs:pb-3;
406
+ }
407
+ [data-v-openapi-response-chevron] {
408
+ @apply vocs:size-4 vocs:shrink-0 vocs:text-secondary vocs:transition-transform;
409
+ }
410
+ [data-v-openapi-disclosure-trigger][data-panel-open] [data-v-openapi-response-chevron] {
411
+ @apply vocs:rotate-90;
412
+ }
413
+ [data-v-openapi-response-spacer] {
414
+ @apply vocs:size-4 vocs:shrink-0;
415
+ }
416
+ [data-v-openapi-response-status] {
417
+ @apply vocs:shrink-0;
418
+ }
419
+ [data-v-openapi-response-description] {
420
+ @apply vocs:text-[13px] vocs:text-secondary vocs:truncate vocs:min-w-0;
421
+ }
422
+ [data-v-openapi-response-content] {
423
+ @apply vocs:flex vocs:flex-col vocs:gap-3;
424
+ }
425
+ [data-v-openapi-example] {
426
+ @apply vocs:text-[12px] vocs:overflow-auto vocs:rounded-lg vocs:border vocs:border-primary vocs:p-3;
427
+ }
428
+
429
+ /* #endregion */
430
+
431
+ /* #region Code sample (sticky request/response panel) */
432
+
433
+ [data-v-openapi-sample] {
434
+ @apply vocs:flex vocs:flex-col vocs:min-h-0 vocs:max-h-full vocs:rounded-lg vocs:border vocs:border-primary vocs:overflow-hidden;
435
+ }
436
+ [data-v-openapi-sample-request] {
437
+ @apply vocs:flex vocs:flex-col vocs:shrink-0;
438
+ }
439
+ [data-v-openapi-sample-header] {
440
+ @apply vocs:flex vocs:items-center vocs:h-10 vocs:bg-surface vocs:px-3 vocs:border-b vocs:border-primary;
441
+ }
442
+ [data-v-openapi-sample-actions] {
443
+ @apply vocs:ml-auto vocs:flex vocs:items-center vocs:gap-1.5;
444
+ }
445
+ [data-v-openapi-sample-response] {
446
+ @apply vocs:flex vocs:flex-col vocs:min-h-0 vocs:flex-1 vocs:border-t vocs:border-primary;
447
+ }
448
+ [data-v-openapi-sample-tabs] {
449
+ @apply vocs:flex vocs:items-stretch vocs:flex-wrap vocs:shrink-0 vocs:bg-surface vocs:px-3 vocs:border-b vocs:border-primary;
450
+ }
451
+ [data-v-openapi-sample-response-body] {
452
+ @apply vocs:min-h-0 vocs:flex-1 vocs:overflow-y-auto;
453
+ }
454
+
455
+ /* Make the OpenAPI request/response code samples match Vocs code blocks.
456
+ The Shiki `pre.shiki` emitted for these samples lacks the `data-v` marker
457
+ that markdown code blocks carry, so the shared `pre[data-v]` rules don't
458
+ apply — mirror the essentials here, scoped to the sample container. */
459
+ [data-v-openapi-sample] pre.shiki {
460
+ @apply vocs:bg-code-block vocs:py-4 vocs:overflow-x-auto;
461
+ }
462
+ [data-v-openapi-sample] pre.shiki > code {
463
+ @apply vocs:grid vocs:text-code-block;
464
+ }
465
+ [data-v-openapi-sample] pre.shiki > code > .line {
466
+ @apply vocs:leading-code vocs:px-code-block-px;
467
+ }
468
+ /* Synthesized placeholder values in a response example (no authored example)
469
+ are dimmed so real example values stand out. */
470
+ [data-v-openapi-sample] [data-v-openapi-placeholder] {
471
+ @apply vocs:opacity-45;
472
+ }
473
+ /* Response example lines that link to a schema row are clickable. */
474
+ [data-v-openapi-sample] pre.shiki > code > .line[data-anchor] {
475
+ @apply vocs:cursor-pointer;
476
+ }
477
+ [data-v-openapi-sample] pre.shiki > code > .line[data-anchor]:hover {
478
+ @apply vocs:bg-code-highlighted;
479
+ }
480
+ /* Flash a sample line/span when revealed from a left-hand "Example" click
481
+ (`data-v-openapi-flash`, toggled by `revealSampleLine`) — the reverse of the
482
+ left-row flash. Covers response example lines and request path-param spans. */
483
+ [data-v-openapi-sample] pre.shiki > code > .line[data-v-openapi-flash],
484
+ [data-v-openapi-sample] [data-v-openapi-anchor][data-v-openapi-flash] {
485
+ animation: vocs-openapi-line-flash 1.6s ease-out;
486
+ }
487
+ [data-v-openapi-sample] [data-v-openapi-anchor][data-v-openapi-flash] {
488
+ @apply vocs:rounded-xs;
489
+ }
490
+ @keyframes vocs-openapi-line-flash {
491
+ 0%,
492
+ 30% {
493
+ background-color: var(--vocs-openapi-flash-bg);
494
+ }
495
+ 100% {
496
+ background-color: transparent;
497
+ }
498
+ }
499
+ /* Recolor request-sample query/path parameter names and values so the URL reads
500
+ exactly like the JSON response example: names use the theme's JSON property-name
501
+ color, values its number color. The `light-dark()` values are captured from
502
+ the active Shiki theme at runtime (see CodeToHtml.client.tsx), so both color
503
+ schemes match the response example; the vocs tokens are only a fallback. */
504
+ [data-v-openapi-sample] [data-v-openapi-token="key"] {
505
+ color: var(--vocs-openapi-token-key, var(--vocs-color-green)) !important;
506
+ }
507
+ [data-v-openapi-sample] [data-v-openapi-token="value"] {
508
+ color: var(--vocs-openapi-token-value, var(--vocs-color-blue)) !important;
509
+ }
510
+ /* Path/query parameter spans in the request sample link to their schema row. */
511
+ [data-v-openapi-sample] [data-v-openapi-anchor] {
512
+ @apply vocs:cursor-pointer vocs:rounded-xs;
513
+ }
514
+ [data-v-openapi-sample] [data-v-openapi-anchor]:hover {
515
+ @apply vocs:bg-code-highlighted;
516
+ }
517
+ /* "Show more/less" toggle for the collapsed query parameters of a request. */
518
+ [data-v-openapi-sample-more] {
519
+ @apply vocs:flex vocs:items-center vocs:gap-1.5 vocs:w-full vocs:bg-code-block vocs:px-code-block-px vocs:-mt-2 vocs:pb-3 vocs:text-[12px] vocs:font-medium vocs:text-secondary vocs:cursor-pointer;
520
+ }
521
+ [data-v-openapi-sample-more]:hover {
522
+ @apply vocs:text-primary;
523
+ }
524
+ [data-v-openapi-sample-more-icon] {
525
+ @apply vocs:size-3.5;
526
+ }
527
+
528
+ /* Request/response action buttons (Copy, Try). */
529
+ [data-v-openapi-action] {
530
+ @apply vocs:inline-flex vocs:items-center vocs:gap-1.5 vocs:rounded-md vocs:border vocs:border-primary vocs:px-2 vocs:py-0.5 vocs:text-[12px] vocs:font-medium vocs:cursor-pointer;
531
+ }
532
+ [data-v-openapi-action]:disabled {
533
+ @apply vocs:opacity-50 vocs:cursor-default;
534
+ }
535
+ [data-v-openapi-action-icon] {
536
+ @apply vocs:size-3 vocs:text-muted;
537
+ }
538
+ [data-v-openapi-action-icon][data-copied] {
539
+ @apply vocs:text-accent;
540
+ }
541
+
542
+ /* Response status tabs. */
543
+ [data-v-openapi-tab] {
544
+ @apply vocs:flex vocs:items-center vocs:h-10 vocs:text-[13px] vocs:font-medium vocs:tracking-tight vocs:px-3 vocs:-mb-[1.5px] vocs:border-b-[1.5px] vocs:border-b-transparent vocs:transition-colors vocs:cursor-pointer;
545
+ }
546
+ [data-v-openapi-tab]:not([data-active]) {
547
+ @apply vocs:text-secondary;
548
+ }
549
+ [data-v-openapi-tab]:not([data-active]):hover {
550
+ @apply vocs:text-heading;
551
+ }
552
+ [data-v-openapi-tab][data-active] {
553
+ @apply vocs:text-heading vocs:border-b-tab-active;
554
+ }
555
+
556
+ /* #endregion */
557
+
558
+ /* #region Dropdowns (language selector & union variant picker) */
559
+
560
+ [data-v-openapi-lang-label] {
561
+ @apply vocs:text-[13px] vocs:font-medium vocs:text-heading vocs:tracking-tight;
562
+ }
563
+ [data-v-openapi-lang] {
564
+ @apply vocs:relative;
565
+ }
566
+ [data-v-openapi-lang-trigger] {
567
+ @apply vocs:flex vocs:items-center vocs:gap-1 vocs:text-[13px] vocs:font-medium vocs:text-heading vocs:tracking-tight vocs:cursor-pointer;
568
+ }
569
+ [data-v-openapi-lang-chevron],
570
+ [data-v-openapi-union-chevron] {
571
+ @apply vocs:size-4 vocs:text-secondary;
572
+ }
573
+ [data-v-openapi-dropdown-backdrop] {
574
+ @apply vocs:fixed vocs:inset-0 vocs:z-10 vocs:cursor-default;
575
+ }
576
+ [data-v-openapi-lang-menu] {
577
+ @apply vocs:absolute vocs:left-0 vocs:top-full vocs:z-20 vocs:mt-1 vocs:min-w-36 vocs:overflow-auto vocs:rounded-md vocs:border vocs:border-primary vocs:bg-surface vocs:py-1 vocs:shadow-lg;
578
+ }
579
+ [data-v-openapi-lang-option],
580
+ [data-v-openapi-union-option] {
581
+ @apply vocs:flex vocs:w-full vocs:items-center vocs:gap-2 vocs:px-3 vocs:py-1.5 vocs:text-left vocs:text-[13px] vocs:cursor-pointer;
582
+ }
583
+ [data-v-openapi-lang-option]:hover,
584
+ [data-v-openapi-union-option]:hover {
585
+ @apply vocs:bg-surfaceTint;
586
+ }
587
+ [data-v-openapi-lang-option-check] {
588
+ @apply vocs:size-3.5 vocs:shrink-0 vocs:opacity-0;
589
+ }
590
+ [data-v-openapi-lang-option][data-selected] [data-v-openapi-lang-option-check] {
591
+ @apply vocs:text-accent vocs:opacity-100;
592
+ }
593
+ [data-v-openapi-lang-option-label],
594
+ [data-v-openapi-union-option-label] {
595
+ @apply vocs:text-secondary;
596
+ }
597
+ [data-v-openapi-lang-option][data-selected] [data-v-openapi-lang-option-label],
598
+ [data-v-openapi-union-option][data-selected] [data-v-openapi-union-option-label] {
599
+ @apply vocs:text-primary;
600
+ }
601
+
602
+ [data-v-openapi-union] {
603
+ @apply vocs:flex vocs:flex-col vocs:rounded-md vocs:border vocs:border-primary;
604
+ }
605
+ [data-v-openapi-union-head] {
606
+ @apply vocs:relative;
607
+ }
608
+ [data-v-openapi-union-trigger] {
609
+ @apply vocs:flex vocs:w-full vocs:items-center vocs:gap-1.5 vocs:px-3 vocs:py-2 vocs:text-[13px] vocs:cursor-pointer;
610
+ }
611
+ [data-v-openapi-union-kind] {
612
+ @apply vocs:text-secondary;
613
+ }
614
+ [data-v-openapi-union-value] {
615
+ @apply vocs:font-medium vocs:text-primary;
616
+ }
617
+ [data-v-openapi-union-menu] {
618
+ @apply vocs:absolute vocs:left-0 vocs:top-full vocs:z-20 vocs:mt-1 vocs:max-h-80 vocs:w-full vocs:overflow-auto vocs:rounded-md vocs:border vocs:border-primary vocs:bg-surface vocs:py-1 vocs:shadow-lg;
619
+ }
620
+ [data-v-openapi-union-radio] {
621
+ @apply vocs:flex vocs:size-4 vocs:shrink-0 vocs:items-center vocs:justify-center vocs:rounded-full vocs:border vocs:border-primary;
622
+ }
623
+ [data-v-openapi-union-option][data-selected] [data-v-openapi-union-radio] {
624
+ @apply vocs:border-accent;
625
+ }
626
+ [data-v-openapi-union-radio-dot] {
627
+ @apply vocs:size-2 vocs:rounded-full vocs:bg-accent;
628
+ }
629
+ [data-v-openapi-union-panel][data-visible] {
630
+ @apply vocs:border-t vocs:border-primary vocs:px-3 vocs:py-2;
631
+ }
632
+
633
+ /* #endregion */
634
+
635
+ /* #region One-column page outline + footer */
636
+
637
+ /* The overview and guide pages are single-column: they keep the section's
638
+ full-bleed gutter (content sits flush after the sidebar) but, unlike the
639
+ two-column operation pages, render the normal right-gutter outline. Since
640
+ their content is capped to `max-w-content` and left-aligned, the default
641
+ `right-0` outline would be pinned to the far viewport edge, so dock it
642
+ immediately to the right of the content. The `!important` is required because
643
+ the outline's `right-0` utility sits in a later cascade layer. */
644
+ @media (width >= 1376px) {
645
+ [data-v-content-width="full"]:has([data-v-openapi-landing], [data-v-openapi-guide]) [data-v-gutter-right] {
646
+ right: auto !important;
647
+ left: calc(var(--vocs-spacing-sidebar) + var(--vocs-spacing-content-px) + var(--vocs-spacing-content) + 2rem);
648
+ }
649
+ }
650
+
651
+ /* Cap the page footer to the content width so it lines up with the content
652
+ above it instead of spanning the full-bleed width. */
653
+ [data-v-content-width="full"]:has([data-v-openapi-landing], [data-v-openapi-guide]) [data-v-content-footer] {
654
+ @apply vocs:max-w-content;
655
+ }
656
+ [data-v-content-width="full"]:has([data-v-openapi-landing], [data-v-openapi-guide]) [data-v-footer] {
657
+ @apply vocs:max-w-content!;
658
+ }
659
+
660
+ /* #endregion */
package/src/vite.ts CHANGED
@@ -30,6 +30,7 @@ export async function vocs(): Promise<PluginOption[]> {
30
30
  Plugins.langWatcher(config),
31
31
  Plugins.llms(config),
32
32
  Plugins.mdx(config),
33
+ Plugins.openapi(config),
33
34
  Plugins.routeWatcher(config),
34
35
  Plugins.search(config),
35
36
  Plugins.sitemap(config),