LaundryLog FnHCI.UI Token Vocabulary
This note captures the first tiny FnHCI.UI and FnUI token vocabulary inferred from the current LaundryLog.penpot file.
The goal is not to freeze the design too early. The goal is to take the current Penpot work and express it in a form that can later become:
- explicit Penpot token sets
- explicit
FnToolstoken-model types - explicit runtime projection rules for
FnUI
Current Evidence
The current LaundryLog Penpot export shows:
- Penpot
2.14.1-RC1 - file features including
design-tokens/v1,variants/v1,layout/grid, andcomponents/v2 - no populated
tokens.jsonin the export archive yet - a real shared color vocabulary under
colors/ - component naming that already implies semantic UI roles
- a mobile-first board width of
375
So the current file is token-capable, but it is still expressing most of the vocabulary through:
- shared colors
- shared components
- repeated frame sizes
- repeated text styles
That is a good enough base to define the first token vocabulary.
Current Mobile Baseline
The current LaundryLog boards are clearly mobile-first.
Observed values include:
Screen.EntryFormwidth:375Path1.3-EntryFormwidth:375Screen.NewSessionwidth:375Headerheight:72Input.Locationheight:52- secondary action button height such as
Button.GPS:56 - primary submit button height such as
Button.Submit:64
So the current first breakpoint assumption should be:
breakpoint = mobile
Tablet and desktop should remain future theme-axis values, not invented visual rules yet.
First Foundation Tokens
These are the first foundation tokens that appear to exist already in practice.
Foundation Colors
The current Penpot file already exposes these shared colors:
color.neutral.0 = #ffffffcolor.neutral.50 = #f8f9facolor.neutral.100 = #e2e8f0color.neutral.300 = #cbd5e1color.neutral.400 = #94a3b8color.neutral.500 = #64748bcolor.neutral.600 = #475569color.neutral.800 = #2d3748color.primary.400 = #ffcc80color.primary.500 = #ffb74dcolor.primary.600 = #f57c00color.selected.background = #fff8e1
These should become the base palette that semantic tokens point to, instead of every component carrying raw hex values separately.
Foundation Typography
The current file strongly suggests this first typography foundation:
font.family.base = "Source Sans Pro"font.weight.regular = 400font.weight.bold = 700font.size.label = 14font.size.body = 16font.size.title = 24font.size.display = 48line-height.compact = 1.2letter-spacing.label = 0.7
Observed examples:
- section labels such as
QUANTITYuse14, regular weight, and0.7letter spacing - button and input text commonly use
16, regular weight - header title
LaundryLoguses24, bold - quantity display uses
48, bold
Foundation Dimensions
The current file suggests a small but useful first dimension layer:
size.viewport.mobile = 375size.header.height = 72size.field.height = 52size.action.height = 56size.submit.height = 64
These are not yet a complete scale. They are simply the repeated dimensions that already appear stable enough to name.
Foundation Spacing
The current file suggests these first spacing values:
space.12observed between the location input and GPS button on the entry formspace.16observed as the main entry-form horizontal gutter for the full-width submit areaspace.24observed as the stacked gap in the location prompt flowspace.32observed as the horizontal gutter inside the centered location prompt
This does not mean the whole spacing scale is known yet. It means these values are already visible enough to become named candidates.
First Semantic Tokens
The current LaundryLog file already carries a useful semantic layer through shared color names.
Surface Tokens
surface.background.default -> color.neutral.50surface.card.default -> color.neutral.0surface.selected.soft -> color.selected.background
These appear from:
Surface.BackgroundSurface.Card- selected button backgrounds and current UI emphasis
Text Tokens
text.primary -> color.neutral.800text.secondary -> color.neutral.600text.muted -> color.neutral.500text.disabled -> color.neutral.400
These appear directly in the shared color vocabulary as:
Text.PrimaryText.SecondaryText.MutedText.Disabled
Header Tokens
header.background -> color.primary.500header.text -> color.neutral.0header.subtitle -> color.neutral.0
These already exist as:
Header.BackgroundHeader.TextHeader.Subtitle
Input Tokens
input.background -> color.neutral.0input.border.default -> color.neutral.100input.border.focus -> color.primary.500input.text -> color.neutral.800input.placeholder -> color.neutral.400
These already exist as:
Input.BackgroundInput.Border.DefaultInput.Border.FocusInput.TextInput.Placeholder
Button Tokens
The current Penpot file already names the first strong semantic button tokens:
button.background.default -> color.neutral.0button.background.selected -> color.selected.backgroundbutton.background.disabled -> color.neutral.100button.border.default -> color.neutral.100button.border.selected -> color.primary.500button.border.disabled -> color.neutral.300button.text.default -> color.neutral.600button.text.selected -> color.primary.600button.text.disabled -> color.neutral.400
This is especially important because the same token family should be usable across:
Button.OptionButton.CounterButton.GPSButton.Machine.*Button.Payment.*Button.SetLocationButton.Submit
The component variants should not each own separate color logic if they are really expressing the same semantic states.
Status And Accent Tokens
One additional semantic accent is already visible in the quick-fill and price values:
price.text.accent -> color.primary.600
This is not yet explicitly named as a shared color token in the same semantic way as header or input, but it is already visible enough to become one.
First Theme-Axis Direction
The current LaundryLog token direction should stay minimal:
breakpoint = mobilecolor-mode = lightdensity = default
That means:
- only
mobileis currently evidenced in the file - dark mode should remain future work, not a guessed branch
- density should remain future work until we need compact or spacious variants
This matches the broader FnHCI.UI rule that theme axes should stay orthogonal instead of becoming flattened preset names.
What This Means For FnHCI
The current LaundryLog file suggests the following split:
FnHCIowns the primitives likeButton,TextInput,Header, andCard- tokens own the visual-value and semantic-style layer used by those primitives
So the current Penpot components are not the final abstraction by themselves.
Instead, they are evidence that we likely need:
Buttonprimitive rolesTextInputprimitive rolesHeaderprimitive rolesEntryCardorListCardroles
with tokens projected onto them.
What Should Happen Next In Penpot
The next cleanup step in the actual LaundryLog Penpot file should probably be:
- preserve the current shared color vocabulary
- group it intentionally into foundation and semantic token sets
- keep the existing names where they are already good
- normalize inconsistent names where needed
- make the file export a real
tokens.json
That would give us a cleaner interchange surface for later automation.
What Should Happen Next In FnTools
The next code-facing step should probably be:
- create first explicit F# token ids for:
- foundation colors
- semantic text tokens
- semantic input tokens
- semantic button tokens
- model
mobileas the first concrete breakpoint token/theme value - keep theme axes explicit even when only one value exists today
Relationship To The Broader Token Note
This LaundryLog note is the first concrete proving-ground example of the broader rules in:
- FnHCI.UI Token Model
- CheddarBooks LaundryLog FnUI Proving Ground
- FnHCI And Penpot Abstraction Boundary
It should remain easier to change than the broader token-model note.