Styleguide

Every token, every component.

The acceptance surface for the foundation phase. Tab switching and pane expansion are CSS-only, so they work with JavaScript disabled.

Colour

Surfaces, ink and brand swap with the theme. The plate and syntax tokens deliberately do not — code is dark in both themes, so the syntax palette is defined once.

Surfaces

--paper
--chrome
--panel
--line
--line-strong

Ink

--ink
--dim
--faint

Brand

--red
--red-text
--red-soft
--teal

Plate (frozen)

--term-bg
--term-chrome
--term-tab
--term-line
--term-ink
--term-dim
--term-faint
--term-red
--term-teal

Syntax (frozen)

--tok-sand
--tok-amber
--tok-violet

Type

OCR-A sets headings, labels, chips and buttons only — never running text, never below 11px. IBM Plex Sans carries the reading; IBM Plex Mono carries code.

OCR-A · display

Browser automation

that doesn't flake

Keyword reference

IBM Plex Sans · body

Clicks the element found by selector. Waits for the element to be actionable before clicking — visible, stable, enabled and not obscured by another element. No explicit sleep is required.

IBM Plex Mono · code

Get Text h1 == Welcome

Terminal

Literal shell only. The shell tabs preselect your own OS on load; picking one manually wins from then on. Prompts are excluded from selection, so a drag-copy yields runnable commands.

$ pip install robotframework-browserSuccessfully installed robotframework-browser-20.2.0$ rfbrowser initInstalling Playwright browser binaries…✓chromium 141.0 downloaded✓firefox 142.0 downloaded✓webkit 26.0 downloaded

Pass and fail states, and a command too long to fit

bash
$ robot --variable BROWSER:chromium --outputdir results/ci --loglevel DEBUG --include smokeANDweb login.robot=========================================================Login✓Sign In✗Sign In With Bad Password — 'h1' was 'Invalid login'

Editor

All code. Tab bar with a file glyph, line-number gutter, status strip, copy button — and no sidebar, minimap or window controls. Lines 7–8 show the marked-range treatment.

*** Settings ***Library    Browser*** Test Cases ***Sign In    New Page      https://example.com/login    ${user} =     Set Variable    admin    Fill Text     id=user    ${user}    Fill Secret   id=pass    $PASSWORD    Click         text=Sign in    Get Text      h1    ==    Welcome
Robot Framework11 linesUTF-8
from Browser import Browserbrowser = Browser()def test_sign_in():    browser.new_page("https://example.com/login")    browser.fill_text("id=user", "admin")    browser.click("text=Sign in")    browser.get_text("h1", "==", "Welcome")
Python9 linesUTF-8

Snippet, robot-repl grammar, no line numbers

New Page      https://example.com/loginClick         text=Sign inGet Text      h1    ==    Welcome
Robot Framework3 linesUTF-8

Components

Every content component, rendered from a Markdown file and shown beside that same file's source. The two cannot disagree — they are the same text.

ComparisonSplit

Click ⤢ on either pane to expand it to 75%; ⤡ restores parity. The other side is never hidden. Below 640px the panes stack and the control retires.

*** Settings ***Library    Browser*** Test Cases ***Sign In    New Page     https://example.com/login    Fill Text    id=user    admin    Get Text     h1    ==    Welcome
Robot Framework8 linesUTF-8
import { test, expect } from '@playwright/test';test('sign in', async ({ page }) => {  await page.goto(    'https://example.com/login'  );  await page.fill('#user', 'admin');  await page.click('text=Sign in');  await expect(    page.locator('h1')  ).toHaveText('Welcome');});
TypeScript12 linesUTF-8
  • 8 lines vs 12
  • assertion in the keyword vs separate expect
  • no scores