All six heading levels, plus the UA-default margins.
Four text-align values plus the inherited line-height.
Left-aligned. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Centered. The quick brown fox jumps over the lazy dog three times in a row to test inline measurement.
Right-aligned. Sphinx of black quartz, judge my vow -- a pangram that uses every letter of the English alphabet at least once.
Justified. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
UA-default block display for every structural element. Each row prefixed with the tag name so a visual sweep tells you which boxes the engine actually stacked vertically.
p:p
blockquote:blockquote
pre:pre (whitespace preserved)
address:address
display:block per UA. attr() in content is NOT implemented yet, so the tag labels are stamped as literal text instead of generated.Every inline element handled by the parser, in a single paragraph.
bold, strong, italic, emphasis, underline, strikeS, strike, del, mark, small, big, sup, sub, HTML, code, Ctrl+S, output, variable, teletype, span-styled, link, q-quoted
, font.
Triple-stack: bold italic underlined. NOBR:
Named, numeric decimal, numeric hex.
Named: & < > " (C) (R) (TM) * * <<guillemets>> -- - ... deg +/- x / P sec. + ++ (nbsp)
Numeric decimal: ABC = ABC. Star *, heart (heart), music (music).
Numeric hex: ABC = ABC. Star *, smile :).
Polish: orzel -- bialy, czarny, labedz.
Plain links, button-styled, anchor jumps, link in image. a:link CSS rule applied to the button.
Plain link: juen.in * Bold: Aminet * Italic: RastPort * Image link:
back to top
Internal anchor: jump to tables >> * Bare #: scrolls to top
All list-style-type values + nested lists + list-style-position.
Amelinium_low).Data table with header, body, footer, zebra rows (via :nth-child(even)), colspan / rowspan.
| Name | Version | Size | Description |
|---|---|---|---|
| program1.lha | 1.0 | 45 K | A demonstration program |
| utility2.lha | 2.3 | 128 K | Useful utility with many features |
| game3.lha | 0.9 | 1.2 M | Simple but addictive |
| tool4.lha | 3.1 | 22 K | Small command-line tool |
| Total entries: | 4 | ||
| R0C0 | R0-R1 / C1 (rowspan=2) | R0C2 |
| R1C0 | R1C2 | |
| R2 spans 3 columns | ||
| Sidebar Navigation column. Per CSS 2.1 sec.17.5.3 every cell in a row stretches to the row's height. |
Main The body of the layout. This pattern is still common on Amiga-era pages and works without flex/grid. |
CSS 2.1 sec.17.6.2.1 border conflict resolution (0.6); caption-side: bottom (0.6); explicit column widths via <col> (0.6).
Middle column declares a thicker double border. Per sec.17.6.2.1 that border wins over the neighbour's thinner solid border -- pre-0.6 the engine drew both, doubling the line.
| A1 | B1 thick double | C1 |
| A2 | B2 thick double | C2 |
| A3 | B3 thick double | C3 |
| Year | Event |
|---|---|
| 1985 | Amiga 1000 launched |
| 1992 | AmigaOS 3.0 / AGA chipset |
| 2026 | Amelinium 0.6 ships |
| narrow | medium | auto fills the rest |
| 80px | 200px | flexible -- takes whatever's left |
| A | B short | C with much longer header text that overflows |
|---|---|---|
| 1 | 2 | 3 truncated content because table-layout:fixed + overflow:hidden |
| X | X | |
| X |
empty-cells:hide render without a border. Implementation in 0.6 may treat this as parse-only.Every input type the engine renders. The hidden input below the heading should produce no visible box.
Explicit size, scaled, with border, HTML4 align attribute, image-link.

