Skip to content

Foundations

Surface

Depth in Luc UI is a luminance step plus a hairline. The stack is ordered, and components occupy a defined level rather than picking a grey at random.

The stack

Each level is a real component in this page — hover the nested cards to see how hairlines behave between levels.

surface.canvas

level 0

Card on canvas

surface-default

One hairline, a small shadow, one luminance step above the canvas.

Nested well

surface-sunken

Inputs and code sit *below* their container. Never go deeper than this.

Raised region

surface-raised

Used by stat cards, popovers and anything that must clearly sit on top.

surface.overlay — dialogs & tooltipssurface.interactive — controls

Reference

Surface tokens
TokenUtilityUse for
surface.canvasbg-surface-canvasPage background. One per view.
surface.sunkenbg-surface-sunkenInputs, code blocks, inset wells.
surface.defaultbg-surface-defaultCards and panels resting on the canvas.
surface.raisedbg-surface-raisedStat cards, popovers, active segments.
surface.overlaybg-surface-overlayDialogs, tooltips, floating menus.
surface.interactivebg-surface-interactiveButtons, hoverable rows, segmented tracks.
surface.inversebg-surface-inverseInverted chips and counters.

Rules

Do

  • Stop at three nested levels: canvas → card → well.
  • Use a hairline (border-line-subtle when two levels are close in luminance.
  • Let overlays use the deepest shadow in the system.

Don't

  • Add a fourth nesting level — flatten the content instead.
  • Put an overlay surface inline in a page.
  • Rely on a big shadow to separate two surfaces in dark mode.
Luc UI v1.0Surfacedark theme