components
Same DOM in static HTML or React. Each component lists both. Pick the tab that matches your stack.
Mark
The brand glyph. SVG, scales with size, colors via currentColor.
<svg class="sn-mark sn-mark--lg" viewBox="0 0 32 32" fill="currentColor" aria-hidden="true">
<!-- crystal paths… -->
</svg>
<!-- pre-built sprite -->
<svg class="sn-mark sn-mark--lg"><use href="/icons/marks.svg#crystal"/></svg>import { MarkCrystal } from "@snowztech/ui";
<MarkCrystal size={48} />
<MarkCrystal size="lg" />
<MarkCrystal size={64} color="var(--sn-accent)" />Seven other variants live in the logo lab.
Monogram
Wraps any mark in a tile. App icons, brand stamps.
<span class="sn-monogram sn-monogram--md">
<svg class="sn-mark sn-mark--md" viewBox="0 0 32 32"><!-- mark --></svg>
</span>
<span class="sn-monogram sn-monogram--inverse">
<svg class="sn-mark sn-mark--md"><!-- mark --></svg>
</span>import { Monogram, MarkCrystal } from "@snowztech/ui";
<Monogram size={64} mark={MarkCrystal} />
<Monogram size={64} mark={MarkCrystal} bg="#f7f7f5" fg="#161616" radius={10} />Avatar
Image with initials fallback. Circle or square. Optional ring.
<span class="sn-avatar sn-avatar--lg">DR</span>
<span class="sn-avatar sn-avatar--lg sn-avatar--square">DR</span>
<span class="sn-avatar sn-avatar--lg sn-avatar--ring">DR</span>
<span class="sn-avatar sn-avatar--md">
<img src="/me.jpg" alt="">
</span>
<span class="sn-avatar-stack">
<span class="sn-avatar sn-avatar--md sn-avatar--ring">A</span>
<span class="sn-avatar sn-avatar--md sn-avatar--ring">B</span>
<span class="sn-avatar sn-avatar--md sn-avatar--ring">C</span>
</span>import { Avatar, AvatarStack } from "@snowztech/ui";
<Avatar size={48} name="DR" />
<Avatar size={48} src="/me.jpg" name="DR" />
<Avatar size={48} name="DR" shape="square" ring />
<AvatarStack overlap={10}>
<Avatar size={32} name="Ada" ring />
<Avatar size={32} name="Bo" ring />
</AvatarStack>Wordmark
snowztech.
<span class="sn-wordmark" style="--sn-wordmark-size: 24px">
snowztech<span class="sn-wordmark__dot">.</span>
</span>import { SnowWordmark } from "@snowztech/ui";
<SnowWordmark size={24} />Pulse
Status dot with breathing animation.
onlinedegradeddown
<span class="sn-pulse sn-pulse--success">
<span class="sn-pulse__dot"></span>
<span>online</span>
</span>
<span class="sn-pulse sn-pulse--warning">
<span class="sn-pulse__dot"></span>
<span>degraded</span>
</span>import { Pulse } from "@snowztech/ui";
<Pulse label="online" />
<Pulse color="var(--sn-warning)" label="degraded" />
<Pulse color="var(--sn-danger)" label="down" />Buttons
.sn-btn + a variant. Sizes via --sm / --lg.
{/* variants */}
<button className="sn-btn sn-btn--primary">Primary</button>
<button className="sn-btn sn-btn--secondary">Secondary</button>
<button className="sn-btn sn-btn--ghost">Ghost</button>
<button className="sn-btn sn-btn--accent">Accent</button>
<button className="sn-btn sn-btn--danger">Danger</button>
{/* sizes */}
<button className="sn-btn sn-btn--primary sn-btn--sm">Small</button>
<button className="sn-btn sn-btn--primary sn-btn--lg">Large</button>Badges
defaultaccentokwarnerr
<span className="sn-badge">default</span>
<span className="sn-badge sn-badge--accent">accent</span>
<span className="sn-badge sn-badge--success">ok</span>
<span className="sn-badge sn-badge--warning">warn</span>
<span className="sn-badge sn-badge--danger">err</span>Input
<input className="sn-input" placeholder="Search…" />Card
Flat by default. Compose with --rounded, --accent, --inset.
Default
One border. Flat. Square corners.
Rounded
Bigger radius for friendlier surfaces.
Accent
Use sparingly to draw attention.
Inset + headerok
Recessed background. Pairs with header rows for stat tiles.
<div className="sn-card">…</div>
<div className="sn-card sn-card--rounded">…</div>
<div className="sn-card sn-card--accent">…</div>
<div className="sn-card sn-card--inset">…</div>
{/* compose */}
<div className="sn-card sn-card--rounded sn-card--accent">…</div>