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.
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
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.
Minimum size
Never reproduce the mark smaller than these dimensions.
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
K256Wordmark full
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
Color variants
primary
on light
on brand
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
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.
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>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.
Brand
--color-brand
#14F195
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.
Success
--color-success
#14F195
Success Soft
--color-success-soft
rgba(20,241,149,0.12)
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).
Brand
CHART_PALETTE[0]
#14f195
Blue
CHART_PALETTE[1]
#60a5fa
Amber
CHART_PALETTE[2]
#f59e0b
Violet
CHART_PALETTE[3]
#8b5cf6
Red
CHART_PALETTE[4]
#ef4444
Cyan
CHART_PALETTE[5]
#22d3ee
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
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
Monospace — Geist Mono
Used for code, addresses, slot numbers, signatures, latency values, and uppercase eyebrow labels.
Casing rule
k256 or k256.xyz — never “K256” or “K256.XYZ”. Uppercase is reserved for tracked eyebrow labels like CURRENT SLOT.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.
Card padding
Small panel
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.
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]`).
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.
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
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
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>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
Sizes
With status dot
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
10 px / 0.16 em
11 px / 0.16 em
12 px / 0.18 em
InlineDelta directions
Use invertSemantics for metrics where rising means worse (error rate, p99 latency, queue depth) — the glyph stays direction-correct but the color flips.
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
With live pulse + description
Streaming canonical blocks at ~412 ms per slot.
Rising. Investigate hotspot endpoints in the latency chart below.
Tone variants
StatCardGrid layouts
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
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
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
Compact glass tile — list rows, status callouts.
Default card body. Click target — scales 1.005 on hover.
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.
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
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
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.
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
Last 24 hours · two count series, two axesSeries
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
Last 24 hours · counts on the right, milliseconds on the leftSeries
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
Composition of all reads in the selected rangeSeries
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
P50 / P90 / P99 by endpoint, with error rateSeries
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
Solana mainnet · last 7 daysStates — 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
Skeleton while data resolvesEmpty state
No data in the selected rangeNo data yet
Error state
Upstream query failedChart data is temporarily unavailable.
Fetching state
Background refresh — brand dot pulses top-rightSeries
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.
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
Maria Konieczny
mk@k256.xyz
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.
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"
}Protect the mark.
Six rules with visual examples. These are non-negotiable — they keep the K reading as one mark across every surface.
Do — use brand glow on dark
Don't — use gray or off-brand colors
Do — keep lockup tight (gap = 4% of mark)
Don't — open the gap with custom spacing
Do — write the brand name lowercase
Don't — capitalize the brand name
Do — preserve the 1:1 proportions
Don't — stretch, squish, or rotate the K
Do — use on-green for app icons
Don't — place the K on off-brand backgrounds
Do — use the animated K for loading
Don't — substitute a generic spinner
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..."
/>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.
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.
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.