Skip to content

vs: serve /vs/ from Nuxt - #5783

Merged
JoycePlaysFootball merged 3 commits into
mainfrom
nuxt/vs
Sep 14, 2026
Merged

JoycePlaysFootball merged 3 commits into
mainfrom
nuxt/vs

Conversation

@dimitrieh

Copy link
Copy Markdown
Contributor

Description

Moves /vs/ to Nuxt. The comparison pages were frontmatter read by one layout, so they become a content collection and a single [slug].vue.

Related Issue(s)

Part of #5777

Checklist

  • I have read the contribution guidelines
  • I have considered the performance impact of these changes
  • Suitable unit/system level tests have been added and they pass
  • Documentation has been updated
  • For blog PRs, an Art Request has been created (instructions)

@netlify

netlify Bot commented Sep 11, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for flowforge-website ready!

Name Link
🔨 Latest commit 7f59d95
🔍 Latest deploy log https://app.netlify.com/projects/flowforge-website/deploys/6aa7d3a730bfab00085181b2
😎 Deploy Preview https://deploy-preview-5783--flowforge-website.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 65 (🟢 up 18 from production)
Accessibility: 96 (no change from production)
Best Practices: 100 (no change from production)
SEO: 92 (no change from production)
PWA: -
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify project configuration.

Comment thread nuxt/content/vs/ignition.yml Outdated
Comment thread nuxt/content/vs/ignition.yml Outdated
Comment thread nuxt/content/vs/kepware.yml
@ZJvandeWeg

Copy link
Copy Markdown
Member

@JoycePlaysFootball @Yndira-E I think we can remove the current vs pages? And re-introduce them when it makes sense?

3 routes move off 11ty. The pages were near-identical - the same seven sections
with a different competitor in them - so they become one data collection and
one renderer rather than three copies of the same template.

The competitor's comparison column was keyed by its own name in each file
(item.ignition, item.Kepware, item.litmus); it is `competitor` in all three now
so one renderer reads them. `sectionSubtitle` was in all three frontmatters and
read by none, and switch.cta/ctaUrl were carried but never rendered; both are
dropped.

/vs/kepware/ had drifted from the other two: no comparison chip, no "at a
Glance" heading, an unbordered table, plain section icons rather than accent
badges, a plain closing card, and the default social-proof eyebrow. It follows
the same structure as the other two now. That is a visible change to that page,
made deliberately.

nuxt/lib/rich-text.mjs is now a small allowlist sanitiser rather than three
hard-coded tag replacements, because this content needs <code>, inline links
and font-weight spans as well. It escapes the string, then re-enables a fixed
set of inline tags; `class` survives only if every token is a typography
utility, and `href` only if it is site-absolute or https. Any other tag,
attribute, class or scheme stays visible text. Tested, including the
rejections.

Verified all 3 against production. /vs/ignition/ and /vs/litmus/ match exactly;
/vs/kepware/ differs by the three headings the unification adds.
@dimitrieh

Copy link
Copy Markdown
Contributor Author

Rebased on main, with the line-level comments addressed.

  • Dropped the sectionSubtitle line from the header comment.

  • The meeting link is now single-sourced. src/_data/site.json gains meetings.salesRoundRobin, and the three .yml files point at site:meetings.salesRoundRobin. The mechanism already existed for the job-board link (useResolveHref, mirroring the 11ty resolveHref filter); it now walks a dotted key so grouped values are reachable, as SiteValue already did. The closing card embedded the same URL inside a prose string, so its link became linkText/linkHref fields rather than an <a> pasted into content.

    The literal that was there carried utm_campa[…]113138546 with a real ellipsis character in it, so the tracking parameters were broken wherever they were copied. The single-sourced value is the plain round-robin URL. Six copies across the three pages before, one now.

  • rich-text is dropped here too, per the review on partners: serve /partners/ from Nuxt #5784.

