@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,125 @@
1
+ import { BRAND_COLORS, DEFAULT_THEME_NAME } from '@ciderpress/theme'
2
+
3
+ /**
4
+ * Sync the document favicon with the active theme's brand color.
5
+ *
6
+ * Browsers cache favicons aggressively and don't honour CSS custom
7
+ * properties inside referenced SVGs, so a static `/icon.svg` always
8
+ * paints with whatever colour the asset shipped with. To keep the tab
9
+ * mark in lockstep with the active theme (mulled burgundy, honeycrisp
10
+ * red, grannysmith green, amber hearth, midnight blue, arcade neon, …),
11
+ * we read the resolved `--cp-c-brand-1` / `--cp-c-brand-3` values off
12
+ * `<html>`, bake them into a fresh pixel-apple SVG, and point
13
+ * `<link rel="icon">` at the resulting data URI. Browsers treat a new
14
+ * data URI as a new icon resource and repaint the tab.
15
+ *
16
+ * Safe to call as often as needed — idempotent and inexpensive.
17
+ *
18
+ * @param html - Document root element (`<html>`)
19
+ */
20
+ export function syncThemeFavicon(html: HTMLElement): void {
21
+ const brand = resolveBrandColor(html)
22
+ const shadow = resolveBrandShadow(html)
23
+ const surface = resolveSurfaceColor(html)
24
+ const dataUri = buildIconDataUri(brand, shadow, surface)
25
+ const link = ensureFaviconLink()
26
+ // oxlint-disable-next-line functional/immutable-data -- boundary mutation: updating link element href
27
+ link.type = 'image/svg+xml'
28
+ // oxlint-disable-next-line functional/immutable-data -- boundary mutation: updating link element href
29
+ link.href = dataUri
30
+ }
31
+
32
+ const FALLBACK_BRAND = BRAND_COLORS[DEFAULT_THEME_NAME].primary
33
+ const FALLBACK_SHADOW = BRAND_COLORS[DEFAULT_THEME_NAME].active
34
+ const FALLBACK_SURFACE = '#0a0a0a'
35
+
36
+ /**
37
+ * Read the resolved `--cp-c-brand-1` CSS custom property off the root
38
+ * element, falling back to the default theme's primary when the var is
39
+ * empty (which happens during the brief window before the theme
40
+ * stylesheet loads).
41
+ *
42
+ * @private
43
+ * @param html - Document root element
44
+ * @returns Brand colour as a CSS-parseable string
45
+ */
46
+ function resolveBrandColor(html: HTMLElement): string {
47
+ const raw = globalThis.window.getComputedStyle(html).getPropertyValue('--cp-c-brand-1').trim()
48
+ if (raw.length === 0) {
49
+ return FALLBACK_BRAND
50
+ }
51
+ return raw
52
+ }
53
+
54
+ /**
55
+ * Read the resolved `--cp-c-brand-3` CSS custom property (the deepest
56
+ * brand shade, used for the apple's shadow), falling back to the
57
+ * default theme's active shade when the var is empty.
58
+ *
59
+ * @private
60
+ * @param html - Document root element
61
+ * @returns Brand shadow colour as a CSS-parseable string
62
+ */
63
+ function resolveBrandShadow(html: HTMLElement): string {
64
+ const raw = globalThis.window.getComputedStyle(html).getPropertyValue('--cp-c-brand-3').trim()
65
+ if (raw.length === 0) {
66
+ return FALLBACK_SHADOW
67
+ }
68
+ return raw
69
+ }
70
+
71
+ /**
72
+ * Read the resolved canvas colour off the root element, falling back to
73
+ * the shared dark-surface canvas (`#0a0a0a`) when the var is empty.
74
+ *
75
+ * @private
76
+ * @param html - Document root element
77
+ * @returns Surface colour as a CSS-parseable string
78
+ */
79
+ function resolveSurfaceColor(html: HTMLElement): string {
80
+ const raw = globalThis.window.getComputedStyle(html).getPropertyValue('--cp-c-bg').trim()
81
+ if (raw.length === 0) {
82
+ return FALLBACK_SURFACE
83
+ }
84
+ return raw
85
+ }
86
+
87
+ /**
88
+ * Construct an SVG favicon data URI carrying the supplied brand +
89
+ * surface colours. Renders the pixel-apple mark (matching the static
90
+ * `/icon.svg` and the loader glyph) on a rounded square chip. Apple
91
+ * body uses the resolved brand colour; the body shadow uses the
92
+ * deepest brand shade; leaf greens and stem browns are constant.
93
+ *
94
+ * @private
95
+ * @param brand - Apple body colour
96
+ * @param shadow - Apple body shadow colour (deepest brand shade)
97
+ * @param surface - Chip background colour
98
+ * @returns `data:image/svg+xml;...` URI
99
+ */
100
+ function buildIconDataUri(brand: string, shadow: string, surface: string): string {
101
+ // viewBox 0 0 64 64. Apple source content lives in (60..250, 40..260).
102
+ // translate + scale(0.25) places a 47.5x55 apple centred in the chip.
103
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" shape-rendering="crispEdges"><rect width="64" height="64" rx="12" fill="${surface}"/><g transform="translate(8.25 4.5) scale(0.25) translate(-60 -40)"><path d="M80,40h10v10h-10v-10zM90,50h30v10h10v10h-30v-10h-10v-10z" fill="#99e550"/><path d="M90,40h30v10h-30v-10zM120,50h10v10h-10v-10zM130,60h10v10h-10v-10z" fill="#6abe30"/><path d="M120,40h20v10h10v20h-10v-10h-10v-10h-10v-10z" fill="#4b692f"/><path d="M160,40h20v10h-10v10h-10v10h-10v-20h10v-10z" fill="#d9a066"/><path d="M150,70h10v20h-10v-20z" fill="#8f563b"/><path d="M90,80h20v10h30v10h30v-10h30v-10h20v10h10v10h10v10h10v90h-10v20h-10v20h-10v10h-10v10h-30v-10h-10v-10h-10v-10h-10v10h-10v10h-10v10h-30v-10h-10v-10h-10v-20h-10v-20h-10v-90h10v-10h10v-10h10v-10zM220,200h10v-30h-10v-10h-10v40h-10v20h-10v20h10v-10h10v-10h10v-20z" fill="${brand}"/><path d="M110,80h30v10h-30v-10zM170,80h30v10h-30v-10zM140,90h30v10h-30v-10zM210,160h10v10h10v30h-10v20h-10v10h-10v10h-10v-20h10v-20h10v-40zM150,230h10v10h10v10h10v10h-50v-10h10v-10h10v-10z" fill="${shadow}"/></g></svg>`
104
+ return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`
105
+ }
106
+
107
+ /**
108
+ * Locate the existing `<link rel="icon">` element, creating one if the
109
+ * document head doesn't have one yet (a defensive fallback — Rspress
110
+ * normally renders one from `config.icon`).
111
+ *
112
+ * @private
113
+ * @returns Mutable link element
114
+ */
115
+ function ensureFaviconLink(): HTMLLinkElement {
116
+ const existing = globalThis.document.querySelector<HTMLLinkElement>('link[rel="icon"]')
117
+ if (existing !== null) {
118
+ return existing
119
+ }
120
+ const link = globalThis.document.createElement('link')
121
+ // oxlint-disable-next-line functional/immutable-data -- boundary mutation: initialising newly created link element
122
+ link.rel = 'icon'
123
+ globalThis.document.head.append(link)
124
+ return link
125
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Fallback module re-exported by the `@ciderpress/internal/user-config` webpack
3
+ * alias when no bundleable `ciderpress.config.{ts,mts,cts,js,mjs,cjs}` exists at
4
+ * the standard location. Keeps the slot component's import resolvable so the
5
+ * site builds with zero config and the default `<CiderpressLogo />` renders.
6
+ *
7
+ * The slot component handles a missing or string `logo` field gracefully —
8
+ * this stub just provides the import target.
9
+ */
10
+
11
+ const userConfigStub = {}
12
+ export default userConfigStub
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ciderpress CSS cascade layer order.
3
+ *
4
+ * Declares the layer precedence for the entire ciderpress theme. Later layers in
5
+ * this list win against earlier ones in the cascade, regardless of source
6
+ * order or selector specificity.
7
+ *
8
+ * Layers (low → high precedence):
9
+ *
10
+ * ciderpress.reset — normalize / reset styles (reserved; not yet populated)
11
+ * ciderpress.tokens — design tokens (`--cp-*`, `--rp-*`) defined on :root
12
+ * ciderpress.theme — theme palettes (`[data-cp-theme=*]` scoped colors)
13
+ * ciderpress.components — component styles (`.cp-*` classes for theme components)
14
+ * ciderpress.overrides — structural overrides targeting Rspress (`.rp-*`)
15
+ * user — PUBLIC override slot for downstream consumers
16
+ *
17
+ * The `user` layer is intentionally the highest-precedence named layer. End
18
+ * users can author rules inside `@layer user { ... }` to override any ciderpress
19
+ * style — including component styles — without `!important`.
20
+ *
21
+ * Example (in a downstream project's CSS):
22
+ *
23
+ * @layer user {
24
+ * .rp-home-hero__text { font-size: 3rem; }
25
+ * }
26
+ *
27
+ * Unlayered styles (those not wrapped in any `@layer`) still win against
28
+ * every layer above, so component CSS files that are not yet migrated to a
29
+ * layer continue to work as before.
30
+ */
31
+
32
+ @layer ciderpress.reset, ciderpress.tokens, ciderpress.theme, ciderpress.components, ciderpress.overrides, user;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Badge — inline badge row for shields.io / GitHub status badges.
3
+ *
4
+ * Usage (in markdown):
5
+ * <span class="cp-badge">
6
+ * [![CI](https://img.shields.io/badge/ci-passing-green)](https://example.com)
7
+ * [![npm](https://img.shields.io/npm/v/pkg)](https://npmjs.com/package/pkg)
8
+ * </span>
9
+ */
10
+
11
+ .cp-badge {
12
+ display: inline-flex;
13
+ gap: 4px;
14
+ flex-wrap: wrap;
15
+ align-items: center;
16
+ }
17
+
18
+ .cp-badge p {
19
+ margin: 0;
20
+ padding: 0;
21
+ }
22
+
23
+ .cp-badge img {
24
+ display: inline-block;
25
+ vertical-align: middle;
26
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Content footer — feedback widget + meta-actions block portalled into
3
+ * Rspress's `.rp-doc-footer` so they live INSIDE the doc rail at the
4
+ * reading width. Sits above Rspress's built-in `.rp-prev-next-page`
5
+ * pager (which we restyle below to match the approved mockup).
6
+ */
7
+
8
+ /* ── Portal wrapper — sits at the top of `.rp-doc-footer` ── */
9
+ html .rp-doc-footer .cp-content-footer {
10
+ margin-top: 32px;
11
+ padding-top: 24px;
12
+ border-top: 1px solid var(--cp-c-border);
13
+ }
14
+
15
+ /* Rspress occasionally renders an empty `.rp-doc-footer__edit` row.
16
+ Hide it so we don't get a phantom 0-height divider before our content. */
17
+ html .rp-doc-footer__edit:empty {
18
+ display: none;
19
+ }
20
+
21
+ /* ── Restyle Rspress's prev/next pager to match the mockup ── */
22
+ html .rp-prev-next-page {
23
+ display: grid;
24
+ grid-template-columns: 1fr 1fr;
25
+ gap: 12px;
26
+ margin-top: 24px;
27
+ padding-top: 0;
28
+ border-top: 0;
29
+ }
30
+
31
+ html .rp-prev-next-page__item {
32
+ display: flex;
33
+ flex-direction: column;
34
+ gap: 4px;
35
+ padding: 14px 16px;
36
+ border: 1px solid var(--cp-c-border);
37
+ border-radius: var(--cp-radius-card);
38
+ background: var(--cp-c-bg-soft);
39
+ text-decoration: none;
40
+ transition:
41
+ border-color 0.15s ease,
42
+ background 0.15s ease;
43
+ }
44
+
45
+ html .rp-prev-next-page__item:hover {
46
+ border-color: var(--cp-c-border);
47
+ background: var(--cp-c-bg-elv);
48
+ }
49
+
50
+ html .rp-prev-next-page__item--next,
51
+ html .rp-prev-next-page__next {
52
+ align-items: flex-end;
53
+ text-align: right;
54
+ }
55
+
56
+ html .rp-prev-next-page__item__desc {
57
+ font-family: var(--cp-font-family-mono);
58
+ font-size: 11px;
59
+ color: var(--cp-c-text-3);
60
+ text-transform: uppercase;
61
+ letter-spacing: 0.04em;
62
+ }
63
+
64
+ html .rp-prev-next-page__item__title {
65
+ display: inline-flex;
66
+ align-items: center;
67
+ gap: 6px;
68
+ font-size: 14px;
69
+ font-weight: 500;
70
+ color: var(--cp-c-text-1);
71
+ }
72
+
73
+ /* Chevron icons Rspress injects inside the title — size them down and
74
+ mute their color so they read as subtle direction indicators. */
75
+ html .rp-prev-next-page__icon {
76
+ width: 12px;
77
+ height: 12px;
78
+ color: var(--cp-c-text-3);
79
+ flex-shrink: 0;
80
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * <details> accordion styling.
3
+ */
4
+
5
+ details {
6
+ border: 1px solid var(--cp-c-border);
7
+ border-radius: 8px;
8
+ padding: 0;
9
+ margin: 0;
10
+ background: var(--cp-c-bg-soft);
11
+ }
12
+
13
+ details summary {
14
+ cursor: pointer;
15
+ padding: 0 12px;
16
+ font-weight: 600;
17
+ font-size: 14px;
18
+ color: var(--cp-c-text-1);
19
+ list-style: none;
20
+ display: flex;
21
+ align-items: center;
22
+ gap: 8px;
23
+ user-select: none;
24
+ transition: color 0.2s;
25
+ }
26
+
27
+ details summary:hover {
28
+ color: var(--cp-c-brand-1);
29
+ }
30
+
31
+ details summary::-webkit-details-marker {
32
+ display: none;
33
+ }
34
+
35
+ details summary::before {
36
+ content: '';
37
+ display: inline-block;
38
+ width: 0;
39
+ height: 0;
40
+ border-left: 5px solid currentColor;
41
+ border-top: 4px solid transparent;
42
+ border-bottom: 4px solid transparent;
43
+ transition: transform 0.2s;
44
+ flex-shrink: 0;
45
+ }
46
+
47
+ details[open] summary::before {
48
+ transform: rotate(90deg);
49
+ }
50
+
51
+ details[open] summary {
52
+ border-bottom: none;
53
+ }
54
+
55
+ details > :not(summary) {
56
+ padding: 0 12px;
57
+ }
58
+
59
+ details > :last-child:not(summary) {
60
+ padding-bottom: 6px;
61
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Self-hosted Geist fonts (vercel/geist-font).
3
+ *
4
+ * `Geist` is the base sans-serif (used everywhere by default).
5
+ * `Geist Pixel Square` is a decorative pixel font kept available via
6
+ * `--cp-font-family-pixel` for the brand mark and any opt-in surfaces.
7
+ * `Geist Mono` is used for code, eyebrow labels, status pills, etc.
8
+ */
9
+
10
+ @font-face {
11
+ font-family: 'Geist';
12
+ src: url('../../fonts/GeistSans-Variable.woff2') format('woff2');
13
+ font-weight: 100 900;
14
+ font-style: normal;
15
+ font-display: swap;
16
+ }
17
+
18
+ @font-face {
19
+ font-family: 'Geist Pixel Square';
20
+ src: url('../../fonts/GeistPixel-Square.woff2') format('woff2');
21
+ font-weight: 400;
22
+ font-style: normal;
23
+ font-display: swap;
24
+ }
25
+
26
+ @font-face {
27
+ font-family: 'Geist Mono';
28
+ src: url('../../fonts/GeistMono-Variable.woff2') format('woff2');
29
+ font-weight: 100 900;
30
+ font-style: normal;
31
+ font-display: swap;
32
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Shared base card — container, hover, icon system, and divider.
3
+ * Consumed by feature-card.css and workspace-card.css.
4
+ */
5
+
6
+ /* ── Base card container ─────────────────────────────────────── */
7
+ .cp-card {
8
+ padding: 16px 18px;
9
+ border-radius: var(--rp-radius);
10
+ border: 1px solid var(--cp-c-border);
11
+ background: var(--cp-c-bg-soft);
12
+ text-decoration: none !important;
13
+ transition:
14
+ border-color 0.2s,
15
+ background 0.2s,
16
+ box-shadow 0.2s;
17
+ }
18
+
19
+ .cp-card:hover {
20
+ border-color: var(--cp-c-brand-1);
21
+ background: var(--cp-c-bg-elv);
22
+ box-shadow: var(--cp-shadow-card-hover);
23
+ text-decoration: none !important;
24
+ }
25
+
26
+ .cp-card--clickable {
27
+ cursor: pointer;
28
+ }
29
+
30
+ /* ── Shared icon box (36×36, 4px radius, 18px SVG) ───────────── */
31
+ .cp-card__icon {
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: center;
35
+ width: 36px;
36
+ height: 36px;
37
+ border-radius: 4px;
38
+ flex-shrink: 0;
39
+ }
40
+
41
+ .cp-card__icon svg {
42
+ width: 18px;
43
+ height: 18px;
44
+ }
45
+
46
+ /* ── Icon color variants ─────────────────────────────────────── */
47
+ .cp-card__icon--purple {
48
+ background: var(--cp-c-tint-purple-bg);
49
+ color: var(--cp-c-tint-purple-fg);
50
+ }
51
+
52
+ .cp-card__icon--purple svg {
53
+ color: var(--cp-c-tint-purple-fg);
54
+ }
55
+
56
+ .cp-card__icon--blue {
57
+ background: var(--cp-c-tint-blue-bg);
58
+ color: var(--cp-c-tint-blue-fg);
59
+ }
60
+
61
+ .cp-card__icon--blue svg {
62
+ color: var(--cp-c-tint-blue-fg);
63
+ }
64
+
65
+ .cp-card__icon--green {
66
+ background: var(--cp-c-tint-green-bg);
67
+ color: var(--cp-c-tint-green-fg);
68
+ }
69
+
70
+ .cp-card__icon--green svg {
71
+ color: var(--cp-c-tint-green-fg);
72
+ }
73
+
74
+ .cp-card__icon--amber {
75
+ background: var(--cp-c-tint-amber-bg);
76
+ color: var(--cp-c-tint-amber-fg);
77
+ }
78
+
79
+ .cp-card__icon--amber svg {
80
+ color: var(--cp-c-tint-amber-fg);
81
+ }
82
+
83
+ .cp-card__icon--red {
84
+ background: var(--cp-c-tint-red-bg);
85
+ color: var(--cp-c-tint-red-fg);
86
+ }
87
+
88
+ .cp-card__icon--red svg {
89
+ color: var(--cp-c-tint-red-fg);
90
+ }
91
+
92
+ .cp-card__icon--slate {
93
+ background: var(--cp-c-tint-slate-bg);
94
+ color: var(--cp-c-tint-slate-fg);
95
+ }
96
+
97
+ .cp-card__icon--slate svg {
98
+ color: var(--cp-c-tint-slate-fg);
99
+ }
100
+
101
+ .cp-card__icon--cyan {
102
+ background: var(--cp-c-tint-cyan-bg);
103
+ color: var(--cp-c-tint-cyan-fg);
104
+ }
105
+
106
+ .cp-card__icon--cyan svg {
107
+ color: var(--cp-c-tint-cyan-fg);
108
+ }
109
+
110
+ .cp-card__icon--pink {
111
+ background: var(--cp-c-tint-pink-bg);
112
+ color: var(--cp-c-tint-pink-fg);
113
+ }
114
+
115
+ .cp-card__icon--pink svg {
116
+ color: var(--cp-c-tint-pink-fg);
117
+ }
118
+
119
+ /* ── Divider between features and workspaces ─────────────────── */
120
+ .cp-divider {
121
+ max-width: 1152px;
122
+ margin: 0 auto 48px;
123
+ padding: 0;
124
+ border: none;
125
+ border-top: 1px solid var(--cp-c-divider);
126
+ }
127
+
128
+ @media (max-width: 1184px) {
129
+ .cp-divider {
130
+ padding-left: 16px;
131
+ padding-right: 16px;
132
+ }
133
+ }