Repository navigation
FigureLab v3.16.0 - rotate, space, and a palette that answers
Open figure_lab.html in a browser — no installation, no server, no network.
Three things people went looking for and could not find, and several places the interface said something that was not true.
- Rotate a photo from the canvas. Click a panel and a round grip appears above it: drag to turn the picture to any angle (Shift snaps to 15°), or nudge with [ and ], or type an exact angle beside the quarter-turn buttons. Rotation had existed only as three quarter-turn buttons inside a panel's settings drawer, which is not where anyone looks for it.
- Fixed: the Save dialog reported the wrong size with a column width set. It computed its own physical size from
dpi/96, which is the scale only when no printed width is chosen. With 89 mm at 300 DPI it announced 2131 × 2069 px / 180 × 175 mm for a file that is really 1051 × 1020 px / 89 × 86 mm — 2.03× out, on the last screen you see before the file is written. It now uses the same two helpers the canvas readout and the compliance check already used. - Fixed: the compliance report named the wrong journal. It said "Checked against Nature/Science/Cell" even with the PLOS, eLife, EMBO or PNAS preset applied, and never named the one you chose. It now says which preset is applied and that you should check its own spec.
- The ⚠ beside an uncalibrated panel is now a button. Every panel ships with its scale bar switched on, so with no µm/px set the bar cannot be drawn and the only cue was a 5 px inert ⚠. It now reads ⚠ calibrate and opens the calibration dialog.
- Two misleading headings renamed. "Label style" sits 335 px above the real panel-letter controls and styles row and column headers instead, so hunting for A/B/C found a block that does nothing — it is now "Row / column header style". "Scale Bar (global defaults)" could neither add a bar nor set its length; it is now "Scale bar appearance (all panels)" and its help says where length and calibration live.
- Fixed: the "Rotate:" caption could wrap away from its own buttons, leaving three unlabelled glyphs opening a row 955 px away at common laptop widths. The group is now one unit, with accessible names on the buttons.
- The command palette now answers what you type. It matched the whole query as one literal substring and then fell back to a letters-in-order match that hit almost anything — and rendered those guesses identically to real hits, so a miss looked like an answer. Worst case: typing undo and pressing Enter ran Reset all crops, because that entry's keywords contain the word. Now: every word of a query must land somewhere, a word-boundary hit outranks one buried inside a longer word, and a guess is shown under "Nothing matches … — did you mean:" instead of masquerading as a hit. 24 commands were added for things the palette simply could not reach — Undo, Redo, the panel gaps, panel size, export DPI, printed width, the arrow and shape tools, calibrating a scale bar, panel letters, merging and splitting channels, opening a saved session, and the journal check.
- A palette entry can take you to a control, not just run one. Where the answer is a setting rather than an action, the entry opens the section it lives in, scrolls to it, focuses it and flashes it — so "where do I set the gap between panels?" has an answer even though that field sits inside a section you would have to know to open.
- Fixed: a per-gutter override silently outranked every uniform gap. With Per-gutter spacing on, a gutter you had dragged kept its own value, and
Tighten spacing, a journal preset and a loaded template all wrote the uniform H/V gap, reported success, and changed nothing for that gutter. Setting one gap for the whole figure now clears the per-gutter overrides and says how many went, so the figure always matches what the fields show. - Fixed: layout templates and share links dropped per-gutter spacing. Neither saved
colGaps/rowGaps/advancedSpacing, so a template lost it at save time and a recipient of a share link got a different figure with no warning. Loading a template also left the previous figure's overrides in place, which made the template's own gaps inert. Both now carry it, and loading a template replaces what was there rather than layering on it. - Fixed: a journal preset could not be undone. It rewrites panel size, gaps, fonts and export width; with no undo entry, trying a house style to see what it looked like was a one-way door.
- Fixed: page 2 of a multi-page PDF drew page 1's row gutters. Row overrides were looked up by the row's position on the page rather than in the whole figure, so every page after the first silently mirrored page 1's spacing.
- Fixed: a gutter drag that ended off the canvas never ended. Release the mouse anywhere but the canvas — the surrounding page, browser chrome, another window — and the divider stayed "being dragged", so every later pointer move over the canvas rewrote the spacing with no button held. The gap ran away and only a click stopped it. A release anywhere now ends the drag, and a move with no button down ends one whose release we never saw. The same stranding affected the rotation grip, a label drag and a scale-bar resize; all four are fixed together.
- Fixed: the − and + gutter chips were unclickable at any normal gap. They are drawn about 25 px either side of the divider, but the divider's hover band is only
max(6, gap/2+6)wide, so reaching for a chip left the band and wiped the chips before the click landed. Below a gap of roughly 41 px — including the default 6 and the 2 and 4 the journal presets set — both chips were permanently dead. They now stay alive while the pointer is on them. - Set the space between panels in the freeform editor. There was no way to do it: Distribute spreads three or more objects between the outermost two, so with two selected it returned in silence, and at no count could you ask for an exact gap. The align bar gains Space: [N] px with ⇿ and ⇕, which puts exactly that many pixels between the selected objects on either axis, from two objects upward. Distribute now says why it cannot help instead of looking broken.
- Rotate buttons in the canvas toolbar, beside ⊞ Labels: ↺ ↻ turn the selected photo, or every photo when nothing is selected, and ⌐ sets them upright again. A folder of microscope captures that all arrived on their side is one click, not one click per panel. Also in ⌘K as Rotate EVERY photo.
- Fixed: a turned panel was drawn at the wrong size. The contain-fit was computed from the unturned extent, so a 2:1 image turned 90° into a matching 1:2 cell came out at half the size in a cell it exactly fits, letterboxed — and the panel letter, tag and scale bar were placed against a box the picture no longer occupied, the letter landing beside it on the background. The fit now uses the turned extent at any angle, and the furniture follows the picture.
466 Playwright tests pass. Most of this release was found by driving the app with a real pointer rather than reading the code.