- Decimal/text markers now inherit the current list-item font color.
- Marker X/Y coordinates are pixel-snapped, eliminating blurry rendering.
- The behavior is shared by <li> and textual <summary> markers.
- Added focused tests for inherited color and integer positioning.
Introduce contiguous PropertyId and ShorthandId enums backed by name-to-ID maps, replacing hash-valued property identifiers throughout the style system.
Replace PropertyIdSet's unordered set with a fixed-size bitset, eliminating heap allocations during style state changes while providing deterministic ascending iteration.
Keep name hashes for stylesheet storage and unknown or custom properties, while using dense typed IDs for registered-property lookup and dispatch.
Preserve property aliases and the public Checked compatibility identifier.
Add transaction-end reconciliation for interdependent image sizing properties, deferring percentage-based calculations until their containing block is resolved.
Keep formatting-context-owned sizes intact for table cells and inline content.
Add validation and tests for dense built-in registration, custom IDs, aliases, bitset operations, allocation-free storage, unknown properties, property application order, and image sizing regressions.
Model HTML images as replaced UIHTMLWidget elements with independent loading, sizing, and rendering behavior.
Resolve auto margins according to each element's formatting context, including normal-flow blocks, positioned elements, flex items, and grid items. Preserve intrinsic sizing for block-level images with width:auto and constrain them through CSS min/max dimensions.
Correct absolute-positioned containing-block coordinates and rich-text handling of atomic inline elements. Add regression coverage for centered images, deferred image loading, grid margins, positioned elements, and document flow after image loading.
Document the remaining work required for dynamically changing non-atomic inline elements.
Avoid saving eeiv configuration during destruction (fixes window state saving).
- implement per-side CSS border styles and patterned rendering
- preserve rectangular rasterization for thin dotted borders
- separate CSS and native-widget border defaults
- correct inline atomic-box and vertical-align baseline layout
- collapse adjacent block margins in rich-text flow
- preserve forced line breaks and formatting margins
- size HTML text inputs from font ascent and descent
- expose replaced-control text baselines to inline layout
- enforce single-owner painting for inline backgrounds and borders
- enable and update the old Reddit visual regression golden
- add generic layout, border, and form-control regression tests
- document spec-first HTML work and project build conventions
Resolve auto margins according to the element's formatting context instead of applying native block centering to every HTML child.
Inline-level replaced elements, inline-blocks, floats, and out-of-flow boxes now use zero-valued auto margins in rich-text measurement and positioning, while normal-flow blocks retain horizontal auto-margin resolution. This prevents asynchronously loaded images from feeding stale calculated margins back into their inline ancestors and producing unbounded document widths, as observed on the Asahi Linux site.
Add synchronous and threaded WebView regression coverage using the Asahi fixture, including its weighted host layout and asynchronous SVG loading.
Document the follow-up plan for explicit formatting-role margin resolution, shared image-content composition, and rebasing UIHTMLImage on UIHTMLWidget.
- batch asynchronous HTTP stylesheets and apply them in a single reload
- skip unsupported block at-rules without leaking nested rules
- prevent scripts nested in unknown custom elements from entering the render tree
- add regression coverage for unsupported at-rules and nested scripts
- document the Ninja release workflow for performance testing
The float-aware rich-text layout was resetting curX for every block formatting context, including inline-blocks. That made consecutive action buttons overlap. The reset is now limited to block-level BFCs;
inline-blocks retain normal cursor advancement.
Added:
- An always-on deferred CSS regression covering inline anchors, inline-block siblings, and float exclusions.
- Strict action-row and title/domain ordering checks in the opt-in Reddit visual smoke test.
- A small CSS fixture reproducing Reddit’s layout rules.
Preserve the final cross-axis size assigned to auto-sized stretched flex
items when their block layout runs. Keep intrinsic flex measurement
separate so content changes can still update item sizing correctly.
Add an HTML regression test covering a short sidebar stretched alongside
taller content.
Treat UIHTMLInput as the stable HTML/CSS host while keeping its native
control as an anonymous implementation detail.
Prevent author CSS from matching internal control widgets, avoiding
duplicated backgrounds and other styles. Keep valid input types such as
email intact for attribute selectors while falling back to compatible
native implementations.
Synchronize the internal control with the host content box after layout,
including flex sizing, and preserve intrinsic measurement for size and
font changes. Preserve input state across dynamic type changes and make
hidden transitions reversible.
Also fix border-radius calculations and add regressions for CSS ownership,
anonymous widget isolation, dynamic type changes, input sizing, and the
Causality newsletter form.
- parse slash-separated background position and size without requiring whitespace
- recognize custom-property background images following an explicit size
- resolve root body and html minimum heights against the layout viewport
- avoid expanding semantic document boxes to the scrollable content extent
- handle auto margins and percentage offsets correctly for absolute positioning
- add DuckDuckGo layout and background shorthand regression tests
- document the Xvfb limitation with multisampled OpenGL contexts
Fix:
- User fallback now uses "user-fallback-font".
- Built-in CJK and custom fallback fonts remain registered together.
- Added and passed a regression test verifying both fallback resources remain in the chain.
Fixes in premake5.lua:
- Removed obsolete PRECISE_F32=1; Wasm already provides precise float behavior.
- Moved ENVIRONMENT=worker,web to final application link options.
Fixed MarkdownView not getting the correct CSS style from the base theme.
- replace FontManager with per-ResourceScope FontService instances
- publish font factories into explicit or default resource scopes
- import default resources into UI scene scopes unless explicitly disabled
- keep related font faces strongly owned without hot-path weak_ptr locking
- add cached glyph advance queries without creating texture pages
- fix font picker preview ownership, cleanup, and rapid switching
- selectively evict TextLayout cache entries when referenced fonts unload
- document FontService, ResourceCatalog, and cache invalidation semantics
- migrate examples, tools, benchmarks, and tests to the scoped font API
- expand coverage for font ownership, texture release, and layout caching
Add a scene-owned UI::DrawableResolver for resolving file, data, HTTP, and
named drawable references through each UISceneNode's current resource scope.
Move generic texture, atlas region, nine-patch, and sprite lookup into
Graphics::ResourceScope, preserving drawable resolution for pure Graphics
consumers without introducing a UI dependency.
Migrate UI images, sprites, menus, CSS parsing, and tests to the new resolver.
Resolve CSS icons through the requesting node's scene instead of the global
scene, preserving embedded-scene isolation.
Remove the obsolete DrawableSearcher API and update platform project manifests,
tests, and the shared-resource architecture plan.
Add ResourceCatalog and ResourceScope to provide explicit strong ownership
and deterministic semantic lookup independently from the live texture
registry.
Let Engine own the global catalog and default Graphics scope, and give
each UISceneNode an isolated scope that can be explicitly shared with
other scenes.
Remove TextureFactory's strong texture retention and name/hash lookup.
The factory now observes textures weakly for identity, diagnostics, and
deferred destruction without controlling their semantic lifetime.
Migrate drawable resolution, texture atlas loading, UI image caches,
tile maps, ecode resources, and related tests to scoped lookup and
publication.
Allow final TexturePtr release from worker threads while keeping actual
texture destruction deferred to the graphics thread. Fix mismatched
pixel deallocation uncovered by asynchronous texture loading tests.
Add ownership, scope isolation, scene sharing, worker release, and
decoder allocation regression tests, and update the shared-resource
architecture plan through Stage 3.
- add explicit open, closing, and closed states to the UISceneNode async delivery queue
- reject delivery execution during shutdown and purge retained captures after scene producers join
- reopen the queue cleanly when recreating Engine state in tests
- add regressions for stale deliveries, retained captures, concurrent producers, and Engine restart
- remove the obsolete and unused FrameBuffer context-loss reload API
- simplify redundant namespace qualification in UI tests and ecode declarations
- consolidate completed resource plans into the active ownership architecture
- defer TextureLoader callback removal directly to Stage 1 live-texture observation
- document the requirement to validate legacy lifecycles and prefer removing dead mechanisms
Resolve standard property definitions and data-attribute classification
when selectors are parsed, avoiding repeated specification lookups and
attribute-name checks during matching.
Fast-path existence-only data selectors without retrieving their values,
while preserving all attribute operator behavior. Add standard-property
coverage and an attribute-focused benchmark showing a 41.7% reduction
in matching time.
Add a fast path that directly evaluates selectors containing one rule,
avoiding combinator traversal and switch overhead for common class, ID,
tag, and pseudo-class selectors.
Move complex selector traversal into a dedicated function and cache rule
counts in selector loops. Add focused matching coverage and document the
Phase 7 benchmark results.
Index class-anchored selectors by one mandatory class hash so widgets
only evaluate rules associated with their own classes instead of
scanning every class-only rule in the global bucket.
Preserve selector correctness by validating the complete rule after
candidate lookup, and retain stylesheet source order across independent
index buckets for equal-specificity cascade resolution.
Update index clearing, copying, marker removal, and style insertion
paths. Add focused candidate coverage and a legacy full-scan benchmark,
showing a 63% lookup-time reduction on a class-heavy stylesheet.
Cache tag, ID, and class hashes in selector rules and widgets to avoid
repeated string comparisons during selector matching.
Store widget class hashes in a single-element SmallVector so the common
zero and one-class cases remain allocation-free. Reorder UINode and
UIWidget members to recover padding, keeping UIWidget at its original
1144-byte size.
Add selector matching benchmarks and regression coverage for class
mutation, compound selectors, and hash cache synchronization. Document
the measured Phase 5 performance and memory results.
Add CSS box-sizing support for HTML widgets and route CSS-specified
width/height conversion through virtual sizing hooks. Resolve percentage
CSS sizes against the containing block content box, and apply content-box
or border-box conversion consistently across block, flex, grid, table,
and rich text layout paths.
Keep table wrapper width behavior compatible with CSS table layout by
overriding the table width conversion separately, so padded percentage
tables do not overflow their assigned wrapper width.
Add focused regressions for block padding, flex-basis sizing, grid
containers, table containers, and the border rendering cases that depend
on explicit border-box sizing.
Added control over the UISceneNode children and added setHighlightOverRecursive. This allows us to inspect nested UISceneNodes.
Fix hit-box bug when changing display.