@ciderpress/ui 1.0.0-rc.1

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 (428) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/dist/0~142.js +2 -0
  4. package/dist/0~164.js +2 -0
  5. package/dist/0~2.js +2 -0
  6. package/dist/0~225.js +2 -0
  7. package/dist/0~288.js +2 -0
  8. package/dist/0~299.js +2 -0
  9. package/dist/0~3.js +2 -0
  10. package/dist/0~301.js +2 -0
  11. package/dist/0~311.js +2 -0
  12. package/dist/0~326.js +2 -0
  13. package/dist/0~40.js +2 -0
  14. package/dist/0~43.js +2 -0
  15. package/dist/0~433.js +2 -0
  16. package/dist/0~453.js +2 -0
  17. package/dist/0~457.js +2 -0
  18. package/dist/0~497.js +2 -0
  19. package/dist/0~511.js +2 -0
  20. package/dist/0~603.js +2 -0
  21. package/dist/0~616.js +2 -0
  22. package/dist/0~659.js +2 -0
  23. package/dist/0~670.js +2 -0
  24. package/dist/0~687.js +2 -0
  25. package/dist/0~706.js +2 -0
  26. package/dist/0~729.js +2 -0
  27. package/dist/0~768.js +2 -0
  28. package/dist/0~819.js +2 -0
  29. package/dist/0~830.js +2 -0
  30. package/dist/0~854.js +2 -0
  31. package/dist/0~863.js +2 -0
  32. package/dist/0~879.js +2 -0
  33. package/dist/0~96.js +2 -0
  34. package/dist/0~97.js +2 -0
  35. package/dist/components/FileTree/FileTree.css +90 -0
  36. package/dist/components/FileTree/FileTree.d.ts +7 -0
  37. package/dist/components/FileTree/FileTree.js +531 -0
  38. package/dist/components/FileTree/FileTreeItem.d.ts +8 -0
  39. package/dist/components/FileTree/RemoteSvgIcon.d.ts +11 -0
  40. package/dist/components/FileTree/index.d.ts +4 -0
  41. package/dist/components/folder-icons.d.ts +32 -0
  42. package/dist/components/languages.d.ts +7 -0
  43. package/dist/components/tree-parser/tree-parser.d.ts +12 -0
  44. package/dist/components/tree-parser/types.d.ts +11 -0
  45. package/dist/head/css/loader-apple.css +1 -0
  46. package/dist/head/css/loader-backdrop.css +1 -0
  47. package/dist/head/css/loader-dots.css +1 -0
  48. package/dist/head/css/themes/amber.css +1 -0
  49. package/dist/head/css/themes/arcade.css +1 -0
  50. package/dist/head/css/themes/grannysmith.css +1 -0
  51. package/dist/head/css/themes/honeycrisp.css +1 -0
  52. package/dist/head/css/themes/midnight.css +1 -0
  53. package/dist/head/css/themes/mulled.css +1 -0
  54. package/dist/head/js/loader-dots.js +1 -0
  55. package/dist/head/js/vscode-nav.js +1 -0
  56. package/dist/index.d.ts +43 -0
  57. package/dist/index.mjs +40 -0
  58. package/dist/node.d.ts +81 -0
  59. package/dist/node.mjs +17762 -0
  60. package/dist/plugins/mermaid/MermaidRenderer.tsx +480 -0
  61. package/dist/plugins/mermaid/mermaid.css +199 -0
  62. package/dist/theme/components/announcement/announcement-bar.css +103 -0
  63. package/dist/theme/components/announcement/announcement-bar.tsx +173 -0
  64. package/dist/theme/components/ask-ai/ask-ai-button.css +52 -0
  65. package/dist/theme/components/ask-ai/ask-ai-button.tsx +56 -0
  66. package/dist/theme/components/content-footer/content-footer-portal.tsx +70 -0
  67. package/dist/theme/components/content-footer/feedback.css +47 -0
  68. package/dist/theme/components/content-footer/feedback.tsx +96 -0
  69. package/dist/theme/components/content-footer/meta-actions.css +25 -0
  70. package/dist/theme/components/content-footer/meta-actions.tsx +57 -0
  71. package/dist/theme/components/content-footer/page-pager.css +61 -0
  72. package/dist/theme/components/content-footer/page-pager.tsx +110 -0
  73. package/dist/theme/components/edit-source-button.tsx +97 -0
  74. package/dist/theme/components/footer/site-footer.css +179 -0
  75. package/dist/theme/components/footer/site-footer.tsx +115 -0
  76. package/dist/theme/components/home/cta.css +67 -0
  77. package/dist/theme/components/home/cta.tsx +77 -0
  78. package/dist/theme/components/home/feature-card.css +52 -0
  79. package/dist/theme/components/home/feature-card.tsx +131 -0
  80. package/dist/theme/components/home/feature.tsx +79 -0
  81. package/dist/theme/components/home/hero-demo.css +66 -0
  82. package/dist/theme/components/home/hero-demo.tsx +46 -0
  83. package/dist/theme/components/home/hero.css +96 -0
  84. package/dist/theme/components/home/hero.tsx +111 -0
  85. package/dist/theme/components/home/layout.tsx +183 -0
  86. package/dist/theme/components/home/page-rail.css +21 -0
  87. package/dist/theme/components/home/page-rail.tsx +19 -0
  88. package/dist/theme/components/home/split.css +148 -0
  89. package/dist/theme/components/home/split.tsx +120 -0
  90. package/dist/theme/components/home/trust-strip.css +33 -0
  91. package/dist/theme/components/home/trust-strip.tsx +43 -0
  92. package/dist/theme/components/home/workspaces.tsx +71 -0
  93. package/dist/theme/components/nav/branch-tag.css +54 -0
  94. package/dist/theme/components/nav/branch-tag.tsx +101 -0
  95. package/dist/theme/components/nav/ciderpress-doc-layout.tsx +247 -0
  96. package/dist/theme/components/nav/ciderpress-docs-bar.css +505 -0
  97. package/dist/theme/components/nav/ciderpress-docs-bar.tsx +426 -0
  98. package/dist/theme/components/nav/ciderpress-header.css +172 -0
  99. package/dist/theme/components/nav/ciderpress-header.tsx +113 -0
  100. package/dist/theme/components/nav/ciderpress-layout-context.tsx +49 -0
  101. package/dist/theme/components/nav/ciderpress-nav-hamburger.css +193 -0
  102. package/dist/theme/components/nav/ciderpress-nav-hamburger.tsx +112 -0
  103. package/dist/theme/components/nav/ciderpress-nav-menu.css +130 -0
  104. package/dist/theme/components/nav/ciderpress-nav-menu.tsx +372 -0
  105. package/dist/theme/components/nav/ciderpress-nav-search.css +73 -0
  106. package/dist/theme/components/nav/ciderpress-nav-search.tsx +55 -0
  107. package/dist/theme/components/nav/ciderpress-nav-social-links.css +35 -0
  108. package/dist/theme/components/nav/ciderpress-nav-social-links.tsx +87 -0
  109. package/dist/theme/components/nav/floating-branch-indicator.css +106 -0
  110. package/dist/theme/components/nav/floating-branch-indicator.tsx +109 -0
  111. package/dist/theme/components/nav/layout.tsx +268 -0
  112. package/dist/theme/components/nav/mobile-nav-cta.tsx +79 -0
  113. package/dist/theme/components/nav/nav-divider.css +15 -0
  114. package/dist/theme/components/nav/nav-divider.tsx +19 -0
  115. package/dist/theme/components/nav/nav-logo.css +42 -0
  116. package/dist/theme/components/nav/nav-logo.tsx +262 -0
  117. package/dist/theme/components/nav/theme-switcher.css +92 -0
  118. package/dist/theme/components/nav/theme-switcher.tsx +298 -0
  119. package/dist/theme/components/nav/topbar-cta.css +45 -0
  120. package/dist/theme/components/nav/topbar-cta.tsx +39 -0
  121. package/dist/theme/components/nav/variant-toggle.css +70 -0
  122. package/dist/theme/components/nav/variant-toggle.tsx +83 -0
  123. package/dist/theme/components/nav/version-chip.css +31 -0
  124. package/dist/theme/components/nav/version-chip.tsx +45 -0
  125. package/dist/theme/components/nav/vscode-tag.css +32 -0
  126. package/dist/theme/components/nav/vscode-tag.tsx +20 -0
  127. package/dist/theme/components/openapi/code-sample.tsx +341 -0
  128. package/dist/theme/components/openapi/copy-markdown-button.tsx +41 -0
  129. package/dist/theme/components/openapi/icons.tsx +45 -0
  130. package/dist/theme/components/openapi/index.ts +6 -0
  131. package/dist/theme/components/openapi/method-badge.tsx +24 -0
  132. package/dist/theme/components/openapi/openapi.css +665 -0
  133. package/dist/theme/components/openapi/operation.tsx +200 -0
  134. package/dist/theme/components/openapi/overview.tsx +207 -0
  135. package/dist/theme/components/openapi/parameters-table.tsx +149 -0
  136. package/dist/theme/components/openapi/request-body.tsx +90 -0
  137. package/dist/theme/components/openapi/response-list.tsx +112 -0
  138. package/dist/theme/components/openapi/schema-viewer.tsx +277 -0
  139. package/dist/theme/components/openapi/security-badges.tsx +63 -0
  140. package/dist/theme/components/openapi/spec-utils.ts +122 -0
  141. package/dist/theme/components/shared/accordion.css +118 -0
  142. package/dist/theme/components/shared/accordion.stories.tsx +96 -0
  143. package/dist/theme/components/shared/accordion.tsx +191 -0
  144. package/dist/theme/components/shared/brand-logo.stories.tsx +49 -0
  145. package/dist/theme/components/shared/brand-mark.stories.tsx +53 -0
  146. package/dist/theme/components/shared/browser-window.css +1 -0
  147. package/dist/theme/components/shared/browser-window.stories.tsx +100 -0
  148. package/dist/theme/components/shared/browser-window.tsx +2 -0
  149. package/dist/theme/components/shared/card.stories.tsx +50 -0
  150. package/dist/theme/components/shared/card.tsx +35 -0
  151. package/dist/theme/components/shared/ciderpress-logo.tsx +93 -0
  152. package/dist/theme/components/shared/ciderpress-mark.tsx +77 -0
  153. package/dist/theme/components/shared/color.css +56 -0
  154. package/dist/theme/components/shared/color.stories.tsx +47 -0
  155. package/dist/theme/components/shared/color.tsx +69 -0
  156. package/dist/theme/components/shared/columns.css +37 -0
  157. package/dist/theme/components/shared/columns.stories.tsx +91 -0
  158. package/dist/theme/components/shared/columns.tsx +50 -0
  159. package/dist/theme/components/shared/desktop-window.css +339 -0
  160. package/dist/theme/components/shared/desktop-window.tsx +535 -0
  161. package/dist/theme/components/shared/field.css +158 -0
  162. package/dist/theme/components/shared/field.stories.tsx +100 -0
  163. package/dist/theme/components/shared/field.tsx +186 -0
  164. package/dist/theme/components/shared/frame.css +39 -0
  165. package/dist/theme/components/shared/frame.stories.tsx +49 -0
  166. package/dist/theme/components/shared/frame.tsx +76 -0
  167. package/dist/theme/components/shared/icon.stories.tsx +90 -0
  168. package/dist/theme/components/shared/icon.tsx +41 -0
  169. package/dist/theme/components/shared/prompt.css +178 -0
  170. package/dist/theme/components/shared/prompt.stories.tsx +57 -0
  171. package/dist/theme/components/shared/prompt.tsx +369 -0
  172. package/dist/theme/components/shared/resolve-card-icon.ts +28 -0
  173. package/dist/theme/components/shared/section-card.stories.tsx +51 -0
  174. package/dist/theme/components/shared/section-card.tsx +44 -0
  175. package/dist/theme/components/shared/section-grid.stories.tsx +46 -0
  176. package/dist/theme/components/shared/section-grid.tsx +15 -0
  177. package/dist/theme/components/shared/status-badge.css +37 -0
  178. package/dist/theme/components/shared/status-badge.stories.tsx +61 -0
  179. package/dist/theme/components/shared/status-badge.tsx +74 -0
  180. package/dist/theme/components/shared/steps.css +88 -0
  181. package/dist/theme/components/shared/steps.stories.tsx +68 -0
  182. package/dist/theme/components/shared/steps.tsx +100 -0
  183. package/dist/theme/components/shared/tech-icon-table.stories.tsx +29 -0
  184. package/dist/theme/components/shared/tech-icon-table.tsx +71 -0
  185. package/dist/theme/components/shared/tech-tag.stories.tsx +40 -0
  186. package/dist/theme/components/shared/tech-tag.tsx +31 -0
  187. package/dist/theme/components/shared/theme-color-palette.css +80 -0
  188. package/dist/theme/components/shared/theme-color-palette.stories.tsx +52 -0
  189. package/dist/theme/components/shared/theme-color-palette.tsx +275 -0
  190. package/dist/theme/components/shared/tooltip.css +69 -0
  191. package/dist/theme/components/shared/tooltip.stories.tsx +72 -0
  192. package/dist/theme/components/shared/tooltip.tsx +77 -0
  193. package/dist/theme/components/sidebar/framework-picker.css +77 -0
  194. package/dist/theme/components/sidebar/framework-picker.tsx +78 -0
  195. package/dist/theme/components/sidebar/sidebar-filter.test.ts +140 -0
  196. package/dist/theme/components/sidebar/sidebar-filter.ts +79 -0
  197. package/dist/theme/components/sidebar/sidebar-links.css +102 -0
  198. package/dist/theme/components/sidebar/sidebar-links.tsx +122 -0
  199. package/dist/theme/components/sidebar/sidebar-promo.css +42 -0
  200. package/dist/theme/components/sidebar/sidebar-promo.tsx +52 -0
  201. package/dist/theme/components/sidebar/sidebar-scope.tsx +151 -0
  202. package/dist/theme/components/sidebar/sidebar-toggle.css +181 -0
  203. package/dist/theme/components/sidebar/sidebar-toggle.tsx +127 -0
  204. package/dist/theme/components/theme-provider.tsx +637 -0
  205. package/dist/theme/components/workspaces/card.css +151 -0
  206. package/dist/theme/components/workspaces/card.tsx +166 -0
  207. package/dist/theme/components/workspaces/grid.tsx +62 -0
  208. package/dist/theme/css.d.ts +1 -0
  209. package/dist/theme/env.d.ts +12 -0
  210. package/dist/theme/fonts/GeistMono-Variable.woff2 +0 -0
  211. package/dist/theme/fonts/GeistPixel-Square.woff2 +0 -0
  212. package/dist/theme/fonts/GeistSans-Variable.woff2 +0 -0
  213. package/dist/theme/hooks/use-ciderpress.ts +61 -0
  214. package/dist/theme/hooks/use-nav-items.ts +76 -0
  215. package/dist/theme/icons/index.ts +2 -0
  216. package/dist/theme/icons/tech-map.ts +228 -0
  217. package/dist/theme/index.tsx +180 -0
  218. package/dist/theme/lib/read-social-links.ts +27 -0
  219. package/dist/theme/lib/route-link.tsx +126 -0
  220. package/dist/theme/lib/safe-url.test.ts +0 -0
  221. package/dist/theme/lib/safe-url.ts +68 -0
  222. package/dist/theme/lib/theme-favicon.ts +125 -0
  223. package/dist/theme/lib/user-config-stub.ts +12 -0
  224. package/dist/theme/styles/layers.css +32 -0
  225. package/dist/theme/styles/overrides/badge.css +26 -0
  226. package/dist/theme/styles/overrides/content-footer.css +80 -0
  227. package/dist/theme/styles/overrides/details.css +61 -0
  228. package/dist/theme/styles/overrides/fonts.css +32 -0
  229. package/dist/theme/styles/overrides/home-card.css +133 -0
  230. package/dist/theme/styles/overrides/home.css +243 -0
  231. package/dist/theme/styles/overrides/rail.css +337 -0
  232. package/dist/theme/styles/overrides/rspress.css +62 -0
  233. package/dist/theme/styles/overrides/scrollbar.css +25 -0
  234. package/dist/theme/styles/overrides/section-card.css +114 -0
  235. package/dist/theme/styles/overrides/sidebar.css +144 -0
  236. package/dist/theme/styles/overrides/tokens.css +288 -0
  237. package/dist/theme/styles/overrides/vscode.css +88 -0
  238. package/dist/theme/styles/themes/amber.css +545 -0
  239. package/dist/theme/styles/themes/arcade-fx.css +366 -0
  240. package/dist/theme/styles/themes/arcade.css +273 -0
  241. package/dist/theme/styles/themes/grannysmith.css +545 -0
  242. package/dist/theme/styles/themes/honeycrisp.css +545 -0
  243. package/dist/theme/styles/themes/midnight.css +273 -0
  244. package/dist/theme/styles/themes/mulled.css +817 -0
  245. package/package.json +103 -0
  246. package/src/theme/components/announcement/announcement-bar.css +103 -0
  247. package/src/theme/components/announcement/announcement-bar.tsx +173 -0
  248. package/src/theme/components/ask-ai/ask-ai-button.css +52 -0
  249. package/src/theme/components/ask-ai/ask-ai-button.tsx +56 -0
  250. package/src/theme/components/content-footer/content-footer-portal.tsx +70 -0
  251. package/src/theme/components/content-footer/feedback.css +47 -0
  252. package/src/theme/components/content-footer/feedback.tsx +96 -0
  253. package/src/theme/components/content-footer/meta-actions.css +25 -0
  254. package/src/theme/components/content-footer/meta-actions.tsx +57 -0
  255. package/src/theme/components/content-footer/page-pager.css +61 -0
  256. package/src/theme/components/content-footer/page-pager.tsx +110 -0
  257. package/src/theme/components/edit-source-button.tsx +97 -0
  258. package/src/theme/components/footer/site-footer.css +179 -0
  259. package/src/theme/components/footer/site-footer.tsx +115 -0
  260. package/src/theme/components/home/cta.css +67 -0
  261. package/src/theme/components/home/cta.tsx +77 -0
  262. package/src/theme/components/home/feature-card.css +52 -0
  263. package/src/theme/components/home/feature-card.tsx +131 -0
  264. package/src/theme/components/home/feature.tsx +79 -0
  265. package/src/theme/components/home/hero-demo.css +66 -0
  266. package/src/theme/components/home/hero-demo.tsx +46 -0
  267. package/src/theme/components/home/hero.css +96 -0
  268. package/src/theme/components/home/hero.tsx +111 -0
  269. package/src/theme/components/home/layout.tsx +183 -0
  270. package/src/theme/components/home/page-rail.css +21 -0
  271. package/src/theme/components/home/page-rail.tsx +19 -0
  272. package/src/theme/components/home/split.css +148 -0
  273. package/src/theme/components/home/split.tsx +120 -0
  274. package/src/theme/components/home/trust-strip.css +33 -0
  275. package/src/theme/components/home/trust-strip.tsx +43 -0
  276. package/src/theme/components/home/workspaces.tsx +71 -0
  277. package/src/theme/components/nav/branch-tag.css +54 -0
  278. package/src/theme/components/nav/branch-tag.tsx +101 -0
  279. package/src/theme/components/nav/ciderpress-doc-layout.tsx +247 -0
  280. package/src/theme/components/nav/ciderpress-docs-bar.css +505 -0
  281. package/src/theme/components/nav/ciderpress-docs-bar.tsx +426 -0
  282. package/src/theme/components/nav/ciderpress-header.css +172 -0
  283. package/src/theme/components/nav/ciderpress-header.tsx +113 -0
  284. package/src/theme/components/nav/ciderpress-layout-context.tsx +49 -0
  285. package/src/theme/components/nav/ciderpress-nav-hamburger.css +193 -0
  286. package/src/theme/components/nav/ciderpress-nav-hamburger.tsx +112 -0
  287. package/src/theme/components/nav/ciderpress-nav-menu.css +130 -0
  288. package/src/theme/components/nav/ciderpress-nav-menu.tsx +372 -0
  289. package/src/theme/components/nav/ciderpress-nav-search.css +73 -0
  290. package/src/theme/components/nav/ciderpress-nav-search.tsx +55 -0
  291. package/src/theme/components/nav/ciderpress-nav-social-links.css +35 -0
  292. package/src/theme/components/nav/ciderpress-nav-social-links.tsx +87 -0
  293. package/src/theme/components/nav/floating-branch-indicator.css +106 -0
  294. package/src/theme/components/nav/floating-branch-indicator.tsx +109 -0
  295. package/src/theme/components/nav/layout.tsx +268 -0
  296. package/src/theme/components/nav/mobile-nav-cta.tsx +79 -0
  297. package/src/theme/components/nav/nav-divider.css +15 -0
  298. package/src/theme/components/nav/nav-divider.tsx +19 -0
  299. package/src/theme/components/nav/nav-logo.css +42 -0
  300. package/src/theme/components/nav/nav-logo.tsx +262 -0
  301. package/src/theme/components/nav/theme-switcher.css +92 -0
  302. package/src/theme/components/nav/theme-switcher.tsx +298 -0
  303. package/src/theme/components/nav/topbar-cta.css +45 -0
  304. package/src/theme/components/nav/topbar-cta.tsx +39 -0
  305. package/src/theme/components/nav/variant-toggle.css +70 -0
  306. package/src/theme/components/nav/variant-toggle.tsx +83 -0
  307. package/src/theme/components/nav/version-chip.css +31 -0
  308. package/src/theme/components/nav/version-chip.tsx +45 -0
  309. package/src/theme/components/nav/vscode-tag.css +32 -0
  310. package/src/theme/components/nav/vscode-tag.tsx +20 -0
  311. package/src/theme/components/openapi/code-sample.tsx +341 -0
  312. package/src/theme/components/openapi/copy-markdown-button.tsx +41 -0
  313. package/src/theme/components/openapi/icons.tsx +45 -0
  314. package/src/theme/components/openapi/index.ts +6 -0
  315. package/src/theme/components/openapi/method-badge.tsx +24 -0
  316. package/src/theme/components/openapi/openapi.css +665 -0
  317. package/src/theme/components/openapi/operation.tsx +200 -0
  318. package/src/theme/components/openapi/overview.tsx +207 -0
  319. package/src/theme/components/openapi/parameters-table.tsx +149 -0
  320. package/src/theme/components/openapi/request-body.tsx +90 -0
  321. package/src/theme/components/openapi/response-list.tsx +112 -0
  322. package/src/theme/components/openapi/schema-viewer.tsx +277 -0
  323. package/src/theme/components/openapi/security-badges.tsx +63 -0
  324. package/src/theme/components/openapi/spec-utils.ts +122 -0
  325. package/src/theme/components/shared/accordion.css +118 -0
  326. package/src/theme/components/shared/accordion.stories.tsx +96 -0
  327. package/src/theme/components/shared/accordion.tsx +191 -0
  328. package/src/theme/components/shared/brand-logo.stories.tsx +49 -0
  329. package/src/theme/components/shared/brand-mark.stories.tsx +53 -0
  330. package/src/theme/components/shared/browser-window.css +1 -0
  331. package/src/theme/components/shared/browser-window.stories.tsx +100 -0
  332. package/src/theme/components/shared/browser-window.tsx +2 -0
  333. package/src/theme/components/shared/card.stories.tsx +50 -0
  334. package/src/theme/components/shared/card.tsx +35 -0
  335. package/src/theme/components/shared/ciderpress-logo.tsx +93 -0
  336. package/src/theme/components/shared/ciderpress-mark.tsx +77 -0
  337. package/src/theme/components/shared/color.css +56 -0
  338. package/src/theme/components/shared/color.stories.tsx +47 -0
  339. package/src/theme/components/shared/color.tsx +69 -0
  340. package/src/theme/components/shared/columns.css +37 -0
  341. package/src/theme/components/shared/columns.stories.tsx +91 -0
  342. package/src/theme/components/shared/columns.tsx +50 -0
  343. package/src/theme/components/shared/desktop-window.css +339 -0
  344. package/src/theme/components/shared/desktop-window.tsx +535 -0
  345. package/src/theme/components/shared/field.css +158 -0
  346. package/src/theme/components/shared/field.stories.tsx +100 -0
  347. package/src/theme/components/shared/field.tsx +186 -0
  348. package/src/theme/components/shared/frame.css +39 -0
  349. package/src/theme/components/shared/frame.stories.tsx +49 -0
  350. package/src/theme/components/shared/frame.tsx +76 -0
  351. package/src/theme/components/shared/icon.stories.tsx +90 -0
  352. package/src/theme/components/shared/icon.tsx +41 -0
  353. package/src/theme/components/shared/prompt.css +178 -0
  354. package/src/theme/components/shared/prompt.stories.tsx +57 -0
  355. package/src/theme/components/shared/prompt.tsx +369 -0
  356. package/src/theme/components/shared/resolve-card-icon.ts +28 -0
  357. package/src/theme/components/shared/section-card.stories.tsx +51 -0
  358. package/src/theme/components/shared/section-card.tsx +44 -0
  359. package/src/theme/components/shared/section-grid.stories.tsx +46 -0
  360. package/src/theme/components/shared/section-grid.tsx +15 -0
  361. package/src/theme/components/shared/status-badge.css +37 -0
  362. package/src/theme/components/shared/status-badge.stories.tsx +61 -0
  363. package/src/theme/components/shared/status-badge.tsx +74 -0
  364. package/src/theme/components/shared/steps.css +88 -0
  365. package/src/theme/components/shared/steps.stories.tsx +68 -0
  366. package/src/theme/components/shared/steps.tsx +100 -0
  367. package/src/theme/components/shared/tech-icon-table.stories.tsx +29 -0
  368. package/src/theme/components/shared/tech-icon-table.tsx +71 -0
  369. package/src/theme/components/shared/tech-tag.stories.tsx +40 -0
  370. package/src/theme/components/shared/tech-tag.tsx +31 -0
  371. package/src/theme/components/shared/theme-color-palette.css +80 -0
  372. package/src/theme/components/shared/theme-color-palette.stories.tsx +52 -0
  373. package/src/theme/components/shared/theme-color-palette.tsx +275 -0
  374. package/src/theme/components/shared/tooltip.css +69 -0
  375. package/src/theme/components/shared/tooltip.stories.tsx +72 -0
  376. package/src/theme/components/shared/tooltip.tsx +77 -0
  377. package/src/theme/components/sidebar/framework-picker.css +77 -0
  378. package/src/theme/components/sidebar/framework-picker.tsx +78 -0
  379. package/src/theme/components/sidebar/sidebar-filter.test.ts +140 -0
  380. package/src/theme/components/sidebar/sidebar-filter.ts +79 -0
  381. package/src/theme/components/sidebar/sidebar-links.css +102 -0
  382. package/src/theme/components/sidebar/sidebar-links.tsx +122 -0
  383. package/src/theme/components/sidebar/sidebar-promo.css +42 -0
  384. package/src/theme/components/sidebar/sidebar-promo.tsx +52 -0
  385. package/src/theme/components/sidebar/sidebar-scope.tsx +151 -0
  386. package/src/theme/components/sidebar/sidebar-toggle.css +181 -0
  387. package/src/theme/components/sidebar/sidebar-toggle.tsx +127 -0
  388. package/src/theme/components/theme-provider.tsx +637 -0
  389. package/src/theme/components/workspaces/card.css +151 -0
  390. package/src/theme/components/workspaces/card.tsx +166 -0
  391. package/src/theme/components/workspaces/grid.tsx +62 -0
  392. package/src/theme/css.d.ts +1 -0
  393. package/src/theme/env.d.ts +12 -0
  394. package/src/theme/fonts/GeistMono-Variable.woff2 +0 -0
  395. package/src/theme/fonts/GeistPixel-Square.woff2 +0 -0
  396. package/src/theme/fonts/GeistSans-Variable.woff2 +0 -0
  397. package/src/theme/hooks/use-ciderpress.ts +61 -0
  398. package/src/theme/hooks/use-nav-items.ts +76 -0
  399. package/src/theme/icons/index.ts +2 -0
  400. package/src/theme/icons/tech-map.ts +228 -0
  401. package/src/theme/index.tsx +180 -0
  402. package/src/theme/lib/read-social-links.ts +27 -0
  403. package/src/theme/lib/route-link.tsx +126 -0
  404. package/src/theme/lib/safe-url.test.ts +0 -0
  405. package/src/theme/lib/safe-url.ts +68 -0
  406. package/src/theme/lib/theme-favicon.ts +125 -0
  407. package/src/theme/lib/user-config-stub.ts +12 -0
  408. package/src/theme/styles/layers.css +32 -0
  409. package/src/theme/styles/overrides/badge.css +26 -0
  410. package/src/theme/styles/overrides/content-footer.css +80 -0
  411. package/src/theme/styles/overrides/details.css +61 -0
  412. package/src/theme/styles/overrides/fonts.css +32 -0
  413. package/src/theme/styles/overrides/home-card.css +133 -0
  414. package/src/theme/styles/overrides/home.css +243 -0
  415. package/src/theme/styles/overrides/rail.css +337 -0
  416. package/src/theme/styles/overrides/rspress.css +62 -0
  417. package/src/theme/styles/overrides/scrollbar.css +25 -0
  418. package/src/theme/styles/overrides/section-card.css +114 -0
  419. package/src/theme/styles/overrides/sidebar.css +144 -0
  420. package/src/theme/styles/overrides/tokens.css +288 -0
  421. package/src/theme/styles/overrides/vscode.css +88 -0
  422. package/src/theme/styles/themes/amber.css +545 -0
  423. package/src/theme/styles/themes/arcade-fx.css +366 -0
  424. package/src/theme/styles/themes/arcade.css +273 -0
  425. package/src/theme/styles/themes/grannysmith.css +545 -0
  426. package/src/theme/styles/themes/honeycrisp.css +545 -0
  427. package/src/theme/styles/themes/midnight.css +273 -0
  428. package/src/theme/styles/themes/mulled.css +817 -0
