|
| 1 | +--- |
| 2 | +title: "SVG checklist" |
| 3 | +description: "The compact rung tracker: the SVG surface by section, each item checked when a Chromium-gated rung lands it on the n0 path." |
| 4 | +tags: |
| 5 | + - internal |
| 6 | + - wg |
| 7 | + - program |
| 8 | + - consolidation |
| 9 | +format: md |
| 10 | +--- |
| 11 | + |
| 12 | +# SVG checklist |
| 13 | + |
| 14 | +The compact tracker for the SVG engine of record (`websem → rframe → n0`). |
| 15 | +One line per construct; a checked box means a Chromium-gated rung landed it. |
| 16 | +An unchecked box is a departure the compiler already names (see |
| 17 | +[the refusal register](../../../fixtures/web-first/STATUS.md)) or surface not |
| 18 | +yet reached. This list tracks *position only*: semantics live in |
| 19 | +[the statement of record](../../../crates/n0_cli/README.md), rung history in |
| 20 | +[the D-N register](./svg-engine-of-record.md), and no score is computed from |
| 21 | +it (FLIP is unratified). A rung's docs commit ticks its rows. |
| 22 | + |
| 23 | +## Document & viewport |
| 24 | + |
| 25 | +- [x] standalone SVG entry (strict XML, UTF-8, no DTD) |
| 26 | +- [x] HTML entry (the document's first inline SVG) |
| 27 | +- [x] root `width`/`height`/auto sizing (WxH as initial viewport) |
| 28 | +- [x] `viewBox` (malformed refuses in both admissions) |
| 29 | +- [x] `preserveAspectRatio` (full grammar; malformed refuses) |
| 30 | +- [ ] percentage root sizing |
| 31 | +- [ ] nested `<svg>` |
| 32 | +- [ ] `<symbol>` |
| 33 | +- [ ] `<switch>` |
| 34 | +- [ ] `<foreignObject>` |
| 35 | + |
| 36 | +## Structure & references |
| 37 | + |
| 38 | +- [x] `<g>` / `<a>` containers |
| 39 | +- [x] `<defs>` (non-rendering, skipped by name) |
| 40 | +- [x] `<use>` same-document (first-id-wins table, forward refs, `xlink:href`, x/y translate, cycle/unresolved → correct nothing) |
| 41 | +- [ ] `<use>` under author CSS (shadow-scoped selector matching) |
| 42 | +- [ ] `<use>` external references |
| 43 | +- [ ] `<use>` of `<symbol>` / nested-`<svg>` targets |
| 44 | + |
| 45 | +## Geometry |
| 46 | + |
| 47 | +- [x] `<rect>` |
| 48 | +- [ ] `<rect>` `rx`/`ry` (rounded corners) |
| 49 | +- [x] `<circle>` / `<ellipse>` (auto and negative radii) |
| 50 | +- [x] `<line>` / `<polyline>` / `<polygon>` (points grammar; declared prefix divergence) |
| 51 | +- [x] `<path>`: `M L H V C S Q T Z` + `fill-rule` |
| 52 | +- [ ] `<path>`: `A` elliptical arc (needs the rframe conic amendment) |
| 53 | +- [ ] `pathLength` |
| 54 | +- [ ] CSS geometry properties (`x` `y` `cx` `cy` `r` `rx` `ry` `d` — Gecko-only at the Stylo pin) |
| 55 | + |
| 56 | +## Transforms |
| 57 | + |
| 58 | +- [x] `transform` attribute (whole SVG grammar; malformed list drops whole) |
| 59 | +- [x] CSS `transform` property + `-webkit-` alias (2D affine set) |
| 60 | +- [x] attribute↔CSS precedence (presentation-hint level) |
| 61 | +- [ ] `transform-origin` / `transform-box` |
| 62 | +- [ ] individual `rotate` / `translate` / `scale` properties |
| 63 | +- [ ] beyond-2D function family |
| 64 | +- [ ] root `<svg>` transform |
| 65 | + |
| 66 | +## Paint |
| 67 | + |
| 68 | +- [x] `fill`: named/hex/rgb(a) sRGB, `none`, `currentColor`, inherit |
| 69 | +- [x] `color` (the currentColor basis) |
| 70 | +- [x] `fill-opacity` / `stroke-opacity` / color alpha (float multiply, one quantize) |
| 71 | +- [ ] beyond-sRGB color spaces |
| 72 | +- [ ] `paint-order` |
| 73 | +- [ ] `context-fill` / `context-stroke` |
| 74 | + |
| 75 | +## Paint servers |
| 76 | + |
| 77 | +- [ ] `<linearGradient>` |
| 78 | +- [ ] `<radialGradient>` |
| 79 | +- [ ] `<stop>` (`offset`, `stop-color`, `stop-opacity`) |
| 80 | +- [ ] `gradientUnits` / `gradientTransform` / `spreadMethod` |
| 81 | +- [ ] `href` inheritance between gradients |
| 82 | +- [ ] `fill`/`stroke` `url(#…)` with fallback |
| 83 | +- [ ] `<pattern>` |
| 84 | + |
| 85 | +## Stroke |
| 86 | + |
| 87 | +- [x] solid stroke paint |
| 88 | +- [x] `stroke-width` (cascaded length; percentage against the viewport diagonal) |
| 89 | +- [x] `stroke-linecap` / `stroke-linejoin` / `stroke-miterlimit` |
| 90 | +- [ ] `stroke-dasharray` / `stroke-dashoffset` |
| 91 | +- [ ] `vector-effect` |
| 92 | + |
| 93 | +## Compositing & clipping |
| 94 | + |
| 95 | +- [ ] element `opacity` (needs the compositing scope) |
| 96 | +- [ ] `clip-path` |
| 97 | +- [ ] `mask` |
| 98 | +- [ ] `<filter>` / `filter` |
| 99 | +- [ ] `mix-blend-mode` / `isolation` |
| 100 | + |
| 101 | +## Disposition |
| 102 | + |
| 103 | +- [x] `display: none` (attribute and CSS; root ignores it, as Chromium does) |
| 104 | +- [x] `visibility` (descendant `visible` un-hides) |
| 105 | +- [ ] `display: contents` |
| 106 | + |
| 107 | +## CSS integration |
| 108 | + |
| 109 | +- [x] one Stylo cascade: `<style>` elements, `style` attributes, presentation hints (13 admitted) |
| 110 | +- [x] SVG-namespace stylesheet intake |
| 111 | +- [ ] shadow-scoped matching (author CSS + `<use>`) |
| 112 | +- [ ] longhands the pinned cascade cannot represent (`stop-color`, `marker-*`, `paint-order`, `d`, …) |
| 113 | + |
| 114 | +## Animation |
| 115 | + |
| 116 | +- [x] the time axis: Base / exact signed-nanosecond Sample, no ambient clock |
| 117 | +- [x] SMIL `animate` on rect `x` (the proving slice) |
| 118 | +- [ ] wider animated attributes (`y` `width` `height` `cx` `cy` `r` …) |
| 119 | +- [ ] `animateTransform` |
| 120 | +- [ ] CSS animations / transitions sampling |
| 121 | +- [ ] beyond-slice SMIL (`<set>`, href retargets) |
| 122 | + |
| 123 | +## Markers |
| 124 | + |
| 125 | +- [ ] `marker-start` / `marker-mid` / `marker-end` |
| 126 | + |
| 127 | +## Text |
| 128 | + |
| 129 | +- [ ] `<text>` (all of it) |
| 130 | + |
| 131 | +## Images & resources |
| 132 | + |
| 133 | +- [ ] `<image>` |
| 134 | +- [ ] external resources (self-contained input is the current contract) |
| 135 | + |
| 136 | +## Layout (HTML) |
| 137 | + |
| 138 | +- [ ] any HTML box layout (the surrounding page contributes nothing — pinned) |
0 commit comments