@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,480 @@
1
+ // NOTE: This file is copied raw to dist/ and compiled by Rspress's internal
2
+ // webpack — NOT by Rslib. Only import packages resolvable in Rspress's webpack
3
+ // context (react, mermaid, CSS). Do NOT import ts-pattern, es-toolkit, or other
4
+ // workspace dependencies here — they will cause "factory is undefined" runtime
5
+ // errors. See packages/ui/AGENTS.md for details.
6
+ //
7
+ // IMPORTANT: mermaid must stay on v10.x. Mermaid v11 uses langium for its parser,
8
+ // which depends on vscode-languageserver-types and has broken ESM exports that
9
+ // Rspack cannot resolve. It also lazy-loads every diagram type via dynamic
10
+ // import() — incompatible with Rspress's webpack compilation of global components.
11
+
12
+ // oxlint-disable no-ternary
13
+
14
+ import mermaid from 'mermaid'
15
+ import type { MermaidConfig } from 'mermaid'
16
+ import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react'
17
+
18
+ import './mermaid.css'
19
+
20
+ interface MermaidRendererProps {
21
+ readonly code: string
22
+ readonly config?: MermaidConfig
23
+ }
24
+
25
+ interface Transform {
26
+ readonly x: number
27
+ readonly y: number
28
+ readonly scale: number
29
+ }
30
+
31
+ type Tab = 'preview' | 'code'
32
+
33
+ const DIAGRAM_TYPE_MAP: Record<string, string> = {
34
+ graph: 'Flowchart',
35
+ flowchart: 'Flowchart',
36
+ sequenceDiagram: 'Sequence',
37
+ classDiagram: 'Class',
38
+ stateDiagram: 'State',
39
+ 'stateDiagram-v2': 'State',
40
+ erDiagram: 'ER',
41
+ gantt: 'Gantt',
42
+ journey: 'User Journey',
43
+ pie: 'Pie',
44
+ gitGraph: 'Git Graph',
45
+ mindmap: 'Mindmap',
46
+ timeline: 'Timeline',
47
+ quadrantChart: 'Quadrant',
48
+ sankey: 'Sankey',
49
+ xychart: 'XY Chart',
50
+ block: 'Block',
51
+ c4Context: 'C4 Context',
52
+ c4Container: 'C4 Container',
53
+ c4Component: 'C4 Component',
54
+ c4Dynamic: 'C4 Dynamic',
55
+ c4Deployment: 'C4 Deployment',
56
+ }
57
+
58
+ const MERMAID_KEYWORDS = [
59
+ 'graph',
60
+ 'flowchart',
61
+ 'sequenceDiagram',
62
+ 'classDiagram',
63
+ 'stateDiagram',
64
+ 'stateDiagram-v2',
65
+ 'erDiagram',
66
+ 'gantt',
67
+ 'journey',
68
+ 'pie',
69
+ 'gitGraph',
70
+ 'mindmap',
71
+ 'timeline',
72
+ 'quadrantChart',
73
+ 'sankey',
74
+ 'xychart',
75
+ 'block',
76
+ 'c4Context',
77
+ 'c4Container',
78
+ 'c4Component',
79
+ 'c4Dynamic',
80
+ 'c4Deployment',
81
+ 'subgraph',
82
+ 'end',
83
+ 'participant',
84
+ 'actor',
85
+ 'activate',
86
+ 'deactivate',
87
+ 'note',
88
+ 'loop',
89
+ 'alt',
90
+ 'else',
91
+ 'opt',
92
+ 'par',
93
+ 'critical',
94
+ 'break',
95
+ 'rect',
96
+ 'class',
97
+ 'state',
98
+ 'direction',
99
+ 'section',
100
+ 'title',
101
+ 'dateFormat',
102
+ 'axisFormat',
103
+ 'excludes',
104
+ 'includes',
105
+ 'todayMarker',
106
+ 'TB',
107
+ 'TD',
108
+ 'BT',
109
+ 'RL',
110
+ 'LR',
111
+ ]
112
+
113
+ // oxlint-disable-next-line security/detect-non-literal-regexp -- constructed from hardcoded keyword array
114
+ const KEYWORD_PATTERN = new RegExp(`\\b(${MERMAID_KEYWORDS.join('|')})\\b`, 'g')
115
+
116
+ const COMMENT_PATTERN = /%%.*$/gm
117
+ const ARROW_PATTERN = /--&gt;|-->|==>|-.->|--x|--o|&lt;--|<--|===|---|~~~|\|&gt;|\|>/g
118
+ const STRING_PATTERN = /"[^"]*"|'[^']*'/g
119
+
120
+ // Placeholder sentinel — uses a Unicode private-use-area character to avoid
121
+ // triggering the no-control-regex lint rule.
122
+ const PLACEHOLDER = '\uE000'
123
+ const PLACEHOLDER_PATTERN = new RegExp(`${PLACEHOLDER}(\\d+)${PLACEHOLDER}`, 'g')
124
+
125
+ /**
126
+ * Detect the mermaid diagram type from the first line of code.
127
+ *
128
+ * @param code - Raw mermaid source
129
+ * @returns Human-readable diagram type label
130
+ */
131
+ function detectDiagramType(code: string): string {
132
+ const firstLine = code.trim().split('\n')[0].trim()
133
+ const entries = Object.entries(DIAGRAM_TYPE_MAP)
134
+ const found = entries.find(([key]) => firstLine.startsWith(key))
135
+ if (found) {
136
+ return found[1]
137
+ }
138
+ return 'Diagram'
139
+ }
140
+
141
+ /**
142
+ * Escape HTML special characters for safe insertion via dangerouslySetInnerHTML.
143
+ *
144
+ * @param text - Raw text
145
+ * @returns HTML-escaped text
146
+ */
147
+ function escapeHtml(text: string): string {
148
+ return text
149
+ .replaceAll('&', '&amp;')
150
+ .replaceAll('<', '&lt;')
151
+ .replaceAll('>', '&gt;')
152
+ .replaceAll('"', '&quot;')
153
+ .replaceAll("'", '&#39;')
154
+ }
155
+
156
+ /**
157
+ * Apply lightweight syntax highlighting to mermaid source code.
158
+ * Returns an HTML string with span-wrapped tokens.
159
+ *
160
+ * @param code - Raw mermaid source
161
+ * @returns HTML string with syntax highlighting spans
162
+ */
163
+ function highlightMermaid(code: string): string {
164
+ const escaped = escapeHtml(code)
165
+
166
+ const placeholders: string[] = []
167
+ function placeholder(html: string): string {
168
+ const idx = placeholders.length
169
+ placeholders.push(html)
170
+ return `${PLACEHOLDER}${String(idx)}${PLACEHOLDER}`
171
+ }
172
+
173
+ const result = escaped
174
+ .replace(COMMENT_PATTERN, (m) => placeholder(`<span class="zm-comment">${m}</span>`))
175
+ .replace(STRING_PATTERN, (m) => placeholder(`<span class="zm-string">${m}</span>`))
176
+ .replace(ARROW_PATTERN, (m) => placeholder(`<span class="zm-arrow">${m}</span>`))
177
+ .replace(KEYWORD_PATTERN, (m) => placeholder(`<span class="zm-keyword">${m}</span>`))
178
+ .replace(PLACEHOLDER_PATTERN, (_match, idx) => placeholders[Number(idx)])
179
+
180
+ return result
181
+ }
182
+
183
+ const INITIAL_TRANSFORM: Transform = { x: 0, y: 0, scale: 1 }
184
+ const MIN_SCALE = 0.25
185
+ const MAX_SCALE = 4
186
+ const ZOOM_STEP = 0.1
187
+
188
+ /**
189
+ * Render a mermaid diagram as an interactive SVG with pan, zoom,
190
+ * fullscreen, and a code view toggle with syntax highlighting.
191
+ *
192
+ * @param props - Mermaid code string and optional mermaid config
193
+ * @returns React element
194
+ */
195
+ function MermaidRenderer(props: MermaidRendererProps): React.ReactElement | null {
196
+ const { code, config = {} } = props
197
+
198
+ const id = useId()
199
+ const containerRef = useRef<HTMLDivElement>(null)
200
+ const innerRef = useRef<HTMLDivElement>(null)
201
+ const dragRef = useRef<{
202
+ dragging: boolean
203
+ startX: number
204
+ startY: number
205
+ originX: number
206
+ originY: number
207
+ }>({
208
+ dragging: false,
209
+ startX: 0,
210
+ startY: 0,
211
+ originX: 0,
212
+ originY: 0,
213
+ })
214
+
215
+ const [svg, setSvg] = useState('')
216
+ const [renderError, setRenderError] = useState(false)
217
+ const [transform, setTransform] = useState<Transform>(INITIAL_TRANSFORM)
218
+ const transformRef = useRef<Transform>(INITIAL_TRANSFORM)
219
+ const [fullscreen, setFullscreen] = useState(false)
220
+ const [tab, setTab] = useState<Tab>('preview')
221
+
222
+ const highlightedCode = useMemo(() => highlightMermaid(code), [code])
223
+
224
+ transformRef.current = transform
225
+
226
+ const isPreview = tab === 'preview'
227
+
228
+ const renderMermaid = useCallback(async () => {
229
+ const hasDarkClass = document.documentElement.classList.contains('dark')
230
+
231
+ const mermaidConfig: MermaidConfig = {
232
+ securityLevel: 'loose',
233
+ startOnLoad: false,
234
+ theme: hasDarkClass ? 'dark' : 'default',
235
+ ...config,
236
+ }
237
+
238
+ try {
239
+ mermaid.initialize(mermaidConfig)
240
+ const result = await mermaid.render(id.replaceAll(':', ''), code as string)
241
+ setSvg(result.svg)
242
+ } catch {
243
+ setRenderError(true)
244
+ }
245
+ }, [code, config, id])
246
+
247
+ useEffect(() => {
248
+ renderMermaid()
249
+ }, [renderMermaid])
250
+
251
+ useEffect(() => {
252
+ const observer = new MutationObserver(() => {
253
+ renderMermaid()
254
+ })
255
+
256
+ observer.observe(document.documentElement, {
257
+ attributes: true,
258
+ attributeFilter: ['class'],
259
+ })
260
+
261
+ return () => {
262
+ observer.disconnect()
263
+ }
264
+ }, [renderMermaid])
265
+
266
+ useEffect(() => {
267
+ const el = containerRef.current
268
+ if (!el || !isPreview) {
269
+ return
270
+ }
271
+
272
+ function handleWheel(e: WheelEvent) {
273
+ e.preventDefault()
274
+ const direction = e.deltaY < 0 ? 1 : -1
275
+ setTransform((prev) => {
276
+ const nextScale = Math.min(
277
+ MAX_SCALE,
278
+ Math.max(MIN_SCALE, prev.scale + direction * ZOOM_STEP)
279
+ )
280
+ return { ...prev, scale: nextScale }
281
+ })
282
+ }
283
+
284
+ el.addEventListener('wheel', handleWheel, { passive: false })
285
+ return () => {
286
+ el.removeEventListener('wheel', handleWheel)
287
+ }
288
+ }, [isPreview])
289
+
290
+ const handlePointerDown = useCallback(
291
+ (e: React.PointerEvent) => {
292
+ if (!isPreview) {
293
+ return
294
+ }
295
+ if (e.button !== 0) {
296
+ return
297
+ }
298
+ const target = e.target as HTMLElement
299
+ if (
300
+ target.closest('.ciderpress-mermaid-controls') ||
301
+ target.closest('.ciderpress-mermaid-footer')
302
+ ) {
303
+ return
304
+ }
305
+
306
+ const current = transformRef.current
307
+ dragRef.current = {
308
+ dragging: true,
309
+ startX: e.clientX,
310
+ startY: e.clientY,
311
+ originX: current.x,
312
+ originY: current.y,
313
+ }
314
+ const container = e.currentTarget as HTMLElement
315
+ container.setPointerCapture(e.pointerId)
316
+ },
317
+ [isPreview]
318
+ )
319
+
320
+ const handlePointerMove = useCallback((e: React.PointerEvent) => {
321
+ const drag = dragRef.current
322
+ if (!drag.dragging) {
323
+ return
324
+ }
325
+ const dx = e.clientX - drag.startX
326
+ const dy = e.clientY - drag.startY
327
+ setTransform((prev) => ({ ...prev, x: drag.originX + dx, y: drag.originY + dy }))
328
+ }, [])
329
+
330
+ const handlePointerUp = useCallback(() => {
331
+ dragRef.current = { ...dragRef.current, dragging: false }
332
+ }, [])
333
+
334
+ const zoomIn = useCallback(() => {
335
+ setTransform((prev) => ({ ...prev, scale: Math.min(MAX_SCALE, prev.scale + ZOOM_STEP) }))
336
+ }, [])
337
+
338
+ const zoomOut = useCallback(() => {
339
+ setTransform((prev) => ({ ...prev, scale: Math.max(MIN_SCALE, prev.scale - ZOOM_STEP) }))
340
+ }, [])
341
+
342
+ const resetView = useCallback(() => {
343
+ setTransform(INITIAL_TRANSFORM)
344
+ }, [])
345
+
346
+ const toggleFullscreen = useCallback(() => {
347
+ setFullscreen((prev) => !prev)
348
+ setTab('preview')
349
+ setTransform(INITIAL_TRANSFORM)
350
+ }, [])
351
+
352
+ useEffect(() => {
353
+ if (!fullscreen) {
354
+ return
355
+ }
356
+
357
+ function handleKeyDown(e: KeyboardEvent) {
358
+ if (e.key === 'Escape') {
359
+ setFullscreen(false)
360
+ setTransform(INITIAL_TRANSFORM)
361
+ }
362
+ }
363
+
364
+ document.addEventListener('keydown', handleKeyDown)
365
+ return () => {
366
+ document.removeEventListener('keydown', handleKeyDown)
367
+ }
368
+ }, [fullscreen])
369
+
370
+ useEffect(() => {
371
+ if (!fullscreen) {
372
+ return
373
+ }
374
+ const previous = document.body.style.overflow
375
+ document.body.style.overflow = 'hidden'
376
+ return () => {
377
+ document.body.style.overflow = previous
378
+ }
379
+ }, [fullscreen])
380
+
381
+ if (renderError) {
382
+ return null
383
+ }
384
+
385
+ const transformStyle = `translate(${String(transform.x)}px, ${String(transform.y)}px) scale(${String(transform.scale)})`
386
+
387
+ const containerClasses = [
388
+ 'ciderpress-mermaid',
389
+ fullscreen ? 'ciderpress-mermaid-fullscreen' : '',
390
+ isPreview ? '' : 'ciderpress-mermaid-no-pan',
391
+ ]
392
+ .filter(Boolean)
393
+ .join(' ')
394
+
395
+ const fullscreenTitle = fullscreen ? 'Exit fullscreen' : 'Fullscreen'
396
+ const fullscreenIcon = fullscreen ? '✕' : '⛶'
397
+
398
+ const previewTabClass = isPreview
399
+ ? 'ciderpress-mermaid-tab ciderpress-mermaid-tab-active'
400
+ : 'ciderpress-mermaid-tab'
401
+
402
+ const codeTabClass = isPreview
403
+ ? 'ciderpress-mermaid-tab'
404
+ : 'ciderpress-mermaid-tab ciderpress-mermaid-tab-active'
405
+
406
+ const body = isPreview ? (
407
+ <div
408
+ ref={innerRef}
409
+ className="ciderpress-mermaid-inner"
410
+ style={{ transform: transformStyle }}
411
+ dangerouslySetInnerHTML={{ __html: svg }}
412
+ />
413
+ ) : (
414
+ <div className="ciderpress-mermaid-code">
415
+ <pre>
416
+ <code dangerouslySetInnerHTML={{ __html: highlightedCode }} />
417
+ </pre>
418
+ </div>
419
+ )
420
+
421
+ return (
422
+ <div
423
+ ref={containerRef}
424
+ className={containerClasses}
425
+ onPointerDown={handlePointerDown}
426
+ onPointerMove={handlePointerMove}
427
+ onPointerUp={handlePointerUp}
428
+ >
429
+ {isPreview && (
430
+ <div className="ciderpress-mermaid-controls">
431
+ <button type="button" className="ciderpress-mermaid-btn" onClick={zoomIn} title="Zoom in">
432
+ +
433
+ </button>
434
+ <button
435
+ type="button"
436
+ className="ciderpress-mermaid-btn"
437
+ onClick={zoomOut}
438
+ title="Zoom out"
439
+ >
440
+
441
+ </button>
442
+ <button
443
+ type="button"
444
+ className="ciderpress-mermaid-btn"
445
+ onClick={resetView}
446
+ title="Reset view"
447
+ >
448
+
449
+ </button>
450
+ <button
451
+ type="button"
452
+ className="ciderpress-mermaid-btn"
453
+ onClick={toggleFullscreen}
454
+ title={fullscreenTitle}
455
+ >
456
+ {fullscreenIcon}
457
+ </button>
458
+ </div>
459
+ )}
460
+
461
+ {body}
462
+
463
+ {!fullscreen && (
464
+ <div className="ciderpress-mermaid-footer">
465
+ <span className="ciderpress-mermaid-type">{detectDiagramType(code)}</span>
466
+ <div className="ciderpress-mermaid-tabs">
467
+ <button type="button" className={previewTabClass} onClick={() => setTab('preview')}>
468
+ Preview
469
+ </button>
470
+ <button type="button" className={codeTabClass} onClick={() => setTab('code')}>
471
+ Code
472
+ </button>
473
+ </div>
474
+ </div>
475
+ )}
476
+ </div>
477
+ )
478
+ }
479
+
480
+ export default MermaidRenderer
@@ -0,0 +1,199 @@
1
+ /* ── Container ──────────────────────────────────────────────────────── */
2
+
3
+ .ciderpress-mermaid {
4
+ position: relative;
5
+ overflow: hidden;
6
+ border: 1px solid var(--rp-c-divider);
7
+ border-radius: 12px;
8
+ background: var(--rp-c-bg-soft);
9
+ margin: 16px 0;
10
+ cursor: grab;
11
+ user-select: none;
12
+ -webkit-user-select: none;
13
+ display: flex;
14
+ flex-direction: column;
15
+ }
16
+
17
+ .ciderpress-mermaid:active {
18
+ cursor: grabbing;
19
+ }
20
+
21
+ /* No pan/grab cursor when in code view */
22
+ .ciderpress-mermaid-no-pan {
23
+ cursor: default;
24
+ user-select: text;
25
+ -webkit-user-select: text;
26
+ }
27
+
28
+ .ciderpress-mermaid-no-pan:active {
29
+ cursor: default;
30
+ }
31
+
32
+ /* ── Fullscreen ─────────────────────────────────────────────────────── */
33
+
34
+ .ciderpress-mermaid-fullscreen {
35
+ position: fixed;
36
+ inset: 0;
37
+ z-index: 9999;
38
+ margin: 0;
39
+ border-radius: 0;
40
+ border: none;
41
+ background: var(--rp-c-bg);
42
+ }
43
+
44
+ /* ── Diagram area ───────────────────────────────────────────────────── */
45
+
46
+ .ciderpress-mermaid-inner {
47
+ flex: 1 1 auto;
48
+ transform-origin: 0 0;
49
+ transition: none;
50
+ padding: 24px;
51
+ display: flex;
52
+ justify-content: center;
53
+ align-items: center;
54
+ min-height: 120px;
55
+ }
56
+
57
+ .ciderpress-mermaid-inner svg {
58
+ max-width: 100%;
59
+ height: auto;
60
+ }
61
+
62
+ /* ── Code view ──────────────────────────────────────────────────────── */
63
+
64
+ .ciderpress-mermaid-code {
65
+ flex: 1 1 auto;
66
+ overflow: auto;
67
+ padding: 16px 20px;
68
+ min-height: 120px;
69
+ }
70
+
71
+ .ciderpress-mermaid-code pre {
72
+ margin: 0;
73
+ background: transparent;
74
+ border: none;
75
+ padding: 0;
76
+ }
77
+
78
+ .ciderpress-mermaid-code code {
79
+ font-size: 12px;
80
+ line-height: 1.6;
81
+ color: var(--rp-c-text-2);
82
+ white-space: pre;
83
+ font-family: var(--rp-font-family-mono);
84
+ }
85
+
86
+ /* ── Syntax highlighting tokens ─────────────────────────────────────── */
87
+
88
+ .zm-keyword {
89
+ color: var(--rp-c-brand);
90
+ font-weight: 600;
91
+ }
92
+
93
+ .zm-comment {
94
+ color: var(--rp-c-text-4, var(--rp-c-text-3));
95
+ font-style: italic;
96
+ }
97
+
98
+ .zm-string {
99
+ color: var(--rp-c-green-1, #16a34a);
100
+ }
101
+
102
+ .zm-arrow {
103
+ color: var(--rp-c-yellow-1, #ca8a04);
104
+ }
105
+
106
+ /* ── Top controls (zoom, reset, fullscreen) ─────────────────────────── */
107
+
108
+ .ciderpress-mermaid-controls {
109
+ position: absolute;
110
+ top: 8px;
111
+ right: 8px;
112
+ display: flex;
113
+ gap: 4px;
114
+ z-index: 2;
115
+ opacity: 0;
116
+ transition: opacity 150ms ease;
117
+ }
118
+
119
+ .ciderpress-mermaid:hover .ciderpress-mermaid-controls {
120
+ opacity: 1;
121
+ }
122
+
123
+ .ciderpress-mermaid-fullscreen .ciderpress-mermaid-controls {
124
+ opacity: 1;
125
+ }
126
+
127
+ .ciderpress-mermaid-btn {
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ width: 28px;
132
+ height: 28px;
133
+ border: 1px solid var(--rp-c-divider);
134
+ border-radius: 6px;
135
+ background: var(--rp-c-bg);
136
+ color: var(--rp-c-text-2);
137
+ font-size: 14px;
138
+ line-height: 1;
139
+ cursor: pointer;
140
+ transition:
141
+ color 150ms ease,
142
+ border-color 150ms ease;
143
+ }
144
+
145
+ .ciderpress-mermaid-btn:hover {
146
+ color: var(--rp-c-text-1);
147
+ border-color: var(--rp-c-text-3);
148
+ }
149
+
150
+ /* ── Footer (type label + tab bar) ──────────────────────────────────── */
151
+
152
+ .ciderpress-mermaid-footer {
153
+ flex: 0 0 auto;
154
+ display: flex;
155
+ align-items: center;
156
+ justify-content: space-between;
157
+ border-top: 1px solid var(--rp-c-divider);
158
+ padding: 0 0 0 12px;
159
+ }
160
+
161
+ .ciderpress-mermaid-type {
162
+ font-size: 11px;
163
+ font-family: var(--rp-font-family-mono);
164
+ color: var(--rp-c-text-3);
165
+ text-transform: uppercase;
166
+ letter-spacing: 0.04em;
167
+ white-space: nowrap;
168
+ }
169
+
170
+ .ciderpress-mermaid-tabs {
171
+ display: flex;
172
+ gap: 0;
173
+ }
174
+
175
+ .ciderpress-mermaid-tab {
176
+ padding: 4px 12px;
177
+ border: none;
178
+ border-left: 1px solid var(--rp-c-divider);
179
+ background: transparent;
180
+ color: var(--rp-c-text-3);
181
+ font-size: 11px;
182
+ font-family: var(--rp-font-family-mono);
183
+ cursor: pointer;
184
+ transition:
185
+ color 150ms ease,
186
+ background 150ms ease;
187
+ text-transform: uppercase;
188
+ letter-spacing: 0.04em;
189
+ }
190
+
191
+ .ciderpress-mermaid-tab:hover {
192
+ color: var(--rp-c-text-2);
193
+ background: var(--rp-c-bg-soft);
194
+ }
195
+
196
+ .ciderpress-mermaid-tab-active {
197
+ color: var(--rp-c-text-1);
198
+ background: var(--rp-c-bg-soft);
199
+ }