Skip to content

feat: release 1.0.0 - stable API, full Yoga test coverage, five engine fixes#11

Merged
StevenTCramer merged 9 commits into
masterfrom
dev
Jul 4, 2026
Merged

feat: release 1.0.0 - stable API, full Yoga test coverage, five engine fixes#11
StevenTCramer merged 9 commits into
masterfrom
dev

Conversation

@StevenTCramer

Copy link
Copy Markdown
Contributor

Summary

The road-to-1.0 batch (tasks 144-147):

  • Task 144 — API surface tightening (breaking vs beta.4 for internals consumers): public API reduced from 93 to 39 types; all algorithm machinery, style storage, events, and debug utilities are internal (tests via InternalsVisibleTo). Node.GetChild(int) now returns Node; new Node.CalculateLayout() instance convenience; Clone() clears the owner per YGNodeClone semantics.
  • Task 145 — remaining 21 Yoga unit suites ported (+123 tests), exposing and fixing five engine mistranslations: PixelGrid double-precision half-way rounding, full zeroOutLayoutRecursively reset + performLayout gating, Clone() owner clearing, display:contents clone recursion, and a full cleanupContentsNodesRecursively rewrite to C++ parity.
  • Task 146 — intrinsic text measurement: TestUtil-parity measure helper + converter support unlocked 12 IntrinsicSize conformance tests — all passed with no engine changes.
  • Task 147 — 1.0.0: version bump, installation docs drop --prerelease.

Verification

  • Full gates: Release build zero warnings; suite 1468 passed / 0 failed / 0 skipped (530+ Yoga conformance + full unit coverage); AOT native smoke PASS; dotnet format stable; ganda audit 22/22.
  • check-version: 1.0.0 not on nuget.org - safe to release.

Publishing the v1.0.0 release after merge pushes the first stable package to nuget.org and triggers the site rebuild (with the timewarp-software search-index wait-gate now in place).

🤖 Generated with Claude Code

StevenTCramer and others added 9 commits July 4, 2026 11:23
Package page and flexbox skill confirmed on timewarp.software after the
v1.0.0-beta.4 release chain. Search-index race documented; receiver-side
wait gate proposed as timewarp-software PR #23.

Co-Authored-By: Claude Fable 5 <[email protected]>
144 (blocker): API surface tightening - internalize ~75 engine-internal
public types and the mutable public static delegate wiring before the
semver freeze. 145: port remaining hand-written Yoga unit tests.
146: text-measurement helper to unlock skipped IntrinsicSize
conformance tests. 147: the 1.0.0 release itself, gated on 144.
148 (backlog): FixFlexBasisFitContent experimental feature.

Co-Authored-By: Claude Fable 5 <[email protected]>
Reduce the exported API from 93 types to the intended 39 (enums, value
types, delegates, Node/Style/Config/CalculateLayout/LayoutResults and
support types). All algorithm machinery, style storage internals, the
event system, and debug utilities are now internal - including the
previously public mutable FlexBasis.CalculateLayoutInternal delegate.
Tests keep exercising internals via InternalsVisibleTo.

API refinements while the surface was open: Node.GetChild(int) returns
Node (duplicate GetChildNode removed, ILayoutableNode explicitly
implemented) and a Node.CalculateLayout(...) instance convenience was
added. Internalizing the MockNode test helper also removed 5 phantom
Fixie-discovered test entries; the suite is a clean 1333/0/0.

BREAKING for beta.4 consumers who referenced engine internals; the
documented consumer API is unchanged apart from GetChild's improved
return type.

Co-Authored-By: Claude Fable 5 <[email protected]>
…defects (task 145)

123 new tests (suite: 1333 -> 1456, all passing). The new coverage
exposed five mistranslations, all fixed against the C++:

1. PixelGrid half-way rounding compared the fractional part as float
   instead of double, collapsing the 1e-4 tolerance boundary
   (-3.5001 rounded to -3 instead of -4).
2. ZeroOutLayoutRecursively now resets the entire layout (positions,
   margins, cached measurements) like C++ getLayout() = {}, clones
   children before recursing, and its display:none call site is gated
   on performLayout to avoid mutating during measure-only passes.
3. Node.Clone() clears Owner (C++ YGNodeClone semantics).
4. CloneChildrenIfNeeded recursively clones the children of a cloned
   display:contents child.
5. CleanupContentsNodesRecursively rewritten to C++ parity:
   didPerformLayout parameter, contents-clone calls, full layout
   reset, and no recursion into regular children.

Recorded omissions: 16 auto-min-size extension tests (feature not in
the engine), 3 free-semantics tests (no GC equivalent), 2 misc.
Three stale hand-written tests codifying old behavior updated.

Co-Authored-By: Claude Fable 5 <[email protected]>
…onformance tests (task 146)

Port Yoga's IntrinsicSizeMeasure test helper (TestUtil.cpp: 10px/char
word-wrap simulation, text via Node.Context) and teach the generated-
test converter the YGNodeSetContext + IntrinsicSizeMeasure patterns
(plus 2-space emission matching .editorconfig). IntrinsicSize
conversion grows from 5 to 17 tests; the 12 newly unlocked text-
measurement tests all pass with no engine changes. Remaining
exclusions are upstream GTEST_SKIPs. Suite: 1468/0/0.

Co-Authored-By: Claude Fable 5 <[email protected]>
Bump the version to 1.0.0 and drop the prerelease flag from the readme
and skill installation snippets. The public API surface (39 types,
task 144), full Yoga unit-test coverage (task 145), and intrinsic text
measurement verification (task 146) are all in place; the suite stands
at 1468 passed / 0 failed.

Co-Authored-By: Claude Fable 5 <[email protected]>
@StevenTCramer StevenTCramer merged commit efb7150 into master Jul 4, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant