Skip to content

Foundations

Color

Neutral grays for the page, one red for the brand and the main action, and eight division colors that appear only in network graphics.

Concept

  • Station architecture is white and cool concrete (beton).
  • Signage ink is near-black, with a hint of blue.
  • One signal red (merah) is the PPITSZ line and the call to action.
  • Eight line colors identify divisions, and appear only in network graphics.
  • Status colors are green and amber, used for states only.

Real transit systems keep their architecture neutral so line colors read at a glance. The site does the same. merah-500 (#F5392C) is warmer and brighter than the logo's crimson (#ED1C24), but close enough to read as the same brand.

Ramps

Implemented in OKLCH, all inside sRGB; hex values are for reference. Components never use ramps directly; they use the semantic tokens below.

merah

  1. 50#FDF2F0oklch(0.97 0.012 29)
  2. 100#FDE3DEoklch(0.935 0.03 29)
  3. 200#FCCCC5oklch(0.885 0.055 29)
  4. 300#FBA89Coklch(0.81 0.1 29)
  5. 400#FD7464oklch(0.72 0.17 29)
  6. 500#F5392Coklch(0.635 0.225 29)
  7. 600#D61E17oklch(0.56 0.215 29)
  8. 700#AC1B14oklch(0.48 0.18 29)
  9. 800#841711oklch(0.4 0.145 29)
  10. 900#5F120Doklch(0.32 0.11 29)
  11. 950#3C0C08oklch(0.24 0.075 29)

beton

  1. 50#F8F9FBoklch(0.982 0.003 255)
  2. 100#F0F3F6oklch(0.962 0.005 255)
  3. 200#E3E6EBoklch(0.925 0.007 255)
  4. 300#D0D5DAoklch(0.87 0.009 255)
  5. 400#A6ABB2oklch(0.74 0.012 255)
  6. 500#7E848Boklch(0.61 0.013 255)
  7. 600#61676Eoklch(0.51 0.014 255)
  8. 700#484E55oklch(0.42 0.014 255)
  9. 800#2E333Aoklch(0.32 0.013 255)
  10. 900#1B1E23oklch(0.235 0.011 255)
  11. 950#0D1013oklch(0.17 0.009 255)

hijau (status only)

  1. 50
  2. 300
  3. 600
  4. 700
  5. 950

amber (status only)

  1. 50
  2. 300
  3. 600
  4. 800
  5. 950

Semantic tokens

Components use these and never the ramps. Dark mode, nested previews and the tone-ink scope work by re-assigning them, so components need no dark: classes. The swatches below are live: switch the theme to see them change.

TokenLiveLightDarkUse
bgwhitebeton-950Page
surfacebeton-50beton-900Panels, image placeholders, skeletons
surface-strongbeton-100beton-800Hover fills, pressed rows
surface-raisedwhitebeton-800Inputs, dialogs, popovers, toasts
textbeton-950beton-50Body text and headings
mutedbeton-600beton-400Secondary text, metadata, placeholders
subtlebeton-500beton-500Disabled text only
borderbeton-200beton-800Dividers (decorative)
border-strongbeton-500beton-500Control boundaries (≥ 3:1)
accentmerah-600merah-600Primary button fill
accent-hovermerah-700merah-700Primary hover
accent-activemerah-800merah-800Primary pressed
accent-fgwhitewhiteText on accent
accent-textmerah-700merah-300Links, kickers, current-page markers
accent-subtlemerah-50merah-950Selected rows
accent-linemerah-500merah-500The brand line (the default --line)
focusbeton-950beton-50Focus outline
highlightamber-300amber-300<mark>, ::selection, “New”
successhijau-600hijau-300Success icons and edges
success-texthijau-700hijau-300Success text
success-subtlehijau-50hijau-950Success fills
warningamber-600amber-300Warning icons and edges
warning-textamber-800amber-300Warning text
warning-subtleamber-50amber-950Warning fills
dangermerah-600merah-400Errors, destructive edges
danger-textmerah-700merah-300Error text
danger-subtlemerah-50merah-950Error fills
backdropbeton-950 / 50%beton-950 / 72%Dialog backdrop
Tokens survive every scopeThe same markup in the page, forced light, forced dark and tone-ink. Use the toolbar.
Preview
Registration openFully bookedNot selectedTautan
Show code
<Button variant="primary">Register</Button>
<Button>See schedule</Button>
<StatusBadge domain="event" value="registration_open" />
<a className="text-accent-text underline">Tautan</a>

Division lines

Each division owns one line color permanently, keyed by its code. Colors appear only in line badges, route lines and station markers, not as text, backgrounds or buttons. Set a division with data-line="humas" on any element; network graphics inside it use that line through --line.

In light mode every line sits at the same lightness (L ≈ 0.52–0.56) and carries white badge text; in dark mode at L ≈ 0.70–0.76 with dark text. Equal lightness means no division looks more important than another. BPH shares the brand red: the core board is the main line. A ninth division takes the unused hue nearest 320.

Light

  • Badan Pengurus Harian#D61E17
  • Dana Usaha#AD5C15
  • Departemen Olahraga#287F3D
  • Hubungan Masyarakat#116BB5
  • Informasi Teknologi#037A84
  • Media Kreatif#BC2B74
  • Perkembangan Karir dan Akademik#6A53BD
  • Sosial Budaya#922FA1

Dark / tone-ink

  • Badan Pengurus Harian#F66E5E
  • Dana Usaha#E6964F
  • Departemen Olahraga#63BF74
  • Hubungan Masyarakat#67AAED
  • Informasi Teknologi#50BDC9
  • Media Kreatif#EC79A9
  • Perkembangan Karir dan Akademik#A497EA
  • Sosial Budaya#D082DC

Station screen

Add tone-ink to a section to render it as a dark station screen inside a light page, as the home page does with the departure board and the network map. Every token inside switches to its dark value, line and status colors included. In dark mode it lifts one step to beton-900 so it still reads as a panel. At most two per page, never adjacent.

Upcoming events

Shenzhen Cup 2026

Departemen OlahragaRegistration open

Contrast

WCAG 2.2 AA, computed from the values above. Text reaches 4.5:1; control boundaries and graphics reach 3:1.

PairLightDark
text on bg / surface / surface-raised19.12 / 18.15 / 19.1218.15 / 15.83 / 12.04
muted on bg / surface / surface-strong5.74 / 5.45 / 5.148.29 / 7.23 / 5.50
border-strong on bg / surface3.79 / 3.605.05 / 4.40
accent-fg on accent / hover / active5.19 / 7.17 / 9.905.19 / 7.17 / 9.90
accent-text on bg / surface / accent-subtle7.17 / 6.81 / 6.5510.20 / 8.89 / 8.98
accent-line (graphic) on bg / surface3.82 / 3.625.01 / 4.37
success-text on bg / subtle7.08 / 6.5410.71 / 9.08
warning-text on bg / subtle7.36 / 6.8511.97 / 9.84
danger-text on bg / subtle7.17 / 6.5510.20 / 8.98
highlight-fg on highlight11.9711.97
LineLight: badge text / on bg / on surfaceDark: badge text / on bg / on surface / on surface-strong
bph5.19 / 5.19 / 4.926.65 / 6.65 / 5.80 / 4.41
danus4.86 / 4.86 / 4.628.03 / 8.03 / 7.00 / 5.32
depol4.98 / 4.98 / 4.738.44 / 8.44 / 7.36 / 5.60
humas5.51 / 5.51 / 5.237.75 / 7.75 / 6.76 / 5.14
it5.07 / 5.07 / 4.828.61 / 8.61 / 7.50 / 5.71
medkref5.63 / 5.63 / 5.357.17 / 7.17 / 6.25 / 4.75
pka5.87 / 5.87 / 5.577.46 / 7.46 / 6.50 / 4.94
sosbud6.67 / 6.67 / 6.337.21 / 7.21 / 6.29 / 4.78

Rules

Don’t

Several red buttons, red headings or red section backgrounds.

Do

One primary button per screen. Red is the brand line, the current-page marker and links.

Don’t

text-line-humas headings, a HUMAS-blue section, division-colored buttons.

Do

Line colors only on line-badge, route and station. Everything else stays neutral.

Don’t

bg-red-600, text-gray-500, bg-merah-600, text-[#D61E17].

Do

bg-accent, text-muted, text-accent-text. Only semantic tokens survive dark mode and tone-ink.

Don’t

A colored dot alone to show a division or a status.

Do

Pair color with the code (HUMAS) or words (“Registration open”). Roughly 5–8% of men have some color-vision deficiency.

Danger shares the red family, so an error always comes with an icon and a message, and a destructive button is an outlined tint, never a solid red fill. No gradients, transparent text or tinted photos.