[00]brand & design system

live reference · v3 · 2026

Brand & design,
the way k256 ships it.

This page renders every primitive, token, chart, and layout that the product uses. It pulls the same components the rest of the app pulls — so when something drifts here, the app drifted too. Use this as the canonical reference for any k256-branded surface.

Live componentsIn sync with the appv3 · February 2026
[01]identity / the K mark

One mark, every surface.

The k256 mark is a geometric K assembled from two mirrored 7-vertex polygons on a 100×100 grid. There is only one set of polygon coordinates across the entire system — favicon, app icon, lockups, hero, watermark all derive from the same two `<polygon>` elements.

Color variants

Brand on dark — primary

White on dark

Black on light

Single source of truth. Every variant uses the identical polygon coordinates. Never redraw the mark — always import K256Logo.

Construction

Geometry on a 100×100 unit grid. Upper and lower halves are perfect mirrors around y=50.

anatomy

measurements

viewBox
0 0 100 100
upper polygon
16,6 30,6 30,37 65,6 82,6 48,44 16,44
lower polygon
16,56 48,56 82,94 65,94 30,63 30,94 16,94
vertical bar
x: 16 → 30 (14 units)
arm tip width
x: 65 → 82 (17 units)
horizontal span
x: 16 → 82 (66 units)
vertical span
y: 6 → 94 (88 units)
channel gap
y: 44 → 56 (12 units)
aspect ratio
66:88 = 3:4
weight ratio
diagonal : bar = 1.21 : 1

Clear space

Maintain minimum clear space equal to the vertical bar width (14% of K height) on every side.

14%14%14%14%

Minimum size

Never reproduce the mark smaller than these dimensions.

16px — favicon
24px — min digital
32px — nav bar
48px — standard
80px — hero
[02]lockups / mark + wordmark

K256Wordmark — the canonical lockup.

One horizontal lockup with built-in proportions: text height = 42% of mark, gap = 4% of mark. The component enforces the ratio — you cannot break it by passing a different height. A stacked variant lives in the brand kit as SVG/PNG (`brand-design/k256-brand-kit/stacked/`) for environments that can't render React; in product surfaces, always use K256Wordmark.

Horizontal lockup

K256Wordmark

k256

K256Wordmark full

k256.xyz
import { K256Wordmark } from "@/components/ui/k256-logo";

// Short — for header/nav contexts
<K256Wordmark height={40} />

// Full — for hero / footer contexts
<K256Wordmark height={40} full />

At every size

k256.xyz
height=24
k256.xyz
height=32
k256.xyz
height=48
k256.xyz
height=64

Color variants

primary

k256.xyz

on light

k256.xyz

on brand

k256.xyz
Proportions are non-negotiable. Text = 42% of mark height with a 4% gap. The component computes both — never override them with custom spacing.
[03]loading / motion of the mark

The K breathes when we wait.

The animated K is the only loader in the product. Two halves rise and fall through the channel — never a spinner, never a generic dot loader.

K256Loader — three sizes

size=28
size=56
size=96

K256LoadingState — full-canvas wait

When the wait dominates the surface, pair the loader with a label and an optional detail line.

Booting Replay environment

Streaming the snapshot. Cached snapshots finish in seconds.

PageSkeleton — per-route fallback

Used by every authed route's `loading.tsx`. Renders the page header chrome and a centered loader so the shell stays mounted during navigation.

Workspace

Replay servers

Boot, advance, and inspect mainnet environments your team controls.

Skeleton — placeholder atom

A single pulsing `surface-3` rectangle. Use this alone for inline placeholders (a row in a table, a KPI value mid-fetch). For substantial loading surfaces — cards, panels, full sections — reach for `SkeletonCard` below so the k256 watermark stays present.

SkeletonCard — the canonical loading surface

A glass card with the `k256.xyz` wordmark painted behind at the same 6.5% opacity every chart uses. Pair it with `Skeleton` atoms for the rows. This is the only way to render a loading card in product — never wrap raw atoms in a plain `<div>`, or the surface reads as a grey blank instead of a k256 surface.