Same image at half size, border="2": 
Inline tiny:
mixed with text.
![]()
CSS 2.1 sec.9.5 -- text wraps around floats; clear moves past them.
Text flows around a left-floated image. The image is given explicit width and height so layout knows its box up-front. The paragraph keeps wrapping until the cleared bottom of the image. Then enough lines fill in to push past it and demonstrate CSS 2.1 sec.9.5 float behaviour. Floats are essential for old-school sidebars and Amiga-era page designs. Sphinx of black quartz, judge my vow.
Cleared by clear:both.
Right-floated image. Same idea, mirrored. The paragraph text fills the LEFT side instead. Useful for icons on the right margin, or for the classic Amiga-magazine layout. Pack my box with five dozen liquor jugs.
Cleared.
Containing block for position:absolute = nearest position:relative ancestor (CSS 2.1 sec.10.1). position:fixed anchors to the viewport per CSS 2.1 sec.9.6.1 and is repainted in place on every scroll step.
Absolute with all four sides set -- fills CB minus 4px margin:
position:fixed -- the red badge in the top-right corner of the window stays put as you scroll. Correct rendering costs a full repaint per scroll step instead of the fast bitmap shift; on a slow Amiga that can feel sluggish, so the behaviour is toggleable via Settings → Respect position:fixed (full redraw on scroll). Default ON; turn it off if scrolling drags and you can live with fixed elements sliding along with the page.
Positioned boxes with explicit z-index. Visual order: green (z=2) sits behind red (z=3) but above blue (z=1).
Same declared width 200px + padding 10 + border 4. content-box total = 228; border-box total = 200.
All eight named border styles. groove/ridge/inset/outset render with the same two-tone shading in 0.6 (acceptable approximation).
Type, universal, class, ID, compound. Each row's selector is named in <span>.
Type p selector picks this up implicitly via UA defaults
Descendant (space), child (>), adjacent sibling (+), general sibling (~).
Direct child paragraph -- should be red bold (matched by .cmb-parent > p) AND italic (matched by .cmb-parent p descendant).
Grandchild paragraph inside a div -- should be italic ONLY (descendant matches, child does not).
Immediately after h3 -- should have yellow background from .cmb-host + p AND green color from .cmb-host ~ p.
Second sibling -- green only (general sibling ~ matches, adjacent + does not).
Third sibling -- green only.
CSS 2.1: [attr], [attr=val], [attr~=val], [attr|=val]. CSS 3: [attr^=val], [attr$=val], [attr*=val]. Demos use real HTML attributes only (target, type, title, lang) since the parser drops generic data-* attrs.
[attr] presence: target= present -> red * no target -> default color
[attr=val] exact: a text input below should be cream-coloured (matched by input[type="text"]):
[title~=val] word match: the word hot in space-separated list:
title="hot" -> bold *
title="cold hot extra" -> bold *
title="hotter" (not exact word) -> normal
[lang|=en] hyphen-prefix:
English (en) -> italic *
en-US -> italic (prefix match) *
pl -> normal
[title^="pre"] starts-with (CSS3): title="prefix-x" -> green
[title$="post"] ends-with (CSS3): title="x-post" -> red
[title*="mid"] substring (CSS3): title="x-mid-y" -> blue bg
Already used heavily in the table zebra rows. Standalone demo here for direct visual check.
| row 1 | :first-child -> green bg, bold |
| row 2 | :nth-child(2) -> cream bg |
| row 3 | :nth-child(3n) -> light blue bg |
| row 4 | default |
| row 5 | default |
| row 6 | :nth-child(3n) -> light blue bg again |
| row 7 | :last-child -> red bg, italic |
Compound class (.X.Y) requires BOTH classes on same element. ID beats class beats type.
.spec (no win class) -> grey
.spec.win -> navy (p.spec.win beats .spec.win on specificity)
#spec-id -> red (id beats class)
::before / ::after insert generated content. ::first-letter styles the first character (drop cap). ::first-line is currently parse-only (the rule is accepted but the styling does not apply visually).
prefix only
suffix only
both wrapping
He said: this is a quoted phrase
, and then continued.
The very first line of this paragraph SHOULD render bold and red if ::first-line were fully implemented. In 0.6 the rule is accepted by the parser but the layout does not apply it yet -- this is documented behaviour.
Auto-numbered headings via counter-reset + counter-increment + counter() inside content.
Counters give you numbered headings without typing the number yourself.
Reset happens on the container; each h3 bumps the counter.
Decimal only in 0.6. counters() (plural) and attr() not yet implemented.
RTG truecolor: per-pixel interpolation. Chipset / 8-bit RTG: 32 strip bands along the dominant axis.
Variables defined on :root, consumed via var(--name). Fallback resolves when the name is unbound. Scoped overrides inherit down the subtree.
--paper / --ink / --accent from :rootvar(--missing-name, #2d572c), falls back to green--accent as background, --paper as text.theme-dark -- same .var-card class but the three vars are re-bound on this ancestor. Demonstrates per-element scope inheritance.border-radius: 12px border-radius: 4px
text-shadow with amber offset
uppercase: the quick brown fox
LOWERCASE: THE QUICK BROWN FOX
capitalize: the quick brown fox
First line is indented by 32px. The wrapped second line returns to the left margin. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
letter-spacing: 2px -- each character gets extra horizontal space.
word-spacing: 8px -- extra gap between words.
line-height: 28px -- taller-than-normal line. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
white-space:nowrap -- this paragraph should NOT wrap inside the 200px container, even though the text is long.
white-space:pre -- spaces and newlines preserved exactly. Tabs also kept.
white-space:pre-wrap -- newlines preserved AND wrapping happens when the line is too long for the container width which is 240px here.
white-space:pre-line -- newlines kept, multiple spaces collapse. Second line.
word-wrap:break-word -- a verylongunbreakableidentifierWithoutSpaces still wraps to stay inside the box.
Inside table cells: top, middle, bottom, baseline. In inline context: super, sub.
| top | middle | bottom | baseline | reference (60px tall) |
Inline: E = mc2 and H2O are super and sub.
BEFORE | [invisible but space reserved] | AFTER
BEFORE | [removed entirely] | AFTER (the two pipes are adjacent because the hidden span collapses)
The box below is GREEN on screens >=501px wide and RED on narrower (<=500px). Resize the window to toggle.
.imp-test.override sets color:#c63b1c !important, which beats an inline style="color:#0000ff".
Plain -- grey (from .imp-test {color:#444})
Override class -- RED (!important beats class default)
Inline-override too -- STILL RED because !important wins against inline non-!important
CSS 2.1 sec.5.11.4 -- matches by the closest ancestor with lang= attribute. Prefix-with-hyphen rule (en matches en, en-US, but not english).
Polski tekst * Deutscher Text * English text (default) * en-US (matches [lang|=en] from sec.20)
Amelinium-specific URL handling -- these don't generate visual output, just documentation.
RAM:test.html -- AmigaDOS volume pathWork:dir/page.html -- absolute path on Work:PROGDIR:start.html -- relative to the executablefile://Work:foo.html -- file:// URI wrapperhttp://juen.in/... -- HTTPhttps://... -- HTTPS via AmiSSL v5 (not in Amelinium_low)Binary-content sniff: any response without a text/* or image/* Content-Type that begins with an Amiga hunk / LHA / LZX / ZIP / gzip / 7z / ELF / MZ / PDF / IFF / ADF magic falls through to Save-As rather than rendering hexdump noise.
cover = fill, may crop; contain = fit, may letterbox; length / % / auto otherwise.
Shorthand: TL TR BR BL (margin-style fill-in). Per-corner properties override individually.
Underline / overline / line-through paint in their own colour instead of the text colour.
Underline in red, text default.
Shorthand: text-decoration: underline #1a8c4a.
Dark-blue text, red overline.
Grey strikethrough on default text.
Paints OUTSIDE border edge, does NOT take layout space. Used for focus a11y.
Hover the chips to see the cursor change (mouse-driven Amiga supports pointer/text/wait/help/etc.).
Granular weight stored. Available faces map FW_IS_BOLD >= 600 to the bold variant; numeric < 600 stays regular.
100 thin
300 light
400 normal
600 semi-bold
700 bold
900 black
parent 600 + child bolder (700)
parent 700 + child lighter (400)
Unitless number inherits AS-IS (multiplier x child's own font-size), unlike em/% which compute once on parent.
line-height: 1.6em over multiple lines lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod.
line-height: 160% same content lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod.
line-height: 1.6 (unitless multiplier) same content lorem ipsum dolor sit amet consectetur adipiscing.
line-height: 28px explicit pixels lorem ipsum dolor sit amet consectetur adipiscing elit sed do.
vh resolved against viewport height (not page height -- old bug fixed). inset = top right bottom left.
vmin/vmax tiles:
Logical keywords. Browser is LTR-only: start -> left, end -> right.
text-align: start -- LTR resolves to left.
text-align: end -- LTR resolves to right.
match-parent on a paragraph inside a right-aligned div.
Amiga = mouse-driven so hover=hover and pointer=fine. Green = matched, red = not matched, grey = parser missed the query.
@media (hover: hover) -- should be green
@media (hover: none) -- should be grey/inactive
@media (pointer: fine) -- should be green
@media (pointer: coarse) -- should be grey/inactive
:placeholder-shown (yellow), :required (red border), :optional (green border), :read-only (grey bg), :checked (red label), :disabled (grey), :valid/:invalid outline, :in-range/:out-of-range bg, :default (bold).
<- yellow bg (empty + placeholder)
required (red border) optional (green border)
read-only read-write
disabled enabled
in-range (green bg) out-of-range (red bg)
:not(.a, .b) list excludes both; [attr=val i] case-insensitive flag (engine already case-insensitive HTML-wide, so the flag parses without error).
plain (green)
.skip (white)
.skip2 (white)
another plain (green)
data-lang="EN" with [data-lang=en i] -- green bold (case-insensitive match)
data-lang="fr" -- default colour
:empty (red bar), :first-of-type (green), :last-of-type (red underline), :nth-of-type(2) (blue bg).
first paragraph (green)
second (blue bg + nth-of-type(2))
third
last (red + underline)
after-empty
decimal-leading-zero pads "0N.", counter() second arg honoured.
3D variants shade by tinting the base colour 1.5x (light) and 0.5x (dark).
flex-flow = flex-direction || flex-wrap in any order.
attr() href annotation: Example link
text-shadow multi (first wins): blue+red overlap
7 wrapped flex containers showing each align-content value. Free cross-space distribution across lines.
flex item margin:auto -- main-axis auto absorbs free space.
flex item margin:auto vertical -- cross-axis auto centres in tall row.
8-digit hex alpha blend
CSS-wide cascade keywords (unset, initial, revert)
Namespace selector prefix stripped (HTML has no XML namespaces)
*|div.ns-test -- matches because prefix droppedcursor: grab / zoom-in / none -- extra keywords
box-sizing: padding-box (deprecated, falls back to content-box)
display: 2-keyword form (Display L3 sect.2)
CSS3 extended named colors (60+ new entries in this batch)
font-weight arbitrary numeric (CSS Fonts L4)
font-weight: 150 (bucket -> 100)
font-weight: 350 (bucket -> 400)
font-weight: 550 (bucket -> 600)
font-weight: 750 (bucket -> 800)
font-weight: 950 (bucket -> 900)
display: contents (suppress wrapper box)
text-overflow 2-value form
Exotic list-style-type (armenian/hebrew/cjk-decimal -> decimal fallback)
Q unit (quarter-millimetre): 50Q ~= 47px
overflow: clip (mapped to hidden)
text-indent with hanging keyword (numeric kept, keyword consumed)
counter-reset with multiple name/value pairs
aspect-ratio (parse-only, no auto-size enforcement)
column-count (parse-only -- would split content into 3 columns)
hwb(hue whiteness% blackness%) -- additive HSV-like model
flex item with z-index creates stacking context (overlapping margin-left:-30px)
@media features (color/scan/resolution/aspect-ratio/prefers-*)
place-content shorthand
:is(.is-a, .is-b, .is-c) expands to three rules
descendant :is/:where (prefix expansion)
p inside .iw-box (also matched)
strong/em: strong and em (via :where)
div:is(.alpha, .beta) -- outer prefix lifted
@media L4 range syntax `(width >= N)` / `(width > N)` etc.
@supports with `not` / `or` / `and` operators
counters() function (single-value fallback)
linear-gradient angle units (turn / grad / rad)
Nested @media -- outer matches, inner matches -> rule applied
position: sticky (falls back to relative)