Repository navigation
v2.0.0-rc.1
Pre-releasePre-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
texparts (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
texpart declaresstatic build = {fields: {…: "katex"}, options: {katex: {output: "html"}}}and draws the producer'stexHtmlthrough markup-reader 1.0.0, which admits exactly egatari-spec'sschema/rendered-markup-1.json(generated into it bytools/markup-sync.mjs), uses no browser parser, and reports drops once per instance and kind with the count; withouttexHtmlthe source shows as text and is reported.tools/katex-produce.mjsis 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 ofschema/rendered-markup-1.json, checked bytools/spec.mjs) replaces c2-a3b'stools/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 onsvgandg,strokeontextandtspan) - One list: m-score requires markup-reader 1.0.0 and takes its
MARKUPfrom markup-reader's generatedLIST(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-familyandtext-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 (thetexHtmlandrenderersfields 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.mjsplays once and waits until no font face is loading before it records (m-syntax reports measured sizes only once fonts are loaded); newtools/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-scoremerged 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.mjsC2_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 onsvgandg,strokeon text, style shorthands,xmlnschecked and never set, drops reported once per kind); the spec file was pinned bytools/spec-schema.mjs(nowtools/spec.json, above);tools/score-fixtures.mjsrenders withforegroundColor: "currentColor"and leaves out abcjs's<style>,<title>and own attributes; the corpus test (with the new test-onlyfixtures/extras.json: dynamics, articulations, chord symbols, lyrics, title, tempo) fails on anything dropped but the expected losses (textfont-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 inbuild.subset(an array) with keychar, plusglyphs;tools/subset-produce.mjsis the stand-in producer (canonicalJSON.stringifyof the kept value,_members first, every byte outside the markers kept; recordssubset: {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 partkind(element/library) and element partstierandset, plusdisplay,buildandglyphswhen the part has them; CATALOG.md shows 段 (標準・専門(束)・特殊) per part and a "By tier" table.seriesstays 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.reportcall
m-score before 2.0 (as on the branch m-score)
m-score(series music 音楽, purposemusic; 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 writesabc(ABC notation); the build renders it with abcjs (add_classes: true) and addsabcSvg,abcMap(tempoin quarter notes per minute; per notecls,measure,pitch[],beatanddurin quarter notes,box;beamsas lists of note indices;arcs[{kind: "tie" | "slur", from, to, pitch?, n}], a tie per pitch, with the build tagging every drawn arc linedata-arc="n") andrenderer; the part carries no abcjs. Until Studio has that build step the data is written inline as the build would (the demo carriescomponents/score/fixtures/*.json, rendered with abcjs 6.7.2); data withabconly 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) orby="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 (clsstays 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 ofbeams[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 itstonote, a slur with itsfromnote); 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): onenoteper pitch (vel0.7, a chord at one t),durfrom 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'stosilent (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. Variantlight. Demo: a scale, a rhythm exercise, かえるの合唱 (German folk song, public domain) by measure, and I–IV–V–Itools/test-score.mjs(intools/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 everyabcjs-*class stripped; untagged notes and beams, unknown and duplicate tags reported; the test-only fixturefixtures/ties.jsonhas 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 unchangedtools/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), recordsbeamsandarcs, 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.mdkeeps 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 parttools/test-score-noclass.mjs(intools/test-all.mjs): the demo with everyabcjs-*class stripped from abcSvg has the same steps, events, note names and DOM (mid-step, final, preview) as the demo as built, in a browsertools/test-shape.mjs: m-score's wrong-shape case (abcwithout the renderedabcSvg/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 becamectx.report(code, "[<name>] …"),DECK.jabecame/^ja\b/i.test(ctx.lang)read inmount, position events becamelayout(ctx)or work onctx.entered, embedded variant and expression blocks gave way tobase.variantand theexprpart - Ids (spec §6.1 Identifiers):
ID_REWRITESholds plotplot-1-0-0-clip<n>, m-curvescurves-2-0-0-<n>, m-heatmapheatmap-2-0-0-legend-<n>, m-vennvenn-2-0-0-<n>(wasm-venn-<n>), and m-kakijunkakijun-2-0-0-clip-<n>and…<n>h(wasm-kakijun-clip-<n>) - Pack bytes:
node tools/pack-bytes.mjs --base v1.13.0shows +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 withctx.reportinstead ofconsole.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.mjs49/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 hascode: "error"(spec §8.4; was"registry") and keepsphase: "registry" - base 1.0.0, data-shape reports in spec §8.4's vocabulary:
ctx.report(reportCode(kind), "[<name>] data (<kind>): <summary>"), wherereportCodemapsattrandattrJsontoattrand every other kind (shape,missing,json,notText,empty,notLinks,noLinks) todata(was the kind itself, without a prefix). Base's own warnings start[base](wasdeck.js:and[deck]).tools/test-base.mjschecks a mismatch of each of the nine kinds - Lint: the
window/globalThisrule skips object-literal keys (m-codetree'swindowprop);ctx.reportcodes 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), neverstartsWith("ja") - Tests:
tools/test-c2-noreports.mjs(new, in test-all): every migrated part's demo and every identity fixture play without anyctx.report, but for the reports a fixture lists as expected;tools/test-shape.mjsaccepts 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'sexpr="12+"and3-5);tools/test-stats.mjsandtools/test-heatmap.mjsread hist-core, boxplot-core and heatmap-core; the 1.x tests read moved statics throughpartClass(static testing) or the core parts
The pilots (m-bars, m-menu)
m-bars2.0.0 andm-menu2.0.0:egatariParts.define({name, version: "2.0.0", requires: {base: "1.0.0"}, element}), extendingbase.MotionElement, withbase.el/mtext/prog/lerp/previewOpacityandctxinstead ofDECK. Their DOM is byte-identical to v1.13.0 (below). README frontmatterversion: 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.previewalone means the preview view (nomode === "lecture") - m-menu: parses its cards' fragments itself (spec §9.1A:
#<key>,#<key>:<stepKey>, legacy#N) againstctx.slides, and asksctx.visited(key); the visited marks are refreshed on the render wherectx.enteredis true (1.x listened to DECK'sdeck:pos);DECK.ja→/^ja\b/i.test(ctx.lang). Its style element ismenu-2-0-0-css(wasm-menu-css; spec §6.1 Identifiers; in<head>, not in the component's DOM). Out-of-range step keys: see the standards decisions below
- m-bars: an element too small for the bars is reported with
- The 1.x path: until Studio hosts 2.0,
tools/studio.mjsoverlays a migrated part as the registry shim, the parts it requires and the part (tools/parts.mjsc2Bundle, 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.mjsmatches m-bars's size report instead of its old warning - Registry shim:
ctx.enteredalso follows DECK'sdeck: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
windoworglobalThiseither - 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(intools/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.0index.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 demotools/test-dom-order.mjs: also checks that a migrated part runs through the registry shimtools/test-registry.mjs: lint refuseswindowandglobalThis
Standards decisions applied (egatari-spec b7520a8)
- Report prefix: each element class declares
static partName = "<folder>"; base prefixes containment reports with it, else the tag withoutm-, else the whole tag. Lint: an element part declares it, equal to its meta name. m-bars and m-menu declare it ctx.slidesentries are[{key, title, steps}](steps: the slide's largest numbered step key, 0 if none,conclnot counted); the shim bridges it from DECK (_cstep − 1with a conclusion, else_max). m-menu refuses a numbered step key above it, asDECK.resolveFragmentdid, so it matches 1.x again;tools/fixtures/c2-identity/menu.htmlchecks 12 cards (valid, out of range, non-canonical, the concl step by number, legacy numbers, unknown, escaped, another file) after a tour.ctx.slidesentries also carryconcl(egatari-spec d2b2474), so m-menu refuses#<key>:conclon 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.mjshas an explicit tableID_REWRITES(plotplot-1-0-0-clip<n>, m-curvescurves-2-0-0-<n>, m-heatmapheatmap-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); otherwisestatic 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.definewith an element and READMEversion: 2.x;tools/variant-sync.mjsandtools/expr-sync.mjsdrop a migrated part fromUSERSby themselves (a copied block left in one is an error),tools/test-default-variant.mjsandtools/test-variant.mjskeep testing every part with variants (VARIANT_PARTS);tools/gallery.mjsdoes 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 fortools/pack-bytes.mjsandtools/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.mdwith 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.mdupdated 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.definewithoutelement; dependency order shape → base → plot, and expr alone):shape1.0.0: the data-shape checker, Studio'skit/shape.js(DECK.shape) unchanged but for the wrapper; requires nothingbase1.0.0, requiringshape: returns exactly{MotionElement, el, lerp, prog, clamp, mtext, variant, previewOpacity}.MotionElement,el,mtext,lerp,progandclamp(DECK'sclamp01) are copied from the pinned Studio'skit/deck.js;variant(el, names?)isVARIANT.oftaking the names (defaultel.constructor.variants) instead of looking the tag up incustomElements;previewOpacity(el)reads--preview-opacity, else 0.45. Data shapes (spec §6.1; players stop validating component data):MotionElementchecks the part'sstatic shapeand json-prop shapes withshapebefore the part counts its steps or mounts, with deck.js's own check; on a mismatchstepsis thestepsattribute (else 0),mountcallsctx.report(kind, message)once and shows deck.js's.m-errorplaceholder (Japanese whenctx.langisja), 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.2plot1.0.0, requiringbase:{Plot}, Studio'sDECK.Plotunchanged, drawing with base'selandmtext(for m-boxplot, m-curves, m-hist, m-scatter, m-seq, m-sweep in alpha.2)expr1.0.0: the safe expression evaluator oftools/expr.js(kept equal bytools/expr-sync.mjs, which now also writes it);m-sweepandm-curveskeep their own copy until they move to 2.0
- Per-part versions: README frontmatter
version:is required (lint); the 35 1.x parts carryversion: 1.13.0. It is not pack-visible:tools/pack-bytes.mjsleaves the line out, as Studio's pack generator will (--base v1.13.0: +0 for every part).tools/release.mjswritesversioninto each manifest entry; a library part's entry is{kind: "library", version, requires, license?, sha256, files}(no tag).package.jsonkeeps 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
versionand exactrequires(no ranges); for an element part the registry name is the folder name (bars) andelementthe tag (m-bars); noDECK,importorrequire; every requirement is a part here at that exact version, with no cycle. A library part's README hasname(the folder),version(the meta's),kind: library,summary,requires(as in the meta) and no demo.tools/scan-code.mjsallowscomponents/base/index.jsexactly its reads of static declarations (constructor.steps,.props,.shape,.variants, and onevar C = c.constructor) and any class's ownconstructor(){…}; any other.constructorstays refused - Test-only registry shim
tools/registry-shim.js(never in a lesson or a release):egatariParts.definewith the §6.1 behaviour (dependency order, forward references refused,name@versionside 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):
MotionElementwraps the part'ssteps,mount,renderandlayout(andduration,cues). An exception never escapes to the player: the first is reported once per instance withctx.report("error", "[<name>] <phase>: <error>")(<name>= the tag withoutm-; a throw fromsteps,durationorcues, which get no ctx, is reported at the nextmount,renderorlayout), the element shows the.m-errorplaceholder (data-part-failure="error") with its text equivalent (aria-label, else its own text),stepsbecomes thestepsattribute (else 0), and the part is not called again.layoutis 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 fromcustomElements.defineis 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 fromDECK.Plotparity, which writesclip1,clip2, …:tools/test-part-plot.mjsallows exactly this (every clip id andurl(#…)has the prefix; with it removed the markup equalsDECK.Plot's), and so doestools/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()andpartNames()are new (library parts are not overlaid into Studio).tools/parts.mjsreads 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 equalstools/expr.js; in a browser, a 2.0 element part driven by DECK through the bridge (ctx members, noctx.deck,entered,report,go,visited,layoutthen render), and a failing element part showing its text equivalenttools/test-base.mjs: the parity guarantee for alpha.2 — each base helper equals the pinned Studio's DECK version (clamp/lerp/progon 1007 inputs with Object.is, includingprog(x, 0, 1)≡DECK.ease(x),elandmtextby outerHTML,MotionElementon 21 attribute/child cases with its warnings),variantequalsVARIANT.ofwith the same warnings,previewOpacityequals 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.shapetext 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 fromplot-1-0-0-clip1by its own counter, the prefix being the one allowed differencetools/test-registry.mjs, containment (in a browser, through the bridge): a part throwing fromsteps,mount,render(two instances) andlayout→ exactly onectx.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,definenever 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-score1034 - Every other part +0
sha256 efc672e96c1842834eff4c1fcc3603bc2efa4ce4076768b4e27ad6df7a69cf1c egatari-components-v2.0.0-rc.1.tar.gz