KPI

KPI

KPI

KPI

Replay timeline

import { Skeleton, SkeletonCard } from "@/components/ui/skeleton";

<SkeletonCard eyebrow="Replay timeline">
  <Skeleton className="h-4 w-40" />
  <Skeleton className="h-3 w-full" />
</SkeletonCard>
[04]color / system tokens

One brand spectrum, three surface ramps.

Every color is a CSS variable defined in app/globals.css. Components reference tokens, never hex literals — a brand refresh propagates through the system without touching component code.

Brand spectrum

The Solana-green axis from invisible whisper to fully-saturated brand. Use whisper/soft for backgrounds, glow/focus for ambient effects, brand for accents and CTAs.

on this swatch · text is black

Brand

--color-brand

#14F195

on this swatch · text is black

Brand Dim

--color-brand-dim

#0BC177

Brand Mid

--color-brand-mid

rgba(20,241,149,0.50)

Brand Focus

--color-brand-focus

rgba(20,241,149,0.40)

Brand Glow

--color-brand-glow

rgba(20,241,149,0.25)

Brand Soft

--color-brand-soft

rgba(20,241,149,0.12)

Brand Whisper

--color-brand-whisper

rgba(20,241,149,0.03)

Surfaces

Layered white-on-black ramp. Each step is a 1–2% alpha bump — quiet visual hierarchy without competing brightness.

Background

--background

#0A0A0A

Surface 0

--color-surface-0

rgba(255,255,255,0.01)

Surface 1

--color-surface-1

rgba(255,255,255,0.02)

Surface Glass

--color-surface-glass

rgba(255,255,255,0.03)

Surface 2

--color-surface-2

rgba(255,255,255,0.04)

Surface 3

--color-surface-3

rgba(255,255,255,0.06)

Surface 4

--color-surface-4

rgba(255,255,255,0.08)

Text hierarchy

Six-step white-on-black opacity ramp. Primary for hero text, quaternary/quinary for labels and supporting copy.

Primary

--color-text-primary

#FFFFFF

Secondary

--color-text-secondary

rgba(255,255,255,0.70)

Tertiary

--color-text-tertiary

rgba(255,255,255,0.55)

Quaternary

--color-text-quaternary

rgba(255,255,255,0.40)

Quinary

--color-text-quinary

rgba(255,255,255,0.25)

Disabled

--color-text-disabled

rgba(255,255,255,0.12)

Borders & keyline

Five steps from invisible to sharp. Keyline is reserved for the stat-card corner bracket and other intentional accents.

Subtle

--color-border-subtle

rgba(255,255,255,0.04)

Default

--color-border-default

rgba(255,255,255,0.06)

Strong

--color-border-strong

rgba(255,255,255,0.08)

Emphasis

--color-border-emphasis

rgba(255,255,255,0.12)

Keyline

--color-keyline

rgba(255,255,255,0.22)

Status colors

Each semantic color has a solid pair and a soft (12% alpha) pair. Soft variants tint surfaces, solid variants render text and icons.

on this swatch · text is black

Success

--color-success

#14F195

Success Soft

--color-success-soft

rgba(20,241,149,0.12)

on this swatch · text is black

Warning

--color-warning

#F59E0B

Warning Soft

--color-warning-soft

rgba(245,158,11,0.12)

Danger

--color-danger

#EF4444

Danger Soft

--color-danger-soft

rgba(239,68,68,0.12)

Danger Whisper

--color-danger-whisper

rgba(239,68,68,0.06)

Info

--color-info

#6366F1

Info Soft

--color-info-soft

rgba(99,102,241,0.12)

Chart palette

Seven-color sequence used by every chart. Brand always leads, blue is the canonical secondary, violet is the canonical tertiary axis (latency p99).

on this swatch · text is black

Brand

CHART_PALETTE[0]

