Mini Kraken logo
Mini KrakenRPG elettronico
StrumentiComunitàSostieni un progetto
Accedi
Visual Identity

The Arcane
Console

A nocturnal, high-density console for tabletop RPG — pink-neon command energy over deep ink, built to feel native, not webby.

›use shared primitives first
Space Grotesk · Hanken Grotesk · Space Mono
Index
  • 00Foundation
  • 01Color
  • 02Type
  • 03Components
  • 04Inputs
  • 05Value controls
  • 06Matrix
  • 07Disclosure
  • 08Surfaces
  • 09Patterns
  • 10Dashboard kit
  • 11Data
  • 12Feedback
  • 13Inventory
  • 14Recipes
  • 15A11y
  • 16Standards
  • 17Principles
00Working contract

Use the system before local chrome

This page is the migration contract for the panel: tokens first, shared primitives second, local styling only when a domain surface needs a real exception.

Tokens

src/styles/theme.ts

Primitives

ui · dashboard · media

Exceptions

canvas · charts · VTT · Discord

01Palette

Color

Deep ink for structure, a single hot pink for command. The arcane violet appears only inside glows and gradient meshes — never as a fill.

Surfaces

The ink ramp every layer is built on

Voidsurface-0

App background, the deepest layer

Chromesurface-1

Sidebars, top bars, sunken regions

Panelsurface-2

Default card / panel surface

Raisedsurface-3

Nested panels, popovers, menus

Elevatedsurface-4

Inputs, the highest interactive layer

Hoversurface-hover

Hover/focus state for elevated controls

Accent

Brand pink — used with intent, never as wallpaper

Accentaccent

Primary actions, active state, focus

Accent Hoveraccent-hover

Hover on primary surfaces

Accent Strongaccent-strong

Pressed state, dense fills

Arcanearcane

Secondary glow — gradients & auras only

Status

Reserved meanings — don't repurpose

Successsuccess

Confirmations, positive deltas

Warningwarning

Cautions, pending states

Dangerdanger

Destructive actions, errors

Infoinfo

Neutral highlights, hints

Lines

Edges and dividers

Subtleline-subtle

Low-contrast separators on dark fills

Defaultline

Standard panel and control borders

Strongline-strong

Emphasised edges, focused fields

Text

Foreground hierarchy

Inkink

Primary text and headings

Mutedink-muted

Secondary text, descriptions

Subtleink-subtle

Captions, placeholders, labels

Discord

Brand mimicry — only on surfaces that echo Discord's UI

Blurplediscord

Primary Discord action

Blurple Hoverdiscord-hover

Pressed/hover on Discord actions

Greendiscord-green

Online / positive in Discord chrome

Reddiscord-red

Destructive in Discord chrome

Linkdiscord-link

Link blue inside Discord surfaces

Surfacediscord-surface

Default Discord panel

Surface Strongdiscord-surface-strong

Deepest Discord chrome

Surface Deepdiscord-surface-deep

Near-black Discord fill

Textdiscord-text

Primary Discord text

Text Muteddiscord-text-muted

Muted Discord text

02Typography

Type

Space Grotesk gives titles a technical, slightly arcane voice. Hanken Grotesk keeps dense UI legible. Space Mono carries every number — dice, codes, counters.

Display

Ag

Space Grotesk

Body / UI

Ag

Hanken Grotesk

Mono / Numeric

Ag

Space Mono

Roll for initiative

Space Grotesk · hero headlines & brand voice

The Arcane Console

Space Grotesk · page & section titles

Encounter overview

Hanken Grotesk · card and block headings

A complete platform for game masters and players.

Hanken Grotesk · paragraphs and UI copy

Character sheet

Hanken Grotesk · labels & eyebrows

2d20 + 17

Space Mono · dice, codes & live numbers
03Primitives

Components

Shared primitives that consume the tokens directly — so the system stays consistent by construction, not by discipline alone.

Button — variants
Button — sizes
Chips & status
ActiveOnlinePendingErrorBeta
Loading
Pressable & spinner
Loading state

Interactive card

Lifts toward the accent on hover. Use for anything clickable.

Panel card

The default resting surface for content blocks.

Muted card

A quieter panel for secondary content.

04Inputs

Inputs and field states

Inputs need a shared contract: label, hint, value constraints, validation feedback and character counters where content can overflow.

