@ciderpress/theme
1.0.0-rc.8
Patch Changes
- f76385d: Reduce install size by removing unused dependencies from the CLI, config, theme, and UI packages.
1.0.0-rc.7
Patch Changes
- c65bb52: Keep Ciderpress compatible with current documentation tooling while preserving CLI option discovery and parsing across commands.
1.0.0-rc.6
Major Changes
-
Rename to
ciderpress. The project moved to thethebytefarmorg and the kit now lives at the unscopedciderpresspackage name (replacing@zpress/kit).Consumer migration:
@zpress/cli→@ciderpress/cli@zpress/config→@ciderpress/config@zpress/ui→@ciderpress/ui@zpress/theme→@ciderpress/theme@zpress/templates→@ciderpress/templates@zpress/kit→ciderpress(unscoped)zpress.config.ts→ciderpress.config.ts- Window globals:
__ZPRESS_*__→__CIDERPRESS_*__ - CSS vars:
--zp-*→--cp-*
The
@zpress/*packages are not republished —@ciderpress/*starts fresh at this version. Tagline: press your docs. -
ciderpress 1.0 — release candidate
This is a major release that locks the v1 public API. Headline changes:
Theme system
- Replaced the built-in
basetheme with apple-named built-ins:honeycrisp(red, dark + light — the canonical brand),grannysmith(green, dark + light),midnight(deep dark blue, dark only), andarcade(neon green, dark only). The legacy slug'default'aliases to'honeycrisp'viaTHEME_ALIASES. - Replaced
theme.colorModewiththeme.variant(values:'dark' | 'light'). The'toggle'value is no longer supported — themes that declare both variants always show the toggle; themes that declare one hide it. defineTheme()input shape changed from{ name, tokens, modes, defaultMode }to{ name, variants: { dark?, light? }, defaultVariant? }. The factory validates the envelope before parsing token trees so error messages now point at the offending input field.ciderpress,@ciderpress/core, and@ciderpress/configno longer re-exportColorMode,ThemeMode,COLOR_MODES, orresolveDefaultColorMode. UseThemeVariant,THEME_VARIANTS, andresolveDefaultVariantfrom@ciderpress/theme. The deprecated aliases remain in@ciderpress/themeitself for one-version migration safety.
Config surface
Frontmatteris now strict — unknown keys are rejected at config load and produce a typed compile-time error. On-disk markdown frontmatter is unaffected (gray-matter never typed it asFrontmatter).- Renamed
WorkspaceCategory→WorkspaceGroup. Theconfig.workspacesfield name is unchanged. - Every field on
CiderpressConfigand its sub-types now has solid JSDoc that propagates to IDE hover docs. - Tightened the CLI
--color-modeschema fromstringtoenum('dark', 'light').
Dependency hygiene
- Removed
gray-matter(last released 2021, drags in the abandonedjs-yaml@3line with known prototype-pollution CVEs). Replaced with a ~25-lineparse/stringifyhelper built onyaml(eemeli/yaml). - Removed unused
js-yamland@types/js-yamldirect deps from@ciderpress/core.
Fixes
safe-url.tsregex now stores its control-character range as Unicode escape sequences (\u0000–\u007F) instead of raw control bytes. Git no longer marks the file as binary; editors render it correctly.- Deleted orphaned
packages/ui/src/head/js/color-mode-{dark,light}.js. - Hardened variant resolution across the head IIFE, theme provider, and theme switcher with cross-reference comments and a re-entrancy guard on the MutationObserver snap-back.
Migration
- Replaced the built-in
Minor Changes
-
Custom theme fonts reach every surface, including the homepage hero
A theme's
fonts.familynow drives the whole site. Previously a custom theme could setsansandmonoand see them apply to documentation pages while the hero, nav, and feature cards stayed on the built-in stacks.Two things caused that. Component CSS hardcoded font stacks (the feature card title was pinned to
Geist Pixel Square), and the canonical tokens were derived from the hardcoded compatibility variables rather than the other way round, so a theme value could never win. The dependency is now inverted:--cp-font-family-*and--rp-font-family-*all resolve through--cp-ff-sans,--cp-ff-mono, and--cp-ff-display.Rspress ships an unlayered
body { font-family: var(--rp-font-family-base) }, and an unlayered rule outranks anything in a cascade layer no matter how specific. Rather than fight that, themes now set--rp-font-family-base, so Rspress's own rule resolves to the theme's font.The slots are:
sansbase UI and prose: body, nav, sidebar, hero headlinemonocode, terminal chrome, eyebrow labelsdisplayoptional decorative face, falls back tosans
displayis new and optional. Built-in themes keep their current appearance:sansstays proportional andmonoowns code.
Patch Changes
-
Stop brand accent copy washing out to pink on dark, and fix eyebrow contrast
**emphasis**in display copy resolves to.cp-accent, which on dark took--cp-c-brand-lighter— the palest rung of the brand ramp. It cleared contrast by a wide margin (10.43:1 on honeycrisp) but washed the hue out: a light red reads as pink rather than as the brand.Dark accents now take
--cp-c-brand-light, the most saturated rung that still clears 4.5:1. Every theme gets a more brand-coloured accent — amber#fcd34d→#fbbf24, grannysmith#bef264→#a3e635, midnight#bfdbfe→#93c5fd, arcade#99ffcc→#66ffbb. Light variants keep--cp-c-brand-2and are unchanged.Both red themes needed their
lightrung retuned, because red 400 was itself the salmon being complained about and red 600 missed the bar:- honeycrisp
brand.light#f87171(red 400) →#ef4444(red 500) - mulled
brand.light#dc2626(red 600, 4.10:1 — under the bar) →#ef4444(red 500, 5.26:1)
Both still sit between
primaryandlighter, so the ramp ordering holds, and button hover states still lighten their base.Separately, the three home eyebrows (
.cp-feature-section-head__eyebrow,.cp-cta__eyebrow,.cp-split__eyebrow) coloured themselves from--cp-c-brand-1. That token is a fill colour — tuned to sit behind--cp-c-brand-fg, not to be read as text. At the 11px eyebrow size the 4.5:1 bar applies and it missed in four theme/variant pairs: 2.38:1 on mulled dark, 4.10:1 on honeycrisp dark, 3.07:1 on amber light, 3.09:1 on grannysmith light. They now follow the same pair as.cp-accent.Every theme/variant pair now clears 4.5:1, the lowest being 4.83:1 on amber light.
- honeycrisp
-
Upgrade dependencies to latest across the workspace.
- Catalog:
@rslib/core^0.23.1,@rspress/core^2.0.15,@typescript/native-preview7.0.0-dev.20260628.1,vitest^4.1.9 - CLI:
@clack/prompts^1.6.0,ink^7.1.0,liquidjs^10.27.1 - UI:
react-aria-components^1.19.0,esbuild^0.28.1, iconify icon sets (material-icon-theme,simple-icons,vscode-icons) - Tooling:
oxlint^1.71.0,oxfmt^0.56.0,turbo^2.10.0,@microsoft/api-extractor^7.58.9,eslint-plugin-jsdoc^63.0.10,eslint-plugin-security^4.0.1,@types/node^26.0.1 - E2E:
@playwright/test^1.61.1,@argos-ci/playwright^7.1.1 - Benchmarks:
@codspeed/vitest-plugin^5.7.1
mermaidstays pinned at ^10.9.6 — v11 uses langium for parsing and breaks Rspress's webpack compilation of global components. - Catalog:
-
Upgrade dependencies to latest across the workspace, and fix Mermaid rendering on Mermaid v11.
- Catalog:
@rspress/core^2.0.16,@typescript/native-preview7.0.0-dev.20260707.2,type-fest^5.8.0,vitest^4.1.10 - UI:
mermaid^11.16.0 (was v10), iconify icon sets - CLI:
@clack/prompts^1.7.0 - Config:
tsx^4.23.0,@types/node^26.1.0 - Tooling:
oxlint^1.73.0,oxfmt^0.58.0,turbo^2.10.4
@rslib/coreis held at0.23.1: 0.23.2 regressed the ESM build (emitted.jsinstead of.mjsand dropped the bundled type declarations).Mermaid is now on v11 — the previous v10 pin was based on a misdiagnosis.
mermaid.render()resolves correctly on v11; the blank-diagram symptom was a defect inMermaidRenderer.tsx:configdefaulted to a fresh{}each render, re-firing the render effect in a loop that repeatedly rendered into the same element id and clobbered the injected SVG. Fixed by keying the render callback on a serialized config value and using a unique element id per render call. Diagrams now paint on first load without interaction and survive theme toggles. - Catalog:
-
Test/exercise the CI release pipeline.
No code changes — this changeset only exists to force the changesets bot to open a release PR, validate that the GitHub Actions workflow can publish via npm trusted publishing (no
NPM_TOKEN, OIDC-only withid-token: write+NPM_CONFIG_PROVENANCE: true), and confirm provenance attestations land on the resulting1.0.0-rc.2releases. Following the local bootstrap publish of1.0.0-rc.1, this is the first CI-driven cut. -
d8da2eb: Upgrade runtime and build dependencies to their latest compatible releases.
This includes TypeScript 7, Rslib 0.23.2, React 19.2.8, and the current workspace toolchain. Improve compatibility with current TypeScript, React, and Rspress releases.
-
Upgrade dependencies to latest across the workspace.
- Catalog:
@rslib/core^0.21.5,@rspress/core^2.0.12,@typescript/native-preview7.0.0-dev.20260519.1,vitest^4.1.7,zod^4.4.3 - CLI:
@clack/prompts^1.4.0,@kidd-cli/core^0.24.0,ink^7.0.3,jiti^2.7.0,liquidjs^10.27.0 - UI:
katex^0.16.47,openapi-sampler^1.7.3,ts-morph^28.0.0, iconify icon sets, React 19.2.6 - Config:
c124.0.0-beta.5,tsx^4.22.3 - Tooling:
oxlint^1.66.0,oxfmt^0.51.0,turbo^2.9.14,@types/node^25.9.1,@types/react^19.2.15
mermaidstays pinned at ^10.9.5 — v11 uses langium for parsing and breaks Rspress's webpack compilation of global components. - Catalog:
-
Post-rc.0 fixes ahead of the next pre-release tag.
@ciderpress/ui
- Restored the theme-aware
<CiderpressLogo />SVG in the navbar. Root cause: webpack's CJS-flavored resolver couldn't loadciderpress/@ciderpress/uibecause their.exports only declaredimport— the client bundle was crashing entirely, so theNavLogoportal never hydrated. Aliased both viaimport.meta.resolveincreateRspressConfig. - Single-variant themes now hide the appearance toggle. The CSS rule was
inside
@layer ciderpress.overridesand was losing to Rspress's unlayered defaults; hoisted it out of the layer. - Feature card grids inside MDX doc pages no longer pick up the home-page section's 32px horizontal padding, so cards align with body prose.
- New:
pageType: 'blank'frontmatter now suppresses the site footer (Rspress already skipped the navbar). Blank pages are fully chromeless — use for marketing landings inside a docs deployment.
Repo
- Deleted
@ciderpress/coreand redistributed its sync engine into@ciderpress/cli/liband its config loader into@ciderpress/config/loader. The package is no longer published. Imports must move accordingly:import { loadConfig } from '@ciderpress/core'→from '@ciderpress/config/loader'- sync engine internals are no longer a public surface.
- Swapped
ts-pattern+es-toolkitdirect usage formassaman/matchandmassaman/*subpaths across all packages.
- Restored the theme-aware
1.0.0-rc.5
Minor Changes
-
583fecc: Custom theme fonts reach every surface, including the homepage hero
A theme's
fonts.familynow drives the whole site. Previously a custom theme could setsansandmonoand see them apply to documentation pages while the hero, nav, and feature cards stayed on the built-in stacks.Two things caused that. Component CSS hardcoded font stacks (the feature card title was pinned to
Geist Pixel Square), and the canonical tokens were derived from the hardcoded compatibility variables rather than the other way round, so a theme value could never win. The dependency is now inverted:--cp-font-family-*and--rp-font-family-*all resolve through--cp-ff-sans,--cp-ff-mono, and--cp-ff-display.Rspress ships an unlayered
body { font-family: var(--rp-font-family-base) }, and an unlayered rule outranks anything in a cascade layer no matter how specific. Rather than fight that, themes now set--rp-font-family-base, so Rspress's own rule resolves to the theme's font.The slots are:
sansbase UI and prose: body, nav, sidebar, hero headlinemonocode, terminal chrome, eyebrow labelsdisplayoptional decorative face, falls back tosans
displayis new and optional. Built-in themes keep their current appearance:sansstays proportional andmonoowns code.
Patch Changes
-
583fecc: Stop brand accent copy washing out to pink on dark, and fix eyebrow contrast
**emphasis**in display copy resolves to.cp-accent, which on dark took--cp-c-brand-lighter— the palest rung of the brand ramp. It cleared contrast by a wide margin (10.43:1 on honeycrisp) but washed the hue out: a light red reads as pink rather than as the brand.Dark accents now take
--cp-c-brand-light, the most saturated rung that still clears 4.5:1. Every theme gets a more brand-coloured accent — amber#fcd34d→#fbbf24, grannysmith#bef264→#a3e635, midnight#bfdbfe→#93c5fd, arcade#99ffcc→#66ffbb. Light variants keep--cp-c-brand-2and are unchanged.Both red themes needed their
lightrung retuned, because red 400 was itself the salmon being complained about and red 600 missed the bar:- honeycrisp
brand.light#f87171(red 400) →#ef4444(red 500) - mulled
brand.light#dc2626(red 600, 4.10:1 — under the bar) →#ef4444(red 500, 5.26:1)
Both still sit between
primaryandlighter, so the ramp ordering holds, and button hover states still lighten their base.Separately, the three home eyebrows (
.cp-feature-section-head__eyebrow,.cp-cta__eyebrow,.cp-split__eyebrow) coloured themselves from--cp-c-brand-1. That token is a fill colour — tuned to sit behind--cp-c-brand-fg, not to be read as text. At the 11px eyebrow size the 4.5:1 bar applies and it missed in four theme/variant pairs: 2.38:1 on mulled dark, 4.10:1 on honeycrisp dark, 3.07:1 on amber light, 3.09:1 on grannysmith light. They now follow the same pair as.cp-accent.Every theme/variant pair now clears 4.5:1, the lowest being 4.83:1 on amber light.
- honeycrisp
1.0.0-rc.4
Patch Changes
-
6edf324: Upgrade dependencies to latest across the workspace, and fix Mermaid rendering on Mermaid v11.
- Catalog:
@rspress/core^2.0.16,@typescript/native-preview7.0.0-dev.20260707.2,type-fest^5.8.0,vitest^4.1.10 - UI:
mermaid^11.16.0 (was v10), iconify icon sets - CLI:
@clack/prompts^1.7.0 - Config:
tsx^4.23.0,@types/node^26.1.0 - Tooling:
oxlint^1.73.0,oxfmt^0.58.0,turbo^2.10.4
@rslib/coreis held at0.23.1: 0.23.2 regressed the ESM build (emitted.jsinstead of.mjsand dropped the bundled type declarations).Mermaid is now on v11 — the previous v10 pin was based on a misdiagnosis.
mermaid.render()resolves correctly on v11; the blank-diagram symptom was a defect inMermaidRenderer.tsx:configdefaulted to a fresh{}each render, re-firing the render effect in a loop that repeatedly rendered into the same element id and clobbered the injected SVG. Fixed by keying the render callback on a serialized config value and using a unique element id per render call. Diagrams now paint on first load without interaction and survive theme toggles. - Catalog:
1.0.0-rc.3
Patch Changes
-
5c3e841: Upgrade dependencies to latest across the workspace.
- Catalog:
@rslib/core^0.23.1,@rspress/core^2.0.15,@typescript/native-preview7.0.0-dev.20260628.1,vitest^4.1.9 - CLI:
@clack/prompts^1.6.0,ink^7.1.0,liquidjs^10.27.1 - UI:
react-aria-components^1.19.0,esbuild^0.28.1, iconify icon sets (material-icon-theme,simple-icons,vscode-icons) - Tooling:
oxlint^1.71.0,oxfmt^0.56.0,turbo^2.10.0,@microsoft/api-extractor^7.58.9,eslint-plugin-jsdoc^63.0.10,eslint-plugin-security^4.0.1,@types/node^26.0.1 - E2E:
@playwright/test^1.61.1,@argos-ci/playwright^7.1.1 - Benchmarks:
@codspeed/vitest-plugin^5.7.1
mermaidstays pinned at ^10.9.6 — v11 uses langium for parsing and breaks Rspress's webpack compilation of global components. - Catalog:
1.0.0-rc.2
Patch Changes
-
e4d81aa: Test/exercise the CI release pipeline.
No code changes — this changeset only exists to force the changesets bot to open a release PR, validate that the GitHub Actions workflow can publish via npm trusted publishing (no
NPM_TOKEN, OIDC-only withid-token: write+NPM_CONFIG_PROVENANCE: true), and confirm provenance attestations land on the resulting1.0.0-rc.2releases. Following the local bootstrap publish of1.0.0-rc.1, this is the first CI-driven cut.
1.0.0-rc.1
Major Changes
-
0a651df: Rename to
ciderpress. The project moved to thethebytefarmorg and the kit now lives at the unscopedciderpresspackage name (replacing@zpress/kit).Consumer migration:
@zpress/cli→@ciderpress/cli@zpress/config→@ciderpress/config@zpress/ui→@ciderpress/ui@zpress/theme→@ciderpress/theme@zpress/templates→@ciderpress/templates@zpress/kit→ciderpress(unscoped)zpress.config.ts→ciderpress.config.ts- Window globals:
__ZPRESS_*__→__CIDERPRESS_*__ - CSS vars:
--zp-*→--cp-*
The
@zpress/*packages are not republished —@ciderpress/*starts fresh at this version. Tagline: press your docs.
1.0.0-rc.0
Major Changes
-
ciderpress 1.0 — release candidate
This is a major release that locks the v1 public API. Headline changes:
Theme system
- Renamed the built-in
basetheme tohoneycrisp(apple red, the canonical brand theme) and addedgrannysmith(apple green) as a second apple-themed default. Both ship withdarkandlightvariants; the sun/moon toggle swaps between them. The legacy slug'default'aliases to'honeycrisp'viaTHEME_ALIASESfor backward compatibility. The full built-in roster is nowhoneycrisp,grannysmith,midnight, andarcade. - Replaced
theme.colorModewiththeme.variant(values:'dark' | 'light'). The'toggle'value is no longer supported — themes that declare both variants always show the toggle; themes that declare one hide it. defineTheme()input shape changed from{ name, tokens, modes, defaultMode }to{ name, variants: { dark?, light? }, defaultVariant? }. The factory validates the envelope before parsing token trees so error messages now point at the offending input field.ciderpressand@ciderpress/configno longer re-exportColorMode,ThemeMode,COLOR_MODES, orresolveDefaultColorMode. UseThemeVariant,THEME_VARIANTS, andresolveDefaultVariantfrom@ciderpress/theme. The deprecated aliases remain in@ciderpress/themeitself for one-version migration safety.
Config surface
Frontmatteris now strict — unknown keys are rejected at config load and produce a typed compile-time error. On-disk markdown frontmatter is unaffected (gray-matter never typed it asFrontmatter).- Renamed
WorkspaceCategory→WorkspaceGroup. Theconfig.workspacesfield name is unchanged. - Every field on
CiderpressConfigand its sub-types now has solid JSDoc that propagates to IDE hover docs. - Tightened the CLI
--color-modeschema fromstringtoenum('dark', 'light').
Dependency hygiene
- Removed
gray-matter(last released 2021, drags in the abandonedjs-yaml@3line with known prototype-pollution CVEs). Replaced with a ~25-lineparse/stringifyhelper built onyaml(eemeli/yaml). - Removed unused
js-yamland@types/js-yamldirect deps from@ciderpress/cli.
Fixes
safe-url.tsregex is now stored with�- escape sequences instead of raw control bytes. Git no longer marks the file as binary; editors render it correctly.- Deleted orphaned
packages/ui/src/head/js/color-mode-{dark,light}.js. - Hardened variant resolution across the head IIFE, theme provider, and theme switcher with cross-reference comments and a re-entrancy guard on the MutationObserver snap-back.
Migration
- Renamed the built-in
0.3.2
Patch Changes
- b912b2d: Update and add READMEs
0.3.1
Patch Changes
-
3e7a28a: Enforce consistent file structure conventions across all packages and upgrade dependencies to latest versions.
File Structure
Apply a standardized file layout pattern to every source file in the monorepo:
- Exports first: All exported functions, constants, and types appear at the top of each file immediately after imports.
- Private separator: Non-exported (private) helper functions are placed below a
// --- Private ---section separator comment. - Complete JSDoc: Every function now has full JSDoc documentation including
@paramand@returnstags. Non-exported helpers include the@privatetag. - Spacing cleanup: Removed inconsistent double blank lines between declarations across all packages.
Test Colocation
Moved all test files from
packages/*/test/directories to sit alongside their source files inpackages/*/src/:packages/cli/test/→packages/cli/src/lib/packages/config/test/→packages/config/src/packages/core/test/→packages/core/src/(includingsync/andsync/sidebar/subdirectories)packages/templates/test/→packages/templates/src/packages/theme/test/→packages/theme/src/packages/ui/test/→packages/ui/src/
Standards
Updated
.claude/rules/typescript.mdto codify the file structure conventions so all future code follows the same pattern.Dependency Upgrades
oxlint1.55.0 → 1.56.0oxfmt0.40.0 → 0.41.0@kidd-cli/core0.4.0 → 0.7.0c124.0.0-beta.3 → 4.0.0-beta.4laufen1.1.0 → 1.2.1@iconify-json/material-icon-theme1.2.55 → 1.2.56@iconify-json/simple-icons1.2.73 → 1.2.74
0.3.0
Minor Changes
- c57ab70: Add per-theme
modessupport to declare supported color modes (dark, light, or both) and hide the appearance toggle for single-mode themes like arcade and midnight
Patch Changes
- 1b3b8e3: Add vitest test infrastructure and 122 unit tests across all packages
0.2.1
Patch Changes
- 6df5ab7: fix(packages/core): map nav items with
textinstead oftitlefor Rspress compatibility fix(packages/ui): inject critical CSS via Rsbuildhtml.tagsso loading screen works in dev mode fix(packages/ui): re-enabledata-cp-readydismiss flag in ThemeProvider fix(packages/ui): replace pong/invaders loaders with simple dots loader fix(packages/theme): removearcade-fxas standalone theme (effects already apply with arcade)
0.2.0
Minor Changes
-
2055c1a: New Packages: @ciderpress/theme and @ciderpress/config
This release introduces two new packages that refactor configuration and theme management:
@ciderpress/theme - Theme definitions and utilities
- Type-safe theme definitions with
LiteralUnionpattern for autocomplete + extensibility - Built-in themes:
base,midnight,arcade,arcade-fx - Icon color types with autocomplete support
- Zod schemas for theme validation
- Utility functions:
resolveDefaultColorMode,isBuiltInTheme,isBuiltInIconColor
@ciderpress/config - Configuration loading and validation
- Multi-format config support:
.ts,.js,.json,.jsonc,.yml,.yaml - Type-safe
defineConfighelper loadConfigfunction with Result-based error handling- Zod schemas for complete config validation
- JSON Schema generation for IDE autocomplete (
@ciderpress/config/schema) - Re-exports theme utilities for convenience
@ciderpress/core - Internal refactoring
- Removed direct
c12dependency - Now re-exports config and theme utilities from
@ciderpress/config - Public API remains backwards compatible
- Added new exports:
ICON_COLORS,ConfigErrorType,LoadConfigOptions
@ciderpress/ui - Dependency updates
- Removed
@ciderpress/coredependency for config types - Now uses
@ciderpress/configand@ciderpress/themedirectly - Added support for custom themes with fallback to 'toggle' color mode
- Fixed: Added
arcade-fxtheme to theme switcher
Migration Guide
For most users, this is a drop-in replacement with no migration needed. All existing imports from
@ciderpress/corecontinue to work.If you were importing from internal paths, update as follows:
JSON/YAML Config Support
You can now use JSON or YAML config files with IDE autocomplete:
Custom Themes
The
ThemeNametype now supports custom theme names with autocomplete for built-ins: - Type-safe theme definitions with