Files
zooqueen b605993234 Zen is the family across every app, example and static page
The docs estate declared its typeface in 30 root layouts and one linked
stylesheet, each pulling a third-party family off a hosted font CDN on the
critical path of every route. Two of those surfaces also self-hosted the
faces, so the same bytes were vendored by hand in the repo.

@hanzo/font 1.8.8 is where Zen is authored. It is now mounted the way this
repo already mounts every other package stylesheet — `@import '@hanzo/font/css'`
at the top of the app's own sheet — which declares the @font-face rules and
publishes --font-zen-sans / --font-zen-mono. A single :root block per app binds
those to --font-sans / --font-mono, the pair every rule and every font-*
utility already read, so the variable contract is untouched and the next face
swap is two lines rather than a sweep. Genuine system fallbacks stay.

Mounting through the sheet rather than a JS side-effect import also drops the
untyped bare subpath TypeScript could not resolve, so no per-app declaration
shim is needed.

public/reference/ is static HTML with no bundler, so it keeps its own
@font-face; scripts/sync-reference-fonts.ts copies the two variable faces out
of the installed package on each build and the directory is ignored, the same
rule public/openapi/ already follows. The hand-vendored faces are deleted.

Also corrects the brand typography table, which still named a face Hanzo does
not ship, and the three sample configs and two skill pages that repeated it.
2026-08-24 13:20:49 -07:00

141 lines
3.4 KiB
CSS

/**
* Proposals Documentation Theme
* Base styles for improvement proposals sites (LPs, HIPs, ZIPs)
*/
@import '@hanzo/font/css';
@import "tailwindcss";
@plugin "@tailwindcss/typography";
@custom-variant dark (&:is(.dark *));
/* Zen is the family. The import above declares the faces and publishes
--font-zen-sans / --font-zen-mono; they are spelled HERE and nowhere else,
bound to the --font-sans / --font-mono pair every rule and every font-*
utility already reads. This theme is `inline`, so the values land in the
utilities directly and a later :root would not reach them — bind in place. */
@theme inline {
--font-sans: var(--font-zen-sans), ui-sans-serif, system-ui, sans-serif;
--font-mono: var(--font-zen-mono), ui-monospace, SFMono-Regular, Menlo, monospace;
--radius: 0.5rem;
}
/* Search dialog animations */
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes zoom-in-95 {
from { transform: translate(-50%, 0) scale(0.95); }
to { transform: translate(-50%, 0) scale(1); }
}
.animate-in {
animation: fade-in 0.15s ease-out, zoom-in-95 0.15s ease-out;
}
.fade-in-0 {
animation: fade-in 0.15s ease-out;
}
.zoom-in-95 {
animation: zoom-in-95 0.15s ease-out;
}
/* Typography improvements */
main article h1 {
font-size: 2.25rem !important;
font-weight: 700 !important;
letter-spacing: -0.03em !important;
line-height: 1.15 !important;
margin-bottom: 1.25rem !important;
}
main article h2 {
font-size: 1.625rem !important;
font-weight: 600 !important;
letter-spacing: -0.025em !important;
line-height: 1.25 !important;
margin-top: 3rem !important;
margin-bottom: 1rem !important;
padding-bottom: 0.75rem !important;
border-bottom: 1px solid hsl(var(--fd-border) / 0.4) !important;
}
main article h3 {
font-size: 1.25rem !important;
font-weight: 600 !important;
letter-spacing: -0.02em !important;
margin-top: 2.25rem !important;
margin-bottom: 0.75rem !important;
}
main article p {
line-height: 1.8 !important;
margin-bottom: 1.5rem !important;
}
main article ul,
main article ol {
margin-bottom: 1.5rem !important;
padding-left: 1.75rem !important;
}
main article li {
line-height: 1.75 !important;
margin-bottom: 0.625rem !important;
}
/* Code blocks */
main article pre {
border-radius: 0.75rem !important;
padding: 1.25rem 1.5rem !important;
margin: 1.75rem 0 !important;
font-size: 0.875rem !important;
line-height: 1.65 !important;
overflow-x: auto !important;
}
main article :not(pre) > code {
font-size: 0.875em !important;
padding: 0.2em 0.45em !important;
border-radius: 0.375rem !important;
background: hsl(var(--fd-muted)) !important;
font-weight: 500 !important;
}
/* Tables */
main article table {
width: 100% !important;
margin: 2rem 0 !important;
border-collapse: collapse !important;
font-size: 0.9rem !important;
}
main article th,
main article td {
padding: 0.875rem 1.125rem !important;
border: 1px solid hsl(var(--fd-border) / 0.6) !important;
text-align: left !important;
}
main article th {
background: hsl(var(--fd-muted) / 0.4) !important;
font-weight: 600 !important;
}
/* Blockquotes */
main article blockquote {
border-left: 3px solid hsl(var(--fd-primary) / 0.3) !important;
padding: 0.75rem 1.5rem !important;
margin: 1.75rem 0 !important;
background: hsl(var(--fd-muted) / 0.3) !important;
border-radius: 0 0.5rem 0.5rem 0 !important;
}
main article blockquote p {
margin-bottom: 0 !important;
}