#14f195

Blue

CHART_PALETTE[1]

#60a5fa

on this swatch · text is black

Amber

CHART_PALETTE[2]

#f59e0b

Violet

CHART_PALETTE[3]

#8b5cf6

Red

CHART_PALETTE[4]

#ef4444

on this swatch · text is black

Cyan

CHART_PALETTE[5]

#22d3ee

on this swatch · text is black

Lime

CHART_PALETTE[6]

#a3e635

Scrims

Black-alpha overlays for dialogs, modals, and contextual backdrops. `deep` is reserved for expanded chart modals.

Subtle

--color-scrim-subtle

rgba(0,0,0,0.25)

Soft

--color-scrim-soft

rgba(0,0,0,0.40)

Strong

--color-scrim-strong

rgba(0,0,0,0.50)

Deep

--color-scrim-deep

rgba(0,0,0,0.60)

Contrast ratios

White on Background (#0A0A0A)18.6 : 1
Brand (#14F195) on Background12.8 : 1
Text Secondary (70%) on Background13.0 : 1
Text Tertiary (55%) on Background10.2 : 1
On-brand (#000) on Brand11.1 : 1
Danger (#EF4444) on Background4.7 : 1
[05]typography / two faces

Geist Sans + Geist Mono.

One sans for product surfaces, one mono for code, hashes, and labels. Both load through `next/font` so glyphs are inlined and self-hosted — no FOIT, no Google Fonts ping.

Type scale

Solana mainnet, paused on a frame.
48px/weight 600/Hero — landing
Brand & Design System
30px/weight 600/Page heading
The K breathes when we wait.
20px/weight 600/Section heading
Replay starts from any mainnet snapshot, lets you advance forward slot by slot, splice transactions into the stream, and patch accounts.
15px/weight 400/Body
The product should answer with state, slots, logs, and replayable context.
13px/weight 500/Body small
[01] commitments / how we think
11px/weight 600/Eyebrow

Monospace — Geist Mono

Used for code, addresses, slot numbers, signatures, latency values, and uppercase eyebrow labels.

0x7c95e7…3a4f
5g4F2Pq…Wq3vB · slot 296_412_811
latency p50=18ms · p90=42ms · p99=137ms
boot · advance · accounts · blocks · rpc · logs · history

Casing rule

The brand name is always lowercase: k256 or k256.xyz — never “K256” or “K256.XYZ”. Uppercase is reserved for tracked eyebrow labels like CURRENT SLOT.
[06]spacing / corner radius

One radius scale, generous.

The default radius is 24 px (rounded-2xl). Buttons and pills are rounded-full. Inputs share rounded-2xl with cards. Smaller radii are reserved for badges (rounded-full) and code chips (rounded-xs).

Radius scale

--radius-xs

6 px

--radius-sm

20 px

--radius-md

22 px

--radius-lg

24 px

--radius (base)

24 px

--radius-3xl

24 px

rounded-full

9999 px

Layout primitives

Standard inner padding for cards / glass surfaces and the floating header pill.

p-5 sm:p-6

Card padding

p-4

Small panel

px-4 py-2

Floating pill

Touch targets

Every interactive element renders at 44 px (h-11) on mobile, collapsing to 36 px (h-9) at the `sm` breakpoint.

[07]motion / duration & easing

Motion is part of the brand.

Three durations, two easings, three blurs. Motion is restrained: most interactions resolve in 200 ms, framer-motion springs only show up on layout transitions (tabs, sheets, modals).

durations

--duration-instant
100 ms
--duration-base
200 ms
--duration-slow
400 ms

easings

--ease-standard
ease (CSS default)
--ease-gentle
cubic-bezier(.16,1,.3,1)
spring (framer)
bounce 0.2 / duration 0.4

blur tiers

--blur-glass-sm
16 px
--blur-glass-md
24 px
--blur-glass-lg
40 px

Glass backdrop demo

Three blur tiers behind the brand spectrum. Hover any tile to see the saturate boost (`backdrop-saturate-[1.4]`).

sm — 16px
md — 24px
lg — 40px

Collapse — the canonical expand/collapse animation

Inline forms (Add member, New proposal, Create policy, Bind program, Subscribe webhook…) always slide open from height: 0 → auto with the brand gentle ease. Never `display: none → block` — that's the 'blink' anti-pattern. The wrapper is always `overflow-hidden` so nested content cannot peek out while the height interpolates. Shared primitive: `components/ui/collapse-section.tsx` — never reimplement the keyframes.

height: 0 → auto · 240ms · cubic-bezier(.16, 1, .3, 1) · overflow-hidden
[08]shadows / depth & glow

Brand-tinted, never gray.

Shadows on dark surfaces use black for elevation and brand-green for state. Glass cards stack a small black drop with an inset refraction — gray drop shadows are off-limits.

--shadow-glass-sm

Default card depth

--shadow-glass-md

Tooltip / floating UI

--shadow-glass-lg

Hero / console preview

--shadow-modal

Dialog / sheet

--shadow-brand-glow

CTA buttons, primary action

--shadow-stat-glow-up

KPI rising

--shadow-stat-glow-down

KPI falling

Inset refractions

--shadow-inset-refraction (standard)
--shadow-inset-refraction-soft (subtle)

Inset refractions add a 1-pixel highlight along the top and left edges, simulating light catching a glass surface. Compose with shadow-[var(--shadow-glass-sm),var(--shadow-inset-refraction-soft)] for the canonical glass-card stack.

Logo drop shadows

shadow="none"
shadow="subtle"
shadow="standard"
shadow="glow"
Never use black or gray drop shadows on the K mark. The green glow is a core brand signature.
[09]gradient / atmospheric wash

Reserved for the inside of k256.

A multi-stop gradient washes brand green into cyan, blue, and violet before fading into the dark background. It belongs to the workspace — the dashboard, the brand reference — as an arrival cue that says “you are inside the system.” The marketing front door (welcome, the-gap, how-we-think, replay, legal, 404) stays flat dark so the signature visual on /welcome (the mainnet specimen) and editorial typography carry the brand colour on their own.

import { PAGE_GRADIENT } from "@/lib/page-gradient";

<div
  className="relative min-h-screen bg-background"
  style={{ backgroundImage: PAGE_GRADIENT }}
>
  …
</div>
[10]components / buttons

Button — every CTA, every variant.

One primitive, six variants, four sizes. The default variant is the brand-gradient pill that ships every primary action. Outline and ghost cover secondary actions; destructive carries the danger token.

Variants

Sizes

States

Every variant inherits a focus-visible:ring-[3px] focus-visible:ring-brand-soft focus ring and an active:scale-[0.98] tactile press.
[11]components / badges

Badge — status at a glance.

Status pills with seven semantic variants and three sizes. Opt into a dot prefix with `withDot` for live / state markers (active environment, online status, deploy state).

Variants

BrandSuccessWarningDangerInfoNeutralOutline

Sizes

SM 10pxMD 11pxLG 12px

With status dot

OnlineBootingFailedLiveIdle
[12]components / eyebrow & delta

Eyebrow + InlineDelta.

Two atoms used everywhere. Eyebrow is the tracked-uppercase label above every KPI, section, and dropdown. InlineDelta is the ▲ / ▼ glyph that decorates every change-since-last-period value across the app.

Eyebrow sizes & tones

SM — KPI labels & column heads

10 px / 0.16 em

MD — Section headers

11 px / 0.16 em

LG — Page sections

12 px / 0.18 em

DefaultMutedStrongBrand

InlineDelta directions

30.34M-7.0%
1.03M+9.0%
412No change

Use invertSemantics for metrics where rising means worse (error rate, p99 latency, queue depth) — the glyph stays direction-correct but the color flips.

[13]components / stat cards

StatCard — every KPI on every surface.

Liquid-glass surface, top-left corner bracket, eyebrow label, hero tabular-nums value, optional live pulse, inline delta, ambient bottom glow tied to direction. Do not invent parallel KPI tiles — extend this primitive.

Three sizes

REQS / SEC
2.4k+12.0%
TOTAL VOLUME
$84.2M-3.4%
ACTIVE SERVERS
14+2

With live pulse + description

CURRENT SLOT
296_412_811

Streaming canonical blocks at ~412 ms per slot.

P99 LATENCY
137 ms+18 ms

Rising. Investigate hotspot endpoints in the latency chart below.

Tone variants

NEUTRAL
412
BRAND
$1.2K
MUTED
DANGER
14 fail

StatCardGrid layouts

BOOTS
142
ADVANCES
3.4M
MUTATIONS
48
RPCS / SEC
2.1k
[14]components / pill tabs

PillTabs — animated tab strip.

Roving tabindex radiogroup with a framer-motion `layoutId` for the active pill background. Two variants: soft (brand-soft pill on transparent track) for content tabs, solid (brand fill on bordered track) for filter sets.

Soft variant — content tabs

Solid variant — toggle

TimeRangePills — canonical chart filter

Built on PillTabs in `solid` size sm. Used in every chart footer and every time-bounded KPI strip.

current = 7d

[15]components / copy

CopyButton + CopyableValue.

Two flavors of copy. CopyButton is a standalone glyph + label for actions. CopyableValue wraps a displayed value so the entire span becomes copyable on click — the standard pattern for addresses, signatures, slot numbers.

CopyButton — explicit action

CopyableValue — inline span

signature
workspace id
display name
[16]components / surfaces

GlassCard + surface tokens.

GlassCard is the framer-motion surface used by the dashboard. It stacks `bg-surface-glass`, a 24 px backdrop blur, a 1 px default border, and a small glass shadow. Compose, do not duplicate.

Three sizes, with and without hover

SM

Compact glass tile — list rows, status callouts.

MD + HOVER

Default card body. Click target — scales 1.005 on hover.

LG

Full-bleed glass surface — hero panels, feature cards.

Surface ramp in context

Each surface level layered against the page background — how the depth ramp reads in practice.

surface-0
surface-1
surface-2
surface-3
surface-4
surface-glass
[17]components / forms

Input, Textarea, Select, Checkbox, Switch.

Form primitives share the glass surface vocabulary: `bg-surface-2 backdrop-blur-xl border-border-strong`, a `rounded-2xl` corner, and the brand focus ring. Mobile inputs render at 16 px (iOS auto-zoom guard) and collapse to 14 px at the sm breakpoint.

Text fields

Selection controls

[18]components / dialogs

Dialog + AlertDialog.

Two modal primitives, both wrappers around Radix. Dialog is the general-purpose centered sheet (forms, content). AlertDialog is the must-answer confirmation, including destructive deletes — its cancel/action buttons compose with `buttonVariants` directly.

Dialog — form / content

AlertDialog — destructive confirm

[19]components / toasts

Toaster — live notifications.

Single fixed-position queue, mounted once in `AppProviders`. Three tones (success, error, info) with auto-dismiss (4 s default, 6 s for errors). Used for mutation feedback, server-action results, and recoverable errors.

Toasts surface from the top-right corner. Errors stay on screen longer because the user needs time to read what went wrong.

[20]components / charts

ChartShell + four chart kinds.

Every chart in k256 is composed inside ChartShell. The shell handles every interaction so chart authors only render geometry. Card header: title, subtitle, info icon (hover popover), and a brand-dot fetching indicator in the top-right corner. Content area: the k256 wordmark watermark scales with the container and renders behind every state (data, loading, empty, error) — never absent. Right panel: Series legend with `All` reset, click to toggle, double-click to copy the label. Footer: D · W · M · Q · Y time-range pills, Download (presentation-ready SVG with title, subtitle, footer, and timestamp), and Maximize. Expanded view: a portal-mounted modal with `k256.xyz / Expanded / <title>` breadcrumb, the same chart 4× larger, and a right panel that splits into Series (top) + Data (bottom, copy-on-click table). ESC to close. Four chart kinds plug into the same shell: time series, donut, grouped bar, horizontal bar.

AnalyticsChart — primary + secondary axis

Brand line on the right axis, red line on the left axis. Use when both series share the same unit (counts, dollars, requests) so a viewer can read both scales in the same compact-number format.

Reads vs writes per second

The brand green line is the canonical primary; red (CHART_PALETTE[4]) is the canonical secondary.

AnalyticsChart — primary + tertiary (latency) axis

Same shell, but the left axis is reserved for the latency tertiary series (violet). The tertiary formatter is `latency-ms` so the axis ticks come out as `12ms`, `120ms`, `1.2s`. Use this pairing whenever the second series is measured in time, not counts.

Reads vs P99 latency

Brand line = reads / sec on the right axis. Violet line = P99 ms on the left axis.

DonutChart — composition

Hover to highlight a slice; click to select (if `onSelectSlice` is wired). The center stays anchored to the total of the visible slices, so hiding a slice via the legend rebalances the readout.

RPC method mix

LatencyHotspotsChart — grouped bar

P50/P90/P99 bars per endpoint with an overlay line for error rate on the right axis. The canonical 'where are we slow' chart.

Latency hotspots

HorizontalBarChart — ranked list

Horizontal bars with labels left-aligned and counts right-aligned. Used for top programs, top endpoints, top accounts — anything you'd want to read top-down.

Top programs by request volume

States — loading, empty, error, fetching

Every chart inherits a `K256Loader` while loading, a faded mark + message when empty, and an explicit error state when the upstream query fails. The fetching state keeps the previous data on-screen and pulses a brand dot next to the title — the canonical 'refreshing in the background' affordance. All four states preserve the chrome so the page does not jump.

Loading state

Empty state

No data yet

Error state

Chart data is temporarily unavailable.

Fetching state

Watermark.Every chart paints the k256 wordmark behind every state — data, loading, empty, error — at 6–8% opacity. The size scales with the container (9% of width, 28% of height, clamped to 18–54 px). A screenshot of any chart at any moment still reads as a k256 asset. Never export without it.
[21]layouts / shells

PublicHeader + PublicFooter + DashboardShell.

Two shells. PublicHeader/PublicFooter wrap every marketing and legal surface. DashboardShell wraps every authed product surface — a thin floating glass pill on top, a content well in the middle, and the same PublicFooter underneath.

PublicHeader — floating pill

The live header you see at the top of this page. Auth-aware: signed-out users see 'Sign in', signed-in users see 'Dashboard'. The active nav link slides via a shared framer-motion layoutId.

Scroll to the top of this page — the same component is mounted on every public route (/, /the-gap, /how-we-think, /replay, /branding).

DashboardShell — authed product chrome

Compact floating pill on top: K mark, 'k256 · Replay', NAV_ITEMS strip (empty while only one product ships), workspace switcher on the right, and a user dropdown for Workspace / Account / Billing / Sign out.

k256
Workspace · k256-research

Replay servers

Boot, advance, and inspect mainnet environments your team controls.

Glass dropdown menus — workspace switcher + account

Both header pills open the same glass menu primitive: a 2xl border-strong card, popover surface, glass-lg shadow, and inset refraction. The workspace switcher above the line, the user/account menu to the right of it. These are the canonical patterns for every dropdown across the dashboard.

workspace switcher · open

account menu · open

PublicFooter

Five links + copyright: Why, How we think, Replay, Terms, Privacy. Marketing surfaces only — authenticated routes use AuthedFooter.

Scroll to the bottom of this page to see the live PublicFooter.

[22]brand / app icon & favicon

Black K, brand-green tile.

App icons use a black K on a brand-green background. Two container shapes: square for social and web tiles, rounded for iOS/Android home screens. The browser favicon is a white K on transparent — derived from the same polygon coordinates.

App icon tiles

square

Social profile, OG tile — flat square

rounded

iOS / Android / avatar — rx=20 (20%)

favicon

Browser tab — white on transparent, no container rounding

Asset sizes

favicon.svg
vector — scales infinitely
icon-192.png
192 × 192 (Android home)
icon-512.png
512 × 512 (Android splash, PWA)
apple-touch-icon.png
180 × 180 (iOS home screen)
opengraph-image
1200 × 630 (Open Graph, dynamic)
twitter-image
1200 × 630 (Twitter card, dynamic)

Manifest theme

{
  "name": "k256 - Solana Research Lab",
  "short_name": "k256",
  "background_color": "#0a0a0a",
  "theme_color": "#14f195",
  "display": "standalone"
}
[23]brand / social cards

1200 × 630, every share.

Open Graph and Twitter cards both render at 1200 × 630. Mirror of the production output from `app/opengraph-image.tsx`: an editorial lab card, not a centered logo. The mark and wordmark sit top-left, the `A lab. On Solana.` headline and one-line support fill the left column, a brand-green Research · Systems · Products footer closes it, and on the right the K loader is frozen mid-expansion (with a motion trail) so the still reads as something alive. Unfurls can't animate, so the freeze-frame does the work and the live motion pays off on click.

k256
A lab.On Solana.
We build the hard parts underneath.
Research · Systems · Productsk256.xyz
SOLANA RESEARCH LAB

1200 × 630, rendered at /opengraph-image and /twitter-image. This preview mirrors `app/opengraph-image.tsx` 1:1: colors, typography, and spacing in cqw units so the proportions match every share size.

[24]discipline / do's & don'ts

Protect the mark.

Six rules with visual examples. These are non-negotiable — they keep the K reading as one mark across every surface.

✓ Do

Do — use brand glow on dark

✗ Don't

Don't — use gray or off-brand colors

✓ Do
k256

Do — keep lockup tight (gap = 4% of mark)

✗ Don't
k256

Don't — open the gap with custom spacing

✓ Do
k256.xyz

Do — write the brand name lowercase

✗ Don't
K256.XYZ

Don't — capitalize the brand name

✓ Do

Do — preserve the 1:1 proportions

✗ Don't

Don't — stretch, squish, or rotate the K

✓ Do

Do — use on-green for app icons

✗ Don't

Don't — place the K on off-brand backgrounds

✓ Do

Do — use the animated K for loading

✗ Don't

Don't — substitute a generic spinner

[25]reference / svg source

Minimal embeddable SVG.

When you can't import the React component (emails, vendor docs, static reports), use this exact SVG. The polygon coordinates are the canonical source — never modify them.

<svg viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
  <polygon points="16,6 30,6 30,37 65,6 82,6 48,44 16,44" fill="currentColor" />
  <polygon points="16,56 48,56 82,94 65,94 30,63 30,94 16,94" fill="currentColor" />
</svg>

Component API

K256Logo size
number (default 32)
K256Logo color
string (default currentColor)
K256Logo shadow
none | subtle | standard | glow
K256Wordmark height
number (default 40)
K256Wordmark full
boolean (k256.xyz vs k256)
K256Loader size
number (default 48)
import {
  K256Logo,
  K256Wordmark,
  K256Loader,
  K256LoadingState,
} from "@/components/ui/k256-logo";

<K256Logo size={32} />
<K256Wordmark height={40} full />
<K256Loader size={48} />
<K256LoadingState
  label="Booting Replay"
  detail="Streaming snapshot..."
/>
Asset bundle on disk — k256-web-app/brand-design/k256-brand-kit/ — ships 28 SVGs and 78 PNGs (logo, horizontal, stacked, on-green, text-only, favicon, social). Use the React components first; the disk assets are for environments that can't render React.