Files
figcraft/docs/boards-parity.md

22 KiB
Raw Permalink Blame History

Boards parity

Last reviewed: 2026-10-24 · Last updated: 2026-10-31 · Change: minor (a connector end moved with Cmd/Ctrl held goes on any part of an object, and stays there as the object moves or resizes; a connector end dropped along a side of a shape attaches to that side (#1708); a board connector's path can be reshaped by dragging its path handles (#1710); boards have 16 more shapes (arrows, polygons, star, plus and flowchart symbols), in pickers that lay them out in a grid; a board keeps earlier votes' results, listed newest first in Results and deleted one at a time; a connector's bar sets its start and end points, dashes, weight and any colour (#1596); cells copied from a spreadsheet paste onto a board as a table; Shift+Cmd/Ctrl+Enter on a selected board shape adds the next shape already joined to it, and goes on typing (#1597); "+" handles beside a selected sticky or shape make the next one, joined by a connector (#1597); a FigJam .jam file opens as a board (#1342); board grid settings: dots, lines, graph paper or none, spacing, size and contrast; the connector tool shows the connector it will make while dragging, ends snapping to attach points (#1387); templates and tables; facilitation: a shared timer and voting sessions; the dot grid, dragging a connector's end to re-attach it, curved connectors, elbows that go around what they join) · Target: the incumbent's whiteboard product (behaviour from its public help centre)

Breadth ~47%, ready ~29% (estimated, erring low). A board is a FigCraft file of its own kind (file.newBoard) with a dot grid on the page, sticky notes, shapes with text, connectors that follow what they join (straight, elbow or curved, their ends dragged onto other objects), marker, highlighter and eraser, stamps, text and sections, five built-in templates and tables, edited together in the existing live sessions, with a shared countdown and voting sessions to run a workshop. Music, board widgets, mind maps and the rest of the tail are missing. Remaining: ~20–44 h. Tracked as area 22 of target-app-parity.md (not in its weighted sum: the target there is the design product). The work item is gap 24 in gaps.md.

How boards are built

Board objects are ordinary layers with a small board field on the node (figcraft_doc::BoardItem), so rendering, hit testing, undo, saving, SVG/PNG/PDF export, copy and paste and live sessions work on them unchanged. The file kind (Document.kind) is saved in .figcraft and reaches people who join a live session in their snapshot. What follows from the metadata (a sticky's text size, a shape's text room, connector routes and their labels) is recomputed in the engine's normalize pass, deterministically from the document, so local edits, undo and edits from others in a live session all end with the same geometry.

Features

Feature Status Notes
Board files: File ▸ New board, the home screen's New board card, a light page done file.newBoard; the kind shows in inspect_document, tabs and file rows (a note mark; design files a pen nib)
Board toolbar at the bottom done Move/Hand, Marker/Highlighter/Eraser, Sticky (colour flyout), Shapes (flyout), Connector, Text, Section, Stamp (flyout), Comment, Actions, then the templates and the Design panel's buttons — on the same 32 pt grid as a design file's (no Resources button, as there)
Design panel hidden by default; a contextual bar above the selection done colour, shape, text size (S/M/L/XL); for connectors straight/elbow/curved, the start and end points (none, round, square, line arrow, triangle arrow, reversed triangle, circle, diamond), solid or dashed, the weight, and any colour in the colour picker beside the board colours (#1596); each control says what it is on hover; the Design panel opens with its button or View ▸ Design panel
Prototyping and Dev Mode refuse on boards done proto.*, dev.*, view.prototype, view.devMode say why
Sticky notes done a square frame (200 wide, growing taller through auto layout), 8 soft colours, a soft shadow, the note's text size shrinking as it grows (24 → 11, by characters and lines), the author's name at the bottom; a click places one and starts typing; Enter or a double-click edits; Shift+Cmd/Ctrl+Enter adds the next one beside it
Sticky options: hide the author, change size presets, sticky stacks partial board.sticky {author: false}; no size presets or stacks
Shapes with text done rectangle, rounded rectangle, ellipse, diamond, triangle, speech bubble, chevron; text centred and wrapping inside the outline; shape type and text size from the contextual bar
Shape auto-fit to its text, more shapes (cylinder, cross, star…), shape libraries missing
Connectors done from a layer's side (the facing one, or one named) to another layer or a free point, straight, elbow or curved, arrowheads (the stroke's caps), a label in the middle of the route by length (double-click to add); while one is dragged out it shows as it will be made (route, line and arrowhead), the object under the pointer outlined with its four attach points (side middles), the one the end goes to ringed; an end dropped on the outer half of an object takes the side it is towards (a drop along a whole edge chooses that edge), one in the middle takes the facing side; re-routed when either end moves or resizes; a deleted end stays where it was
Shapes with text done 23 outlines: rectangle, rounded rectangle, ellipse, diamond, triangle up and down, parallelogram right and left, trapezoid, pentagon, hexagon, octagon, star, plus, arrow left and right, chevron, speech bubble, and the flowchart symbols database, document, predefined process, manual input and internal storage; text centred and wrapping inside the outline; shape type and text size from the contextual bar
Shape auto-fit to its text, the advanced shape libraries (engineering and other icon shapes) missing
Connectors done from a layer's side (the facing one, or one named) to another layer or a free point, straight, elbow or curved, arrowheads (the stroke's caps), a label in the middle of the route by length (double-click to add); while one is dragged out it shows as it will be made (route, line and arrowhead), the object under the pointer outlined with its four attach points (side middles), the one the end goes to ringed, and within 10 px of one the end keeps that side; re-routed when either end moves or resizes; a deleted end stays where it was
Create the next shape already connected done a selected sticky or shape shows a "+" beside each side; hovering one shows where the next goes, clicking makes one of the same kind, size and colour there, joined by a connector as the Connector tool makes one, and starts typing in it; one undo step (board.addConnected {id?, side?, edit?}, #1597). Shift+Cmd/Ctrl+Enter on a selected (or edited) shape adds the next shape on its right, joined the same way, and goes on typing; on a sticky it adds a sticky beside it without a connector, as before
Curved connectors, elbows around objects, dragging an end to re-attach done board.setStyle {style: curved} (and the contextual bar): one curve leaving and arriving along the sides; an elbow whose short way would cross what it joins goes around their boxes, 24 units clear; a selected connector shows its two ends as handles, and dragging one onto an object attaches it there (the object is outlined while dragging), onto empty canvas leaves it free (board.reattach {id, end, target, side?}, one undo step)
A connector end on any part of an object done holding Cmd/Ctrl while moving an end places it where the pointer is on the object, as a share of its box, so it follows moves and resizes; the line leaves by the side facing the other end. Without the key an end snaps to a side
Connector paths reshaped by hand done a selected elbow or curved connector shows path handles: one on each run long enough to take one, one in the middle of a curve. Dragging a run moves it, and a first or last run gains an extra run to stay on its end; a curve's middle goes where it is dragged (board.reshape, one undo step). The shape travels with what the connector joins and is saved with the file; changing the style or moving an end to something else goes back to routing itself. No way back by itself otherwise: the public help describes none
Quick-create handles (drag out a connected copy) missing
Connector waypoints placed by hand missing routes are computed from the ends; no bend points of your own
Quick-create handles partial a "+" beside each side of the one selected sticky or shape makes the next one there, joined by a connector (board.addConnected, also Shift+Cmd/Ctrl+Enter); no dragging a handle out to place it
Marker and highlighter done the Pencil's stroke fitting with board presets: marker opaque, highlighter wide, see-through and multiplying
Eraser done drag over marker and highlighter strokes to remove them, one undo step
Pen colours and widths in the toolbar partial tool.marker {color}, tool.highlighter {color}; colour changes on a selected stroke from the contextual bar
Stamps done thumbs up, heart, plus one, star, question, check: round badges drawn as vectors, the placer's name on hover
Stamps sticking to the object they land on, the stamp wheel, emotes, stickers partial a stamp sticks to the object it lands on (on) and moves with it; dragged onto another object it sticks to that one, dragged off it to nothing, and it stays where it is when its object is deleted. the object it will stick to is outlined while the stamp tool is over it or a stamp is dragged over it. No stamp wheel, emotes or stickers
Text and sections done the existing Text tool and sections
Live sessions: cursors, selections, cursor chat, spotlight done the existing sessions; board objects, connectors following moved objects, colours and stamps sync both ways (checked with two app instances)
Timer done a pill at the top right of the board: presets (1, 3, 5, 10, 15 min) or any whole minutes, pause, resume, a minute more, stop; red at 0:00 until stopped; no sound. board.timer {action, minutes?}, board.timerState. Synced as its end time (or the time left while paused), so every client counts down on its own clock: nothing ticks over the network. Not an undo step
Timer music, timer sounds missing
Voting sessions done one at a time: votes per person (1–99), on every object, on sticky notes or on the selection; a click on an object places a vote (several on one object allowed), a click on your badge or an Alt-click takes it back; your own votes show as badges while it runs, everyone's once it ends, with a ranked list (ties share a rank) that selects an object from its row; Clear results. board.vote {action: start|cast|retract|end|clear}, board.voteResults. Ballots sync per voter (keyed by the live-session client id, or your name offline), so people voting at once never overwrite each other. Not undo steps
Voting results: who voted for what, earlier sessions' results partial once a vote ends, its results list who voted for each object and how many times (by name in a live session, kept with the results so someone who has left still shows by name), as the reference app shows how each participant voted; each ended vote's results are kept in the file (the last 20), listed newest first in the Results popover with arrows to earlier ones, and deleted one at a time (board.vote {action: delete, index}; Clear results only takes them off the board), as the reference app keeps each session's results until deleted; saved, synced in live sessions, and like the vote not undo steps. Anyone who can edit the board ends or clears a vote, as the reference app's help describes. A vote has no prompt (question) of its own
Board widgets missing design-file widgets exist (crates/engine/src/extensions/widgets.rs), not wired to boards
Templates (retrospective, brainstorm, flow chart…) partial five built-in templates drawn up for FigCraft (retrospective, brainstorm, weekly planner, flow chart, kanban board), placed from the toolbar's templates picker (each with a picture of itself) or board.template {name, x?, y?} as ordinary sections, stickies, shapes, connectors and text in one undo step; board.templates lists them. No community templates, no saving your own
Tables partial board.table {rows, columns, cells?, x?, y?} (at most 50 × 20): an auto layout frame of rows of cells with text, a tinted header row and lines between rows and columns; a cell's row grows with its text; a double-click types in the cell under the pointer; add or remove a row or column from the bar over the selection or board.tableEdit {id, action, index?}; cells copied from a spreadsheet (tab-separated text, quoted cells kept whole) paste as a table, up to 50 × 20 with a note when there was more; undoable and synced in live sessions. No column resizing by dragging, no cell colours, no Tab between cells; comma-separated text pastes as text
Mind maps missing
Washi tape, code blocks, image cropping on boards missing images can be placed as in design files
Audio and huddles missing
AI features (summaries, sorting stickies, generating boards) missing
Grid on the page done the canvas render draws it after the page colour and before the layers (figcraft_render::Dots), so objects cover it. Dots by default, or lines, graph paper (a strong line every 2–12 cells over fainter ones, like Japanese section paper) or none; spacing (4–512), mark size and contrast are settings kept with the preferences (board.grid; Preferences ▸ Board grid). Zoomed out it thins out (dots and lines by halves, graph paper down to its strong lines) until the marks are at least 14 points apart (10 for lines), the marks the next step drops fading out first; dots stay about a point and a half across on screen (1 to 3 points), scaled by the size setting. Dark marks on a light page, light ones on a dark page, from the theme's ink; written straight into the image, no allocation per mark, a crossing of two lines blended once; never in exports. FigCraft's own settings: the incumbent's board grid has none
.jam import and export partial: a .jam opens as a board, best effort (#1342): its stickies and shapes with text come in as frames with their generated layers and its connectors as vectors, not as native board objects; no export see file-format-parity.md

Revision history

Date Change Summary
2026-10-31 minor M12: as the help describes, holding Cmd/Ctrl while moving a connector's end places it on any part of an object instead of snapping to a side. It keeps that spot as a fraction of the object's box, so it follows the object when it moves or resizes, and without the key an end snaps as before. board.connector {fromAt, toAt} and board.reattach {at} take it; saved only when set. Numbers unchanged
2026-10-31 patch M12, #1708: a connector end dropped on the outer half of a shape takes the side it is towards, instead of only within 10 px of a side's middle, so a drop anywhere along an edge chooses that edge (dragging a selected connector's end and with the connector tool, ring included); a drop in the middle of a shape still takes the facing side.
2026-10-31 minor M12, #1710: a selected elbow or curved connector shows path handles. Dragging a run moves it and a first or last run gains an extra run to stay on its end; a curve's middle goes where it is dragged (board.reshape, one undo step). The shape travels with what the connector joins, is saved with the file, and goes back to routing itself when the style changes or an end moves to something else.
2026-10-31 minor M12: boards have 23 shapes with text instead of 7: triangle down, parallelogram right and left, trapezoid, pentagon, hexagon, octagon, star, plus, arrow left and right, and the flowchart symbols database, document, predefined process, manual input and internal storage. The toolbar flyout wraps into rows of eight and the selection bar's shape menu is a grid of outlines named on hover. The stale "Quick-create handles: missing" row now says what exists.
2026-10-30 minor M12, gap 24: a board keeps each ended vote's results in the file (the last 20), as the reference app keeps each voting session's results until they're deleted. A record holds the vote, its ballots, the names the voters went by and when it ended, so someone who has left a live session still shows by name. The Results popover lists them newest first, with arrows to earlier votes and Delete results (board.vote {action: delete, index}). Clear results still only takes the results on the board off it. board.voteResults lists sessions. The results are saved (vote_history; older files open without it, and a vote ended in one still shows), synced in live sessions (DocProp::VoteHistory), and like the vote they're not undo steps: undo and redo carry them over. Tests: vote_history_tests, facilitate_tests and vote_history_ui_tests.
2026-10-30 minor M12, gap 24: an ended vote's results list who voted for each object and how many times ("Ada ×2, Bo"), as the reference app shows how each participant voted once a vote ends; while it runs, people still see only their own votes. board.voteResults gives them per result as voters: [{voter, name, votes}]. In a live session a voter is named as the session knows them, and someone who has left shows as such. The Voting row no longer asks for facilitator-only ending: the reference app's help says anyone in the file can end a vote, as here. Tests: facilitate_tests (offline and live, including a person who left) and vote_voters_tests (the Results popover).
2026-10-30 minor The object a stamp will stick to is outlined while the stamp tool is over it and while a stamp is dragged over it, as the incumbent highlights it; a drag no longer drops anything into a sticky, shape with text or table (board objects take no layers in). Numbers unchanged
2026-10-30 minor Stamps stick to the object they land on and move with it, as the incumbent's help describes; dragged onto another object they stick to that one, and they stay put, on nothing, when their object is deleted (the incumbent's help doesn't say). Numbers unchanged
2026-10-30 minor The contextual bar row: a selected connector's bar sets its start and end points, solid or dashed, its weight and any colour, beside the line type and the board colours (#1596). Numbers unchanged
2026-10-30 minor M12, gap 24: cells copied from a spreadsheet paste onto a board as a table. The clipboard carries them as text: a row per line, a tab between cells, and a cell holding a tab, a line break or a quote in quotes. board_table::spreadsheet_cells reads that into board.table's cells. The table is centred in the view, or with Paste here its top-left goes at the point. Up to 50 × 20 cells are kept, with a note when there were more. Text without tabs, comma-separated text and any paste into a design file stay a text layer, as before. Tests: board_table_paste_tests, table_paste_tests.
2026-10-30 minor #1597: Shift+Cmd/Ctrl+Enter on a selected shape adds the next shape joined by a connector and starts typing in it; on a sticky it still adds a sticky beside it. Numbers unchanged.
2026-10-30 minor A row for creating the next shape already connected: "+" handles on a selected sticky's or shape's sides make the next one joined by a connector, ready for typing (#1597). Numbers unchanged
2026-10-30 minor M12, #1342: a FigJam .jam file opens as a board, our whiteboard file kind, instead of a design file: the .fig reader marks a canvas with FigJam's fig-jam. header as FileKind::Board, so the file opens with the board toolbar, the dot grid and the board panels, and saves as a board. A .fig stays a design file, and file.import of a .jam adds its pages to the open file without changing its kind. Its stickies and shapes with text are still frames with their generated layers and its connectors vectors, not native board objects. Tests: board_import_tests.rs (the kind, .jam against .fig), jam_open_tests.rs (open as a board, import into a design file).
2026-10-29 minor M12: board grid settings (board.grid): dots, lines, graph paper or none, with spacing, size and contrast, in Preferences; the default grid looks as before. Numbers unchanged (beyond the incumbent's behaviour)
2026-10-29 minor M12, #1387 (connector tool): while a connector is dragged out with the connector tool, the canvas shows the connector itself as it will be made (its straight, elbow or curved route, line, weight and arrowhead, built by the same code as board.connector), not a thin line; the object under the pointer is outlined with its four attach points (the middles of its sides), the one the end goes to ringed; within 10 px of one the end keeps that side (fromSide/toSide, and side when re-attaching). Hovering with the tool shows the attach points too. Escape drops the preview; releasing makes the connector in one undo step. Tests: board_connector_tests. Numbers unchanged
2026-10-24 minor M12: the dot grid on board pages (a render pass under the layers), dragging a selected connector's end onto another object or empty canvas (board.reattach), curved connectors, and elbows that go around the objects they join. Breadth ~35% → ~37%, ready ~20% → ~21%, ~30–60 h → ~28–56 h
2026-10-24 minor Facilitation (M12): a shared timer and voting sessions. Breadth ~35% → ~40%, ready ~20% → ~24%, ~30–60 h → ~26–54 h
2026-10-24 minor Templates (retrospective, brainstorm, weekly planner, flow chart, kanban board) from a toolbar picker or board.template, and tables (board.table, board.tableEdit): breadth ~35% → ~40%, ready ~20% → ~24%, remaining 30–60 h → 26–54 h
2026-10-24 major Created with board files (M12): sticky notes, shapes with text, connectors, ink and eraser, stamps, the board toolbar and contextual bar, live-session sync