Zenzic · Brand System
Wordmark Usage — Dark & Light
Dark background
#09090b (Slate Lead) or deeper#F8FAFC near-white#38bdf8 Harbor CyanLight background
#F1F5F9 or lighter#0F172A near-black#4f46e5 Sentinel IndigoBimodal Indigo — Light #4338ca (AAA 7.9:1) · Dark #a8b3fb (AAA 9.9:1)
Identity
Signals
Surface
Headings · Inter 700
Zenzic
Strict Markdown Static Analyzer
Body · Inter 400 / 500
Engine-agnostic quality guarantee for
Markdown documentation at every scale.
Secondary text · labels · captions
Code / UI · JetBrains Mono
Markdown static analyzer & credential scanner
uvx zenzic check all ./docs
v0.9.1 · exit 0
Scale specimen
32 · Hero
24 · Heading
16 · Subheading
14 · Body — the primary reading size
12 · Code · JetBrains Mono
09 · Brand Labels · IBM Plex Mono · tracked
| Semantic Name | Private Hex | Value | Usage in CLI output | Exit |
|---|---|---|---|---|
| BRAND | _INDIGO | #4f46e5 | Startup banner, panel borders, primary accent | — |
| SUCCESS | _EMERALD | #10b981 | Clean check — exit 0, no findings | 0 |
| WARNING | _AMBER | #f59e0b | Advisory findings, non-blocking issues | 0 / 1* |
| ERROR | _ROSE | #f43f5e | Broken links, orphan pages, snippet failures | 1 |
| DIM | _SLATE | #64748b | Secondary text, file paths, timestamps | — |
| FATAL | _CRITICAL | #8b0000 | Security incidents only — Z201 CREDENTIAL_SECRET and Z202–203 PATH_TRAVERSAL_FATAL | 2 / 3 |
Law: External code must reference semantic names only
(ZenzicPalette.BRAND, .SUCCESS, …).
Private hex constants (_INDIGO, _CRITICAL, …) are internal implementation details.
*WARNING exits as 1 under --strict.
Every character of color that Zenzic emits to stdout
and stderr flows through a single class:
zenzic.core.ui.ZenzicPalette.
No hex value is hardcoded outside of that class — not in report templates, not in
scanner output, not in the startup banner.
When you read a Zenzic terminal output, you are reading a semantically governed document.
An emerald line is always a pass. A rose line is always an error.
Dark red is always a security incident — never a style choice.
This guarantee holds across stdout, stderr, JSON output, and the --quiet mode.
CLI Output — Color Mapping
For plugin and extension builders:
If your rule emits a finding, the Zenzic engine maps severity to color automatically via
ZenzicPalette. You supply the semantic severity
("error", "warning", "info");
the color contract is enforced for you. Never hardcode ANSI codes in a plugin.
This color is reserved exclusively for security incidents. It may never be repurposed.
ZenzicPalette.FATAL (#8b0000)
is emitted only by two scanner families inside the Zenzic core:
--exit-zero.
/etc/, /root/, /var/,
/proc/, /sys/, /usr/).
Exits with code 3.
Highest priority in the exit hierarchy (3 > 2 > 1).
Never suppressed.
Design invariant for builders:
If you build a tool or plugin for Zenzic and need to signal a security event,
use ZenzicPalette.FATAL. If you use it for anything else, you are
violating the semantic contract of the ZenzicPalette color system.
One color. One meaning. Non-negotiable.
Web colors are calibrated for WCAG AA on light and dark surfaces. Where CLI and web values coincide, the identity is exact.
| Semantic | CSS Variable | CLI Terminal | Web — Light | Web — Dark | Note |
|---|---|---|---|---|---|
| BRAND | --zenzic-brand |
#4f46e5 | #4f46e5 | #4f46e5 | Exact match — AA on all surfaces |
| SUCCESS | --zenzic-success |
#10b981 | #059669 | #10b981 | Light: Emerald-600 for WCAG AA |
| WARNING | --zenzic-warning |
#f59e0b | #b45309 | #f59e0b | Light: Amber-700 for WCAG AA |
| ERROR | --zenzic-error |
#f43f5e | #e11d48 | #f43f5e | Light: Rose-600 for WCAG AA |
| DIM | --zenzic-dim |
#64748b | #475569 | #94a3b8 | Light: Slate-600 · Dark: Slate-400 (D110 — WCAG AA both surfaces) |
| FATAL | --zenzic-fatal |
#8b0000 | #991b1b | #8b0000 | Follows --zenzic-fatal — security-only |
Mermaid exception:
Diagram nodes (style NODE fill:#… / classDef fill:#…)
cannot consume CSS custom properties — Mermaid resolves colors in its own rendering pipeline.
Hex values inside Mermaid code blocks are not subject to the Zero Hex Law.
Audit Badge — Binary gate
Dynamic variants via Shields.io → see zenzic.dev/docs/how-to/add-badges/
Brand inquiries → [email protected]
Do
Do Not
Voice
§ 08 — Accessibility & Themes
The Zenzic palette is adaptive: every accent colour shifts between dark and light surfaces to maintain the minimum WCAG AA contrast ratio (4.5:1 for body text, 3:1 for large UI elements). A brand system that ignores contrast is a liability at scale.
Dark Mode — Slate Lead
Indigo Vibrante — #808af0
--ifm-color-primary (--zenzic-brand-400) · Ratio 6.4:1 on #09090b
Cyan Elettrico — #3ab3c4
--zenzic-accent · Ratio 8.0:1 on #09090b
Sangue Profondo — #8b0000
--zenzic-fatal-deep · Z202–203 PATH_TRAVERSAL_FATAL
Light Mode — White Surface
Indigo Inchiostro — #4338ca
--ifm-color-primary (--zenzic-brand-700) · Ratio 7.9:1 on #fff
Cyan Profondo — #0891b2
--zenzic-accent · Ratio 3.7:1 on #fff
Rosso Mattone — #991b1b
--zenzic-fatal-deep · Ratio 8.3:1 on #fff
Zinc Typography Scale
Zinc-900 — #18181b — --ifm-heading-color
Headings — solid, authoritative, Ratio 18.1:1 on #fff
Zinc-800 — #27272a — --ifm-font-color-base
Body text — premium readability, Ratio 14.7:1 on #fff
Zinc-600 — #52525b — --ifm-color-emphasis-600
Metadata, secondary text — Ratio 7.8:1 on #fff (D110: raised from Zinc-500)
CSS Variable Contract
| Variable | Dark | Light | Role |
|---|---|---|---|
--ifm-heading-color |
#fafafa | #18181b | Headings — Zinc-900 in light, near-white in dark |
--ifm-font-color-base |
#e4e4e7 | #27272a | Body text — Zinc-800 in light, silk in dark |
--ifm-color-primary |
#808af0 | #4338ca | Links, active states, sidebar |
--zenzic-accent |
#3ab3c4 | #0891b2 | Hover states, archive cards, sidebar links |
--zenzic-author-signature |
— | #3730a3 | The Author's Signature — reserved for human identity |
--zenzic-fatal |
#8b0000 | #991b1b | Z201–203 security findings, credential & path traversal |
The Author's Signature Doctrine
Zinc is the architecture — cold, industrial, precise. It defines the document: headings, body, metadata. Zinc conveys: this content is technical, universal, trustworthy.
Indigo is the soul — the author's mark on the machine.
Reserved exclusively for --zenzic-author-signature on the creator's name.
In a field of Zinc, a single Indigo node draws the eye to its origin.
One colour. One meaning. Non-negotiable.
Law: Never use hardcoded accent hex values in component styles.
Always consume var(--zenzic-accent), var(--zenzic-fatal), and var(--zenzic-author-signature).
Theme adaptation is free. Hardcoding is a regression.
§ 09 — Web Performance & CLS
Cumulative Layout Shift (CLS) degrades perceived performance and is penalised by Core Web Vitals. Every image, SVG, and icon in the Zenzic documentation site must carry explicit dimensions so the browser reserves the correct space before the asset loads. A static analyzer must not produce dynamic layout regressions.
| Asset Type | Standard Size | Implementation | Rule |
|---|---|---|---|
| Navbar logo | 32 × 32 px |
docusaurus.config.ts logo.width/height |
Explicit — prevents navbar CLS on first load |
| Inline icon | 16 × 16 px |
<img width="16" height="16" /> |
Always explicit on <img> tags |
| Feature icon | 40 × 40 px |
<img width="40" height="40" /> |
Cards, hero sections, doc callouts |
| Architecture SVG | native viewBox |
style="aspect-ratio:16/9;width:100%" |
Responsive diagrams — aspect-ratio reserves space |
Law: No <img> or <Image> component may be
merged without explicit width and height attributes (or aspect-ratio CSS on
fluid containers). PRs that introduce dimensionless images are rejected by the visual hardening protocol (D110).
§ 10 — React Components Palette Contract
Every visual React component must consume palette values via CSS custom properties in
src/css/custom.css. Direct hex usage inside JSX/TSX styles is forbidden. The runtime
source of truth is the --zenzic-* token family and the semantic bridges bound to Docusaurus
variables (--ifm-*).
| React Surface | Approved Variables | Usage | Policy |
|---|---|---|---|
| Primary action buttons | --zenzic-brand, --zenzic-brand-soft |
CTA, nav actions, highlighted links | No direct brand hex values in component code |
| Status indicators | --zenzic-success, --zenzic-warning, --zenzic-error, --zenzic-fatal |
Badges, warnings, diagnostics panels | Semantic mapping must match finding severity |
| Text hierarchy | --zenzic-ink-100, --zenzic-ink-200, --zenzic-ink-400, --zenzic-ink-700 |
Headings, body copy, metadata | Use token-based contrast tiers only |
| Surface and borders | --zenzic-slate-900, --zenzic-slate-800, --zenzic-border-dark-30 |
Cards, containers, separators | No opaque hardcoded overlays in TSX |
Implementation snippet (React):
export function AuditBadge(): React.JSX.Element {
return (
<span
style={{
backgroundColor: 'var(--zenzic-brand)',
color: 'var(--zenzic-ink-100)',
border: '1px solid var(--zenzic-border-brand-35)',
}}
>
audit: passed
</span>
);
}
Enforcement: UI pull requests are rejected if JSX inline styles,
CSS modules, or component-scoped styles introduce raw hex values instead of --zenzic-* tokens.
The brand specification and runtime CSS must remain isomorphic.
Zenzic · Open Source · Apache-2.0 · zenzic.dev · [email protected]