Skip to content

Mess with nf-metro logo - #1245

Open
mashehu wants to merge 1537 commits into
seqeralabs:mainfrom
mashehu:mess-with-the-logo
Open

Mess with nf-metro logo#1245
mashehu wants to merge 1537 commits into
seqeralabs:mainfrom
mashehu:mess-with-the-logo

Conversation

@mashehu

@mashehu mashehu commented Jul 1, 2026

Copy link
Copy Markdown
  • centered text optically (good old Johnston making that not too easy)
  • made angles more natural 60 degrees
  • centered lines into nodes

Feel free to ignore this PR if it is too nit-picky

pinin4fjords and others added 30 commits June 28, 2026 13:25
…s, and line highlights

Terminal frames (frame="terminal") on all bash blocks in cli.md, contributing.md,
guide.mdx, and the dev/* and releases/* docs that had plain bash fences.

File name titles on parser.md grammar snippets (lark title=...), contributing.md's
xfail example (python title="tests/test_example.py"), and both Metro component import
blocks (mdx title="docs/mypage.mdx").

Diff ins markers on the hidden-stations block in guide.mdx to call out the _branch
renames, and on the dashed/dotted directive examples in releases/0.7.0.md.

Line highlights ({n}) on the off_track directive examples and the per-section
line_spread override in guide.mdx to draw attention to the key lines.

Closes seqeralabs#1130

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- nextflow.mdx: caution callout for complex-pipeline limitation
- guide.mdx: Tips section → :::tip[Tips] callout
- dev/testing.md: auto-discovery note → :::tip callout
- embedding.md: reader shortcut → :::tip, attribution → :::note
- live.md → live.mdx: fix MkDocs !!! tip syntax, add <Steps> to demo
- how-its-built.md → how-its-built.mdx: <Steps> for three numbered
  workflows (topology case, CI render-diff, routing case pattern)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
guard_tiers.md:
- Remove opening sentence referencing resolved internal PRs (seqeralabs#922/seqeralabs#923)
- Fix Tier C description: update from 1 check to the current 2
  (check_seam_segments_meet_at_port was added alongside check_seam_approach_equals_departure)
- Remove stale rationale citing seqeralabs#1041 as pending; the rotation migration
  is complete and the seam checks are now correctness oracles, not blockers
- Add check_seam_segments_meet_at_port to the CHECK_REGISTRY table
- Remove issue-number reference from the Tier A promotion-intent column

routing_gate_triage.md:
- Rewrite step 3 to remove AI model names and replace with generic
  parallel-work guidance
- Remove "Program structure" section: it tracked a completed campaign via
  now-closed issue numbers and adds no value for future readers
- Remove issue numbers from Gotchas headers and inline examples
- Replace concrete issue references in the "Finalising" example with
  generic placeholders

[skip ci]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ive-code-features

docs: apply Expressive Code terminal frames, file titles, diff/line markers
…work

docs(dev): rework guard_tiers and routing_gate_triage for human readers
- Merge origin/main (PRs seqeralabs#1133 gallery content-collections, seqeralabs#1136
  Expressive Code, seqeralabs#1137 dev-docs rework) — no content conflicts
- Fix playground-e2e workflow: build_gallery.py now imports yaml
  (added in seqeralabs#1133) but the job only ran `pip install -e .`; switch
  to `pip install -e ".[docs]"` which includes pyyaml
- Add node_modules/ + package-lock.json to root .gitignore

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Installs and wires up @astrojs/sitemap so the build emits sitemap.xml,
  helping crawlers index individual gallery/pipeline pages once seqeralabs#1103 lands.
- Adds lastUpdated: true to the Starlight config so each page shows a
  "Last updated" timestamp derived from git history of the source file.

Closes seqeralabs#1132

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pre-existing format failure on main; fix it here so CI is clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…-lastupdated

feat(docs): add sitemap and lastUpdated to Astro/Starlight config
A --fold-threshold / %%metro fold_threshold (max_station_columns) below a
map's natural width folds its sections into a tighter grid. Past a point the
compacted geometry leaves the router no room to separate parallel bundles,
size concentric corners, or seat a section header clear of a route, and the
render chokepoint aborted with an internal CurveInvariantError /
SectionHeaderClashError - an engine self-check leaking to the user as a
traceback.

Parsing now records the sections a user-set threshold relocated versus the
unbounded layout (FoldThresholdError state on the graph). When the render
chokepoint hits one of those aborts and the grid was compressed, it reframes
the failure as FoldThresholdError - a ValueError the CLI surfaces cleanly,
naming the directive and recommending a wider threshold. Aborts at a map's
natural width are unaffected and still surface as the internal self-check.

Fixes seqeralabs#1088

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…1088

Drop two inline comments that restated the adjacent assertions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Installs `starlight-links-validator@^0.25.1` as a dev dependency and
enables it in `astro.config.mjs` so every `npm run build` (including
CI) validates internal links at build time.

Excludes:
- `/nf-metro/gallery*` and `/nf-metro/pipelines*` - served by custom
  Astro page routes (`website/src/pages/{gallery,pipelines}/`), not
  Starlight content collection entries
- `../assets/live_demo.mp4` - a `website/public/` static asset; the
  relative src is correct at HTML render time but is not a page link

Fixes found during first validator run:
- `docs/how-its-built.md`: 11 dev-doc links missing `/dev/` prefix
- `docs/manifest.md`: home-page anchor that doesn't exist, pointed to
  the correct `/nf-metro/cli/#validating-the-rendered-geometry`
- `docs/dev/render.md`: `#bridges` slug wrong (should be
  `#bridges-bridgespy`); `/nf-metro/docs/manifest/` had spurious `/docs/`

Fixes seqeralabs#1131

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
`svgDebugSources` only matched top-level `examples/*.mmd` files, but
`docs/dev/routing.mdx` uses `<Metro src="examples/guide/03_fan_out.mmd">`,
which requires a recursive glob. Widen to `examples/**/*.mmd`.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…alidator

feat(docs): add starlight-links-validator to catch broken internal links
The playground manifest generator imports build_gallery, which reads
gallery.yaml via pyyaml. pyyaml ships in the docs extra, but the e2e job
installed nf-metro without extras, so the manifest step aborted with
ModuleNotFoundError: No module named 'yaml'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…s#1140)

- Metro.astro: take origin/main scope string (examples/**)
- website/package.json: keep sitemap + links-validator, drop redundant prettier devDeps
- docs/how-its-built.mdx: fix /dev/ prefix in internal links (per links-validator)
ci: fix playground-e2e missing pyyaml dependency
…ht-components

docs: adopt Starlight MDX components across dev docs
Adds `nf-metro render-many <manifest.json>` — a new CLI command that
renders multiple metro maps in one Python process, amortising interpreter
and import startup across the full corpus.  The manifest is a JSON array
of {input, output, debug, from_nextflow, no_self_color_scheme, no_manifest}
objects; output directories are created as needed.  Partial failures are
logged and reported but do not abort remaining jobs.

Wires a `buildStart` hook into the Vite plugin (`render-metro.mjs`) that
pre-warms `.metro-cache/` at the start of every production build by calling
`render-many` once with all corpus maps.  Individual `?metro` load() calls
then hit the warm cache and return immediately, so cold deploy builds spawn
one Python process instead of ~210 (saving ~75 s on `docs.yml`).

The `cacheHash()` helper is extracted from `renderMetroFile()` so the
pre-warm and the per-file fallback share the same hash computation and
cannot drift apart.

Closes seqeralabs#1127

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…L [skip ci]

render_svg() emits an <?xml …?> declaration; render-many was writing it
verbatim to its output files.  The Vite plugin pre-warm writes render-many
output directly to .metro-cache/, then later reads it back with a bare
readFileSync() and inlines it into HTML — an <?xml…?> prolog inside <body>
is invalid HTML.

Strip the prolog in render-many (matching what renderMetroFile does when
writing individual renders to cache) and also in renderMetroFile's cache-read
path so it is defensive against any prolog that may exist in a cache entry.

Adds test_render_many_output_starts_with_svg to pin the invariant.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…skip ci]

Exercises the render-metro.mjs module directly without a full Astro build:
- findMmdFiles enumerates .mmd files in examples/ and tests/fixtures/
- buildStart pre-warms .metro-cache/ (248 entries on cold cache)
- cache entries contain no XML prolog and start with <svg
- renderMetroFile returns prolog-free SVG on cache hit
- second buildStart is a no-op (warm cache unchanged)
- prewarm and renderMetroFile agree on cache key (hash identity)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
render-many's manifest now accepts all options that nf-metro render does
(theme, mode, debug, logo, line_spread, legend, from_nextflow, title,
responsive, embed_font, text_to_paths, svg_class_prefix, no_self_color_scheme,
no_dark_mode_css, no_chrome_css, bare, validate, layout_options), making
it a first-class batch interface rather than a narrow vite-prewarm helper.

The Vite plugin's prewarm uses layout_options: {manifest: false} (the
general key-value path) instead of the removed no_manifest shorthand.

Tests cover the new option paths (layout_options, theme, html format,
svg_class_prefix) and a byte-identity check against nf-metro render. [skip ci]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…bs#1076)

A symmetric fork-join diamond sharing a section with a wider fan
straddled its trunk at full pitch, reading as tall as a 3-way fan with
an empty trunk row between its two branches.

Add Stage 6.17 (_apply_half_grid_symmetric_diamonds): per-diamond,
place each clean 2-way fork-join diamond's branches at trunk +/- 0.5 *
y_spacing, regardless of center_ports and even when the section also
holds a wider fan (which keeps its full-pitch slots, so section height
is unchanged). Runs after all trunk-settling so branches straddle the
final trunk exactly; the inward-only move never breaks containment.

A shared _iter_fork_join_diamonds primitive backs the new pass, the
grid-snap invariant test, and the existing
_guard_symmetric_diamond_branches_straddle_trunk (which loses its
duplicate nx-based detection). A new
_guard_symmetric_diamond_branches_half_pitch fails loudly if a diamond
re-inflates to full pitch or straddles asymmetrically.

Fixes seqeralabs#1076

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
pinin4fjords and others added 19 commits June 30, 2026 22:00
…o-data-uri

fix(playground): support data-URI logos so a pasted map's logo isn't lost
_guard_no_route_through_section and _guard_no_line_crosses_non_consumer
already detected a line routed through a section or station marker it
doesn't connect to, but were classified Tier-B (validate-only), so the
defect shipped silently on a plain render and even under --strict.
Reclassifying them to Tier-A puts them on the always-on render
chokepoint: warn by default, raise under --strict, matching the other
visibly-broken-geometry guards.

Fixes seqeralabs#1227
…eeze-through-guard

fix: promote non-consumer breeze-through guards to Tier-A
A non-consumer line whose route to a packed-cell member is blocked by
that member's cell-mate ran straight through the cell-mate's interior
instead of bypassing around it. The bypass dispatch decision and the
bypass's gap-channel placement both reasoned in grid-column terms, so
a cell-mate sharing the target's own column was invisible to both:
the dispatcher never routed the edge through the bypass family, and
once forced through it, the rise/descent channel landed on the wrong
side of the cell-mate, collapsing the below-row traverse to zero width.

Fixes seqeralabs#1228
Resolve src the same way _build_inter_facts/_packed_cell_mate_obstructs
do (prefer_upstream=False), so the section identity backing the
needs_bypass decision and the gap-anchor lookup always agree for the
same edge.
…fixes it

test_packed_cell_breeze_through_warns_by_default and
_raises_under_strict (from seqeralabs#1227's Tier-A guard promotion) used this
exact packed-cell breeze-through as their repro vehicle; the fix above
removes the breeze-through they were demonstrating, so the repro no
longer reproduces a defect. test_breeze_through_guards_on_render_path
already covers the Tier-A registration independent of any one scenario.
…ll-cellmate-bypass

fix(routing): bypass around a packed cell-mate instead of through it
…ines page

Add the nf-core/seqinspector logo to the single_row_rowspan_neighbor
showcase fixture and list it on the nf-core pipelines page alongside the
other real pipeline renders.

Fixes a gap in build_gallery.py: the pipelines manifest/render-diff page
assumed every pipeline .mmd lives directly in examples/, silently skipping
entries (like this one) sourced from examples/showcase/.
…ry-nfcore-render

feat(gallery): list seqinspector showcase render on the nf-core pipelines page
…wspan_neighbor

The gallery/pipelines page id leaked the internal regression-fixture name
into the public URL slug; rename it to match the pipeline it showcases.
…spector-pipeline-entry

chore(gallery): rename seqinspector showcase entry from single_row_rowspan_neighbor
A non-consumer skip-line on a graph with no declared section was drawn
straight through the markers of the stations it skips. A fully sectionless
graph bypassed the section-inference pipeline (interchange detection,
implicit section, resolve) that the same topology runs when wrapped in a
subgraph, falling back to a flat single-row placement with no detour.

Run interchange inference for sectionless graphs and, when a parallel-lane
hub is found, give the loose stations an implicit section so the rail detour
has a home. A clean linear/fan/merge graph infers nothing and keeps its flat
layout byte-identical.

Adds the examples/topologies/sectionless_skip_breeze.mmd regression fixture
(gallery entry + guard-golden baseline) and a non-consumer-crossing invariant
test.

Fixes seqeralabs#1229

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… [skip ci]

A non-consumer line routing to one member of a packed grid cell breezed
straight through its cell-mate's interior when the bypassing line's source
section sat in the column immediately adjacent to the packed cell. The
needs_bypass dispatch gated the packed cell-mate check behind
abs(tgt_col - src_col) > 1, so an adjacent-column hop never reached the
geometric obstruction check and fell through to the straight-connector
handler.

OR the packed cell-mate check outside the column-distance gate: a same-row
cell-mate can obstruct the straight path regardless of the column gap, since
it never registers as an intervening column. The bypass then routes below the
cell-mate's bottom edge as it already does for the gapped case (seqeralabs#1228).

Fixes seqeralabs#1233

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…labs#1233

Pull the multi-column intervening-section predicate out of needs_bypass into a
named helper so the two bypass triggers read as symmetric, named peers and the
three-level-deep boolean flattens.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…packed-cell-bypass

fix(routing): bypass packed cell-mate when source section is directly adjacent
…ss-skip-breeze

fix: detour sectionless skip-lines around non-consumer markers (seqeralabs#1229)
@mashehu mashehu changed the title Mess with logos Mess with nf-metro logo Jul 1, 2026
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Render preview: no visual changes detected. All renders match main.

@adamrtalbot

Copy link
Copy Markdown
Contributor

The resolution is quite low:

CleanShot 2026-07-01 at 10 01 05

it's around 1/2 of the original

@mashehu
mashehu force-pushed the mess-with-the-logo branch from d810d5b to 4ffbe09 Compare July 1, 2026 09:04
@mashehu
mashehu force-pushed the mess-with-the-logo branch from 4ffbe09 to 7ef3845 Compare July 1, 2026 09:06
@mashehu

mashehu commented Jul 1, 2026

Copy link
Copy Markdown
Author

no idea how svgs can be blurry, but I re-exported them now

@pinin4fjords
pinin4fjords requested a review from ewels July 1, 2026 09:08
@adamrtalbot

Copy link
Copy Markdown
Contributor

no idea how svgs can be blurry, but I re-exported them now

Better now although the px are reported to be the same 🤷

@pinin4fjords
pinin4fjords force-pushed the main branch 2 times, most recently from a90d751 to d134b08 Compare July 28, 2026 11:30
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.

3 participants