@@ -0,0 +1,113 @@
1
+ import { clsx } from 'clsx'
2
+ import type React from 'react'
3
+
4
+ import { RouteLink } from '../../lib/route-link.tsx'
5
+ import { CiderpressLogo } from '../shared/ciderpress-logo'
6
+ import { CiderpressNavHamburger } from './ciderpress-nav-hamburger'
7
+ import { CiderpressNavMenu } from './ciderpress-nav-menu'
8
+ import type { CiderpressNavMenuItem } from './ciderpress-nav-menu'
9
+ import { CiderpressNavSearch } from './ciderpress-nav-search'
10
+ import { CiderpressNavSocialLinks } from './ciderpress-nav-social-links'
11
+ import type { CiderpressSocialLink } from './ciderpress-nav-social-links'
12
+ import { NavDivider } from './nav-divider'
13
+ import { TopbarCTA } from './topbar-cta'
14
+ import { VariantToggle } from './variant-toggle'
15
+
16
+ import './ciderpress-header.css'
17
+
18
+ /**
19
+ * Props for the ciderpress site header.
20
+ */
21
+ export interface CiderpressHeaderProps {
22
+ /**
23
+ * Pre-rendered announcement bar, pinned above the nav row. Pass
24
+ * `null` to omit.
25
+ */
26
+ readonly announcement: React.ReactNode
27
+ /**
28
+ * Primary nav menu items, fed straight into `<CiderpressNavMenu />`.
29
+ */
30
+ readonly navItems: readonly CiderpressNavMenuItem[]
31
+ /**
32
+ * Social-link entries (GitHub, npm, etc) read from `site.socialLinks`.
33
+ */
34
+ readonly socialLinks: readonly CiderpressSocialLink[]
35
+ /**
36
+ * Topbar CTA configuration. Pass `undefined` to omit.
37
+ */
38
+ readonly topbarCta: { readonly text: string; readonly href: string } | undefined
39
+ /**
40
+ * `true` on the home page — used to suppress the sidebar toggle.
41
+ */
42
+ readonly isHome: boolean
43
+ }
44
+
45
+ /**
46
+ * Custom replacement for Rspress's built-in `.rp-nav`. Owns the entire
47
+ * topbar chrome (logo, search trigger, primary menu with
48
+ * measure-and-collapse overflow, variant toggle, social cluster, CTA)
49
+ * using only `cp-*` class names and `cp-*` CSS custom properties so
50
+ * theme authors can override every surface without reaching into
51
+ * Rspress internals.
52
+ *
53
+ * Rspress's own `.rp-nav` is hidden by a rule in
54
+ * `styles/overrides/rail.css` — the two never coexist visually.
55
+ *
56
+ * @param props - Header configuration
57
+ * @returns Sticky header element
58
+ */
59
+ export function CiderpressHeader(props: CiderpressHeaderProps): React.ReactElement {
60
+ // Landing / home pages live inside a constrained max-width container;
61
+ // doc pages stretch full-width (sidebar + article). The header mirrors
62
+ // the content shell so it never floats outside the page rhythm.
63
+ return (
64
+ <header
65
+ className={clsx('cp-header', {
66
+ 'cp-header--landing': props.isHome,
67
+ 'cp-header--docs': !props.isHome,
68
+ })}
69
+ >
70
+ {props.announcement}
71
+ <div className="cp-header-inner">
72
+ {/* Left: hamburger (mobile primary-nav drawer) + logo. Sidebar
73
+ collapse/expand lives in <CiderpressDocsBar />, the sticky
74
+ sub-header rendered beneath the site nav on docs pages. */}
75
+ <CiderpressNavHamburger
76
+ navItems={props.navItems}
77
+ socialLinks={props.socialLinks}
78
+ topbarCta={props.topbarCta}
79
+ />
80
+ <RouteLink href="/" className="cp-header-logo" aria-label="Home">
81
+ <CiderpressLogo />
82
+ </RouteLink>
83
+
84
+ {/* Right cluster wrapper. Grows from a zero basis so its width
85
+ equals the actual available room (not the content), which is
86
+ the stable measurement target the React overflow logic
87
+ inside CiderpressNavMenu needs.
88
+
89
+ Inside: search comes first, then the menu (which itself
90
+ fills the leftover room and right-aligns items inside).
91
+ That places search immediately before the menu items, both
92
+ anchored to the right edge of the wrapper. */}
93
+ <div className="cp-header-menu-wrap">
94
+ <CiderpressNavSearch />
95
+ <NavDivider />
96
+ <CiderpressNavMenu items={props.navItems} />
97
+ </div>
98
+
99
+ <NavDivider />
100
+ <VariantToggle />
101
+ <CiderpressNavSocialLinks links={props.socialLinks} />
102
+ {props.topbarCta !== undefined && (
103
+ <>
104
+ <NavDivider />
105
+ <TopbarCTA text={props.topbarCta.text} href={props.topbarCta.href} />
106
+ </>
107
+ )}
108
+ </div>
109
+ </header>
110
+ )
111
+ }
112
+
113
+ export { CiderpressHeader as default }
@@ -0,0 +1,49 @@
1
+ import { createContext, useContext } from 'react'
2
+ import type React from 'react'
3
+
4
+ /**
5
+ * State shape for the ciderpress doc-layout drawer controls.
6
+ *
7
+ * Shared between `<CiderpressDocLayout />` (the owner) and
8
+ * `<CiderpressDocsBar />` (the consumer that toggles the sidebar
9
+ * drawer open/closed on narrow viewports).
10
+ */
11
+ export interface CiderpressLayoutContextValue {
12
+ readonly isSidebarOpen: boolean
13
+ readonly setIsSidebarOpen: React.Dispatch<React.SetStateAction<boolean>>
14
+ readonly isOutlineOpen: boolean
15
+ readonly setIsOutlineOpen: React.Dispatch<React.SetStateAction<boolean>>
16
+ }
17
+
18
+ /**
19
+ * Empty default setter — used only when the context is read outside
20
+ * a provider, which happens on home / blank pages where the doc
21
+ * layout isn't mounted.
22
+ *
23
+ * @private
24
+ */
25
+ function noop(): void {
26
+ // intentional no-op
27
+ }
28
+
29
+ const defaultValue: CiderpressLayoutContextValue = {
30
+ isSidebarOpen: false,
31
+ setIsSidebarOpen: noop,
32
+ isOutlineOpen: false,
33
+ setIsOutlineOpen: noop,
34
+ }
35
+
36
+ /**
37
+ * @internal
38
+ */
39
+ export const CiderpressLayoutContext = createContext<CiderpressLayoutContextValue>(defaultValue)
40
+
41
+ /**
42
+ * Read the shared doc-layout drawer state. Returns no-op setters when
43
+ * called outside a `<CiderpressDocLayout />` (e.g. on home pages).
44
+ *
45
+ * @returns Sidebar/outline open state and their setters.
46
+ */
47
+ export function useCiderpressLayout(): CiderpressLayoutContextValue {
48
+ return useContext(CiderpressLayoutContext)
49
+ }
@@ -0,0 +1,193 @@
1
+ /**
2
+ * CiderpressNavHamburger — mobile drawer trigger and slide-in panel.
3
+ *
4
+ * Theme-author API:
5
+ * --cp-nav-hamburger-breakpoint max viewport width to show
6
+ * hamburger / hide desktop chrome
7
+ * (default 768px)
8
+ * --cp-nav-drawer-width drawer panel width (default 320px)
9
+ * --cp-nav-drawer-bg drawer background colour
10
+ * --cp-nav-drawer-backdrop backdrop colour
11
+ * --cp-nav-drawer-shadow drawer drop shadow
12
+ */
13
+ .cp-nav-hamburger {
14
+ display: none;
15
+ align-items: center;
16
+ justify-content: center;
17
+ width: 36px;
18
+ height: 36px;
19
+ padding: 0;
20
+ background: transparent;
21
+ border: 1px solid var(--cp-c-border);
22
+ border-radius: 8px;
23
+ color: var(--cp-c-text-2);
24
+ cursor: pointer;
25
+ transition:
26
+ border-color 0.15s ease,
27
+ color 0.15s ease;
28
+ }
29
+
30
+ .cp-nav-hamburger:hover {
31
+ border-color: var(--cp-c-brand-1);
32
+ color: var(--cp-c-brand-1);
33
+ }
34
+
35
+ /* Show the hamburger at the same breakpoint where `<CiderpressHeader />`
36
+ collapses its desktop chrome (see `ciderpress-header.css`) and where
37
+ `<CiderpressDocsBar />` flips to its mobile layout, so all three
38
+ pieces transition together. */
39
+ @media (max-width: 1024px) {
40
+ .cp-nav-hamburger {
41
+ display: inline-flex;
42
+ }
43
+ }
44
+
45
+ /* ── Drawer ─────────────────────────────────────────────────────── */
46
+ /*
47
+ * `.cp-nav-drawer-root` is the react-aria-components <ModalOverlay>
48
+ * (acts as the backdrop). `.cp-nav-drawer-modal` is the <Modal> wrapper.
49
+ * `.cp-nav-drawer` is the <Dialog> — the focus-trapped panel.
50
+ */
51
+ .cp-nav-drawer-root {
52
+ position: fixed;
53
+ inset: 0;
54
+ z-index: 100;
55
+ background: var(--cp-nav-drawer-backdrop, rgba(0, 0, 0, 0.55));
56
+ backdrop-filter: blur(4px);
57
+ animation: cp-nav-drawer-fade-in 0.18s ease-out forwards;
58
+ }
59
+
60
+ .cp-nav-drawer-modal {
61
+ position: absolute;
62
+ top: 0;
63
+ left: 0;
64
+ height: 100vh;
65
+ width: min(var(--cp-nav-drawer-width, 320px), 100vw);
66
+ }
67
+
68
+ .cp-nav-drawer {
69
+ outline: none;
70
+ height: 100%;
71
+ width: 100%;
72
+ display: flex;
73
+ flex-direction: column;
74
+ background: var(--cp-nav-drawer-bg, var(--cp-c-bg));
75
+ border-right: 1px solid var(--cp-c-border);
76
+ box-shadow: var(--cp-nav-drawer-shadow, 8px 0 32px rgba(0, 0, 0, 0.3));
77
+ animation: cp-nav-drawer-slide-in 0.22s cubic-bezier(0.2, 0.6, 0.2, 1) forwards;
78
+ overflow-y: auto;
79
+ }
80
+
81
+ .cp-nav-drawer__header {
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: space-between;
85
+ padding: 16px 20px;
86
+ border-bottom: 1px solid var(--cp-c-divider);
87
+ }
88
+
89
+ .cp-nav-drawer__title {
90
+ font-family: var(--cp-font-family-base);
91
+ font-size: 14px;
92
+ font-weight: 600;
93
+ text-transform: uppercase;
94
+ letter-spacing: 0.04em;
95
+ color: var(--cp-c-text-3);
96
+ }
97
+
98
+ .cp-nav-drawer__close {
99
+ display: inline-flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ width: 32px;
103
+ height: 32px;
104
+ background: transparent;
105
+ border: 1px solid var(--cp-c-border);
106
+ border-radius: 6px;
107
+ color: var(--cp-c-text-2);
108
+ cursor: pointer;
109
+ transition:
110
+ color 0.15s ease,
111
+ border-color 0.15s ease;
112
+ }
113
+
114
+ .cp-nav-drawer__close:hover {
115
+ border-color: var(--cp-c-brand-1);
116
+ color: var(--cp-c-brand-1);
117
+ }
118
+
119
+ .cp-nav-drawer__nav {
120
+ display: flex;
121
+ flex-direction: column;
122
+ padding: 12px 8px;
123
+ }
124
+
125
+ .cp-nav-drawer__link {
126
+ display: block;
127
+ padding: 12px 16px;
128
+ border-radius: 8px;
129
+ color: var(--cp-c-text-1);
130
+ font-size: 15px;
131
+ font-weight: 500;
132
+ text-decoration: none;
133
+ transition:
134
+ background 0.12s ease,
135
+ color 0.12s ease;
136
+ }
137
+
138
+ .cp-nav-drawer__link:hover {
139
+ background: var(--cp-c-bg-soft);
140
+ color: var(--cp-c-brand-1);
141
+ text-decoration: none;
142
+ }
143
+
144
+ .cp-nav-drawer__divider {
145
+ height: 1px;
146
+ margin: 4px 20px;
147
+ background: var(--cp-c-divider);
148
+ }
149
+
150
+ .cp-nav-drawer__row {
151
+ display: flex;
152
+ align-items: center;
153
+ justify-content: space-between;
154
+ padding: 12px 20px;
155
+ }
156
+
157
+ .cp-nav-drawer__row-label {
158
+ font-size: 12px;
159
+ font-weight: 600;
160
+ text-transform: uppercase;
161
+ letter-spacing: 0.04em;
162
+ color: var(--cp-c-text-3);
163
+ }
164
+
165
+ .cp-nav-drawer__footer {
166
+ margin-top: auto;
167
+ padding: 16px 20px;
168
+ border-top: 1px solid var(--cp-c-divider);
169
+ display: flex;
170
+ }
171
+
172
+ .cp-nav-drawer__footer > .cp-topbar-cta {
173
+ flex: 1;
174
+ justify-content: center;
175
+ }
176
+
177
+ @keyframes cp-nav-drawer-fade-in {
178
+ from {
179
+ opacity: 0;
180
+ }
181
+ to {
182
+ opacity: 1;
183
+ }
184
+ }
185
+
186
+ @keyframes cp-nav-drawer-slide-in {
187
+ from {
188
+ transform: translateX(-100%);
189
+ }
190
+ to {
191
+ transform: translateX(0);
192
+ }
193
+ }
@@ -0,0 +1,112 @@
1
+ import { useState } from 'react'
2
+ import type React from 'react'
3
+ import { Dialog, Modal, ModalOverlay } from 'react-aria-components'
4
+
5
+ import { RouteLink } from '../../lib/route-link.tsx'
6
+ import { Icon } from '../shared/icon.tsx'
7
+ import type { CiderpressNavMenuItem } from './ciderpress-nav-menu'
8
+ import { CiderpressNavSocialLinks } from './ciderpress-nav-social-links'
9
+ import type { CiderpressSocialLink } from './ciderpress-nav-social-links'
10
+ import { TopbarCTA } from './topbar-cta'
11
+ import { VariantToggle } from './variant-toggle'
12
+
13
+ import './ciderpress-nav-hamburger.css'
14
+
15
+ /**
16
+ * Props for the mobile hamburger menu.
17
+ */
18
+ export interface CiderpressNavHamburgerProps {
19
+ readonly navItems: readonly CiderpressNavMenuItem[]
20
+ readonly socialLinks: readonly CiderpressSocialLink[]
21
+ readonly topbarCta: { readonly text: string; readonly href: string } | undefined
22
+ }
23
+
24
+ /**
25
+ * Mobile hamburger trigger + slide-in drawer. Shown only at narrow
26
+ * viewports (CSS-driven via `--cp-nav-hamburger-breakpoint`). Drawer
27
+ * surfaces the full primary nav, variant toggle, social cluster, and
28
+ * CTA on screens where the desktop chrome can't fit.
29
+ *
30
+ * Built on `react-aria-components` `<ModalOverlay>` + `<Dialog>`, which
31
+ * provides a proper focus trap, focus restoration to the trigger,
32
+ * inert/aria-hidden on the rest of the page, ESC dismissal, and
33
+ * scroll-locking. Hand-rolling that correctly is famously hard, so we
34
+ * delegate.
35
+ *
36
+ * @param props - Nav items / social / CTA configuration
37
+ * @returns Hamburger button (mobile) + drawer (when open)
38
+ */
39
+ export function CiderpressNavHamburger(props: CiderpressNavHamburgerProps): React.ReactElement {
40
+ const [open, setOpen] = useState(false)
41
+
42
+ return (
43
+ <>
44
+ <button
45
+ type="button"
46
+ className="cp-nav-hamburger"
47
+ onClick={() => setOpen(true)}
48
+ aria-label="Open navigation menu"
49
+ aria-expanded={open}
50
+ >
51
+ <Icon icon="pixelarticons:menu" width={20} height={20} />
52
+ </button>
53
+ <ModalOverlay
54
+ className="cp-nav-drawer-root"
55
+ isOpen={open}
56
+ onOpenChange={setOpen}
57
+ isDismissable
58
+ >
59
+ <Modal className="cp-nav-drawer-modal">
60
+ <Dialog className="cp-nav-drawer" aria-label="Site navigation">
61
+ <header className="cp-nav-drawer__header">
62
+ <span className="cp-nav-drawer__title">Menu</span>
63
+ <button
64
+ type="button"
65
+ className="cp-nav-drawer__close"
66
+ onClick={() => setOpen(false)}
67
+ aria-label="Close navigation menu"
68
+ >
69
+ <Icon icon="pixelarticons:close" width={18} height={18} />
70
+ </button>
71
+ </header>
72
+
73
+ <nav className="cp-nav-drawer__nav" aria-label="Primary">
74
+ {props.navItems.map((item) => (
75
+ <RouteLink
76
+ key={item.link}
77
+ href={item.link}
78
+ className="cp-nav-drawer__link"
79
+ onClick={() => setOpen(false)}
80
+ >
81
+ {item.text}
82
+ </RouteLink>
83
+ ))}
84
+ </nav>
85
+
86
+ <div className="cp-nav-drawer__divider" />
87
+
88
+ <div className="cp-nav-drawer__row">
89
+ <span className="cp-nav-drawer__row-label">Theme</span>
90
+ <VariantToggle />
91
+ </div>
92
+
93
+ {props.socialLinks.length > 0 && (
94
+ <div className="cp-nav-drawer__row">
95
+ <span className="cp-nav-drawer__row-label">Links</span>
96
+ <CiderpressNavSocialLinks links={props.socialLinks} />
97
+ </div>
98
+ )}
99
+
100
+ {props.topbarCta !== undefined && (
101
+ <div className="cp-nav-drawer__footer">
102
+ <TopbarCTA text={props.topbarCta.text} href={props.topbarCta.href} />
103
+ </div>
104
+ )}
105
+ </Dialog>
106
+ </Modal>
107
+ </ModalOverlay>
108
+ </>
109
+ )
110
+ }
111
+
112
+ export { CiderpressNavHamburger as default }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * CiderpressNavMenu — primary topbar nav with overflow → dropdown.
3
+ *
4
+ * Theme-author API (all overridable per theme):
5
+ * --cp-nav-menu-gap inline gap between items (default 16px)
6
+ * --cp-nav-menu-item-padding-x horizontal padding inside each item
7
+ * --cp-nav-menu-item-color item text colour
8
+ * --cp-nav-menu-item-color-hover item text colour on hover
9
+ * --cp-nav-menu-item-color-active item text colour on the active route
10
+ * --cp-nav-menu-item-font-size item font size
11
+ * --cp-nav-menu-item-font-weight item font weight
12
+ * --cp-nav-menu-overflow-bg overflow popover surface colour
13
+ * --cp-nav-menu-overflow-border overflow popover border colour
14
+ */
15
+ .cp-nav-menu {
16
+ display: flex;
17
+ align-items: center;
18
+ gap: var(--cp-nav-menu-gap, 16px);
19
+ /* Take the full width of the parent wrapper so that
20
+ `container.clientWidth` (used by the ResizeObserver) reflects the
21
+ actual space available for items, not just the natural width of
22
+ whatever items happen to currently render. Without this the menu
23
+ shrinks to fit its content, reports a tiny available width, and
24
+ collapses every item into the overflow popover. */
25
+ flex: 1 1 auto;
26
+ width: 100%;
27
+ min-width: 0;
28
+ white-space: nowrap;
29
+ }
30
+
31
+ .cp-nav-menu__item {
32
+ display: inline-flex;
33
+ align-items: center;
34
+ padding: 0 var(--cp-nav-menu-item-padding-x, 4px);
35
+ color: var(--cp-nav-menu-item-color, var(--cp-c-text-2, #cdd6f4));
36
+ font-size: var(--cp-nav-menu-item-font-size, 13px);
37
+ font-weight: var(--cp-nav-menu-item-font-weight, 500);
38
+ line-height: 1;
39
+ text-decoration: none;
40
+ white-space: nowrap;
41
+ transition: color 0.15s ease;
42
+ }
43
+
44
+ .cp-nav-menu__item:hover {
45
+ color: var(--cp-nav-menu-item-color-hover, var(--cp-c-brand-1, currentColor));
46
+ text-decoration: none;
47
+ }
48
+
49
+ .cp-nav-menu__item--active {
50
+ color: var(--cp-nav-menu-item-color-active, var(--cp-c-brand-1, currentColor));
51
+ }
52
+
53
+ /* ── Hidden measurement layer ──────────────────────────────────────────
54
+ Renders every item at full natural width so the JS layer always has
55
+ a stable per-item measurement no matter how narrow the live menu
56
+ gets. `position: absolute` + `visibility: hidden` keeps it out of
57
+ the layout flow while remaining measurable. */
58
+ .cp-nav-menu-measure {
59
+ position: absolute;
60
+ visibility: hidden;
61
+ pointer-events: none;
62
+ display: inline-flex;
63
+ gap: var(--cp-nav-menu-gap, 16px);
64
+ white-space: nowrap;
65
+ }
66
+
67
+ /* ── Overflow toggle + popover ─────────────────────────────────────── */
68
+ .cp-nav-menu__overflow {
69
+ position: relative;
70
+ display: inline-flex;
71
+ align-items: center;
72
+ }
73
+
74
+ .cp-nav-menu__overflow-toggle {
75
+ display: inline-flex;
76
+ align-items: center;
77
+ gap: 4px;
78
+ padding: 0 var(--cp-nav-menu-item-padding-x, 4px);
79
+ background: transparent;
80
+ border: none;
81
+ color: var(--cp-nav-menu-item-color, var(--cp-c-text-2, #cdd6f4));
82
+ font-size: var(--cp-nav-menu-item-font-size, 13px);
83
+ font-weight: var(--cp-nav-menu-item-font-weight, 500);
84
+ line-height: 1;
85
+ cursor: pointer;
86
+ transition: color 0.15s ease;
87
+ }
88
+
89
+ .cp-nav-menu__overflow-toggle:hover {
90
+ color: var(--cp-nav-menu-item-color-hover, var(--cp-c-brand-1, currentColor));
91
+ }
92
+
93
+ .cp-nav-menu__overflow-popover {
94
+ position: absolute;
95
+ top: calc(100% + 6px);
96
+ right: 0;
97
+ z-index: 60;
98
+ min-width: 200px;
99
+ margin: 0;
100
+ padding: 6px;
101
+ list-style: none;
102
+ background: var(--cp-nav-menu-overflow-bg, var(--cp-c-bg, #1e1e2e));
103
+ border: 1px solid var(--cp-nav-menu-overflow-border, var(--cp-c-border, #313244));
104
+ border-radius: 8px;
105
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.24);
106
+ }
107
+
108
+ .cp-nav-menu__overflow-item {
109
+ display: block;
110
+ padding: 8px 12px;
111
+ border-radius: 6px;
112
+ color: var(--cp-nav-menu-item-color, var(--cp-c-text-2, #cdd6f4));
113
+ font-size: 13px;
114
+ font-weight: 500;
115
+ text-decoration: none;
116
+ white-space: nowrap;
117
+ transition:
118
+ background 0.1s ease,
119
+ color 0.1s ease;
120
+ }
121
+
122
+ .cp-nav-menu__overflow-item:hover {
123
+ background: var(--cp-c-bg-soft, rgba(255, 255, 255, 0.04));
124
+ color: var(--cp-nav-menu-item-color-hover, var(--cp-c-brand-1, currentColor));
125
+ text-decoration: none;
126
+ }
127
+
128
+ .cp-nav-menu__overflow-item--active {
129
+ color: var(--cp-nav-menu-item-color-active, var(--cp-c-brand-1, currentColor));
130
+ }