Repository navigation
Not written yet
What Sashfold cannot do, it does not do — nothing stands in for a missing feature except where this page says so. The list is honest and current; the dashboard's census on The Sashfold 100 counts how often the live web asks for each.
Pages run their scripts (Scripting): the DOM, events, timers, promises and the event loop are written. What a page cannot do is what its bundle needs from the newer half of the language, below: a script that uses one of those features fails at parse time with a syntax error that names it, and the page stands as its markup alone. A growing share of sites answer a browser without their script with a bot challenge instead of the page.
The engine itself exists and runs scripts: a JavaScript engine of our own in src/js (Architecture), scored on test262 (Measurements). What it does not have yet, each of which is a syntax error that names itself rather than a silent misparse: async generators and for await, BigInt (and with it the two BigInt typed-array kinds), the v regular-expression flag, lookbehind and property escapes, and an await or yield inside a class heritage or a computed key. Modules are written — records, their linking and their evaluation, live bindings, the namespace object, dynamic import(), import.meta and top-level await (a module's body runs as an async function, and its importers wait for it) — and module scripts on the page run: fetched in CORS mode with the credentials the element asks for, held to a JavaScript type, deferred in document order with the classic defer scripts, an inline module keyed by its element with the document's URL as its base. Import maps are not written, so a bare specifier fails to resolve, and JSON and CSS modules are refused by type. Not written on the page side either: WebSocket, streams (fetch and XMLHttpRequest read a body whole), URL.createObjectURL, shadow trees, ranges and tree walkers, document.write after the parse, named access on the window, MutationObserver records.
-
Pseudo-elements other than
::before,::afterand::first-letter—::first-line,::marker,::selection,::placeholder— are parsed, and match nothing. A background, border or padding on a::first-letterwaits on inline box painting, below. -
font-synthesis— a weight or a slant the face does not have is always synthesized, sofont-synthesis-weight: noneandfont-synthesis-style: nonechange nothing. -
display: contents— the box is drawn rather than skipped.
-
margin-trim— the property is not read, so a container cannot drop the margins of the children that touch its own content edge. Now that the flow-relative properties are read, this is the one thing between the engine and the twenty-eight tests incss-box/margin-trim, which until then were matching a reference that had no margins either. -
Tables —
empty-cells: hide;visibility: collapseon rows and columns; percentage heights of rows and cells. In the collapsing border model a line whose winner changes along a spanning box's edge is drawn at the widest of them rather than segment by segment. -
Grid —
subgridandgrid-lanes(masonry) are passed over (asubgridtrack list is none); items share a baseline down a row but not across a column, sojustify-self: baselineisstart. The content keywords are read as awidth, amin-width, amax-widthand aflex-basis, but not as a height — a block's min-content and max-content heights are its content height, which is whatautoalready gives it — andfit-content(<length>)as a size property is not read (the grid track function of that name is). -
Multi-column layout,
text-overflow,overflow-wrap;justifystretches the spaces a line was broken at, so text kept whole bywhite-space: pre-wrap— which holds its spaces inside a word — does not stretch, and the only word separator it stretches is the ordinary space, not the no-break space or the Ethiopic, Aegean, Ugaritic and Phoenician ones;text-justifyis read but the only method written is the one between words, sointer-characterbehaves asinter-word; andtext-indentreads noeach-lineorhanging.text-transformuses the SIMPLE case mappings, so sharp s stays sharp s rather than becoming SS, the Turkish dotted i and the Greek final sigma are not decided by language or neighbour, andfull-widthandfull-size-kanaare not written;capitalizefinds word starts within one text node, so a word split across an inline box is capitalized twice. -
Writing modes and bidi —
writing-modeis read, and a page or a box that asks forvertical-rl,vertical-lr,sideways-rlorsideways-lris laid out sideways: its lines stack across the page, its text runs down it, and every glyph of a horizontal script turns a quarter circle. A box whose mode is not the one around it starts an orthogonal flow, laid out in a frame of its own and turned back into the page when it is done; the room its lines have is its own extent along the outer block axis, or where that is not settled, the initial containing block's.directionand thedirattribute settle which end of the line a block's content starts at and whatstartandendmean, anddir="auto"andunicode-bidi: plaintextfind that direction in the text itself — and the bidirectional algorithm reorders the text: a line's entries are drawn in the order rules L1 and L2 give them, a run that reads right to left has its characters reversed and its brackets mirrored (L4), andunicode-bidi'sembed,isolateandbidi-overrideopen the levels they name. A flex container's two axes, a grid's columns and a table's columns all read the way their direction says, and so does the overflow edge, the indent, the room a width leaves over, and where a box out of the flow stands when it writes no offsets of its own.What is left: an inline box whose content changes direction inside it is drawn as one box around all of it rather than in the several pieces the specification asks for;
isolate-overrideopens the isolate but not the override; there is no shaping, so Arabic letters do not join and a combining mark inside a reversed run lands on the wrong side of its base;<bdo>and<bdi>have no user-agent rules of their own yet;text-orientationis read but does nothing, andtext-combine-uprightis not written. An orthogonal flow's baseline is dropped rather than synthesized. -
Flexbox — baseline alignment is
flex-start. -
Positioning — fixed boxes do not yet move with the shell's scroll. An inline box that the flow broke around a block child fades that block with it, but each such block is its own group rather than all of them and the box's lines being one, which shows only where two of them overlap.
-
Inline boxes — an empty one contributes no height of its own to the line box, and
box-decoration-break: clonedraws asslice. -
List markers —
list-style-image; and an inside marker leads the item’s own first line only, so a list item whose content is blocks keeps its marker outside. -
Percentage heights of a box whose containing block has no definite height stay auto, as the specification says.
- Shadows, outlines, filters, clip paths, masks;
border-imagein all its parts. - Of rounded corners: a positioned descendant of a box that rounds its corners is held to that box's rectangle rather than its curve, and a table row's or column's background under its cells is square.
- Of backgrounds:
background-attachment(every layer scrolls with the page),background-clip: textandborder-area, three- and four-value and negative-percentage positions, and a row's or column's background in the collapsing border model. - Rotations, scales and skews (translations are drawn).
-
opacitybetween zero and one paints as if opaque (zero hides; group compositing is unwritten). - Border styles other than solid draw solid.
- Font hinting; color emoji (emoji are drawn as boxes until a color font format is read).
- Web fonts in WOFF and WOFF2 (TrueType
@font-facesources load); CFF-flavored OpenType is declined. - Animated GIF (the first frame shows), WebP, AVIF, SVG.
- Audio and video.
- The macOS window and TLS, so the window and
httpspages are Windows and Linux today. On Linux the TLS client fetches no CRLs yet, so revocation is not checked there, and it has no session resumption, so every connection to a host pays a full handshake; the window has no title bar on a compositor without server-side decorations (GNOME), and no HiDPI scaling, touch or input methods. - POST forms (a form that posts says so); file inputs are drawn only;
required/patternvalidation; a select's dropdown (keyboard only). - HTTP/2, socket timeouts (a hung server hangs a load), parallel subresource loads (they load one after another on kept connections).
- Session restore, profiles, bookmarks, content blocking, a settings page.
- The tab strip's open, close and hover transitions: the theme's timings are parsed, not yet consumed.
Getting started
What works today
Measured
Design decisions
Testing and tools