SDK 1.4.0: WebMCP tool registration
GEO Docs
Design language

Color & material

White light, the Iris key light, six spectral domain bands, status colors, dispersion and the spectrum bar; five levels of optical glass, frosted glass, scrim, specular light and z-index.

Every color pair below has been checked for contrast by script. Code references tokens; components never hard-code color values.

White light (neutrals)

TokenLightDark (darkroom)Use
canvas#f3f6fb#0c0f14The table: page and sidebar background
surface#ffffff#16191fGlass slabs: cards, lists, popovers
container#edf0f6#1f232bInputs, segmented tracks, tonal buttons, row hover
container-high#e4e7ef#282d36Hover / pressed on a container
separator#e0e3ea#2c3039Inset list separators (the only permanent line allowed)
ink#191e29#f2f3f7Headings, body text, numbers
ink-2#515763#b1b6bfSecondary text and columns
ink-3#656a75#8e929bLabels, timestamps, axes; only on canvas / surface / container, never on container-high (4.4:1)

Key light (Iris)

TokenLightDarkUse
brand#415ae0#6b89f9Primary button, current nav icon, links, focus ring
brand-hover#384ecf#7d9bffPrimary button hover
brand-tint#e6eeff#1f2a53Selection: chips, selected rows, the refracted fill of a selected segment
on-brand-tint#3043bc#bccfffText and icons on brand-tint
on-brand#ffffff#0c0f14Primary button text; also text on solid status colors (count badges)

White text on solid danger fails contrast in dark mode, so text on any solid status color uses on-brand.

Spectrum (domain colors)

Ordered by wavelength, long to short. Each domain has three steps: solid (icons, chart lines), -tint (icon tile and badge fill) and on-*-tint (text on the tint).

BandDomainHueSolid light / darkTint light / darkOn-tint light / darkUsed for
Orangedistribution50#c25600 / #e9884d#ffeadc / #43210d#883600 / #ffc09cSocial distribution, platform accounts
Amberbilling80#aa6b00 / #d29922#fdeed6 / #3b2700#774700 / #f0cb8dSubscriptions, orders, commissions
Greencluster155#00944d / #4ebe7d#dff8e6 / #0c341e#006630 / #a1e3b7Cluster sites, domains
Cyansearch205#0092a7 / #00bdce#d6f8fb / #003339#006474 / #85e2edSEO, GSC, keywords, sites
Bluecontent250#0d7dd4 / #59aaf8#dff3ff / #112d48#005496 / #a4d6ffArticles, categories, media, collection, review
Violetai (AI / GEO)300#8a5fc9 / #b28fef#f3ebff / #302445#5f3d8e / #dac4ffAI generation, GEO suggestions, MCP
  • Display order (legends, spectrum bars, module lists): by wavelength, distribution → billing → cluster → search → content → ai.
  • Chart series order (so neighbouring series stay distinguishable): content → ai → search → distribution → cluster → billing.
  • In light mode, solid search and cluster reach only 3.7–3.9:1 on surface. Use domain solids only for icons, charts and text ≥ 24px; text always uses on-*-tint.

Status colors

StatusSolid light / darkTint light / darkOn-tint light / dark
success#0e8c41 / #62c37a#e2f9e6 / #0f3118#005e26 / #aae5b5
warning#bc7400 / #e19b34#ffefd9 / #3b2300#7a4400 / #f9cb92
danger#bc4945 / #f7857d#ffe9e6 / #421c19#822b2a / #ffbeb6
info#007dc2 / #47b5fa#def6ff / #042c43#005387 / #9dddff

A status badge is tint fill + on-tint text + icon, with no border.

Dispersion

--dispersion: linear-gradient(90deg, distribution, billing, cluster, search, content, ai)

Dispersion is Prism's only gradient, and it appears in three places only:

WhereForm
AI-generated contentA 2px dispersion edge on the card's top edge (class .dispersion-edge, inset 16px on each side)
Brand mark and website heroThe spectrum inside the prism mark; the refraction illustration in the hero
Success confirmationOne light sweep in dispersion colors, 600ms, played once

No other gradients. The vertical fade of area charts (24% at the top → 0 at the bottom) does not count as dispersion.

Spectrum bar

Shows how one piece of content splits across channels: a segmented bar 8px high with 2px gaps, fully rounded ends, segments in display order and widths proportional to the values, with a legend below (dot + name + share). It is the data graphic unique to this language, used for distribution reach, traffic sources, AI citation sources and quota breakdowns. Class .spectrum; each child i sets --w (weight) and data-tone.

