Skip to content

v2.0.0-rc.1

Pre-release
Pre-release

Choose a tag to compare

@moiku moiku released this 27 Oct 22:12
· 47 commits to main since this release

Pre-release for building Egatari Studio's 2.0 host (v0.6.3). Not for lessons: Studio up to v0.6.2 stays on 1.13.x. The final 2.0.0 ships with Studio v0.6.3.

2.0 alpha.3

Every element part is at 2.0.0: the six parts that drew math at play time move to build-time KaTeX (c2-a3a), and m-score joins with build-time abcjs, subset blocks, tiers and the manifest fields (c2-a3b); both follow egatari-spec ce96072, pinned once.

Summary

  • 36 element parts at 2.0.0: alpha.2's 29, the six tex parts (m-collect, m-cycle, m-fishbone, m-flow, m-timeline, m-tree) and m-score. Library parts at 1.0.0: shape, base, plot, expr, markup-reader (new) and hist-core, boxplot-core, heatmap-core, kanbun-core, codetree-core. Identity: 50 decks (35 demos and 15 fixtures; m-collect's fixture replaces its demo), 4271 frames, 4982 component DOMs; DOM byte-identical but for 18951 ids rewritten as allowed, 1172 data scripts equal as data (DATA_REWRITE) and 2568 empty KaTeX classes (KATEX_EMPTY_CLASS), and m-score's 288 frames pixel-identical to cc0e60a.
  • Build-time formulas (c2-a3a; spec §6.2): each tex part declares static build = {fields: {…: "katex"}, options: {katex: {output: "html"}}} and draws the producer's texHtml through markup-reader 1.0.0, which admits exactly egatari-spec's schema/rendered-markup-1.json (generated into it by tools/markup-sync.mjs), uses no browser parser, and reports drops once per instance and kind with the count; without texHtml the source shows as text and is reported. tools/katex-produce.mjs is the stand-in producer (KaTeX 0.19.0); identity compares the data as data (DATA_REWRITE), KaTeX's empty classes (KATEX_EMPTY_CLASS) and svg style text (KATEX_SVG_STYLE), approved by standards. m-collect's demo writes its data in the source; its fixture replaces the v1.13.0 demo
  • One spec pin: tools/spec.json (egatari-spec ce96072, with the SHA-256 of schema/rendered-markup-1.json, checked by tools/spec.mjs) replaces c2-a3b's tools/spec-schema.mjs; the two wrote under .spec/ in different layouts and could remove each other's files. markup-reader's list is regenerated from ce96072 (paint on svg and g, stroke on text and tspan)
  • One list: m-score requires markup-reader 1.0.0 and takes its MARKUP from markup-reader's generated LIST (svg entries). It keeps its own tree reader, which its step plan reads without a DOM. Still 288 of 288 frames pixel-identical to cc0e60a
  • Corpus tests on ce96072: KaTeX's 1209 formulas (html and htmlAndMathml) drop only their documented colour losses, and the pinned schema must still name them; abcjs's fixtures drop only text font-family and text-decoration, which the pinned list must not admit
  • Subset reports: m-kakijun's stroke-meta block starts with "_keys" (every published character; a subset keeps _ members unchanged), so a character the subset left out is reported "no stroke data for "い" (not in this lesson's subset: …)"; one without data keeps the 1.13.0 message
  • Pack bytes (node tools/pack-bytes.mjs --base v1.13.0): +0 for every part but the known deltas: m-codetree +119 (its README's 文脈木 / Context tree line), m-collect, m-flow, m-timeline, m-tree +22 and m-cycle, m-fishbone +32 (the texHtml and renderers fields their shapes now allow), m-scatter −2 (alpha.2's README wording); m-score is new
  • Lint: 0 warnings (m-timeline's deduplicating reporter dispatches literal codes)
  • Tests: tools/test-c2-noreports.mjs plays once and waits until no font face is loading before it records (m-syntax reports measured sizes only once fonts are loaded); new tools/test-markup-reader.mjs, tools/test-katex-produce.mjs, tools/test-subset.mjs, tools/test-score.mjs, tools/test-score-noclass.mjs

c2-a3b in detail

  • m-score 2.0.0 (new; never released in 1.x): the branch m-score merged and migrated with the recipe (components/score/CHANGELOG.md). Its data format changed with egatari-spec 8a410b0 (renderers: {abcjs: {version, options}} at the top; the normative rendered-markup list), so by the identity rule (egatari-spec ce96072) it is compared at 0 pixels against cc0e60a, the last commit before that change (recorded in its CHANGELOG): all 288 frames equal (tools/test-c2-identity.mjs, tools/parts.mjs C2_BASELINE_OF). Abc without rendered output shows its source as text and is reported (spec §6.2 Missing output)
  • Rendered markup (spec §6.2, egatari-spec ce96072): m-score's reader list equals schema/rendered-markup-1.json's svg part (paint on svg and g, stroke on text, style shorthands, xmlns checked and never set, drops reported once per kind); the spec file was pinned by tools/spec-schema.mjs (now tools/spec.json, above); tools/score-fixtures.mjs renders with foregroundColor: "currentColor" and leaves out abcjs's <style>, <title> and own attributes; the corpus test (with the new test-only fixtures/extras.json: dynamics, articulations, chord symbols, lyrics, title, tempo) fails on anything dropped but the expected losses (text font-family, text-decoration)
  • Subset blocks (spec §6.2): m-kakijun's data are /*@egatari-block strokes*/ (OFL, the notice comment before it) and /*@egatari-block stroke-meta*/ (MIT), both declared in build.subset (an array) with key char, plus glyphs; tools/subset-produce.mjs is the stand-in producer (canonical JSON.stringify of the kept value, _ members first, every byte outside the markers kept; records subset: {keys, sha256}); tools/test-subset.mjs (in test-all). あさ: 35.3 KB, the demo: 64.5 KB, full: 207.9 KB
  • Tiers (owner decision, parts-tiers-2026-10-27 §1): README frontmatter tier (standard / specialized / extra) and, for specialized parts, set (stats, math, maps, kokugo, english, music, business, tools), checked by lint; the manifest gives every part kind (element / library) and element parts tier and set, plus display, build and glyphs when the part has them; CATALOG.md shows 段 (標準・専門(束)・特殊) per part and a "By tier" table. series stays for now
  • m-codetree is shown as 文脈木 / Context tree (frontmatter display, README, CATALOG.md); its tag and folder are unchanged
  • Lint: no warnings left: m-boxplot, m-heatmap, m-hissan, m-hist, m-kakijun and m-map-world forward their collected notes with a literal code per ctx.report call

m-score before 2.0 (as on the branch m-score)

  • m-score (series music 音楽, purpose music; not in the free pack for now): music notation per step, with sound. The first user of build-time rendering (components 2.0 design §4.1): the author writes abc (ABC notation); the build renders it with abcjs (add_classes: true) and adds abcSvg, abcMap (tempo in quarter notes per minute; per note cls, measure, pitch[], beat and dur in quarter notes, box; beams as lists of note indices; arcs [{kind: "tie" | "slur", from, to, pitch?, n}], a tie per pitch, with the build tagging every drawn arc line data-arc="n") and renderer; the part carries no abcjs. Until Studio has that build step the data is written inline as the build would (the demo carries components/score/fixtures/*.json, rendered with abcjs 6.7.2); data with abc only shows the placeholder. The SVG is not trusted: it is rebuilt from allowed elements and attributes only (no innerHTML or DOMParser; style, title, other colours, links and handlers dropped). by="note" (default; one note, chord or rest per step) or by="measure"; staff, clef, key and time signature from step 0; bar lines with the last note of their measure; elements found only by the build's tags, never by an abcjs class (cls stays in abcMap as the adapter's record): data-note="i" on each note and rest, data-beam="k" on each beam path (with the first note of beams[k]), data-measure="m" on each bar line (with the last note of its measure), data-arc="n" on each drawn tie or slur line (a tie with its to note, a slur with its from note); untagged elements show from step 0, and a note, beam or arc without a tagged element, or an unknown tag value, warns; a staff line is one child of the root svg. events(k): one note per pitch (vel 0.7, a chord at one t), dur from beats and tempo, a pitch tied by a tie arc sounding on past the end of its step (through a chain of ties), rests and the tied pitch at a tie's to silent (so [C-EG] [CEG] sounds E and G again but not C). names="solfa|abc|iroha|none" (default none) under the noteheads at 26 px, from the frozen notehead boxes; chords top note first; a measure where any names collide puts all its names in a zigzag (odd notes on the upper row, even notes on the lower), other measures stay on one row. The current note in --emph, earlier ones --fg; under preview later notes at --preview-opacity. Readable layer 「楽譜:ド レ ミ ファ|…」, drawing aria-hidden. Variant light. Demo: a scale, a rhythm exercise, かえるの合唱 (German folk song, public domain) by measure, and I–IV–V–I
  • tools/test-score.mjs (in tools/test-all.mjs): m-score without a browser on the fixtures: the SVG reader keeps only allowed elements and attributes, abcMap errors, steps by note and by measure, events (pitch, dur, chords at one t, notes of a measure at their beat, rests and ties), which note each SVG element appears with (from the data- tags only, the same with every abcjs-* class stripped; untagged notes and beams, unknown and duplicate tags reported; the test-only fixture fixtures/ties.json has ties in a chord, a chain of ties, a tie and a slur from one note, a chord tie and a slur across a line break, and a tie on one pitch of a chord, checked against the classes abcjs writes on each line), sound per pitch from tie arcs, note names and their placement (the zigzag of crowded measures), the readable layer, and the demo carrying the fixtures unchanged
  • tools/score-fixtures.mjs: the stand-in for Studio's build hook: renders the m-score fixtures and demo with abcjs (installed outside the repository, ABCJS_DIR), records beams and arcs, tags notes (data-note), beams (data-beam), bar lines (data-measure) and arc lines (data-arc) and drops the hidden duplicate line; components/score/fixtures/ABCJS-ADAPTER.md keeps what a producer must know about abcjs 6.7.2 (classes, the order abcjs draws arcs in, its quirks), none of which is in the part
  • tools/test-score-noclass.mjs (in tools/test-all.mjs): the demo with every abcjs-* class stripped from abcSvg has the same steps, events, note names and DOM (mid-step, final, preview) as the demo as built, in a browser
  • tools/test-shape.mjs: m-score's wrong-shape case (abc without the rendered abcSvg / abcMap)

2.0 alpha.2

Every element part but the six that draw math with svgMath moves to egatariParts.define (Egatari spec §6.1, §8.4 as of egatari-spec 71cb10c; design components-2.0-design.md §11; recipe docs/c2-migration.md). The pattern was piloted on m-bars and m-menu, then applied to the other parts in four parallel branches (c2-w1 … c2-w4). Studio does not host 2.0 yet: the migrated parts reach the pinned Studio through the test-only registry shim.

Summary

  • 29 element parts at 2.0.0, each byte-identical in DOM to its v1.13.0 version on its v1.13.0 demo and on its identity fixture, at every step (35 %, 70 %, end), in the talk and preview views and after a tour of every slide, but for the id rewrites listed in ID_REWRITES (tools/test-c2-identity.mjs): 39 decks (29 demos and 10 fixtures), 3117 frames, 3522 component DOMs, 18951 ids rewritten as allowed
    • m-bars, m-menu (pilots); m-curves, m-hist, m-boxplot, m-scatter, m-seq, m-sweep, m-heatmap (c2-w1); m-gendai, m-kobun, m-kanbun, m-syntax, m-codetree, m-hissan, m-kakijun (c2-w2); m-quad, m-kpi, m-keyboard, m-map-japan, m-map-world, m-predict, m-timer (c2-w3); m-compare, m-market, m-pie, m-numberline, m-tape, m-venn (c2-w4)
    • still 1.x (alpha.3, build-time tex, spec §6.2): m-collect, m-cycle, m-fishbone, m-flow, m-timeline, m-tree
  • New library parts 1.0.0, the logic tests and other parts used through DECK.<name> or a class static: hist-core, boxplot-core, heatmap-core, kanbun-core, codetree-core (each with its CATALOG.md line)
  • Each migrated part's own changelog (components/<name>/CHANGELOG.md, ## 2.0.0) says what moved: warnings about the lesson's data or markup became ctx.report(code, "[<name>] …"), DECK.ja became /^ja\b/i.test(ctx.lang) read in mount, position events became layout(ctx) or work on ctx.entered, embedded variant and expression blocks gave way to base.variant and the expr part
  • Ids (spec §6.1 Identifiers): ID_REWRITES holds plot plot-1-0-0-clip<n>, m-curves curves-2-0-0-<n>, m-heatmap heatmap-2-0-0-legend-<n>, m-venn venn-2-0-0-<n> (was m-venn-<n>), and m-kakijun kakijun-2-0-0-clip-<n> and …<n>h (was m-kakijun-clip-<n>)
  • Pack bytes: node tools/pack-bytes.mjs --base v1.13.0 shows +0 for every part but m-scatter, −2 bytes: its README says that a line outside the frame and a name with no room are told with ctx.report instead of console.warn
  • Registry shim (test only): printing is not entering a slide (egatari-spec 71cb10c): while printing, renders and position events neither move the viewer's slide, bump its epoch nor set ctx.entered, so viewer input survives a print (tools/test-predict.mjs 49/49); a report's record, and a registry failure's, has the slide's index also when made before DECK lists the slides; a registry failure's record has code: "error" (spec §8.4; was "registry") and keeps phase: "registry"
  • base 1.0.0, data-shape reports in spec §8.4's vocabulary: ctx.report(reportCode(kind), "[<name>] data (<kind>): <summary>"), where reportCode maps attr and attrJson to attr and every other kind (shape, missing, json, notText, empty, notLinks, noLinks) to data (was the kind itself, without a prefix). Base's own warnings start [base] (was deck.js: and [deck]). tools/test-base.mjs checks a mismatch of each of the nine kinds
  • Lint: the window / globalThis rule skips object-literal keys (m-codetree's window prop); ctx.report codes must be spec §8.4's (data, attr, range, size, layout, theme, error) and an element part's messages start with [<name>], wherever these are string literals, and warns (without failing) about a computed code unless it comes from a known mapping helper (reportCode); the language test is /^ja\b/i.test(ctx.lang), never startsWith("ja")
  • Tests: tools/test-c2-noreports.mjs (new, in test-all): every migrated part's demo and every identity fixture play without any ctx.report, but for the reports a fixture lists as expected; tools/test-shape.mjs accepts a contained throw (code: "error") only for the cases it names as meant to throw (m-compare's and m-venn's semantic cases, m-curves' and m-sweep's mount exceptions, m-hissan's expr="12+" and 3-5); tools/test-stats.mjs and tools/test-heatmap.mjs read hist-core, boxplot-core and heatmap-core; the 1.x tests read moved statics through partClass (static testing) or the core parts

The pilots (m-bars, m-menu)

  • m-bars 2.0.0 and m-menu 2.0.0: egatariParts.define({name, version: "2.0.0", requires: {base: "1.0.0"}, element}), extending base.MotionElement, with base.el / mtext / prog / lerp / previewOpacity and ctx instead of DECK. Their DOM is byte-identical to v1.13.0 (below). README frontmatter version: 2.0.0
    • m-bars: an element too small for the bars is reported with ctx.report("size", "[bars] …") (1.x: console.warn("m-bars: …")); ctx.preview alone means the preview view (no mode === "lecture")
    • m-menu: parses its cards' fragments itself (spec §9.1A: #<key>, #<key>:<stepKey>, legacy #N) against ctx.slides, and asks ctx.visited(key); the visited marks are refreshed on the render where ctx.entered is true (1.x listened to DECK's deck:pos); DECK.ja → /^ja\b/i.test(ctx.lang). Its style element is menu-2-0-0-css (was m-menu-css; spec §6.1 Identifiers; in <head>, not in the component's DOM). Out-of-range step keys: see the standards decisions below
  • The 1.x path: until Studio hosts 2.0, tools/studio.mjs overlays a migrated part as the registry shim, the parts it requires and the part (tools/parts.mjs c2Bundle, guarded so that a page with several migrated parts loads each once). Every 1.x test then builds, plays and checks m-bars and m-menu through the shim's bridge; none had to be skipped. tools/test-map-small.mjs matches m-bars's size report instead of its old warning
  • Registry shim: ctx.entered also follows DECK's deck:pos, so that a slide is entered again after the viewer was on a slide without 2.0 parts (found by the identity test's tour: m-menu's marks were not refreshed)
  • Lint: a 2.0 part must not use window or globalThis either
  • Recipe docs/c2-migration.md: the checklist for migrating a part (the define wrapper, base, variants and preview, helpers, reports, language, position events, navigation, errors, test exports, ids, README), how to check it, the six svgMath parts that wait for alpha.3 (m-collect, m-cycle, m-fishbone, m-flow, m-timeline, m-tree), and the points that need a standards decision

Tests

  • tools/test-c2-identity.mjs (in tools/test-all.mjs): for each migrated element part, its v1.13.0 demo built twice with the pinned Studio — with the part's v1.13.0 index.js, and with the 2.0 part through the shim — and played the same way: every slide with components, every step at 35 % and 70 % of its length and at its end, in the talk and preview views, then after a tour that goes to every slide (viewer state such as visited marks). The components' outerHTML must be byte-identical at every frame, except plot's prefixed clip ids (none in these two parts). m-bars: 141 frames (174 component DOMs), m-menu: 15 frames (4 visited marks after the tour), and 3 frames on its fixture (6 visited marks, 6 cards refused). Also: the part is defined through the registry, no console error on either side, no report on its own demo
  • tools/test-dom-order.mjs: also checks that a migrated part runs through the registry shim
  • tools/test-registry.mjs: lint refuses window and globalThis

Standards decisions applied (egatari-spec b7520a8)

  • Report prefix: each element class declares static partName = "<folder>"; base prefixes containment reports with it, else the tag without m-, else the whole tag. Lint: an element part declares it, equal to its meta name. m-bars and m-menu declare it
  • ctx.slides entries are [{key, title, steps}] (steps: the slide's largest numbered step key, 0 if none, concl not counted); the shim bridges it from DECK (_cstep − 1 with a conclusion, else _max). m-menu refuses a numbered step key above it, as DECK.resolveFragment did, so it matches 1.x again; tools/fixtures/c2-identity/menu.html checks 12 cards (valid, out of range, non-canonical, the concl step by number, legacy numbers, unknown, escaped, another file) after a tour. ctx.slides entries also carry concl (egatari-spec d2b2474), so m-menu refuses #<key>:concl on a slide without a conclusion, as 1.x did (the fixture has that case: 13 cards)
  • Ids a part writes itself: renamed <name>-<x-y-z>-…, deterministic. tools/test-c2-identity.mjs has an explicit table ID_REWRITES (plot plot-1-0-0-clip<n>, m-curves curves-2-0-0-<n>, m-heatmap heatmap-2-0-0-legend-<n>); ids are matched where written or referred to (id="…", url(#…), href="#…") and numbered by first appearance on both sides; nothing else may differ. Each rewrite is noted in the part's own changelog
  • Test exports: real logic moves to a library part (<name>-core, exact version, its own catalogue line); otherwise static testing = {…}. Lint: no part reads .testing
  • Steps depend only on attributes and content, never on ctx or the language (spec §8.4): in the recipe, with m-keyboard's plan() as the known case

Parallel migration

  • Derived lists: the migrated parts are migratedNames() = egatariParts.define with an element and README version: 2.x; tools/variant-sync.mjs and tools/expr-sync.mjs drop a migrated part from USERS by themselves (a copied block left in one is an error), tools/test-default-variant.mjs and tools/test-variant.mjs keep testing every part with variants (VARIANT_PARTS); tools/gallery.mjs does not mark a part "changed" for its migration (gallery.html is back to its v1.13.0 content); partClass() reads 1.x and 2.0 parts without a browser for tools/pack-bytes.mjs and tools/test-part-shape.mjs (m-bars's shape was silently skipped after its migration; 35 shapes again)
  • Per-part changelogs: a migrated part keeps components/<name>/CHANGELOG.md with a ## <version> section (lint); m-bars and m-menu have theirs. Per-part identity fixtures: tools/fixtures/c2-identity/<name>.html
  • Recipe docs/c2-migration.md updated with all of the above

2.0 alpha.1

Components 2.0 starts on the branch c2-base (Egatari spec §6.1 parts and their dependencies, as of egatari-spec 56061ac; design components-2.0-design.md §11). No element part changes behaviour: every index.js of the 35 components is unchanged, and Studio still sees exactly those 35. New library parts start at 1.0.0; migrated element parts will be 2.0.0 (alpha.2), and the catalogue 2.0.0 later.

  • Library parts (egatariParts.define without element; dependency order shape → base → plot, and expr alone):
    • shape 1.0.0: the data-shape checker, Studio's kit/shape.js (DECK.shape) unchanged but for the wrapper; requires nothing
    • base 1.0.0, requiring shape: returns exactly {MotionElement, el, lerp, prog, clamp, mtext, variant, previewOpacity}. MotionElement, el, mtext, lerp, prog and clamp (DECK's clamp01) are copied from the pinned Studio's kit/deck.js; variant(el, names?) is VARIANT.of taking the names (default el.constructor.variants) instead of looking the tag up in customElements; previewOpacity(el) reads --preview-opacity, else 0.45. Data shapes (spec §6.1; players stop validating component data): MotionElement checks the part's static shape and json-prop shapes with shape before the part counts its steps or mounts, with deck.js's own check; on a mismatch steps is the steps attribute (else 0), mount calls ctx.report(kind, message) once and shows deck.js's .m-error placeholder (Japanese when ctx.lang is ja), and nothing is drawn. The direction is base → shape because shape is pure and needs nothing from base (no cycle), while base needs it in every element. Warning texts stay verbatim (deck.js:, [deck]) until alpha.2
    • plot 1.0.0, requiring base: {Plot}, Studio's DECK.Plot unchanged, drawing with base's el and mtext (for m-boxplot, m-curves, m-hist, m-scatter, m-seq, m-sweep in alpha.2)
    • expr 1.0.0: the safe expression evaluator of tools/expr.js (kept equal by tools/expr-sync.mjs, which now also writes it); m-sweep and m-curves keep their own copy until they move to 2.0
  • Per-part versions: README frontmatter version: is required (lint); the 35 1.x parts carry version: 1.13.0. It is not pack-visible: tools/pack-bytes.mjs leaves the line out, as Studio's pack generator will (--base v1.13.0: +0 for every part). tools/release.mjs writes version into each manifest entry; a library part's entry is {kind: "library", version, requires, license?, sha256, files} (no tag). package.json keeps the catalogue version. CATALOG.md lists the library parts in a section of their own
  • Lint for 2.0 parts: the define meta is plain values with an exact version and exact requires (no ranges); for an element part the registry name is the folder name (bars) and element the tag (m-bars); no DECK, import or require; every requirement is a part here at that exact version, with no cycle. A library part's README has name (the folder), version (the meta's), kind: library, summary, requires (as in the meta) and no demo. tools/scan-code.mjs allows components/base/index.js exactly its reads of static declarations (constructor.steps, .props, .shape, .variants, and one var C = c.constructor) and any class's own constructor(){…}; any other .constructor stays refused
  • Test-only registry shim tools/registry-shim.js (never in a lesson or a release): egatariParts.define with the §6.1 behaviour (dependency order, forward references refused, name@version side by side, exact versions, each returned value frozen shallowly, failure of a part and its dependants with a text-equivalent fallback for elements), plus a bridge that lets the pinned Studio's DECK seek loop drive 2.0 element parts with the 2.0 ctx (lang, slides, slide key, preview, entered, go, visited → DECK.visited, report, layout(ctx))
  • Containment in base (spec §6.1 as of egatari-spec 48da212): MotionElement wraps the part's steps, mount, render and layout (and duration, cues). An exception never escapes to the player: the first is reported once per instance with ctx.report("error", "[<name>] <phase>: <error>") (<name> = the tag without m-; a throw from steps, duration or cues, which get no ctx, is reported at the next mount, render or layout), the element shows the .m-error placeholder (data-part-failure="error") with its text equivalent (aria-label, else its own text), steps becomes the steps attribute (else 0), and the part is not called again. layout is wrapped only when the part has one. Handlers a part registers itself are not wrapped
  • Registry failures (shim): a throw from a factory is caught at define time; the part stays undefined, and the console line says what happened and what follows ([egatariParts] bars@2.0.0: factory: its factory threw TypeError: …; it is not defined, and the parts that require it fail too). A dependant's own failure names the part it requires and that part's cause (requires c2badlib@0.0.1, which failed (factory: its factory threw …)), and each fallback element adds its own report (code: "registry", [<name>] <key> is not defined (…)) to the shim's reports and DECK.componentErrors. A throw from customElements.define is caught too
  • plot clip ids (spec §6.1 Identifiers): plot-1-0-0-clip1, plot-1-0-0-clip2, … (name and version, dots replaced, then plot's own module counter; deterministic). A deliberate deviation from DECK.Plot parity, which writes clip1, clip2, …: tools/test-part-plot.mjs allows exactly this (every clip id and url(#…) has the prefix; with it removed the markup equals DECK.Plot's), and so does tools/test-c2-identity.mjs
  • m-menu's fragment parsing (today DECK.resolveFragment) moves inside m-menu in alpha.2 (done; see above)
  • tools/studio.mjs: componentNames() is the element parts; libraryNames() and partNames() are new (library parts are not overlaid into Studio). tools/parts.mjs reads a part's meta without running it and gives the dependency order

Tests

  • tools/test-registry.mjs: resolver order, forward-reference refusal, two versions of base coexisting, exact-version matching and refusal of ranges, a factory throw leading to the fallback (and its dependants), element defined once, frozen values (a strict-mode write to a dependency fails, sloppy writes are ignored, the freeze is shallow), lint of 2.0 names; the library parts load in dependency order and expr equals tools/expr.js; in a browser, a 2.0 element part driven by DECK through the bridge (ctx members, no ctx.deck, entered, report, go, visited, layout then render), and a failing element part showing its text equivalent
  • tools/test-base.mjs: the parity guarantee for alpha.2 — each base helper equals the pinned Studio's DECK version (clamp/lerp/prog on 1007 inputs with Object.is, including prog(x, 0, 1) ≡ DECK.ease(x), el and mtext by outerHTML, MotionElement on 21 attribute/child cases with its warnings), variant equals VARIANT.of with the same warnings, previewOpacity equals the parts' own read; the data check gives DECK's record, placeholder, fallback steps and message on 20 cases (16 mismatches of every kind)
  • tools/test-part-shape.mjs: shape ≡ DECK.shape text for text (check, describe, brief, gotOf, typeOf, near, dataLike) on the components' 30 declared shapes and 5 more, with altered data reaching every kind of mismatch (about 10,000 comparisons)
  • tools/test-part-plot.mjs: plot.Plot ≡ DECK.Plot (SVG markup and returned values) on 24 boxes × options; clip paths numbered from plot-1-0-0-clip1 by its own counter, the prefix being the one allowed difference
  • tools/test-registry.mjs, containment (in a browser, through the bridge): a part throwing from steps, mount, render (two instances) and layout → exactly one ctx.report("error", "[c2throw] <phase>: …") per instance, one placeholder with the text equivalent, steps = the attribute or 0, the part not called again, DECK never sees an exception, no page error, and the other part and the slide's items are unaffected. Registry: the factory-throw message and console line, the dependant's message naming the cause, a thrown non-Error, define never rethrowing; in a browser, a dependant of a failing library part shows its text equivalent and has its own report

Pack-visible bytes (Egatari Studio's AI pack), change since v1.13.0

Counted with node tools/pack-bytes.mjs --base v1.13.0.

  • m-codetree +119; m-cycle, m-fishbone +32 each; m-collect, m-flow, m-timeline, m-tree +22 each; m-scatter −2
  • New m-score 1034
  • Every other part +0

sha256 efc672e96c1842834eff4c1fcc3603bc2efa4ce4076768b4e27ad6df7a69cf1c egatari-components-v2.0.0-rc.1.tar.gz