Files
pbakaus_impeccable/site/styles/docs-kinpaku.css
T
Paul BakausandGitHub 51d01e3a5f [codex] Add design-aware detector rules (#252)
* Add design-aware detector rules

* Fix design-aware detector noise

* Unify CLI and hook detector ignores

* Fix remaining design-system review findings

* Add detector ignore CLI

* Fix design detector review findings

* Fix design color source false positives

* Fix core test suite registration

* Add design-aware detector docs

* Fix font priority design-system parsing

* Fix color ignore value matching
2026-06-15 21:06:17 -07:00

1763 lines
43 KiB
CSS

/* ============================================================================
/docs — Neo Kinpaku redesign
Re-skins the docs index (/docs) and per-command detail (/docs/:slug) on the
dark lacquer kinpaku surface. Mirrors the /designing approach: remap the
generic light tokens (--color-paper, --color-cream, etc.) at the body class
so the inline visualizations from docs-visuals.css (.docs-viz-*) re-skin
into the dark theme without per-rule overrides.
Structure of this file mirrors the page structure:
1. Page scope + base
2. Sidebar (commands rail)
3. /docs index — categories + command tiles
4. /docs/:slug — breadcrumb, hero, related-commands footer
5. Prose body — markdown rendering on lacquer
6. Footer
============================================================================ */
@import "./kinpaku-tokens.css";
@import "./divider-patterns.css";
/* ============================================================================
1. PAGE SCOPE + BASE
============================================================================ */
.docs-kinpaku {
/* Surface/text/accent/font tokens default to kinpaku at :root now
(tokens.css), so the embedded docs-viz visualizations inherit dark
surfaces without a per-page remap. Only the --ks-muted alias (read by
name in this file) and the page shell remain. */
--ks-muted: var(--ks-text-muted);
--docs-accent: var(--ks-kinpaku);
--docs-accent-hover: var(--ks-kinpaku-pale);
--docs-accent-line: oklch(78% 0.12 82 / 0.42);
--docs-accent-wash: oklch(77% 0.13 82 / 0.10);
--docs-brand-accent: var(--ks-kinpaku);
--docs-panel-bg: var(--ks-lacquer-raised);
--docs-panel-hover-bg: oklch(11% 0.012 82);
background:
linear-gradient(180deg, oklch(7% 0.006 95), oklch(4% 0.004 95));
color: var(--ks-text);
font-family: var(--ks-font);
min-height: 100vh;
}
html.light .docs-kinpaku {
--ks-lacquer: oklch(100% 0 0);
--ks-lacquer-deep: oklch(100% 0 0);
--ks-lacquer-raised: oklch(99% 0 0);
--ks-graphite: oklch(94% 0 0);
--ks-graphite-2: oklch(90% 0 0);
--ks-champagne: oklch(16% 0 0);
--ks-text: oklch(24% 0 0);
--ks-text-muted: oklch(42% 0 0);
--ks-text-faint: oklch(55% 0 0);
--ks-rule: oklch(20% 0 0 / 0.12);
--docs-accent: var(--ks-patina);
--docs-accent-hover: var(--ks-patina-deep);
--docs-accent-line: oklch(70% 0.12 188 / 0.36);
--docs-accent-wash: oklch(70% 0.12 188 / 0.08);
--docs-brand-accent: var(--ks-kinpaku);
--docs-panel-bg: oklch(100% 0 0 / 0.76);
--docs-panel-hover-bg: oklch(70% 0.12 188 / 0.07);
background: oklch(100% 0 0);
}
.docs-kinpaku a {
color: inherit;
}
/* Page reset: the docs layout is its own full-bleed grid, no Base.astro
measure cap. */
.docs-kinpaku.skills-layout-page main#main {
max-width: none;
margin: 0;
padding: 0;
}
.docs-kinpaku .skills-layout {
display: grid;
grid-template-columns: 240px minmax(0, 1fr);
gap: clamp(40px, 4vw, 72px);
padding: 0 clamp(22px, 4vw, 56px);
align-items: start;
max-width: 1500px;
margin: 0 auto;
}
@media (max-width: 960px) {
.docs-kinpaku .skills-layout {
grid-template-columns: 1fr;
gap: 10px;
}
}
/* ============================================================================
2. SIDEBAR — commands rail
Sticky rail. Command names use the main UI family; monospace is reserved
for literal commands and code, not navigation.
============================================================================ */
.docs-kinpaku .skills-sidebar {
position: sticky;
top: 86px;
align-self: start;
max-height: calc(100vh - 86px);
overflow-y: auto;
padding: 48px 0 64px;
border-right: 1px solid var(--ks-rule);
scrollbar-width: thin;
scrollbar-color: var(--ks-rule) transparent;
}
@media (min-width: 961px) {
.docs-kinpaku .skills-sidebar {
min-height: calc(100vh - 86px);
}
}
.docs-kinpaku .skills-sidebar::-webkit-scrollbar {
width: 6px;
}
.docs-kinpaku .skills-sidebar::-webkit-scrollbar-thumb {
background: var(--ks-rule);
border-radius: 3px;
}
.docs-kinpaku .skills-sidebar-inner {
padding-right: 22px;
}
.docs-kinpaku .skills-sidebar-toggle {
display: none;
}
.docs-kinpaku .skills-sidebar-label {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
.docs-kinpaku .skills-sidebar-group {
margin-bottom: 26px;
}
.docs-kinpaku .skills-sidebar-group:last-child {
margin-bottom: 0;
}
.docs-kinpaku .skills-sidebar-category {
display: block;
font-family: var(--ks-font);
font-size: 0.72rem;
font-weight: 650;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--docs-accent);
margin-bottom: 10px;
padding: 0 0 0 14px;
}
.docs-kinpaku .skills-sidebar-list {
list-style: none;
padding: 0;
margin: 0;
}
.docs-kinpaku .skills-sidebar-list li {
margin: 0;
}
.docs-kinpaku .skills-sidebar-list a {
display: block;
padding: 5px 0 5px 12px;
border-left: 2px solid transparent;
font-family: var(--ks-font);
font-size: 0.94rem;
font-weight: 400;
line-height: 1.5;
color: var(--ks-text);
text-decoration: none;
transition: color 160ms var(--ks-ease),
border-color 160ms var(--ks-ease);
}
.docs-kinpaku .skills-sidebar-list a:hover {
color: var(--docs-accent-hover);
}
.docs-kinpaku .skills-sidebar-list a[aria-current="page"] {
color: var(--docs-accent);
font-weight: 600;
border-left-color: var(--docs-accent);
}
/* Mobile: collapse the sidebar behind a toggle. */
@media (max-width: 960px) {
.docs-kinpaku .skills-sidebar {
position: static;
max-height: none;
min-height: 0;
overflow: visible;
padding: 18px 0 0;
border-right: 0;
border-bottom: 1px solid var(--ks-rule);
}
.docs-kinpaku .skills-sidebar-toggle {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 12px 0;
background: transparent;
border: 0;
color: var(--ks-text-muted);
font-family: var(--ks-font);
font-size: 0.92rem;
font-weight: 500;
letter-spacing: 0;
text-transform: none;
cursor: pointer;
}
.docs-kinpaku .skills-sidebar-toggle-chevron {
transition: transform 220ms var(--ks-ease);
color: var(--docs-accent);
flex-shrink: 0;
}
.docs-kinpaku .skills-sidebar-toggle[aria-expanded="true"] .skills-sidebar-toggle-chevron {
transform: rotate(180deg);
}
.docs-kinpaku .skills-sidebar-inner {
display: none;
padding: 14px 0 24px;
}
.docs-kinpaku .skills-sidebar-toggle[aria-expanded="true"] + .skills-sidebar-inner {
display: block;
}
}
/* ============================================================================
3. /docs INDEX
Sections, in render order:
a. Starter hero
b. Intent chooser
c. Live mode callout
d. A typical session (linear workflow of 4 commands)
e. Pairs and chains (relational schema)
f. Full reference (cheatsheet by lifecycle phase)
============================================================================ */
.docs-kinpaku .docs-index {
padding: clamp(34px, 5vw, 70px) 0 clamp(80px, 10vw, 140px);
}
/* a. Starter rail ------------------------------------------------------ */
.docs-kinpaku .docs-start-rail {
display: grid;
gap: clamp(26px, 4vw, 44px);
margin-bottom: clamp(48px, 7vw, 88px);
}
@media (max-width: 520px) {
.docs-kinpaku .docs-index {
padding-top: 22px;
}
}
.docs-kinpaku .docs-start-rail-head {
display: grid;
gap: 18px;
max-width: 1040px;
}
.docs-kinpaku .docs-start-rail-title {
font-family: var(--ks-font-display);
font-style: normal;
font-weight: var(--ks-type-display-weight);
font-size: clamp(3.2rem, calc(3.1rem + 2vw), 5.6rem);
line-height: var(--ks-type-display-line);
letter-spacing: var(--ks-type-display-track);
color: var(--ks-champagne);
margin: 0;
text-wrap: balance;
}
.docs-kinpaku .docs-start-rail-title span {
color: var(--docs-brand-accent);
font-family: var(--ks-font-wordmark);
font-weight: 500;
font-size: 0.96em;
}
.docs-kinpaku .docs-start-rail-lede {
font-size: 1.04rem;
line-height: 1.62;
color: var(--ks-text);
margin: 0;
}
/* Shared section scaffolding for the index sections ---------------- */
.docs-kinpaku .docs-chooser-section,
.docs-kinpaku .docs-manual-section,
.docs-kinpaku .docs-live,
.docs-kinpaku .docs-flow-section,
.docs-kinpaku .docs-chains-section,
.docs-kinpaku .docs-reference-section {
margin-bottom: clamp(64px, 8vw, 110px);
}
.docs-kinpaku .docs-reference-section:last-child {
margin-bottom: 0;
}
.docs-kinpaku .docs-chooser-title,
.docs-kinpaku .docs-manual-title,
.docs-kinpaku .docs-live-title,
.docs-kinpaku .docs-flow-title,
.docs-kinpaku .docs-chains-title,
.docs-kinpaku .docs-reference-title {
font-family: var(--ks-font-display);
font-style: normal;
font-weight: var(--ks-type-headline-weight);
font-size: var(--ks-type-headline-size);
line-height: var(--ks-type-headline-line);
letter-spacing: 0;
color: var(--ks-champagne);
margin: 0 0 14px;
text-wrap: balance;
}
.docs-kinpaku .docs-live-lede,
.docs-kinpaku .docs-manual-sub,
.docs-kinpaku .docs-flow-sub,
.docs-kinpaku .docs-chains-sub {
font-size: 1rem;
line-height: 1.65;
color: var(--ks-text);
margin: 0;
max-width: 52ch;
}
/* Quick start rail ----------------------------------------------------- */
.docs-kinpaku .docs-start-rail-sequence {
display: grid;
gap: clamp(12px, 1.8vw, 18px);
}
.docs-kinpaku .docs-start-rail-steps {
list-style: none;
margin: 0;
padding: 0;
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
border-top: 0;
border-bottom: 0;
}
@media (max-width: 940px) {
.docs-kinpaku .docs-start-rail-steps {
grid-template-columns: 1fr;
}
}
.docs-kinpaku .docs-start-rail-step {
display: grid;
grid-template-rows: auto auto minmax(3.2em, auto) auto;
gap: 10px;
min-width: 0;
padding: 22px clamp(18px, 2.8vw, 30px) 24px;
border-right: 1px solid var(--ks-rule);
}
.docs-kinpaku .docs-start-rail-step:last-child {
border-right: 0;
}
.docs-kinpaku .docs-start-rail-num {
font-family: var(--ks-mono);
font-size: 0.72rem;
line-height: 1.1;
letter-spacing: 0.18em;
color: var(--docs-accent);
}
.docs-kinpaku .docs-start-rail-label {
font-family: var(--ks-mono);
font-size: 0.66rem;
line-height: 1.1;
letter-spacing: 0.24em;
text-transform: uppercase;
color: var(--ks-text-muted);
}
.docs-kinpaku .docs-start-rail-command {
display: block;
font-family: var(--ks-mono);
font-size: 0.94rem;
line-height: 1.45;
color: var(--docs-accent-hover);
min-height: 2.8em;
white-space: normal;
overflow-wrap: anywhere;
}
.docs-kinpaku .docs-start-rail-steps--number-gutter .docs-start-rail-step {
grid-template-columns: minmax(34px, auto) minmax(0, 1fr);
grid-template-rows: auto auto auto;
column-gap: clamp(16px, 2vw, 24px);
row-gap: 9px;
padding: 22px clamp(18px, 2.8vw, 30px) 24px 0;
}
.docs-kinpaku .docs-start-rail-steps--number-gutter .docs-start-rail-num {
grid-column: 1;
grid-row: 1 / 4;
padding-top: 1px;
}
.docs-kinpaku .docs-start-rail-steps--number-gutter .docs-start-rail-label,
.docs-kinpaku .docs-start-rail-steps--number-gutter .docs-start-rail-command,
.docs-kinpaku .docs-start-rail-steps--number-gutter .docs-start-rail-line {
grid-column: 2;
}
.docs-kinpaku .docs-start-rail-steps--inner-inset .docs-start-rail-step:first-child {
padding-left: 0;
}
.docs-kinpaku .docs-start-rail-steps--inner-inset .docs-start-rail-step:not(:first-child) {
padding-left: clamp(16px, 2.2vw, 24px);
}
.docs-kinpaku .docs-start-rail-line {
font-size: 0.9rem;
line-height: 1.5;
color: var(--ks-text-muted);
}
.docs-kinpaku .docs-start-rail-note {
margin: 20px 0 0;
font-size: 0.95rem;
line-height: 1.6;
color: var(--ks-text-muted);
}
.docs-kinpaku .docs-start-rail-note a {
color: var(--docs-accent);
text-decoration: none;
border-bottom: 1px solid var(--docs-accent-line);
}
.docs-kinpaku .docs-start-rail-note a:hover {
color: var(--docs-accent-hover);
border-bottom-color: var(--docs-accent-hover);
}
@media (max-width: 940px) {
.docs-kinpaku .docs-start-rail-step,
.docs-kinpaku .docs-start-rail-step:last-child {
border-right: 0;
border-left: 0;
border-top: 0;
border-bottom: 1px solid var(--ks-rule);
padding-inline: 0;
}
.docs-kinpaku .docs-start-rail-step:last-child {
border-bottom: 0;
}
.docs-kinpaku .docs-start-rail-command {
min-height: 0;
}
}
/* b. Intent chooser ---------------------------------------------------- */
.docs-kinpaku .docs-chooser-head {
margin-bottom: 26px;
}
.docs-kinpaku .docs-chooser-list {
display: grid;
grid-template-columns: 1fr;
border-top: 1px solid var(--ks-rule);
}
.docs-kinpaku .docs-chooser-list-row {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 8px 22px;
align-items: baseline;
padding: 18px 0 20px;
background: transparent;
border: 0;
border-bottom: 1px solid var(--ks-rule);
border-radius: 0;
text-decoration: none;
color: inherit;
transition: border-color 160ms var(--ks-ease),
color 160ms var(--ks-ease);
}
.docs-kinpaku .docs-chooser-list-row:hover {
border-bottom-color: var(--docs-accent-line);
}
.docs-kinpaku .docs-chooser-list-need {
font-size: 1rem;
line-height: 1.35;
color: var(--ks-champagne);
}
.docs-kinpaku .docs-chooser-list-command {
font-family: var(--ks-mono);
font-size: 0.78rem;
color: var(--docs-accent);
line-height: 1.4;
white-space: nowrap;
}
.docs-kinpaku .docs-chooser-list-line {
grid-column: 1 / -1;
font-size: 0.9rem;
line-height: 1.5;
color: var(--ks-text-muted);
max-width: 68ch;
}
@media (max-width: 520px) {
.docs-kinpaku .docs-chooser-list-row {
grid-template-columns: 1fr;
}
.docs-kinpaku .docs-chooser-list-command {
white-space: normal;
}
}
/* c. Live mode callout ------------------------------------------------- */
.docs-kinpaku .docs-live {
display: grid;
grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
gap: clamp(36px, 5vw, 64px);
align-items: center;
padding: 0;
}
@media (max-width: 880px) {
.docs-kinpaku .docs-live {
grid-template-columns: 1fr;
gap: 32px;
}
}
.docs-kinpaku .docs-live-cta {
margin: 26px 0 0;
}
/* Static browser frame mock. Light, low-shadow frame with a precise target
outline and mock action bar underneath. No animation; this is a teaching
diagram, not a demo. */
.docs-kinpaku .docs-live-figure {
margin: 0;
}
.docs-kinpaku .docs-live-frame {
position: relative;
background: var(--ks-lacquer-raised);
border: 1px solid var(--ks-rule);
border-radius: 4px;
overflow: hidden;
box-shadow: 0 14px 30px oklch(0% 0 0 / 0.08);
}
.docs-kinpaku .docs-live-chrome {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 14px;
background: transparent;
border-bottom: 1px solid var(--ks-rule);
}
.docs-kinpaku .docs-live-dot {
width: 9px;
height: 9px;
border-radius: 50%;
background: var(--ks-rule);
}
.docs-kinpaku .docs-live-url {
margin-left: 12px;
font-family: var(--ks-mono);
font-size: 0.72rem;
color: var(--ks-text-muted);
letter-spacing: 0.04em;
}
.docs-kinpaku .docs-live-stage {
position: relative;
padding: 38px 28px 28px;
min-height: 220px;
background: transparent;
}
.docs-kinpaku .docs-live-target {
position: relative;
padding: 22px 24px;
border: 1px solid var(--docs-accent-line);
border-radius: 2px;
background: var(--ks-lacquer);
box-shadow: none;
}
.docs-kinpaku .docs-live-target-title {
font-family: var(--ks-font-display);
font-style: normal;
font-weight: 600;
font-size: 1.4rem;
line-height: 1.15;
color: var(--ks-champagne);
}
.docs-kinpaku .docs-live-target-sub {
margin-top: 8px;
font-family: var(--ks-mono);
font-size: 0.7rem;
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--docs-accent-hover);
}
.docs-kinpaku .docs-live-bar {
margin-top: 22px;
display: flex;
align-items: center;
gap: 14px;
padding: 10px 14px;
background: var(--ks-lacquer);
border: 1px solid var(--ks-rule);
border-radius: 2px;
font-family: var(--ks-mono);
font-size: 0.74rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--ks-text-muted);
}
.docs-kinpaku .docs-live-bar-counter {
color: var(--ks-champagne);
}
.docs-kinpaku .docs-live-bar-accept {
margin-left: auto;
color: var(--docs-accent-hover);
}
.docs-kinpaku .docs-live-bar-divider {
width: 1px;
align-self: stretch;
background: var(--ks-rule);
margin-left: auto;
}
/* d. A typical session (linear flow of commands) ----------------------- */
.docs-kinpaku .docs-flow-head {
margin-bottom: 32px;
}
.docs-kinpaku .docs-flow {
list-style: none;
margin: 0;
padding: 0;
display: grid;
grid-template-columns: 1fr auto 1fr auto 1fr auto 1fr;
align-items: stretch;
gap: 0;
}
@media (max-width: 880px) {
.docs-kinpaku .docs-flow {
grid-template-columns: 1fr;
gap: 8px;
}
}
.docs-kinpaku .docs-flow-step {
display: contents;
}
.docs-kinpaku .docs-flow-link {
display: grid;
align-content: start;
gap: 8px;
padding: 22px 22px 24px;
background: var(--docs-panel-bg);
border: 1px solid var(--ks-rule);
border-radius: 2px;
text-decoration: none;
color: inherit;
transition: border-color 180ms var(--ks-ease),
background 180ms var(--ks-ease);
min-height: 100%;
}
.docs-kinpaku .docs-flow-link:hover {
border-color: var(--docs-accent-line);
background: var(--docs-panel-hover-bg);
}
.docs-kinpaku .docs-flow-verb {
font-family: var(--ks-mono);
font-size: 0.66rem;
letter-spacing: 0.24em;
text-transform: uppercase;
color: var(--docs-accent);
}
.docs-kinpaku .docs-flow-cmd {
font-family: var(--ks-mono);
font-size: 0.94rem;
color: var(--ks-champagne);
}
.docs-kinpaku .docs-flow-tag {
font-size: 0.86rem;
line-height: 1.45;
color: var(--ks-text-muted);
}
.docs-kinpaku .docs-flow-arrow {
display: grid;
place-items: center;
width: 36px;
color: var(--docs-accent);
}
.docs-kinpaku .docs-flow-arrow svg {
width: 24px;
height: 8px;
}
@media (max-width: 880px) {
.docs-kinpaku .docs-flow-arrow {
width: 100%;
height: 18px;
transform: rotate(90deg);
}
}
.docs-kinpaku .docs-flow-alt {
margin: 22px 0 0;
font-family: var(--ks-font);
font-size: 0.95rem;
line-height: 1.6;
color: var(--ks-text-muted);
max-width: 60ch;
}
.docs-kinpaku .docs-flow-alt a {
color: var(--docs-accent);
font-family: var(--ks-mono);
font-size: 0.88em;
text-decoration: none;
border-bottom: 1px solid var(--docs-accent-line);
transition: border-color 160ms var(--ks-ease);
}
.docs-kinpaku .docs-flow-alt a:hover {
color: var(--docs-accent-hover);
border-bottom-color: var(--docs-accent-hover);
}
/* e. Pairs and chains -------------------------------------------------- */
.docs-kinpaku .docs-chains-head {
margin-bottom: 32px;
}
.docs-kinpaku .docs-chains-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
}
@media (max-width: 700px) {
.docs-kinpaku .docs-chains-grid {
grid-template-columns: 1fr;
}
}
.docs-kinpaku .docs-chain {
display: grid;
gap: 10px;
padding: 28px 28px 30px;
background: var(--docs-panel-bg);
border: 1px solid var(--ks-rule);
border-radius: 2px;
}
.docs-kinpaku .docs-chain-formula {
display: inline-flex;
align-items: baseline;
gap: 14px;
margin: 0;
font-family: var(--ks-mono);
font-size: 1.06rem;
line-height: 1.2;
}
.docs-kinpaku .docs-chain-cmd {
color: var(--docs-accent);
text-decoration: none;
border-bottom: 1px solid transparent;
transition: border-color 160ms var(--ks-ease);
}
.docs-kinpaku .docs-chain-cmd:hover {
color: var(--docs-accent-hover);
border-bottom-color: var(--docs-accent-hover);
}
.docs-kinpaku .docs-chain-arrow {
color: var(--docs-accent);
font-size: 1.1em;
}
.docs-kinpaku .docs-chain-line {
margin: 0;
font-size: 0.94rem;
line-height: 1.5;
color: var(--ks-text);
}
/* f. Full reference (cheatsheet) --------------------------------------- */
.docs-kinpaku .docs-reference-head {
margin-bottom: 32px;
}
.docs-kinpaku .docs-reference {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 36px 48px;
}
@media (max-width: 760px) {
.docs-kinpaku .docs-reference {
grid-template-columns: 1fr;
gap: 32px;
}
}
.docs-kinpaku .docs-reference-group {
display: grid;
gap: 10px;
}
.docs-kinpaku .docs-reference-cat {
display: flex;
align-items: baseline;
gap: 10px;
margin: 0 0 6px;
padding-bottom: 8px;
border-bottom: 1px solid var(--ks-rule);
font-family: var(--ks-mono);
font-size: 0.72rem;
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--ks-champagne);
}
.docs-kinpaku .docs-reference-count {
color: var(--ks-text-faint);
font-size: 0.86em;
}
.docs-kinpaku .docs-reference-list {
list-style: none;
padding: 0;
margin: 0;
display: grid;
gap: 4px;
}
.docs-kinpaku .docs-reference-row {
display: grid;
grid-template-columns: 96px minmax(0, 1fr);
align-items: baseline;
gap: 14px;
padding: 4px 0;
text-decoration: none;
color: inherit;
transition: color 160ms var(--ks-ease);
}
.docs-kinpaku .docs-reference-row:hover .docs-reference-name {
color: var(--docs-accent-hover);
}
.docs-kinpaku .docs-reference-row:hover .docs-reference-line {
color: var(--ks-champagne);
}
.docs-kinpaku .docs-reference-name {
font-family: var(--ks-mono);
font-size: 0.92rem;
color: var(--ks-text);
transition: color 160ms var(--ks-ease);
}
.docs-kinpaku .docs-reference-line {
font-size: 0.9rem;
line-height: 1.45;
color: var(--ks-text-muted);
transition: color 160ms var(--ks-ease);
}
/* ============================================================================
4. /docs/:slug — breadcrumb, hero, related-commands footer
============================================================================ */
.docs-kinpaku .skills-main {
min-width: 0;
padding: 48px 0 clamp(80px, 10vw, 140px);
}
.docs-kinpaku .skills-main--docs-index {
padding-top: 0;
}
.docs-kinpaku .skills-detail {
max-width: 900px;
}
.docs-kinpaku .skills-breadcrumb {
display: flex;
align-items: center;
gap: 10px;
font-family: var(--ks-mono);
font-size: 0.7rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--ks-text-muted);
margin: 0 0 36px;
}
.docs-kinpaku .skills-breadcrumb a {
color: var(--ks-kinpaku);
text-decoration: none;
transition: color 160ms var(--ks-ease);
}
.docs-kinpaku .skills-breadcrumb a:hover {
color: var(--ks-champagne);
}
.docs-kinpaku .skills-breadcrumb span[aria-hidden] {
color: var(--ks-text-faint);
}
/* Hero — eyebrow (category), title (/impeccable name), lede. */
.docs-kinpaku .sub-page-header {
margin-bottom: clamp(40px, 5vw, 64px);
}
.docs-kinpaku .sub-page-eyebrow {
display: block;
font-family: var(--ks-mono);
font-size: var(--ks-type-eyebrow-size);
letter-spacing: var(--ks-type-eyebrow-track);
text-transform: uppercase;
color: var(--ks-kinpaku);
margin: 0 0 16px;
}
/* Command name (h1) — display scale, kinpaku gold so it carries the
page identity. */
.docs-kinpaku .sub-page-title {
font-family: var(--ks-font-display);
font-weight: var(--ks-type-display-weight);
font-size: var(--ks-type-display-size);
line-height: var(--ks-type-display-line);
letter-spacing: var(--ks-type-display-track);
color: var(--ks-kinpaku);
margin: 0 0 20px;
text-wrap: balance;
}
.docs-kinpaku .sub-page-lede {
font-size: 1.08rem;
line-height: 1.65;
color: var(--ks-text);
margin: 0;
max-width: 56ch;
}
/* Related commands footer — chips with relation label + command name. */
.docs-kinpaku .skills-relationships {
margin-top: clamp(56px, 7vw, 88px);
padding-top: 32px;
border-top: 1px solid var(--ks-rule);
}
.docs-kinpaku .skills-relationships-title {
font-family: var(--ks-mono);
font-size: 0.7rem;
letter-spacing: 0.24em;
text-transform: uppercase;
color: var(--ks-kinpaku);
font-weight: 400;
margin: 0 0 18px;
}
.docs-kinpaku .skills-relationships-list {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.docs-kinpaku .skills-relationship-chip {
display: inline-grid;
grid-auto-flow: column;
align-items: baseline;
gap: 10px;
padding: 10px 14px;
border: 1px solid var(--ks-rule);
border-radius: 2px;
background: var(--ks-lacquer-raised);
text-decoration: none;
transition: border-color 180ms var(--ks-ease),
background 180ms var(--ks-ease);
}
.docs-kinpaku .skills-relationship-chip:hover {
border-color: var(--ks-kinpaku);
background: oklch(11% 0.012 82);
}
.docs-kinpaku .skills-relationship-label {
font-family: var(--ks-mono);
font-size: 0.64rem;
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--ks-text-faint);
}
.docs-kinpaku .skills-relationship-name {
font-family: var(--ks-mono);
font-size: 0.88rem;
color: var(--ks-kinpaku);
}
/* ============================================================================
5. PROSE BODY — markdown rendering on lacquer
============================================================================ */
/* Vertical rhythm.
One base unit: 1em (≈ 16-17px at the prose font-size). Everything is a
multiple of that.
- paragraph-to-paragraph (sibling) = 1em
- paragraph-to-list = 1em (sibling rule)
- list-item-to-list-item = 0.25em (members of one thought)
- list-to-paragraph = 1em (sibling rule)
- block (pre/blockquote/hr) to neighbor = 1.4em (breathes more)
- h2 above body = 1.6em (anchor, not chasm)
- h3 above body = 1.2em
- heading to its body = 0.4em (kept tight)
*/
.docs-kinpaku .prose {
font-family: var(--ks-font);
font-size: 1.02rem;
line-height: 1.7;
color: var(--ks-text);
max-width: 76ch;
}
/* Single source of truth for margins:
- `.prose > *` zeros every direct child's margin (universal selector,
beats browser default but loses to element-selector rules).
- `.prose > * + *` adds the sibling gap.
- Element-specific overrides (h2, h3, h4) inherit from the same family.
Element-selector rules elsewhere in this file MUST NOT set `margin`
shorthand or `margin-top` — they'd outrank the sibling rule and starve
blocks of their spacing (this happened with the list + p combo). */
.docs-kinpaku .prose > * {
margin: 0;
}
.docs-kinpaku .prose > * + * {
margin-top: 1em;
}
/* Blocks (pre, blockquote, hr) get extra breath above and below. */
.docs-kinpaku .prose > pre + *,
.docs-kinpaku .prose > * + pre,
.docs-kinpaku .prose > blockquote + *,
.docs-kinpaku .prose > * + blockquote,
.docs-kinpaku .prose > hr + *,
.docs-kinpaku .prose > * + hr {
margin-top: 1.4em;
}
.docs-kinpaku .prose h1,
.docs-kinpaku .prose h2,
.docs-kinpaku .prose h3,
.docs-kinpaku .prose h4 {
font-family: var(--ks-font-display);
color: var(--ks-champagne);
font-style: normal;
line-height: 1.2;
scroll-margin-top: 96px;
/* Intentionally no margin — see `.prose > *` rule above. */
}
.docs-kinpaku .prose > * + h2 {
margin-top: 1.6em;
}
.docs-kinpaku .prose > * + h3 {
margin-top: 1.2em;
}
.docs-kinpaku .prose > * + h4 {
margin-top: 1em;
}
.docs-kinpaku .prose > h2 + *,
.docs-kinpaku .prose > h3 + *,
.docs-kinpaku .prose > h4 + * {
margin-top: 0.4em;
}
/* h2/h3 follow the DESIGN.md type scale exactly:
- h2 (Headline): Alumni Sans Pinstripe, clamp 2.6-3.4rem, weight 600
- h3 (Title): Albert Sans, 1.18rem, weight 500
- h4: Albert Sans, 1rem, weight 600 (utility)
*/
.docs-kinpaku .prose h2 {
font-family: var(--ks-font-display);
font-size: var(--ks-type-headline-size);
font-weight: var(--ks-type-headline-weight);
line-height: var(--ks-type-headline-line);
letter-spacing: -0.005em;
text-wrap: balance;
}
.docs-kinpaku .prose h3 {
font-family: var(--ks-font);
font-size: var(--ks-type-title-size);
font-weight: var(--ks-type-title-weight);
line-height: var(--ks-type-title-line);
color: var(--ks-kinpaku);
}
.docs-kinpaku .prose h4 {
font-family: var(--ks-font);
font-size: 1rem;
font-weight: 600;
letter-spacing: 0.02em;
color: var(--ks-champagne);
}
/* Lists. Margins are handled by the universal `> *` reset + sibling rule
above; only set list-specific padding and line-height here. */
.docs-kinpaku .prose ul,
.docs-kinpaku .prose ol {
padding-left: 1.4rem;
line-height: 1.6;
}
.docs-kinpaku .prose li + li {
margin-top: 0.5em;
}
.docs-kinpaku .prose li::marker {
color: var(--ks-kinpaku);
}
/* When a list item wraps multi-block content, hug its internals. */
.docs-kinpaku .prose li > p {
margin: 0;
}
.docs-kinpaku .prose li > * + * {
margin-top: 0.35em;
}
.docs-kinpaku .prose a {
color: var(--ks-kinpaku);
text-decoration: underline;
text-decoration-thickness: 1px;
text-underline-offset: 4px;
text-decoration-color: oklch(78% 0.12 82 / 0.4);
transition: text-decoration-color 160ms var(--ks-ease);
}
.docs-kinpaku .prose a:hover {
text-decoration-color: var(--ks-kinpaku);
}
.docs-kinpaku .prose strong {
color: var(--ks-champagne);
font-weight: 600;
}
.docs-kinpaku .prose em {
font-style: italic;
color: var(--ks-champagne);
}
/* Inline code — champagne mono on a graphite chip. The chip is the
affordance; color stays neutral so a paragraph full of inline
references doesn't vibrate. Kinpaku is reserved for links, h3s,
eyebrows, and CTAs. `--ks-graphite-2` (≈19% lightness) reads as the
neutral gray the chip wants without picking up cool tint. */
.docs-kinpaku .prose code {
font-family: var(--ks-mono);
font-size: 0.84em;
color: var(--ks-code-fg);
background: var(--ks-code-bg);
border: 0;
padding: 0.14em 0.36em;
border-radius: var(--ks-code-radius);
}
.docs-kinpaku .prose :not(pre) > code {
overflow-wrap: anywhere;
}
html.light .docs-kinpaku .prose code {
background: oklch(25% 0.02 95 / 0.08);
}
/* Inline code that is itself a link — get the kinpaku cue back, since
the link semantic is the meaningful one. */
.docs-kinpaku .prose a code {
color: var(--ks-code-cmd);
}
/* Fenced code blocks — deep lacquer terminal. Astro/Shiki emits dual-theme
CSS variables from site/lib/impeccable-shiki-theme.mjs; the wrapper keeps
the surface in the kinpaku token system while token spans swap by theme. */
.docs-kinpaku .prose pre,
.docs-kinpaku .prose .code-block,
.docs-kinpaku .prose pre.astro-code {
margin: 0;
padding: 22px 24px;
background: var(--ks-code-block-bg) !important;
color: var(--ks-code-block-fg) !important;
border: 1px solid var(--ks-code-block-border);
border-radius: var(--ks-code-block-radius);
overflow-x: auto;
font-family: var(--ks-mono);
font-size: 0.84rem;
line-height: 1.6;
max-width: 100%;
}
.docs-kinpaku .prose pre.astro-code span {
color: var(--shiki-dark, var(--ks-code-block-fg));
}
html.light .docs-kinpaku .prose pre.astro-code span {
color: var(--shiki-light, var(--ks-code-block-fg));
}
.docs-kinpaku .prose > * + pre.astro-code,
.docs-kinpaku .prose > * + pre,
.docs-kinpaku .prose > * + .code-block-wrap {
margin-top: 1.25em;
}
.docs-kinpaku .prose :is(p, ul, ol) + :is(pre.astro-code, pre, .code-block-wrap) {
margin-top: 1.25em;
}
.docs-kinpaku .prose pre code,
.docs-kinpaku .prose .code-block code {
background: transparent;
border: 0;
padding: 0;
color: inherit;
font-size: inherit;
border-radius: 0;
}
html.light .docs-kinpaku .prose pre code,
html.light .docs-kinpaku .prose .code-block code {
background: transparent;
}
.docs-kinpaku .prose .code-block-wrap {
position: relative;
margin: 0;
}
/* Copy button on dark — match the kinpaku button voice. */
.docs-kinpaku .code-block-copy {
position: absolute;
top: 10px;
right: 10px;
padding: 4px 10px;
background: var(--ks-lacquer-raised);
border: 1px solid var(--ks-rule);
color: var(--ks-text-muted);
border-radius: 2px;
font-family: var(--ks-mono);
font-size: 0.62rem;
letter-spacing: 0.18em;
text-transform: uppercase;
cursor: pointer;
opacity: 0;
transition: opacity 180ms var(--ks-ease),
border-color 180ms var(--ks-ease),
color 180ms var(--ks-ease);
}
.docs-kinpaku .code-block-wrap:hover .code-block-copy,
.docs-kinpaku .code-block-copy:focus-visible {
opacity: 1;
}
.docs-kinpaku .code-block-copy::before {
content: "Copy";
}
.docs-kinpaku .code-block-copy:hover {
border-color: var(--ks-kinpaku);
color: var(--ks-kinpaku);
}
.docs-kinpaku .code-block-copy.is-copied {
opacity: 1;
border-color: var(--ks-kinpaku);
color: var(--ks-lacquer-deep);
background: var(--ks-kinpaku);
}
.docs-kinpaku .code-block-copy.is-copied::before {
content: "Copied";
}
.docs-kinpaku .prose blockquote {
margin: 0;
padding: 6px 0 6px 22px;
border-block: 0;
border-left: 2px solid var(--ks-kinpaku);
color: var(--ks-text);
font-style: italic;
}
.docs-kinpaku .prose .docs-context-note {
padding: 4px 0 4px 20px;
border-left: 2px solid var(--ks-kinpaku);
color: var(--ks-text-muted);
}
.docs-kinpaku .prose hr {
border: 0;
height: 1px;
background: var(--ks-rule);
margin: 32px 0;
}
.docs-kinpaku .prose table {
width: 100%;
border-collapse: collapse;
font-size: 0.92rem;
}
.docs-kinpaku .prose th,
.docs-kinpaku .prose td {
padding: 10px 14px;
text-align: left;
border-bottom: 1px solid var(--ks-rule);
vertical-align: top;
}
.docs-kinpaku .prose th {
font-family: var(--ks-mono);
font-size: 0.7rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--ks-kinpaku);
font-weight: 500;
border-bottom-color: var(--ks-kinpaku);
}
@media (max-width: 760px) {
.docs-kinpaku .prose table {
display: block;
max-width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.docs-kinpaku .prose th,
.docs-kinpaku .prose td {
min-width: 11rem;
}
}
/* Design Context guide -------------------------------------------------
The context page needs a quick mental model before it becomes reference
prose. Keep these modules small, sharp, and readable inside the normal
documentation measure.
*/
.docs-kinpaku .prose .docs-context-flow {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 1px;
background: var(--ks-rule);
border: 1px solid var(--ks-rule);
border-radius: 6px;
overflow: hidden;
}
.docs-kinpaku .prose .docs-context-flow-source,
.docs-kinpaku .prose .docs-context-flow-output {
display: grid;
gap: 8px;
min-width: 0;
padding: 18px;
background: var(--ks-lacquer-raised);
}
.docs-kinpaku .prose .docs-context-flow-source--generated {
background: var(--ks-lacquer-raised);
}
.docs-kinpaku .prose .docs-context-flow-output {
grid-column: 1 / -1;
grid-template-columns: minmax(0, 0.74fr) minmax(0, 1.26fr);
column-gap: 20px;
align-items: center;
background: var(--ks-lacquer);
}
.docs-kinpaku .prose .docs-context-flow-label {
font-family: var(--ks-mono);
font-size: 0.62rem;
line-height: 1.2;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--docs-accent);
}
.docs-kinpaku .prose .docs-context-flow-source strong,
.docs-kinpaku .prose .docs-context-flow-output strong {
color: var(--ks-champagne);
font-family: var(--ks-mono);
font-size: 0.84rem;
line-height: 1.35;
overflow-wrap: anywhere;
}
.docs-kinpaku .prose .docs-context-flow-source span:last-child,
.docs-kinpaku .prose .docs-context-flow-output span:last-child {
color: var(--ks-text-muted);
font-size: 0.9rem;
line-height: 1.45;
}
.docs-kinpaku .prose .docs-context-flow-output .docs-context-flow-label,
.docs-kinpaku .prose .docs-context-flow-output span:last-child {
grid-column: 1;
}
.docs-kinpaku .prose .docs-context-flow-output strong {
grid-column: 2;
grid-row: 1 / 3;
align-self: center;
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details) {
border-top: 1px solid var(--ks-rule);
border-bottom: 1px solid var(--ks-rule);
padding: 0;
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details) + :is(.docs-context-details, .docs-prose-details) {
margin-top: 0;
border-top: 0;
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details) summary {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 14px;
align-items: center;
padding: 16px 0;
color: var(--ks-champagne);
font-weight: 600;
cursor: pointer;
list-style: none;
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details) summary::-webkit-details-marker {
display: none;
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details) summary::after {
content: "+";
font-family: var(--ks-mono);
color: var(--docs-accent);
font-weight: 500;
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details)[open] summary::after {
content: "-";
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details) summary:focus-visible {
outline: 2px solid var(--ks-patina);
outline-offset: 4px;
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details) > div {
display: grid;
gap: 0.8em;
padding: 0 0 18px;
color: var(--ks-text);
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details) > div > * {
margin: 0;
}
.docs-kinpaku .prose :is(.docs-context-details, .docs-prose-details) ul {
padding-left: 1.4rem;
}
@media (max-width: 760px) {
.docs-kinpaku .prose .docs-context-flow {
grid-template-columns: 1fr;
}
.docs-kinpaku .prose .docs-context-flow-output {
grid-column: auto;
grid-template-columns: 1fr;
gap: 8px;
}
}
/* Two-column editorial hero (when the command has a registered demo).
Demo on the left, h1 + lede on the right. Mirrors the old pre-Astro
layout: a slightly wider demo column (1.15fr) against a comfortable
text measure on the right (1fr). Collapses to single-column below
the breakpoint where the demo would be too cramped.
When there's no demo, the page renders the existing single-column
sub-page-header — no docs-hero wrapper, no grid. */
.docs-kinpaku .docs-hero--with-demo {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
gap: clamp(28px, 4vw, 48px);
align-items: center;
margin: 0 0 clamp(40px, 5vw, 64px);
}
@media (max-width: 880px) {
.docs-kinpaku .docs-hero--with-demo {
grid-template-columns: 1fr;
gap: 32px;
}
}
/* In the two-column hero, the h1 + lede sits in the right column and
doesn't need its own bottom margin (the grid gap handles spacing). */
.docs-kinpaku .docs-hero--with-demo .sub-page-header {
margin: 0;
}
/* Command demo (rendered client-side by Doc.astro from
site/scripts/demos/commands/<id>.js). Same demos the homepage's
command carousel uses — one source of truth in the demo JS, two
surfaces that render from it.
Matches the homepage's dark dual-tone treatment: lacquer-raised
container with a subtle kinpaku-grid backing, then `before` and
`after` sides each picking up a different radial glow. The demo
content's `--color-*` tokens stay remapped to kinpaku (no local
light override) — shapes render light-on-dark and the kinpaku
accent shines. */
.docs-kinpaku .docs-command-demo {
margin: 0;
border: 1px solid var(--ks-rule);
border-radius: 4px;
overflow: hidden;
background: var(--ks-lacquer-raised);
}
.docs-kinpaku .docs-command-demo :is(.split-comparison, .demo-split-comparison) {
max-width: none;
margin: 0;
padding: 0;
}
.docs-kinpaku .docs-command-demo .split-container {
height: 300px;
max-width: none;
border-radius: 0;
border: 0;
border-bottom: 1px solid var(--ks-rule);
background:
linear-gradient(90deg, oklch(78% 0.12 82 / 0.04) 1px, transparent 1px),
linear-gradient(180deg, oklch(78% 0.12 82 / 0.035) 1px, transparent 1px),
var(--ks-lacquer-raised);
background-size: 24px 24px;
}
.docs-kinpaku .docs-command-demo .split-before {
background:
linear-gradient(90deg, oklch(10% 0.006 95 / 0.92), oklch(12% 0.012 60 / 0.72)),
radial-gradient(circle at 28% 25%, oklch(78% 0.12 82 / 0.12), transparent 11rem);
}
.docs-kinpaku .docs-command-demo .split-after {
/* Doc.astro initSplitCompare uses skewAngle: 0 — vertical seam, not the
angled default from sub-pages.css / main.css. */
clip-path: polygon(50% 0%, 100% 0%, 100% 100%, 50% 100%);
background:
linear-gradient(90deg, oklch(8% 0.006 95 / 0.92), oklch(10% 0.006 95 / 0.96)),
radial-gradient(circle at 82% 26%, oklch(78% 0.12 82 / 0.14), transparent 12rem);
}
.docs-kinpaku .docs-command-demo .split-divider {
background: var(--ks-kinpaku);
box-shadow: 0 0 20px oklch(78% 0.12 82 / 0.4);
transform: translateX(-50%) !important;
}
.docs-kinpaku .docs-command-demo .demo-caption {
padding: 10px 16px;
font-family: var(--ks-mono);
font-size: 0.72rem;
letter-spacing: 0.04em;
color: var(--ks-text-muted);
background: var(--ks-lacquer-deep);
text-align: center;
}
/* Visualization wrappers inside the markdown body.
Default: .docs-viz-hero is a transparent layout container — no card
chrome, no border. The inner mock owns its own surface treatment, so
we don't get card-in-card.
When the wrapper contains a multi-tile group (.docs-viz-flow), apply
the tinted-plinth pattern from .ks-bento on the homepage:
- the wrapper becomes a graphite mat
- tiles sit on top in flat lacquer with no borders
- the gap between tiles is the plinth showing through as inset gutters
- depth contrast carries the edges; no double borders required */
.docs-kinpaku .prose .docs-viz-hero {
margin: 0;
padding: 0;
background: transparent;
border: 0;
border-radius: 0;
}
.docs-kinpaku .prose .docs-viz-hero:has(.docs-viz-flow),
.docs-kinpaku .prose .docs-viz-hero:has(.docs-viz-variants) {
padding: 24px;
background: var(--ks-graphite-2);
border-radius: 2px;
}
.docs-kinpaku .prose .docs-viz-flow {
gap: 8px;
}
.docs-kinpaku .prose .docs-viz-flow-step,
.docs-kinpaku .prose .docs-viz-variant {
background: var(--ks-lacquer);
border: 0;
border-radius: 2px;
}
.docs-kinpaku .prose .docs-viz-flow-step + .docs-viz-flow-step {
margin-left: 0;
}
.docs-kinpaku .prose .docs-viz-flow-step + .docs-viz-flow-step::before {
left: -8px;
width: 8px;
}
/* Accent / active states get a kinpaku-tinted fill instead of the
bordered/glow treatment from docs-visuals.css. */
.docs-kinpaku .prose .docs-viz-flow-step--accent,
.docs-kinpaku .prose .docs-viz-variant.is-active {
background: oklch(78% 0.12 82 / 0.16);
box-shadow: none;
}
/* Per-variant theming in docs-visuals.css uses paper/cream/light-magenta
on the v1/v3 backgrounds — both off-brand here. Re-skin to lacquer
ramps so the variants still differ but stay kinpaku. */
.docs-kinpaku .prose .docs-viz-variant--v1 {
background: var(--ks-lacquer);
}
.docs-kinpaku .prose .docs-viz-variant--v3 {
background: var(--ks-lacquer-deep);
}
.docs-kinpaku .prose .docs-viz-caption {
margin-top: 16px;
color: var(--ks-text-muted);
}
/* ============================================================================
6. FOOTER on dark surface
============================================================================ */
/* Footer chrome moved to kinpaku-kit.css (.kinpaku-chrome .site-footer). */