Known Issues
Layout
z-index Stacking Contexts
Symptom: A deeply nested z-index: 999 element paints behind a shallow z-index: 1 element in a different subtree.
Cause: Sibling sort by z-index works correctly, but there are no independent stacking contexts. Cross-branch ordering follows tree DFS, which can override z-index expectations.
Workaround: Keep z-indexed elements as siblings within the same parent.
Border Style Rendering
Symptom: border-style: double, groove, ridge, inset, outset render as solid lines.
Cause: Only solid, dashed, dotted, none, and hidden are implemented in the quad pipeline shader.
Dashed/Dotted on Elliptical Corners
Symptom: Dashed/dotted borders on elements with non-uniform border-radius (elliptical corners) show straight segments at corners.
Cause: The patterned border shader only follows curved corners for uniform-circular radii.
em/rem Default Size
Symptom: em and rem units use exactly 16px when no explicit font-size is inherited.
Cause: UA stylesheet font-sizes are not globally applied; the root font-size is not resolved until layout. A hard-coded 16px fallback is used.
Position: Sticky
Symptom: position: sticky behaves the same as position: relative.
Cause: Sticky positioning logic is not implemented. The element is offset like relative but doesn't react to scroll position.
Parser
Unknown Tags
Symptom: Unknown HTML tags cause their entire subtree to be silently dropped.
Cause: The parser only recognizes ~96 tag names. Unrecognized tags (e.g., <figure>, <menu>, <q>) are dropped at tree-build time.
Whitespace Handling
Symptom: Whitespace-only text nodes between tags are dropped.
Cause: The tree builder skips text nodes containing only whitespace characters.
Rendering
Nested Rounded Clips
Symptom: When two nested elements both have overflow: hidden and border-radius, only the innermost clip's rounded corners are used.
Cause: Composing multiple rounded SDF clips requires shader-level intersection of two SDFs, which is not yet implemented. Rectangular scissor intersections work correctly.
Animated Image Frames
Symptom: Animated GIF/WebP images may not advance frames in some engine configurations.
Cause: Frame selection uses a process-wide clock anchor that relies on the host calling render_frame on each frame tick. If the host throttles rendering, animation frame rates are affected.
Interactivity
Scroll Hit-Testing
Symptom: Click coordinates inside a scroll container may not be correctly mapped to the scrolled content for hit-testing.
Cause: Element scroll offsets are applied at paint time but may not be subtracted from hit-test coordinates for all interactions. Viewport scrolling is handled; element-level scroll hit-testing is partial.
No <select> Dropdown
Symptom: The <select> element renders as a static block with no interactive dropdown.
Cause: The popup menu rendering and interaction system for <select> is not yet implemented.
Form Validation Gaps
Symptom: pattern (regex) validation is not implemented. type=email/type=url inputs don't validate format. minlength/maxlength not checked on <textarea>.
Cause: Regex engine not bundled. Type-specific validation rules not yet coded. Textarea constraints not wired.
Wheel Events on Element Callbacks
Symptom: Mouse wheel events scroll the element but are not forwarded to element on_event callbacks.
Cause: Wheel events are consumed for scroll handling before callback dispatch on the focused element.
Performance
Flex/Grid Incremental Relayout
Symptom: Changing one child inside a flex or grid container causes the entire container to re-layout.
Cause: Flex and grid have cross-item dependencies (free space redistribution, track sizing). Incremental layout falls back to full re-layout for these container types.
First Frame Latency
Symptom: The first frame after loading a large document or many images may have higher latency.
Cause: Image loading and font rasterization happen on first use. Preload with tree.preload_asset() to mitigate.