Text input

Limited title

11/48

Keep titles short enough for cards and modal headers. 37 characters left.

Textarea47/160

Use textarea for long copy only; single-line fields should stay single-line. 113 characters left.

ToolTextarea
45 chars
Used by converter tools

Use ToolTextarea for two-pane conversion tools; keep generic form textareas in app forms.

Validation

Show one actionable error below the field.

Search / number / choice
Carry weight
kg

Text

Names, titles and short strings

Input + maxLength + counter

Search

Filtering local lists and tables

Input with icon + clear action

Number

Bounded values, amounts and units

NumberInput + min/max/step

Textarea

Descriptions and long copy

Textarea + maxLength + counter

Select

Finite choices

Select with searchable content when list is long

Switch

Boolean settings

Switch with explicit label and hint
05Value controls

Color, gradient and numeric controls

These already exist in the app and should be the default for color variation, visual tuning and bounded values.

ColorPicker

Accent color

Use for custom visual settings. Brand/system colors should still come from tokens.

GradientPicker

Accent gradient

Use for custom gradients. The closed control mirrors ColorPicker and keeps editing in the popover.

Slider
72%

Use for bounded visual values; pair with the current value when precision matters.

Paginationcompact aware
...
DatePicker
06Decision matrix

What to reach for

The default answer for common UI jobs. Start here before creating a new class cluster or local component.

Button

Actions and commands

Use · variant + sizeAvoid · hand-built clickable divs

Input / Select / Switch

Forms and settings

Use · shared control primitivesAvoid · local field chrome

Badge

Status, labels, compact counts

Use · tone + sizeAvoid · rounded-full clusters

Card

Panels, repeated objects

Use · panel / muted / inset / interactiveAvoid · new border + shadow combos

Modal tokens

Dialogs and focused workflows

Use · compact / fullbleed / split / sheetAvoid · per-file shell overrides

Media primitives

Image, video, audio and uploads

Use · preview surface firstAvoid · hidden input rebuilds
Controls
Tabs
Use tabs when the same object has peer views, not as decoration.
07Disclosure

Accordions and expandable content

Use disclosure for optional detail, advanced settings and grouped controls. Keep primary actions visible; don't hide the next required step inside an accordion.

Native firstdetails / summary
Advanced filters
Put rarely changed filters here. Keep search and primary filter chips outside.
Billing details
Use for read-only supporting information that helps a decision.
Danger settings
Use danger tone and require an explicit final action.

Disclosure rules

Use for

Optional detail, dense advanced controls, FAQ-like help and expandable table rows.

Avoid for

Primary CTAs, required form fields, critical errors or anything the user must see before continuing.

08Form

Radius & elevation

A small, fixed set of corner radii and narrative shadows. The accent glow is reserved for focus and primary intent.

00surface-0

App background

01surface-1

Navigation, shell chrome

02surface-2

Default panels and cards

03surface-3

Nested panels, menus

04surface-4

Inputs and high controls

Radius

rounded-sm10px
rounded-md14px
rounded-lg18px
rounded-xl24px
rounded-2xl30px
rounded-3xl36px
rounded-4xl44px
rounded-full999px

Elevation

shadow-panel

Resting panels and cards

shadow-raised

Hovered / lifted surfaces

shadow-popover

Menus, popovers, modals

shadow-glow

The signature accent glow — focus & primary

09Patterns

Shared UI patterns

Modal, media and empty/loading states should start from these primitives instead of rebuilding the chrome locally.

Modal shell

Confirm action

Compact dashboard modal chrome.

Use the shared shell tokens before adding one-off overlay, radius or shadow classes.

Media picker

Clickable preview surface with empty, hover and loading states.

Shared

No results

Use EmptyState for empty lists, filtered tables and quiet dashboard panels.

10Dashboard kit

Operational dashboard primitives

Use these for admin and panel screens before composing local toolbar, filter, card and state chrome.

SearchField wraps DashboardInput and owns the clear action.
Sessions

128

DashboardStatCard keeps metrics consistent.

Notice states stay tokenized and action-ready.

No records

Use for empty dashboard regions before custom empty cards.

11Panel data

Tables, lists and filters

Operational screens need dense, predictable layouts: a compact toolbar, visible active filters, and rows that scan before they decorate.

Toolbar

Campaign index

