Skip to content
oh-my-design

Taiwan Railway DESIGN.md

DESIGN.md

Design System Inspiration of Taiwan Railway

Overview

Visual Theme & Atmosphere

Taiwan Railway's passenger portal brings timetable searches, individual ticket booking and rail travel into one service homepage. The operator is 國營臺灣鐵路股份有限公司. Its official timeline records the company's formal launch on 1 January 2024; its vision page puts safety, service performance and punctuality among its stated goals.

The measured homepage combines a white header and blue navigation with large train photographs, a dense timetable form and a fixed service rail. The footer adds small illustrated trains. The visual character comes from this close pairing of railway imagery and practical controls: a blue query button, square white station inputs and strongly differentiated query tabs. Main navigation and the query button share #256fa0; the button changes to #009bad on hover.

The company is also changing its web address. Its 20 May 2026 announcement says www.trc.com.tw starts operating alongside www.railway.gov.tw on 1 July 2026, with the old address expected to stop operating on 1 January 2027. This reference measures the Traditional Chinese page at www.railway.gov.tw/tra-tip-web/tip (lang="zh-Hant"); the capture did not redirect to another edition.

Brand Narrative

The company's 2024 timeline connects its formal company launch with the publication of a book documenting 136 years of railway history. Its current company introduction presents low-carbon transport and digital transformation as areas of development. The homepage's train photographs and illustrated footer are observed expressions on this passenger surface; no source was found attributing the measured palette or typography to a rebrand.

Principles

The official vision page lists six core values: safety, accuracy, service, innovation, unity and honour. Its four operating goals are safety, better service, sustainable operations and a happy enterprise. These are company statements; no separately published web-interface principles were verified.

Personas

No formal personas were verified.

Colors

These are measured interface colours, with descriptive roles assigned for this reference. They are not published company token names. The root custom-property census was empty; direct reads of the 15 distinct linked stylesheets also found no custom-property declarations.

RoleValueObserved use
Primary#256fa0Query button; backing of the main navigation; news archive link
Action hover#009badQuery button hover and held pointer press
Foreground#333333Station-input text and carousel-toggle label; also the declared body colour in tip_normal.css
Canvas / inverse label#ffffffWhite page and field surfaces; query-button label at rest
Authored focus ring#ff0004Dotted outline on five sampled controls, including the departure field
Quick-service label#4d4d4dIndividual-booking link at rest
Quick-service icon#27327bBooking link's masked ::before icon at rest
Quick-service hover#007bffBooking label and masked icon on hover / press
Secondary border#b1b1b1Carousel-toggle border
Secondary press#eeeeeeCarousel-toggle pressed fill
Gradient ends#fbfbfb, #efefefCarousel-toggle gradient, with #ffffff at 20% and 65%
Train-number query#007a91Inactive train-dynamics query tab
Transfer query#9e4000Inactive Taiwan Railway / high-speed-rail transfer tab
Priority news#ffd6d6, #c70000Highlighted news rows and their links

The active timetable panel is rgba(0, 0, 0, 0.9), rather than an opaque-black token. The booking rail's measured backing is rgba(255, 255, 255, 0.9). Keep these alpha values as observed.

The survey's paragraph-ink samples were white and cyan, both from the open cookie notice and its link. They do not establish the colour of ordinary article paragraphs. The foreground role above is grounded separately in the rendered input and the site's declared body rule.

Typography

Font evidence is separated by class:

  • Official product use: the opened company and legal pages did not document a product typeface.
  • Live-loaded: document.fonts reported Glyphicons Halflings and FontAwesome, both normal weight/style. These are framework icon faces, excluded from UI font-family tokens. Their linked Bootstrap and Font Awesome stylesheets declare font sources under the site's CDN static/fonts/ directory; the selected network format was not recorded.
  • Official distributed assets: no company text-font asset or font licence was verified. No font files were fetched.
  • Declared-only: the computed body, h1 and first-button stack was 黑體-繁, 頻方-繁, "Heiti TC", 微軟正黑體, "Microsoft JhengHei", Arial, serif. The quick-booking control in the states capture declared Noto Sans TC, also present in nav-quick.css. None of these text faces appeared in the survey's loaded-face list. They receive no specimen and no typography family token.
  • Unresolved: the actual text face used for each script and the availability of the declared local faces. Substitute: none chosen.