Color rules

  1. Brand covers ≤ 10% of a screen: usually one primary button, the current nav item and the focus ring.
  2. Domain colors appear only where they identify something: icon tiles beside card titles, charts, category badges, spectrum bars. Never fill large areas with them.
  3. At most 4 domain colors per screen (except the dashboard, which summarises every domain).
  4. Status colors express status only, never emphasis.
  5. Selection uses brand-tint; the current location is a "lit slab" (surface + elev-1). Don't mix the two.
  6. Dark is not an inversion: surfaces get brighter as they rise (surface → container), and brand and domain colors step up one level in lightness.

Contrast (WCAG 2.1)

ForegroundBackgroundLightDarkRequired
inkcanvas15.4017.314.5
ink-2surface7.268.644.5
ink-3canvas5.016.164.5
ink-3container4.755.054.5
ink-3container-high4.384.43Not allowed
ink-2container-high5.876.794.5
on-brandbrand5.586.014.5
on-brandbrand-hover6.657.324.5
on-brand-tintbrand-tint6.798.924.5
brand (links)surface5.585.514.5
on-content-tintcontent-tint6.799.144.5
on-search-tintsearch-tint6.079.204.5
on-ai-tintai-tint7.139.104.5
on-distribution-tintdistribution-tint7.019.084.5
on-cluster-tintcluster-tint6.369.304.5
on-billing-tintbilling-tint6.849.234.5
Domain solid (icon tile)Matching tint3.29–3.985.51–5.983 (icons)
search / cluster (icons)surface3.70 / 3.937.69 / 7.533 (icons)
on-success-tintsuccess-tint7.209.904.5
on-warning-tintwarning-tint7.019.804.5
on-danger-tintdanger-tint7.759.424.5
on-info-tintinfo-tint7.249.834.5
on-branddanger (count badge)5.037.874.5
on-inverseinverse (toast, tooltip)15.4017.314.5

Five levels of optical glass

Light comes from above and slightly to the left; shadows fall downward. Each level = surface color + shadow + top-edge highlight.

LevelNameSurfaceShadow (light)HighlightUse
0TablecanvasNoneNonePage background, sidebar
1Slabsurfaceelev-1: 0 1px 2px rgb(16 24 40/.04), 0 2px 6px rgb(16 24 40/.05)inset 0 1px 0 var(--edge)Cards, list cards, current sidebar item
2Raisedsurfaceelev-2: 0 2px 4px rgb(16 24 40/.05), 0 8px 20px -4px rgb(16 24 40/.10)SameHovered cards, sticky bars, selected segment thumb
3Floatsurfaceelev-3: 0 4px 8px -2px rgb(16 24 40/.08), 0 16px 32px -8px rgb(16 24 40/.16)Same + inset 0 0 0 1px var(--hairline)Menus, dropdowns, popovers, a dragged row
4Overlaysurfaceelev-4: 0 8px 16px -4px rgb(16 24 40/.10), 0 32px 64px -12px rgb(16 24 40/.28)Same as 3Dialogs, drawers, bottom sheets
  • --edge: light rgb(255 255 255 / .7), dark rgb(255 255 255 / .06). The 1px lit top edge that replaces borders.
  • --hairline: light rgb(25 30 41 / .06), dark rgb(255 255 255 / .07). Only for levels 3 and 4, which float above content, so they don't merge into what's beneath.
  • Dark: shadow opacity ×2; higher levels get brighter surfaces (level 4 may use container).
  • Never nest a shadowed card inside a card; for sub-groups use an inset container area or a grouped list.

Frosted glass

--glass (surface at 72%) + backdrop-filter: blur(20px) saturate(180%).

Used onWhen it appears
Top barFully transparent at rest, blending into the table; frosted with elev-1 once the page scrolls > 4px
Mobile bottom action barAlways
Bulk action bar, save bar, floating toolbarsWhile shown

Scrim

--scrim: oklch(0.18 0.02 265 / 0.40) + backdrop-filter: blur(4px). The same in both themes, so it never gets lighter in dark mode.

Specular light

Clickable cards (class .lift) show a soft light that follows the pointer on hover, under @media (hover: hover): radial-gradient(280px circle at the pointer, var(--specular), transparent 60%). --specular is rgb(255 255 255/.55) in light and rgb(255 255 255/.05) in dark, fading in over 150ms. Only on clickable cards, never on table rows or buttons; off under reduced motion.

Z-index

TokenValueUse
z-sticky1020Top bar, sticky table headers, save bar
z-drawer1030Drawers, mobile navigation
z-dialog1040Dialogs
z-popover1045Menus, dropdowns, popovers (including dropdowns inside dialogs)
z-toast1050Toasts
z-tooltip1060Tooltips