@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,113 @@
|
|
|
1
|
+
import { clsx } from 'clsx'
|
|
2
|
+
import type React from 'react'
|
|
3
|
+
|
|
4
|
+
import { RouteLink } from '../../lib/route-link.tsx'
|
|
5
|
+
import { CiderpressLogo } from '../shared/ciderpress-logo'
|
|
6
|
+
import { CiderpressNavHamburger } from './ciderpress-nav-hamburger'
|
|
7
|
+
import { CiderpressNavMenu } from './ciderpress-nav-menu'
|
|
8
|
+
import type { CiderpressNavMenuItem } from './ciderpress-nav-menu'
|
|
9
|
+
import { CiderpressNavSearch } from './ciderpress-nav-search'
|
|
10
|
+
import { CiderpressNavSocialLinks } from './ciderpress-nav-social-links'
|
|
11
|
+
import type { CiderpressSocialLink } from './ciderpress-nav-social-links'
|
|
12
|
+
import { NavDivider } from './nav-divider'
|
|
13
|
+
import { TopbarCTA } from './topbar-cta'
|
|
14
|
+
import { VariantToggle } from './variant-toggle'
|
|
15
|
+
|
|
16
|
+
import './ciderpress-header.css'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Props for the ciderpress site header.
|
|
20
|
+
*/
|
|
21
|
+
export interface CiderpressHeaderProps {
|
|
22
|
+
/**
|
|
23
|
+
* Pre-rendered announcement bar, pinned above the nav row. Pass
|
|
24
|
+
* `null` to omit.
|
|
25
|
+
*/
|
|
26
|
+
readonly announcement: React.ReactNode
|
|
27
|
+
/**
|
|
28
|
+
* Primary nav menu items, fed straight into `<CiderpressNavMenu />`.
|
|
29
|
+
*/
|
|
30
|
+
readonly navItems: readonly CiderpressNavMenuItem[]
|
|
31
|
+
/**
|
|
32
|
+
* Social-link entries (GitHub, npm, etc) read from `site.socialLinks`.
|
|
33
|
+
*/
|
|
34
|
+
readonly socialLinks: readonly CiderpressSocialLink[]
|
|
35
|
+
/**
|
|
36
|
+
* Topbar CTA configuration. Pass `undefined` to omit.
|
|
37
|
+
*/
|
|
38
|
+
readonly topbarCta: { readonly text: string; readonly href: string } | undefined
|
|
39
|
+
/**
|
|
40
|
+
* `true` on the home page — used to suppress the sidebar toggle.
|
|
41
|
+
*/
|
|
42
|
+
readonly isHome: boolean
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Custom replacement for Rspress's built-in `.rp-nav`. Owns the entire
|
|
47
|
+
* topbar chrome (logo, search trigger, primary menu with
|
|
48
|
+
* measure-and-collapse overflow, variant toggle, social cluster, CTA)
|
|
49
|
+
* using only `cp-*` class names and `cp-*` CSS custom properties so
|
|
50
|
+
* theme authors can override every surface without reaching into
|
|
51
|
+
* Rspress internals.
|
|
52
|
+
*
|
|
53
|
+
* Rspress's own `.rp-nav` is hidden by a rule in
|
|
54
|
+
* `styles/overrides/rail.css` — the two never coexist visually.
|
|
55
|
+
*
|
|
56
|
+
* @param props - Header configuration
|
|
57
|
+
* @returns Sticky header element
|
|
58
|
+
*/
|
|
59
|
+
export function CiderpressHeader(props: CiderpressHeaderProps): React.ReactElement {
|
|
60
|
+
// Landing / home pages live inside a constrained max-width container;
|
|
61
|
+
// doc pages stretch full-width (sidebar + article). The header mirrors
|
|
62
|
+
// the content shell so it never floats outside the page rhythm.
|
|
63
|
+
return (
|
|
64
|
+
<header
|
|
65
|
+
className={clsx('cp-header', {
|
|
66
|
+
'cp-header--landing': props.isHome,
|
|
67
|
+
'cp-header--docs': !props.isHome,
|
|
68
|
+
})}
|
|
69
|
+
>
|
|
70
|
+
{props.announcement}
|
|
71
|
+
<div className="cp-header-inner">
|
|
72
|
+
{/* Left: hamburger (mobile primary-nav drawer) + logo. Sidebar
|
|
73
|
+
collapse/expand lives in <CiderpressDocsBar />, the sticky
|
|
74
|
+
sub-header rendered beneath the site nav on docs pages. */}
|
|
75
|
+
<CiderpressNavHamburger
|
|
76
|
+
navItems={props.navItems}
|
|
77
|
+
socialLinks={props.socialLinks}
|
|
78
|
+
topbarCta={props.topbarCta}
|
|
79
|
+
/>
|
|
80
|
+
<RouteLink href="/" className="cp-header-logo" aria-label="Home">
|
|
81
|
+
<CiderpressLogo />
|
|
82
|
+
</RouteLink>
|
|
83
|
+
|
|
84
|
+
{/* Right cluster wrapper. Grows from a zero basis so its width
|
|
85
|
+
equals the actual available room (not the content), which is
|
|
86
|
+
the stable measurement target the React overflow logic
|
|
87
|
+
inside CiderpressNavMenu needs.
|
|
88
|
+
|
|
89
|
+
Inside: search comes first, then the menu (which itself
|
|
90
|
+
fills the leftover room and right-aligns items inside).
|
|
91
|
+
That places search immediately before the menu items, both
|
|
92
|
+
anchored to the right edge of the wrapper. */}
|
|
93
|
+
<div className="cp-header-menu-wrap">
|
|
94
|
+
<CiderpressNavSearch />
|
|
95
|
+
<NavDivider />
|
|
96
|
+
<CiderpressNavMenu items={props.navItems} />
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<NavDivider />
|
|
100
|
+
<VariantToggle />
|
|
101
|
+
<CiderpressNavSocialLinks links={props.socialLinks} />
|
|
102
|
+
{props.topbarCta !== undefined && (
|
|
103
|
+
<>
|
|
104
|
+
<NavDivider />
|
|
105
|
+
<TopbarCTA text={props.topbarCta.text} href={props.topbarCta.href} />
|
|
106
|
+
</>
|
|
107
|
+
)}
|
|
108
|
+
</div>
|
|
109
|
+
</header>
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export { CiderpressHeader as default }
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react'
|
|
2
|
+
import type React from 'react'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* State shape for the ciderpress doc-layout drawer controls.
|
|
6
|
+
*
|
|
7
|
+
* Shared between `<CiderpressDocLayout />` (the owner) and
|
|
8
|
+
* `<CiderpressDocsBar />` (the consumer that toggles the sidebar
|
|
9
|
+
* drawer open/closed on narrow viewports).
|
|
10
|
+
*/
|
|
11
|
+
export interface CiderpressLayoutContextValue {
|
|
12
|
+
readonly isSidebarOpen: boolean
|
|
13
|
+
readonly setIsSidebarOpen: React.Dispatch<React.SetStateAction<boolean>>
|
|
14
|
+
readonly isOutlineOpen: boolean
|
|
15
|
+
readonly setIsOutlineOpen: React.Dispatch<React.SetStateAction<boolean>>
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Empty default setter — used only when the context is read outside
|
|
20
|
+
* a provider, which happens on home / blank pages where the doc
|
|
21
|
+
* layout isn't mounted.
|
|
22
|
+
*
|
|
23
|
+
* @private
|
|
24
|
+
*/
|
|
25
|
+
function noop(): void {
|
|
26
|
+
// intentional no-op
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const defaultValue: CiderpressLayoutContextValue = {
|
|
30
|
+
isSidebarOpen: false,
|
|
31
|
+
setIsSidebarOpen: noop,
|
|
32
|
+
isOutlineOpen: false,
|
|
33
|
+
setIsOutlineOpen: noop,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
export const CiderpressLayoutContext = createContext<CiderpressLayoutContextValue>(defaultValue)
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Read the shared doc-layout drawer state. Returns no-op setters when
|
|
43
|
+
* called outside a `<CiderpressDocLayout />` (e.g. on home pages).
|
|
44
|
+
*
|
|
45
|
+
* @returns Sidebar/outline open state and their setters.
|
|
46
|
+
*/
|
|
47
|
+
export function useCiderpressLayout(): CiderpressLayoutContextValue {
|
|
48
|
+
return useContext(CiderpressLayoutContext)
|
|
49
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiderpressNavHamburger — mobile drawer trigger and slide-in panel.
|
|
3
|
+
*
|
|
4
|
+
* Theme-author API:
|
|
5
|
+
* --cp-nav-hamburger-breakpoint max viewport width to show
|
|
6
|
+
* hamburger / hide desktop chrome
|
|
7
|
+
* (default 768px)
|
|
8
|
+
* --cp-nav-drawer-width drawer panel width (default 320px)
|
|
9
|
+
* --cp-nav-drawer-bg drawer background colour
|
|
10
|
+
* --cp-nav-drawer-backdrop backdrop colour
|
|
11
|
+
* --cp-nav-drawer-shadow drawer drop shadow
|
|
12
|
+
*/
|
|
13
|
+
.cp-nav-hamburger {
|
|
14
|
+
display: none;
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
width: 36px;
|
|
18
|
+
height: 36px;
|
|
19
|
+
padding: 0;
|
|
20
|
+
background: transparent;
|
|
21
|
+
border: 1px solid var(--cp-c-border);
|
|
22
|
+
border-radius: 8px;
|
|
23
|
+
color: var(--cp-c-text-2);
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
transition:
|
|
26
|
+
border-color 0.15s ease,
|
|
27
|
+
color 0.15s ease;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.cp-nav-hamburger:hover {
|
|
31
|
+
border-color: var(--cp-c-brand-1);
|
|
32
|
+
color: var(--cp-c-brand-1);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* Show the hamburger at the same breakpoint where `<CiderpressHeader />`
|
|
36
|
+
collapses its desktop chrome (see `ciderpress-header.css`) and where
|
|
37
|
+
`<CiderpressDocsBar />` flips to its mobile layout, so all three
|
|
38
|
+
pieces transition together. */
|
|
39
|
+
@media (max-width: 1024px) {
|
|
40
|
+
.cp-nav-hamburger {
|
|
41
|
+
display: inline-flex;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* ── Drawer ─────────────────────────────────────────────────────── */
|
|
46
|
+
/*
|
|
47
|
+
* `.cp-nav-drawer-root` is the react-aria-components <ModalOverlay>
|
|
48
|
+
* (acts as the backdrop). `.cp-nav-drawer-modal` is the <Modal> wrapper.
|
|
49
|
+
* `.cp-nav-drawer` is the <Dialog> — the focus-trapped panel.
|
|
50
|
+
*/
|
|
51
|
+
.cp-nav-drawer-root {
|
|
52
|
+
position: fixed;
|
|
53
|
+
inset: 0;
|
|
54
|
+
z-index: 100;
|
|
55
|
+
background: var(--cp-nav-drawer-backdrop, rgba(0, 0, 0, 0.55));
|
|
56
|
+
backdrop-filter: blur(4px);
|
|
57
|
+
animation: cp-nav-drawer-fade-in 0.18s ease-out forwards;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.cp-nav-drawer-modal {
|
|
61
|
+
position: absolute;
|
|
62
|
+
top: 0;
|
|
63
|
+
left: 0;
|
|
64
|
+
height: 100vh;
|
|
65
|
+
width: min(var(--cp-nav-drawer-width, 320px), 100vw);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.cp-nav-drawer {
|
|
69
|
+
outline: none;
|
|
70
|
+
height: 100%;
|
|
71
|
+
width: 100%;
|
|
72
|
+
display: flex;
|
|
73
|
+
flex-direction: column;
|
|
74
|
+
background: var(--cp-nav-drawer-bg, var(--cp-c-bg));
|
|
75
|
+
border-right: 1px solid var(--cp-c-border);
|
|
76
|
+
box-shadow: var(--cp-nav-drawer-shadow, 8px 0 32px rgba(0, 0, 0, 0.3));
|
|
77
|
+
animation: cp-nav-drawer-slide-in 0.22s cubic-bezier(0.2, 0.6, 0.2, 1) forwards;
|
|
78
|
+
overflow-y: auto;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.cp-nav-drawer__header {
|
|
82
|
+
display: flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
justify-content: space-between;
|
|
85
|
+
padding: 16px 20px;
|
|
86
|
+
border-bottom: 1px solid var(--cp-c-divider);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.cp-nav-drawer__title {
|
|
90
|
+
font-family: var(--cp-font-family-base);
|
|
91
|
+
font-size: 14px;
|
|
92
|
+
font-weight: 600;
|
|
93
|
+
text-transform: uppercase;
|
|
94
|
+
letter-spacing: 0.04em;
|
|
95
|
+
color: var(--cp-c-text-3);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.cp-nav-drawer__close {
|
|
99
|
+
display: inline-flex;
|
|
100
|
+
align-items: center;
|
|
101
|
+
justify-content: center;
|
|
102
|
+
width: 32px;
|
|
103
|
+
height: 32px;
|
|
104
|
+
background: transparent;
|
|
105
|
+
border: 1px solid var(--cp-c-border);
|
|
106
|
+
border-radius: 6px;
|
|
107
|
+
color: var(--cp-c-text-2);
|
|
108
|
+
cursor: pointer;
|
|
109
|
+
transition:
|
|
110
|
+
color 0.15s ease,
|
|
111
|
+
border-color 0.15s ease;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.cp-nav-drawer__close:hover {
|
|
115
|
+
border-color: var(--cp-c-brand-1);
|
|
116
|
+
color: var(--cp-c-brand-1);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.cp-nav-drawer__nav {
|
|
120
|
+
display: flex;
|
|
121
|
+
flex-direction: column;
|
|
122
|
+
padding: 12px 8px;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.cp-nav-drawer__link {
|
|
126
|
+
display: block;
|
|
127
|
+
padding: 12px 16px;
|
|
128
|
+
border-radius: 8px;
|
|
129
|
+
color: var(--cp-c-text-1);
|
|
130
|
+
font-size: 15px;
|
|
131
|
+
font-weight: 500;
|
|
132
|
+
text-decoration: none;
|
|
133
|
+
transition:
|
|
134
|
+
background 0.12s ease,
|
|
135
|
+
color 0.12s ease;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.cp-nav-drawer__link:hover {
|
|
139
|
+
background: var(--cp-c-bg-soft);
|
|
140
|
+
color: var(--cp-c-brand-1);
|
|
141
|
+
text-decoration: none;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.cp-nav-drawer__divider {
|
|
145
|
+
height: 1px;
|
|
146
|
+
margin: 4px 20px;
|
|
147
|
+
background: var(--cp-c-divider);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.cp-nav-drawer__row {
|
|
151
|
+
display: flex;
|
|
152
|
+
align-items: center;
|
|
153
|
+
justify-content: space-between;
|
|
154
|
+
padding: 12px 20px;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.cp-nav-drawer__row-label {
|
|
158
|
+
font-size: 12px;
|
|
159
|
+
font-weight: 600;
|
|
160
|
+
text-transform: uppercase;
|
|
161
|
+
letter-spacing: 0.04em;
|
|
162
|
+
color: var(--cp-c-text-3);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.cp-nav-drawer__footer {
|
|
166
|
+
margin-top: auto;
|
|
167
|
+
padding: 16px 20px;
|
|
168
|
+
border-top: 1px solid var(--cp-c-divider);
|
|
169
|
+
display: flex;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.cp-nav-drawer__footer > .cp-topbar-cta {
|
|
173
|
+
flex: 1;
|
|
174
|
+
justify-content: center;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
@keyframes cp-nav-drawer-fade-in {
|
|
178
|
+
from {
|
|
179
|
+
opacity: 0;
|
|
180
|
+
}
|
|
181
|
+
to {
|
|
182
|
+
opacity: 1;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
@keyframes cp-nav-drawer-slide-in {
|
|
187
|
+
from {
|
|
188
|
+
transform: translateX(-100%);
|
|
189
|
+
}
|
|
190
|
+
to {
|
|
191
|
+
transform: translateX(0);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
import type React from 'react'
|
|
3
|
+
import { Dialog, Modal, ModalOverlay } from 'react-aria-components'
|
|
4
|
+
|
|
5
|
+
import { RouteLink } from '../../lib/route-link.tsx'
|
|
6
|
+
import { Icon } from '../shared/icon.tsx'
|
|
7
|
+
import type { CiderpressNavMenuItem } from './ciderpress-nav-menu'
|
|
8
|
+
import { CiderpressNavSocialLinks } from './ciderpress-nav-social-links'
|
|
9
|
+
import type { CiderpressSocialLink } from './ciderpress-nav-social-links'
|
|
10
|
+
import { TopbarCTA } from './topbar-cta'
|
|
11
|
+
import { VariantToggle } from './variant-toggle'
|
|
12
|
+
|
|
13
|
+
import './ciderpress-nav-hamburger.css'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Props for the mobile hamburger menu.
|
|
17
|
+
*/
|
|
18
|
+
export interface CiderpressNavHamburgerProps {
|
|
19
|
+
readonly navItems: readonly CiderpressNavMenuItem[]
|
|
20
|
+
readonly socialLinks: readonly CiderpressSocialLink[]
|
|
21
|
+
readonly topbarCta: { readonly text: string; readonly href: string } | undefined
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Mobile hamburger trigger + slide-in drawer. Shown only at narrow
|
|
26
|
+
* viewports (CSS-driven via `--cp-nav-hamburger-breakpoint`). Drawer
|
|
27
|
+
* surfaces the full primary nav, variant toggle, social cluster, and
|
|
28
|
+
* CTA on screens where the desktop chrome can't fit.
|
|
29
|
+
*
|
|
30
|
+
* Built on `react-aria-components` `<ModalOverlay>` + `<Dialog>`, which
|
|
31
|
+
* provides a proper focus trap, focus restoration to the trigger,
|
|
32
|
+
* inert/aria-hidden on the rest of the page, ESC dismissal, and
|
|
33
|
+
* scroll-locking. Hand-rolling that correctly is famously hard, so we
|
|
34
|
+
* delegate.
|
|
35
|
+
*
|
|
36
|
+
* @param props - Nav items / social / CTA configuration
|
|
37
|
+
* @returns Hamburger button (mobile) + drawer (when open)
|
|
38
|
+
*/
|
|
39
|
+
export function CiderpressNavHamburger(props: CiderpressNavHamburgerProps): React.ReactElement {
|
|
40
|
+
const [open, setOpen] = useState(false)
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<>
|
|
44
|
+
<button
|
|
45
|
+
type="button"
|
|
46
|
+
className="cp-nav-hamburger"
|
|
47
|
+
onClick={() => setOpen(true)}
|
|
48
|
+
aria-label="Open navigation menu"
|
|
49
|
+
aria-expanded={open}
|
|
50
|
+
>
|
|
51
|
+
<Icon icon="pixelarticons:menu" width={20} height={20} />
|
|
52
|
+
</button>
|
|
53
|
+
<ModalOverlay
|
|
54
|
+
className="cp-nav-drawer-root"
|
|
55
|
+
isOpen={open}
|
|
56
|
+
onOpenChange={setOpen}
|
|
57
|
+
isDismissable
|
|
58
|
+
>
|
|
59
|
+
<Modal className="cp-nav-drawer-modal">
|
|
60
|
+
<Dialog className="cp-nav-drawer" aria-label="Site navigation">
|
|
61
|
+
<header className="cp-nav-drawer__header">
|
|
62
|
+
<span className="cp-nav-drawer__title">Menu</span>
|
|
63
|
+
<button
|
|
64
|
+
type="button"
|
|
65
|
+
className="cp-nav-drawer__close"
|
|
66
|
+
onClick={() => setOpen(false)}
|
|
67
|
+
aria-label="Close navigation menu"
|
|
68
|
+
>
|
|
69
|
+
<Icon icon="pixelarticons:close" width={18} height={18} />
|
|
70
|
+
</button>
|
|
71
|
+
</header>
|
|
72
|
+
|
|
73
|
+
<nav className="cp-nav-drawer__nav" aria-label="Primary">
|
|
74
|
+
{props.navItems.map((item) => (
|
|
75
|
+
<RouteLink
|
|
76
|
+
key={item.link}
|
|
77
|
+
href={item.link}
|
|
78
|
+
className="cp-nav-drawer__link"
|
|
79
|
+
onClick={() => setOpen(false)}
|
|
80
|
+
>
|
|
81
|
+
{item.text}
|
|
82
|
+
</RouteLink>
|
|
83
|
+
))}
|
|
84
|
+
</nav>
|
|
85
|
+
|
|
86
|
+
<div className="cp-nav-drawer__divider" />
|
|
87
|
+
|
|
88
|
+
<div className="cp-nav-drawer__row">
|
|
89
|
+
<span className="cp-nav-drawer__row-label">Theme</span>
|
|
90
|
+
<VariantToggle />
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
{props.socialLinks.length > 0 && (
|
|
94
|
+
<div className="cp-nav-drawer__row">
|
|
95
|
+
<span className="cp-nav-drawer__row-label">Links</span>
|
|
96
|
+
<CiderpressNavSocialLinks links={props.socialLinks} />
|
|
97
|
+
</div>
|
|
98
|
+
)}
|
|
99
|
+
|
|
100
|
+
{props.topbarCta !== undefined && (
|
|
101
|
+
<div className="cp-nav-drawer__footer">
|
|
102
|
+
<TopbarCTA text={props.topbarCta.text} href={props.topbarCta.href} />
|
|
103
|
+
</div>
|
|
104
|
+
)}
|
|
105
|
+
</Dialog>
|
|
106
|
+
</Modal>
|
|
107
|
+
</ModalOverlay>
|
|
108
|
+
</>
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export { CiderpressNavHamburger as default }
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiderpressNavMenu — primary topbar nav with overflow → dropdown.
|
|
3
|
+
*
|
|
4
|
+
* Theme-author API (all overridable per theme):
|
|
5
|
+
* --cp-nav-menu-gap inline gap between items (default 16px)
|
|
6
|
+
* --cp-nav-menu-item-padding-x horizontal padding inside each item
|
|
7
|
+
* --cp-nav-menu-item-color item text colour
|
|
8
|
+
* --cp-nav-menu-item-color-hover item text colour on hover
|
|
9
|
+
* --cp-nav-menu-item-color-active item text colour on the active route
|
|
10
|
+
* --cp-nav-menu-item-font-size item font size
|
|
11
|
+
* --cp-nav-menu-item-font-weight item font weight
|
|
12
|
+
* --cp-nav-menu-overflow-bg overflow popover surface colour
|
|
13
|
+
* --cp-nav-menu-overflow-border overflow popover border colour
|
|
14
|
+
*/
|
|
15
|
+
.cp-nav-menu {
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
gap: var(--cp-nav-menu-gap, 16px);
|
|
19
|
+
/* Take the full width of the parent wrapper so that
|
|
20
|
+
`container.clientWidth` (used by the ResizeObserver) reflects the
|
|
21
|
+
actual space available for items, not just the natural width of
|
|
22
|
+
whatever items happen to currently render. Without this the menu
|
|
23
|
+
shrinks to fit its content, reports a tiny available width, and
|
|
24
|
+
collapses every item into the overflow popover. */
|
|
25
|
+
flex: 1 1 auto;
|
|
26
|
+
width: 100%;
|
|
27
|
+
min-width: 0;
|
|
28
|
+
white-space: nowrap;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.cp-nav-menu__item {
|
|
32
|
+
display: inline-flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
padding: 0 var(--cp-nav-menu-item-padding-x, 4px);
|
|
35
|
+
color: var(--cp-nav-menu-item-color, var(--cp-c-text-2, #cdd6f4));
|
|
36
|
+
font-size: var(--cp-nav-menu-item-font-size, 13px);
|
|
37
|
+
font-weight: var(--cp-nav-menu-item-font-weight, 500);
|
|
38
|
+
line-height: 1;
|
|
39
|
+
text-decoration: none;
|
|
40
|
+
white-space: nowrap;
|
|
41
|
+
transition: color 0.15s ease;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.cp-nav-menu__item:hover {
|
|
45
|
+
color: var(--cp-nav-menu-item-color-hover, var(--cp-c-brand-1, currentColor));
|
|
46
|
+
text-decoration: none;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.cp-nav-menu__item--active {
|
|
50
|
+
color: var(--cp-nav-menu-item-color-active, var(--cp-c-brand-1, currentColor));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* ── Hidden measurement layer ──────────────────────────────────────────
|
|
54
|
+
Renders every item at full natural width so the JS layer always has
|
|
55
|
+
a stable per-item measurement no matter how narrow the live menu
|
|
56
|
+
gets. `position: absolute` + `visibility: hidden` keeps it out of
|
|
57
|
+
the layout flow while remaining measurable. */
|
|
58
|
+
.cp-nav-menu-measure {
|
|
59
|
+
position: absolute;
|
|
60
|
+
visibility: hidden;
|
|
61
|
+
pointer-events: none;
|
|
62
|
+
display: inline-flex;
|
|
63
|
+
gap: var(--cp-nav-menu-gap, 16px);
|
|
64
|
+
white-space: nowrap;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* ── Overflow toggle + popover ─────────────────────────────────────── */
|
|
68
|
+
.cp-nav-menu__overflow {
|
|
69
|
+
position: relative;
|
|
70
|
+
display: inline-flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.cp-nav-menu__overflow-toggle {
|
|
75
|
+
display: inline-flex;
|
|
76
|
+
align-items: center;
|
|
77
|
+
gap: 4px;
|
|
78
|
+
padding: 0 var(--cp-nav-menu-item-padding-x, 4px);
|
|
79
|
+
background: transparent;
|
|
80
|
+
border: none;
|
|
81
|
+
color: var(--cp-nav-menu-item-color, var(--cp-c-text-2, #cdd6f4));
|
|
82
|
+
font-size: var(--cp-nav-menu-item-font-size, 13px);
|
|
83
|
+
font-weight: var(--cp-nav-menu-item-font-weight, 500);
|
|
84
|
+
line-height: 1;
|
|
85
|
+
cursor: pointer;
|
|
86
|
+
transition: color 0.15s ease;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.cp-nav-menu__overflow-toggle:hover {
|
|
90
|
+
color: var(--cp-nav-menu-item-color-hover, var(--cp-c-brand-1, currentColor));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.cp-nav-menu__overflow-popover {
|
|
94
|
+
position: absolute;
|
|
95
|
+
top: calc(100% + 6px);
|
|
96
|
+
right: 0;
|
|
97
|
+
z-index: 60;
|
|
98
|
+
min-width: 200px;
|
|
99
|
+
margin: 0;
|
|
100
|
+
padding: 6px;
|
|
101
|
+
list-style: none;
|
|
102
|
+
background: var(--cp-nav-menu-overflow-bg, var(--cp-c-bg, #1e1e2e));
|
|
103
|
+
border: 1px solid var(--cp-nav-menu-overflow-border, var(--cp-c-border, #313244));
|
|
104
|
+
border-radius: 8px;
|
|
105
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.24);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.cp-nav-menu__overflow-item {
|
|
109
|
+
display: block;
|
|
110
|
+
padding: 8px 12px;
|
|
111
|
+
border-radius: 6px;
|
|
112
|
+
color: var(--cp-nav-menu-item-color, var(--cp-c-text-2, #cdd6f4));
|
|
113
|
+
font-size: 13px;
|
|
114
|
+
font-weight: 500;
|
|
115
|
+
text-decoration: none;
|
|
116
|
+
white-space: nowrap;
|
|
117
|
+
transition:
|
|
118
|
+
background 0.1s ease,
|
|
119
|
+
color 0.1s ease;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.cp-nav-menu__overflow-item:hover {
|
|
123
|
+
background: var(--cp-c-bg-soft, rgba(255, 255, 255, 0.04));
|
|
124
|
+
color: var(--cp-nav-menu-item-color-hover, var(--cp-c-brand-1, currentColor));
|
|
125
|
+
text-decoration: none;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.cp-nav-menu__overflow-item--active {
|
|
129
|
+
color: var(--cp-nav-menu-item-color-active, var(--cp-c-brand-1, currentColor));
|
|
130
|
+
}
|