Retain the measured metrics independently of the missing family:

ControlSize / weightLine heightLetter spacing
Query and carousel toggle16px / 40021.3333pxnormal
Main navigation link18px / 40042pxnormal
Departure input14.4px / 40023.04pxnormal
More-news link18px / 40014.4pxnormal
Quick-booking link, states capture16px / 70019.2px0.05px

The survey recorded the booking link at weight 400 with the main declared stack; the states capture recorded weight 700 and Noto Sans TC. The table and component metadata use the states identity, without treating that declaration as proof of a loaded font.

Layout

At the measured 1440 × 1000 viewport, the carousel and its toggle are 1170px wide. A seven-item navigation row sits above the carousel, followed by three equal query tabs. The timetable form places departure, arrival, date, time range and query action in one horizontal group. News appears as compact rows with a category, a truncated headline and a date. Service shortcuts sit in a fixed right-hand rail.

These are desktop observations. No grid or spacing scale is inferred from them. Measured control padding is 10px 16px on the two large buttons, 1px 2px on the input and 0px on the sampled links.

Responsive Behavior

Mobile layouts and breakpoint behaviour were not measured.

Elevation & Depth

All six sampled controls have box-shadow: none at rest. The query button and carousel toggle acquire the same pressed inset shadow: rgba(0, 0, 0, 0.125) 0px 3px 5px 0px inset. The light gradient on the carousel toggle supplies its unpressed surface detail. No site-wide elevation scale was verified.

Motion & Easing

The quick-booking link computes transition: color 0.3s ease-out 0s. The other five sampled controls compute transition: all 0s ease 0s. No broader motion scale was verified.


Measured 2026-11-09 using the capture service's fresh worker browser, zh-TW, 1440 × 1000. Full raw survey and state evidence, consent limitations, CSS provenance and short narrative quotations are recorded in verification.md and report.md.

Components

All six controls were identified and measured on the desktop homepage. The cookie notice remained open: its only action was “接受並關閉”, which was not activated. hideOverlays: true was enabled for pointer testing, but the result recorded no hidden overlays; every pointer target was reached after scrolling.

Key / controlMeasured sizeRadiusPaddingRest appearance
query — 查詢260 × 43.3px6px10px 16px#256fa0 fill, #ffffff label; 1px transparent border
carousel-toggle — 隱藏輪播1170 × 43.3px6px10px 16pxVertical light gradient, #333333 label, 1px solid #b1b1b1 border
travel-nav — 鐵道旅遊 link166 × 42px0px0pxTransparent over the blue navigation bar; white label; no own border
departure — 出發站 input110 × 22px0px1px 2pxWhite fill, dark label; no own border
more-news — 更多消息 link117 × 24px0px0pxTransparent on white, blue text and a 24px square plus pseudo-element
quick-booking — 個人訂票 link74 × 51.2px0px0pxTransparent on the translucent-white service rail; grey label and a 32px square masked icon

The carousel toggle's raw background image is linear-gradient(rgb(251, 251, 251) 0%, rgb(255, 255, 255) 20%, rgb(255, 255, 255) 65%, rgb(239, 239, 239) 100%). Its background colour itself is transparent. The departure field is only the text input inside a larger station-picker wrapper; do not apply its 22px height to that entire wrapper.

No standalone content-card control was identified in the rendered homepage survey.

States

