⏱ PUNCH CLOCK · LOOK C

An LED readout bolted to a steel box. One number rules the screen and a binary state says whether it's moving. Shipped in Time Warrior — web and the SwiftUI menu-bar app share this token set.

for agents

Paste this into the session that's building the UI. Do not retype token values from memory — link or vendor the stylesheet.

Build this UI in the Lucian Labs "Punch Clock" look.
Read, in order:
  https://lucianlabs.ca/branding/AGENT.md   (how to pick + what never to do)
  https://lucianlabs.ca/branding/punch-clock.md   (this look)
  https://lucianlabs.ca/branding/UX.md      (how it must behave)
Take tokens from https://lucianlabs.ca/branding/brands.json — never
retype them. On web you may link punch-clock.css directly; on any other
platform derive from the tokens and the UX contract.
Implement all seven interaction states, focus included, and use only
the five named durations. Check your output against the AGENT.md ban
list and the UX.md ship checklist before you report the work done.

the shape of a screen

act, read, then detail. Never lead with nav or explanation.

total earned · 3.25 h
$260.00
running · nduro · $80/hr
gross earned
$260
− expenses
$34
tax set-aside
$68
yours to keep
$158

console or punch clock?

Both are dark, square-cornered, and set numerals in Micro 5. The line matters.

consolepunch clock
borders1px hairline2px, always
panelstranslucent + blurflat and opaque
groundradial washflat #0e0e10
body facesystem sansFinlandica
signalsblue, amber when armedgreen/red stoplight, cyan focus
buttonsoutlined, tintedsolid fill, near-black label
a view ismany panels, none dominantone huge figure

You are operating something in Console. You are watching a number here.

palette

--bg
#0e0e10
--panel
#1a1a1e
--panel-2
#232329
--line
#33333a
--ink
#ededf0
--dim
#666666
--green
money / running
--red
stop / delete
--cyan
focus
--orange
owed / warning

the three rules

buttons

neutral until hover
solid = commits

states in motion

tap through them. the fill flips to the new state, the label arrives with it, selection travels, a confirmation returns home.

commit → busy → done
selection travels
an error holds until you act

numerals are micro 5, always

clientinouthoursusd
nduro09:0012:153.25$260
lucianlabs13:0014:301.50$120
total4.75$380

Body sans numerals read as a database. Micro 5 reads as a readout. Prose and labels stay Finlandica and never take the display face.

motion

transition

A look change moves the way the look you are going into moves. This is how a swap into Punch Clock arrives.

kinddurationcurve
glitch300ms · settlesteps(1, end) per cut

Punch Clock punches in: stepped cuts through random slices, out of order, then it lands — the orb's glitch turned into an arrival. The shortest transition in the kit, because a punch is instant. The cuts re-roll every time.

Frames: seven inset() frames — empty, two random bands, the top half, a band, nearly all, all — each holding then jumping. Reduced motion: no sweep — the 600ms colour tween, so the choice still lands.

Spec: skin-swap.md · source of truth LL_LOOKS['punch-clock'].transition in /v2/ll-brand.js.

voice

write

punch in
export csv
total earned
yours to keep
$1,240.00 · 3.25 h · 30%

never

Start Tracking Now
Export Your Data
Total Earnings 💰
You're doing great!
Let's get started!

native parity

The SwiftUI port at time-warrior/apps/mac/…/Theme.swift mirrors these tokens — panel(), field(), BrandButtonStyle, PulseSquare, Tile. Change a token here, change it there. Known drift: --dim is #666 on web and #cfcfd6 in Theme.swift; the web value is canonical until that's reconciled.