From the review pass over the whole migration:

  • Adding /vs to NUXT_PREFIXES stopped src/vs/images/** resolving in dev: those four files only reach nuxt/public/ through the 11ty passthrough in a production build. Added a carve-out beside the two this file already has. Production was never affected.
  • The three pages were in neither sitemap: a data collection is invisible to @nuxtjs/sitemap's static-route discovery and to content-urls.get.ts (which keys on path), and they left sitemap-legacy.xml when their .njk files were deleted. Added to sitemap.urls.
  • Two <CtaSignUp ... icon /> rendered no icon: icon is typed string, so a value-less attribute is "", not true.
  • The closing-card link went to the meeting booker with no tracking while the three buttons above it fired talk-to-migration-expert. All four fire it now, so the count is not short by whatever that link gets. Worth noting these are hand-written ff-btn links rather than CtaCustom: routing them through the registry would change their styling, so it is a separate call from the port.

On removing the /vs/ pages: that is a content decision rather than a migration one, so the three pages are ported as-is. If they should go, deleting them and adding redirects is a smaller change than this PR and can land either side of it.

Comment thread src/_data/site.json Outdated
Co-authored-by: Yndira Escobar <129537638+Yndira-E@users.noreply.github.com>
@dimitrieh
dimitrieh requested a review from Yndira-E September 14, 2026 10:59
@JoycePlaysFootball

Copy link
Copy Markdown
Contributor

These vs. pages are poorly written. We will start fresh. I'll merge this PR.

@JoycePlaysFootball
JoycePlaysFootball merged commit b6737d2 into main Sep 14, 2026
7 checks passed
@JoycePlaysFootball
JoycePlaysFootball deleted the nuxt/vs branch September 14, 2026 14:54
dimitrieh added a commit that referenced this pull request Sep 16, 2026
Marketing retired Aerospace Components, Aviation & Aerospace, Electronics &
Appliances, Renewables, Semiconductors, Food & Beverage and Life Sciences.
/industries/automotive/ stays.

All seven were live and indexed, so the URLs 301 to /industries/ rather than
404ing. Their content, the [slug].vue route that served them, the seven
components/industry/ bands, the `industries` collection and its schema, the
sitemap and prerender entries and ~40 images all go with them, since the seven
.yml files were their only consumers.

The header dropdown and the footer group lose the same seven links, so nothing
in the chrome points at a redirect.

navIcons keeps two of the keys this branch added: /vs/kepware/ and /vs/litmus/
name `arrows-pointing-out` and `link` in content merged with #5783, but neither
was ever added to the registry, so NavIcon renders nothing for them on main
today. Both pages show one icon fewer than /vs/ignition/ on live.

components/use-case/Card.vue goes back to #5780, which adds the same file and is
the only branch still using it.
dimitrieh added a commit that referenced this pull request Sep 16, 2026
The .njk's extraClass came over verbatim, but it was written against a
different DOM. cta-button.njk wrapped the label and the arrow in one
<span class="inline-flex items-center gap-2">, so the <a> had a single child
and `inline` / `flex flex-col` changed nothing that was drawn. UButton renders
the label and its trailing-icon as siblings, so `flex flex-col` stacks them and
`inline` drops the flex context that centres the arrow.

Dropping the two classes restores UButton's own inline-flex; the mobile CTA
keeps w-full and its margins.

pages/vs/[slug].vue carries the same string from #5783 and is already on main,
so /vs/ignition/, /vs/kepware/ and /vs/litmus/ stack their mobile CTA on live
today. Same one-line fix, included here because it is the same root cause.
dimitrieh added a commit that referenced this pull request Sep 16, 2026
Marketing retired Aerospace Components, Aviation & Aerospace, Electronics &
Appliances, Renewables, Semiconductors, Food & Beverage and Life Sciences.
/industries/automotive/ stays.

All seven were live and indexed, so the URLs 301 to /industries/ rather than
404ing. Their content, the [slug].vue route that served them, the seven
components/industry/ bands, the `industries` collection and its schema, the
sitemap and prerender entries and ~40 images all go with them, since the seven
.yml files were their only consumers.

The header dropdown and the footer group lose the same seven links, so nothing
in the chrome points at a redirect.

navIcons keeps two of the keys this branch added: /vs/kepware/ and /vs/litmus/
name `arrows-pointing-out` and `link` in content merged with #5783, but neither
was ever added to the registry, so NavIcon renders nothing for them on main
today. Both pages show one icon fewer than /vs/ignition/ on live.

components/use-case/Card.vue goes back to #5780, which adds the same file and is
the only branch still using it.
@dimitrieh dimitrieh mentioned this pull request Sep 16, 2026
2 of 5 tasks
@dimitrieh dimitrieh mentioned this pull request Sep 16, 2026
2 of 5 tasks

This branch was successfully deployed

1 active deployment
Preview — 7f59d958 Deployed Sep 14, 2026 by github-actions[bot]
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.

4 participants