- Normalize auto-layout text imported from Figma when fixed bounds match derived text layout
- Recompute auto-size text bounds on typography metric changes
- Clear stale Figma derived text layout caches when text sizing changes
- Cover FIG import text sizing and line-height resize regressions
Port the timeout fixes from PR #351 that resolved the unit-test CI
timeouts. Add HEAVY_TEST_TIMEOUT_MS (30s) in tests/helpers/test-utils.ts
and apply it to the slow gold-preview.fig fixture tests/hooks:
- clipboard roundtrip
- group reclassification
- glyph blob preservation
- auto-layout text measurement
- render/canvas/cache
* fix(kiwi): import Figma groups as GROUP nodes instead of FRAME
- Map FRAME nodes with `resizeToFit === true` to `GROUP` type on import
- Write `resizeToFit = true` when exporting `GROUP` nodes back to Kiwi format
- Document findings and diagnosis in packages/docs/development/group-to-frame-import-issue.md
- Extract resolveNodeType helper to satisfy cyclomatic complexity limits
* test(kiwi): harden Figma group import + add coverage
Follow-up hardening on the group import/export fix:
- convert.ts: reorder so the COMPONENT_SET check runs before the FRAME→GROUP
reclassification, and guard the group check on the absence of auto-layout
(`stackMode` unset/NONE). Figma auto-layout "hug" frames use
stackPrimarySizing/stackCounterSizing, not `resizeToFit`, so this prevents a
component-set or auto-layout frame that happens to carry `resizeToFit` from being
misclassified as a group.
- Add tests/engine/io/fig/import/group-reclassify.test.ts: unit coverage for the
reclassification (FRAME+resizeToFit → GROUP, plain frame stays FRAME, auto-layout
hug frame stays FRAME), plus a real-file assertion that gold-preview.fig imports
its groups as GROUP.
- Add tests/engine/io/fig/roundtrip/group.test.ts: a created GROUP survives
export → re-import as a GROUP (validates the export-side resizeToFit write).
- Update exhaustive.test.ts gold-preview golden: 519 nodes that were misimported as
FRAME are now correctly GROUP (FRAME 4525→4006, GROUP 519), and export size shifts
594758→594770 because exported groups now carry resizeToFit.
Note: the pre-existing material3 variables roundtrip failure
("Invalid value EXCLUDE for enum BooleanOperation") is unrelated to groups and
also fails on master — out of scope here.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* chore(kiwi): remove temporary group-to-frame analysis doc
It was a scratch diagnostic artifact (and contained a hardcoded local path);
the rationale now lives in the fix's commit messages, code comments, and tests.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Danila Poyarkov <dev@dannote.net>
- Refresh the bundled Figma Kiwi schema from a newer embedded schema
- Preserve additional raw node fields and omitted imported stack sizing
- Tighten idempotent roundtrip checks while documenting known G0 import gaps
- Move codec, NodeChange conversion, and instance overrides under kiwi/fig
- Flatten the codec entrypoint to kiwi/fig/codec
- Keep schema-runtime as the generic Kiwi parser/compiler boundary
- Carry resolved text styling and glyph data through component-property text clones
- Align lazy cloned child placement and hidden chevrons with their resolved source
- Cover the gold-preview dropzone link lazy import regression
- Re-propagate resolved overrides after lazy instance population
- Preserve Figma showShadowBehindNode on effects
- Mask unfilled stroke shadows behind their fill geometry
- Resolve component-property refs through override keys on cloned children
- Apply instance component-property assignments through clone chains
- Use child shadow shapes for containers without visible fills
- Keep clipped export bounds from leaking hidden descendants