@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.
- package/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/0~142.js +2 -0
- package/dist/0~164.js +2 -0
- package/dist/0~2.js +2 -0
- package/dist/0~225.js +2 -0
- package/dist/0~288.js +2 -0
- package/dist/0~299.js +2 -0
- package/dist/0~3.js +2 -0
- package/dist/0~301.js +2 -0
- package/dist/0~311.js +2 -0
- package/dist/0~326.js +2 -0
- package/dist/0~40.js +2 -0
- package/dist/0~43.js +2 -0
- package/dist/0~433.js +2 -0
- package/dist/0~453.js +2 -0
- package/dist/0~457.js +2 -0
- package/dist/0~497.js +2 -0
- package/dist/0~511.js +2 -0
- package/dist/0~603.js +2 -0
- package/dist/0~616.js +2 -0
- package/dist/0~659.js +2 -0
- package/dist/0~670.js +2 -0
- package/dist/0~687.js +2 -0
- package/dist/0~706.js +2 -0
- package/dist/0~729.js +2 -0
- package/dist/0~768.js +2 -0
- package/dist/0~819.js +2 -0
- package/dist/0~830.js +2 -0
- package/dist/0~854.js +2 -0
- package/dist/0~863.js +2 -0
- package/dist/0~879.js +2 -0
- package/dist/0~96.js +2 -0
- package/dist/0~97.js +2 -0
- package/dist/components/FileTree/FileTree.css +90 -0
- package/dist/components/FileTree/FileTree.d.ts +7 -0
- package/dist/components/FileTree/FileTree.js +531 -0
- package/dist/components/FileTree/FileTreeItem.d.ts +8 -0
- package/dist/components/FileTree/RemoteSvgIcon.d.ts +11 -0
- package/dist/components/FileTree/index.d.ts +4 -0
- package/dist/components/folder-icons.d.ts +32 -0
- package/dist/components/languages.d.ts +7 -0
- package/dist/components/tree-parser/tree-parser.d.ts +12 -0
- package/dist/components/tree-parser/types.d.ts +11 -0
- package/dist/head/css/loader-apple.css +1 -0
- package/dist/head/css/loader-backdrop.css +1 -0
- package/dist/head/css/loader-dots.css +1 -0
- package/dist/head/css/themes/amber.css +1 -0
- package/dist/head/css/themes/arcade.css +1 -0
- package/dist/head/css/themes/grannysmith.css +1 -0
- package/dist/head/css/themes/honeycrisp.css +1 -0
- package/dist/head/css/themes/midnight.css +1 -0
- package/dist/head/css/themes/mulled.css +1 -0
- package/dist/head/js/loader-dots.js +1 -0
- package/dist/head/js/vscode-nav.js +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.mjs +40 -0
- package/dist/node.d.ts +81 -0
- package/dist/node.mjs +17762 -0
- package/dist/plugins/mermaid/MermaidRenderer.tsx +480 -0
- package/dist/plugins/mermaid/mermaid.css +199 -0
- package/dist/theme/components/announcement/announcement-bar.css +103 -0
- package/dist/theme/components/announcement/announcement-bar.tsx +173 -0
- package/dist/theme/components/ask-ai/ask-ai-button.css +52 -0
- package/dist/theme/components/ask-ai/ask-ai-button.tsx +56 -0
- package/dist/theme/components/content-footer/content-footer-portal.tsx +70 -0
- package/dist/theme/components/content-footer/feedback.css +47 -0
- package/dist/theme/components/content-footer/feedback.tsx +96 -0
- package/dist/theme/components/content-footer/meta-actions.css +25 -0
- package/dist/theme/components/content-footer/meta-actions.tsx +57 -0
- package/dist/theme/components/content-footer/page-pager.css +61 -0
- package/dist/theme/components/content-footer/page-pager.tsx +110 -0
- package/dist/theme/components/edit-source-button.tsx +97 -0
- package/dist/theme/components/footer/site-footer.css +179 -0
- package/dist/theme/components/footer/site-footer.tsx +115 -0
- package/dist/theme/components/home/cta.css +67 -0
- package/dist/theme/components/home/cta.tsx +77 -0
- package/dist/theme/components/home/feature-card.css +52 -0
- package/dist/theme/components/home/feature-card.tsx +131 -0
- package/dist/theme/components/home/feature.tsx +79 -0
- package/dist/theme/components/home/hero-demo.css +66 -0
- package/dist/theme/components/home/hero-demo.tsx +46 -0
- package/dist/theme/components/home/hero.css +96 -0
- package/dist/theme/components/home/hero.tsx +111 -0
- package/dist/theme/components/home/layout.tsx +183 -0
- package/dist/theme/components/home/page-rail.css +21 -0
- package/dist/theme/components/home/page-rail.tsx +19 -0
- package/dist/theme/components/home/split.css +148 -0
- package/dist/theme/components/home/split.tsx +120 -0
- package/dist/theme/components/home/trust-strip.css +33 -0
- package/dist/theme/components/home/trust-strip.tsx +43 -0
- package/dist/theme/components/home/workspaces.tsx +71 -0
- package/dist/theme/components/nav/branch-tag.css +54 -0
- package/dist/theme/components/nav/branch-tag.tsx +101 -0
- package/dist/theme/components/nav/ciderpress-doc-layout.tsx +247 -0
- package/dist/theme/components/nav/ciderpress-docs-bar.css +505 -0
- package/dist/theme/components/nav/ciderpress-docs-bar.tsx +426 -0
- package/dist/theme/components/nav/ciderpress-header.css +172 -0
- package/dist/theme/components/nav/ciderpress-header.tsx +113 -0
- package/dist/theme/components/nav/ciderpress-layout-context.tsx +49 -0
- package/dist/theme/components/nav/ciderpress-nav-hamburger.css +193 -0
- package/dist/theme/components/nav/ciderpress-nav-hamburger.tsx +112 -0
- package/dist/theme/components/nav/ciderpress-nav-menu.css +130 -0
- package/dist/theme/components/nav/ciderpress-nav-menu.tsx +372 -0
- package/dist/theme/components/nav/ciderpress-nav-search.css +73 -0
- package/dist/theme/components/nav/ciderpress-nav-search.tsx +55 -0
- package/dist/theme/components/nav/ciderpress-nav-social-links.css +35 -0
- package/dist/theme/components/nav/ciderpress-nav-social-links.tsx +87 -0
- package/dist/theme/components/nav/floating-branch-indicator.css +106 -0
- package/dist/theme/components/nav/floating-branch-indicator.tsx +109 -0
- package/dist/theme/components/nav/layout.tsx +268 -0
- package/dist/theme/components/nav/mobile-nav-cta.tsx +79 -0
- package/dist/theme/components/nav/nav-divider.css +15 -0
- package/dist/theme/components/nav/nav-divider.tsx +19 -0
- package/dist/theme/components/nav/nav-logo.css +42 -0
- package/dist/theme/components/nav/nav-logo.tsx +262 -0
- package/dist/theme/components/nav/theme-switcher.css +92 -0
- package/dist/theme/components/nav/theme-switcher.tsx +298 -0
- package/dist/theme/components/nav/topbar-cta.css +45 -0
- package/dist/theme/components/nav/topbar-cta.tsx +39 -0
- package/dist/theme/components/nav/variant-toggle.css +70 -0
- package/dist/theme/components/nav/variant-toggle.tsx +83 -0
- package/dist/theme/components/nav/version-chip.css +31 -0
- package/dist/theme/components/nav/version-chip.tsx +45 -0
- package/dist/theme/components/nav/vscode-tag.css +32 -0
- package/dist/theme/components/nav/vscode-tag.tsx +20 -0
- package/dist/theme/components/openapi/code-sample.tsx +341 -0
- package/dist/theme/components/openapi/copy-markdown-button.tsx +41 -0
- package/dist/theme/components/openapi/icons.tsx +45 -0
- package/dist/theme/components/openapi/index.ts +6 -0
- package/dist/theme/components/openapi/method-badge.tsx +24 -0
- package/dist/theme/components/openapi/openapi.css +665 -0
- package/dist/theme/components/openapi/operation.tsx +200 -0
- package/dist/theme/components/openapi/overview.tsx +207 -0
- package/dist/theme/components/openapi/parameters-table.tsx +149 -0
- package/dist/theme/components/openapi/request-body.tsx +90 -0
- package/dist/theme/components/openapi/response-list.tsx +112 -0
- package/dist/theme/components/openapi/schema-viewer.tsx +277 -0
- package/dist/theme/components/openapi/security-badges.tsx +63 -0
- package/dist/theme/components/openapi/spec-utils.ts +122 -0
- package/dist/theme/components/shared/accordion.css +118 -0
- package/dist/theme/components/shared/accordion.stories.tsx +96 -0
- package/dist/theme/components/shared/accordion.tsx +191 -0
- package/dist/theme/components/shared/brand-logo.stories.tsx +49 -0
- package/dist/theme/components/shared/brand-mark.stories.tsx +53 -0
- package/dist/theme/components/shared/browser-window.css +1 -0
- package/dist/theme/components/shared/browser-window.stories.tsx +100 -0
- package/dist/theme/components/shared/browser-window.tsx +2 -0
- package/dist/theme/components/shared/card.stories.tsx +50 -0
- package/dist/theme/components/shared/card.tsx +35 -0
- package/dist/theme/components/shared/ciderpress-logo.tsx +93 -0
- package/dist/theme/components/shared/ciderpress-mark.tsx +77 -0
- package/dist/theme/components/shared/color.css +56 -0
- package/dist/theme/components/shared/color.stories.tsx +47 -0
- package/dist/theme/components/shared/color.tsx +69 -0
- package/dist/theme/components/shared/columns.css +37 -0
- package/dist/theme/components/shared/columns.stories.tsx +91 -0
- package/dist/theme/components/shared/columns.tsx +50 -0
- package/dist/theme/components/shared/desktop-window.css +339 -0
- package/dist/theme/components/shared/desktop-window.tsx +535 -0
- package/dist/theme/components/shared/field.css +158 -0
- package/dist/theme/components/shared/field.stories.tsx +100 -0
- package/dist/theme/components/shared/field.tsx +186 -0
- package/dist/theme/components/shared/frame.css +39 -0
- package/dist/theme/components/shared/frame.stories.tsx +49 -0
- package/dist/theme/components/shared/frame.tsx +76 -0
- package/dist/theme/components/shared/icon.stories.tsx +90 -0
- package/dist/theme/components/shared/icon.tsx +41 -0
- package/dist/theme/components/shared/prompt.css +178 -0
- package/dist/theme/components/shared/prompt.stories.tsx +57 -0
- package/dist/theme/components/shared/prompt.tsx +369 -0
- package/dist/theme/components/shared/resolve-card-icon.ts +28 -0
- package/dist/theme/components/shared/section-card.stories.tsx +51 -0
- package/dist/theme/components/shared/section-card.tsx +44 -0
- package/dist/theme/components/shared/section-grid.stories.tsx +46 -0
- package/dist/theme/components/shared/section-grid.tsx +15 -0
- package/dist/theme/components/shared/status-badge.css +37 -0
- package/dist/theme/components/shared/status-badge.stories.tsx +61 -0
- package/dist/theme/components/shared/status-badge.tsx +74 -0
- package/dist/theme/components/shared/steps.css +88 -0
- package/dist/theme/components/shared/steps.stories.tsx +68 -0
- package/dist/theme/components/shared/steps.tsx +100 -0
- package/dist/theme/components/shared/tech-icon-table.stories.tsx +29 -0
- package/dist/theme/components/shared/tech-icon-table.tsx +71 -0
- package/dist/theme/components/shared/tech-tag.stories.tsx +40 -0
- package/dist/theme/components/shared/tech-tag.tsx +31 -0
- package/dist/theme/components/shared/theme-color-palette.css +80 -0
- package/dist/theme/components/shared/theme-color-palette.stories.tsx +52 -0
- package/dist/theme/components/shared/theme-color-palette.tsx +275 -0
- package/dist/theme/components/shared/tooltip.css +69 -0
- package/dist/theme/components/shared/tooltip.stories.tsx +72 -0
- package/dist/theme/components/shared/tooltip.tsx +77 -0
- package/dist/theme/components/sidebar/framework-picker.css +77 -0
- package/dist/theme/components/sidebar/framework-picker.tsx +78 -0
- package/dist/theme/components/sidebar/sidebar-filter.test.ts +140 -0
- package/dist/theme/components/sidebar/sidebar-filter.ts +79 -0
- package/dist/theme/components/sidebar/sidebar-links.css +102 -0
- package/dist/theme/components/sidebar/sidebar-links.tsx +122 -0
- package/dist/theme/components/sidebar/sidebar-promo.css +42 -0
- package/dist/theme/components/sidebar/sidebar-promo.tsx +52 -0
- package/dist/theme/components/sidebar/sidebar-scope.tsx +151 -0
- package/dist/theme/components/sidebar/sidebar-toggle.css +181 -0
- package/dist/theme/components/sidebar/sidebar-toggle.tsx +127 -0
- package/dist/theme/components/theme-provider.tsx +637 -0
- package/dist/theme/components/workspaces/card.css +151 -0
- package/dist/theme/components/workspaces/card.tsx +166 -0
- package/dist/theme/components/workspaces/grid.tsx +62 -0
- package/dist/theme/css.d.ts +1 -0
- package/dist/theme/env.d.ts +12 -0
- package/dist/theme/fonts/GeistMono-Variable.woff2 +0 -0
- package/dist/theme/fonts/GeistPixel-Square.woff2 +0 -0
- package/dist/theme/fonts/GeistSans-Variable.woff2 +0 -0
- package/dist/theme/hooks/use-ciderpress.ts +61 -0
- package/dist/theme/hooks/use-nav-items.ts +76 -0
- package/dist/theme/icons/index.ts +2 -0
- package/dist/theme/icons/tech-map.ts +228 -0
- package/dist/theme/index.tsx +180 -0
- package/dist/theme/lib/read-social-links.ts +27 -0
- package/dist/theme/lib/route-link.tsx +126 -0
- package/dist/theme/lib/safe-url.test.ts +0 -0
- package/dist/theme/lib/safe-url.ts +68 -0
- package/dist/theme/lib/theme-favicon.ts +125 -0
- package/dist/theme/lib/user-config-stub.ts +12 -0
- package/dist/theme/styles/layers.css +32 -0
- package/dist/theme/styles/overrides/badge.css +26 -0
- package/dist/theme/styles/overrides/content-footer.css +80 -0
- package/dist/theme/styles/overrides/details.css +61 -0
- package/dist/theme/styles/overrides/fonts.css +32 -0
- package/dist/theme/styles/overrides/home-card.css +133 -0
- package/dist/theme/styles/overrides/home.css +243 -0
- package/dist/theme/styles/overrides/rail.css +337 -0
- package/dist/theme/styles/overrides/rspress.css +62 -0
- package/dist/theme/styles/overrides/scrollbar.css +25 -0
- package/dist/theme/styles/overrides/section-card.css +114 -0
- package/dist/theme/styles/overrides/sidebar.css +144 -0
- package/dist/theme/styles/overrides/tokens.css +288 -0
- package/dist/theme/styles/overrides/vscode.css +88 -0
- package/dist/theme/styles/themes/amber.css +545 -0
- package/dist/theme/styles/themes/arcade-fx.css +366 -0
- package/dist/theme/styles/themes/arcade.css +273 -0
- package/dist/theme/styles/themes/grannysmith.css +545 -0
- package/dist/theme/styles/themes/honeycrisp.css +545 -0
- package/dist/theme/styles/themes/midnight.css +273 -0
- package/dist/theme/styles/themes/mulled.css +817 -0
- package/package.json +103 -0
- package/src/theme/components/announcement/announcement-bar.css +103 -0
- package/src/theme/components/announcement/announcement-bar.tsx +173 -0
- package/src/theme/components/ask-ai/ask-ai-button.css +52 -0
- package/src/theme/components/ask-ai/ask-ai-button.tsx +56 -0
- package/src/theme/components/content-footer/content-footer-portal.tsx +70 -0
- package/src/theme/components/content-footer/feedback.css +47 -0
- package/src/theme/components/content-footer/feedback.tsx +96 -0
- package/src/theme/components/content-footer/meta-actions.css +25 -0
- package/src/theme/components/content-footer/meta-actions.tsx +57 -0
- package/src/theme/components/content-footer/page-pager.css +61 -0
- package/src/theme/components/content-footer/page-pager.tsx +110 -0
- package/src/theme/components/edit-source-button.tsx +97 -0
- package/src/theme/components/footer/site-footer.css +179 -0
- package/src/theme/components/footer/site-footer.tsx +115 -0
- package/src/theme/components/home/cta.css +67 -0
- package/src/theme/components/home/cta.tsx +77 -0
- package/src/theme/components/home/feature-card.css +52 -0
- package/src/theme/components/home/feature-card.tsx +131 -0
- package/src/theme/components/home/feature.tsx +79 -0
- package/src/theme/components/home/hero-demo.css +66 -0
- package/src/theme/components/home/hero-demo.tsx +46 -0
- package/src/theme/components/home/hero.css +96 -0
- package/src/theme/components/home/hero.tsx +111 -0
- package/src/theme/components/home/layout.tsx +183 -0
- package/src/theme/components/home/page-rail.css +21 -0
- package/src/theme/components/home/page-rail.tsx +19 -0
- package/src/theme/components/home/split.css +148 -0
- package/src/theme/components/home/split.tsx +120 -0
- package/src/theme/components/home/trust-strip.css +33 -0
- package/src/theme/components/home/trust-strip.tsx +43 -0
- package/src/theme/components/home/workspaces.tsx +71 -0
- package/src/theme/components/nav/branch-tag.css +54 -0
- package/src/theme/components/nav/branch-tag.tsx +101 -0
- package/src/theme/components/nav/ciderpress-doc-layout.tsx +247 -0
- package/src/theme/components/nav/ciderpress-docs-bar.css +505 -0
- package/src/theme/components/nav/ciderpress-docs-bar.tsx +426 -0
- package/src/theme/components/nav/ciderpress-header.css +172 -0
- package/src/theme/components/nav/ciderpress-header.tsx +113 -0
- package/src/theme/components/nav/ciderpress-layout-context.tsx +49 -0
- package/src/theme/components/nav/ciderpress-nav-hamburger.css +193 -0
- package/src/theme/components/nav/ciderpress-nav-hamburger.tsx +112 -0
- package/src/theme/components/nav/ciderpress-nav-menu.css +130 -0
- package/src/theme/components/nav/ciderpress-nav-menu.tsx +372 -0
- package/src/theme/components/nav/ciderpress-nav-search.css +73 -0
- package/src/theme/components/nav/ciderpress-nav-search.tsx +55 -0
- package/src/theme/components/nav/ciderpress-nav-social-links.css +35 -0
- package/src/theme/components/nav/ciderpress-nav-social-links.tsx +87 -0
- package/src/theme/components/nav/floating-branch-indicator.css +106 -0
- package/src/theme/components/nav/floating-branch-indicator.tsx +109 -0
- package/src/theme/components/nav/layout.tsx +268 -0
- package/src/theme/components/nav/mobile-nav-cta.tsx +79 -0
- package/src/theme/components/nav/nav-divider.css +15 -0
- package/src/theme/components/nav/nav-divider.tsx +19 -0
- package/src/theme/components/nav/nav-logo.css +42 -0
- package/src/theme/components/nav/nav-logo.tsx +262 -0
- package/src/theme/components/nav/theme-switcher.css +92 -0
- package/src/theme/components/nav/theme-switcher.tsx +298 -0
- package/src/theme/components/nav/topbar-cta.css +45 -0
- package/src/theme/components/nav/topbar-cta.tsx +39 -0
- package/src/theme/components/nav/variant-toggle.css +70 -0
- package/src/theme/components/nav/variant-toggle.tsx +83 -0
- package/src/theme/components/nav/version-chip.css +31 -0
- package/src/theme/components/nav/version-chip.tsx +45 -0
- package/src/theme/components/nav/vscode-tag.css +32 -0
- package/src/theme/components/nav/vscode-tag.tsx +20 -0
- package/src/theme/components/openapi/code-sample.tsx +341 -0
- package/src/theme/components/openapi/copy-markdown-button.tsx +41 -0
- package/src/theme/components/openapi/icons.tsx +45 -0
- package/src/theme/components/openapi/index.ts +6 -0
- package/src/theme/components/openapi/method-badge.tsx +24 -0
- package/src/theme/components/openapi/openapi.css +665 -0
- package/src/theme/components/openapi/operation.tsx +200 -0
- package/src/theme/components/openapi/overview.tsx +207 -0
- package/src/theme/components/openapi/parameters-table.tsx +149 -0
- package/src/theme/components/openapi/request-body.tsx +90 -0
- package/src/theme/components/openapi/response-list.tsx +112 -0
- package/src/theme/components/openapi/schema-viewer.tsx +277 -0
- package/src/theme/components/openapi/security-badges.tsx +63 -0
- package/src/theme/components/openapi/spec-utils.ts +122 -0
- package/src/theme/components/shared/accordion.css +118 -0
- package/src/theme/components/shared/accordion.stories.tsx +96 -0
- package/src/theme/components/shared/accordion.tsx +191 -0
- package/src/theme/components/shared/brand-logo.stories.tsx +49 -0
- package/src/theme/components/shared/brand-mark.stories.tsx +53 -0
- package/src/theme/components/shared/browser-window.css +1 -0
- package/src/theme/components/shared/browser-window.stories.tsx +100 -0
- package/src/theme/components/shared/browser-window.tsx +2 -0
- package/src/theme/components/shared/card.stories.tsx +50 -0
- package/src/theme/components/shared/card.tsx +35 -0
- package/src/theme/components/shared/ciderpress-logo.tsx +93 -0
- package/src/theme/components/shared/ciderpress-mark.tsx +77 -0
- package/src/theme/components/shared/color.css +56 -0
- package/src/theme/components/shared/color.stories.tsx +47 -0
- package/src/theme/components/shared/color.tsx +69 -0
- package/src/theme/components/shared/columns.css +37 -0
- package/src/theme/components/shared/columns.stories.tsx +91 -0
- package/src/theme/components/shared/columns.tsx +50 -0
- package/src/theme/components/shared/desktop-window.css +339 -0
- package/src/theme/components/shared/desktop-window.tsx +535 -0
- package/src/theme/components/shared/field.css +158 -0
- package/src/theme/components/shared/field.stories.tsx +100 -0
- package/src/theme/components/shared/field.tsx +186 -0
- package/src/theme/components/shared/frame.css +39 -0
- package/src/theme/components/shared/frame.stories.tsx +49 -0
- package/src/theme/components/shared/frame.tsx +76 -0
- package/src/theme/components/shared/icon.stories.tsx +90 -0
- package/src/theme/components/shared/icon.tsx +41 -0
- package/src/theme/components/shared/prompt.css +178 -0
- package/src/theme/components/shared/prompt.stories.tsx +57 -0
- package/src/theme/components/shared/prompt.tsx +369 -0
- package/src/theme/components/shared/resolve-card-icon.ts +28 -0
- package/src/theme/components/shared/section-card.stories.tsx +51 -0
- package/src/theme/components/shared/section-card.tsx +44 -0
- package/src/theme/components/shared/section-grid.stories.tsx +46 -0
- package/src/theme/components/shared/section-grid.tsx +15 -0
- package/src/theme/components/shared/status-badge.css +37 -0
- package/src/theme/components/shared/status-badge.stories.tsx +61 -0
- package/src/theme/components/shared/status-badge.tsx +74 -0
- package/src/theme/components/shared/steps.css +88 -0
- package/src/theme/components/shared/steps.stories.tsx +68 -0
- package/src/theme/components/shared/steps.tsx +100 -0
- package/src/theme/components/shared/tech-icon-table.stories.tsx +29 -0
- package/src/theme/components/shared/tech-icon-table.tsx +71 -0
- package/src/theme/components/shared/tech-tag.stories.tsx +40 -0
- package/src/theme/components/shared/tech-tag.tsx +31 -0
- package/src/theme/components/shared/theme-color-palette.css +80 -0
- package/src/theme/components/shared/theme-color-palette.stories.tsx +52 -0
- package/src/theme/components/shared/theme-color-palette.tsx +275 -0
- package/src/theme/components/shared/tooltip.css +69 -0
- package/src/theme/components/shared/tooltip.stories.tsx +72 -0
- package/src/theme/components/shared/tooltip.tsx +77 -0
- package/src/theme/components/sidebar/framework-picker.css +77 -0
- package/src/theme/components/sidebar/framework-picker.tsx +78 -0
- package/src/theme/components/sidebar/sidebar-filter.test.ts +140 -0
- package/src/theme/components/sidebar/sidebar-filter.ts +79 -0
- package/src/theme/components/sidebar/sidebar-links.css +102 -0
- package/src/theme/components/sidebar/sidebar-links.tsx +122 -0
- package/src/theme/components/sidebar/sidebar-promo.css +42 -0
- package/src/theme/components/sidebar/sidebar-promo.tsx +52 -0
- package/src/theme/components/sidebar/sidebar-scope.tsx +151 -0
- package/src/theme/components/sidebar/sidebar-toggle.css +181 -0
- package/src/theme/components/sidebar/sidebar-toggle.tsx +127 -0
- package/src/theme/components/theme-provider.tsx +637 -0
- package/src/theme/components/workspaces/card.css +151 -0
- package/src/theme/components/workspaces/card.tsx +166 -0
- package/src/theme/components/workspaces/grid.tsx +62 -0
- package/src/theme/css.d.ts +1 -0
- package/src/theme/env.d.ts +12 -0
- package/src/theme/fonts/GeistMono-Variable.woff2 +0 -0
- package/src/theme/fonts/GeistPixel-Square.woff2 +0 -0
- package/src/theme/fonts/GeistSans-Variable.woff2 +0 -0
- package/src/theme/hooks/use-ciderpress.ts +61 -0
- package/src/theme/hooks/use-nav-items.ts +76 -0
- package/src/theme/icons/index.ts +2 -0
- package/src/theme/icons/tech-map.ts +228 -0
- package/src/theme/index.tsx +180 -0
- package/src/theme/lib/read-social-links.ts +27 -0
- package/src/theme/lib/route-link.tsx +126 -0
- package/src/theme/lib/safe-url.test.ts +0 -0
- package/src/theme/lib/safe-url.ts +68 -0
- package/src/theme/lib/theme-favicon.ts +125 -0
- package/src/theme/lib/user-config-stub.ts +12 -0
- package/src/theme/styles/layers.css +32 -0
- package/src/theme/styles/overrides/badge.css +26 -0
- package/src/theme/styles/overrides/content-footer.css +80 -0
- package/src/theme/styles/overrides/details.css +61 -0
- package/src/theme/styles/overrides/fonts.css +32 -0
- package/src/theme/styles/overrides/home-card.css +133 -0
- package/src/theme/styles/overrides/home.css +243 -0
- package/src/theme/styles/overrides/rail.css +337 -0
- package/src/theme/styles/overrides/rspress.css +62 -0
- package/src/theme/styles/overrides/scrollbar.css +25 -0
- package/src/theme/styles/overrides/section-card.css +114 -0
- package/src/theme/styles/overrides/sidebar.css +144 -0
- package/src/theme/styles/overrides/tokens.css +288 -0
- package/src/theme/styles/overrides/vscode.css +88 -0
- package/src/theme/styles/themes/amber.css +545 -0
- package/src/theme/styles/themes/arcade-fx.css +366 -0
- package/src/theme/styles/themes/arcade.css +273 -0
- package/src/theme/styles/themes/grannysmith.css +545 -0
- package/src/theme/styles/themes/honeycrisp.css +545 -0
- package/src/theme/styles/themes/midnight.css +273 -0
- 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
|
+
}
|