Zenzic · Brand System · v0.7.1a1 · Obsidian Maturity
Wordmark Usage — Dark & Light
Dark background
#09090b (Obsidian Lead) or deeper#F8FAFC near-white#38bdf8 Harbor CyanLight background
#F1F5F9 or lighter#0F172A near-black#4f46e5 Sentinel IndigoPalette v0.7.1a1 — Obsidian Maturity Edition · Bimodal Indigo: Light #4338ca (AAA 7.4:1) · Dark #a5b4fc (AAA 8.9:1)
Identity
Signals
Surface
Headings · Inter 700
Zenzic
The Safe Harbor
Body · Inter 400 / 500
Engine-agnostic quality guarantee for
Markdown documentation at every scale.
Secondary text · labels · captions
Code / UI · JetBrains Mono
SENTINEL · SHIELD · HARBOR
uvx zenzic check all ./docs
v0.7.1a1 · obsidian maturity · 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 | Sentinel banner, panel borders, primary accent | — |
| SUCCESS | _EMERALD | #10b981 | Clean check, ✨ Obsidian Seal, pass 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 | _BLOOD | #8b0000 | Security incidents only — Shield (Z201) and Blood Sentinel (Z202–203) | 2 / 3 |
Law: External code must reference semantic names only
(ObsidianPalette.BRAND, .SUCCESS, …).
Private hex constants (_INDIGO, _BLOOD, …) 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.ObsidianPalette.
No hex value is hardcoded outside of that class — not in report templates, not in
scanner output, not in the Sentinel 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
ObsidianPalette. 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.
ObsidianPalette.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 ObsidianPalette.FATAL. If you use it for anything else, you are
violating the semantic contract of the Sentinel 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 --obsidian-blood — 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.
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 — Obsidian Lead
Indigo Vibrante — #4f46e5
--ifm-color-primary · Ratio ~5.2:1 on #09090b
Cyan Elettrico — #06b6d4
--obsidian-accent · Ratio ~6.8:1 on #09090b
Sangue Profondo — #8b0000
--obsidian-blood · Blood Sentinel & Security
Light Mode — White Surface
Indigo Inchiostro — #3730a3
--ifm-color-primary [light] · Ratio ~7.9:1 on #fff
Cyan Profondo — #0891b2
--obsidian-accent [light] · Ratio ~4.6:1 on #fff
Rosso Mattone — #991b1b
--obsidian-blood [light] · Ratio ~7.1: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 |
#818cf8 | #3730a3 | Links, active states, sidebar |
--obsidian-accent |
#06b6d4 | #0891b2 | Hover states, archive cards, sidebar links |
--obsidian-author-signature |
— | #3730a3 | The Author's Signature — reserved for human identity |
--obsidian-blood |
#8b0000 | #991b1b | Blood Sentinel, security findings, Shield |
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 --obsidian-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(--obsidian-accent), var(--obsidian-blood), and var(--obsidian-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 Porto Sicuro does not jump.
| 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).
Zenzic · Open Source · Apache-2.0 · zenzic.dev · [email protected]