ControlHoverHeld pointer pressKeyboard focus
QueryFill becomes #009badSame fill plus inset shadow; browser auto outline observedLabel becomes #333333; browser auto outline, excluded from focus tokens
Carousel toggleNo computed change within scopeGradient disappears; fill becomes #eeeeee; inset shadow and 4px dotted red outline, offset −2px4px dotted red outline, offset −2px
Travel navigationWhite fill, blue label, 4px blue bottom border; height 42 → 46pxHover appearance plus 4px dotted red outline, offset −2pxOnly the red outline is isolated as focus-specific; the other changes persisted after blur
Departure inputNo computed change within scope4px dotted red outline, offset 0pxSame outline; it clears after blur
More-news linkNo computed change within scope4px dotted red outline, offset −2pxSame outline; it clears after blur
Quick-booking linkLabel and masked icon become #007bffHover appearance plus 4px dotted red outline, offset −2pxRed outline only; label and icon retain their rest colours

Every hover matched :hover; every press matched :active; every focus state came from Tab. “No computed change” covers the control, its pseudo-elements, zero descendants and three ancestor levels with their pseudo-elements; the carousel toggle comparison has two ancestor levels. It does not cover unrelated siblings or the pixels inside an external mask asset. Disabled, validation, submission-result and selected-tab transitions were not measured.

Do's and Don'ts

  • Preserve the blue query action and its teal hover / pressed fill.
  • Keep the measured 6px button corners distinct from square station inputs and navigation links.
  • Retain the authored dotted-red focus outline on the controls where it was measured.
  • Keep the navigation hover's extra 4px bottom border and resulting 46px height if reproducing this exact control.
  • Do not turn a declared text stack into a verified loaded font or insert a substitute font specimen.
  • Do not treat the cookie-notice action as a product component.

Voice & Tone

The interface uses short task labels: “查詢”, “個人訂票” and “更多消息”. The domain-change announcement addresses passengers politely with “敬請旅客多加利用新網址”. These are observed examples of task wording and service communication, rather than a published voice guide.

Agent Prompt Guide

Build a white railway-service page with a blue navigation bar, train photography, three query tabs and a compact timetable form. Use the measured component geometry and state changes below. Leave the unresolved text-font family unset.

Example: “Create the departure input at 110 × 22px with white fill, dark text, square corners, 1px 2px padding and 14.4px / 400 type metrics. On keyboard focus draw a 4px dotted #ff0004 outline at 0px offset; place it within the larger station-picker wrapper.”

Example: “Create a 260 × 43.3px query button with 6px radius, 10px 16px padding, 16px / 400 type metrics and a #256fa0 fill. Hover changes the fill to #009bad; press adds the measured inset shadow.”

Colors

Brand

Surface & text

Other colors

Typography

Type scale

  1. navigation鐵道旅遊 main navigation link18px, line height 42px, weight 400
  2. button查詢 and 隱藏輪播 controls; font family unresolved16px, line height 21.3333px, weight 400
  3. quick-link個人訂票 fixed service link in the states capture16px, line height 19.2px, weight 700, letter spacing 0.05
  4. station-input出發站 input #startStation14.4px, line height 23.04px, weight 400

Spacing & shape

Corner radius

  • none0px
  • button6px

Components

  • query
    queryFill #256fa0 · Text #ffffff · Radius 6px · Height 43.3px · Padding 10px 16px · Type 16px / 400
    • Hover background #009bad
    • Pressed background #009bad; inset shadow rgba(0, 0, 0, 0.125) 0px 3px 5px 0px inset
  • carousel-toggle
    carousel-toggleText #333333 · Radius 6px · Height 43.3px · Padding 10px 16px · Type 16px / 400
    • Pressed background #eeeeee; background-image none; inset shadow rgba(0, 0, 0, 0.125) 0px 3px 5px 0px inset; outline 4px dotted #ff0004 at -2px offset
    • Focus outline 4px dotted #ff0004; outline-offset -2px
  • departureFill #ffffff · Text #333333 · Radius 0px · Height 22px · Padding 1px 2px · Type 14.4px / 400
    • Pressed outline 4px dotted #ff0004; outline-offset 0px
    • Focus outline 4px dotted #ff0004; outline-offset 0px