ActiveGM onlyUpdated this week
CampaignOwnerStatusUpdatedActions
Fenda RubraGMActive2h ago
Vault 13PlayerDraftYesterday
Ordem DeltaGMArchivedMay 18
12Feedback

Banners, alerts and notices

Use semantic tones for meaning, not decoration. Keep copy short and pair destructive or blocking feedback with a clear action.

Saved

Settings were saved and synced.

Heads up

A new publisher review is available.

Needs attention

Storage is close to the plan limit.

Toast / notification

Use for transient confirmation. For blocking errors, use an inline alert inside the affected panel.

Destructive confirmation

Destructive flows need a danger tone, explicit copy and a secondary escape action.

13Inventory

Component coverage

The source list for migration. If a screen needs one of these jobs, reach here before writing new local chrome.

UI primitives

Button, Badge, Card, Input, Textarea, NumberInput, Select, Switch, Tabs, Pressable

Value controls

ColorPicker, GradientPicker, Slider, DatePicker, Pagination

Feedback

Spinner, Skeleton, EmptyState, Toaster, AlertDialog, ConfirmDialog

Media

FileUploadField, FilePreviewSurface, MediaPreviewPicker, AssetSelectorButton

Dashboard

DashboardSurface, DashboardToolbar, SearchField, FilterSelect, SegmentedTabs

Tools

ToolTextarea, ToolKeyInput, ToolPanel, ToolPanelHeader and shared toolTokens

User pickers

UserSelect, UserMultiSelect; document here, render only inside admin flows

14Recipes

Screen recipes

Small compositions for the surfaces we build most often. Copy the structure, then swap the content.

Dashboard

Campaigns

Header, metric and primary action.

Active

12

Shared

04

Settings row

Enhanced focus

One row, one label, one control. No custom switch chrome.

Language

Use Select for bounded choices.

Form modal

Create asset

15Accessibility

Inherited states

Focus, high contrast and reduced motion are token-driven global states. Components should inherit them instead of repainting local exceptions.

Focus

Keyboard focus resolves to the accent ring globally.

Contrast

Semantic text and line tokens lift together.

text-inkline

Motion

Use `useArcaneMotion()` for generic UI movement.

16Maintenance

Review gates

The shortest checklist for keeping the app visually consistent over time.

Do / don't

Do

Import shared primitives and token classes before adding local chrome.

<Badge tone="success" size="sm">Online</Badge>
Don't

Recreate color, radius, border and spacing by hand for a one-off pill.

rounded-full border px-2 text-xs ...

Panel coverage

Navigation

Sidebar, tabs, breadcrumbs and local page rails

Covered

Filters

Search, select, segmented/tabs and active filter chips

Covered

Data

Tables, dense lists, stats and empty/loading rows

Covered

Disclosure

Accordions, expandable rows and optional advanced settings

Covered

Feedback

Inline alerts, banners, toasts and destructive confirmations

Covered

Media

Preview-first upload and asset selection surfaces

Covered

Forms

Label, helper text, validation and footer actions

Covered

Overlays

Compact, fullbleed, split and sheet modal shells

Covered

Pull request checks

Micro type

Use text-2xs .. text-5xs

Gate

Motion

Use useArcaneMotion() for generic UI

Gate

Chips

Use Badge tone + size

Gate

Modals

Start from modalTokens

Gate

Media

Start from components/media

Gate

Clickable rows

Use Pressable or native controls

Gate
17Governance

Principles

Four rules that keep the system from drifting back into 200 one-off hexes.

Do · One accent, used with intentNot · Pink as wallpaper

The accent marks the single most important action or live state on a screen — focus, primary, active. If everything glows, nothing does.

Do · Ink ramp for hierarchyNot · A new dark hex per component

Depth comes from the five ordered surfaces, not from inventing #0b0f1d next to #101225. Stack surface-1 → surface-4 to build elevation.

Do · Tokens, alwaysNot · bg-[#...] / inline styles

Every color, radius and shadow has a name. Reach for the token utility or import from theme.ts — raw values are how palettes drift.

Do · App density, not web airNot · Endless hero whitespace

This is a tool people work in for hours. Favour compact, scannable layouts with deliberate rhythm over marketing-site emptiness.

This page renders directly from src/styles/theme.ts. Change a token there and every swatch, sample and primitive on this page updates with it.