Skip to content

v1.65.0 - #808

Merged
rob-gordon merged 10 commits into
mainfrom
dev
Jul 16, 2026
Merged

v1.65.0#808
rob-gordon merged 10 commits into
mainfrom
dev

Conversation

@rob-gordon

Copy link
Copy Markdown
Member

Ships

🤖 Generated with Claude Code

rob-gordon and others added 10 commits May 29, 2026 12:13
…803)

* test: characterization tests locking down the framework-independent core

Adds 274 characterization tests across 12 core modules (parse pipeline,
prepareChart delimiter/migration logic, theme conversion, sizing, and the
export converters) to pin CURRENT behavior before a future framework
migration. Tests capture actual output (not ideal output); ~23 likely bugs
are documented in-place with // CHARACTERIZATION comments rather than fixed,
so any future change to these behaviors fails loudly and becomes a
deliberate decision.

Suite: 8 -> 20 test suites, 32 -> 306 passing tests, 12 snapshots.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: add alignNodesVertically undo/redo + early-return coverage

Mirrors the coverage its siblings (alignNodes, alignNodesHorizontally)
already had, closing the one asymmetry the audit flagged. alignNodes is the
foundation of the planned auto-layout-with-control work, so its baseline
should be fully symmetric.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
rgbToHex now zero-pads each channel (rgb(5,5,5) emitted '#555' -> now '#050505'; rgb(10,200,30) emitted invalid 5-char '#ac81e' -> now '#0ac81e'). Labeled edges now register the arrow element's id in each endpoint's boundElements instead of the label text node's id. Both are generated-on-demand exports (no stored data changes), but re-exporting an unchanged chart now yields corrected colors for any node with an RGB channel < 16.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…llisions

processScss substituted each $var with a boundary-less regex, so $color rewrote the prefix inside $colorDark (-> 'redDark'). Added a negative lookahead matching the valid name char class so a variable only matches when not followed by another name character.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… leak

prepareChart backfilled meta.themeEditor with the shared imported default theme object, then mutated its layoutName/spacingFactor during legacy-layout migration - leaking into the shared import and the next chart in the session. Now backfills a clone ({ ...theme }) so the import is never mutated. Single-chart output unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
All three align functions always called setState + addToUndoStack, so a no-op align pushed a useless undo entry and wiped the user's redo history. Each now returns early when the computed positions deeply equal the originals, leaving undo/redo untouched. Real aligns are unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Insurance against a future 'simplification' back to `meta.themeEditor = theme` that would reintroduce the shared-import mutation leak fixed in a0fb926.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test: visual-regression net for the 13 templates

Pixel-diffs each template's rendered graph against committed golden images
(Playwright toHaveScreenshot) — the rendering half of the migration safety
net. A refactor, framework migration, or deliberate render-bug fix that
changes how a chart looks now fails loudly with a visible diff.

- Separate playwright.visual.config.ts (Chromium, local server, AA-tolerant
  thresholds) so it doesn't entangle with the preview-based e2e flow.
- 10 deterministic-layout templates render live (tests layout + rendering).
- 3 mindmap templates use force-directed layouts that re-randomize positions;
  they render from committed frozen-position fixtures via a preset layout so
  the test is deterministic (checks rendering). The flaky set was found
  empirically (failed two consecutive runs), not assumed from layout name.
- Scripts: visual, visual:update, visual:fixtures. Point at a non-default port
  with E2E_START_URL. CI wiring (Linux goldens) is a documented follow-up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: exclude visual specs from the e2e config

The e2e Playwright config's testDir is "e2e" with the default *.spec.ts
matcher, so it was picking up e2e/visual/templates.visual.spec.ts and would
run it against the Linux preview in CI with no matching (-linux) goldens,
failing the e2e check. Add testIgnore for **/visual/** so visual regression
runs only via playwright.visual.config.ts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: note to run visual regression on visually significant changes

Adds a Visual Regression subsection to CLAUDE.md's Testing section flagging
that it's a local, manual gate (not yet in CI) and must be run whenever
touching render-affecting code (toTheme, graphUtilityClasses, getSize,
preprocessStyle, the Cytoscape pipeline, FFTheme, or any template).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
pro.spec.ts:118 ("Create chart from imported data") flaked ~4x across recent
PRs, always in the import->confirm flow against the Vercel preview: sometimes
the "9 nodes and 10 edges" confirmation didn't appear within the 5s default
(line 158), sometimes the confirm click hung to the 120s test timeout (line
160). Both are preview-timing issues, not product bugs.

- Bump the confirmation toBeVisible timeout to 30s and wait for the confirm
  button to be actionable before clicking.
- Add CI retries (retries: isCI ? 2 : 0) — the standard mitigation for e2e
  against a live preview. Each failure was a single-attempt flake, so a retry
  absorbs it; a real break still fails every attempt. Local retries stay off
  so flakes remain visible while developing.

Note: can't be proven in one run (it only flakes against CI/preview, passes
locally); verification is a reduced flake rate over subsequent CI runs.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds outbound links to teamsort.world and docugram.app in crawlable,
human-sensible places:

- Sandbox homepage: credit line in the tab row above the canvas (desktop);
  hidden-but-in-DOM on mobile, with visible entries in the mobile menu
- Pricing page: new footer with made-by + project links, plus a page
  title and meta description via Helmet
- Settings: "More from Tone Row" section with link cards
- sitemap.xml: add /pricing, /blog, /roadmap, /changelog, /s (was
  homepage-only since 2021); robots.txt now declares the sitemap

Shared data lives in lib/toneRowProjects.ts.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
flowchart-fun Ready Ready Preview, Comment Jul 16, 2026 1:51pm

Request Review

@rob-gordon
rob-gordon merged commit 87a47b7 into main Jul 16, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant