@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,228 @@
1
+ /**
2
+ * Predefined technology tag to Iconify identifier + display label.
3
+ *
4
+ * Uses `devicon` as the primary source for colored icons, with `logos`,
5
+ * `vscode-icons`, and `material-icon-theme` filling gaps. A small number
6
+ * of entries fall back to `simple-icons` (monochrome) when no colored
7
+ * alternative exists.
8
+ *
9
+ * Add new entries here when new technologies need card support.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const { icon, label } = TECH_ICONS['typescript']
14
+ * ```
15
+ */
16
+ export const TECH_ICONS = {
17
+ // -- Languages --
18
+ typescript: { icon: 'devicon:typescript', label: 'TypeScript' },
19
+ javascript: { icon: 'devicon:javascript', label: 'JavaScript' },
20
+ python: { icon: 'devicon:python', label: 'Python' },
21
+ go: { icon: 'devicon:go', label: 'Go' },
22
+ rust: { icon: 'devicon:rust', label: 'Rust' },
23
+ java: { icon: 'devicon:java', label: 'Java' },
24
+ csharp: { icon: 'devicon:csharp', label: 'C#' },
25
+ ruby: { icon: 'devicon:ruby', label: 'Ruby' },
26
+ php: { icon: 'devicon:php', label: 'PHP' },
27
+ swift: { icon: 'devicon:swift', label: 'Swift' },
28
+ kotlin: { icon: 'devicon:kotlin', label: 'Kotlin' },
29
+ elixir: { icon: 'devicon:elixir', label: 'Elixir' },
30
+ dart: { icon: 'devicon:dart', label: 'Dart' },
31
+ scala: { icon: 'devicon:scala', label: 'Scala' },
32
+ c: { icon: 'devicon:c', label: 'C' },
33
+ cplusplus: { icon: 'devicon:cplusplus', label: 'C++' },
34
+ r: { icon: 'devicon:r', label: 'R' },
35
+ lua: { icon: 'devicon:lua', label: 'Lua' },
36
+ perl: { icon: 'devicon:perl', label: 'Perl' },
37
+ haskell: { icon: 'devicon:haskell', label: 'Haskell' },
38
+ clojure: { icon: 'devicon:clojure', label: 'Clojure' },
39
+ erlang: { icon: 'devicon:erlang', label: 'Erlang' },
40
+ fsharp: { icon: 'devicon:fsharp', label: 'F#' },
41
+ julia: { icon: 'devicon:julia', label: 'Julia' },
42
+ groovy: { icon: 'devicon:groovy', label: 'Groovy' },
43
+
44
+ // -- Frontend frameworks --
45
+ react: { icon: 'devicon:react', label: 'React' },
46
+ nextjs: { icon: 'devicon:nextjs', label: 'Next.js' },
47
+ vue: { icon: 'devicon:vuejs', label: 'Vue' },
48
+ angular: { icon: 'devicon:angular', label: 'Angular' },
49
+ svelte: { icon: 'devicon:svelte', label: 'Svelte' },
50
+ astro: { icon: 'devicon:astro', label: 'Astro' },
51
+ solid: { icon: 'devicon:solidjs', label: 'Solid' },
52
+ remix: { icon: 'devicon:remix', label: 'Remix' },
53
+ qwik: { icon: 'devicon:qwik', label: 'Qwik' },
54
+ ember: { icon: 'devicon:ember', label: 'Ember' },
55
+ gatsby: { icon: 'devicon:gatsby', label: 'Gatsby' },
56
+ nuxtjs: { icon: 'devicon:nuxtjs', label: 'Nuxt' },
57
+ preact: { icon: 'logos:preact', label: 'Preact' },
58
+ lit: { icon: 'logos:lit', label: 'Lit' },
59
+
60
+ // -- Backend frameworks --
61
+ hono: { icon: 'logos:hono', label: 'Hono' },
62
+ express: { icon: 'devicon:express', label: 'Express' },
63
+ fastify: { icon: 'devicon:fastify', label: 'Fastify' },
64
+ nestjs: { icon: 'devicon:nestjs', label: 'NestJS' },
65
+ django: { icon: 'logos:django-icon', label: 'Django' },
66
+ flask: { icon: 'devicon:flask', label: 'Flask' },
67
+ rails: { icon: 'devicon:rails-wordmark', label: 'Rails' },
68
+ spring: { icon: 'devicon:spring', label: 'Spring' },
69
+ fastapi: { icon: 'devicon:fastapi', label: 'FastAPI' },
70
+ laravel: { icon: 'devicon:laravel', label: 'Laravel' },
71
+ phoenix: { icon: 'devicon:phoenix', label: 'Phoenix' },
72
+ fiber: { icon: 'devicon:fiber', label: 'Fiber' },
73
+ gin: { icon: 'logos:gin', label: 'Gin' },
74
+ akka: { icon: 'devicon:akka', label: 'Akka' },
75
+
76
+ // -- Mobile --
77
+ flutter: { icon: 'devicon:flutter', label: 'Flutter' },
78
+ reactnative: { icon: 'devicon:reactnative', label: 'React Native' },
79
+ ionic: { icon: 'devicon:ionic', label: 'Ionic' },
80
+
81
+ // -- Databases --
82
+ postgresql: { icon: 'devicon:postgresql', label: 'PostgreSQL' },
83
+ mysql: { icon: 'devicon:mysql', label: 'MySQL' },
84
+ mongodb: { icon: 'devicon:mongodb', label: 'MongoDB' },
85
+ redis: { icon: 'devicon:redis', label: 'Redis' },
86
+ sqlite: { icon: 'devicon:sqlite', label: 'SQLite' },
87
+ dynamodb: { icon: 'devicon:dynamodb', label: 'DynamoDB' },
88
+ elasticsearch: { icon: 'devicon:elasticsearch', label: 'Elasticsearch' },
89
+ neo4j: { icon: 'devicon:neo4j', label: 'Neo4j' },
90
+ cassandra: { icon: 'devicon:cassandra', label: 'Cassandra' },
91
+ couchdb: { icon: 'devicon:couchdb', label: 'CouchDB' },
92
+ mariadb: { icon: 'devicon:mariadb', label: 'MariaDB' },
93
+ influxdb: { icon: 'devicon:influxdb', label: 'InfluxDB' },
94
+ cockroachdb: { icon: 'simple-icons:cockroachlabs', label: 'CockroachDB' },
95
+ vitess: { icon: 'devicon:vitess', label: 'Vitess' },
96
+ oracle: { icon: 'devicon:oracle', label: 'Oracle' },
97
+
98
+ // -- ORM / Data tools --
99
+ prisma: { icon: 'devicon:prisma', label: 'Prisma' },
100
+ graphql: { icon: 'logos:graphql', label: 'GraphQL' },
101
+ drizzle: { icon: 'logos:drizzle', label: 'Drizzle' },
102
+ typeorm: { icon: 'logos:typeorm', label: 'TypeORM' },
103
+ sequelize: { icon: 'logos:sequelize', label: 'Sequelize' },
104
+ sqlalchemy: { icon: 'devicon:sqlalchemy', label: 'SQLAlchemy' },
105
+
106
+ // -- Cloud & hosting --
107
+ vercel: { icon: 'devicon:vercel', label: 'Vercel' },
108
+ aws: { icon: 'devicon:amazonwebservices', label: 'AWS' },
109
+ azure: { icon: 'devicon:azure', label: 'Azure' },
110
+ gcp: { icon: 'devicon:googlecloud', label: 'GCP' },
111
+ cloudflare: { icon: 'devicon:cloudflare', label: 'Cloudflare' },
112
+ digitalocean: { icon: 'devicon:digitalocean', label: 'DigitalOcean' },
113
+ heroku: { icon: 'devicon:heroku', label: 'Heroku' },
114
+ netlify: { icon: 'devicon:netlify', label: 'Netlify' },
115
+ firebase: { icon: 'devicon:firebase', label: 'Firebase' },
116
+ supabase: { icon: 'devicon:supabase', label: 'Supabase' },
117
+ railway: { icon: 'devicon:railway', label: 'Railway' },
118
+ pulumi: { icon: 'devicon:pulumi', label: 'Pulumi' },
119
+ fly: { icon: 'logos:fly-icon', label: 'Fly.io' },
120
+
121
+ // -- CI/CD & DevOps --
122
+ docker: { icon: 'devicon:docker', label: 'Docker' },
123
+ kubernetes: { icon: 'devicon:kubernetes', label: 'Kubernetes' },
124
+ github: { icon: 'devicon:github', label: 'GitHub' },
125
+ 'github-actions': { icon: 'devicon:githubactions', label: 'GitHub Actions' },
126
+ gitlab: { icon: 'devicon:gitlab', label: 'GitLab' },
127
+ circleci: { icon: 'logos:circleci', label: 'CircleCI' },
128
+ terraform: { icon: 'devicon:terraform', label: 'Terraform' },
129
+ ansible: { icon: 'devicon:ansible', label: 'Ansible' },
130
+ jenkins: { icon: 'devicon:jenkins', label: 'Jenkins' },
131
+ argocd: { icon: 'devicon:argocd', label: 'Argo CD' },
132
+
133
+ // -- Build & package tools --
134
+ vite: { icon: 'devicon:vite', label: 'Vite' },
135
+ webpack: { icon: 'devicon:webpack', label: 'Webpack' },
136
+ npm: { icon: 'devicon:npm', label: 'npm' },
137
+ pnpm: { icon: 'devicon:pnpm', label: 'pnpm' },
138
+ yarn: { icon: 'devicon:yarn', label: 'Yarn' },
139
+ bun: { icon: 'devicon:bun', label: 'Bun' },
140
+ eslint: { icon: 'devicon:eslint', label: 'ESLint' },
141
+ babel: { icon: 'devicon:babel', label: 'Babel' },
142
+ turborepo: { icon: 'logos:turborepo-icon', label: 'Turborepo' },
143
+ biome: { icon: 'devicon:biome', label: 'Biome' },
144
+ prettier: { icon: 'logos:prettier', label: 'Prettier' },
145
+ esbuild: { icon: 'logos:esbuild', label: 'esbuild' },
146
+ rollup: { icon: 'devicon:rollup', label: 'Rollup' },
147
+ swc: { icon: 'logos:swc', label: 'SWC' },
148
+ gradle: { icon: 'devicon:gradle', label: 'Gradle' },
149
+ maven: { icon: 'devicon:maven', label: 'Maven' },
150
+
151
+ // -- UI & styling --
152
+ tailwindcss: { icon: 'devicon:tailwindcss', label: 'Tailwind CSS' },
153
+ css: { icon: 'devicon:css3', label: 'CSS' },
154
+ html: { icon: 'devicon:html5', label: 'HTML' },
155
+ sass: { icon: 'devicon:sass', label: 'Sass' },
156
+ bootstrap: { icon: 'devicon:bootstrap', label: 'Bootstrap' },
157
+ materialui: { icon: 'devicon:materialui', label: 'Material UI' },
158
+ 'shadcn-ui': { icon: 'vscode-icons:file-type-shadcn', label: 'shadcn/ui' },
159
+ storybook: { icon: 'devicon:storybook', label: 'Storybook' },
160
+ figma: { icon: 'devicon:figma', label: 'Figma' },
161
+
162
+ // -- Testing --
163
+ jest: { icon: 'logos:jest', label: 'Jest' },
164
+ vitest: { icon: 'devicon:vitest', label: 'Vitest' },
165
+ cypress: { icon: 'devicon:cypressio', label: 'Cypress' },
166
+ playwright: { icon: 'devicon:playwright', label: 'Playwright' },
167
+ selenium: { icon: 'devicon:selenium', label: 'Selenium' },
168
+ mocha: { icon: 'devicon:mocha', label: 'Mocha' },
169
+ puppeteer: { icon: 'devicon:puppeteer', label: 'Puppeteer' },
170
+ cucumber: { icon: 'logos:cucumber', label: 'Cucumber' },
171
+
172
+ // -- Auth & integrations --
173
+ oauth: { icon: 'devicon:oauth', label: 'OAuth' },
174
+ auth0: { icon: 'logos:auth0', label: 'Auth0' },
175
+ stripe: { icon: 'logos:stripe', label: 'Stripe' },
176
+ twilio: { icon: 'devicon:twilio', label: 'Twilio' },
177
+
178
+ // -- AI / ML --
179
+ openai: { icon: 'logos:openai-icon', label: 'OpenAI' },
180
+ tensorflow: { icon: 'devicon:tensorflow', label: 'TensorFlow' },
181
+ pytorch: { icon: 'devicon:pytorch', label: 'PyTorch' },
182
+ huggingface: { icon: 'devicon:huggingface', label: 'Hugging Face' },
183
+ anthropic: { icon: 'logos:anthropic-icon', label: 'Anthropic' },
184
+ jupyter: { icon: 'devicon:jupyter', label: 'Jupyter' },
185
+ numpy: { icon: 'devicon:numpy', label: 'NumPy' },
186
+ pandas: { icon: 'devicon:pandas', label: 'Pandas' },
187
+ scikitlearn: { icon: 'devicon:scikitlearn', label: 'scikit-learn' },
188
+ matplotlib: { icon: 'devicon:matplotlib', label: 'Matplotlib' },
189
+
190
+ // -- Monitoring & observability --
191
+ grafana: { icon: 'devicon:grafana', label: 'Grafana' },
192
+ prometheus: { icon: 'devicon:prometheus', label: 'Prometheus' },
193
+ datadog: { icon: 'devicon:datadog', label: 'Datadog' },
194
+ sentry: { icon: 'devicon:sentry', label: 'Sentry' },
195
+ newrelic: { icon: 'devicon:newrelic', label: 'New Relic' },
196
+
197
+ // -- Message queues --
198
+ kafka: { icon: 'devicon:apachekafka', label: 'Kafka' },
199
+ rabbitmq: { icon: 'devicon:rabbitmq', label: 'RabbitMQ' },
200
+ nats: { icon: 'devicon:nats', label: 'NATS' },
201
+
202
+ // -- CMS --
203
+ strapi: { icon: 'logos:strapi', label: 'Strapi' },
204
+ contentful: { icon: 'logos:contentful', label: 'Contentful' },
205
+ sanity: { icon: 'devicon:sanity', label: 'Sanity' },
206
+ wordpress: { icon: 'devicon:wordpress', label: 'WordPress' },
207
+ shopify: { icon: 'logos:shopify', label: 'Shopify' },
208
+ ghost: { icon: 'devicon:ghost', label: 'Ghost' },
209
+
210
+ // -- Infrastructure --
211
+ node: { icon: 'devicon:nodejs', label: 'Node.js' },
212
+
213
+ nginx: { icon: 'devicon:nginx', label: 'Nginx' },
214
+ apache: { icon: 'devicon:apache', label: 'Apache' },
215
+ linux: { icon: 'devicon:linux', label: 'Linux' },
216
+
217
+ // -- Project-specific (label-only fallback when icon not in any set) --
218
+ 'trigger-dev': { icon: 'material-icon-theme:trigger', label: 'Trigger.dev' },
219
+ 'ai-sdk': { icon: 'simple-icons:vercel', label: 'AI SDK' },
220
+ openrouter: { icon: 'simple-icons:openrouter', label: 'OpenRouter' },
221
+ liquid: { icon: 'vscode-icons:file-type-liquid', label: 'Liquid' },
222
+ zod: { icon: 'logos:zod', label: 'Zod' },
223
+ } as const satisfies Record<string, { readonly icon: string; readonly label: string }>
224
+
225
+ /**
226
+ * Union of all supported technology tag names.
227
+ */
228
+ export type TechName = keyof typeof TECH_ICONS
@@ -0,0 +1,180 @@
1
+ /**
2
+ * ciderpress Rspress theme entry.
3
+ *
4
+ * Re-exports the default Rspress theme and extends it with
5
+ * ciderpress-specific components.
6
+ *
7
+ * Global styles are imported here so Rspress includes them
8
+ * in the site bundle when this theme entry is loaded.
9
+ */
10
+
11
+ // Rspress sibling CSS for components we shadow below. Re-exporting a ciderpress
12
+ // component under the same name (e.g. `CiderpressDocLayout as DocLayout`) lets the
13
+ // bundler tree-shake the original Rspress module — and with it the sibling
14
+ // `./index.css` side-effect import that ships the base structural styles. Import
15
+ // each sibling CSS file directly here so it survives the override.
16
+ import '@rspress/core/dist/theme/layout/DocLayout/index.css'
17
+ import '@rspress/core/dist/theme/components/HomeFeature/index.css'
18
+ import '@rspress/core/dist/theme/components/Sidebar/SidebarDivider.css'
19
+ import '@rspress/core/dist/theme/components/Sidebar/SidebarGroup.css'
20
+ import '@rspress/core/dist/theme/components/Sidebar/SidebarItem.css'
21
+ import '@rspress/core/dist/theme/components/Sidebar/SidebarSectionHeader.css'
22
+
23
+ import './styles/layers.css'
24
+ import './styles/overrides/fonts.css'
25
+ import './styles/overrides/tokens.css'
26
+ import './styles/overrides/rspress.css'
27
+ // Theme color palettes — scoped via [data-cp-theme][data-cp-variant] selectors.
28
+ // `mulled.css` ships first because it is `DEFAULT_THEME_NAME` — its rules emit
29
+ // the `:root { ... }` FOUC fallback that paints before JS hydrates the
30
+ // `data-cp-theme` attribute on `<html>`.
31
+ import './styles/themes/mulled.css'
32
+ import './styles/themes/honeycrisp.css'
33
+ import './styles/themes/grannysmith.css'
34
+ import './styles/themes/amber.css'
35
+ import './styles/themes/midnight.css'
36
+ import './styles/themes/arcade.css'
37
+ // arcade-fx.css is intentionally separate from arcade.css:
38
+ // arcade.css = color palette tokens, arcade-fx.css = visual effects
39
+ // (border trace, neon pulse, CRT scanlines, etc.) scoped to [data-cp-theme='arcade']
40
+ import './styles/themes/arcade-fx.css'
41
+ import './styles/overrides/details.css'
42
+ import './styles/overrides/scrollbar.css'
43
+ import './styles/overrides/rail.css'
44
+ import './styles/overrides/sidebar.css'
45
+ import './styles/overrides/content-footer.css'
46
+ import './styles/overrides/home.css'
47
+ import './styles/overrides/home-card.css'
48
+ import './styles/overrides/section-card.css'
49
+ import './styles/overrides/vscode.css'
50
+ import './styles/overrides/badge.css'
51
+ import './components/announcement/announcement-bar.css'
52
+ import './components/ask-ai/ask-ai-button.css'
53
+ import './components/content-footer/feedback.css'
54
+ import './components/content-footer/meta-actions.css'
55
+ import './components/content-footer/page-pager.css'
56
+ import './components/sidebar/framework-picker.css'
57
+ import './components/sidebar/sidebar-promo.css'
58
+ import './components/sidebar/sidebar-toggle.css'
59
+ import './components/home/page-rail.css'
60
+ import './components/home/hero.css'
61
+ import './components/home/hero-demo.css'
62
+ import './components/home/trust-strip.css'
63
+ import './components/home/split.css'
64
+ import './components/home/cta.css'
65
+ import './components/nav/ciderpress-docs-bar.css'
66
+ import './components/nav/nav-logo.css'
67
+ import './components/nav/version-chip.css'
68
+ import './components/nav/topbar-cta.css'
69
+ import './components/openapi/openapi.css'
70
+ import './components/shared/accordion.css'
71
+ import './components/shared/columns.css'
72
+ import './components/shared/status-badge.css'
73
+ import './components/shared/frame.css'
74
+ import './components/shared/tooltip.css'
75
+ import './components/shared/prompt.css'
76
+ import './components/shared/color.css'
77
+ import './components/shared/theme-color-palette.css'
78
+ import './components/shared/steps.css'
79
+ import './components/shared/field.css'
80
+
81
+ export * from '@rspress/core/theme-original'
82
+
83
+ /** @internal Rspress layout override — injects ciderpress nav components via layout slots */
84
+ export { Layout } from './components/nav/layout'
85
+ /** @internal Rspress doc-layout override — replaces `.rp-doc-layout__menu` with `<CiderpressDocsBar />` */
86
+ export { CiderpressDocLayout as DocLayout } from './components/nav/ciderpress-doc-layout'
87
+ /** @internal Home page feature block override */
88
+ export { HomeFeature } from './components/home/feature'
89
+ /** @internal Home page layout override */
90
+ export { HomeLayout } from './components/home/layout'
91
+ /** @internal Sidebar override — multi-scope filtering for standalone sections */
92
+ export { Sidebar } from './components/sidebar/sidebar-scope'
93
+
94
+ export { FeatureCard, FeatureGrid } from './components/home/feature-card'
95
+ export type { FeatureCardProps, FeatureItem } from './components/home/feature-card'
96
+ export { PageRail } from './components/home/page-rail'
97
+ export type { PageRailProps } from './components/home/page-rail'
98
+ export { Hero } from './components/home/hero'
99
+ export type { HeroProps, HeroAction } from './components/home/hero'
100
+ export { HeroDemo } from './components/home/hero-demo'
101
+ export { TrustStrip } from './components/home/trust-strip'
102
+ export type { TrustStripProps } from './components/home/trust-strip'
103
+ export { HomeSplit } from './components/home/split'
104
+ export type { SplitProps, SplitAction } from './components/home/split'
105
+ export { CTA } from './components/home/cta'
106
+ export type { CTAProps } from './components/home/cta'
107
+ export { WorkspaceCard } from './components/workspaces/card'
108
+ export type { WorkspaceCardProps } from './components/workspaces/card'
109
+ export { WorkspaceGrid } from './components/workspaces/grid'
110
+ export type { WorkspaceGridProps } from './components/workspaces/grid'
111
+ export { SectionCard } from './components/shared/section-card'
112
+ export type { SectionCardProps } from './components/shared/section-card'
113
+ export { SectionGrid } from './components/shared/section-grid'
114
+ export type { SectionGridProps } from './components/shared/section-grid'
115
+
116
+ export { DesktopWindow } from './components/shared/desktop-window'
117
+ export type { DesktopWindowProps, WindowTab } from './components/shared/desktop-window'
118
+ export { BrowserWindow } from './components/shared/desktop-window'
119
+ export type { BrowserWindowProps, BrowserTab } from './components/shared/desktop-window'
120
+ export { IDEWindow } from './components/shared/desktop-window'
121
+ export type { IDEWindowProps, IDEFileTab } from './components/shared/desktop-window'
122
+ export { TerminalWindow, Command, Output, Line } from './components/shared/desktop-window'
123
+ export type {
124
+ TerminalWindowProps,
125
+ TerminalColor,
126
+ TerminalLineConfig,
127
+ CommandProps,
128
+ OutputProps,
129
+ LineProps,
130
+ } from './components/shared/desktop-window'
131
+
132
+ export { Accordion, AccordionGroup } from './components/shared/accordion'
133
+ export type { AccordionProps, AccordionGroupProps } from './components/shared/accordion'
134
+ export { Columns, Column } from './components/shared/columns'
135
+ export type { ColumnsProps, ColumnProps } from './components/shared/columns'
136
+ export { Badge } from './components/shared/status-badge'
137
+ export type { BadgeProps, BadgeVariant } from './components/shared/status-badge'
138
+ export { Frame } from './components/shared/frame'
139
+ export type { FrameProps } from './components/shared/frame'
140
+ export { Tooltip } from './components/shared/tooltip'
141
+ export type { TooltipProps } from './components/shared/tooltip'
142
+ export { Prompt } from './components/shared/prompt'
143
+ export type { PromptProps, PromptAction } from './components/shared/prompt'
144
+ export { Color } from './components/shared/color'
145
+ export type { ColorProps } from './components/shared/color'
146
+ export { ThemeColorPalette } from './components/shared/theme-color-palette'
147
+ export type { ThemeColorPaletteProps } from './components/shared/theme-color-palette'
148
+ export { Steps, Step } from './components/shared/steps'
149
+ export type { StepsProps, StepProps } from './components/shared/steps'
150
+ export { Field, FieldGroup } from './components/shared/field'
151
+ export type { FieldProps, FieldGroupProps } from './components/shared/field'
152
+
153
+ export { CopyMarkdownButton } from './components/openapi'
154
+ export type { CopyMarkdownButtonProps } from './components/openapi'
155
+ export { OpenAPIOperation } from './components/openapi'
156
+ export type { OpenAPIOperationProps } from './components/openapi'
157
+ export { OpenAPIOverview } from './components/openapi'
158
+ export type { OpenAPIOverviewProps } from './components/openapi'
159
+
160
+ export { AnnouncementBar } from './components/announcement/announcement-bar'
161
+ export type { AnnouncementBarProps } from './components/announcement/announcement-bar'
162
+ export { AskAIButton } from './components/ask-ai/ask-ai-button'
163
+ export type { AskAIButtonProps } from './components/ask-ai/ask-ai-button'
164
+ export { Feedback } from './components/content-footer/feedback'
165
+ export type { FeedbackProps } from './components/content-footer/feedback'
166
+ export { MetaActions } from './components/content-footer/meta-actions'
167
+ export type { MetaAction, MetaActionsProps } from './components/content-footer/meta-actions'
168
+ export { PagePager } from './components/content-footer/page-pager'
169
+ export type { PagePagerProps, PagerLink } from './components/content-footer/page-pager'
170
+ export { FrameworkPicker } from './components/sidebar/framework-picker'
171
+ export type { FrameworkPickerProps } from './components/sidebar/framework-picker'
172
+ export { SidebarPromo } from './components/sidebar/sidebar-promo'
173
+ export type { SidebarPromoProps } from './components/sidebar/sidebar-promo'
174
+ export { SidebarToggle } from './components/sidebar/sidebar-toggle'
175
+
176
+ export { Icon } from './components/shared/icon'
177
+ export { TechTag } from './components/shared/tech-tag'
178
+ export type { TechTagProps } from './components/shared/tech-tag'
179
+ export { TechIconTable } from './components/shared/tech-icon-table'
180
+ export type { TechIconEntry, TechIconTableProps } from './components/shared/tech-icon-table'
@@ -0,0 +1,27 @@
1
+ import type { CiderpressSocialLink } from '../components/nav/ciderpress-nav-social-links'
2
+
3
+ /**
4
+ * Pull social-link entries (GitHub, npm, etc) from Rspress's `site`
5
+ * shape. Lives on `site.themeConfig.socialLinks` after Rspress
6
+ * normalisation but isn't surfaced on the public typings.
7
+ *
8
+ * @param site - Rspress site data (typically the result of `useSite().site`)
9
+ * @returns Array of social-link entries (empty array when not configured)
10
+ */
11
+ export function readSocialLinks(site: unknown): readonly CiderpressSocialLink[] {
12
+ const { themeConfig } = site as { readonly themeConfig?: unknown }
13
+ if (themeConfig === undefined || themeConfig === null) {
14
+ return []
15
+ }
16
+ const candidate = (themeConfig as { readonly socialLinks?: unknown }).socialLinks
17
+ if (!Array.isArray(candidate)) {
18
+ return []
19
+ }
20
+ return candidate.filter(
21
+ (item): item is CiderpressSocialLink =>
22
+ typeof item === 'object' &&
23
+ item !== null &&
24
+ typeof (item as { icon?: unknown }).icon === 'string' &&
25
+ typeof (item as { content?: unknown }).content === 'string'
26
+ )
27
+ }
@@ -0,0 +1,126 @@
1
+ import { Link } from '@rspress/core/runtime'
2
+ import type React from 'react'
3
+
4
+ /**
5
+ * Props accepted by the {@link RouteLink} helper. Mirror `<a>` props but
6
+ * narrow `href` to a required string (we route on it).
7
+ */
8
+ export interface RouteLinkProps {
9
+ /**
10
+ * Destination URL. Internal paths (anything starting with `/` or `#`)
11
+ * are routed through Rspress's `<Link>` so navigation stays SPA
12
+ * (no full document load). Everything else is treated as external and
13
+ * rendered as a plain anchor.
14
+ */
15
+ readonly href: string
16
+ /**
17
+ * Optional class applied to the rendered element.
18
+ */
19
+ readonly className?: string
20
+ /**
21
+ * Optional inline ARIA label.
22
+ */
23
+ readonly 'aria-label'?: string
24
+ /**
25
+ * Optional ARIA current marker (e.g. `'page'`).
26
+ */
27
+ readonly 'aria-current'?: React.AriaAttributes['aria-current']
28
+ /**
29
+ * Optional `role` attribute (e.g. `'menuitem'`).
30
+ */
31
+ readonly role?: string
32
+ /**
33
+ * Optional title attribute.
34
+ */
35
+ readonly title?: string
36
+ /**
37
+ * Optional click handler (closing dropdowns, etc.).
38
+ */
39
+ readonly onClick?: React.MouseEventHandler<HTMLElement>
40
+ /**
41
+ * Optional data-* attribute used by the nav menu measure layer.
42
+ */
43
+ readonly 'data-cp-menu-item'?: boolean | string
44
+ /**
45
+ * Rendered children.
46
+ */
47
+ readonly children: React.ReactNode
48
+ }
49
+
50
+ /**
51
+ * Render an in-app link that prefers SPA navigation when the destination
52
+ * is internal, falling back to a plain `<a>` for external URLs.
53
+ *
54
+ * Internal hrefs (starting with `/` or `#`) go through Rspress's
55
+ * `Link` from `@rspress/core/runtime` — that's a thin wrapper over
56
+ * `react-router-dom`'s `Link`, so the click is intercepted and routed
57
+ * through history without a full page reload.
58
+ *
59
+ * External hrefs (`http://`, `https://`, `mailto:`, `tel:`, `data:`,
60
+ * etc.) render as `<a target="_blank" rel="noopener noreferrer">` so
61
+ * clicks open in a new tab and the document doesn't leak `window.opener`.
62
+ *
63
+ * @param props - Link props (href + presentational/ARIA attributes)
64
+ * @returns React element (`<Link>` for internal, `<a>` for external)
65
+ */
66
+ export function RouteLink(props: RouteLinkProps): React.ReactElement {
67
+ const isInternal = isInternalHref(props.href)
68
+ if (isInternal) {
69
+ return (
70
+ <Link
71
+ to={props.href}
72
+ className={props.className}
73
+ aria-label={props['aria-label']}
74
+ aria-current={props['aria-current']}
75
+ role={props.role}
76
+ title={props.title}
77
+ onClick={props.onClick}
78
+ data-cp-menu-item={props['data-cp-menu-item']}
79
+ >
80
+ {props.children}
81
+ </Link>
82
+ )
83
+ }
84
+ return (
85
+ <a
86
+ href={props.href}
87
+ className={props.className}
88
+ aria-label={props['aria-label']}
89
+ aria-current={props['aria-current']}
90
+ role={props.role}
91
+ title={props.title}
92
+ onClick={props.onClick}
93
+ data-cp-menu-item={props['data-cp-menu-item']}
94
+ target="_blank"
95
+ rel="noopener noreferrer"
96
+ >
97
+ {props.children}
98
+ </a>
99
+ )
100
+ }
101
+
102
+ /**
103
+ * Decide whether `href` points at an in-app route. Internal URLs are
104
+ * absolute paths (`/foo`) or anchors (`#bar`). Everything else — full
105
+ * URLs with a scheme, scheme-relative URLs, mailto, tel, etc. — is
106
+ * treated as external.
107
+ *
108
+ * @private
109
+ * @param href - Candidate destination
110
+ * @returns `true` when `href` should be SPA-routed
111
+ */
112
+ function isInternalHref(href: string): boolean {
113
+ if (href.length === 0) {
114
+ return false
115
+ }
116
+ if (href.startsWith('//')) {
117
+ return false
118
+ }
119
+ if (href.startsWith('/')) {
120
+ return true
121
+ }
122
+ if (href.startsWith('#')) {
123
+ return true
124
+ }
125
+ return false
126
+ }
Binary file
@@ -0,0 +1,68 @@
1
+ import { match, P } from 'massaman/match'
2
+
3
+ const SAFE_PROTOCOLS: ReadonlySet<string> = new Set(['http:', 'https:', 'mailto:', 'tel:'])
4
+
5
+ const PROTOCOL_PATTERN = /^[a-z][a-z0-9+.-]*:/i
6
+
7
+ // ASCII whitespace + control characters that browsers strip when
8
+ // normalising URL schemes — U+0000–U+0020 (NUL through SPACE) plus
9
+ // U+007F (DEL). A href like `java\nscript:alert(1)` or `java script:`
10
+ // looks "relative" to a naive scheme regex but resolves to
11
+ // `javascript:` once a browser parses it for navigation. We reject any
12
+ // such character anywhere in the input as the cheap fix.
13
+ // oxlint-disable-next-line no-control-regex -- matching control chars is the point
14
+ const FORBIDDEN_CHARS_PATTERN = /[\u0000-\u0020\u007F]/u
15
+
16
+ /**
17
+ * Return `href` when it points at a safe location, otherwise `null`.
18
+ *
19
+ * Safe locations: relative paths, fragment anchors (`#section`),
20
+ * absolute http/https URLs, `mailto:`, and `tel:`. Any other scheme —
21
+ * including `javascript:`, `data:`, `vbscript:`, `file:` — returns `null`
22
+ * so the caller can either omit the link or fall back to a placeholder.
23
+ *
24
+ * Inputs containing ASCII whitespace or control characters (newline, tab,
25
+ * carriage return, space) anywhere are rejected outright — browsers strip
26
+ * those during URL normalisation, so a value like `"java\nscript:alert(1)"`
27
+ * resolves to `javascript:` post-parse even though the scheme regex won't
28
+ * catch it. This is the documented bypass for naïve allow-lists.
29
+ *
30
+ * Validation is whitespace-trimmed and scheme detection is case-insensitive
31
+ * so `JaVaScRiPt:` is rejected the same way `javascript:` is.
32
+ *
33
+ * @param href - The URL string to validate.
34
+ * @returns The trimmed `href` when safe, or `null` when the scheme is not allowed.
35
+ *
36
+ * @example
37
+ * safeUrl('/docs/intro') // → '/docs/intro'
38
+ * safeUrl('https://example.com') // → 'https://example.com'
39
+ * safeUrl('javascript:alert(1)') // → null
40
+ * safeUrl('java\nscript:alert(1)') // → null (control-char smuggling)
41
+ * safeUrl('java script:alert(1)') // → null (whitespace smuggling)
42
+ */
43
+ export function safeUrl(href: string): string | null {
44
+ // Trim outer whitespace first so `' /docs '` survives, but any
45
+ // whitespace or control character INSIDE the value is treated as
46
+ // scheme-smuggling and rejected.
47
+ const trimmed = href.trim()
48
+ if (FORBIDDEN_CHARS_PATTERN.test(trimmed)) {
49
+ return null
50
+ }
51
+ return match(trimmed)
52
+ .with('', () => null)
53
+ .with(P.string.startsWith('#'), () => trimmed)
54
+ .with(P.string.startsWith('/'), () => trimmed)
55
+ .with(P.string.startsWith('./'), () => trimmed)
56
+ .with(P.string.startsWith('../'), () => trimmed)
57
+ .otherwise(() => {
58
+ const match_ = trimmed.match(PROTOCOL_PATTERN)
59
+ if (!match_) {
60
+ return trimmed
61
+ }
62
+ const scheme = match_[0].toLowerCase()
63
+ if (SAFE_PROTOCOLS.has(scheme)) {
64
+ return trimmed
65
+ }
66
+ return null
67
+ })
68
+ }