What's New in Figpea v6.0.0: Figma-Parity Selection, Auto-Layout for Groups, and the Bridge That Pairs Without a Second Click
Figpea opens design files — Adobe XD, Photoshop (PSD/PSB), SVG, PDF, Figma and more — right in your browser. Nothing installs, and your original file is never changed. This is a major release (6.0.0) because its selection model changes how a click chooses a layer — parent-first, with a new way to reach what is inside — so existing muscle memory is revised once and then matches Figma's.
This release's headline is selection that behaves like Figma's. Five requirements change how a click, a keyboard chord and a marquee choose layers, they were refined against Figma's Select layers and objects documentation, and the remaining bulk-selection commands (Select All, Invert, Select Matching, Select All With Same) complete the set.
The second theme is auto-layout for groups. A group can now carry a stack (direction, gap, padding, alignment) that reflows its children as the group resizes, stored in the file and round-tripping through .fp, authored from the Design panel and visible from the agent API.
The third theme is the bridge and the agent surface hardening. The editor now auto-connects when local-network permission is already granted, figpea_layer_batch and the nested-numeric pageWidth/pos/matrix API no longer stringify, large batches no longer corrupt on \r, image data-URI layers create instead of rejecting, openFile({url,type}) honours its type, and thirty-plus small parity bugs close.
There is a breaking change in selection behaviour (parent-first click) — it is intentional and documented below — and nothing else in the agent contract is removed; only additive minor surfaces and invalid_params error shaping are added.
Selection: now Figma-parity
Clicks are parent-first — double-click drills in, Cmd/Ctrl goes deep
Previously a click could land deep inside a group without first showing its parent. Now a click selects the parent; double-click drills into the child under the pointer; holding Cmd/Ctrl while clicking selects deep directly. The same rule applies to component instances and to locked/hidden gating: hidden and locked layers are never hit, matching Figma. (REQ-749, major)
If you liked the old one-click deep behaviour, Cmd/Ctrl-click is its successor — one modifier, same result, without the accidental deep picks that broke the inspector's context.
Keyboard stepping — Enter, Tab and their reverses, Escape to parent
Enter steps into the selected container, Shift+Enter steps out; Tab / Shift+Tab cycle siblings forward/backwards; Escape steps to the parent. All chords respect the parent-first rule and work on collapsed groups and on a multi-selection's common parent. (REQ-750, major)
Right-click "Select layer" submenu
When several layers sit under the cursor, a submenu lists each by name so you can pick the one you meant instead of cycling with repeated clicks. It shows the same ordered hit list the click engine already computes, with per-type glyphs centred and no alpha wash on hover. (REQ-751, plus REQ-795/802 fixes)
Marquee that knows the difference between top-level and deep
Drag-select by default selects only top-level layers. Hold Cmd/Ctrl for a deep marquee that reaches inside groups; hold Shift to subtract from the current selection. The previous marquee that always reached deep and only added is now the deep variant — top-level-default prevents the "I dragged a box around two cards and got twenty stray text layers inside them" problem. (REQ-752, major)
Select All and Invert Selection
Cmd/Ctrl+A selects all selectable siblings of the current container; Cmd/Ctrl+Shift+A inverts the selection. Both honour the locked/hidden filter and are disabled where there is no container to enumerate. (REQ-753, major)
Bulk selection: Same Fill / Same Stroke / Same Effect / Same Font / Same Instance
From the Edit menu you can now say "this layer — find every other layer that shares this property": fill, stroke, effect, text properties, font family, or component master. The same predicate is available to agents as session.find keys (sameFillAs etc.) so an assistant can ask "same fill as this id" and get the same ids the UI selects. A shared comparator per property is unit-tested so docs and code cannot drift (REQ-758, REQ-757). Multi-layer reference selections must agree on the property to enable the command; locked/hidden layers never appear in results.
Other selection parity fixes
Shift+clickcan now deselect the last selected layer;setSelectiondoing so is no longer inverted. (REQ-754)- Hidden layers no longer stay clickable via
drawHit; the visibility gate is cull-guarded. (REQ-755) - Grouped-folder move no longer corrupts the folder transform to
null/NaN; duplicated folders reparented across pages render again. (REQ-834, REQ-826) - Drag within the same page no longer falsely proposes "Move into Page" due to a poisoned proxy cache. (REQ-833)
- Font-lib IndexedDB corruption now degrades with visible guidance instead of a
DatabaseClosedErrorstorm. (REQ-863)
Auto-layout: stacks for groups
A group can now be a stack — horizontal or vertical — with gap, padding and alignment, reflowing its children as the group's frame resizes. The model is stored per group (autoLayout) and round-trips through .fp; decoding existing .fig auto-layout flags still uses flexbox semantics as before, but authoring in Figpea is now native. (REQ-743)
The Design panel lets you set direction, gap, padding and alignment from the canvas, with live reflow and a viewport/constraint resize mode so children reflow on parent resize; the canvas draws the stack guides and resizing the group reflows rather than teleporting. Write it from the agent surface as layer.setAutoLayout / layer.getAutoLayout; site docs and MCP parity ship with it. (REQ-744, REQ-745)
Existing pages that are not stacks are unchanged. A group in viewport/constraint mode gets a fixed frame and clips overflow; content mode restores hug-to-contents.
Mobile: one gesture model
The separate Hand and Select modes are gone. Now one finger selects or marquees, two fingers pan and pinch-zoom. The floating Hand/Select control is removed, the transform widget no longer swallows a touch drag, and the viewing path plus tap-to-select still works on a touch laptop or iPad. (REQ-773)
The floating palette no longer covers the start of a design on open/fit — the camera frames with padding so the palette does not occlude the first page. (REQ-720 v3)
Components and authoring adds
- Drag a component tile onto the canvas to place an instance at the drop point (REQ-741).
- Components tab tile grid with live thumbnails (REQ-740).
- Canvas screenshots of off-screen artboards no longer return black;
setPositionworld-space vs page-local is documented andlayer.createx/y remain page-local (REQ-856, REQ-818/839).
Bridge, MCP and agent surface
This release hardens the surface that agents actually hit — the area where a tooling REQ previously had to tell an agent to bypass the MCP with evaluate_script.
- Auto-connect — loading with
?agent=1auto-connects when local-network permission is already granted; otherwise the pairing notice names the permission and leaves Connect disabled rather than retrying silently, and a paired tab shows connected/failed explicitly (REQ-803). - Nested numerics no longer stringify —
layer.createpageWidth/pageHeight/rwidth,setPositionpos.x/y,setTransformmatrix[],layer.batchinnerargsare now advertised asnumber/arrayintools/listand string numerics like"1000"are coerced before they reach the tab, sotools/callwith numbers arrives as numbers (REQ-870). - Large batches no longer corrupt — payloads carrying
\ror longbatchbodies no longer split keys or setop.methodto undefined;\ris stripped inside strings and hex ids survive intact (REQ-869). - Batch contract documented and validated —
figpea_layer_batch's{method, args}envelope (bare method name,argsas a positional array, nolayer.prefix) is now in thebatchdescriptor doc, validated per-op withinvalid_params+failedIndex, and object-shapedargsno longer leakbridge_client_error: Spread requires iterableor[object Object](REQ-872, REQ-812). - Image fills —
layer.create kind=image url=dataURInow creates an image layer instead ofunsupported_kind;contract tool arg-size capno longer silently truncates data-URI fills; local-file transfer via the bridge HTTP endpoint (filePathforopenFile/setImageFill) works (REQ-1021/871, REQ-1017). - File open —
session.openFile({url,type})now honourstypeover fileName/URL extension sniffing, and failures carry a diagnostic signature instead of bareopen_failed(REQ-873, REQ-828, REQ-849). - Tab pairing under concurrency — concurrent design-loop workers no longer close shared-Chrome tabs they do not own;
open_editorcomposestype=figpea&path=noturl=andno_tabno longer hardcodes prod origin (REQ-720, REQ-854/825/860). - Timeouts and errors — the hard-coded 10s contract timeout is removed; slow-but-successful mutations no longer return
bridge_errorwhile their side-effect lands; mistyped arguments now returninvalid_paramsnaming method/param/expected type, never a rawTypeError(REQ-772, REQ-770, REQ-801, REQ-771).
All of these keep the contract minor-bump discipline: no method is removed, no envVersion change, only additive schema exposure or error-code shaping, with VERSION bumped for the change (fingerprint pinned).
Vector, type and fidelity
- Path create flat-fill no longer adds a silent 1px black stroke (REQ-846).
- Text fixWidth now reports glyph extent not box width; a probe layer is no longer needed to size display type (REQ-861).
- Gradient alpha stops and text underline/strikethrough now author without rendering invisible (REQ-851, REQ-850).
export.projectas.fpnow returns bytes instead of triggering a browser download with an auto-suffixed filename (REQ-841/858).- SVG fidelity — variable-width strokes export without viewport clipping;
pathdthat is unparseable is rejected at create rather than makinglayerTreethrow for the whole project (REQ-747, REQ-812). - Single-stroke list that carried multiple strokes now clears original strokes on Outline Stroke (REQ from 5.4 carry plus 6.0 hardening).
Inspector and text
- Inspector X/Y field sync when
W/Hwere also edited is now atomic (REQ-794), anddownOnCanvassticky after a swallowedpointerupis fixed so the next click does not clear the selection (REQ-793). - Text edit now commits on
Escape(never discards), commits on click-away, keepsEnteras newline, shows a hint and selects[content]on focus (REQ-792, REQ-791). - Inspector's Export section is now on the Design tab; the canvas snackbar is gone and the chrome baselines are regenerated (REQ-689, REQ-690).
- The select-layer submenu's background no longer washes to 10% alpha on hover. (REQ-802)
Files, fonts and error surfaces
- The welcome badge no longer claims "All files stay in your browser" after the file-upload path exists; the broken-file report seam now carries the file and its size and shows success/failure with fallback (REQ-760/759/767).
- CJK and variable fonts that use GSUB lookup types 5/7 or have no default script entry now load; a genuinely unloadable face is reported, not silently dropped, and
report.fonts()missingLocallyis corrected (REQ from 5.4 carry). - SVG decode no longer aborts the whole parse on malformed path data — it skips the path and warns (REQ-849).
setImageFillon a text layer now rejects instead of silently turning the glyph fill into a pattern (REQ-824).session.newProjectrouting after a tab reload no longer orphans the new project (REQ-871/831).
Export, placement and misc
- Native
.fpexport viaexport_projectnow delivers bytes reliably (REQ-841). - Component paste no longer plants the copy inside its master. (REQ from 5.4 carry)
captureLayerand failed-parse signature diagnostics are now spec-faithful in production (REQ-781/779).
Docs and site
- Site docs for
advanced-layer-operationsmasking,basic-layer-operationsmarquee/capability captions, and the mobile viewer are corrected and captured against the fixed build; sitemap<loc>is re-pinned for the new post (REQ-470, REQ-692). - Agent API docs (
agent-api.mdx+app/lib/agentApi.ts+public/llms.txt) and thewindow.figpeacontract stay in sync via the build-gatedagentContractSync.mjs(REQ-699). - The dual wedge for developers — homepage AI wedge +
/ai-agentsdev-persona page + open-box MCP entry — now funnels as captured (REQ-837). .figviewer cluster captures intent before the January 2027 auto-layout cutover (REQ-848).- XD-intent landing pages capture the
.figdemand they previously missed (REQ-775).
UAT and the standing smoke net
Every release is driven as a customer would through docs/release/uat journeys (core UC-01…05 and UC-14 always, plus payload-targeted journeys) against the release-prep artifact before the user reviews it. This release also promoted a new standing smoke net of prod-smoke specs (one per REQ, anon/free/authed-free/authed-pro phases) that accumulates in v3/prod-smoke and site/prod-smoke and is rehearsed locally before it runs against production.
Upgrade notes
- The selection clicks are intentional behaviour changes (parent-first, double-click to drill, Cmd/Ctrl for deep) — retrain once and the bindings match Figma.
layer.batchclient code that sent{method:'layer.create', args:{…}}(dot-prefixed method, object args) must change to{method:'create', args:[…]}(bare name, array). The error message now names the offendingmethod/argsand thefailedIndex.- No other
window.figpea.*method is removed;batch's new per-op validation is additive (invalid_paramswhere previouslybridge_client_errorleaked). - Site checkout and entitlements are unchanged; no new env vars or Stripe objects are required to serve this release.